diff options
| author | Yang Liu <liuyang22@iscas.ac.cn> | 2024-08-17 20:08:11 +0800 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-08-18 10:46:15 +0200 |
| commit | 769a9f65a93fa4af19161d65aab5510aab349f58 (patch) | |
| tree | 0afac050a264a706b7dc784deeb9a24828767ea4 /src | |
| parent | 5b78159cb509ee46f5337300c37c15a3948a2287 (diff) | |
| download | box64-769a9f65a93fa4af19161d65aab5510aab349f58.tar.gz box64-769a9f65a93fa4af19161d65aab5510aab349f58.zip | |
Slightly improved LOCK CMPXCHG16B opcode
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_f0.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_f0.c b/src/dynarec/rv64/dynarec_rv64_f0.c index 533b14a3..98220915 100644 --- a/src/dynarec/rv64/dynarec_rv64_f0.c +++ b/src/dynarec/rv64/dynarec_rv64_f0.c @@ -300,17 +300,19 @@ uintptr_t dynarec64_F0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni LD(x9, xEmu, offsetof(x64emu_t, context)); ADDI(x9, x9, offsetof(box64context_t, mutex_16b)); ADDI(x4, xZR, 1); - MARKLOCK; + MARK2; AMOSWAP_W(x4, x4, x9, 1, 1); // x4 == 1 if locked - BNEZ_MARKLOCK(x4); + BNEZ_MARK2(x4); SMDMB(); - LD(x2, wback, 0); LD(x3, wback, 8); + MARKLOCK; + LR_D(x2, wback, 1, 1); BNE_MARK(x2, xRAX); BNE_MARK(x3, xRDX); - SD(xRBX, wback, 0); + SC_D(x5, xRBX, wback, 1, 1); + BNEZ_MARKLOCK(x5); SD(xRCX, wback, 8); ORI(xFlags, xFlags, 1<<F_ZF); B_MARK3_nocond; |