about summary refs log tree commit diff stats
path: root/src/dynarec/arm64
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2025-09-16 17:44:27 +0200
committerptitSeb <sebastien.chev@gmail.com>2025-09-16 17:44:27 +0200
commitea48f2b823b253fd4ed61925d5b3ac9ac2d2955e (patch)
tree1e6997434a4d60913f72c3c65e58e92f760fef54 /src/dynarec/arm64
parent85b07f7441e7342e7d4c40166eef3b47c7090745 (diff)
downloadbox64-ea48f2b823b253fd4ed61925d5b3ac9ac2d2955e.tar.gz
box64-ea48f2b823b253fd4ed61925d5b3ac9ac2d2955e.zip
[DYNAREC] Improved Memory Barrier handling for LOCK prefixed opcodes
Diffstat (limited to 'src/dynarec/arm64')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_00.c2
-rw-r--r--src/dynarec/arm64/dynarec_arm64_66.c3
-rw-r--r--src/dynarec/arm64/dynarec_arm64_66f0.c17
-rw-r--r--src/dynarec/arm64/dynarec_arm64_f0.c59
4 files changed, 0 insertions, 81 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_00.c b/src/dynarec/arm64/dynarec_arm64_00.c
index a513c8ee..be128194 100644
--- a/src/dynarec/arm64/dynarec_arm64_00.c
+++ b/src/dynarec/arm64/dynarec_arm64_00.c
@@ -1450,7 +1450,6 @@ 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;
@@ -1499,7 +1498,6 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     STRxw_U12(gd, ed, 0);
                     MARK2;
                 }
-                SMDMB();
                 if(!ALIGNED_ATOMICxw || !cpuext.atomics) {
                     MOVxw_REG(gd, x1);
                 }
diff --git a/src/dynarec/arm64/dynarec_arm64_66.c b/src/dynarec/arm64/dynarec_arm64_66.c
index edbda902..e18b1573 100644
--- a/src/dynarec/arm64/dynarec_arm64_66.c
+++ b/src/dynarec/arm64/dynarec_arm64_66.c
@@ -598,7 +598,6 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 }

                 if(cpuext.atomics) {

                     SWPALH(gd, x1, ed);

-                    SMDMB();

                     if(!ALIGNED_ATOMICH) {

                         B_MARK2_nocond;

                     }

@@ -607,7 +606,6 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     LDAXRH(x1, ed);

                     STLXRH(x3, gd, ed);

                     CBNZx_MARKLOCK(x3);

-                    SMDMB();

                     if(!ALIGNED_ATOMICH) {

                         B_MARK2_nocond;

                     }

@@ -619,7 +617,6 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     STLXRB(x3, gd, ed);

                     CBNZx_MARK(x3);

                     STRH_U12(gd, ed, 0);

-                    SMDMB();

                     MARK2;

                 }

                 BFIz(gd, x1, 0, 16);

diff --git a/src/dynarec/arm64/dynarec_arm64_66f0.c b/src/dynarec/arm64/dynarec_arm64_66f0.c
index ed49e2f8..9516216c 100644
--- a/src/dynarec/arm64/dynarec_arm64_66f0.c
+++ b/src/dynarec/arm64/dynarec_arm64_66f0.c
@@ -74,7 +74,6 @@ 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;
 
@@ -104,7 +103,6 @@ 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;
 
@@ -168,7 +166,6 @@ uintptr_t dynarec64_66F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
                         }
                     }
                     MARK;
-                    SMDMB();
                     // Common part (and fallback for EAX != Ed)
                     UFLAG_IF {emit_cmp16(dyn, ninst, x6, x1, x3, x4, x5);}
                     BFIx(xRAX, x1, 0, 16);
@@ -196,7 +193,6 @@ 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);
@@ -228,7 +224,6 @@ 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;
 
@@ -259,7 +254,6 @@ 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;
 
@@ -308,7 +302,6 @@ uintptr_t dynarec64_66F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
                             STLXRH(x3, x4, wback);
                             CBNZx_MARKLOCK(x3);
                         }
-                        SMDMB();
                         if(!ALIGNED_ATOMICH) {
                             B_MARK2_nocond;
                             MARK;   // unaligned! also, not enough
@@ -320,7 +313,6 @@ uintptr_t dynarec64_66F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
                             STLXRB(x3, x4, wback);
                             CBNZx_MARK(x3);
                             STRH_U12(x4, wback, 0);    // put the whole value
-                            SMDMB();
                         }
                         MARK2;
                         UFLAG_IF {
@@ -361,7 +353,6 @@ 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
@@ -384,7 +375,6 @@ 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
@@ -407,7 +397,6 @@ 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
@@ -447,7 +436,6 @@ 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;
@@ -489,7 +477,6 @@ 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_MARK2_nocond;
                             MARK;   // unaligned! also, not enough
@@ -501,7 +488,6 @@ uintptr_t dynarec64_66F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
                             STLXRB(x3, x4, wback);
                             CBNZx_MARK(x3);
                             STRH_U12(x4, wback, 0);    // put the whole value
-                            SMDMB();
                         }
                         MARK2;
                         UFLAG_IF {
@@ -539,7 +525,6 @@ 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;
@@ -589,7 +574,6 @@ 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
@@ -617,7 +601,6 @@ 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 7b9632cc..224233c8 100644
--- a/src/dynarec/arm64/dynarec_arm64_f0.c
+++ b/src/dynarec/arm64/dynarec_arm64_f0.c
@@ -86,7 +86,6 @@ 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:
@@ -115,14 +114,12 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     } else {
                         STADDLxw(gd, wback);
                     }
-                    SMDMB();
                 } else {
                     MARKLOCK;
                     LDAXRxw(x1, wback);
                     ADDxw_REG(x4, x1, gd);
                     STLXRxw(x3, x4, wback);
                     CBNZx_MARKLOCK(x3);
-                    SMDMB();
                 }
                 if(!ALIGNED_ATOMICxw) {
                     B_MARK2_nocond;
@@ -135,7 +132,6 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     STLXRB(x3, x4, wback);
                     CBNZx_MARK(x3);
                     STRxw_U12(x4, wback, 0);    // put the whole value
-                    SMDMB();
                 }
                 MARK2;
                 UFLAG_IF {
@@ -175,7 +171,6 @@ 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:
@@ -200,7 +195,6 @@ 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;
 
@@ -266,7 +260,6 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                             STLXRB(x4, ed, wback);
                             CBNZw_MARKLOCK(x4);
                         }
-                        SMDMB();
                     }
                     break;
                 case 0xB0:
@@ -319,7 +312,6 @@ 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:
@@ -362,13 +354,11 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                                     UFLAG_IF {
                                         MOVxw_REG(x1, xRAX);
                                         CASALxw(x1, gd, wback);
-                                        SMDMB();
                                         if(!ALIGNED_ATOMICxw) {
                                             B_MARK_nocond;
                                         }
                                     } else {
                                         CASALxw(xRAX, gd, wback);
-                                        SMDMB();
                                         if(!ALIGNED_ATOMICxw) {
                                             B_NEXT_nocond;
                                         }
@@ -401,7 +391,6 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                                     STRxw_U12(gd, wback, 0);
                                 }
                                 MARK;
-                                SMDMB();
                                 // Common part (and fallback for EAX != Ed)
                                 UFLAG_IF {emit_cmp32(dyn, ninst, rex, xRAX, x1, x3, x4, x5); MOVxw_REG(xRAX, x1);}
                                 else {
@@ -468,7 +457,6 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                             STLXRB(x4, ed, wback);
                             CBNZw_MARKLOCK(x4);
                         }
-                        SMDMB();
                     }
                     break;
 
@@ -550,7 +538,6 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                                 STLXRB(x4, ed, wback);
                                 CBNZw_MARKLOCK(x4);
                             }
-                            SMDMB();
                         }
                         break;
                     case 6:
@@ -593,7 +580,6 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                                 STLXRB(x4, ed, wback);
                                 CBNZw_MARKLOCK(x4);
                             }
-                            SMDMB();
                         }
                         break;
                     case 7:
@@ -638,7 +624,6 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                                 STLXRB(x4, ed, wback);
                                 CBNZw_MARKLOCK(x4);
                             }
-                            SMDMB();
                         }
                         break;
                     default:
@@ -698,7 +683,6 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                             STLXRB(x4, ed, wback);
                             CBNZw_MARKLOCK(x4);
                         }
-                        SMDMB();
                     }
                     break;
 
@@ -722,11 +706,9 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                                     UFLAG_IF {
                                         MOVxw_REG(x3, gd);
                                         LDADDALB(x3, gd, wback);
-                                        SMDMB();
                                         emit_add8(dyn, ninst, x3, gd, x4, x5);
                                     } else {
                                         LDADDALB(gd, gd, wback);
-                                        SMDMB();
                                     }
                                     GBBACK;
                                 } else {
@@ -735,7 +717,6 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                                     ADDw_REG(x4, x1, gd);
                                     STLXRB(x3, x4, wback);
                                     CBNZx_MARKLOCK(x3);
-                                    SMDMB();
                                     IFX(X_ALL|X_PEND) {
                                         MOVxw_REG(x2, x1);
                                         emit_add8(dyn, ninst, x2, gd, x3, x4);
@@ -786,7 +767,6 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                                     STLXRxw(x3, x4, wback);
                                     CBNZx_MARKLOCK(x3);
                                 }
-                                SMDMB();
                                 if(!ALIGNED_ATOMICxw) {
                                     UFLAG_IF {
                                         B_MARK2_nocond;
@@ -803,7 +783,6 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                                     STLXRB(x3, x4, wback);
                                     CBNZx_MARK(x3);
                                     STRxw_U12(x4, wback, 0);
-                                    SMDMB();
                                 }
                                 MARK2;
                                 UFLAG_IF {
@@ -913,7 +892,6 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                             }
                         }
                         MARK3;
-                        SMDMB();
                         UFLAG_IF {
                             IFNATIVE(NF_EQ) {} else {BFIw(xFlags, x1, F_ZF, 1);}
                         }
@@ -952,7 +930,6 @@ 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:
@@ -971,7 +948,6 @@ 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 0x20:
@@ -1001,7 +977,6 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     emit_and8(dyn, ninst, x1, gd, x3, x4);
                     STLXRB(x3, x1, wback);
                     CBNZx_MARKLOCK(x3);
-                    SMDMB();
                 }
             }
             break;
@@ -1029,7 +1004,6 @@ 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;
@@ -1068,7 +1042,6 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     STLXRxw(x3, x4, wback);
                     CBNZx_MARKLOCK(x3);
                 }
-                SMDMB();
                 if(!ALIGNED_ATOMICxw) {
                     UFLAG_IF {
                         B_MARK2_nocond;
@@ -1084,7 +1057,6 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     STLXRB(x3, x4, wback);
                     CBNZx_MARK(x3);
                     STRxw_U12(x4, wback, 0);    // put the whole value
-                    SMDMB();
                 }
                 UFLAG_IF {
                     MARK2;
@@ -1126,7 +1098,6 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     STLXRxw(x3, x4, wback);
                     CBNZx_MARKLOCK(x3);
                 }
-                SMDMB();
                 if(!ALIGNED_ATOMICxw) {
                     B_MARK2_nocond;
                     MARK;   // unaligned! also, not enough
@@ -1138,7 +1109,6 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     STLXRB(x3, x4, wback);
                     CBNZx_MARK(x3);
                     STRxw_U12(x4, wback, 0);    // put the whole value
-                    SMDMB();
                 }
                 MARK2;
                 UFLAG_IF {
@@ -1182,7 +1152,6 @@ 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
@@ -1213,7 +1182,6 @@ 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
@@ -1236,7 +1204,6 @@ 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");
@@ -1258,7 +1225,6 @@ 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");
@@ -1288,7 +1254,6 @@ 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
@@ -1319,7 +1284,6 @@ 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
@@ -1350,7 +1314,6 @@ 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
@@ -1410,7 +1373,6 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                             } else {
                                 STADDLxw(x5, wback);
                             }
-                            SMDMB();
                         } else {
                             MARKLOCK;
                             LDAXRxw(x1, wback);
@@ -1423,7 +1385,6 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                             }
                             STLXRxw(x3, x4, wback);
                             CBNZx_MARKLOCK(x3);
-                            SMDMB();
                         }
                         if(!ALIGNED_ATOMICxw) {
                             B_MARK2_nocond;
@@ -1442,7 +1403,6 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                             STLXRB(x3, x4, wback);
                             CBNZx_MARK(x3);
                             STRxw_U12(x4, wback, 0);    // put the whole value
-                            SMDMB();
                         }
                         MARK2;
                         UFLAG_IF {
@@ -1483,7 +1443,6 @@ 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;
@@ -1505,7 +1464,6 @@ 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
@@ -1526,7 +1484,6 @@ 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
@@ -1556,7 +1513,6 @@ 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
@@ -1595,7 +1551,6 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                             } else {
                                 STADDLxw(x5, wback);
                             }
-                            SMDMB();
                         } else {
                             MARKLOCK;
                             LDAXRxw(x1, wback);
@@ -1608,7 +1563,6 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                             }
                             STLXRxw(x3, x4, wback);
                             CBNZx_MARKLOCK(x3);
-                            SMDMB();
                         }
                         if(!ALIGNED_ATOMICxw) {
                             UFLAG_IF {
@@ -1631,7 +1585,6 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                             STLXRB(x3, x4, wback);
                             CBNZx_MARK(x3);
                             STRxw_U12(x4, wback, 0);    // put the whole value
-                            SMDMB();
                         }
                         UFLAG_IF {
                             MARK2;
@@ -1669,7 +1622,6 @@ 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
@@ -1721,7 +1673,6 @@ 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:
@@ -1771,7 +1722,6 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     STRxw_U12(gd, ed, 0);
                     MARK2;
                 }
-                SMDMB();
                 if(!ALIGNED_ATOMICxw || !cpuext.atomics) {
                     MOVxw_REG(gd, x1);
                 }
@@ -1785,7 +1735,6 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 case 1:
                     INST_NAME("LOCK TEST Eb, Ib");
                     SETFLAGS(X_ALL, SF_SET_PENDING);
-                    SMDMB();
                     GETEB(x1, 1);
                     u8 = F8;
                     emit_test8c(dyn, ninst, x1, u8, x3, x4, x5);
@@ -1808,7 +1757,6 @@ 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:
@@ -1836,7 +1784,6 @@ 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;
                 default:
@@ -1872,7 +1819,6 @@ 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
@@ -1899,7 +1845,6 @@ 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:
@@ -1942,7 +1887,6 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                             STLXRxw(x3, x4, wback);
                             CBNZx_MARKLOCK(x3);
                         }
-                        SMDMB();
                         if(!ALIGNED_ATOMICxw) {
                             UFLAG_IF {
                                 B_MARK2_nocond;
@@ -1958,7 +1902,6 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                             STLXRB(x3, x4, wback);
                             CBNZw_MARK(x3);
                             STRxw_U12(x4, wback, 0);
-                            SMDMB();
                         }
                         UFLAG_IF {
                             MARK2;
@@ -1998,7 +1941,6 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                             STLXRxw(x3, x4, wback);
                             CBNZx_MARKLOCK(x3);
                         }
-                        SMDMB();
                         if(!ALIGNED_ATOMICxw) {
                             UFLAG_IF {
                                 B_MARK2_nocond;
@@ -2014,7 +1956,6 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                             STLXRB(x3, x4, wback);
                             CBNZw_MARK(x3);
                             STRxw_U12(x4, wback, 0);
-                            SMDMB();
                         }
                         UFLAG_IF {
                             MARK2;