From 65ac00833a8b51fe9ea6f12ffdfadeb098a6c360 Mon Sep 17 00:00:00 2001 From: FICTURE7 Date: Thu, 20 May 2021 16:31:45 +0400 Subject: [PATCH] Use branch instead of tailcall for recursive calls (#2282) * Use branch instead of tailcall for recursive calls Use a branch instead of doing a tailcall for recursive calls. This avoids having to store the dispatch address, setting up the epilogue and keeps guest registers in host registers for longer. The rejit check is moved down into the entry block so that the rejit behaviour remains the same as before. * Set PTC version Co-authored-by: gdkchan --- .../Instructions/InstEmitFlowHelper.cs | 9 +++++++- ARMeilleure/Translation/PTC/Ptc.cs | 2 +- ARMeilleure/Translation/Translator.cs | 22 +++++++++++-------- 3 files changed, 22 insertions(+), 11 deletions(-) diff --git a/ARMeilleure/Instructions/InstEmitFlowHelper.cs b/ARMeilleure/Instructions/InstEmitFlowHelper.cs index f995ffa1f..e1309a4e3 100644 --- a/ARMeilleure/Instructions/InstEmitFlowHelper.cs +++ b/ARMeilleure/Instructions/InstEmitFlowHelper.cs @@ -144,7 +144,14 @@ namespace ARMeilleure.Instructions { bool isRecursive = immediate == context.EntryAddress; - EmitJumpTableBranch(context, Const(immediate), isRecursive); + if (isRecursive) + { + context.Branch(context.GetLabel(immediate)); + } + else + { + EmitJumpTableBranch(context, Const(immediate), isJump: false); + } } private static void EmitNativeCall(ArmEmitterContext context, Operand nativeContextPtr, Operand funcAddr, bool isJump) diff --git a/ARMeilleure/Translation/PTC/Ptc.cs b/ARMeilleure/Translation/PTC/Ptc.cs index a61cf5b75..b1d55cffd 100644 --- a/ARMeilleure/Translation/PTC/Ptc.cs +++ b/ARMeilleure/Translation/PTC/Ptc.cs @@ -28,7 +28,7 @@ namespace ARMeilleure.Translation.PTC private const string OuterHeaderMagicString = "PTCohd\0\0"; private const string InnerHeaderMagicString = "PTCihd\0\0"; - private const uint InternalVersion = 2279; //! To be incremented manually for each change to the ARMeilleure project. + private const uint InternalVersion = 2282; //! To be incremented manually for each change to the ARMeilleure project. private const string ActualDir = "0"; private const string BackupDir = "1"; diff --git a/ARMeilleure/Translation/Translator.cs b/ARMeilleure/Translation/Translator.cs index 81af0681d..f8b074c97 100644 --- a/ARMeilleure/Translation/Translator.cs +++ b/ARMeilleure/Translation/Translator.cs @@ -237,13 +237,6 @@ namespace ARMeilleure.Translation Logger.StartPass(PassName.Translation); - Counter counter = null; - - if (!context.HighCq) - { - EmitRejitCheck(context, out counter); - } - EmitSynchronization(context); if (blocks[0].Address != address) @@ -251,7 +244,7 @@ namespace ARMeilleure.Translation context.Branch(context.GetLabel(address)); } - ControlFlowGraph cfg = EmitAndGetCFG(context, blocks, out Range funcRange); + ControlFlowGraph cfg = EmitAndGetCFG(context, blocks, out Range funcRange, out Counter counter); ulong funcSize = funcRange.End - funcRange.Start; @@ -322,8 +315,14 @@ namespace ARMeilleure.Translation } } - private static ControlFlowGraph EmitAndGetCFG(ArmEmitterContext context, Block[] blocks, out Range range) + private static ControlFlowGraph EmitAndGetCFG( + ArmEmitterContext context, + Block[] blocks, + out Range range, + out Counter counter) { + counter = null; + ulong rangeStart = ulong.MaxValue; ulong rangeEnd = 0; @@ -344,6 +343,11 @@ namespace ARMeilleure.Translation } } + if (block.Address == context.EntryAddress && !context.HighCq) + { + EmitRejitCheck(context, out counter); + } + context.CurrBlock = block; context.MarkLabel(context.GetLabel(block.Address));