about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorYang Liu <liuyang22@iscas.ac.cn>2024-08-17 20:08:11 +0800
committerptitSeb <sebastien.chev@gmail.com>2024-08-18 10:46:15 +0200
commit769a9f65a93fa4af19161d65aab5510aab349f58 (patch)
tree0afac050a264a706b7dc784deeb9a24828767ea4 /src
parent5b78159cb509ee46f5337300c37c15a3948a2287 (diff)
downloadbox64-769a9f65a93fa4af19161d65aab5510aab349f58.tar.gz
box64-769a9f65a93fa4af19161d65aab5510aab349f58.zip
Slightly improved LOCK CMPXCHG16B opcode
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/rv64/dynarec_rv64_f0.c10
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;