diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2023-12-18 15:56:38 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2023-12-18 15:56:38 +0100 |
| commit | 23542bbfeecf84bdc13ba2a4ba91adf8a2c3ed37 (patch) | |
| tree | cae1c85f94b7bc0774ef35f2b847ac13544adcc2 /src | |
| parent | ec65c26b3cdabbbf0afc96220b7aa37488f682af (diff) | |
| download | box64-23542bbfeecf84bdc13ba2a4ba91adf8a2c3ed37.tar.gz box64-23542bbfeecf84bdc13ba2a4ba91adf8a2c3ed37.zip | |
[INTERPRETER] Added 64/65 0F BA opcode (for #1146)
Diffstat (limited to 'src')
| -rw-r--r-- | src/emu/x64run64.c | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/src/emu/x64run64.c b/src/emu/x64run64.c index c39ff5e7..9a790cff 100644 --- a/src/emu/x64run64.c +++ b/src/emu/x64run64.c @@ -285,6 +285,101 @@ uintptr_t Run64(x64emu_t *emu, rex_t rex, int seg, uintptr_t addr) } break; + case 0xBA: + nextop = F8; + switch((nextop>>3)&7) { + case 4: /* BT Ed,Ib */ + CHECK_FLAGS(emu); + GETED_OFFS(1, tlsdata); + tmp8u = F8; + if(rex.w) { + tmp8u&=63; + if(ED->q[0] & (1LL<<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_OFFS(1, tlsdata); + tmp8u = F8; + if(rex.w) { + tmp8u&=63; + if(ED->q[0] & (1LL<<tmp8u)) { + SET_FLAG(F_CF); + } else { + ED->q[0] ^= (1LL<<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); + } + if(MODREG) + ED->dword[1] = 0; + } + break; + case 6: /* BTR Ed, Ib */ + CHECK_FLAGS(emu); + GETED_OFFS(1, tlsdata); + tmp8u = F8; + if(rex.w) { + tmp8u&=63; + if(ED->q[0] & (1LL<<tmp8u)) { + SET_FLAG(F_CF); + ED->q[0] ^= (1LL<<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); + if(MODREG) + ED->dword[1] = 0; + } + break; + case 7: /* BTC Ed, Ib */ + CHECK_FLAGS(emu); + GETED_OFFS(1, tlsdata); + tmp8u = F8; + if(rex.w) { + tmp8u&=63; + if(ED->q[0] & (1LL<<tmp8u)) + SET_FLAG(F_CF); + else + CLEAR_FLAG(F_CF); + ED->q[0] ^= (1LL<<tmp8u); + } else { + tmp8u&=31; + if(ED->dword[0] & (1<<tmp8u)) + SET_FLAG(F_CF); + else + CLEAR_FLAG(F_CF); + ED->dword[0] ^= (1<<tmp8u); + if(MODREG) + ED->dword[1] = 0; + } + break; + + default: + return 0; + } + break; + default: return 0; } |