diff --git a/src/dynarec/arm64/dynarec_arm64_private.h b/src/dynarec/arm64/dynarec_arm64_private.h index 477ab5daf4..c00ce4bba4 100644 --- a/src/dynarec/arm64/dynarec_arm64_private.h +++ b/src/dynarec/arm64/dynarec_arm64_private.h @@ -225,10 +225,6 @@ int Table64(dynarec_arm_t *dyn, uint64_t val, int pass); // add a value to tabl void CreateJmpNext(void* addr, void* next); -// TODO: Save and restore the temp register. -#define SAVE_ACTIVE_SCRATCH_REGISTERS do{} while(0); -#define LOAD_ACTIVE_SCRATCH_REGISTERS do{} while(0); - #define GO_TRACE(A, B, s0) \ GETIP(addr); \ MOVx_REG(x1, xRIP); \ diff --git a/src/dynarec/dynarec_native_pass.c b/src/dynarec/dynarec_native_pass.c index 75798ae6c8..5963404716 100644 --- a/src/dynarec/dynarec_native_pass.c +++ b/src/dynarec/dynarec_native_pass.c @@ -257,11 +257,15 @@ uintptr_t native_pass(dynarec_native_t* dyn, uintptr_t addr, int alternate, int if((trace_end == 0) || ((ip >= trace_start) && (ip < trace_end))) { MESSAGE(LOG_DUMP, "TRACE ----\n"); - if (BOX64ENV(dynarec_nativeflags)) SAVE_ACTIVE_SCRATCH_REGISTERS; + #if defined (RV64) || defined(LA64) || defined(PPC64LE) + if (BOX64ENV(dynarec_nativeflags)) SPILL_NF_REGISTERS(); + #endif fpu_reflectcache(dyn, ninst, x1, x2, x3); GO_TRACE(PrintTrace, 1, x5); fpu_unreflectcache(dyn, ninst, x1, x2, x3); - if (BOX64ENV(dynarec_nativeflags)) LOAD_ACTIVE_SCRATCH_REGISTERS; + #if defined (RV64) || defined(LA64) || defined(PPC64LE) + if (BOX64ENV(dynarec_nativeflags)) RESTORE_NF_REGISTERS(); + #endif MESSAGE(LOG_DUMP, "----------\n"); } } diff --git a/src/dynarec/la64/dynarec_la64_private.h b/src/dynarec/la64/dynarec_la64_private.h index e70be9c261..35339d154f 100644 --- a/src/dynarec/la64/dynarec_la64_private.h +++ b/src/dynarec/la64/dynarec_la64_private.h @@ -200,9 +200,31 @@ int Table64(dynarec_la64_t *dyn, uint64_t val, int pass); // add a value to tab void CreateJmpNext(void* addr, void* next); -// TODO: Save and restore the temp register. -#define SAVE_ACTIVE_SCRATCH_REGISTERS do{} while(0); -#define LOAD_ACTIVE_SCRATCH_REGISTERS do{} while(0); +#define SPILL_NF_REGISTERS() \ + do { \ + uint8_t n1 = dyn->insts[ninst].nat_flags_op1; \ + uint8_t n2 = dyn->insts[ninst].nat_flags_op2; \ + if (IS_SCRATCH(n1) || IS_SCRATCH(n2)) { \ + ADDI_D(xSP, xSP, -16); \ + if (IS_SCRATCH(n1)) \ + ST_D(n1, xSP, 0); \ + if (n1 != n2 && IS_SCRATCH(n2)) \ + ST_D(n2, xSP, 8); \ + } \ + } while(0); + +#define RESTORE_NF_REGISTERS() \ + do { \ + uint8_t n1 = dyn->insts[ninst].nat_flags_op1; \ + uint8_t n2 = dyn->insts[ninst].nat_flags_op2; \ + if (IS_SCRATCH(n1) || IS_SCRATCH(n2)) { \ + if (IS_SCRATCH(n1)) \ + LD_D(n1, xSP, 0); \ + if (n1 != n2 && IS_SCRATCH(n2)) \ + LD_D(n2, xSP, 8); \ + ADDI_D(xSP, xSP, 16); \ + } \ + } while(0); #define GO_TRACE(A, B, s0) \ GETIP(addr, s0); \ diff --git a/src/dynarec/ppc64le/dynarec_ppc64le_private.h b/src/dynarec/ppc64le/dynarec_ppc64le_private.h index e3a1ab85a2..d04130a469 100644 --- a/src/dynarec/ppc64le/dynarec_ppc64le_private.h +++ b/src/dynarec/ppc64le/dynarec_ppc64le_private.h @@ -218,9 +218,31 @@ int Table64(dynarec_ppc64le_t *dyn, uint64_t val, int pass); // add a value to void CreateJmpNext(void* addr, void* next); -// TODO: Save and restore the temp register. -#define SAVE_ACTIVE_SCRATCH_REGISTERS do{} while(0); -#define LOAD_ACTIVE_SCRATCH_REGISTERS do{} while(0); +#define SPILL_NF_REGISTERS() \ + do { \ + uint8_t n1 = dyn->insts[ninst].nat_flags_op1; \ + uint8_t n2 = dyn->insts[ninst].nat_flags_op2; \ + if (IS_SCRATCH(n1) || IS_SCRATCH(n2)) { \ + ADDI(xSP, xSP, -16); \ + if (IS_SCRATCH(n1)) \ + STD(n1, 0, xSP); \ + if (n1 != n2 && IS_SCRATCH(n2)) \ + STD(n2, 8, xSP); \ + } \ + } while(0); + +#define RESTORE_NF_REGISTERS() \ + do { \ + uint8_t n1 = dyn->insts[ninst].nat_flags_op1; \ + uint8_t n2 = dyn->insts[ninst].nat_flags_op2; \ + if (IS_SCRATCH(n1) || IS_SCRATCH(n2)) { \ + if (IS_SCRATCH(n1)) \ + LD(n1, xSP, 0); \ + if (n1 != n2 && IS_SCRATCH(n2)) \ + LD(n2, xSP, 8); \ + ADDI(xSP, xSP, 16); \ + } \ + } while(0); #define GO_TRACE(A, B, s0) \ GETIP(addr, s0); \ diff --git a/src/dynarec/rv64/dynarec_rv64_private.h b/src/dynarec/rv64/dynarec_rv64_private.h index 416832a2f7..8acb8e3b3a 100644 --- a/src/dynarec/rv64/dynarec_rv64_private.h +++ b/src/dynarec/rv64/dynarec_rv64_private.h @@ -216,7 +216,7 @@ int Table64(dynarec_rv64_t *dyn, uint64_t val, int pass); // add a value to tab void CreateJmpNext(void* addr, void* next); -#define SAVE_ACTIVE_SCRATCH_REGISTERS \ +#define SPILL_NF_REGISTERS() \ do { \ uint8_t n1 = dyn->insts[ninst].nat_flags_op1; \ uint8_t n2 = dyn->insts[ninst].nat_flags_op2; \ @@ -229,7 +229,7 @@ void CreateJmpNext(void* addr, void* next); } \ } while(0); -#define LOAD_ACTIVE_SCRATCH_REGISTERS \ +#define RESTORE_NF_REGISTERS() \ do { \ uint8_t n1 = dyn->insts[ninst].nat_flags_op1; \ uint8_t n2 = dyn->insts[ninst].nat_flags_op2; \