diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-03-13 10:45:20 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-03-13 10:45:20 +0100 |
| commit | 4ce40ad239b2d172f18f2c016db8251b9adc6223 (patch) | |
| tree | 107418779051e86ba2b365e97509c94e41e77efb /src | |
| parent | ca345d7f55135ac698106b8a9a835ddc8ea10d1b (diff) | |
| download | box64-4ce40ad239b2d172f18f2c016db8251b9adc6223.tar.gz box64-4ce40ad239b2d172f18f2c016db8251b9adc6223.zip | |
Added a few opcodes
Diffstat (limited to 'src')
| -rw-r--r-- | src/emu/x64run64.c | 51 | ||||
| -rw-r--r-- | src/emu/x64run660f.c | 54 |
2 files changed, 105 insertions, 0 deletions
diff --git a/src/emu/x64run64.c b/src/emu/x64run64.c index b0e70a0c..20c087ac 100644 --- a/src/emu/x64run64.c +++ b/src/emu/x64run64.c @@ -33,6 +33,9 @@ int Run64(x64emu_t *emu, rex_t rex) uint8_t tmp8u; int16_t tmp16s; uint16_t tmp16u; + int32_t tmp32s; + uint32_t tmp32u; + uint64_t tmp64u; reg64_t *oped, *opgd; uintptr_t tlsdata = GetFSBaseEmu(emu); @@ -56,6 +59,54 @@ int Run64(x64emu_t *emu, rex_t rex) GD->q[0] = xor32(emu, GD->dword[0], ED->dword[0]); break; + case 0x81: /* GRP Ed,Id */ + case 0x83: /* GRP Ed,Ib */ + nextop = F8; + GETED_OFFS((opcode==0x81)?4:1, tlsdata); + if(opcode==0x81) { + tmp32s = F32S; + } else { + tmp32s = F8S; + } + if(rex.w) { + tmp64u = (uint64_t)tmp32s; + switch((nextop>>3)&7) { + case 0: ED->q[0] = add64(emu, ED->q[0], tmp64u); break; + case 1: ED->q[0] = or64(emu, ED->q[0], tmp64u); break; + case 2: ED->q[0] = adc64(emu, ED->q[0], tmp64u); break; + case 3: ED->q[0] = sbb64(emu, ED->q[0], tmp64u); break; + case 4: ED->q[0] = and64(emu, ED->q[0], tmp64u); break; + case 5: ED->q[0] = sub64(emu, ED->q[0], tmp64u); break; + case 6: ED->q[0] = xor64(emu, ED->q[0], tmp64u); break; + case 7: cmp64(emu, ED->q[0], tmp64u); break; + } + } else { + tmp32u = (uint32_t)tmp32s; + if(MODREG) + switch((nextop>>3)&7) { + case 0: ED->q[0] = add32(emu, ED->dword[0], tmp32u); break; + case 1: ED->q[0] = or32(emu, ED->dword[0], tmp32u); break; + case 2: ED->q[0] = adc32(emu, ED->dword[0], tmp32u); break; + case 3: ED->q[0] = sbb32(emu, ED->dword[0], tmp32u); break; + case 4: ED->q[0] = and32(emu, ED->dword[0], tmp32u); break; + case 5: ED->q[0] = sub32(emu, ED->dword[0], tmp32u); break; + case 6: ED->q[0] = xor32(emu, ED->dword[0], tmp32u); break; + case 7: cmp32(emu, ED->dword[0], tmp32u); break; + } + else + 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 0x88: /* MOV Eb,Gb */ nextop = F8; GETEB_OFFS(0, tlsdata); diff --git a/src/emu/x64run660f.c b/src/emu/x64run660f.c index b2e21c32..d23a9755 100644 --- a/src/emu/x64run660f.c +++ b/src/emu/x64run660f.c @@ -960,6 +960,60 @@ int Run660F(x64emu_t *emu, rex_t rex) {tmp8u=EX->q[0]; for (int i=0; i<2; ++i) GX->q[i] <<= tmp8u;} break; + case 0xF8: /* PSUBB Gx,Ex */ + nextop = F8; + GETEX(0); + GETGX; + for(int i=0; i<16; ++i) + GX->sb[i] -= EX->sb[i]; + break; + case 0xF9: /* PSUBW Gx,Ex */ + nextop = F8; + GETEX(0); + GETGX; + for(int i=0; i<8; ++i) + GX->sw[i] -= EX->sw[i]; + break; + case 0xFA: /* PSUBD Gx,Ex */ + nextop = F8; + GETEX(0); + GETGX; + GX->sd[0] -= EX->sd[0]; + GX->sd[1] -= EX->sd[1]; + GX->sd[2] -= EX->sd[2]; + GX->sd[3] -= EX->sd[3]; + break; + case 0xFB: /* PSUBQ Gx,Ex */ + nextop = F8; + GETEX(0); + GETGX; + GX->sq[0] -= EX->sq[0]; + GX->sq[1] -= EX->sq[1]; + break; + case 0xFC: /* PADDB Gx,Ex */ + nextop = F8; + GETEX(0); + GETGX; + for(int i=0; i<16; ++i) + GX->sb[i] += EX->sb[i]; + break; + case 0xFD: /* PADDW Gx,Ex */ + nextop = F8; + GETEX(0); + GETGX; + for(int i=0; i<8; ++i) + GX->sw[i] += EX->sw[i]; + break; + case 0xFE: /* PADDD Gx,Ex */ + nextop = F8; + GETEX(0); + GETGX; + GX->sd[0] += EX->sd[0]; + GX->sd[1] += EX->sd[1]; + GX->sd[2] += EX->sd[2]; + GX->sd[3] += EX->sd[3]; + break; + default: return 1; } |