diff options
author | gdkchan <gab.dark.100@gmail.com> | 2019-01-24 23:59:53 -0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-01-24 23:59:53 -0200 |
commit | 36b9ab0e48b6893c057a954e1ef3181b452add1c (patch) | |
tree | 16a4ae56019b55d0cb61f1aa105481933ada733e /ChocolArm64/Instructions/InstEmitFlowHelper.cs | |
parent | 72157e03eb09d4fb5d6d004efc2d13d3194e8c90 (diff) |
Add ARM32 support on the translator (#561)
* Remove ARM32 interpreter and add ARM32 support on the translator
* Nits.
* Rename Cond -> Condition
* Align code again
* Rename Data to Alu
* Enable ARM32 support and handle undefined instructions
* Use the IsThumb method to check if its a thumb opcode
* Remove another 32-bits check
Diffstat (limited to 'ChocolArm64/Instructions/InstEmitFlowHelper.cs')
-rw-r--r-- | ChocolArm64/Instructions/InstEmitFlowHelper.cs | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/ChocolArm64/Instructions/InstEmitFlowHelper.cs b/ChocolArm64/Instructions/InstEmitFlowHelper.cs new file mode 100644 index 00000000..cf093bb3 --- /dev/null +++ b/ChocolArm64/Instructions/InstEmitFlowHelper.cs @@ -0,0 +1,39 @@ +using ChocolArm64.Translation; +using System.Reflection.Emit; + +namespace ChocolArm64.Instructions +{ + static class InstEmitFlowHelper + { + public static void EmitCall(ILEmitterCtx context, long imm) + { + if (context.TryOptEmitSubroutineCall()) + { + //Note: the return value of the called method will be placed + //at the Stack, the return value is always a Int64 with the + //return address of the function. We check if the address is + //correct, if it isn't we keep returning until we reach the dispatcher. + context.Emit(OpCodes.Dup); + + context.EmitLdc_I8(context.CurrOp.Position + 4); + + ILLabel lblContinue = new ILLabel(); + + context.Emit(OpCodes.Beq_S, lblContinue); + context.Emit(OpCodes.Ret); + + context.MarkLabel(lblContinue); + + context.Emit(OpCodes.Pop); + + context.EmitLoadState(); + } + else + { + context.EmitLdc_I8(imm); + + context.Emit(OpCodes.Ret); + } + } + } +} |