diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-03-09 16:30:04 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-03-09 16:30:04 +0100 |
| commit | 5ce5951f5db4377b1c745ed71e69376e875ce93a (patch) | |
| tree | 4a77c2ad0dadaa3de0248db6226214343e04d942 /src | |
| parent | 09428c185eae97b64c3a68a2751bad09481c7f6f (diff) | |
| download | box64-5ce5951f5db4377b1c745ed71e69376e875ce93a.tar.gz box64-5ce5951f5db4377b1c745ed71e69376e875ce93a.zip | |
Added REX 0F BA opcodes
Diffstat (limited to 'src')
| -rw-r--r-- | src/emu/x64run0f.c | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/src/emu/x64run0f.c b/src/emu/x64run0f.c index f30b8906..e48c0eb6 100644 --- a/src/emu/x64run0f.c +++ b/src/emu/x64run0f.c @@ -498,6 +498,103 @@ int Run0F(x64emu_t *emu, rex_t rex) GD->q[0] = EW->word[0]; break; + case 0xBA: + nextop = F8; + switch((nextop>>3)&7) { + case 4: /* BT Ed,Ib */ + CHECK_FLAGS(emu); + GETED(1); + tmp8u = F8; + if(!MODREG) + ED=(reg64_t*)(((uintptr_t*)(ED))+(tmp8u>>5)); + if(rex.w) { + tmp8u&=63; + if(ED->q[0] & (1L<<tmp8u)) + SET_FLAG(F_CF); + else + CLEAR_FLAG(F_CF); + } else { + tmp8u&=31; + if(ED->dword[0] & (1<<tmp8u)) + SET_FLAG(F_CF); + else + CLEAR_FLAG(F_CF); + } + break; + case 5: /* BTS Ed, Ib */ + CHECK_FLAGS(emu); + GETED(1); + tmp8u = F8; + if(!MODREG) + ED=(reg64_t*)(((uintptr_t*)(ED))+(tmp8u>>5)); + if(rex.w) { + tmp8u&=63; + if(ED->q[0] & (1L<<tmp8u)) { + SET_FLAG(F_CF); + } else { + ED->q[0] ^= (1L<<tmp8u); + CLEAR_FLAG(F_CF); + } + } else { + tmp8u&=31; + if(ED->dword[0] & (1<<tmp8u)) { + SET_FLAG(F_CF); + } else { + ED->dword[0] ^= (1<<tmp8u); + CLEAR_FLAG(F_CF); + } + } + break; + case 6: /* BTR Ed, Ib */ + CHECK_FLAGS(emu); + GETED(1); + tmp8u = F8; + if(!MODREG) + ED=(reg64_t*)(((uintptr_t*)(ED))+(tmp8u>>5)); + if(rex.w) { + tmp8u&=63; + if(ED->q[0] & (1L<<tmp8u)) { + SET_FLAG(F_CF); + ED->q[0] ^= (1L<<tmp8u); + } else + CLEAR_FLAG(F_CF); + } else { + tmp8u&=31; + if(ED->dword[0] & (1<<tmp8u)) { + SET_FLAG(F_CF); + ED->dword[0] ^= (1<<tmp8u); + } else + CLEAR_FLAG(F_CF); + } + break; + case 7: /* BTC Ed, Ib */ + CHECK_FLAGS(emu); + GETED(1); + tmp8u = F8; + if(!MODREG) + ED=(reg64_t*)(((uintptr_t*)(ED))+(tmp8u>>5)); + if(rex.w) { + tmp8u&=63; + if(ED->q[0] & (1L<<tmp8u)) + SET_FLAG(F_CF); + else + CLEAR_FLAG(F_CF); + ED->q[0] ^= (1L<<tmp8u); + } else { + tmp8u&=31; + if(ED->dword[0] & (1<<tmp8u)) + SET_FLAG(F_CF); + else + CLEAR_FLAG(F_CF); + ED->dword[0] ^= (1<<tmp8u); + } + break; + + default: + return 1; + } + break; + case 0xBE: /* MOVSX Gd,Eb */ nextop = F8; GETEB(0); |