about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-06-02 13:56:13 +0200
committerptitSeb <sebastien.chev@gmail.com>2024-06-02 13:56:13 +0200
commit06cb3624e2c8994eabd49ddad89a101a755b6885 (patch)
tree311c9b82893c80d97247b9c4650fc6fec337374a /src
parenta1f83418b9f581434b525e5813c40a3d134c3d81 (diff)
downloadbox64-06cb3624e2c8994eabd49ddad89a101a755b6885.tar.gz
box64-06cb3624e2c8994eabd49ddad89a101a755b6885.zip
[ARM64_DYNAREC] Fixed handling of YMM0 on forward jump
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_functions.c4
-rw-r--r--src/dynarec/arm64/dynarec_arm64_helper.c2
-rw-r--r--src/dynarec/dynarec_native_pass.c4
3 files changed, 7 insertions, 3 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_functions.c b/src/dynarec/arm64/dynarec_arm64_functions.c
index febec38b..62523c3e 100644
--- a/src/dynarec/arm64/dynarec_arm64_functions.c
+++ b/src/dynarec/arm64/dynarec_arm64_functions.c
@@ -694,7 +694,9 @@ void inst_name_pass3(dynarec_native_t* dyn, int ninst, const char* name, rex_t r
             }
         }
         if(dyn->ymm_zero)
-            dynarec_log(LOG_NONE, " ymm0_mask=%04x", dyn->ymm_zero);
+            dynarec_log(LOG_NONE, " ymm0=%04x", dyn->ymm_zero);
+        if(dyn->insts[ninst].purge_ymm)
+            dynarec_log(LOG_NONE, " purgeYmm=%04x", dyn->insts[ninst].purge_ymm);
         if(dyn->n.stack || dyn->insts[ninst].n.stack_next || dyn->insts[ninst].n.x87stack)
             dynarec_log(LOG_NONE, " X87:%d/%d(+%d/-%d)%d", dyn->n.stack, dyn->insts[ninst].n.stack_next, dyn->insts[ninst].n.stack_push, dyn->insts[ninst].n.stack_pop, dyn->insts[ninst].n.x87stack);
         if(dyn->insts[ninst].n.combined1 || dyn->insts[ninst].n.combined2)
diff --git a/src/dynarec/arm64/dynarec_arm64_helper.c b/src/dynarec/arm64/dynarec_arm64_helper.c
index 6da4607d..9d2fc935 100644
--- a/src/dynarec/arm64/dynarec_arm64_helper.c
+++ b/src/dynarec/arm64/dynarec_arm64_helper.c
@@ -2450,8 +2450,10 @@ void fpu_reset_cache(dynarec_arm_t* dyn, int ninst, int reset_n)
     #if STEP > 1
     // for STEP 2 & 3, just need to refrest with current, and undo the changes (push & swap)
     dyn->n = dyn->insts[ninst].n;
+    dyn->ymm_zero = dyn->insts[ninst].ymm_zero;
     #else
     dyn->n = dyn->insts[reset_n].n;
+    dyn->ymm_zero = dyn->insts[reset_n].ymm_zero;
     #endif
     neoncacheUnwind(&dyn->n);
     #if STEP == 0
diff --git a/src/dynarec/dynarec_native_pass.c b/src/dynarec/dynarec_native_pass.c
index c748b47d..f78573f4 100644
--- a/src/dynarec/dynarec_native_pass.c
+++ b/src/dynarec/dynarec_native_pass.c
@@ -81,8 +81,6 @@ uintptr_t native_pass(dynarec_native_t* dyn, uintptr_t addr, int alternate, int
         }
         #endif
         fpu_propagate_stack(dyn, ninst);
-        if(dyn->insts[ninst].purge_ymm)
-            PURGE_YMM();
         ip = addr;
         if (reset_n!=-1) {
             dyn->last_ip = 0;
@@ -106,6 +104,8 @@ uintptr_t native_pass(dynarec_native_t* dyn, uintptr_t addr, int alternate, int
             }
             reset_n = -1;
         }
+        if(dyn->insts[ninst].purge_ymm)
+            PURGE_YMM();
         #if STEP > 0
         else if(ninst && (dyn->insts[ninst].pred_sz>1 || (dyn->insts[ninst].pred_sz==1 && dyn->insts[ninst].pred[0]!=ninst-1)))
             dyn->last_ip = 0;   // reset IP if some jump are coming here