about summary refs log tree commit diff stats
path: root/src
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
parent85b07f7441e7342e7d4c40166eef3b47c7090745 (diff)
downloadbox64-ea48f2b823b253fd4ed61925d5b3ac9ac2d2955e.tar.gz
box64-ea48f2b823b253fd4ed61925d5b3ac9ac2d2955e.zip
[DYNAREC] Improved Memory Barrier handling for LOCK prefixed opcodes
Diffstat (limited to 'src')
-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
-rw-r--r--src/dynarec/dynarec_helper.h8
-rw-r--r--src/dynarec/dynarec_native_pass.c4
-rw-r--r--src/dynarec/la64/dynarec_la64_00.c3
-rw-r--r--src/dynarec/la64/dynarec_la64_66f0.c2
-rw-r--r--src/dynarec/la64/dynarec_la64_f0.c27
-rw-r--r--src/dynarec/rv64/dynarec_rv64_00_2.c2
-rw-r--r--src/dynarec/rv64/dynarec_rv64_66.c2
-rw-r--r--src/dynarec/rv64/dynarec_rv64_66f0.c3
-rw-r--r--src/dynarec/rv64/dynarec_rv64_f0.c46
13 files changed, 6 insertions, 172 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;
diff --git a/src/dynarec/dynarec_helper.h b/src/dynarec/dynarec_helper.h
index 21c0fb5a..a1d09093 100644
--- a/src/dynarec/dynarec_helper.h
+++ b/src/dynarec/dynarec_helper.h
@@ -49,10 +49,10 @@
         dyn->insts[ninst].will_write = 1;                        \

     } while (0)

 

-#define SMWRITELOCK(lock)              \

-    do {                               \

-        dyn->insts[ninst].lock = lock; \

-        SMWRITE();                     \

+#define SMWRITELOCK(lock)                   \

+    do {                                    \

+        if(lock) dyn->insts[ninst].lock = 1;\

+        SMWRITE();                          \

     } while (0)

 

 #define SMWRITE2()                                       \

diff --git a/src/dynarec/dynarec_native_pass.c b/src/dynarec/dynarec_native_pass.c
index 3d0a6e7b..7463e6d6 100644
--- a/src/dynarec/dynarec_native_pass.c
+++ b/src/dynarec/dynarec_native_pass.c
@@ -198,8 +198,8 @@ uintptr_t native_pass(dynarec_native_t* dyn, uintptr_t addr, int alternate, int
         INST_EPILOG;
 
         #if STEP > 1
-        if (is_opcode_volatile && !dyn->insts[ninst].lock)
-            DMB_ISHLD();
+        if (is_opcode_volatile || dyn->insts[ninst].lock)
+            DMB_ISH();
         #endif
 
         fpu_reset_scratch(dyn);
diff --git a/src/dynarec/la64/dynarec_la64_00.c b/src/dynarec/la64/dynarec_la64_00.c
index b8464a2e..7faaa01a 100644
--- a/src/dynarec/la64/dynarec_la64_00.c
+++ b/src/dynarec/la64/dynarec_la64_00.c
@@ -987,7 +987,6 @@ uintptr_t dynarec64_00(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                     AMSWAP_DB_B(x1, gd, ed);
                     BSTRINS_D(gb1, x1, gb2 + 7, gb2);
                 } else {
-                    SMDMB();
 
                     // calculate shift amount
                     ANDI(x1, ed, 0x3);
@@ -1030,7 +1029,6 @@ uintptr_t dynarec64_00(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
             } else {
                 GETGD;
                 addr = geted(dyn, addr, ninst, nextop, &ed, x2, x1, &fixedaddress, rex, LOCK_LOCK, 0, 0);
-                SMDMB();
                 ANDI(x3, ed, (1 << (2 + rex.w)) - 1);
                 BNEZ_MARK(x3);
                 MARKLOCK;
@@ -1043,7 +1041,6 @@ uintptr_t dynarec64_00(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                 LDxw(x1, ed, 0);
                 SDxw(gd, ed, 0);
                 MARK2;
-                SMDMB();
                 MVxw(gd, x1);
             }
             break;
diff --git a/src/dynarec/la64/dynarec_la64_66f0.c b/src/dynarec/la64/dynarec_la64_66f0.c
index a1765946..df70a49b 100644
--- a/src/dynarec/la64/dynarec_la64_66f0.c
+++ b/src/dynarec/la64/dynarec_la64_66f0.c
@@ -53,7 +53,6 @@ uintptr_t dynarec64_66F0(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int
         case 0x81:
         case 0x83:
             nextop = F8;
-            SMDMB();
             switch ((nextop >> 3) & 7) {
                 case 0: // ADD
                     if (opcode == 0x81) {
@@ -119,7 +118,6 @@ uintptr_t dynarec64_66F0(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int
                 default:
                     DEFAULT;
             }
-            SMDMB();
             break;
 
         default:
diff --git a/src/dynarec/la64/dynarec_la64_f0.c b/src/dynarec/la64/dynarec_la64_f0.c
index a381e6c8..30d8d844 100644
--- a/src/dynarec/la64/dynarec_la64_f0.c
+++ b/src/dynarec/la64/dynarec_la64_f0.c
@@ -56,7 +56,6 @@ uintptr_t dynarec64_F0(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
             SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION);
             nextop = F8;
             GETGD;
-            SMDMB();
             if (MODREG) {
                 ed = TO_NAT((nextop & 7) + (rex.b << 3));
                 emit_add32(dyn, ninst, rex, ed, gd, x3, x4, x5);
@@ -71,14 +70,12 @@ uintptr_t dynarec64_F0(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                     emit_add32(dyn, ninst, rex, x1, gd, x3, x4, x5);
                 }
             }
-            SMDMB();
             break;
         case 0x09:
             INST_NAME("LOCK OR Ed, Gd");
             SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION);
             nextop = F8;
             GETGD;
-            SMDMB();
             if (MODREG) {
                 ed = TO_NAT((nextop & 7) + (rex.b << 3));
                 emit_or32(dyn, ninst, rex, ed, gd, x3, x4);
@@ -92,7 +89,6 @@ uintptr_t dynarec64_F0(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                 IFXORNAT (X_ALL | X_PEND)
                     emit_or32(dyn, ninst, rex, x1, gd, x3, x4);
             }
-            SMDMB();
             break;
         case 0x0F:
             nextop = F8;
@@ -125,7 +121,6 @@ uintptr_t dynarec64_F0(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                                 MARK2;
                                 BSTRINS_D(xRAX, x2, 7, 0);
                             } else {
-                                SMDMB();
                                 if (rex.rex) {
                                     gb1 = TO_NAT(((nextop & 0x38) >> 3) + (rex.r << 3));
                                     gb2 = 0;
@@ -159,7 +154,6 @@ uintptr_t dynarec64_F0(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                                 MARK;
                                 UFLAG_IF { emit_cmp8(dyn, ninst, x6, x4, x1, x2, x3, x5); }
                                 BSTRINS_D(xRAX, x4, 7, 0);
-                                SMDMB();
                             }
                             break;
                         default:
@@ -184,7 +178,6 @@ uintptr_t dynarec64_F0(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                                 MARK2;
                                 MVxw(xRAX, x1);
                             } else {
-                                SMDMB();
                                 addr = geted(dyn, addr, ninst, nextop, &wback, x2, x1, &fixedaddress, rex, LOCK_LOCK, 0, 0);
                                 ANDI(x1, wback, (1 << (rex.w + 2)) - 1);
                                 BNEZ_MARK3(x1);
@@ -214,7 +207,6 @@ uintptr_t dynarec64_F0(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                                 MARK;
                                 UFLAG_IF { emit_cmp32(dyn, ninst, rex, xRAX, x1, x3, x4, x5, x6); }
                                 MVxw(xRAX, x1);
-                                SMDMB();
                             }
                             break;
                         default:
@@ -228,7 +220,6 @@ uintptr_t dynarec64_F0(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                             SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION);
                             nextop = F8;
                             GETGD;
-                            SMDMB();
                             if (MODREG) {
                                 ed = TO_NAT((nextop & 7) + (rex.b << 3));
                                 MVxw(x1, ed);
@@ -248,7 +239,6 @@ uintptr_t dynarec64_F0(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                                 }
                                 MVxw(gd, x1);
                             }
-                            SMDMB();
                             break;
                         default:
                             DEFAULT;
@@ -302,7 +292,6 @@ uintptr_t dynarec64_F0(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                                     MV(xRAX, x2);
                                     MV(xRDX, x3);
                                     MARK3;
-                                    SMDMB();
                                 } else {
                                     // if scq extension is not available, implement it with mutex
                                     LD_D(x6, xEmu, offsetof(x64emu_t, context));
@@ -337,7 +326,6 @@ uintptr_t dynarec64_F0(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                                     AMSWAP_DB_W(xZR, xZR, x6);
                                 }
                             } else {
-                                SMDMB();
                                 BSTRINS_D(x3, xRAX, 31, 0);
                                 BSTRINS_D(x3, xRDX, 63, 32);
                                 BSTRINS_D(x4, xRBX, 31, 0);
@@ -384,7 +372,6 @@ uintptr_t dynarec64_F0(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                                 SRLI_D(xRDX, x2, 32);
                                 ZEROUP2(xRAX, x2);
                                 MARK3;
-                                SMDMB();
                             }
                             break;
                         default:
@@ -401,7 +388,6 @@ uintptr_t dynarec64_F0(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
             SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION);
             nextop = F8;
             GETGD;
-            SMDMB();
             if (MODREG) {
                 ed = TO_NAT((nextop & 7) + (rex.b << 3));
                 emit_adc32(dyn, ninst, rex, ed, gd, x3, x4, x5, x6);
@@ -418,14 +404,12 @@ uintptr_t dynarec64_F0(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                     emit_adc32(dyn, ninst, rex, x1, gd, x3, x4, x5, x6);
                 }
             }
-            SMDMB();
             break;
         case 0x21:
             INST_NAME("LOCK AND Ed, Gd");
             SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION);
             nextop = F8;
             GETGD;
-            SMDMB();
             if (MODREG) {
                 ed = TO_NAT((nextop & 7) + (rex.b << 3));
                 emit_and32(dyn, ninst, rex, ed, gd, x3, x4);
@@ -435,14 +419,12 @@ uintptr_t dynarec64_F0(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                 IFXORNAT (X_ALL | X_PEND)
                     emit_and32(dyn, ninst, rex, x1, gd, x3, x4);
             }
-            SMDMB();
             break;
         case 0x29:
             INST_NAME("LOCK SUB Ed, Gd");
             SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION);
             nextop = F8;
             GETGD;
-            SMDMB();
             if (MODREG) {
                 ed = TO_NAT((nextop & 7) + (rex.b << 3));
                 emit_sub32(dyn, ninst, rex, ed, gd, x3, x4, x5);
@@ -456,7 +438,6 @@ uintptr_t dynarec64_F0(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                 IFXORNAT (X_ALL | X_PEND)
                     emit_sub32(dyn, ninst, rex, x1, gd, x3, x4, x5);
             }
-            SMDMB();
             break;
 
         case 0x66:
@@ -464,7 +445,6 @@ uintptr_t dynarec64_F0(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
 
         case 0x80:
             nextop = F8;
-            SMDMB();
             switch ((nextop >> 3) & 7) {
                 case 1: // OR
                     INST_NAME("LOCK OR Eb, Ib");
@@ -494,12 +474,10 @@ uintptr_t dynarec64_F0(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                 default:
                     DEFAULT;
             }
-            SMDMB();
             break;
         case 0x81:
         case 0x83:
             nextop = F8;
-            SMDMB();
             switch ((nextop >> 3) & 7) {
                 case 0:
                     if (opcode == 0x81) {
@@ -536,7 +514,6 @@ uintptr_t dynarec64_F0(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                         IFXORNAT (X_ALL | X_PEND) {
                             emit_add32c(dyn, ninst, rex, x1, i64, x3, x4, x5, x6);
                         }
-                        SMDMB();
                     }
                     break;
                 case 1:
@@ -657,7 +634,6 @@ uintptr_t dynarec64_F0(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                 MV(gd, ed);
                 MV(ed, x1);
             } else {
-                SMDMB();
                 GETGD;
                 addr = geted(dyn, addr, ninst, nextop, &wback, x2, x1, &fixedaddress, rex, LOCK_LOCK, 0, 0);
                 MARKLOCK;
@@ -666,7 +642,6 @@ uintptr_t dynarec64_F0(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                 SCxw(x4, wback, 0);
                 BEQZ_MARKLOCK(x4);
                 MVxw(gd, x1);
-                SMDMB();
             }
             break;
         case 0xFF:
@@ -676,7 +651,6 @@ uintptr_t dynarec64_F0(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                 case 0:
                     INST_NAME("LOCK INC Ed");
                     SETFLAGS(X_ALL & ~X_CF, SF_SUBSET_PENDING, NAT_FLAGS_FUSION);
-                    SMDMB();
                     if (MODREG) {
                         ed = TO_NAT((nextop & 7) + (rex.b << 3));
                         emit_inc32(dyn, ninst, rex, ed, x3, x4, x5, x6);
@@ -694,7 +668,6 @@ uintptr_t dynarec64_F0(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                 case 1:
                     INST_NAME("LOCK DEC Ed");
                     SETFLAGS(X_ALL & ~X_CF, SF_SUBSET_PENDING, NAT_FLAGS_FUSION);
-                    SMDMB();
                     if (MODREG) {
                         ed = TO_NAT((nextop & 7) + (rex.b << 3));
                         emit_dec32(dyn, ninst, rex, ed, x3, x4, x5, x6);
diff --git a/src/dynarec/rv64/dynarec_rv64_00_2.c b/src/dynarec/rv64/dynarec_rv64_00_2.c
index 4c5f3687..e9cb0259 100644
--- a/src/dynarec/rv64/dynarec_rv64_00_2.c
+++ b/src/dynarec/rv64/dynarec_rv64_00_2.c
@@ -293,7 +293,6 @@ uintptr_t dynarec64_00_2(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
             } else {
                 GETGB(x3);
                 addr = geted(dyn, addr, ninst, nextop, &ed, x2, x1, &fixedaddress, rex, LOCK_LOCK, 0, 0);
-                SMDMB();
 
                 // calculate shift amount
                 ANDI(x1, ed, 0x3);
@@ -335,7 +334,6 @@ uintptr_t dynarec64_00_2(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
             } else {
                 GETGD;
                 addr = geted(dyn, addr, ninst, nextop, &ed, x2, x1, &fixedaddress, rex, LOCK_LOCK, 0, 0);
-                SMDMB();
                 ANDI(x3, ed, (1 << (2 + rex.w)) - 1);
                 BNE_MARK(x3, xZR);
                 AMOSWAPxw(gd, gd, ed, 1, 1);
diff --git a/src/dynarec/rv64/dynarec_rv64_66.c b/src/dynarec/rv64/dynarec_rv64_66.c
index a9399651..51bb829c 100644
--- a/src/dynarec/rv64/dynarec_rv64_66.c
+++ b/src/dynarec/rv64/dynarec_rv64_66.c
@@ -630,7 +630,6 @@ uintptr_t dynarec64_66(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
             } else {
                 GETGD;
                 addr = geted(dyn, addr, ninst, nextop, &ed, x2, x1, &fixedaddress, rex, LOCK_LOCK, 0, 0);
-                SMDMB();
 
                 ANDI(x3, ed, 1);
                 BNEZ_MARK(x3);
@@ -670,7 +669,6 @@ uintptr_t dynarec64_66(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                 SH(gd, ed, 0);
 
                 MARK2;
-                SMDMB();
                 INSHz(gd, x1, x3, x4, 1, 0);
             }
             break;
diff --git a/src/dynarec/rv64/dynarec_rv64_66f0.c b/src/dynarec/rv64/dynarec_rv64_66f0.c
index 3e49b463..c409b74e 100644
--- a/src/dynarec/rv64/dynarec_rv64_66f0.c
+++ b/src/dynarec/rv64/dynarec_rv64_66f0.c
@@ -95,7 +95,6 @@ uintptr_t dynarec64_66F0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
                         BNEZ_MARKLOCK2(x5);
                     }
                     MARK;
-                    SMDMB();
                     UFLAG_IF { emit_cmp16(dyn, ninst, x6, x1, x2, x3, x4, x5); }
                     INSH(xRAX, x1, x2, x3, 1, 0);
                     break;
@@ -106,7 +105,6 @@ uintptr_t dynarec64_66F0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
         case 0x81:
         case 0x83:
             nextop = F8;
-            SMDMB();
             switch ((nextop >> 3) & 7) {
                 case 0: // ADD
                     if (opcode == 0x81) {
@@ -311,7 +309,6 @@ uintptr_t dynarec64_66F0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
                 default:
                     DEFAULT;
             }
-            SMDMB();
             break;
 
         default:
diff --git a/src/dynarec/rv64/dynarec_rv64_f0.c b/src/dynarec/rv64/dynarec_rv64_f0.c
index 047b72cc..c7f3f634 100644
--- a/src/dynarec/rv64/dynarec_rv64_f0.c
+++ b/src/dynarec/rv64/dynarec_rv64_f0.c
@@ -58,7 +58,6 @@ uintptr_t dynarec64_F0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
             SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION);
             nextop = F8;
             GETGD;
-            SMDMB();
             if (MODREG) {
                 ed = TO_NAT((nextop & 7) + (rex.b << 3));
                 emit_add32(dyn, ninst, rex, ed, gd, x3, x4, x5);
@@ -69,14 +68,12 @@ uintptr_t dynarec64_F0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                     emit_add32(dyn, ninst, rex, x1, gd, x3, x4, x5);
                 }
             }
-            SMDMB();
             break;
         case 0x08:
             INST_NAME("LOCK OR Eb, Gb");
             SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION);
             nextop = F8;
             GETGB(x1);
-            SMDMB();
             if (MODREG) {
                 GETEB(x2, 1);
                 emit_or8(dyn, ninst, x2, x1, x4, x5);
@@ -94,14 +91,12 @@ uintptr_t dynarec64_F0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                     emit_or8(dyn, ninst, x2, x1, x4, x5);
                 }
             }
-            SMDMB();
             break;
         case 0x09:
             INST_NAME("LOCK OR Ed, Gd");
             SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION);
             nextop = F8;
             GETGD;
-            SMDMB();
             if (MODREG) {
                 ed = TO_NAT((nextop & 7) + (rex.b << 3));
                 emit_or32(dyn, ninst, rex, ed, gd, x3, x4);
@@ -111,7 +106,6 @@ uintptr_t dynarec64_F0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                 IFXORNAT (X_ALL | X_PEND)
                     emit_or32(dyn, ninst, rex, x1, gd, x3, x4);
             }
-            SMDMB();
             break;
 
         case 0x0F:
@@ -135,7 +129,6 @@ uintptr_t dynarec64_F0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                         OR(ed, ed, x4);
                         if (!rex.w) ZEROUP(ed);
                     } else {
-                        SMDMB();
                         addr = geted(dyn, addr, ninst, nextop, &wback, x3, x1, &fixedaddress, rex, LOCK_LOCK, 0, 0);
                         SRAIxw(x1, gd, 5 + rex.w);
                         ADDSL(x3, wback, x1, 2 + rex.w, x1);
@@ -152,7 +145,6 @@ uintptr_t dynarec64_F0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                         OR(ed, ed, x4);
                         SCxw(x7, ed, wback, 1, 1);
                         BNEZ_MARKLOCK(x7);
-                        SMDMB();
                     }
                     break;
                 case 0xB0:
@@ -196,7 +188,6 @@ uintptr_t dynarec64_F0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                                 ANDI(xRAX, xRAX, ~0xff);
                                 OR(xRAX, xRAX, x2);
                             } else {
-                                SMDMB();
                                 if (rex.rex) {
                                     gb1 = TO_NAT(((nextop & 0x38) >> 3) + (rex.r << 3));
                                     gb2 = 0;
@@ -237,7 +228,6 @@ uintptr_t dynarec64_F0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                                 // load m8 into AL
                                 ANDI(xRAX, xRAX, ~0xff);
                                 OR(xRAX, xRAX, x4);
-                                SMDMB();
                             }
                             break;
                         default:
@@ -262,7 +252,6 @@ uintptr_t dynarec64_F0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                                 MARK2;
                                 MVxw(xRAX, x1);
                             } else {
-                                SMDMB();
                                 addr = geted(dyn, addr, ninst, nextop, &wback, x2, x1, &fixedaddress, rex, LOCK_LOCK, 0, 0);
                                 ANDI(x1, wback, (1 << (rex.w + 2)) - 1);
                                 BNEZ_MARK3(x1);
@@ -290,7 +279,6 @@ uintptr_t dynarec64_F0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                                 MARK;
                                 UFLAG_IF { emit_cmp32(dyn, ninst, rex, xRAX, x1, x3, x4, x5, x6); }
                                 MVxw(xRAX, x1);
-                                SMDMB();
                             }
                             break;
                         default:
@@ -316,7 +304,6 @@ uintptr_t dynarec64_F0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                         AND(ed, ed, x4);
                         if (!rex.w) ZEROUP(ed);
                     } else {
-                        SMDMB();
                         addr = geted(dyn, addr, ninst, nextop, &wback, x3, x1, &fixedaddress, rex, LOCK_LOCK, 0, 0);
                         SRAIxw(x1, gd, 5 + rex.w);
                         ADDSL(x3, wback, x1, 2 + rex.w, x1);
@@ -335,7 +322,6 @@ uintptr_t dynarec64_F0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                         AND(ed, ed, x4);
                         SCxw(x7, ed, wback, 1, 1);
                         BNEZ_MARKLOCK(x7);
-                        SMDMB();
                     }
                     break;
                 case 0xC1:
@@ -345,7 +331,6 @@ uintptr_t dynarec64_F0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                             SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION);
                             nextop = F8;
                             GETGD;
-                            SMDMB();
                             if (MODREG) {
                                 ed = TO_NAT((nextop & 7) + (rex.b << 3));
                                 MVxw(x1, ed);
@@ -361,7 +346,6 @@ uintptr_t dynarec64_F0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                                 }
                                 MVxw(gd, x1);
                             }
-                            SMDMB();
                             break;
                         default:
                             DEFAULT;
@@ -378,7 +362,6 @@ uintptr_t dynarec64_F0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                                     nextop = F8;
                                     addr = geted(dyn, addr, ninst, nextop, &wback, x1, x2, &fixedaddress, rex, LOCK_LOCK, 0, 0);
                                     ANDI(xFlags, xFlags, ~(1 << F_ZF));
-                                    SMDMB();
                                     ZEXTW2(x3, xRAX);
                                     SLLI(x2, xRDX, 32);
                                     OR(x3, x3, x2); // x3 is edx:eax
@@ -394,12 +377,10 @@ uintptr_t dynarec64_F0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                                     SC_D(x5, x4, wback, 1, 1); // set ZF and load ecx:ebx into m64
                                     BNEZ_MARKLOCK(x5);
                                     ORI(xFlags, xFlags, 1 << F_ZF);
-                                    SMDMB();
                                     B_NEXT_nocond;
                                     MARK;
                                     SRLI(xRDX, x2, 32);
                                     ZEXTW2(xRAX, x2);
-                                    SMDMB();
                                     B_NEXT_nocond;
                                     MARK3;
                                     // Unaligned
@@ -412,12 +393,10 @@ uintptr_t dynarec64_F0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                                     BNEZ_MARKLOCK2(x7);
                                     SD(x4, wback, 0); // set ZF and load ecx:ebx into m64
                                     ORI(xFlags, xFlags, 1 << F_ZF);
-                                    SMDMB();
                                     B_NEXT_nocond;
                                     MARK2;
                                     SRLI(xRDX, x2, 32);
                                     ZEXTW2(xRAX, x2);
-                                    SMDMB();
                                     break;
                                 case 1:
                                     INST_NAME("LOCK CMPXCHG16B Gq, Eq");
@@ -437,7 +416,6 @@ uintptr_t dynarec64_F0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                                     // x4 == 1 if locked
                                     BNEZ_MARK2(x4);
 
-                                    SMDMB();
                                     MARKLOCK;
                                     LD(x3, wback, 8);
                                     LR_D(x2, wback, 1, 1);
@@ -452,7 +430,6 @@ uintptr_t dynarec64_F0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                                     MV(xRAX, x2);
                                     MV(xRDX, x3);
                                     MARK3;
-                                    SMDMB();
 
                                     // unlock
                                     AMOSWAP_W(xZR, xZR, x7, 1, 1);
@@ -474,7 +451,6 @@ uintptr_t dynarec64_F0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
             SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION);
             nextop = F8;
             GETGB(x2);
-            SMDMB();
             if (MODREG) {
                 if (rex.rex) {
                     wback = TO_NAT((nextop & 7) + (rex.b << 3));
@@ -539,7 +515,6 @@ uintptr_t dynarec64_F0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                     emit_adc8(dyn, ninst, x4, x2, x3, x5, x6);
                 }
             }
-            SMDMB();
             break;
         case 0x11:
             INST_NAME("LOCK ADC Ed, Gd");
@@ -547,7 +522,6 @@ uintptr_t dynarec64_F0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
             SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION);
             nextop = F8;
             GETGD;
-            SMDMB();
             if (MODREG) {
                 ed = TO_NAT((nextop & 7) + (rex.b << 3));
                 emit_adc32(dyn, ninst, rex, ed, gd, x3, x4, x5, x6);
@@ -564,14 +538,12 @@ uintptr_t dynarec64_F0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                     emit_adc32(dyn, ninst, rex, x1, gd, x3, x4, x5, x6);
                 }
             }
-            SMDMB();
             break;
         case 0x21:
             INST_NAME("LOCK AND Ed, Gd");
             SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION);
             nextop = F8;
             GETGD;
-            SMDMB();
             if (MODREG) {
                 ed = TO_NAT((nextop & 7) + (rex.b << 3));
                 emit_and32(dyn, ninst, rex, ed, gd, x3, x4);
@@ -581,14 +553,12 @@ uintptr_t dynarec64_F0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                 IFXORNAT (X_ALL | X_PEND)
                     emit_and32(dyn, ninst, rex, x1, gd, x3, x4);
             }
-            SMDMB();
             break;
         case 0x29:
             INST_NAME("LOCK SUB Ed, Gd");
             SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION);
             nextop = F8;
             GETGD;
-            SMDMB();
             if (MODREG) {
                 ed = TO_NAT((nextop & 7) + (rex.b << 3));
                 emit_sub32(dyn, ninst, rex, ed, gd, x3, x4, x5);
@@ -599,14 +569,12 @@ uintptr_t dynarec64_F0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                 IFXORNAT (X_ALL | X_PEND)
                     emit_sub32(dyn, ninst, rex, x1, gd, x3, x4, x5);
             }
-            SMDMB();
             break;
         case 0x66:
             return dynarec64_66F0(dyn, addr, ip, ninst, rex, rep, ok, need_epilog);
 
         case 0x80:
             nextop = F8;
-            SMDMB();
             switch ((nextop >> 3) & 7) {
                 case 1: // OR
                     INST_NAME("LOCK OR Eb, Ib");
@@ -635,12 +603,10 @@ uintptr_t dynarec64_F0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                 default:
                     DEFAULT;
             }
-            SMDMB();
             break;
         case 0x81:
         case 0x83:
             nextop = F8;
-            SMDMB();
             switch ((nextop >> 3) & 7) {
                 case 0: // ADD
                     if (opcode == 0x81) {
@@ -657,7 +623,6 @@ uintptr_t dynarec64_F0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                         ed = TO_NAT((nextop & 7) + (rex.b << 3));
                         emit_add32c(dyn, ninst, rex, ed, i64, x3, x4, x5, x6);
                     } else {
-                        SMDMB();
                         addr = geted(dyn, addr, ninst, nextop, &wback, x2, x1, &fixedaddress, rex, LOCK_LOCK, 0, (opcode == 0x81) ? 4 : 1);
                         if (opcode == 0x81)
                             i64 = F32S;
@@ -682,7 +647,6 @@ uintptr_t dynarec64_F0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                         MARK;
                         IFXORNAT (X_ALL | X_PEND)
                             emit_add32c(dyn, ninst, rex, x1, i64, x3, x4, x5, x6);
-                        SMDMB();
                     }
                     break;
                 case 1: // OR
@@ -777,7 +741,6 @@ uintptr_t dynarec64_F0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                         MARK;
                         IFXORNAT (X_ALL | X_PEND)
                             emit_sub32c(dyn, ninst, rex, x1, i64, x3, x4, x5, x6);
-                        SMDMB();
                     }
                     break;
                 case 6: // XOR
@@ -808,7 +771,6 @@ uintptr_t dynarec64_F0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                     break;
                 default: DEFAULT;
             }
-            SMDMB();
             break;
         case 0x87:
             INST_NAME("LOCK XCHG Ed, Gd");
@@ -820,7 +782,6 @@ uintptr_t dynarec64_F0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                 MV(gd, ed);
                 MV(ed, x5);
             } else {
-                SMDMB();
                 GETGD;
                 addr = geted(dyn, addr, ninst, nextop, &wback, x2, x1, &fixedaddress, rex, LOCK_LOCK, 0, 0);
                 ANDI(x1, wback, (1 << (rex.w + 2)) - 1);
@@ -839,7 +800,6 @@ uintptr_t dynarec64_F0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                 BNEZ_MARKLOCK(x4);
                 SDxw(gd, wback, 0);
                 MVxw(gd, x1);
-                SMDMB();
             }
             break;
         case 0xF6:
@@ -853,14 +813,12 @@ uintptr_t dynarec64_F0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                         EBBACK(x5, 1);
                     } else {
                         addr = geted(dyn, addr, ninst, nextop, &wback, x2, x1, &fixedaddress, rex, LOCK_LOCK, 0, 0);
-                        SMDMB();
                         ANDI(x3, wback, 3);
                         ANDI(x5, wback, ~3);
                         MOV32w(x4, 0xFF);
                         SLLIW(x3, x3, 3);
                         SLLW(x4, x4, x3); // mask
                         AMOXOR_W(xZR, x4, x5, 1, 1);
-                        SMDMB();
                     }
                     break;
                 default:
@@ -873,7 +831,6 @@ uintptr_t dynarec64_F0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                 case 0: // INC Ed
                     INST_NAME("LOCK INC Ed");
                     SETFLAGS(X_ALL & ~X_CF, SF_SUBSET_PENDING, NAT_FLAGS_FUSION);
-                    SMDMB();
                     if (MODREG) {
                         ed = TO_NAT((nextop & 7) + (rex.b << 3));
                         emit_inc32(dyn, ninst, rex, ed, x3, x4, x5, x6);
@@ -898,13 +855,11 @@ uintptr_t dynarec64_F0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                         MARK;
                         IFXORNAT (X_ALL | X_PEND)
                             emit_inc32(dyn, ninst, rex, x1, x3, x4, x5, x6);
-                        SMDMB();
                     }
                     break;
                 case 1: // DEC Ed
                     INST_NAME("LOCK DEC Ed");
                     SETFLAGS(X_ALL & ~X_CF, SF_SUBSET_PENDING, NAT_FLAGS_FUSION);
-                    SMDMB();
                     if (MODREG) {
                         ed = TO_NAT((nextop & 7) + (rex.b << 3));
                         emit_dec32(dyn, ninst, rex, ed, x3, x4, x5, x6);
@@ -929,7 +884,6 @@ uintptr_t dynarec64_F0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                         MARK;
                         IFXORNAT (X_ALL | X_PEND)
                             emit_dec32(dyn, ninst, rex, x1, x3, x4, x5, x6);
-                        SMDMB();
                     }
                     break;
                 default: