about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-02-27 15:40:37 +0100
committerptitSeb <sebastien.chev@gmail.com>2024-02-27 15:40:47 +0100
commit20d675ea489bf0bc540cf73be16988475ea580e0 (patch)
tree5dd1a57a4b2567ac22576cdc3dba06f4bc8bc427 /src
parent900dbc2a479ec703eee4d63c3ec7561d6995daf2 (diff)
downloadbox64-20d675ea489bf0bc540cf73be16988475ea580e0.tar.gz
box64-20d675ea489bf0bc540cf73be16988475ea580e0.zip
[ARM64_DYNAREC] copied code for F0 87 to 87 opcode, as they should behavee the same way
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_00.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_00.c b/src/dynarec/arm64/dynarec_arm64_00.c
index 84eafed1..8bd8788a 100644
--- a/src/dynarec/arm64/dynarec_arm64_00.c
+++ b/src/dynarec/arm64/dynarec_arm64_00.c
@@ -1172,12 +1172,17 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 GETGD;
                 addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, NULL, 0, 0, rex, LOCK_LOCK, 0, 0);
                 if(!ALIGNED_ATOMICxw) {
-                    TSTx_mask(ed, 1, 0, 1+rex.w);    // mask=3 or 7
-                    B_MARK(cNE);
+                    if(arm64_uscat) {
+                        ANDx_mask(x1, ed, 1, 0, 3);  // mask = F
+                        CMPSw_U12(x1, 16-(1<<(2+rex.w)));
+                        B_MARK(cGT);
+                    } else {
+                        TSTx_mask(ed, 1, 0, 1+rex.w);    // mask=3 or 7
+                        B_MARK(cNE);
+                    }
                 }
                 if(arm64_atomics) {
                     SWPALxw(gd, gd, ed);
-                    SMDMB();
                     if(!ALIGNED_ATOMICxw) {
                         B_NEXT_nocond;
                     }
@@ -1186,7 +1191,6 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     LDAXRxw(x1, ed);
                     STLXRxw(x3, gd, ed);
                     CBNZx_MARKLOCK(x3);
-                    SMDMB();
                     if(!ALIGNED_ATOMICxw) {
                         B_MARK2_nocond;
                     }
@@ -1198,9 +1202,9 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     STLXRB(x3, gd, ed);
                     CBNZx_MARK(x3);
                     STRxw_U12(gd, ed, 0);
-                    SMDMB();
                     MARK2;
                 }
+                SMDMB();
                 if(!ALIGNED_ATOMICxw || !arm64_atomics) {
                     MOVxw_REG(gd, x1);
                 }