Add MMX and several other instructions

This commit is contained in:
Alexis Engelke
2019-11-03 11:56:24 +01:00
parent 2bf33017bc
commit 19b76c809e
3 changed files with 135 additions and 15 deletions

View File

@@ -616,6 +616,9 @@ fd_decode(const uint8_t* buffer, size_t len_sz, int mode_int, uintptr_t address,
if (reg_type == FD_RT_GPL && !(prefixes & PREFIX_REX) && if (reg_type == FD_RT_GPL && !(prefixes & PREFIX_REX) &&
instr->operands[i].size == 1 && reg_idx >= 4) instr->operands[i].size == 1 && reg_idx >= 4)
reg_type = FD_RT_GPH; reg_type = FD_RT_GPH;
// Fixup eager application of REX prefix
if ((reg_type == FD_RT_MMX || reg_type == FD_RT_SEG) && reg_idx >= 8)
instr->operands[i].reg -= 8;
// Reject invalid segment registers // Reject invalid segment registers
if (reg_type == FD_RT_SEG && reg_idx >= 6) if (reg_type == FD_RT_SEG && reg_idx >= 6)
return FD_ERR_UD; return FD_ERR_UD;

View File

@@ -290,9 +290,9 @@ fe/1 M GP - - - DEC SIZE_8 LOCK
ff/0 M GP - - - INC LOCK ff/0 M GP - - - INC LOCK
ff/1 M GP - - - DEC LOCK ff/1 M GP - - - DEC LOCK
ff/2 M GP - - - CALL_IND DEF64 ff/2 M GP - - - CALL_IND DEF64
#ff/3 CALLf TODO ff/3 M MEMZ - - - CALLF MUSTMEM
ff/4 M GP - - - JMP_IND DEF64 ff/4 M GP - - - JMP_IND DEF64
#ff/5 JMPf TODO ff/5 M MEMZ - - - JMPF MUSTMEM
ff/6 M GP - - - PUSH DEF64 ff/6 M GP - - - PUSH DEF64
0f00/0 M GP16 - - - SLDT 0f00/0 M GP16 - - - SLDT
0f00/1 M GP16 - - - STR 0f00/1 M GP16 - - - STR
@@ -327,8 +327,14 @@ ff/6 M GP - - - PUSH DEF64
0f08 NP - - - - INVD 0f08 NP - - - - INVD
0f09 NP - - - - WBINVD 0f09 NP - - - - WBINVD
0f0b NP - - - - UD2 0f0b NP - - - - UD2
0f0d/0 M GP8 - - - PREFETCH MUSTMEM
0f0d/1 M GP8 - - - PREFETCHW MUSTMEM 0f0d/1 M GP8 - - - PREFETCHW MUSTMEM
0f0d/2 M GP8 - - - PREFETCHWT1 MUSTMEM 0f0d/2 M GP8 - - - PREFETCHWT1 MUSTMEM
0f0d/3 M GP8 - - - RESERVED_PREFETCH MUSTMEM
0f0d/4 M GP8 - - - RESERVED_PREFETCH MUSTMEM
0f0d/5 M GP8 - - - RESERVED_PREFETCH MUSTMEM
0f0d/6 M GP8 - - - RESERVED_PREFETCH MUSTMEM
0f0d/7 M GP8 - - - RESERVED_PREFETCH MUSTMEM
0f18/0 M GP8 - - - PREFETCHNTA MUSTMEM 0f18/0 M GP8 - - - PREFETCHNTA MUSTMEM
0f18/1 M GP8 - - - PREFETCH0 MUSTMEM 0f18/1 M GP8 - - - PREFETCH0 MUSTMEM
0f18/2 M GP8 - - - PREFETCH1 MUSTMEM 0f18/2 M GP8 - - - PREFETCH1 MUSTMEM
@@ -443,6 +449,108 @@ RNP.0f38f0 RM GP GP - - MOVBE MUSTMEM
RF2.0f38f0 RM GP GP8 - - CRC32 RF2.0f38f0 RM GP GP8 - - CRC32
RNP.0f38f1 MR GP GP - - MOVBE MUSTMEM RNP.0f38f1 MR GP GP - - MOVBE MUSTMEM
RF2.0f38f1 MR GP GP - - CRC32 RF2.0f38f1 MR GP GP - - CRC32
#
# MMX
NP.0f2a RM XMM64 MMX - - MMX_CVTPI2PS
66.0f2a RM XMM MMX - - MMX_CVTPI2PD
NP.0f2c RM MMX XMM64 - - MMX_CVTTPS2PI
66.0f2c RM MMX XMM - - MMX_CVTTPD2PI
NP.0f2d RM MMX XMM64 - - MMX_CVTPS2PI
66.0f2d RM MMX XMM - - MMX_CVTPD2PI
NP.0f60 RM MMX MMX - - MMX_PUNPCKLBW
NP.0f61 RM MMX MMX - - MMX_PUNPCKLWD
NP.0f62 RM MMX MMX - - MMX_PUNPCKLDQ
NP.0f63 RM MMX MMX - - MMX_PACKSSWB
NP.0f64 RM MMX MMX - - MMX_PCMPGTB
NP.0f65 RM MMX MMX - - MMX_PCMPGTW
NP.0f66 RM MMX MMX - - MMX_PCMPGTD
NP.0f67 RM MMX MMX - - MMX_PACKUSWB
NP.0f68 RM MMX MMX - - MMX_PUNPCKHBW
NP.0f69 RM MMX MMX - - MMX_PUNPCKHWD
NP.0f6a RM MMX MMX - - MMX_PUNPCKHDQ
NP.0f6b RM MMX MMX - - MMX_PACKSSDW
NP.W0.0f6e RM MMX GP - - MMX_MOVD_G2X
NP.W1.0f6e RM MMX GP - - MMX_MOVQ_G2X
NP.0f6f RM MMX MMX - - MMX_MOVQ_X2X
NP.0f71/2 MI MMX IMM8 - - MMX_PSRLW IMM_8 NOMEM
NP.0f71/4 MI MMX IMM8 - - MMX_PSRAW IMM_8 NOMEM
NP.0f71/6 MI MMX IMM8 - - MMX_PSLLW IMM_8 NOMEM
NP.0f72/2 MI MMX IMM8 - - MMX_PSRLD IMM_8 NOMEM
NP.0f72/4 MI MMX IMM8 - - MMX_PSRAD IMM_8 NOMEM
NP.0f72/6 MI MMX IMM8 - - MMX_PSLLD IMM_8 NOMEM
NP.0f73/2 MI MMX IMM8 - - MMX_PSRLQ IMM_8 NOMEM
NP.0f73/6 MI MMX IMM8 - - MMX_PSLLQ IMM_8 NOMEM
NP.0f74 RM MMX MMX - - MMX_PCMPEQB
NP.0f75 RM MMX MMX - - MMX_PCMPEQW
NP.0f76 RM MMX MMX - - MMX_PCMPEQD
NP.0f77 NP - - - - MMX_EMMS
NP.W0.0f7e MR GP MMX - - MMX_MOVD_X2G
NP.W1.0f7e MR GP MMX - - MMX_MOVQ_X2G
NP.0f7f MR MMX MMX - - MMX_MOVQ_X2X
NP.0fc4 RMI MMX GP IMM8 - MMX_PINSRW IMM_8
NP.0fc5 RMI GP MMX IMM8 - MMX_PEXTRW IMM_8 NOMEM
NP.0fd1 RM MMX MMX - - MMX_PSRLW
NP.0fd2 RM MMX MMX - - MMX_PSRLD
NP.0fd3 RM MMX MMX - - MMX_PSRLQ
NP.0fd4 RM MMX MMX - - MMX_PADDQ
NP.0fd5 RM MMX MMX - - MMX_PMULLW
F2.0fd6 RM MMX XMM64 - - MMX_MOVDQ2Q
F3.0fd6 RM XMM MMX - - MMX_MOVQ2DQ
NP.0fd7 RM GP MMX - - MMX_PMOVMSKB DEF64 NOMEM
NP.0fd8 RM MMX MMX - - MMX_PSUBUSB
NP.0fd9 RM MMX MMX - - MMX_PSUBUSW
NP.0fda RM MMX MMX - - MMX_PMINUB
NP.0fdb RM MMX MMX - - MMX_PAND
NP.0fdc RM MMX MMX - - MMX_PADDUSB
NP.0fdd RM MMX MMX - - MMX_PADDUSW
NP.0fde RM MMX MMX - - MMX_PMAXUB
NP.0fdf RM MMX MMX - - MMX_PANDN
NP.0fe0 RM MMX MMX - - MMX_PAVGB
NP.0fe1 RM MMX MMX - - MMX_PSRAW
NP.0fe2 RM MMX MMX - - MMX_PSRAD
NP.0fe3 RM MMX MMX - - MMX_PAVGW
NP.0fe4 RM MMX MMX - - MMX_PMULHUW
NP.0fe5 RM MMX MMX - - MMX_PMULHW
NP.0fe7 MR MMX MMX - - MMX_MOVNTDQ MUSTMEM
NP.0fe8 RM MMX MMX - - MMX_PSUBSB
NP.0fe9 RM MMX MMX - - MMX_PSUBSW
NP.0feb RM MMX MMX - - MMX_POR
NP.0fec RM MMX MMX - - MMX_PADDSB
NP.0fea RM MMX MMX - - MMX_PMINSW
NP.0fee RM MMX MMX - - MMX_PMAXSW
NP.0fed RM MMX MMX - - MMX_PADDSW
NP.0fef RM MMX MMX - - MMX_PXOR
NP.0ff1 RM MMX MMX - - MMX_PSLLW
NP.0ff2 RM MMX MMX - - MMX_PSLLD
NP.0ff3 RM MMX MMX - - MMX_PSLLQ
NP.0ff4 RM MMX MMX - - MMX_PMULUDQ
NP.0ff5 RM MMX MMX - - MMX_PMADDWD
NP.0ff6 RM MMX MMX - - MMX_PSADBW
NP.0ff7 RM MMX MMX - - MMX_MASKMOVQ NOMEM
NP.0ff8 RM MMX MMX - - MMX_PSUBB
NP.0ff9 RM MMX MMX - - MMX_PSUBW
NP.0ffa RM MMX MMX - - MMX_PSUBD
NP.0ffb RM MMX MMX - - MMX_PSUBQ
NP.0ffc RM MMX MMX - - MMX_PADDB
NP.0ffd RM MMX MMX - - MMX_PADDW
NP.0ffe RM MMX MMX - - MMX_PADDD
NP.0f3800 RM MMX MMX - - MMX_PSHUFB
NP.0f3801 RM MMX MMX - - MMX_PHADDW
NP.0f3802 RM MMX MMX - - MMX_PHADDD
NP.0f3803 RM MMX MMX - - MMX_PHADDSW
NP.0f3804 RM MMX MMX - - MMX_PMADDUBSW
NP.0f3805 RM MMX MMX - - MMX_PHSUBW
NP.0f3806 RM MMX MMX - - MMX_PHSUBD
NP.0f3807 RM MMX MMX - - MMX_PHSUBSW
NP.0f3808 RM MMX MMX - - MMX_PSIGNB
NP.0f3809 RM MMX MMX - - MMX_PSIGNW
NP.0f380a RM MMX MMX - - MMX_PSIGND
NP.0f380b RM MMX MMX - - MMX_PMULHRSW
NP.0f381c RM MMX MMX - - MMX_PABSB
NP.0f381d RM MMX MMX - - MMX_PABSW
NP.0f381e RM MMX MMX - - MMX_PABSD
NP.0f3a0f RMI MMX MMX IMM - MMX_PALIGNR SIZE_8 IMM_8
# #
# SSE # SSE
NP.0f10 RM XMM XMM - - SSE_MOVUPS NP.0f10 RM XMM XMM - - SSE_MOVUPS
@@ -599,7 +707,7 @@ F2.0fd0 RM XMM XMM - - SSE_ADDSUBPS
66.0fd4 RM XMM XMM - - SSE_PADDQ 66.0fd4 RM XMM XMM - - SSE_PADDQ
66.0fd5 RM XMM XMM - - SSE_PMULLW 66.0fd5 RM XMM XMM - - SSE_PMULLW
66.0fd6 MR XMM64 XMM64 - - SSE_MOVQ_X2X 66.0fd6 MR XMM64 XMM64 - - SSE_MOVQ_X2X
66.0fd7 RM GP XMM - - SSE_PMOVMSKB DEF64 66.0fd7 RM GP XMM - - SSE_PMOVMSKB DEF64 NOMEM
66.0fd8 RM XMM XMM - - SSE_PSUBUSB 66.0fd8 RM XMM XMM - - SSE_PSUBUSB
66.0fd9 RM XMM XMM - - SSE_PSUBUSW 66.0fd9 RM XMM XMM - - SSE_PSUBUSW
66.0fda RM XMM XMM - - SSE_PMINUB 66.0fda RM XMM XMM - - SSE_PMINUB
@@ -1282,25 +1390,33 @@ F3.0fc7//6 M MEMZ - - - VMXON MUSTMEM
F3.0fae//f0+ O GP - - - UMONITOR F3.0fae//f0+ O GP - - - UMONITOR
F2.0fae//f0+ O GP32 - - - UMWAIT F2.0fae//f0+ O GP32 - - - UMWAIT
# PRWRITE
F3.0fae//4 M GP - - - PTWRITE
# GFNI
66.0f38cf RM XMM XMM - - GF2P8MULB
66.0f3ace RMI XMM XMM IMM8 - GF2P8AFFINEQB IMM_8
66.0f3acf RMI XMM XMM IMM8 - GF2P8AFFINEINVQB IMM_8
NP.0f01//ee NP - - - - RDPKRU NP.0f01//ee NP - - - - RDPKRU
NP.0f01//ef NP - - - - WRPKRU NP.0f01//ef NP - - - - WRPKRU
F3.0fae//0 M GP - - - RDFSBASE ONLY64 F3.0fae//0 M GP - - - RDFSBASE ONLY64 NOMEM
F3.0fae//1 M GP - - - RDGSBASE ONLY64 F3.0fae//1 M GP - - - RDGSBASE ONLY64 NOMEM
F3.0fae//2 M GP - - - RDFSBASE ONLY64 F3.0fae//2 M GP - - - RDFSBASE ONLY64 NOMEM
F3.0fae//3 M GP - - - RDGSBASE ONLY64 F3.0fae//3 M GP - - - RDGSBASE ONLY64 NOMEM
NP.0fae//4 M MEMZ - - - XSAVE INSTR_WIDTH NP.0fae//4 M MEMZ - - - XSAVE INSTR_WIDTH MUSTMEM
NP.0fae//5 M MEMZ - - - XRSTOR INSTR_WIDTH NP.0fae//5 M MEMZ - - - XRSTOR INSTR_WIDTH MUSTMEM
NP.0fae//6 M MEMZ - - - XSAVEOPT INSTR_WIDTH NP.0fae//6 M MEMZ - - - XSAVEOPT INSTR_WIDTH MUSTMEM
66.0fae//6 M GP8 - - - CLWB MUSTMEM 66.0fae//6 M GP8 - - - CLWB MUSTMEM
NP.0fae//7 M GP8 - - - CLFLUSH NP.0fae//7 M GP8 - - - CLFLUSH MUSTMEM
66.0fae//7 M GP8 - - - CLFLUSHOPT 66.0fae//7 M GP8 - - - CLFLUSHOPT MUSTMEM
NP.0fc7//3 M MEMZ - - - XRSTORS INSTR_WIDTH MUSTMEM NP.0fc7//3 M MEMZ - - - XRSTORS INSTR_WIDTH MUSTMEM
NP.0fc7//4 M MEMZ - - - XSAVEC INSTR_WIDTH MUSTMEM NP.0fc7//4 M MEMZ - - - XSAVEC INSTR_WIDTH MUSTMEM
NP.0fc7//5 M MEMZ - - - XSAVES INSTR_WIDTH MUSTMEM NP.0fc7//5 M MEMZ - - - XSAVES INSTR_WIDTH MUSTMEM
RNP.0fc7//f0+ O GP - - - RDRAND RNP.0fc7//f0+ O GP - - - RDRAND
RNP.0fc7//f8+ O GP - - - RDSEED RNP.0fc7//f8+ O GP - - - RDSEED
RF3.0fc7//f8+ O GP - - - RDPID DEF64 RF3.0fc7//f8+ O GP - - - RDPID DEF64
66.0f3882 RM GP MEMZ - - INVPCID DEF64 66.0f3882 RM GP MEMZ - - INVPCID DEF64 MUSTMEM
NP.0f38c8 RM XMM XMM - - SHA1NEXTE NP.0f38c8 RM XMM XMM - - SHA1NEXTE
NP.0f38c9 RM XMM XMM - - SHA1MSG1 NP.0f38c9 RM XMM XMM - - SHA1MSG1
NP.0f38ca RM XMM XMM - - SHA1MSG2 NP.0f38ca RM XMM XMM - - SHA1MSG2
@@ -1309,11 +1425,11 @@ NP.0f38cc RM XMM XMM - - SHA256MSG1
NP.0f38cd RM XMM XMM - - SHA256MSG2 NP.0f38cd RM XMM XMM - - SHA256MSG2
NP.0f3acc RMI XMM XMM IMM8 - SHA1RNDS4 IMM_8 NP.0f3acc RMI XMM XMM IMM8 - SHA1RNDS4 IMM_8
NP.0f1a RM BND MEMZ - - BNDLDX NP.0f1a RM BND MEMZ - - BNDLDX MUSTMEM
66.0f1a RM BND BND - - BNDMOV DEF64 66.0f1a RM BND BND - - BNDMOV DEF64
F2.0f1a RM BND GP - - BNDCU DEF64 F2.0f1a RM BND GP - - BNDCU DEF64
F3.0f1a RM BND GP - - BNDCL DEF64 F3.0f1a RM BND GP - - BNDCL DEF64
NP.0f1b MR MEMZ BND - - BNDSTX NP.0f1b MR MEMZ BND - - BNDSTX MUSTMEM
66.0f1b MR BND BND - - BNDMOV DEF64 66.0f1b MR BND BND - - BNDMOV DEF64
F2.0f1b RM BND GP - - BNDCN DEF64 F2.0f1b RM BND GP - - BNDCN DEF64
F3.0f1b RM BND MEMZ - - BNDMK F3.0f1b RM BND MEMZ - - BNDMK

View File

@@ -84,6 +84,7 @@ OPKIND_LOOKUP = {
"GP16": (1, 1, 1), "GP16": (1, 1, 1),
"GP32": (1, 2, 1), "GP32": (1, 2, 1),
"GP64": (1, 3, 1), "GP64": (1, 3, 1),
"MMX": (1, 3, 5),
"XMM": (3, 0, 6), "XMM": (3, 0, 6),
"XMM8": (1, 0, 6), "XMM8": (1, 0, 6),
"XMM16": (1, 1, 6), "XMM16": (1, 1, 6),