diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-03-04 20:17:43 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-03-04 20:17:43 +0100 |
| commit | 50398acc97fefb99ab73798be3cd2751d3a2e998 (patch) | |
| tree | b9385a059ed9d07852323998a0aa9b516096ab5d | |
| parent | 2e81d8ba80bbd4beb7998f5900905d8f8f784a49 (diff) | |
| download | box64-50398acc97fefb99ab73798be3cd2751d3a2e998.tar.gz box64-50398acc97fefb99ab73798be3cd2751d3a2e998.zip | |
Added REX D1/D3 opcodes
| -rwxr-xr-x | src/emu/x64run.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/src/emu/x64run.c b/src/emu/x64run.c index 1eacb1a7..4dc8851d 100755 --- a/src/emu/x64run.c +++ b/src/emu/x64run.c @@ -406,6 +406,36 @@ x64emurun: if(emu->quit) goto fini; break; + case 0xD1: /* GRP2 Ed,1 */ + case 0xD3: /* GRP2 Ed,CL */ + nextop = F8; + GETED; + tmp8u = (opcode==0xD1)?1:R_CL; + if(rex.w) { + switch((nextop>>3)&7) { + case 0: ED->q[0] = rol64(emu, ED->q[0], tmp8u); break; + case 1: ED->q[0] = ror64(emu, ED->q[0], tmp8u); break; + case 2: ED->q[0] = rcl64(emu, ED->q[0], tmp8u); break; + case 3: ED->q[0] = rcr64(emu, ED->q[0], tmp8u); break; + case 4: + case 6: ED->q[0] = shl64(emu, ED->q[0], tmp8u); break; + case 5: ED->q[0] = shr64(emu, ED->q[0], tmp8u); break; + case 7: ED->q[0] = sar64(emu, ED->q[0], tmp8u); break; + } + } else { + switch((nextop>>3)&7) { + case 0: ED->dword[0] = rol32(emu, ED->dword[0], tmp8u); break; + case 1: ED->dword[0] = ror32(emu, ED->dword[0], tmp8u); break; + case 2: ED->dword[0] = rcl32(emu, ED->dword[0], tmp8u); break; + case 3: ED->dword[0] = rcr32(emu, ED->dword[0], tmp8u); break; + case 4: + case 6: ED->dword[0] = shl32(emu, ED->dword[0], tmp8u); break; + case 5: ED->dword[0] = shr32(emu, ED->dword[0], tmp8u); break; + case 7: ED->dword[0] = sar32(emu, ED->dword[0], tmp8u); break; + } + } + break; + case 0xE8: /* CALL Id */ tmp32s = F32S; // call is relative Push(emu, R_RIP); |