From e15eb5a7f6e421deba49b9ab0d28b84231c68033 Mon Sep 17 00:00:00 2001 From: ptitSeb Date: Sun, 21 Mar 2021 20:36:46 +0100 Subject: [DYNAREC] Optimized a bit Native call push/pop regs --- src/dynarec/dynarec_arm64_00.c | 1 - src/dynarec/dynarec_arm64_helper.c | 6 ++---- src/dynarec/dynarec_arm64_helper.h | 11 +++++------ 3 files changed, 7 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/dynarec/dynarec_arm64_00.c b/src/dynarec/dynarec_arm64_00.c index 37e59494..2b9cc55b 100755 --- a/src/dynarec/dynarec_arm64_00.c +++ b/src/dynarec/dynarec_arm64_00.c @@ -1424,7 +1424,6 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin PUSH1(x2); MESSAGE(LOG_DUMP, "Native Call to %s (retn=%d)\n", GetNativeName(GetNativeFnc(dyn->insts[ninst].natcall-1)), dyn->insts[ninst].retn); // calling a native function - x87_forget(dyn, ninst, x3, x4, 0); sse_purge07cache(dyn, ninst, x3); GETIP_(dyn->insts[ninst].natcall); // read the 0xCC already STORE_XEMU_CALL(xRIP); diff --git a/src/dynarec/dynarec_arm64_helper.c b/src/dynarec/dynarec_arm64_helper.c index 5b8ebd2b..c752eb94 100755 --- a/src/dynarec/dynarec_arm64_helper.c +++ b/src/dynarec/dynarec_arm64_helper.c @@ -341,7 +341,7 @@ void call_c(dynarec_arm_t* dyn, int ninst, void* fnc, int reg, int ret, int save STPx_S7_offset(xRDX, xRBX, xEmu, offsetof(x64emu_t, regs[_DX])); // but x18 is R8 wich is lost, so it's fine to not save it? STPx_S7_offset(xRSP, xRBP, xEmu, offsetof(x64emu_t, regs[_SP])); STPx_S7_offset(xRSI, xRDI, xEmu, offsetof(x64emu_t, regs[_SI])); - STRx_U12(xR8, xEmu, offsetof(x64emu_t, regs[_R8])); + STPx_S7_offset(xR8, xR9, xEmu, offsetof(x64emu_t, regs[_R8])); } TABLE64(reg, (uintptr_t)fnc); BLR(reg); @@ -361,10 +361,8 @@ void call_c(dynarec_arm_t* dyn, int ninst, void* fnc, int reg, int ret, int save GO(RDX, RBX); GO(RSP, RBP); GO(RSI, RDI); + GO(R8, R9); #undef GO - if(ret!=xR8) { - LDRx_U12(xR8, xEmu, offsetof(x64emu_t, regs[_R8])); - } } fpu_popcache(dyn, ninst, reg); if(saveflags) { diff --git a/src/dynarec/dynarec_arm64_helper.h b/src/dynarec/dynarec_arm64_helper.h index e629c9f9..ed8fd357 100755 --- a/src/dynarec/dynarec_arm64_helper.h +++ b/src/dynarec/dynarec_arm64_helper.h @@ -391,14 +391,13 @@ if(A) {STRx_U12(A, xEmu, offsetof(x64emu_t, ip));} #define STORE_XEMU_CALL(A) \ - STORE_REG(R9); \ - STRx_U12(xFlags, xEmu, offsetof(x64emu_t, eflags)); \ - if(A) {STRx_U12(A, xEmu, offsetof(x64emu_t, ip));} + if(A) {STPx_S7_offset(xFlags, A, xEmu, offsetof(x64emu_t, eflags));} \ + else {STRx_U12(xFlags, xEmu, offsetof(x64emu_t, eflags));} #define LOAD_XEMU_CALL(A) \ - LOAD_REG(R9); \ - LDRx_U12(xFlags, xEmu, offsetof(x64emu_t, eflags)); \ - if(A) {LDRx_U12(A, xEmu, offsetof(x64emu_t, ip)); if(A==xRIP) dyn->last_ip = 0;} + if(A) {LDPx_S7_offset(xFlags, A, xEmu, offsetof(x64emu_t, eflags));} \ + else {LDRx_U12(xFlags, xEmu, offsetof(x64emu_t, eflags));}; \ + if(A==xRIP) dyn->last_ip = 0 #define SET_DFNONE(S) if(!dyn->dfnone) {MOVZw(S, d_none); STRw_U12(S, xEmu, offsetof(x64emu_t, df)); dyn->dfnone=1;} #define SET_DF(S, N) if(N) {MOVZw(S, N); STRw_U12(S, xEmu, offsetof(x64emu_t, df)); dyn->dfnone=0;} else SET_DFNONE(S) -- cgit 1.4.1