about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2025-02-11 22:52:52 +0100
committerptitSeb <sebastien.chev@gmail.com>2025-02-11 22:52:52 +0100
commit60396f58c0aaa4d5deca5663ecd91077a10048cf (patch)
tree31749db1aca288f334703f52f8c71aba5ef4491a /src
parentee83ef4c010ef3d718a3e1ccaf684a086ffb6da4 (diff)
downloadbox64-60396f58c0aaa4d5deca5663ecd91077a10048cf.tar.gz
box64-60396f58c0aaa4d5deca5663ecd91077a10048cf.zip
[ARM64_DYNAREC] Fixed F0 0F B1 ocpode (emit_cmp32 can only be used once per opcode, because of the df flags handling)
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_f0.c23
1 files changed, 13 insertions, 10 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_f0.c b/src/dynarec/arm64/dynarec_arm64_f0.c
index e0e74535..19ecc0a4 100644
--- a/src/dynarec/arm64/dynarec_arm64_f0.c
+++ b/src/dynarec/arm64/dynarec_arm64_f0.c
@@ -354,15 +354,17 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                                 if(arm64_atomics) {
                                     UFLAG_IF {
                                         MOVxw_REG(x1, xRAX);
-                                        CASALxw(xRAX, gd, wback);
+                                        CASALxw(x1, gd, wback);
                                         SMDMB();
-                                        emit_cmp32(dyn, ninst, rex, x1, xRAX, x3, x4, x5);
+                                        if(!ALIGNED_ATOMICxw) {
+                                            B_MARK_nocond;
+                                        }
                                     } else {
                                         CASALxw(xRAX, gd, wback);
                                         SMDMB();
-                                    }
-                                    if(!ALIGNED_ATOMICxw) {
-                                        B_NEXT_nocond;
+                                        if(!ALIGNED_ATOMICxw) {
+                                            B_NEXT_nocond;
+                                        }
                                     }
                                 } else {
                                     MARKLOCK;
@@ -391,11 +393,12 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                                     STRxw_U12(gd, wback, 0);
                                     SMDMB();
                                 }
-                                if(!ALIGNED_ATOMICxw || !arm64_atomics) {
-                                    MARK;
-                                    // Common part (and fallback for EAX != Ed)
-                                    UFLAG_IF {emit_cmp32(dyn, ninst, rex, xRAX, x1, x3, x4, x5);}
-                                    MOVxw_REG(xRAX, x1);    // upper par of RAX will be erase on 32bits, no mater what
+                                MARK;
+                                // Common part (and fallback for EAX != Ed)
+                                UFLAG_IF {emit_cmp32(dyn, ninst, rex, xRAX, x1, x3, x4, x5); MOVxw_REG(xRAX, x1);}
+                                else {
+                                    if(!ALIGNED_ATOMICxw || !arm64_atomics)
+                                        MOVxw_REG(xRAX, x1);    // upper par of RAX will be erase on 32bits, no mater what
                                 }
                             }
                             break;