diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-12-11 11:39:03 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-12-11 11:39:03 +0100 |
| commit | 2d4f073925aebb93f9f19122fe5cd9c55caf1df3 (patch) | |
| tree | ea151107676958537ffb72c147bbe24253454c78 /src | |
| parent | a25aab1426f19d967a02861358c8f904ee372d3c (diff) | |
| download | box64-2d4f073925aebb93f9f19122fe5cd9c55caf1df3.tar.gz box64-2d4f073925aebb93f9f19122fe5cd9c55caf1df3.zip | |
[COSIM] Try to get more stable result on x87 stacks by unwinding status before calling cosim
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_functions.c | 10 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_functions.h | 3 | ||||
| -rw-r--r-- | src/dynarec/dynarec_arch.h | 3 | ||||
| -rw-r--r-- | src/dynarec/dynarec_native_pass.c | 3 | ||||
| -rw-r--r-- | src/dynarec/la64/dynarec_la64_functions.c | 10 | ||||
| -rw-r--r-- | src/dynarec/la64/dynarec_la64_functions.h | 2 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_functions.c | 12 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_functions.h | 2 |
8 files changed, 44 insertions, 1 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_functions.c b/src/dynarec/arm64/dynarec_arm64_functions.c index cbbeb93a..590000bf 100644 --- a/src/dynarec/arm64/dynarec_arm64_functions.c +++ b/src/dynarec/arm64/dynarec_arm64_functions.c @@ -1020,3 +1020,13 @@ int nativeFlagsNeedsTransform(dynarec_arm_t* dyn, int ninst) return 1; return 0; } + +void fpu_save_and_unwind(dynarec_arm_t* dyn, int ninst, neoncache_t* cache) +{ + memcpy(cache, &dyn->insts[ninst].n, sizeof(neoncache_t)); + neoncacheUnwind(&dyn->insts[ninst].n); +} +void fpu_unwind_restore(dynarec_arm_t* dyn, int ninst, neoncache_t* cache) +{ + memcpy(&dyn->insts[ninst].n, cache, sizeof(neoncache_t)); +} diff --git a/src/dynarec/arm64/dynarec_arm64_functions.h b/src/dynarec/arm64/dynarec_arm64_functions.h index c0f7dcd0..41343a78 100644 --- a/src/dynarec/arm64/dynarec_arm64_functions.h +++ b/src/dynarec/arm64/dynarec_arm64_functions.h @@ -67,6 +67,9 @@ int fpuCacheNeedsTransform(dynarec_arm_t* dyn, int ninst); // Undo the changes of a neoncache to get the status before the instruction void neoncacheUnwind(neoncache_t* cache); +void fpu_save_and_unwind(dynarec_arm_t* dyn, int ninst, neoncache_t* cache); +void fpu_unwind_restore(dynarec_arm_t* dyn, int ninst, neoncache_t* cache); + // Get if ED will have the correct parity. Not emitting anything. Parity is 2 for DWORD or 3 for QWORD int getedparity(dynarec_native_t* dyn, int ninst, uintptr_t addr, uint8_t nextop, int parity, int delta); diff --git a/src/dynarec/dynarec_arch.h b/src/dynarec/dynarec_arch.h index a617009c..dc34edd7 100644 --- a/src/dynarec/dynarec_arch.h +++ b/src/dynarec/dynarec_arch.h @@ -5,6 +5,7 @@ #define instruction_native_t instruction_arm64_t #define dynarec_native_t dynarec_arm_t +#define extcache_native_t neoncache_t #define ADDITIONNAL_DEFINITION() \ int fpuCacheNeedsTransform(dynarec_native_t* dyn, int ninst); @@ -27,6 +28,7 @@ #define instruction_native_t instruction_la64_t #define dynarec_native_t dynarec_la64_t +#define extcache_native_t lsxcache_t #define ADDITIONNAL_DEFINITION() \ int fpuCacheNeedsTransform(dynarec_native_t* dyn, int ninst); @@ -47,6 +49,7 @@ #define instruction_native_t instruction_rv64_t #define dynarec_native_t dynarec_rv64_t +#define extcache_native_t extcache_t #define ADDITIONNAL_DEFINITION() \ int fpuCacheNeedsTransform(dynarec_native_t* dyn, int ninst); \ diff --git a/src/dynarec/dynarec_native_pass.c b/src/dynarec/dynarec_native_pass.c index d180b2d5..0186a24c 100644 --- a/src/dynarec/dynarec_native_pass.c +++ b/src/dynarec/dynarec_native_pass.c @@ -128,9 +128,12 @@ uintptr_t native_pass(dynarec_native_t* dyn, uintptr_t addr, int alternate, int } if(box64_dynarec_test && (!box64_dynarec_test_end || (ip>=box64_dynarec_test_start && ip<box64_dynarec_test_end) )) { MESSAGE(LOG_DUMP, "TEST STEP ----\n"); + extcache_native_t save; + fpu_save_and_unwind(dyn, ninst, &save); fpu_reflectcache(dyn, ninst, x1, x2, x3); GO_TRACE(x64test_step, 1, x5); fpu_unreflectcache(dyn, ninst, x1, x2, x3); + fpu_unwind_restore(dyn, ninst, &save); MESSAGE(LOG_DUMP, "----------\n"); } #ifdef HAVE_TRACE diff --git a/src/dynarec/la64/dynarec_la64_functions.c b/src/dynarec/la64/dynarec_la64_functions.c index 2d936337..925113f0 100644 --- a/src/dynarec/la64/dynarec_la64_functions.c +++ b/src/dynarec/la64/dynarec_la64_functions.c @@ -385,3 +385,13 @@ void fpu_reset_ninst(dynarec_la64_t* dyn, int ninst) sse_reset(&dyn->insts[ninst].lsx); fpu_reset_reg_lsxcache(&dyn->insts[ninst].lsx); } + +void fpu_save_and_unwind(dynarec_la64_t* dyn, int ninst, lsxcache_t* cache) +{ + memcpy(cache, &dyn->insts[ninst].lsx, sizeof(lsxcache_t)); + lsxcacheUnwind(&dyn->insts[ninst].lsx); +} +void fpu_unwind_restore(dynarec_la64_t* dyn, int ninst, lsxcache_t* cache) +{ + memcpy(&dyn->insts[ninst].lsx, cache, sizeof(lsxcache_t)); +} diff --git a/src/dynarec/la64/dynarec_la64_functions.h b/src/dynarec/la64/dynarec_la64_functions.h index b674983f..1fcde649 100644 --- a/src/dynarec/la64/dynarec_la64_functions.h +++ b/src/dynarec/la64/dynarec_la64_functions.h @@ -24,6 +24,8 @@ int fpuCacheNeedsTransform(dynarec_la64_t* dyn, int ninst); // Undo the changes of a lsxcache to get the status before the instruction void lsxcacheUnwind(lsxcache_t* cache); +void fpu_save_and_unwind(dynarec_la64_t* dyn, int ninst, lsxcache_t* cache); +void fpu_unwind_restore(dynarec_la64_t* dyn, int ninst, lsxcache_t* cache); const char* getCacheName(int t, int n); diff --git a/src/dynarec/rv64/dynarec_rv64_functions.c b/src/dynarec/rv64/dynarec_rv64_functions.c index d74effaf..3930d6ea 100644 --- a/src/dynarec/rv64/dynarec_rv64_functions.c +++ b/src/dynarec/rv64/dynarec_rv64_functions.c @@ -829,4 +829,14 @@ void get_free_scratch(dynarec_rv64_t* dyn, int ninst, uint8_t* tmp1, uint8_t* tm *tmp1 = tmp[0]; *tmp2 = tmp[1]; *tmp3 = tmp[2]; -} \ No newline at end of file +} + +void fpu_save_and_unwind(dynarec_rv64_t* dyn, int ninst, extcache_t* cache) +{ + memcpy(cache, &dyn->insts[ninst].e, sizeof(extcache_t)); + extcacheUnwind(&dyn->insts[ninst].e); +} +void fpu_unwind_restore(dynarec_rv64_t* dyn, int ninst, extcache_t* cache) +{ + memcpy(&dyn->insts[ninst].e, cache, sizeof(extcache_t)); +} diff --git a/src/dynarec/rv64/dynarec_rv64_functions.h b/src/dynarec/rv64/dynarec_rv64_functions.h index 668c24a9..fcf4eb85 100644 --- a/src/dynarec/rv64/dynarec_rv64_functions.h +++ b/src/dynarec/rv64/dynarec_rv64_functions.h @@ -53,6 +53,8 @@ int sewNeedsTransform(dynarec_rv64_t* dyn, int ninst); // Undo the changes of a extcache to get the status before the instruction void extcacheUnwind(extcache_t* cache); +void fpu_save_and_unwind(dynarec_rv64_t* dyn, int ninst, extcache_t* cache); +void fpu_unwind_restore(dynarec_rv64_t* dyn, int ninst, extcache_t* cache); const char* getCacheName(int t, int n); |