diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-07-09 17:08:50 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-07-09 17:08:50 +0200 |
| commit | 8ccde3ed4afc29e5187315b0a74b632b8acb0676 (patch) | |
| tree | 7771d3ead02f1cd18bdd08b0b1438c7abbc1a53e /src | |
| parent | b6ce8efa2019a58c7c43c9056230e242b3239f00 (diff) | |
| download | box64-8ccde3ed4afc29e5187315b0a74b632b8acb0676.tar.gz box64-8ccde3ed4afc29e5187315b0a74b632b8acb0676.zip | |
Added 66 0F BA opcodes (for #44)
Diffstat (limited to 'src')
| -rw-r--r-- | src/emu/x64run660f.c | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/src/emu/x64run660f.c b/src/emu/x64run660f.c index 3b1ab667..2ac797a2 100644 --- a/src/emu/x64run660f.c +++ b/src/emu/x64run660f.c @@ -1012,6 +1012,97 @@ int Run660F(x64emu_t *emu, rex_t rex) GW->word[0] = EB->byte[0]; break; + case 0xBA: + nextop = F8; + switch((nextop>>3)&7) { + case 4: /* BT Ew,Ib */ + CHECK_FLAGS(emu); + GETEW(0); + GETGW; + tmp8u = F8; + if(rex.w) { + tmp8u&=63; + if(ED->q[0] & (1LL<<tmp8u)) + SET_FLAG(F_CF); + else + CLEAR_FLAG(F_CF); + } else { + tmp8u&=15; + if(EW->word[0] & (1<<tmp8u)) + SET_FLAG(F_CF); + else + CLEAR_FLAG(F_CF); + } + break; + case 5: /* BTS Ew, Ib */ + CHECK_FLAGS(emu); + GETEW(0); + GETGW; + 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&=15; + if(EW->word[0] & (1<<tmp8u)) { + SET_FLAG(F_CF); + } else { + EW->word[0] ^= (1<<tmp8u); + CLEAR_FLAG(F_CF); + } + } + break; + case 6: /* BTR Ew, Ib */ + CHECK_FLAGS(emu); + GETEW(0); + GETGW; + 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&=15; + if(EW->word[0] & (1<<tmp8u)) { + SET_FLAG(F_CF); + EW->word[0] ^= (1<<tmp8u); + } else + CLEAR_FLAG(F_CF); + } + break; + case 7: /* BTC Ew, Ib */ + CHECK_FLAGS(emu); + GETEW(0); + GETGW; + 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&=15; + if(EW->word[0] & (1<<tmp8u)) + SET_FLAG(F_CF); + else + CLEAR_FLAG(F_CF); + EW->word[0] ^= (1<<tmp8u); + } + break; + default: + return 1; + } + break; case 0xBB: /* BTC Ew,Gw */ CHECK_FLAGS(emu); nextop = F8; |