diff options
| author | Yang Liu <numbksco@gmail.com> | 2024-03-02 18:14:48 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-03-02 11:14:48 +0100 |
| commit | 9883c6464e3df077322d00295a64b63d546d1dc8 (patch) | |
| tree | 6562adb23f45ccf1e28001505cd5b105740cfd22 | |
| parent | 67006f28092a407d31bcd1013f62900e7f52bbc3 (diff) | |
| download | box64-9883c6464e3df077322d00295a64b63d546d1dc8.tar.gz box64-9883c6464e3df077322d00295a64b63d546d1dc8.zip | |
[LA64_DYNAREC] Adopt to ARM64 way of CALL/RET optim since there is a dedicated register (#1309)
| -rw-r--r-- | src/dynarec/la64/la64_epilog.S | 6 | ||||
| -rw-r--r-- | src/dynarec/la64/la64_prolog.S | 6 | ||||
| -rw-r--r-- | src/emu/x64emu_private.h | 3 |
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]; |