aboutsummaryrefslogtreecommitdiff
path: root/ARMeilleure
diff options
context:
space:
mode:
authorFICTURE7 <FICTURE7@gmail.com>2021-04-02 21:54:23 +0400
committerGitHub <noreply@github.com>2021-04-02 19:54:23 +0200
commit98ed81e4cddff807e06c82ea607078f701a8cdbe (patch)
treeffd70bf1d8ae01bf4ea7de06976e1a9fee64c96b /ARMeilleure
parentd394c7ee98bb69491ea8626935fc69aa6f20d5ec (diff)
Improve `StoreToContext` emission (#2155)
* Improve StoreToContext emission Hoist StoreToContext in dynamic branch fast & slow paths out into their predecessor. Reduces register pressure, code size and compile time because we're throwing less stuff down the pipeline. * Set PTC internal version * Turn EmitDynamicTableCall private * Re-trigger CI
Diffstat (limited to 'ARMeilleure')
-rw-r--r--ARMeilleure/Instructions/InstEmitFlowHelper.cs27
-rw-r--r--ARMeilleure/Translation/PTC/Ptc.cs2
2 files changed, 13 insertions, 16 deletions
diff --git a/ARMeilleure/Instructions/InstEmitFlowHelper.cs b/ARMeilleure/Instructions/InstEmitFlowHelper.cs
index 216f9b89..296e20a5 100644
--- a/ARMeilleure/Instructions/InstEmitFlowHelper.cs
+++ b/ARMeilleure/Instructions/InstEmitFlowHelper.cs
@@ -147,10 +147,8 @@ namespace ARMeilleure.Instructions
EmitJumpTableBranch(context, Const(immediate), isRecursive);
}
- private static void EmitNativeCall(ArmEmitterContext context, Operand nativeContextPtr, Operand funcAddr, bool isJump = false)
+ private static void EmitNativeCall(ArmEmitterContext context, Operand nativeContextPtr, Operand funcAddr, bool isJump)
{
- context.StoreToContext();
-
if (isJump)
{
context.Tailcall(funcAddr, nativeContextPtr);
@@ -180,30 +178,25 @@ namespace ARMeilleure.Instructions
}
}
- private static void EmitNativeCall(ArmEmitterContext context, Operand funcAddr, bool isJump = false)
+ private static void EmitNativeCall(ArmEmitterContext context, Operand funcAddr, bool isJump)
{
EmitNativeCall(context, context.LoadArgument(OperandType.I64, 0), funcAddr, isJump);
}
public static void EmitVirtualCall(ArmEmitterContext context, Operand target)
{
- EmitVirtualCallOrJump(context, target, isJump: false);
+ EmitJumpTableBranch(context, target, isJump: false);
}
public static void EmitVirtualJump(ArmEmitterContext context, Operand target, bool isReturn)
{
- EmitVirtualCallOrJump(context, target, isJump: true, isReturn: isReturn);
- }
-
- private static void EmitVirtualCallOrJump(ArmEmitterContext context, Operand target, bool isJump, bool isReturn = false)
- {
if (isReturn)
{
context.Return(target);
}
else
{
- EmitJumpTableBranch(context, target, isJump);
+ EmitJumpTableBranch(context, target, isJump: true);
}
}
@@ -219,15 +212,17 @@ namespace ARMeilleure.Instructions
{
// If we're doing a tail continue in HighCq, reserve a space in the jump table to avoid calling back
// to the translator. This will always try to get a HighCq version of our continue target as well.
- EmitJumpTableBranch(context, address, true);
+ EmitJumpTableBranch(context, address, isJump: true);
}
else
{
+ context.StoreToContext();
+
Operand fallbackAddr = context.Call(typeof(NativeInterface).GetMethod(allowRejit
? nameof(NativeInterface.GetFunctionAddress)
: nameof(NativeInterface.GetFunctionAddressWithoutRejit)), address);
- EmitNativeCall(context, fallbackAddr, true);
+ EmitNativeCall(context, fallbackAddr, isJump: true);
}
}
else
@@ -251,7 +246,7 @@ namespace ARMeilleure.Instructions
EmitNativeCall(context, fallbackAddr, isJump);
}
- public static void EmitDynamicTableCall(ArmEmitterContext context, Operand tableAddress, Operand address, bool isJump)
+ private static void EmitDynamicTableCall(ArmEmitterContext context, Operand tableAddress, Operand address, bool isJump)
{
// Loop over elements of the dynamic table. Unrolled loop.
@@ -310,13 +305,15 @@ namespace ARMeilleure.Instructions
context.MarkLabel(endLabel);
}
- public static void EmitJumpTableBranch(ArmEmitterContext context, Operand address, bool isJump = false)
+ private static void EmitJumpTableBranch(ArmEmitterContext context, Operand address, bool isJump)
{
if (address.Type == OperandType.I32)
{
address = context.ZeroExtend32(OperandType.I64, address);
}
+ context.StoreToContext();
+
// TODO: Constant folding. Indirect calls are slower in the best case and emit more code so we want to
// avoid them when possible.
bool isConst = address.Kind == OperandKind.Constant;
diff --git a/ARMeilleure/Translation/PTC/Ptc.cs b/ARMeilleure/Translation/PTC/Ptc.cs
index 3065757d..6e1a73f6 100644
--- a/ARMeilleure/Translation/PTC/Ptc.cs
+++ b/ARMeilleure/Translation/PTC/Ptc.cs
@@ -26,7 +26,7 @@ namespace ARMeilleure.Translation.PTC
{
private const string HeaderMagicString = "PTChd\0\0\0";
- private const uint InternalVersion = 1990; //! To be incremented manually for each change to the ARMeilleure project.
+ private const uint InternalVersion = 2155; //! To be incremented manually for each change to the ARMeilleure project.
private const string ActualDir = "0";
private const string BackupDir = "1";