From e9ce6a4f80a1b82e5e8fcfac5951f1684df2836d Mon Sep 17 00:00:00 2001 From: Yang Liu Date: Tue, 27 Feb 2024 17:29:55 +0800 Subject: [RV64_INTERP] Comply CMPXCHG16B with dynarec (#1288) --- src/emu/x64runf0.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/emu/x64runf0.c b/src/emu/x64runf0.c index 20552e2e..e62237a0 100644 --- a/src/emu/x64runf0.c +++ b/src/emu/x64runf0.c @@ -744,7 +744,22 @@ uintptr_t RunF0(x64emu_t *emu, rex_t rex, uintptr_t addr) CHECK_FLAGS(emu); GETGD; #if defined(DYNAREC) && !defined(TEST_INTERPRETER) - if(rex.w) + if (rex.w) { +#if defined(__riscv) + while (native_lock_xchg_d(&emu->context->mutex_16b, 1)); // lock + tmp64u = ((uint64_t*)ED)[0]; + tmp64u2 = ((uint64_t*)ED)[1]; + if(R_RAX == tmp64u && R_RDX == tmp64u2) { + SET_FLAG(F_ZF); + ((uint64_t*)ED)[0] = R_RBX; + ((uint64_t*)ED)[1] = R_RCX; + } else { + CLEAR_FLAG(F_ZF); + R_RAX = tmp64u; + R_RDX = tmp64u2; + } + native_lock_xchg_d(&emu->context->mutex_16b, 0); // unlock +#else do { native_lock_read_dq(&tmp64u, &tmp64u2, ED); if(R_RAX == tmp64u && R_RDX == tmp64u2) { @@ -757,7 +772,8 @@ uintptr_t RunF0(x64emu_t *emu, rex_t rex, uintptr_t addr) tmp32s = 0; } } while(tmp32s); - else +#endif + } else do { tmp64u = native_lock_read_dd(ED); if((R_EAX == (tmp64u&0xffffffff)) && (R_EDX == ((tmp64u>>32)&0xffffffff))) { -- cgit 1.4.1