diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-07-27 13:28:46 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-07-27 13:28:46 +0200 |
| commit | e00d35f5bf90fec1f67c196d10bed40dc32211f3 (patch) | |
| tree | 39bd37aa78d3f78fe8b440b24db916c935810c98 /src/emu/x64run64.c | |
| parent | 790022483b8079c4ad0e74cb7a292ba86f391984 (diff) | |
| download | box64-e00d35f5bf90fec1f67c196d10bed40dc32211f3.tar.gz box64-e00d35f5bf90fec1f67c196d10bed40dc32211f3.zip | |
Added 64 F7 opcode ([DYNAREC] too) (for #73)
Diffstat (limited to 'src/emu/x64run64.c')
| -rw-r--r-- | src/emu/x64run64.c | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/src/emu/x64run64.c b/src/emu/x64run64.c index e6039c2b..c7cbbc4b 100644 --- a/src/emu/x64run64.c +++ b/src/emu/x64run64.c @@ -413,6 +413,77 @@ int Run64(x64emu_t *emu, rex_t rex, int seg) } break; + case 0xF7: /* GRP3 Ed(,Id) */ + nextop = F8; + tmp8u = (nextop>>3)&7; + GETED_OFFS((tmp8u<2)?4:0, tlsdata); + if(rex.w) { + switch(tmp8u) { + case 0: + case 1: /* TEST Ed,Id */ + tmp64u = F32S64; + test64(emu, ED->q[0], tmp64u); + break; + case 2: /* NOT Ed */ + ED->q[0] = not64(emu, ED->q[0]); + break; + case 3: /* NEG Ed */ + ED->q[0] = neg64(emu, ED->q[0]); + break; + case 4: /* MUL RAX,Ed */ + mul64_rax(emu, ED->q[0]); + break; + case 5: /* IMUL RAX,Ed */ + imul64_rax(emu, ED->q[0]); + break; + case 6: /* DIV Ed */ + div64(emu, ED->q[0]); + break; + case 7: /* IDIV Ed */ + idiv64(emu, ED->q[0]); + break; + } + } else { + switch(tmp8u) { + case 0: + case 1: /* TEST Ed,Id */ + tmp32u = F32; + test32(emu, ED->dword[0], tmp32u); + break; + case 2: /* NOT Ed */ + if(MODREG) + ED->q[0] = not32(emu, ED->dword[0]); + else + ED->dword[0] = not32(emu, ED->dword[0]); + break; + case 3: /* NEG Ed */ + if(MODREG) + ED->q[0] = neg32(emu, ED->dword[0]); + else + ED->dword[0] = neg32(emu, ED->dword[0]); + break; + case 4: /* MUL EAX,Ed */ + mul32_eax(emu, ED->dword[0]); + emu->regs[_AX].dword[1] = 0; + break; + case 5: /* IMUL EAX,Ed */ + imul32_eax(emu, ED->dword[0]); + emu->regs[_AX].dword[1] = 0; + break; + case 6: /* DIV Ed */ + div32(emu, ED->dword[0]); + //emu->regs[_AX].dword[1] = 0; // already put high regs to 0 + //emu->regs[_DX].dword[1] = 0; + break; + case 7: /* IDIV Ed */ + idiv32(emu, ED->dword[0]); + //emu->regs[_AX].dword[1] = 0; + //emu->regs[_DX].dword[1] = 0; + break; + } + } + break; + case 0xFF: /* GRP 5 Ed */ nextop = F8; GETED_OFFS(0, tlsdata); |