about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-03-21 20:36:46 +0100
committerptitSeb <sebastien.chev@gmail.com>2021-03-21 20:36:46 +0100
commite15eb5a7f6e421deba49b9ab0d28b84231c68033 (patch)
tree2c91ed535ad2e91eff787f5670b0cd3435124816 /src
parent3d4acc3aef2af0c7e7b0dcb251331da7bcab6bc7 (diff)
downloadbox64-e15eb5a7f6e421deba49b9ab0d28b84231c68033.tar.gz
box64-e15eb5a7f6e421deba49b9ab0d28b84231c68033.zip
[DYNAREC] Optimized a bit Native call push/pop regs
Diffstat (limited to 'src')
-rwxr-xr-xsrc/dynarec/dynarec_arm64_00.c1
-rwxr-xr-xsrc/dynarec/dynarec_arm64_helper.c6
-rwxr-xr-xsrc/dynarec/dynarec_arm64_helper.h11
3 files changed, 7 insertions, 11 deletions
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)