diff options
| -rw-r--r-- | ARMeilleure/Instructions/InstEmitFlowHelper.cs | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/ARMeilleure/Instructions/InstEmitFlowHelper.cs b/ARMeilleure/Instructions/InstEmitFlowHelper.cs index f0a81e85..7b244296 100644 --- a/ARMeilleure/Instructions/InstEmitFlowHelper.cs +++ b/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 { |
