diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-06-09 17:12:06 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-06-09 17:12:06 +0200 |
| commit | b25d8db9949ed5d16408a06fe0906f424e53ae85 (patch) | |
| tree | 972e00c98ba6586ed999b830988b6024a483b164 /src | |
| parent | 989ed958918f4c3ba4d30b35b9c3433322c53573 (diff) | |
| download | box64-b25d8db9949ed5d16408a06fe0906f424e53ae85.tar.gz box64-b25d8db9949ed5d16408a06fe0906f424e53ae85.zip | |
[ARM64_DYNAREC] Fixed an issue when not purging Ymm0 on internal jump with less Ymm0
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_helper.c | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_helper.c b/src/dynarec/arm64/dynarec_arm64_helper.c index 42f09b21..084689ec 100644 --- a/src/dynarec/arm64/dynarec_arm64_helper.c +++ b/src/dynarec/arm64/dynarec_arm64_helper.c @@ -2269,16 +2269,16 @@ static void fpuCacheTransform(dynarec_arm_t* dyn, int ninst, int s1, int s2, int } // ymm0 s3_top = 1; - if(dyn->ymm_zero && dyn->insts[i2].purge_ymm) { + uint16_t to_purge = dyn->ymm_zero&~dyn->insts[i2].ymm0_in; + if(dyn->ymm_zero && (dyn->insts[i2].purge_ymm|to_purge)) { for(int i=0; i<16; ++i) - if(dyn->insts[i2].purge_ymm&(1<<i)) - if(is_avx_zero(dyn, ninst, i)) { - if(s3_top) { - ADDx_U12(s3, xEmu,offsetof(x64emu_t, ymm[0])); - s3_top = 0; - } - STPx_S7_offset(xZR, xZR, s3, i*16); + if(is_avx_zero(dyn, ninst, i) && (dyn->insts[i2].purge_ymm|to_purge)&(1<<i)) { + if(s3_top) { + ADDx_U12(s3, xEmu,offsetof(x64emu_t, ymm[0])); + s3_top = 0; } + STPx_S7_offset(xZR, xZR, s3, i*16); + } } if(stack_cnt != cache_i2.stack) { MESSAGE(LOG_DUMP, "\t - adjust stack count %d -> %d -\n", stack_cnt, cache_i2.stack); |