diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-10-10 20:55:24 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-10-10 20:55:24 +0200 |
| commit | b8024469da6ce7e63529652b56b925de733ffa82 (patch) | |
| tree | 3bdde320f28a1641eda2c5880ed93a610a890502 /src | |
| parent | 7f5c826bb13d2d989563d27436d5b4e4f95e3757 (diff) | |
| download | box64-b8024469da6ce7e63529652b56b925de733ffa82.tar.gz box64-b8024469da6ce7e63529652b56b925de733ffa82.zip | |
[ARM64_DYNAREC] Added a small optim for CALL 0 / POP reg type of sequence
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_00.c | 11 |
1 files changed, 10 insertions, 1 deletions
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 |