about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2023-12-02 21:44:35 +0100
committerptitSeb <sebastien.chev@gmail.com>2023-12-02 21:44:35 +0100
commit40a81173f395ff3f7da28e5034a09b248dc97fb4 (patch)
tree2f16fec9d068b987ad210e807080eb27a0b787e0 /src
parent19a66086195dc97ca316af78258653144eb19695 (diff)
downloadbox64-40a81173f395ff3f7da28e5034a09b248dc97fb4.tar.gz
box64-40a81173f395ff3f7da28e5034a09b248dc97fb4.zip
[ARM64_DYNAREC] Restaured Memory Barrier on LOCK operation, and disable the use of Atomic extension for now (there is an issue somewhere)
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_00.c3
-rw-r--r--src/dynarec/arm64/dynarec_arm64_66.c1
-rw-r--r--src/dynarec/arm64/dynarec_arm64_66f0.c14
-rw-r--r--src/dynarec/arm64/dynarec_arm64_f0.c52
-rw-r--r--src/main.c4
5 files changed, 66 insertions, 8 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_00.c b/src/dynarec/arm64/dynarec_arm64_00.c
index 0044b080..d5e998c6 100644
--- a/src/dynarec/arm64/dynarec_arm64_00.c
+++ b/src/dynarec/arm64/dynarec_arm64_00.c
@@ -1078,6 +1078,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     STLXRB(x3, x4, ed);
                     CBNZx_MARKLOCK(x3);
                 }
+                SMDMB();
             }
             BFIx(gb1, x1, gb2, 8);
             break;
@@ -1099,6 +1100,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 }
                 if(arm64_atomics) {
                     SWPALxw(gd, gd, ed);
+                    SMDMB();
                     if(!ALIGNED_ATOMICxw) {
                         B_NEXT_nocond;
                     }
@@ -1107,6 +1109,7 @@ 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;
                     }
diff --git a/src/dynarec/arm64/dynarec_arm64_66.c b/src/dynarec/arm64/dynarec_arm64_66.c
index a433e82a..bb4a757e 100644
--- a/src/dynarec/arm64/dynarec_arm64_66.c
+++ b/src/dynarec/arm64/dynarec_arm64_66.c
@@ -591,7 +591,6 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
             } else {

                 GETGD;

                 addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, NULL, 0, 0, rex, LOCK_LOCK, 0, 0);

-                SMDMB();

                 TSTx_mask(ed, 1, 0, 0);    // mask=1

                 B_MARK(cNE);

                 MARKLOCK;

diff --git a/src/dynarec/arm64/dynarec_arm64_66f0.c b/src/dynarec/arm64/dynarec_arm64_66f0.c
index 5a4cd4b9..f26a17c3 100644
--- a/src/dynarec/arm64/dynarec_arm64_66f0.c
+++ b/src/dynarec/arm64/dynarec_arm64_66f0.c
@@ -74,6 +74,7 @@ uintptr_t dynarec64_66F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
                     STLXRH(x3, x1, wback);
                     CBNZx_MARKLOCK(x3);
                 }
+                SMDMB();
             }
             break;
 
@@ -126,9 +127,9 @@ uintptr_t dynarec64_66F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
                             STLXRB(x4, gd, wback);
                             CBNZx_MARK3(x4);
                             STRH_U12(gd, wback, 0);
-                            SMDMB();
                         }
                     }
+                    SMDMB();
                     MARK;
                     // Common part (and fallback for EAX != Ed)
                     UFLAG_IF {emit_cmp16(dyn, ninst, x6, x1, x3, x4, x5);}
@@ -157,6 +158,7 @@ uintptr_t dynarec64_66F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
                             STLXRH(x3, x4, wback);
                             CBNZx_MARKLOCK(x3);
                         }
+                        SMDMB();
                         IFX(X_ALL|X_PEND) {
                             MOVxw_REG(x2, x1);
                             emit_add16(dyn, ninst, x2, x5, x3, x4);
@@ -187,6 +189,7 @@ uintptr_t dynarec64_66F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
                 emit_adc16(dyn, ninst, x1, x5, x3, x4);
                 STLXRH(x3, x1, wback);
                 CBNZx_MARKLOCK(x3);
+                SMDMB();
             }
             break;
         case 0x81:
@@ -227,6 +230,7 @@ uintptr_t dynarec64_66F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
                             STLXRH(x3, x1, wback);
                             CBNZx_MARKLOCK(x3);
                         }
+                        SMDMB();
                         if(!ALIGNED_ATOMICH) {
                             B_NEXT_nocond;
                             MARK;   // unaligned! also, not enough
@@ -269,6 +273,7 @@ uintptr_t dynarec64_66F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
                             STLXRH(x3, x1, wback);
                             CBNZx_MARKLOCK(x3);
                         }
+                        SMDMB();
                     }
                     break;
                 case 2: //ADC
@@ -291,6 +296,7 @@ uintptr_t dynarec64_66F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
                         emit_adc16(dyn, ninst, x1, x5, x3, x4);
                         STLXRH(x3, x1, wback);
                         CBNZx_MARKLOCK(x3);
+                        SMDMB();
                     }
                     break;
                 case 3: //SBB
@@ -313,6 +319,7 @@ uintptr_t dynarec64_66F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
                         emit_sbb16(dyn, ninst, x1, x5, x3, x4);
                         STLXRH(x3, x1, wback);
                         CBNZx_MARKLOCK(x3);
+                        SMDMB();
                     }
                     break;
                 case 4: //AND
@@ -344,6 +351,7 @@ uintptr_t dynarec64_66F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
                             emit_and16(dyn, ninst, x1, x5, x3, x4);
                             STLXRH(x3, x1, wback);
                             CBNZx_MARKLOCK(x3);
+                            SMDMB();
                         }
                     }
                     break;
@@ -380,6 +388,7 @@ uintptr_t dynarec64_66F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
                             STLXRH(x3, x1, wback);
                             CBNZx_MARKLOCK(x3);
                         }
+                        SMDMB();
                         if(!ALIGNED_ATOMICH) {
                             B_NEXT_nocond;
                             MARK;   // unaligned! also, not enough
@@ -421,6 +430,7 @@ uintptr_t dynarec64_66F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
                             emit_xor16(dyn, ninst, x1, x5, x3, x4);
                             STLXRH(x3, x1, wback);
                             CBNZx_MARKLOCK(x3);
+                            SMDMB();
                         }
                     }
                     break;
@@ -470,6 +480,7 @@ uintptr_t dynarec64_66F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
                                 STLXRH(x3, x1, wback);
                                 CBNZx_MARKLOCK(x3);
                             }
+                            SMDMB();
                         }
                         break;
                     case 1: //DEC Ew
@@ -497,6 +508,7 @@ uintptr_t dynarec64_66F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
                                 STLXRH(x3, x1, wback);
                                 CBNZx_MARKLOCK(x3);
                             }
+                            SMDMB();
                         }
                         break;
                     default:
diff --git a/src/dynarec/arm64/dynarec_arm64_f0.c b/src/dynarec/arm64/dynarec_arm64_f0.c
index 9dc48f12..033b1f81 100644
--- a/src/dynarec/arm64/dynarec_arm64_f0.c
+++ b/src/dynarec/arm64/dynarec_arm64_f0.c
@@ -83,6 +83,7 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     STLXRB(x4, x1, wback);
                     CBNZx_MARKLOCK(x4);
                 }
+                SMDMB();
             }
             break;
         case 0x01:
@@ -109,6 +110,7 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     STLXRxw(x3, x1, wback);
                     CBNZx_MARKLOCK(x3);
                 }
+                SMDMB();
             }
             break;
 
@@ -143,6 +145,7 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     STLXRB(x4, x1, wback);
                     CBNZx_MARKLOCK(x4);
                 }
+                SMDMB();
             }
             break;
         case 0x09:
@@ -167,6 +170,7 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     STLXRxw(x3, x1, wback);
                     CBNZx_MARKLOCK(x3);
                 }
+                SMDMB();
             }
             break;
 
@@ -215,6 +219,7 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                         ORRw_REG(ed, ed, x4);
                         STLXRB(x4, ed, wback);
                         CBNZw_MARKLOCK(x4);
+                        SMDMB();
                     }
                     break;
                 case 0xB0:
@@ -269,6 +274,7 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                                     UFLAG_IF {emit_cmp8(dyn, ninst, x6, x2, x3, x4, x5);}
                                     BFIx(xRAX, x2, 0, 8);
                                 }
+                                SMDMB();
                             }
                             break;
                         default:
@@ -303,11 +309,12 @@ 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(x1, gd, wback);
-                                        emit_cmp32(dyn, ninst, rex, xRAX, x1, x3, x4, x5);
-                                        MOVxw_REG(xRAX, x1);
+                                        CASALxw(xRAX, gd, wback);
+                                        SMDMB();
+                                        emit_cmp32(dyn, ninst, rex, x1, xRAX, x3, x4, x5);
                                     } else {
                                         CASALxw(xRAX, gd, wback);
+                                        SMDMB();
                                     }
                                     if(!ALIGNED_ATOMICxw) {
                                         B_NEXT_nocond;
@@ -320,6 +327,7 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                                     // EAX == Ed
                                     STLXRxw(x4, gd, wback);
                                     CBNZx_MARKLOCK(x4);
+                                    SMDMB();
                                     // done
                                     if(!ALIGNED_ATOMICxw) {
                                         B_MARK_nocond;
@@ -392,6 +400,7 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                         BICw_REG(ed, ed, x4);
                         STLXRB(x4, ed, wback);
                         CBNZw_MARKLOCK(x4);
+                        SMDMB();
                     }
                     break;
 
@@ -452,6 +461,7 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                             BFIw(ed, x5, u8&7, 1);
                             STLXRB(x4, ed, wback);
                             CBNZw_MARKLOCK(x4);
+                            SMDMB();
                         }
                         break;
                     case 6:
@@ -480,6 +490,7 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                             BFCw(ed, u8&7, 1);
                             STLXRB(x4, ed, wback);
                             CBNZw_MARKLOCK(x4);
+                            SMDMB();
                         }
                         break;
                     case 7:
@@ -509,6 +520,7 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                             EORw_REG_LSL(ed, ed, x5, u8&7);
                             STLXRB(x4, ed, wback);
                             CBNZw_MARKLOCK(x4);
+                            SMDMB();
                         }
                         break;
                     default:
@@ -539,9 +551,11 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                                     UFLAG_IF {
                                         MOVxw_REG(x3, gd);
                                         LDADDALxw(x3, gd, wback);
+                                        SMDMB();
                                         emit_add32(dyn, ninst, rex, x3, gd, x4, x5);
                                     } else {
                                         LDADDALxw(gd, gd, wback);
+                                        SMDMB();
                                     }
                                     if(!ALIGNED_ATOMICxw) {
                                         B_NEXT_nocond;
@@ -552,6 +566,7 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                                     ADDxw_REG(x4, x1, gd);
                                     STLXRxw(x3, x4, wback);
                                     CBNZx_MARKLOCK(x3);
+                                    SMDMB();
                                     if(!ALIGNED_ATOMICxw) {
                                         B_MARK2_nocond;
                                     }
@@ -625,6 +640,7 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                                 }
                             }
                             MARK3;
+                            SMDMB();
                             UFLAG_IF {
                                 BFIw(xFlags, x1, F_ZF, 1);
                             }
@@ -663,6 +679,7 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 emit_adc8(dyn, ninst, x1, x2, x4, x5);
                 STLXRB(x4, x1, wback);
                 CBNZx_MARKLOCK(x4);
+                SMDMB();
             }
             break;
         case 0x11:
@@ -681,6 +698,7 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 emit_adc32(dyn, ninst, rex, x1, gd, x4, x5);
                 STLXRxw(x4, x1, wback);
                 CBNZx_MARKLOCK(x4);
+                SMDMB();
             }
             break;
         case 0x21:
@@ -707,6 +725,7 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     emit_and32(dyn, ninst, rex, x1, gd, x3, x4);
                     STLXRxw(x3, x1, wback);
                     CBNZx_MARKLOCK(x3);
+                    SMDMB();
                 }
             }
             break;
@@ -735,6 +754,7 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     emit_sub32(dyn, ninst, rex, x1, gd, x3, x4);
                     STLXRxw(x3, x1, wback);
                     CBNZx_MARKLOCK(x3);
+                    SMDMB();
                 }
             }
             break;
@@ -774,6 +794,7 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                             STLXRB(x3, x1, wback);
                             CBNZx_MARKLOCK(x3);
                         }
+                        SMDMB();
                     }
                     break;
                 case 1: //OR
@@ -804,6 +825,7 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                             STLXRB(x3, x1, wback);
                             CBNZx_MARKLOCK(x3);
                         }
+                        SMDMB();
                     }
                     break;
                 case 2: //ADC
@@ -826,6 +848,7 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                         STLXRB(x3, x1, wback);
                         CBNZx_MARKLOCK(x3);
                     }
+                    SMDMB();
                     break;
                 case 3: //SBB
                     INST_NAME("SBB Eb, Ib");
@@ -847,6 +870,7 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                         STLXRB(x3, x1, wback);
                         CBNZx_MARKLOCK(x3);
                     }
+                    SMDMB();
                     break;
                 case 4: //AND
                     INST_NAME("AND Eb, Ib");
@@ -876,6 +900,7 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                             STLXRB(x3, x1, wback);
                             CBNZx_MARKLOCK(x3);
                         }
+                        SMDMB();
                     }
                     break;
                 case 5: //SUB
@@ -906,6 +931,7 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                             STLXRB(x3, x1, wback);
                             CBNZx_MARKLOCK(x3);
                         }
+                        SMDMB();
                     }
                     break;
                 case 6: //XOR
@@ -936,6 +962,7 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                             STLXRB(x3, x1, wback);
                             CBNZx_MARKLOCK(x3);
                         }
+                        SMDMB();
                     }
                     break;
                 case 7: //CMP
@@ -981,9 +1008,11 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                             MOV64xw(x3, i64);
                             UFLAG_IF {
                                 LDADDALxw(x3, x1, wback);
+                                SMDMB();
                                 emit_add32(dyn, ninst, rex, x1, x3, x4, x5);
                             } else {
                                 STADDLxw(x3, wback);
+                                SMDMB();
                             }
                         } else {
                             MARKLOCK;
@@ -991,6 +1020,7 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                             emit_add32c(dyn, ninst, rex, x1, i64, x3, x4, x5);
                             STLXRxw(x3, x1, wback);
                             CBNZx_MARKLOCK(x3);
+                            SMDMB();
                         }
                         if(!ALIGNED_ATOMICxw) {
                             B_NEXT_nocond;
@@ -1032,6 +1062,7 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                             STLXRxw(x3, x1, wback);
                             CBNZx_MARKLOCK(x3);
                         }
+                        SMDMB();
                     }
                     break;
                 case 2: //ADC
@@ -1052,6 +1083,7 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                         emit_adc32(dyn, ninst, rex, x1, x5, x3, x4);
                         STLXRxw(x3, x1, wback);
                         CBNZx_MARKLOCK(x3);
+                        SMDMB();
                     }
                     break;
                 case 3: //SBB
@@ -1072,6 +1104,7 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                         emit_sbb32(dyn, ninst, rex, x1, x5, x3, x4);
                         STLXRxw(x3, x1, wback);
                         CBNZx_MARKLOCK(x3);
+                        SMDMB();
                     }
                     break;
                 case 4: //AND
@@ -1102,6 +1135,7 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                             STLXRxw(x3, x1, wback);
                             CBNZx_MARKLOCK(x3);
                         }
+                        SMDMB();
                     }
                     break;
                 case 5: //SUB
@@ -1123,10 +1157,12 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                             MOV64xw(x5, -i64);
                             UFLAG_IF {
                                 LDADDALxw(x5, x1, wback);
+                                SMDMB();
                                 NEGxw_REG(x5, x5);
                                 emit_sub32(dyn, ninst, rex, x1, x5, x3, x4);
                             } else {
                                 STADDLxw(x5, wback);
+                                SMDMB();
                             }
                         } else {
                             MARKLOCK;
@@ -1134,6 +1170,7 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                             emit_sub32c(dyn, ninst, rex, x1, i64, x3, x4, x5);
                             STLXRxw(x3, x1, wback);
                             CBNZx_MARKLOCK(x3);
+                            SMDMB();
                         }
                         if(!ALIGNED_ATOMICxw) {
                             B_NEXT_nocond;
@@ -1175,6 +1212,7 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                             STLXRxw(x3, x1, wback);
                             CBNZx_MARKLOCK(x3);
                         }
+                        SMDMB();
                     }
                     break;
                 case 7: //CMP
@@ -1226,6 +1264,7 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     CBNZx_MARKLOCK(x3);
                 }
                 BFIx(gb1, x1, gb2, 8);
+                SMDMB();
             }
             break;
         case 0x87:
@@ -1265,9 +1304,9 @@ uintptr_t dynarec64_F0(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);
                 }
@@ -1300,6 +1339,7 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                         MVNw_REG(x1, x1);
                         STLXRB(x3, x1, wback);
                         CBNZx_MARKLOCK(x3);
+                        SMDMB();
                     }
                     break;
                 default:
@@ -1335,6 +1375,7 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                             STLXRB(x3, x1, wback);
                             CBNZx_MARKLOCK(x3);
                         }
+                        SMDMB();
                     }
                     break;
                 case 1: //DEC Eb
@@ -1361,6 +1402,7 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                             STLXRB(x3, x1, wback);
                             CBNZx_MARKLOCK(x3);
                         }
+                        SMDMB();
                     }
                     break;
                 default:
@@ -1398,6 +1440,7 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                             STLXRxw(x3, x1, wback);
                             CBNZx_MARKLOCK(x3);
                         }
+                        SMDMB();
                         if(!ALIGNED_ATOMICxw) {
                             B_NEXT_nocond;
                             MARK;
@@ -1439,6 +1482,7 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                             STLXRxw(x3, x1, wback);
                             CBNZx_MARKLOCK(x3);
                         }
+                        SMDMB();
                         if(!ALIGNED_ATOMICxw) {
                             B_NEXT_nocond;
                             MARK;
diff --git a/src/main.c b/src/main.c
index 5b4312f2..ce34ccb9 100644
--- a/src/main.c
+++ b/src/main.c
@@ -377,8 +377,8 @@ HWCAP2_ECV
         arm64_pmull = 1;
     if(hwcap&HWCAP_AES)
         arm64_aes = 1;
-    if(hwcap&HWCAP_ATOMICS)
-        arm64_atomics = 1;
+    /*if(hwcap&HWCAP_ATOMICS)
+        arm64_atomics = 1;*/
     #ifdef HWCAP_SHA1
     if(hwcap&HWCAP_SHA1)
         arm64_sha1 = 1;