diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2023-10-27 17:54:50 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2023-10-27 17:54:50 +0200 |
| commit | acaf23fcb84d7a7e30b4fc5824f242ea1e1b4cde (patch) | |
| tree | fef0941d124eb768bf94aed3b69ff2e78ca0b479 | |
| parent | 15860f324532247345e1f314eb8ebbfe37c5d531 (diff) | |
| download | box64-acaf23fcb84d7a7e30b4fc5824f242ea1e1b4cde.tar.gz box64-acaf23fcb84d7a7e30b4fc5824f242ea1e1b4cde.zip | |
[ARM64_DYNAREC] Better fix for x87 i64 promotion to Double
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_functions.c | 6 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_functions.h | 2 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_helper.h | 8 |
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 |