about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorYang Liu <numbksco@gmail.com>2024-03-02 18:14:48 +0800
committerGitHub <noreply@github.com>2024-03-02 11:14:48 +0100
commit9883c6464e3df077322d00295a64b63d546d1dc8 (patch)
tree6562adb23f45ccf1e28001505cd5b105740cfd22 /src
parent67006f28092a407d31bcd1013f62900e7f52bbc3 (diff)
downloadbox64-9883c6464e3df077322d00295a64b63d546d1dc8.tar.gz
box64-9883c6464e3df077322d00295a64b63d546d1dc8.zip
[LA64_DYNAREC] Adopt to ARM64 way of CALL/RET optim since there is a dedicated register (#1309)
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/la64/la64_epilog.S6
-rw-r--r--src/dynarec/la64/la64_prolog.S6
-rw-r--r--src/emu/x64emu_private.h3
3 files changed, 5 insertions, 10 deletions
diff --git a/src/dynarec/la64/la64_epilog.S b/src/dynarec/la64/la64_epilog.S
index 91627ea2..97f5e9ac 100644
--- a/src/dynarec/la64/la64_epilog.S
+++ b/src/dynarec/la64/la64_epilog.S
@@ -27,10 +27,8 @@ la64_epilog:
     st.d   $r30, $r4, (8 * 15)
     st.d   $r31, $r4, (8 * 16) // xFlags
     st.d   $r20, $r4, (8 * 17) // put back reg value in emu, including EIP (so x27 must be EIP now)
-    ld.d   $sp,  $r4, 552      // restore saved sp from emu->xSPSave, see la64_prolog
-    ld.d   $r22, $sp, -8
-    st.d   $r22, $r4, 552
-    // vpop {d8-d15}
+    addi.d $sp, $r22, 0       // restore save sp from xSavedSP
+    // restore all used register
     ld.d   $r1,  $sp, (8 * 0) // load ra
     ld.d   $r22, $sp, (8 * 1) // load fp
     ld.d   $r23, $sp, (8 * 2)
diff --git a/src/dynarec/la64/la64_prolog.S b/src/dynarec/la64/la64_prolog.S
index 5f57218d..c1d1ed80 100644
--- a/src/dynarec/la64/la64_prolog.S
+++ b/src/dynarec/la64/la64_prolog.S
@@ -50,12 +50,12 @@ la64_prolog:
     ld.d   $r30, $r4, (8 * 15)
     ld.d   $r31, $r4, (8 * 16)  //xFlags
     ld.d   $r20, $r4, (8 * 17)  //xRIP
-    ld.d   $r22, $r4, 552 // grab an old value of emu->xSPSave
-    st.d   $sp,  $r4, 552 // save current sp to emu->xSPSave
     // push sentinel onto the stack
-    st.d   $r22, $sp, -16
+    st.d   $r0, $sp, -16
     st.d   $r0,  $sp, -8
     addi.d $sp,  $sp, -16
+    // save old sp into xSavedSP
+    addi.d $r22, $sp, 16
     // setup xMASK
     addi.w  $r11, $r0, -1
     lu32i.d $r11, 0
diff --git a/src/emu/x64emu_private.h b/src/emu/x64emu_private.h
index 65a99bc3..90c9b7b0 100644
--- a/src/emu/x64emu_private.h
+++ b/src/emu/x64emu_private.h
@@ -74,9 +74,6 @@ typedef struct x64emu_s {
     #ifdef RV64         // it would be better to use a dedicated register for this like arm64 xSavedSP, but we're running of of free registers.
     uintptr_t xSPSave;  // sp base value of current dynarec frame, used by call/ret optimization to reset stack when unmatch.
     #endif
-    #ifdef LA64         // it would be better to use a dedicated register for this like arm64 xSavedSP, but we're running of of free registers.
-    uintptr_t xSPSave;  // sp base value of current dynarec frame, used by call/ret optimization to reset stack when unmatch.
-    #endif
     fpu_ld_t    fpu_ld[8]; // for long double emulation / 80bits fld fst
     fpu_ll_t    fpu_ll[8]; // for 64bits fild / fist sequence
 	fpu_p_reg_t p_regs[8];