From c2d02977f8565b0ba19149a7c283af5680c065e7 Mon Sep 17 00:00:00 2001 From: ptitSeb Date: Fri, 7 Mar 2025 20:13:41 +0100 Subject: Added F0 F7 /2 opcode ([ARM64_DYNAREC] too) --- src/dynarec/arm64/dynarec_arm64_f0.c | 28 ++++++++++++++++++++++++++++ src/emu/x64runf0.c | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+) (limited to 'src') diff --git a/src/dynarec/arm64/dynarec_arm64_f0.c b/src/dynarec/arm64/dynarec_arm64_f0.c index ab13c0f0..d65bc551 100644 --- a/src/dynarec/arm64/dynarec_arm64_f0.c +++ b/src/dynarec/arm64/dynarec_arm64_f0.c @@ -1714,6 +1714,34 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin DEFAULT; } break; + case 0xF7: + nextop = F8; + switch((nextop>>3)&7) { + case 2: + INST_NAME("LOCK NOT Ed"); + if(MODREG) { + GETED(x1); + MVNw_REG(x1, x1); + EBBACK; + } else { + addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, NULL, 0, 0, rex, LOCK_LOCK, 0, 0); + if(arm64_atomics) { + MOV64x(x1, ~0LL); + STEORLxw(x1, wback); + } else { + MARKLOCK; + LDAXRxw(x1, wback); + MVNw_REG(x1, x1); + STLXRxw(x3, x1, wback); + CBNZx_MARKLOCK(x3); + } + SMDMB(); + } + break; + default: + DEFAULT; + } + break; case 0xFE: nextop = F8; diff --git a/src/emu/x64runf0.c b/src/emu/x64runf0.c index 8a1c5d0a..22f19566 100644 --- a/src/emu/x64runf0.c +++ b/src/emu/x64runf0.c @@ -1161,6 +1161,42 @@ uintptr_t RunF0(x64emu_t *emu, rex_t rex, uintptr_t addr) pthread_mutex_lock(&my_context->mutex_lock); EB->byte[0] = not8(emu, EB->byte[0]); pthread_mutex_unlock(&my_context->mutex_lock); +#endif + break; + default: + return 0; + } + break; + case 0xF7: /* GRP3 Ed(,Id) */ + nextop = F8; + tmp8u = (nextop>>3)&7; + GETED((tmp8u<2)?4:0); + switch(tmp8u) { + case 2: /* NOT Eb */ +#if defined(DYNAREC) && !defined(TEST_INTERPRETER) + if(rex.w) + do { + tmp64u = native_lock_read_dd(ED); + tmp64u = not64(emu, tmp64u); + } while(native_lock_write_dd(ED, tmp64u)); + else { + do { + tmp32u = native_lock_read_d(ED); + tmp32u = not32(emu, tmp32u); + } while(native_lock_write_d(ED, tmp32u)); + if(MODREG) ED->dword[1] = 0; + } +#else + if(rex.w) { + pthread_mutex_lock(&my_context->mutex_lock); + ED->q[0] = not64(emu, ED->q[0]); + pthread_mutex_unlock(&my_context->mutex_lock); + } else { + pthread_mutex_lock(&my_context->mutex_lock); + ED->dword[0] = not32(emu, ED->dword[0]); + pthread_mutex_unlock(&my_context->mutex_lock); + if(MODREG) ED->dword[1] = 0; + } #endif break; default: -- cgit 1.4.1