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