diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2022-07-03 00:07:14 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2022-07-03 00:07:14 +0200 |
| commit | 53365241294de8eae2da2edfb6b47f04b02f5808 (patch) | |
| tree | 84207aa9154910518978b28ac0e3f28b72219e27 /src/dynarec/arm64/dynarec_arm64_66f0.c | |
| parent | de30d37ba91b093d459365a93ea9cc4418fc502a (diff) | |
| download | box64-53365241294de8eae2da2edfb6b47f04b02f5808.tar.gz box64-53365241294de8eae2da2edfb6b47f04b02f5808.zip | |
[DYNAREC] Add a mecanism to remember fixed address accessed with LOCK, so MOV to/from them use a Memory Barrier automaticaly
Diffstat (limited to 'src/dynarec/arm64/dynarec_arm64_66f0.c')
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_66f0.c | 20 |
1 files changed, 10 insertions, 10 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_66f0.c b/src/dynarec/arm64/dynarec_arm64_66f0.c index c041febc..786bab29 100644 --- a/src/dynarec/arm64/dynarec_arm64_66f0.c +++ b/src/dynarec/arm64/dynarec_arm64_66f0.c @@ -64,7 +64,7 @@ uintptr_t dynarec64_66F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n emit_or16(dyn, ninst, x6, x5, x3, x4); BFIx(ed, x6, 0, 16); } else { - addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, 0, 0, rex, 0, 0); + addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, 0, 0, rex, LOCK_LOCK, 0, 0); MARKLOCK; LDAXRH(x1, wback); emit_or16(dyn, ninst, x1, x5, x3, x4); @@ -94,7 +94,7 @@ uintptr_t dynarec64_66F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n emit_add16(dyn, ninst, x6, x5, x3, x4); BFIx(ed, x6, 0, 16); } else { - addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, 0, 0, rex, 0, (opcode==0x81)?2:1); + addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, 0, 0, rex, LOCK_LOCK, 0, (opcode==0x81)?2:1); if(opcode==0x81) i32 = F16S; else i32 = F8S; MOV32w(x5, i32); TSTx_mask(wback, 1, 0, 0); // mask=1 @@ -126,7 +126,7 @@ uintptr_t dynarec64_66F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n emit_or16(dyn, ninst, x6, x5, x3, x4); BFIx(ed, x6, 0, 16); } else { - addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, 0, 0, rex, 0, (opcode==0x81)?2:1); + addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, 0, 0, rex, LOCK_LOCK, 0, (opcode==0x81)?2:1); if(opcode==0x81) i32 = F16S; else i32 = F8S; MOV32w(x5, i32); MARKLOCK; @@ -148,7 +148,7 @@ uintptr_t dynarec64_66F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n emit_adc16(dyn, ninst, x6, x5, x3, x4); BFIx(ed, x6, 0, 16); } else { - addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, 0, 0, rex, 0, (opcode==0x81)?2:1); + addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, 0, 0, rex, LOCK_LOCK, 0, (opcode==0x81)?2:1); if(opcode==0x81) i32 = F16S; else i32 = F8S; MOV32w(x5, i32); MARKLOCK; @@ -170,7 +170,7 @@ uintptr_t dynarec64_66F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n emit_sbb16(dyn, ninst, x6, x5, x3, x4); BFIx(ed, x6, 0, 16); } else { - addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, 0, 0, rex, 0, (opcode==0x81)?2:1); + addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, 0, 0, rex, LOCK_LOCK, 0, (opcode==0x81)?2:1); if(opcode==0x81) i32 = F16S; else i32 = F8S; MOV32w(x5, i32); MARKLOCK; @@ -191,7 +191,7 @@ uintptr_t dynarec64_66F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n emit_and16(dyn, ninst, x6, x5, x3, x4); BFIx(ed, x6, 0, 16); } else { - addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, 0, 0, rex, 0, (opcode==0x81)?2:1); + addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, 0, 0, rex, LOCK_LOCK, 0, (opcode==0x81)?2:1); if(opcode==0x81) i32 = F16S; else i32 = F8S; MOV32w(x5, i32); MARKLOCK; @@ -212,7 +212,7 @@ uintptr_t dynarec64_66F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n emit_sub16(dyn, ninst, x6, x5, x3, x4); BFIx(ed, x6, 0, 16); } else { - addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, 0, 0, rex, 0, (opcode==0x81)?2:1); + addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, 0, 0, rex, LOCK_LOCK, 0, (opcode==0x81)?2:1); if(opcode==0x81) i32 = F16S; else i32 = F8S; MOV32w(x5, i32); TSTx_mask(wback, 1, 0, 0); // mask=1 @@ -244,7 +244,7 @@ uintptr_t dynarec64_66F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n emit_xor16(dyn, ninst, x6, x5, x3, x4); BFIx(ed, x6, 0, 16); } else { - addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, 0, 0, rex, 0, (opcode==0x81)?2:1); + addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, 0, 0, rex, LOCK_LOCK, 0, (opcode==0x81)?2:1); if(opcode==0x81) i32 = F16S; else i32 = F8S; MOV32w(x5, i32); MARKLOCK; @@ -288,7 +288,7 @@ uintptr_t dynarec64_66F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n emit_inc16(dyn, ninst, x6, x5, x3); BFIx(ed, x6, 0, 16); } else { - addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, 0, 0, rex, 0, 0); + addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, 0, 0, rex, LOCK_LOCK, 0, 0); MARKLOCK; LDAXRH(x1, wback); emit_inc16(dyn, ninst, x1, x3, x4); @@ -307,7 +307,7 @@ uintptr_t dynarec64_66F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n emit_dec16(dyn, ninst, x6, x5, x3); BFIx(ed, x6, 0, 16); } else { - addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, 0, 0, rex, 0, 0); + addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, 0, 0, rex, LOCK_LOCK, 0, 0); MARKLOCK; LDAXRH(x1, wback); emit_dec16(dyn, ninst, x1, x3, x4); |