about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2025-07-09 11:24:23 +0200
committerptitSeb <sebastien.chev@gmail.com>2025-07-09 11:24:23 +0200
commitefa6ee7275f034bdbd213fbed4ebbf3379855189 (patch)
tree7de43896d280af65ba2d3e5bcfea9a0d48bea36a
parent1ac4cdeae9b6dafdb533087ea6ad8fd63228a72e (diff)
downloadbox64-efa6ee7275f034bdbd213fbed4ebbf3379855189.tar.gz
box64-efa6ee7275f034bdbd213fbed4ebbf3379855189.zip
[ARM64_DYNAREC] Fixed rare sideeffect of 32bits cmpxchg opcode
-rw-r--r--src/dynarec/arm64/dynarec_arm64_0f.c3
-rw-r--r--src/dynarec/arm64/dynarec_arm64_f0.c3
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);