diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-03-04 11:56:06 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-03-04 11:56:06 +0100 |
| commit | abb74f7f760050186127f33ef9bb708e7b62526f (patch) | |
| tree | b0a5d800ef63b9b1a6c7ab8ea082033f9dd3cb87 /src | |
| parent | ca9ca0ca48b9cd3b0d112c1adf5b7e6a5681e3ff (diff) | |
| download | box64-abb74f7f760050186127f33ef9bb708e7b62526f.tar.gz box64-abb74f7f760050186127f33ef9bb708e7b62526f.zip | |
Added REX 81/83 opcodes
Diffstat (limited to 'src')
| -rwxr-xr-x | src/emu/x64run.c | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/src/emu/x64run.c b/src/emu/x64run.c index 10ca8b10..66db0709 100755 --- a/src/emu/x64run.c +++ b/src/emu/x64run.c @@ -197,6 +197,42 @@ x64emurun: emu->regs[tmp8u].q[0] = Pop(emu); break; + case 0x81: /* GRP Ed,Id */ + case 0x83: /* GRP Ed,Ib */ + nextop = F8; + GETED; + if(opcode==0x81) { + tmp32s = F32S; + } else { + tmp32s = F8S; + } + if(rex.w) { + tmp64u = (uint64_t)tmp32s; + switch((nextop>>3)&7) { + case 0: ED->dword[0] = add64(emu, ED->dword[0], tmp64u); break; + case 1: ED->dword[0] = or64(emu, ED->dword[0], tmp64u); break; + case 2: ED->dword[0] = adc64(emu, ED->dword[0], tmp64u); break; + case 3: ED->dword[0] = sbb64(emu, ED->dword[0], tmp64u); break; + case 4: ED->dword[0] = and64(emu, ED->dword[0], tmp64u); break; + case 5: ED->dword[0] = sub64(emu, ED->dword[0], tmp64u); break; + case 6: ED->dword[0] = xor64(emu, ED->dword[0], tmp64u); break; + case 7: cmp64(emu, ED->dword[0], tmp64u); break; + } + } else { + tmp32u = (uint32_t)tmp32s; + switch((nextop>>3)&7) { + case 0: ED->dword[0] = add32(emu, ED->dword[0], tmp32u); break; + case 1: ED->dword[0] = or32(emu, ED->dword[0], tmp32u); break; + case 2: ED->dword[0] = adc32(emu, ED->dword[0], tmp32u); break; + case 3: ED->dword[0] = sbb32(emu, ED->dword[0], tmp32u); break; + case 4: ED->dword[0] = and32(emu, ED->dword[0], tmp32u); break; + case 5: ED->dword[0] = sub32(emu, ED->dword[0], tmp32u); break; + case 6: ED->dword[0] = xor32(emu, ED->dword[0], tmp32u); break; + case 7: cmp32(emu, ED->dword[0], tmp32u); break; + } + } + break; + case 0x89: /* MOV Ed,Gd */ nextop = F8; GETED; |