diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2025-07-09 11:24:23 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2025-07-09 11:24:23 +0200 |
| commit | efa6ee7275f034bdbd213fbed4ebbf3379855189 (patch) | |
| tree | 7de43896d280af65ba2d3e5bcfea9a0d48bea36a | |
| parent | 1ac4cdeae9b6dafdb533087ea6ad8fd63228a72e (diff) | |
| download | box64-efa6ee7275f034bdbd213fbed4ebbf3379855189.tar.gz box64-efa6ee7275f034bdbd213fbed4ebbf3379855189.zip | |
[ARM64_DYNAREC] Fixed rare sideeffect of 32bits cmpxchg opcode
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_0f.c | 3 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_f0.c | 3 |
2 files changed, 4 insertions, 2 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_0f.c b/src/dynarec/arm64/dynarec_arm64_0f.c index ccff6c02..c8df4f9f 100644 --- a/src/dynarec/arm64/dynarec_arm64_0f.c +++ b/src/dynarec/arm64/dynarec_arm64_0f.c @@ -2079,7 +2079,8 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin CMPSxw_REG(xRAX, ed); } MOVxw_REG(x1, ed); // save value - CSELxw(ed, gd, ed, cEQ); + Bcond(cNE, 4+4); + MOVxw_REG(ed, gd); } else { addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, &unscaled, 0xfff<<(2+rex.w), (1<<(2+rex.w))-1, rex, NULL, 0, 0); LDxw(x1, wback, fixedaddress); diff --git a/src/dynarec/arm64/dynarec_arm64_f0.c b/src/dynarec/arm64/dynarec_arm64_f0.c index 6fcb3df4..7b9632cc 100644 --- a/src/dynarec/arm64/dynarec_arm64_f0.c +++ b/src/dynarec/arm64/dynarec_arm64_f0.c @@ -342,7 +342,8 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin CMPSxw_REG(xRAX, ed); } MOVxw_REG(x1, ed); // save value - CSELxw(ed, gd, ed, cEQ); + Bcond(cNE, 4+4); + MOVxw_REG(ed, gd); MOVxw_REG(xRAX, x1); } else { addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, NULL, 0, 0, rex, LOCK_LOCK, 0, 0); |