From e99e6d0ad1fb0e0245469a67526de2dc03bc0658 Mon Sep 17 00:00:00 2001 From: riperiperi Date: Sat, 4 Apr 2020 09:05:11 +0100 Subject: [PATCH] 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 --- .../Instructions/InstEmitFlowHelper.cs | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 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); + + EmitNativeCall(context, fallbackAddr, true); } - - Operand fallbackAddr = context.Call(new _U64_U64(NativeInterface.GetFunctionAddress), address); - - EmitNativeCall(context, fallbackAddr, true); } else {