diff options
Diffstat (limited to 'src')
| -rwxr-xr-x | src/dynarec/arm64/dynarec_arm64_00.c | 15 | ||||
| -rwxr-xr-x | src/dynarec/arm64/dynarec_arm64_66.c | 15 |
2 files changed, 24 insertions, 6 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_00.c b/src/dynarec/arm64/dynarec_arm64_00.c index 6bee4991..b662c0e1 100755 --- a/src/dynarec/arm64/dynarec_arm64_00.c +++ b/src/dynarec/arm64/dynarec_arm64_00.c @@ -929,7 +929,10 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin } else { addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, 0xfff, 0, rex, &lock, 0, 0); STRB_U12(gd, ed, fixedaddress); - if(lock) {DMB_ISH();} + if(lock || (box64_dynarec_strongmem && + (dyn->insts[ninst].x64.barrier || box64_dynarec_strongmem>1 || (dyn->insts[ninst+1].x64.barrier || dyn->insts[ninst+1].x64.jmp)))) { + DMB_ISH(); + } } break; case 0x89: @@ -1599,7 +1602,10 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin u8 = F8; MOV32w(x3, u8); STRB_U12(x3, ed, fixedaddress); - if(lock) {DMB_ISH();} + if(lock || (box64_dynarec_strongmem && + (dyn->insts[ninst].x64.barrier || box64_dynarec_strongmem>1 || (dyn->insts[ninst+1].x64.barrier || dyn->insts[ninst+1].x64.jmp)))) { + DMB_ISH(); + } } break; case 0xC7: @@ -1614,7 +1620,10 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin i64 = F32S; MOV64xw(x3, i64); STRxw_U12(x3, ed, fixedaddress); - if(lock) {DMB_ISH();} + if(lock || (box64_dynarec_strongmem && + (dyn->insts[ninst].x64.barrier || box64_dynarec_strongmem>1 || (dyn->insts[ninst+1].x64.barrier || dyn->insts[ninst+1].x64.jmp)))) { + DMB_ISH(); + } } break; diff --git a/src/dynarec/arm64/dynarec_arm64_66.c b/src/dynarec/arm64/dynarec_arm64_66.c index 0d8207a7..ecdb4b1b 100755 --- a/src/dynarec/arm64/dynarec_arm64_66.c +++ b/src/dynarec/arm64/dynarec_arm64_66.c @@ -444,7 +444,10 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin } else { addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, 0xfff<<1, 1, rex, &lock, 0, 0); STRH_U12(gd, ed, fixedaddress); - if(lock) {DMB_ISH();} + if(lock || (box64_dynarec_strongmem && + (dyn->insts[ninst].x64.barrier || box64_dynarec_strongmem>1 || (dyn->insts[ninst+1].x64.barrier || dyn->insts[ninst+1].x64.jmp)))) { + DMB_ISH(); + } } break; case 0x8B: @@ -458,7 +461,10 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin } } else { addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, 0xfff<<1, 1, rex, &lock, 0, 0); - if(lock) {DMB_ISH();} + if(lock || (box64_dynarec_strongmem && + (dyn->insts[ninst].x64.barrier || box64_dynarec_strongmem>1 || (dyn->insts[ninst+1].x64.barrier || dyn->insts[ninst+1].x64.jmp)))) { + DMB_ISH(); + } LDRH_U12(x1, ed, fixedaddress); BFIx(gd, x1, 0, 16); } @@ -679,7 +685,10 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin u16 = F16; MOV32w(x1, u16); STRH_U12(x1, ed, fixedaddress); - if(lock) {DMB_ISH();} + if(lock || (box64_dynarec_strongmem && + (dyn->insts[ninst].x64.barrier || box64_dynarec_strongmem>1 || (dyn->insts[ninst+1].x64.barrier || dyn->insts[ninst+1].x64.jmp)))) { + DMB_ISH(); + } } break; |