about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-12-11 11:39:03 +0100
committerptitSeb <sebastien.chev@gmail.com>2024-12-11 11:39:03 +0100
commit2d4f073925aebb93f9f19122fe5cd9c55caf1df3 (patch)
treeea151107676958537ffb72c147bbe24253454c78 /src
parenta25aab1426f19d967a02861358c8f904ee372d3c (diff)
downloadbox64-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.c10
-rw-r--r--src/dynarec/arm64/dynarec_arm64_functions.h3
-rw-r--r--src/dynarec/dynarec_arch.h3
-rw-r--r--src/dynarec/dynarec_native_pass.c3
-rw-r--r--src/dynarec/la64/dynarec_la64_functions.c10
-rw-r--r--src/dynarec/la64/dynarec_la64_functions.h2
-rw-r--r--src/dynarec/rv64/dynarec_rv64_functions.c12
-rw-r--r--src/dynarec/rv64/dynarec_rv64_functions.h2
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);