diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2025-09-16 17:44:27 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2025-09-16 17:44:27 +0200 |
| commit | ea48f2b823b253fd4ed61925d5b3ac9ac2d2955e (patch) | |
| tree | 1e6997434a4d60913f72c3c65e58e92f760fef54 /src | |
| parent | 85b07f7441e7342e7d4c40166eef3b47c7090745 (diff) | |
| download | box64-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.c | 2 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_66.c | 3 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_66f0.c | 17 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_f0.c | 59 | ||||
| -rw-r--r-- | src/dynarec/dynarec_helper.h | 8 | ||||
| -rw-r--r-- | src/dynarec/dynarec_native_pass.c | 4 | ||||
| -rw-r--r-- | src/dynarec/la64/dynarec_la64_00.c | 3 | ||||
| -rw-r--r-- | src/dynarec/la64/dynarec_la64_66f0.c | 2 | ||||
| -rw-r--r-- | src/dynarec/la64/dynarec_la64_f0.c | 27 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_00_2.c | 2 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_66.c | 2 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_66f0.c | 3 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_f0.c | 46 |
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: |