From b8024469da6ce7e63529652b56b925de733ffa82 Mon Sep 17 00:00:00 2001 From: ptitSeb Date: Thu, 10 Oct 2024 20:55:24 +0200 Subject: [ARM64_DYNAREC] Added a small optim for CALL 0 / POP reg type of sequence --- src/dynarec/arm64/dynarec_arm64_00.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/dynarec/arm64/dynarec_arm64_00.c b/src/dynarec/arm64/dynarec_arm64_00.c index 5b5a253b..3e769ddd 100644 --- a/src/dynarec/arm64/dynarec_arm64_00.c +++ b/src/dynarec/arm64/dynarec_arm64_00.c @@ -3081,7 +3081,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin if(!rex.is32bits && isNativeCall(dyn, addr+i32, rex.is32bits, &dyn->insts[ninst].natcall, &dyn->insts[ninst].retn)) tmp = dyn->insts[ninst].pass2choice = 3; else - tmp = dyn->insts[ninst].pass2choice = 0; + tmp = dyn->insts[ninst].pass2choice = i32?0:1; #else tmp = dyn->insts[ninst].pass2choice; #endif @@ -3139,6 +3139,15 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin dyn->last_ip = addr; } break; + case 1: + // this is call to next step, so just push the return address to the stack + if(rex.is32bits) { + MOV32w(x2, addr); + } else { + TABLE64(x2, addr); + } + PUSH1z(x2); + break; default: if((box64_dynarec_safeflags>1) || (ninst && dyn->insts[ninst-1].x64.set_flags)) { READFLAGS(X_PEND); // that's suspicious -- cgit 1.4.1