Просмотр исходного кода

Use the jump table for HighCq tail continues. (#1088)

* Use the jump table for tail continues.

This path is always reached when a function larger than our current length limit (currently 5000) is compiled.

* Use Call Flag rather than 1L
riperiperi 6 лет назад
Родитель
Сommit
e99e6d0ad1
1 измененных файлов с 14 добавлено и 5 удалено
  1. 14 5
      ARMeilleure/Instructions/InstEmitFlowHelper.cs

+ 14 - 5
ARMeilleure/Instructions/InstEmitFlowHelper.cs

@@ -225,14 +225,23 @@ namespace ARMeilleure.Instructions
             bool useTailContinue = true; // Left option here as it may be useful if we need to return to managed rather than tail call in future. (eg. for debug)
             if (useTailContinue)
             {
-                if (allowRejit)
+                if (context.HighCq)
                 {
-                    address = context.BitwiseOr(address, Const(1L));
-                }
+                    // 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);
+                } 
+                else
+                {
+                    if (allowRejit)
+                    {
+                        address = context.BitwiseOr(address, Const(CallFlag));
+                    }
 
-                Operand fallbackAddr = context.Call(new _U64_U64(NativeInterface.GetFunctionAddress), address);
+                    Operand fallbackAddr = context.Call(new _U64_U64(NativeInterface.GetFunctionAddress), address);
 
-                EmitNativeCall(context, fallbackAddr, true);
+                    EmitNativeCall(context, fallbackAddr, true);
+                }
             } 
             else
             {