From f470fdcc90302531a83dfd75ffb6e1dcf409a3b1 Mon Sep 17 00:00:00 2001 From: ptitSeb Date: Tue, 24 Jun 2025 20:48:12 +0200 Subject: [INTERP] Added F0 BB and improved F0 BA /7 opcodes --- src/emu/x64runf0.c | 103 ++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 94 insertions(+), 9 deletions(-) diff --git a/src/emu/x64runf0.c b/src/emu/x64runf0.c index a25ce7f4..fd1d120f 100644 --- a/src/emu/x64runf0.c +++ b/src/emu/x64runf0.c @@ -670,15 +670,27 @@ uintptr_t RunF0(x64emu_t *emu, rex_t rex, uintptr_t addr) } while(tmp32s); } else { tmp8u&=31; - do { - tmp32u = native_lock_read_d(ED); - if(tmp32u & (1<>3)); + if(tmp32u & (1<<(tmp8u&7))) + SET_FLAG(F_CF); + else + CLEAR_FLAG(F_CF); + tmp32u ^= (1<<(tmp8u&7)); + tmp32s = native_lock_write_b(ED+(tmp8u>>3), tmp32u); + } while(tmp32s); + } else { + do { + tmp32u = native_lock_read_d(ED); + if(tmp32u & (1<mutex_lock); @@ -711,6 +723,79 @@ uintptr_t RunF0(x64emu_t *emu, rex_t rex, uintptr_t addr) return 0; } break; + case 0xBB: /* BTC Ed,Gd */ + CHECK_FLAGS(emu); + nextop = F8; + GETED(0); + GETGD; + tmp64s = rex.w?GD->sq[0]:GD->sdword[0]; + tmp8u=tmp64s&(rex.w?63:31); + tmp64s >>= (rex.w?6:5); + if(!MODREG) + { + #ifdef TEST_INTERPRETER + test->memaddr=((test->memaddr)+(tmp32s<<(rex.w?3:2))); + if(rex.w) + *(uint64_t*)test->mem = *(uint64_t*)test->memaddr; + else + *(uint32_t*)test->mem = *(uint32_t*)test->memaddr; + #else + ED=(reg64_t*)(((uintptr_t)(ED))+(tmp64s<<(rex.w?3:2))); + #endif + } + tmp8u&=rex.w?63:31; +#if defined(DYNAREC) && !defined(TEST_INTERPRETER) + if(rex.w) + do { + tmp64u = native_lock_read_dd(ED); + if(tmp64u & (1LL<dword[1] = 0; + } +#else + pthread_mutex_lock(&my_context->mutex_lock); + if(rex.w) { + if(ED->q[0] & (1<q[0] ^= (1<dword[0] & (1<dword[0] ^= (1<dword[1] = 0; + } + pthread_mutex_unlock(&my_context->mutex_lock); +#endif + if(BOX64ENV(dynarec_test)) { + CLEAR_FLAG(F_OF); + CLEAR_FLAG(F_SF); + CLEAR_FLAG(F_AF); + CLEAR_FLAG(F_PF); + } + break; case 0xC0: /* XADD Gb,Eb */ nextop = F8; -- cgit 1.4.1