diff --git a/decode.c b/decode.c index 643547c..417a0ab 100644 --- a/decode.c +++ b/decode.c @@ -371,19 +371,10 @@ fd_decode(const uint8_t* buffer, size_t len_sz, int mode_int, uintptr_t address, // Then, walk through ModR/M-encoded opcode extensions. if ((kind == ENTRY_TABLE8 || kind == ENTRY_TABLE72) && LIKELY(off < len)) { - uint16_t entry = 0; if (kind == ENTRY_TABLE72 && (buffer[off] & 0xc0) == 0xc0) - { - entry = table[buffer[off] - 0xb8]; - if ((entry & ENTRY_MASK) != ENTRY_NONE) - off++; - else - entry = table[(buffer[off] >> 3) & 7]; - } + ENTRY_UNPACK(table, kind, table[buffer[off++] - 0xb8]); else - entry = table[(buffer[off] >> 3) & 7]; - - ENTRY_UNPACK(table, kind, entry); + ENTRY_UNPACK(table, kind, table[(buffer[off] >> 3) & 7]); } // Handle mandatory prefixes (which behave like an opcode ext.). diff --git a/instrs.txt b/instrs.txt index 5c6926d..239e8aa 100644 --- a/instrs.txt +++ b/instrs.txt @@ -199,8 +199,10 @@ c3 NP - - - - RET DEF64 INSTR_WIDTH c4 RM GP MEMZ - - LES ONLY32 MUSTMEM c5 RM GP MEMZ - - LDS ONLY32 MUSTMEM c6//0 MI GP IMM - - MOV SIZE_8 IMM_8 +c6//c0+ OI GP IMM - - MOV SIZE_8 IMM_8 c6//f8 I IMM - - - XABORT IMM_8 c7//0 MI GP IMM - - MOV +c7//c0+ OI GP IMM - - MOV c7//f8 D IMM - - - XBEGIN # ENTER immediate handled in code c8 I IMM32 - - - ENTER DEF64 INSTR_WIDTH @@ -302,13 +304,13 @@ ff/6 M GP - - - PUSH DEF64 0f00/3 M GP16 - - - LTR 0f00/4 M GP - - - VERR 0f00/5 M GP - - - VERW -0f01//0 M MEMZ - - - SGDT MUSTMEM -0f01//1 M MEMZ - - - SIDT MUSTMEM -0f01//2 M MEMZ - - - LGDT MUSTMEM -0f01//3 M MEMZ - - - LIDT MUSTMEM -0f01//4 M GP16 - - - SMSW INSTR_WIDTH +0f01//0 M MEMZ - - - SGDT +0f01//1 M MEMZ - - - SIDT +0f01//2 M MEMZ - - - LGDT +0f01//3 M MEMZ - - - LIDT +0f01//4 M GP16 - - - SMSW 0f01//6 M GP16 - - - LMSW -0f01//7 M GP - - - INVLPG SIZE_8 MUSTMEM +0f01//7 M GP - - - INVLPG SIZE_8 0f01//c8 NP - - - - MONITOR 0f01//c9 NP - - - - MWAIT 0f01//ca NP - - - - CLAC @@ -319,6 +321,8 @@ ff/6 M GP - - - PUSH DEF64 0f01//d5 NP - - - - XEND 0f01//d6 NP - - - - XTEST 0f01//d7 NP - - - - ENCLU +0f01//e0+ O GP - - - SMSW +0f01//f0+ O GP16 - - - LMSW 0f01//f8 NP - - - - SWAPGS ONLY64 0f01//f9 NP - - - - RDTSCP 0f02 RM GP GP16 - - LAR @@ -338,10 +342,10 @@ RF3.0f09 NP - - - - WBINVD 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//1 M GP8 - - - PREFETCHT0 MUSTMEM -0f18//2 M GP8 - - - PREFETCHT1 MUSTMEM -0f18//3 M GP8 - - - PREFETCHT2 MUSTMEM +0f18//0 M GP8 - - - PREFETCHNTA +0f18//1 M GP8 - - - PREFETCHT0 +0f18//2 M GP8 - - - PREFETCHT1 +0f18//3 M GP8 - - - PREFETCHT2 0f18//4 M GP - - - RESERVED_NOP 0f18//5 M GP - - - RESERVED_NOP 0f18//6 M GP - - - RESERVED_NOP @@ -350,6 +354,10 @@ RF3.0f09 NP - - - - WBINVD 0f18//c8+ O GP - - - RESERVED_NOP 0f18//d0+ O GP - - - RESERVED_NOP 0f18//d8+ O GP - - - RESERVED_NOP +0f18//e0+ O GP - - - RESERVED_NOP +0f18//e8+ O GP - - - RESERVED_NOP +0f18//f0+ O GP - - - RESERVED_NOP +0f18//f8+ O GP - - - RESERVED_NOP 0f1f M GP - - - NOP 0f20 MR GP32 CR - - MOV_CR ONLY32 0f20 MR GP64 CR - - MOV_CR ONLY64 DEF64 @@ -454,7 +462,7 @@ RF3.0fbd RM GP GP - - LZCNT 0fc0 MR GP GP - - XADD SIZE_8 LOCK 0fc1 MR GP GP - - XADD LOCK NP.0fc3 MR GP GP - - MOVNTI MUSTMEM -0fc7//1 M MEMZ - - - CMPXCHGD LOCK MUSTMEM +0fc7//1 M MEMZ - - - CMPXCHGD LOCK 0fc8+ O GP - - - BSWAP 0fff RM GP GP - - UD0 # @@ -697,10 +705,10 @@ F2.0f7d RM XMM XMM - - SSE_HSUBPS F3.0f7e RM XMM64 XMM64 - - SSE_MOVQ 66.0f7f MR XMM XMM - - SSE_MOVDQA F3.0f7f MR XMM XMM - - SSE_MOVDQU -NP.0fae//0 M MEMZ - - - FXSAVE MUSTMEM -NP.0fae//1 M MEMZ - - - FXRSTOR MUSTMEM -NP.0fae//2 M GP32 - - - LDMXCSR MUSTMEM -NP.0fae//3 M GP32 - - - STMXCSR MUSTMEM +NP.0fae//0 M MEMZ - - - FXSAVE +NP.0fae//1 M MEMZ - - - FXRSTOR +NP.0fae//2 M GP32 - - - LDMXCSR +NP.0fae//3 M GP32 - - - STMXCSR NP.0fae//e8+ NP - - - - LFENCE NP.0fae//f0+ NP - - - - MFENCE NP.0fae//f8+ NP - - - - SFENCE @@ -963,16 +971,16 @@ VEX.F3.0f6f RM XMM XMM - - VMOVDQU VEX.66.0f70 RMI XMM XMM IMM8 - VPSHUFD IMM_8 VEX.F3.0f70 RMI XMM XMM IMM8 - VPSHUFHW IMM_8 VEX.F2.0f70 RMI XMM XMM IMM8 - VPSHUFLW IMM_8 -VEX.66.0f71/2 VMI XMM XMM IMM8 - VPSRLW IMM_8 -VEX.66.0f71/4 VMI XMM XMM IMM8 - VPSRAW IMM_8 -VEX.66.0f71/6 VMI XMM XMM IMM8 - VPSLLW IMM_8 -VEX.66.0f72/2 VMI XMM XMM IMM8 - VPSRLD IMM_8 -VEX.66.0f72/4 VMI XMM XMM IMM8 - VPSRAD IMM_8 -VEX.66.0f72/6 VMI XMM XMM IMM8 - VPSLLD IMM_8 -VEX.66.0f73/2 VMI XMM XMM IMM8 - VPSRLQ IMM_8 -VEX.66.0f73/3 VMI XMM XMM IMM8 - VPSRLDQ IMM_8 -VEX.66.0f73/6 VMI XMM XMM IMM8 - VPSLLQ IMM_8 -VEX.66.0f73/7 VMI XMM XMM IMM8 - VPSLLDQ IMM_8 +VEX.66.0f71/2 VMI XMM XMM IMM8 - VPSRLW IMM_8 NOMEM +VEX.66.0f71/4 VMI XMM XMM IMM8 - VPSRAW IMM_8 NOMEM +VEX.66.0f71/6 VMI XMM XMM IMM8 - VPSLLW IMM_8 NOMEM +VEX.66.0f72/2 VMI XMM XMM IMM8 - VPSRLD IMM_8 NOMEM +VEX.66.0f72/4 VMI XMM XMM IMM8 - VPSRAD IMM_8 NOMEM +VEX.66.0f72/6 VMI XMM XMM IMM8 - VPSLLD IMM_8 NOMEM +VEX.66.0f73/2 VMI XMM XMM IMM8 - VPSRLQ IMM_8 NOMEM +VEX.66.0f73/3 VMI XMM XMM IMM8 - VPSRLDQ IMM_8 NOMEM +VEX.66.0f73/6 VMI XMM XMM IMM8 - VPSLLQ IMM_8 NOMEM +VEX.66.0f73/7 VMI XMM XMM IMM8 - VPSLLDQ IMM_8 NOMEM VEX.66.0f74 RVM XMM XMM XMM - VPCMPEQB VEX.66.0f75 RVM XMM XMM XMM - VPCMPEQW VEX.66.0f76 RVM XMM XMM XMM - VPCMPEQD @@ -1249,14 +1257,14 @@ VEX.F3.L0.0f38f7 RMV GP GP GP - SARX F3.0f38f6 RM GP GP - - ADOX # # FPU -d8//0 M FPU - - - FADD_F32 MUSTMEM -d8//1 M FPU - - - FMUL_F32 MUSTMEM -d8//2 M FPU - - - FCOM_F32 MUSTMEM -d8//3 M FPU - - - FCOMP_F32 MUSTMEM -d8//4 M FPU - - - FSUB_F32 MUSTMEM -d8//5 M FPU - - - FSUBR_F32 MUSTMEM -d8//6 M FPU - - - FDIV_F32 MUSTMEM -d8//7 M FPU - - - FDIVR_F32 MUSTMEM +d8//0 M FPU - - - FADD_F32 +d8//1 M FPU - - - FMUL_F32 +d8//2 M FPU - - - FCOM_F32 +d8//3 M FPU - - - FCOMP_F32 +d8//4 M FPU - - - FSUB_F32 +d8//5 M FPU - - - FSUBR_F32 +d8//6 M FPU - - - FDIV_F32 +d8//7 M FPU - - - FDIVR_F32 d8//c0+ AO FPU FPU - - FADD d8//c8+ AO FPU FPU - - FMUL d8//d0+ AO FPU FPU - - FCOM @@ -1265,13 +1273,13 @@ d8//e0+ AO FPU FPU - - FSUB d8//e8+ AO FPU FPU - - FSUBR d8//f0+ AO FPU FPU - - FDIV d8//f8+ AO FPU FPU - - FDIVR -d9//0 M FPU - - - FLD_F32 MUSTMEM -d9//2 M FPU - - - FST_F32 MUSTMEM -d9//3 M FPU - - - FSTP_F32 MUSTMEM -d9//4 M MEMZ - - - FLDENV MUSTMEM -d9//5 M GP16 - - - FLDCW MUSTMEM -d9//6 M MEMZ - - - FSTENV MUSTMEM -d9//7 M GP16 - - - FSTCW MUSTMEM +d9//0 M FPU - - - FLD_F32 +d9//2 M FPU - - - FST_F32 +d9//3 M FPU - - - FSTP_F32 +d9//4 M MEMZ - - - FLDENV +d9//5 M GP16 - - - FLDCW +d9//6 M MEMZ - - - FSTENV +d9//7 M GP16 - - - FSTCW d9//c8+ O FPU - - - FXCH d9//d0 NP - - - - FNOP d9//e0 NP - - - - FCHS @@ -1301,25 +1309,25 @@ d9//fc NP - - - - FRNDINT d9//fd NP - - - - FSCALE d9//fe NP - - - - FSIN d9//ff NP - - - - FCOS -da//0 M FPU - - - FIADD_I32 MUSTMEM -da//1 M FPU - - - FIMUL_I32 MUSTMEM -da//2 M FPU - - - FICOM_I32 MUSTMEM -da//3 M FPU - - - FICOMP_I32 MUSTMEM -da//4 M FPU - - - FISUB_I32 MUSTMEM -da//5 M FPU - - - FISUBR_I32 MUSTMEM -da//6 M FPU - - - FIDIV_I32 MUSTMEM -da//7 M FPU - - - FIDIVR_I32 MUSTMEM +da//0 M FPU - - - FIADD_I32 +da//1 M FPU - - - FIMUL_I32 +da//2 M FPU - - - FICOM_I32 +da//3 M FPU - - - FICOMP_I32 +da//4 M FPU - - - FISUB_I32 +da//5 M FPU - - - FISUBR_I32 +da//6 M FPU - - - FIDIV_I32 +da//7 M FPU - - - FIDIVR_I32 da//c0+ O FPU - - - FCMOVB da//c8+ O FPU - - - FCMOVE da//d0+ O FPU - - - FCMOVBE da//d8+ O FPU - - - FCMOVU da//e9 NP - - - - FUCOMPP -db//0 M FPU - - - FILD_I32 MUSTMEM -db//1 M FPU - - - FISTTP_I32 MUSTMEM -db//2 M FPU - - - FIST_I32 MUSTMEM -db//3 M FPU - - - FISTP_I32 MUSTMEM -db//5 M FPU - - - FLD_F80 MUSTMEM -db//7 M FPU - - - FSTP_F80 MUSTMEM +db//0 M FPU - - - FILD_I32 +db//1 M FPU - - - FISTTP_I32 +db//2 M FPU - - - FIST_I32 +db//3 M FPU - - - FISTP_I32 +db//5 M FPU - - - FLD_F80 +db//7 M FPU - - - FSTP_F80 db//c0+ O FPU - - - FCMOVNB db//c8+ O FPU - - - FCMOVNE db//d0+ O FPU - - - FCMOVNBE @@ -1328,40 +1336,40 @@ db//e2 NP - - - - FCLEX db//e3 NP - - - - FINIT db//e8+ O FPU - - - FUCOMI db//f0+ O FPU - - - FCOMI -dc//0 M FPU - - - FADD_F64 MUSTMEM -dc//1 M FPU - - - FMUL_F64 MUSTMEM -dc//2 M FPU - - - FCOM_F64 MUSTMEM -dc//3 M FPU - - - FCOMP_F64 MUSTMEM -dc//4 M FPU - - - FSUB_F64 MUSTMEM -dc//5 M FPU - - - FSUBR_F64 MUSTMEM -dc//6 M FPU - - - FDIV_F64 MUSTMEM -dc//7 M FPU - - - FDIVR_F64 MUSTMEM +dc//0 M FPU - - - FADD_F64 +dc//1 M FPU - - - FMUL_F64 +dc//2 M FPU - - - FCOM_F64 +dc//3 M FPU - - - FCOMP_F64 +dc//4 M FPU - - - FSUB_F64 +dc//5 M FPU - - - FSUBR_F64 +dc//6 M FPU - - - FDIV_F64 +dc//7 M FPU - - - FDIVR_F64 dc//c0+ OA FPU FPU - - FADD dc//c8+ OA FPU FPU - - FMUL dc//e0+ OA FPU FPU - - FSUBR dc//e8+ OA FPU FPU - - FSUB dc//f0+ OA FPU FPU - - FDIVR dc//f8+ OA FPU FPU - - FDIV -dd//0 M FPU - - - FLD_F64 MUSTMEM -dd//1 M FPU - - - FISTTP_I64 MUSTMEM -dd//2 M FPU - - - FST_F64 MUSTMEM -dd//3 M FPU - - - FSTP_F64 MUSTMEM -dd//4 M MEMZ - - - FRSTOR MUSTMEM -dd//6 M MEMZ - - - FSAVE MUSTMEM -dd//7 M GP16 - - - FSTSW MUSTMEM +dd//0 M FPU - - - FLD_F64 +dd//1 M FPU - - - FISTTP_I64 +dd//2 M FPU - - - FST_F64 +dd//3 M FPU - - - FSTP_F64 +dd//4 M MEMZ - - - FRSTOR +dd//6 M MEMZ - - - FSAVE +dd//7 M GP16 - - - FSTSW dd//c0+ O FPU - - - FFREE dd//d0+ O FPU - - - FST -dd//d8+ O MEMZ - - - FSTP_F80 MUSTMEM +dd//d8+ O FPU - - - FSTP dd//e0+ O FPU - - - FUCOM dd//e8+ O FPU - - - FUCOMP -de//0 M FPU - - - FIADD_I16 MUSTMEM -de//1 M FPU - - - FIMUL_I16 MUSTMEM -de//2 M FPU - - - FICOM_I16 MUSTMEM -de//3 M FPU - - - FICOMP_I16 MUSTMEM -de//4 M FPU - - - FISUB_I16 MUSTMEM -de//5 M FPU - - - FISUBR_I16 MUSTMEM -de//6 M FPU - - - FIDIV_I16 MUSTMEM -de//7 M FPU - - - FIDIVR_I16 MUSTMEM +de//0 M FPU - - - FIADD_I16 +de//1 M FPU - - - FIMUL_I16 +de//2 M FPU - - - FICOM_I16 +de//3 M FPU - - - FICOMP_I16 +de//4 M FPU - - - FISUB_I16 +de//5 M FPU - - - FISUBR_I16 +de//6 M FPU - - - FIDIV_I16 +de//7 M FPU - - - FIDIVR_I16 de//c0+ OA FPU FPU - - FADDP de//c8+ OA FPU FPU - - FMULP de//d9 NP - - - - FCOMPP @@ -1369,14 +1377,14 @@ de//e0+ OA FPU FPU - - FSUBRP de//e8+ OA FPU FPU - - FSUBP de//f0+ OA FPU FPU - - FDIVRP de//f8+ OA FPU FPU - - FDIVP -df//0 M FPU - - - FILD_I16 MUSTMEM -df//1 M FPU - - - FISTTP_I16 MUSTMEM -df//2 M FPU - - - FIST_I16 MUSTMEM -df//3 M FPU - - - FISTP_I16 MUSTMEM -df//4 M MEMZ - - - FBLD MUSTMEM -df//5 M GP - - - FILD_I64 MUSTMEM -df//6 M MEMZ - - - FBSTP MUSTMEM -df//7 M GP - - - FISTP_I64 MUSTMEM +df//0 M FPU - - - FILD_I16 +df//1 M FPU - - - FISTTP_I16 +df//2 M FPU - - - FIST_I16 +df//3 M FPU - - - FISTP_I16 +df//4 M MEMZ - - - FBLD +df//5 M GP - - - FILD_I64 +df//6 M MEMZ - - - FBSTP +df//7 M GP - - - FISTP_I64 # FSTSW AX df//e0 O GP16 - - - FSTSW df//f0+ AO FPU FPU - - FCOMIP @@ -1386,13 +1394,13 @@ df//f8+ AO FPU FPU - - FUCOMIP F3.0f01//5 M GP64 - - - RSTORSSP F3.0f01//e8 NP - - - - SETSSBSY F3.0f01//ea NP - - - - SAVEPREVSSP -F3.0f1e//1 M GP - - - RDSSP +F3.0f1e//c8+ O GP - - - RDSSP F3.0f1e//fa NP - - - - ENDBR64 F3.0f1e//fb NP - - - - ENDBR32 66.0f38f5 MR GP GP - - WRUSS MUSTMEM NP.0f38f6 MR GP GP - - WRSS MUSTMEM -F3.0fae//5 M GP - - - INCSSP INSTR_WIDTH F3.0fae//6 M GP - - - CLRSSBSY +F3.0fae//e8+ O GP - - - INCSSP # # CLDEMOTE NP.0f1c/0 M MEMZ - - - CLDEMOTE MUSTMEM @@ -1401,16 +1409,16 @@ NP.0f1c/0 M MEMZ - - - CLDEMOTE MUSTMEM 66.0f3880 RM GP MEMZ - - INVEPT DEF64 MUSTMEM 66.0f3881 RM GP MEMZ - - INVVPID DEF64 MUSTMEM NP.0f01//c1 NP - - - - VMCALL -66.0fc7//6 M MEMZ - - - VMCLEAR MUSTMEM +66.0fc7//6 M MEMZ - - - VMCLEAR NP.0f01//d4 NP - - - - VMFUNC NP.0f01//c2 NP - - - - VMLAUNCH NP.0f01//c3 NP - - - - VMRESUME -NP.0fc7//6 M MEMZ - - - VMPTRLD MUSTMEM -NP.0fc7//7 M MEMZ - - - VMPTRST MUSTMEM +NP.0fc7//6 M MEMZ - - - VMPTRLD +NP.0fc7//7 M MEMZ - - - VMPTRST NP.0f78 MR GP GP - - VMREAD DEF64 NP.0f79 MR GP GP - - VMWRITE DEF64 NP.0f01//c4 NP - - - - VMXOFF -F3.0fc7//6 M MEMZ - - - VMXON MUSTMEM +F3.0fc7//6 M MEMZ - - - VMXON # WAITPKG 66.0fae//f0+ O GP32 - - - TPAUSE @@ -1419,6 +1427,7 @@ F2.0fae//f0+ O GP32 - - - UMWAIT # PRWRITE F3.0fae//4 M GP - - - PTWRITE +F3.0fae//e0+ O GP - - - PTWRITE # GFNI 66.0f38cf RM XMM XMM - - GF2P8MULB @@ -1437,19 +1446,19 @@ RF2.0f09 NP - - - - WBNOINVD NP.0f01//ee NP - - - - RDPKRU NP.0f01//ef NP - - - - WRPKRU -F3.0fae//0 M GP - - - RDFSBASE ONLY64 NOMEM -F3.0fae//1 M GP - - - RDGSBASE ONLY64 NOMEM -F3.0fae//2 M GP - - - RDFSBASE ONLY64 NOMEM -F3.0fae//3 M GP - - - RDGSBASE ONLY64 NOMEM -NP.0fae//4 M MEMZ - - - XSAVE INSTR_WIDTH MUSTMEM -NP.0fae//5 M MEMZ - - - XRSTOR INSTR_WIDTH MUSTMEM -NP.0fae//6 M MEMZ - - - XSAVEOPT INSTR_WIDTH MUSTMEM -66.0fae//6 M GP8 - - - CLWB MUSTMEM -NP.0fae//7 M GP8 - - - CLFLUSH MUSTMEM -66.0fae//7 M GP8 - - - CLFLUSHOPT MUSTMEM -NP.0fc7//3 M MEMZ - - - XRSTORS INSTR_WIDTH MUSTMEM -NP.0fc7//4 M MEMZ - - - XSAVEC INSTR_WIDTH MUSTMEM -NP.0fc7//5 M MEMZ - - - XSAVES INSTR_WIDTH MUSTMEM +F3.0fae//c0+ O GP - - - RDFSBASE ONLY64 +F3.0fae//c8+ O GP - - - RDGSBASE ONLY64 +F3.0fae//d0+ O GP - - - WRFSBASE ONLY64 +F3.0fae//d8+ O GP - - - WRGSBASE ONLY64 +NP.0fae//4 M MEMZ - - - XSAVE INSTR_WIDTH +NP.0fae//5 M MEMZ - - - XRSTOR INSTR_WIDTH +NP.0fae//6 M MEMZ - - - XSAVEOPT INSTR_WIDTH +66.0fae//6 M GP8 - - - CLWB +NP.0fae//7 M GP8 - - - CLFLUSH +66.0fae//7 M GP8 - - - CLFLUSHOPT +NP.0fc7//3 M MEMZ - - - XRSTORS INSTR_WIDTH +NP.0fc7//4 M MEMZ - - - XSAVEC INSTR_WIDTH +NP.0fc7//5 M MEMZ - - - XSAVES INSTR_WIDTH RNP.0fc7//f0+ O GP - - - RDRAND RNP.0fc7//f8+ O GP - - - RDSEED RF3.0fc7//f8+ O GP - - - RDPID DEF64