diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-03-26 17:48:51 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-03-26 17:48:51 +0100 |
| commit | 2a85ea9c6111920c3d1d7be2c237596119b39933 (patch) | |
| tree | 9ac44609aecc8efe4d3e3a7d67ee9f452742f3c8 /src | |
| parent | 3ee5c792d154bf17fdf8706cca2c60c16de00c0f (diff) | |
| download | box64-2a85ea9c6111920c3d1d7be2c237596119b39933.tar.gz box64-2a85ea9c6111920c3d1d7be2c237596119b39933.zip | |
Added 64 66 0F D6 and 64 0F 29 opcodes
Diffstat (limited to 'src')
| -rw-r--r-- | src/emu/modrm.h | 1 | ||||
| -rw-r--r-- | src/emu/x64run64.c | 49 | ||||
| -rwxr-xr-x | src/emu/x64run_private.c | 8 | ||||
| -rwxr-xr-x | src/emu/x64run_private.h | 1 |
4 files changed, 59 insertions, 0 deletions
diff --git a/src/emu/modrm.h b/src/emu/modrm.h index f799bdfb..cf4a2039 100644 --- a/src/emu/modrm.h +++ b/src/emu/modrm.h @@ -24,6 +24,7 @@ #define GETEW_OFFS(D, O) oped=GetEdO(emu, rex, nextop, D, O) #define GETGW opgd=GetGw(emu, rex, nextop) #define GETEX(D) opex=GetEx(emu, rex, nextop, D) +#define GETEX_OFFS(D, O) opex=GetExO(emu, rex, nextop, D, O) #define GETGX opgx=GetGx(emu, rex, nextop) #define GETEM(D) opem=GetEm(emu, rex, nextop, D) #define GETGM opgm=GetGm(emu, rex, nextop) diff --git a/src/emu/x64run64.c b/src/emu/x64run64.c index efc90e75..003c65c3 100644 --- a/src/emu/x64run64.c +++ b/src/emu/x64run64.c @@ -33,6 +33,7 @@ int Run64(x64emu_t *emu, rex_t rex) uint32_t tmp32u; uint64_t tmp64u; reg64_t *oped, *opgd; + sse_regs_t *opex, *opgx; uintptr_t tlsdata = GetFSBaseEmu(emu); opcode = F8; @@ -45,6 +46,23 @@ int Run64(x64emu_t *emu, rex_t rex) switch(opcode) { + case 0x0F: + opcode = F8; + switch(opcode) { + + case 0x29: /* MOVAPS Ex,Gx */ + nextop = F8; + GETEX_OFFS(0, tlsdata); + GETGX; + EX->q[0] = GX->q[0]; + EX->q[1] = GX->q[1]; + break; + + default: + return 1; + } + break; + case 0x33: /* XOR Gd,Ed */ nextop = F8; GETED_OFFS(0, tlsdata); @@ -54,6 +72,37 @@ int Run64(x64emu_t *emu, rex_t rex) else GD->q[0] = xor32(emu, GD->dword[0], ED->dword[0]); break; + + case 0x66: + opcode = F8; + + while(opcode>=0x40 && opcode<=0x4F) { + rex.rex = opcode; + opcode = F8; + } + switch(opcode) { + case 0x0F: + opcode = F8; + switch(opcode) { + case 0xD6: /* MOVQ Ex,Gx */ + nextop = F8; + GETEX_OFFS(0, tlsdata); + GETGX; + EX->q[0] = GX->q[0]; + if(MODREG) + EX->q[1] = 0; + break; + + default: + return 1; + } + break; + + default: + return 1; + } + break; + case 0x81: /* GRP Ed,Id */ case 0x83: /* GRP Ed,Ib */ diff --git a/src/emu/x64run_private.c b/src/emu/x64run_private.c index 1ac3eec2..3b6691e6 100755 --- a/src/emu/x64run_private.c +++ b/src/emu/x64run_private.c @@ -1229,6 +1229,14 @@ sse_regs_t* GetEx(x64emu_t *emu, rex_t rex, uint8_t v, uint8_t delta) } else return (sse_regs_t*)GetECommon(emu, rex, m, delta); } +sse_regs_t* GetExO(x64emu_t *emu, rex_t rex, uint8_t v, uint8_t delta, uintptr_t offset) +{ + uint8_t m = v&0xC7; // filter Ed + if(m>=0xC0) { + return &emu->xmm[(m&0x07)+(rex.b<<3)]; + } else return (sse_regs_t*)GetECommonO(emu, rex, m, delta, offset); +} + reg64_t* GetGd(x64emu_t *emu, rex_t rex, uint8_t v) { diff --git a/src/emu/x64run_private.h b/src/emu/x64run_private.h index a027e398..49b8ff1a 100755 --- a/src/emu/x64run_private.h +++ b/src/emu/x64run_private.h @@ -86,6 +86,7 @@ reg64_t* GetEw16(x64emu_t *emu, rex_t rex, uint8_t v); reg64_t* GetEw16off(x64emu_t *emu, rex_t rex, uint8_t v, uintptr_t offset); mmx87_regs_t* GetEm(x64emu_t *emu, rex_t rex, uint8_t v, uint8_t delta); sse_regs_t* GetEx(x64emu_t *emu, rex_t rex, uint8_t v, uint8_t delta); +sse_regs_t* GetExO(x64emu_t *emu, rex_t rex, uint8_t v, uint8_t delta, uintptr_t offset); reg64_t* GetGd(x64emu_t *emu, rex_t rex, uint8_t v); #define GetGw GetGd reg64_t* GetGb(x64emu_t *emu, rex_t rex, uint8_t v); |