diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2025-03-07 20:13:41 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2025-03-07 20:13:41 +0100 |
| commit | c2d02977f8565b0ba19149a7c283af5680c065e7 (patch) | |
| tree | 5dbcf62c1ec35cf9279188624dc0076a66527187 /src | |
| parent | 946c999e2593f902fe46005b39314f6659d0d7d5 (diff) | |
| download | box64-c2d02977f8565b0ba19149a7c283af5680c065e7.tar.gz box64-c2d02977f8565b0ba19149a7c283af5680c065e7.zip | |
Added F0 F7 /2 opcode ([ARM64_DYNAREC] too)
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_f0.c | 28 | ||||
| -rw-r--r-- | src/emu/x64runf0.c | 36 |
2 files changed, 64 insertions, 0 deletions
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 @@ -1167,6 +1167,42 @@ uintptr_t RunF0(x64emu_t *emu, rex_t rex, uintptr_t addr) 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: + return 0; + } + break; case 0xFE: /* GRP 5 Eb */ nextop = F8; |