about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2023-10-27 17:54:50 +0200
committerptitSeb <sebastien.chev@gmail.com>2023-10-27 17:54:50 +0200
commitacaf23fcb84d7a7e30b4fc5824f242ea1e1b4cde (patch)
treefef0941d124eb768bf94aed3b69ff2e78ca0b479 /src
parent15860f324532247345e1f314eb8ebbfe37c5d531 (diff)
downloadbox64-acaf23fcb84d7a7e30b4fc5824f242ea1e1b4cde.tar.gz
box64-acaf23fcb84d7a7e30b4fc5824f242ea1e1b4cde.zip
[ARM64_DYNAREC] Better fix for x87 i64 promotion to Double
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_functions.c6
-rw-r--r--src/dynarec/arm64/dynarec_arm64_functions.h2
-rw-r--r--src/dynarec/arm64/dynarec_arm64_helper.h8
3 files changed, 9 insertions, 7 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_functions.c b/src/dynarec/arm64/dynarec_arm64_functions.c
index 28e1fc5b..27280dc5 100644
--- a/src/dynarec/arm64/dynarec_arm64_functions.c
+++ b/src/dynarec/arm64/dynarec_arm64_functions.c
@@ -95,10 +95,12 @@ void fpu_reset_reg(dynarec_arm_t* dyn)
 
 }
 
-int neoncache_no_i64(int a)
+int neoncache_no_i64(dynarec_arm_t* dyn, int ninst, int st, int a)
 {
-    if(a==NEON_CACHE_ST_I64)
+    if(a==NEON_CACHE_ST_I64) {
+        neoncache_promote_double(dyn, ninst, st);
         return NEON_CACHE_ST_D;
+    }
     return a;
 }
 
diff --git a/src/dynarec/arm64/dynarec_arm64_functions.h b/src/dynarec/arm64/dynarec_arm64_functions.h
index 0111c8a2..507a191d 100644
--- a/src/dynarec/arm64/dynarec_arm64_functions.h
+++ b/src/dynarec/arm64/dynarec_arm64_functions.h
@@ -38,7 +38,7 @@ void neoncache_promote_double(dynarec_arm_t* dyn, int ninst, int a);
 // Combine and propagate if needed (pass 1 only)
 int neoncache_combine_st(dynarec_arm_t* dyn, int ninst, int a, int b);  // with stack current dyn->n_stack*
 // Do not allow i64 type
-int neoncache_no_i64(int a);
+int neoncache_no_i64(dynarec_arm_t* dyn, int ninst, int st, int a);
 
 
 // FPU Cache transformation (for loops) // Specific, need to be written by backend
diff --git a/src/dynarec/arm64/dynarec_arm64_helper.h b/src/dynarec/arm64/dynarec_arm64_helper.h
index 85480f27..268f8ee5 100644
--- a/src/dynarec/arm64/dynarec_arm64_helper.h
+++ b/src/dynarec/arm64/dynarec_arm64_helper.h
@@ -1203,8 +1203,8 @@ int neoncache_st_coherency(dynarec_arm_t* dyn, int ninst, int a, int b);
 #define ST_IS_F(A) (neoncache_get_current_st(dyn, ninst, A)==NEON_CACHE_ST_F)
 #define ST_IS_I64(A) (neoncache_get_current_st(dyn, ninst, A)==NEON_CACHE_ST_I64)
 #define X87_COMBINE(A, B) neoncache_combine_st(dyn, ninst, A, B)
-#define X87_ST0     neoncache_no_i64(neoncache_get_current_st(dyn, ninst, 0))
-#define X87_ST(A)   neoncache_no_i64(neoncache_get_current_st(dyn, ninst, A))
+#define X87_ST0     neoncache_no_i64(dyn, ninst, 0, neoncache_get_current_st(dyn, ninst, 0))
+#define X87_ST(A)   neoncache_no_i64(dyn, ninst, A, neoncache_get_current_st(dyn, ninst, A))
 #else
 #define ST_IS_F(A) (neoncache_get_st(dyn, ninst, A)==NEON_CACHE_ST_F)
 #define ST_IS_I64(A) (neoncache_get_st(dyn, ninst, A)==NEON_CACHE_ST_I64)
@@ -1213,8 +1213,8 @@ int neoncache_st_coherency(dynarec_arm_t* dyn, int ninst, int a, int b);
 #else
 #define X87_COMBINE(A, B) neoncache_get_st(dyn, ninst, A)
 #endif
-#define X87_ST0     neoncache_no_i64(neoncache_get_st(dyn, ninst, 0))
-#define X87_ST(A)   neoncache_no_i64(neoncache_get_st(dyn, ninst, A))
+#define X87_ST0     neoncache_get_st(dyn, ninst, 0)
+#define X87_ST(A)   neoncache_get_st(dyn, ninst, A)
 #endif
 
 //MMX helpers