diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-06-02 13:56:13 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-06-02 13:56:13 +0200 |
| commit | 06cb3624e2c8994eabd49ddad89a101a755b6885 (patch) | |
| tree | 311c9b82893c80d97247b9c4650fc6fec337374a /src | |
| parent | a1f83418b9f581434b525e5813c40a3d134c3d81 (diff) | |
| download | box64-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.c | 4 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_helper.c | 2 | ||||
| -rw-r--r-- | src/dynarec/dynarec_native_pass.c | 4 |
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 |