parseinstr: Simplify opcode naming scheme

This commit is contained in:
Alexis Engelke
2020-11-08 13:46:54 +01:00
parent 9df6ac1788
commit 62b0420147
4 changed files with 278 additions and 280 deletions

View File

@@ -236,7 +236,8 @@ decode_modrm(const uint8_t* buffer, int len, DecodeMode mode, FdInstr* instr,
uint8_t reg_idx = rm; uint8_t reg_idx = rm;
#if defined(ARCH_X86_64) #if defined(ARCH_X86_64)
if (!UNLIKELY(out_o1->misc == FD_RT_MMX || out_o1->misc == FD_RT_MASK)) if (!UNLIKELY(out_o1->misc == FD_RT_FPU || out_o1->misc == FD_RT_MMX ||
out_o1->misc == FD_RT_MASK))
reg_idx += prefixes & PREFIX_REXB ? 8 : 0; reg_idx += prefixes & PREFIX_REXB ? 8 : 0;
#endif #endif
out_o1->type = FD_OT_REG; out_o1->type = FD_OT_REG;

View File

@@ -204,7 +204,8 @@ typedef enum {
ENC_INVALID = 0, ENC_INVALID = 0,
ENC_NP, ENC_NP,
ENC_M, ENC_M1, ENC_MI, ENC_MC, ENC_MR, ENC_RM, ENC_RMA, ENC_MRI, ENC_RMI, ENC_MRC, ENC_M, ENC_M1, ENC_MI, ENC_MC, ENC_MR, ENC_RM, ENC_RMA, ENC_MRI, ENC_RMI, ENC_MRC,
ENC_I, ENC_IA, ENC_O, ENC_OI, ENC_OA, ENC_AO, ENC_A, ENC_D, ENC_FD, ENC_TD, ENC_AM, ENC_MA,
ENC_I, ENC_IA, ENC_O, ENC_OI, ENC_OA, ENC_A, ENC_D, ENC_FD, ENC_TD,
ENC_RVM, ENC_RVMI, ENC_RVMR, ENC_RMV, ENC_VM, ENC_VMI, ENC_MVR, ENC_RVM, ENC_RVMI, ENC_RVMR, ENC_RMV, ENC_VM, ENC_VMI, ENC_MVR,
ENC_MAX ENC_MAX
} Encoding; } Encoding;
@@ -232,12 +233,13 @@ const struct EncodingInfo encoding_infos[ENC_MAX] = {
[ENC_MRI] = { .modrm = 0^3, .modreg = 1^3, .immctl = 4, .immidx = 2 }, [ENC_MRI] = { .modrm = 0^3, .modreg = 1^3, .immctl = 4, .immidx = 2 },
[ENC_RMI] = { .modrm = 1^3, .modreg = 0^3, .immctl = 4, .immidx = 2 }, [ENC_RMI] = { .modrm = 1^3, .modreg = 0^3, .immctl = 4, .immidx = 2 },
[ENC_MRC] = { .modrm = 0^3, .modreg = 1^3, .zregidx = 2^3, .zregval = 1 }, [ENC_MRC] = { .modrm = 0^3, .modreg = 1^3, .zregidx = 2^3, .zregval = 1 },
[ENC_AM] = { .modrm = 1^3, .zregidx = 0^3, .zregval = 0 },
[ENC_MA] = { .modrm = 0^3, .zregidx = 1^3, .zregval = 0 },
[ENC_I] = { .immctl = 4, .immidx = 0 }, [ENC_I] = { .immctl = 4, .immidx = 0 },
[ENC_IA] = { .zregidx = 0^3, .zregval = 0, .immctl = 4, .immidx = 1 }, [ENC_IA] = { .zregidx = 0^3, .zregval = 0, .immctl = 4, .immidx = 1 },
[ENC_O] = { .modreg = 0^3 }, [ENC_O] = { .modreg = 0^3 },
[ENC_OI] = { .modreg = 0^3, .immctl = 4, .immidx = 1 }, [ENC_OI] = { .modreg = 0^3, .immctl = 4, .immidx = 1 },
[ENC_OA] = { .modreg = 0^3, .zregidx = 1^3, .zregval = 0 }, [ENC_OA] = { .modreg = 0^3, .zregidx = 1^3, .zregval = 0 },
[ENC_AO] = { .modreg = 1^3, .zregidx = 0^3, .zregval = 0 },
[ENC_A] = { .zregidx = 0^3, .zregval = 0 }, [ENC_A] = { .zregidx = 0^3, .zregval = 0 },
[ENC_D] = { .immctl = 6, .immidx = 0 }, [ENC_D] = { .immctl = 6, .immidx = 0 },
[ENC_FD] = { .immctl = 2, .immidx = 1 }, [ENC_FD] = { .immctl = 2, .immidx = 1 },

View File

@@ -191,12 +191,10 @@ c2 I IMM16 - - - RET DEF64 INSTR_WIDTH
c3 NP - - - - RET DEF64 INSTR_WIDTH c3 NP - - - - RET DEF64 INSTR_WIDTH
c4 RM GP MEMZ - - LES ONLY32 c4 RM GP MEMZ - - LES ONLY32
c5 RM GP MEMZ - - LDS ONLY32 c5 RM GP MEMZ - - LDS ONLY32
c6//0 MI GP IMM - - MOV SIZE_8 c6/0 MI GP IMM - - MOV SIZE_8
c6//c0+ OI GP IMM - - MOV SIZE_8 c6f8 I IMM8 - - - XABORT
c6//f8 I IMM8 - - - XABORT c7/0 MI GP IMM - - MOV
c7//0 MI GP IMM - - MOV c7f8 D IMM - - - XBEGIN
c7//c0+ OI GP IMM - - MOV
c7//f8 D IMM - - - XBEGIN
# ENTER immediate handled in code # ENTER immediate handled in code
c8 I IMM32 - - - ENTER DEF64 INSTR_WIDTH c8 I IMM32 - - - ENTER DEF64 INSTR_WIDTH
c9 NP - - - - LEAVE DEF64 INSTR_WIDTH c9 NP - - - - LEAVE DEF64 INSTR_WIDTH
@@ -287,9 +285,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 DEF64 ff/2 M GP - - - CALL DEF64
ff/3 M MEMZ - - - CALLF ff/3m M MEMZ - - - CALLF
ff/4 M GP - - - JMP DEF64 ff/4 M GP - - - JMP DEF64
ff/5 M MEMZ - - - JMPF ff/5m M MEMZ - - - JMPF
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
@@ -297,27 +295,26 @@ ff/6 M GP - - - PUSH DEF64
0f00/3 M GP16 - - - LTR 0f00/3 M GP16 - - - LTR
0f00/4 M GP16 - - - VERR 0f00/4 M GP16 - - - VERR
0f00/5 M GP16 - - - VERW 0f00/5 M GP16 - - - VERW
NFx.0f01//0 M MEMZ - - - SGDT NFx.0f01/0m M MEMZ - - - SGDT
NFx.0f01//1 M MEMZ - - - SIDT NFx.0f01/1m M MEMZ - - - SIDT
NFx.0f01//2 M MEMZ - - - LGDT NFx.0f01/2m M MEMZ - - - LGDT
NFx.0f01//3 M MEMZ - - - LIDT NFx.0f01/3m M MEMZ - - - LIDT
NFx.0f01//4 M GP16 - - - SMSW NFx.0f01/4m M GP16 - - - SMSW
NFx.0f01//6 M GP16 - - - LMSW NFx.0f01/4r M GP - - - SMSW
NFx.0f01//7 M GP - - - INVLPG SIZE_8 NFx.0f01/6 M GP16 - - - LMSW
NFx.0f01//c8 NP - - - - MONITOR NFx.0f01/7m M GP - - - INVLPG SIZE_8
NFx.0f01//c9 NP - - - - MWAIT NFx.0f01c8 NP - - - - MONITOR
NP.0f01//ca NP - - - - CLAC NFx.0f01c9 NP - - - - MWAIT
NP.0f01//cb NP - - - - STAC NP.0f01ca NP - - - - CLAC
NP.0f01//cf NP - - - - ENCLS NP.0f01cb NP - - - - STAC
NP.0f01//d0 NP - - - - XGETBV NP.0f01cf NP - - - - ENCLS
NP.0f01//d1 NP - - - - XSETBV NP.0f01d0 NP - - - - XGETBV
NP.0f01//d5 NP - - - - XEND NP.0f01d1 NP - - - - XSETBV
NP.0f01//d6 NP - - - - XTEST NP.0f01d5 NP - - - - XEND
NP.0f01//d7 NP - - - - ENCLU NP.0f01d6 NP - - - - XTEST
NFx.0f01//e0+ O GP - - - SMSW NP.0f01d7 NP - - - - ENCLU
NFx.0f01//f0+ O GP16 - - - LMSW NFx.0f01f8 NP - - - - SWAPGS ONLY64
NFx.0f01//f8 NP - - - - SWAPGS ONLY64 NFx.0f01f9 NP - - - - RDTSCP
NFx.0f01//f9 NP - - - - RDTSCP
0f02 RM GP GP16 - - LAR 0f02 RM GP GP16 - - LAR
0f03 RM GP GP16 - - LSL 0f03 RM GP GP16 - - LSL
0f05 NP - - - - SYSCALL ONLY64 0f05 NP - - - - SYSCALL ONLY64
@@ -327,30 +324,26 @@ NFx.0f01//f9 NP - - - - RDTSCP
NFx.0f09 NP - - - - WBINVD NFx.0f09 NP - - - - WBINVD
F2.0f09 NP - - - - WBINVD F2.0f09 NP - - - - WBINVD
0f0b NP - - - - UD2 0f0b NP - - - - UD2
0f0d//0 M MEM8 - - - PREFETCH 0f0d/0m M MEM8 - - - PREFETCH
0f0d//1 M MEM8 - - - PREFETCHW 0f0d/1m M MEM8 - - - PREFETCHW
0f0d//2 M MEM8 - - - PREFETCHWT1 0f0d/2m M MEM8 - - - PREFETCHWT1
0f0d//3 M MEM8 - - - RESERVED_PREFETCH 0f0d/3m M MEM8 - - - RESERVED_PREFETCH
0f0d//4 M MEM8 - - - RESERVED_PREFETCH 0f0d/4m M MEM8 - - - RESERVED_PREFETCH
0f0d//5 M MEM8 - - - RESERVED_PREFETCH 0f0d/5m M MEM8 - - - RESERVED_PREFETCH
0f0d//6 M MEM8 - - - RESERVED_PREFETCH 0f0d/6m M MEM8 - - - RESERVED_PREFETCH
0f0d//7 M MEM8 - - - RESERVED_PREFETCH 0f0d/7m M MEM8 - - - RESERVED_PREFETCH
0f18//0 M MEM8 - - - PREFETCHNTA 0f18/0m M MEM8 - - - PREFETCHNTA
0f18//1 M MEM8 - - - PREFETCHT0 0f18/1m M MEM8 - - - PREFETCHT0
0f18//2 M MEM8 - - - PREFETCHT1 0f18/2m M MEM8 - - - PREFETCHT1
0f18//3 M MEM8 - - - PREFETCHT2 0f18/3m M MEM8 - - - PREFETCHT2
0f18//4 M GP - - - RESERVED_NOP 0f18/0r M GP - - - RESERVED_NOP
0f18//5 M GP - - - RESERVED_NOP 0f18/1r M GP - - - RESERVED_NOP
0f18//6 M GP - - - RESERVED_NOP 0f18/2r M GP - - - RESERVED_NOP
0f18//7 M GP - - - RESERVED_NOP 0f18/3r M GP - - - RESERVED_NOP
0f18//c0+ O GP - - - RESERVED_NOP 0f18/4 M GP - - - RESERVED_NOP
0f18//c8+ O GP - - - RESERVED_NOP 0f18/5 M GP - - - RESERVED_NOP
0f18//d0+ O GP - - - RESERVED_NOP 0f18/6 M GP - - - RESERVED_NOP
0f18//d8+ O GP - - - RESERVED_NOP 0f18/7 M 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 0f1f M GP - - - NOP
0f20 MR GP32 CR - - MOV_CR NOMEM ONLY32 0f20 MR GP32 CR - - MOV_CR NOMEM ONLY32
0f20 MR GP64 CR - - MOV_CR NOMEM ONLY64 DEF64 0f20 MR GP64 CR - - MOV_CR NOMEM ONLY64 DEF64
@@ -455,7 +448,7 @@ F3.0fbd RM GP GP - - LZCNT USE66
0fc0 MR GP GP - - XADD SIZE_8 LOCK 0fc0 MR GP GP - - XADD SIZE_8 LOCK
0fc1 MR GP GP - - XADD LOCK 0fc1 MR GP GP - - XADD LOCK
NP.0fc3 MR MEM GP - - MOVNTI NP.0fc3 MR MEM GP - - MOVNTI
NP.0fc7//1 M MEMZ - - - CMPXCHGD LOCK NP.0fc7/1m M MEMZ - - - CMPXCHGD LOCK INSTR_WIDTH
0fc8+ O GP - - - BSWAP 0fc8+ O GP - - - BSWAP
0fff RM GP GP - - UD0 0fff RM GP GP - - UD0
# #
@@ -677,16 +670,16 @@ F3.0f6f RM XMM XMM - - SSE_MOVDQU
66.0f70 RMI XMM XMM IMM8 - SSE_PSHUFD 66.0f70 RMI XMM XMM IMM8 - SSE_PSHUFD
F3.0f70 RMI XMM XMM IMM8 - SSE_PSHUFHW F3.0f70 RMI XMM XMM IMM8 - SSE_PSHUFHW
F2.0f70 RMI XMM XMM IMM8 - SSE_PSHUFLW F2.0f70 RMI XMM XMM IMM8 - SSE_PSHUFLW
66.0f71/2 MI XMM IMM8 - - SSE_PSRLW NOMEM 66.0f71/2r MI XMM IMM8 - - SSE_PSRLW
66.0f71/4 MI XMM IMM8 - - SSE_PSRAW NOMEM 66.0f71/4r MI XMM IMM8 - - SSE_PSRAW
66.0f71/6 MI XMM IMM8 - - SSE_PSLLW NOMEM 66.0f71/6r MI XMM IMM8 - - SSE_PSLLW
66.0f72/2 MI XMM IMM8 - - SSE_PSRLD NOMEM 66.0f72/2r MI XMM IMM8 - - SSE_PSRLD
66.0f72/4 MI XMM IMM8 - - SSE_PSRAD NOMEM 66.0f72/4r MI XMM IMM8 - - SSE_PSRAD
66.0f72/6 MI XMM IMM8 - - SSE_PSLLD NOMEM 66.0f72/6r MI XMM IMM8 - - SSE_PSLLD
66.0f73/2 MI XMM IMM8 - - SSE_PSRLQ NOMEM 66.0f73/2r MI XMM IMM8 - - SSE_PSRLQ
66.0f73/3 MI XMM IMM8 - - SSE_PSRLDQ NOMEM 66.0f73/3r MI XMM IMM8 - - SSE_PSRLDQ
66.0f73/6 MI XMM IMM8 - - SSE_PSLLQ NOMEM 66.0f73/6r MI XMM IMM8 - - SSE_PSLLQ
66.0f73/7 MI XMM IMM8 - - SSE_PSLLDQ NOMEM 66.0f73/7r MI XMM IMM8 - - SSE_PSLLDQ
66.0f74 RM XMM XMM - - SSE_PCMPEQB 66.0f74 RM XMM XMM - - SSE_PCMPEQB
66.0f75 RM XMM XMM - - SSE_PCMPEQW 66.0f75 RM XMM XMM - - SSE_PCMPEQW
66.0f76 RM XMM XMM - - SSE_PCMPEQD 66.0f76 RM XMM XMM - - SSE_PCMPEQD
@@ -699,13 +692,13 @@ F2.0f7d RM XMM XMM - - SSE_HSUBPS
F3.0f7e RM XMM XMM64 - - SSE_MOVQ F3.0f7e RM XMM XMM64 - - SSE_MOVQ
66.0f7f MR XMM XMM - - SSE_MOVDQA 66.0f7f MR XMM XMM - - SSE_MOVDQA
F3.0f7f MR XMM XMM - - SSE_MOVDQU F3.0f7f MR XMM XMM - - SSE_MOVDQU
NP.0fae//0 M MEMZ - - - FXSAVE NP.0fae/0m M MEMZ - - - FXSAVE
NP.0fae//1 M MEMZ - - - FXRSTOR NP.0fae/1m M MEMZ - - - FXRSTOR
NP.0fae//2 M MEM32 - - - LDMXCSR NP.0fae/2m M MEM32 - - - LDMXCSR
NP.0fae//3 M MEM32 - - - STMXCSR NP.0fae/3m M MEM32 - - - STMXCSR
NP.0fae//e8+ NP - - - - LFENCE NP.0faee8 NP - - - - LFENCE
NP.0fae//f0+ NP - - - - MFENCE NP.0faef0 NP - - - - MFENCE
NP.0fae//f8+ NP - - - - SFENCE NP.0faef8 NP - - - - SFENCE
NP.0fc2 RMI XMM XMM IMM8 - SSE_CMPPS NP.0fc2 RMI XMM XMM IMM8 - SSE_CMPPS
66.0fc2 RMI XMM XMM IMM8 - SSE_CMPPD 66.0fc2 RMI XMM XMM IMM8 - SSE_CMPPD
F3.0fc2 RMI XMM XMM32 IMM8 - SSE_CMPSS F3.0fc2 RMI XMM XMM32 IMM8 - SSE_CMPSS
@@ -994,8 +987,8 @@ VEX.66.W1.L0.0f7e MR GP XMM64 - - VMOVQ ONLY64 ENC_NOSZ
VEX.F3.L0.0f7e RM XMM64 XMM64 - - VMOVQ ENC_NOSZ VEX.F3.L0.0f7e RM XMM64 XMM64 - - VMOVQ ENC_NOSZ
VEX.66.0f7f MR XMM XMM - - VMOVDQA VEX.66.0f7f MR XMM XMM - - VMOVDQA
VEX.F3.0f7f MR XMM XMM - - VMOVDQU VEX.F3.0f7f MR XMM XMM - - VMOVDQU
VEX.NP.0fae//2 M GP32 - - - VLDMXCSR VEX.NP.0fae/2m M GP32 - - - VLDMXCSR
VEX.NP.0fae//3 M GP32 - - - VSTMXCSR VEX.NP.0fae/3m M GP32 - - - VSTMXCSR
VEX.NP.0fc2 RVMI XMM XMM XMM IMM8 VCMPPS VEX.NP.0fc2 RVMI XMM XMM XMM IMM8 VCMPPS
VEX.66.0fc2 RVMI XMM XMM XMM IMM8 VCMPPD VEX.66.0fc2 RVMI XMM XMM XMM IMM8 VCMPPD
VEX.F3.LIG.0fc2 RVMI XMM XMM XMM32 IMM8 VCMPSS VEX.F3.LIG.0fc2 RVMI XMM XMM XMM32 IMM8 VCMPSS
@@ -1258,150 +1251,150 @@ VEX.F3.L0.0f38f7 RMV GP GP GP - SARX
F3.0f38f6 RM GP GP - - ADOX F3.0f38f6 RM GP GP - - ADOX
# #
# FPU # FPU
d8//0 M MEM32 - - - FADD ENC_SEPSZ d8/0m M MEM32 - - - FADD ENC_SEPSZ
d8//1 M MEM32 - - - FMUL ENC_SEPSZ d8/1m M MEM32 - - - FMUL ENC_SEPSZ
d8//2 M MEM32 - - - FCOM ENC_SEPSZ d8/2m M MEM32 - - - FCOM ENC_SEPSZ
d8//3 M MEM32 - - - FCOMP ENC_SEPSZ d8/3m M MEM32 - - - FCOMP ENC_SEPSZ
d8//4 M MEM32 - - - FSUB ENC_SEPSZ d8/4m M MEM32 - - - FSUB ENC_SEPSZ
d8//5 M MEM32 - - - FSUBR ENC_SEPSZ d8/5m M MEM32 - - - FSUBR ENC_SEPSZ
d8//6 M MEM32 - - - FDIV ENC_SEPSZ d8/6m M MEM32 - - - FDIV ENC_SEPSZ
d8//7 M MEM32 - - - FDIVR ENC_SEPSZ d8/7m M MEM32 - - - FDIVR ENC_SEPSZ
d8//c0+ AO FPU FPU - - FADD d8/0r AM FPU FPU - - FADD
d8//c8+ AO FPU FPU - - FMUL d8/1r AM FPU FPU - - FMUL
d8//d0+ AO FPU FPU - - FCOM d8/2r AM FPU FPU - - FCOM
d8//d8+ AO FPU FPU - - FCOMP d8/3r AM FPU FPU - - FCOMP
d8//e0+ AO FPU FPU - - FSUB d8/4r AM FPU FPU - - FSUB
d8//e8+ AO FPU FPU - - FSUBR d8/5r AM FPU FPU - - FSUBR
d8//f0+ AO FPU FPU - - FDIV d8/6r AM FPU FPU - - FDIV
d8//f8+ AO FPU FPU - - FDIVR d8/7r AM FPU FPU - - FDIVR
d9//0 M MEM32 - - - FLD ENC_SEPSZ d9/0m M MEM32 - - - FLD ENC_SEPSZ
d9//2 M MEM32 - - - FST ENC_SEPSZ d9/2m M MEM32 - - - FST ENC_SEPSZ
d9//3 M MEM32 - - - FSTP ENC_SEPSZ d9/3m M MEM32 - - - FSTP ENC_SEPSZ
d9//4 M MEMZ - - - FLDENV d9/4m M MEMZ - - - FLDENV
d9//5 M MEM16 - - - FLDCW d9/5m M MEM16 - - - FLDCW
d9//6 M MEMZ - - - FSTENV d9/6m M MEMZ - - - FSTENV
d9//7 M MEM16 - - - FSTCW d9/7m M MEM16 - - - FSTCW
d9//c8+ O FPU - - - FXCH d9/1r M FPU - - - FXCH
d9//d0 NP - - - - FNOP d9d0 NP - - - - FNOP
d9//e0 NP - - - - FCHS d9e0 NP - - - - FCHS
d9//e1 NP - - - - FABS d9e1 NP - - - - FABS
d9//e4 NP - - - - FTST d9e4 NP - - - - FTST
d9//e5 NP - - - - FXAM d9e5 NP - - - - FXAM
d9//e8 NP - - - - FLD1 d9e8 NP - - - - FLD1
d9//e9 NP - - - - FLDL2T d9e9 NP - - - - FLDL2T
d9//ea NP - - - - FLDL2E d9ea NP - - - - FLDL2E
d9//eb NP - - - - FLDPI d9eb NP - - - - FLDPI
d9//ec NP - - - - FLDLG2 d9ec NP - - - - FLDLG2
d9//ed NP - - - - FLDLN2 d9ed NP - - - - FLDLN2
d9//ee NP - - - - FLDZ d9ee NP - - - - FLDZ
d9//f0 NP - - - - F2XM1 d9f0 NP - - - - F2XM1
d9//f1 NP - - - - FYL2X d9f1 NP - - - - FYL2X
d9//f2 NP - - - - FPTAN d9f2 NP - - - - FPTAN
d9//f3 NP - - - - FPATAN d9f3 NP - - - - FPATAN
d9//f4 NP - - - - FXTRACT d9f4 NP - - - - FXTRACT
d9//f5 NP - - - - FPREM1 d9f5 NP - - - - FPREM1
d9//f6 NP - - - - FDECSTP d9f6 NP - - - - FDECSTP
d9//f7 NP - - - - FINCSTP d9f7 NP - - - - FINCSTP
d9//f8 NP - - - - FPREM d9f8 NP - - - - FPREM
d9//f9 NP - - - - FYL2XP1 d9f9 NP - - - - FYL2XP1
d9//fa NP - - - - FSQRT d9fa NP - - - - FSQRT
d9//fb NP - - - - FSINCOS d9fb NP - - - - FSINCOS
d9//fc NP - - - - FRNDINT d9fc NP - - - - FRNDINT
d9//fd NP - - - - FSCALE d9fd NP - - - - FSCALE
d9//fe NP - - - - FSIN d9fe NP - - - - FSIN
d9//ff NP - - - - FCOS d9ff NP - - - - FCOS
da//0 M MEM32 - - - FIADD ENC_SEPSZ da/0m M MEM32 - - - FIADD ENC_SEPSZ
da//1 M MEM32 - - - FIMUL ENC_SEPSZ da/1m M MEM32 - - - FIMUL ENC_SEPSZ
da//2 M MEM32 - - - FICOM ENC_SEPSZ da/2m M MEM32 - - - FICOM ENC_SEPSZ
da//3 M MEM32 - - - FICOMP ENC_SEPSZ da/3m M MEM32 - - - FICOMP ENC_SEPSZ
da//4 M MEM32 - - - FISUB ENC_SEPSZ da/4m M MEM32 - - - FISUB ENC_SEPSZ
da//5 M MEM32 - - - FISUBR ENC_SEPSZ da/5m M MEM32 - - - FISUBR ENC_SEPSZ
da//6 M MEM32 - - - FIDIV ENC_SEPSZ da/6m M MEM32 - - - FIDIV ENC_SEPSZ
da//7 M MEM32 - - - FIDIVR ENC_SEPSZ da/7m M MEM32 - - - FIDIVR ENC_SEPSZ
da//c0+ O FPU - - - FCMOVB da/0r M FPU - - - FCMOVB
da//c8+ O FPU - - - FCMOVE da/1r M FPU - - - FCMOVE
da//d0+ O FPU - - - FCMOVBE da/2r M FPU - - - FCMOVBE
da//d8+ O FPU - - - FCMOVU da/3r M FPU - - - FCMOVU
da//e9 NP - - - - FUCOMPP dae9 NP - - - - FUCOMPP
db//0 M MEM32 - - - FILD ENC_SEPSZ db/0m M MEM32 - - - FILD ENC_SEPSZ
db//1 M MEM32 - - - FISTTP ENC_SEPSZ db/1m M MEM32 - - - FISTTP ENC_SEPSZ
db//2 M MEM32 - - - FIST ENC_SEPSZ db/2m M MEM32 - - - FIST ENC_SEPSZ
db//3 M MEM32 - - - FISTP ENC_SEPSZ db/3m M MEM32 - - - FISTP ENC_SEPSZ
db//5 M FPU - - - FLD db/5m M FPU - - - FLD
db//7 M FPU - - - FSTP db/7m M FPU - - - FSTP
db//c0+ O FPU - - - FCMOVNB db/0r M FPU - - - FCMOVNB
db//c8+ O FPU - - - FCMOVNE db/1r M FPU - - - FCMOVNE
db//d0+ O FPU - - - FCMOVNBE db/2r M FPU - - - FCMOVNBE
db//d8+ O FPU - - - FCMOVNU db/3r M FPU - - - FCMOVNU
db//e2 NP - - - - FCLEX dbe2 NP - - - - FCLEX
db//e3 NP - - - - FINIT dbe3 NP - - - - FINIT
db//e8+ O FPU - - - FUCOMI db/5r M FPU - - - FUCOMI
db//f0+ O FPU - - - FCOMI db/6r M FPU - - - FCOMI
dc//0 M MEM64 - - - FADD ENC_SEPSZ dc/0m M MEM64 - - - FADD ENC_SEPSZ
dc//1 M MEM64 - - - FMUL ENC_SEPSZ dc/1m M MEM64 - - - FMUL ENC_SEPSZ
dc//2 M MEM64 - - - FCOM ENC_SEPSZ dc/2m M MEM64 - - - FCOM ENC_SEPSZ
dc//3 M MEM64 - - - FCOMP ENC_SEPSZ dc/3m M MEM64 - - - FCOMP ENC_SEPSZ
dc//4 M MEM64 - - - FSUB ENC_SEPSZ dc/4m M MEM64 - - - FSUB ENC_SEPSZ
dc//5 M MEM64 - - - FSUBR ENC_SEPSZ dc/5m M MEM64 - - - FSUBR ENC_SEPSZ
dc//6 M MEM64 - - - FDIV ENC_SEPSZ dc/6m M MEM64 - - - FDIV ENC_SEPSZ
dc//7 M MEM64 - - - FDIVR ENC_SEPSZ dc/7m M MEM64 - - - FDIVR ENC_SEPSZ
dc//c0+ OA FPU FPU - - FADD dc/0r MA FPU FPU - - FADD
dc//c8+ OA FPU FPU - - FMUL dc/1r MA FPU FPU - - FMUL
dc//e0+ OA FPU FPU - - FSUBR dc/4r MA FPU FPU - - FSUBR
dc//e8+ OA FPU FPU - - FSUB dc/5r MA FPU FPU - - FSUB
dc//f0+ OA FPU FPU - - FDIVR dc/6r MA FPU FPU - - FDIVR
dc//f8+ OA FPU FPU - - FDIV dc/7r MA FPU FPU - - FDIV
dd//0 M MEM64 - - - FLD ENC_SEPSZ dd/0m M MEM64 - - - FLD ENC_SEPSZ
dd//1 M MEM64 - - - FISTTP ENC_SEPSZ dd/1m M MEM64 - - - FISTTP ENC_SEPSZ
dd//2 M MEM64 - - - FST ENC_SEPSZ dd/2m M MEM64 - - - FST ENC_SEPSZ
dd//3 M MEM64 - - - FSTP ENC_SEPSZ dd/3m M MEM64 - - - FSTP ENC_SEPSZ
dd//4 M MEMZ - - - FRSTOR dd/4m M MEMZ - - - FRSTOR
dd//6 M MEMZ - - - FSAVE dd/6m M MEMZ - - - FSAVE
dd//7 M MEM16 - - - FSTSW dd/7m M MEM16 - - - FSTSW
dd//c0+ O FPU - - - FFREE dd/0r M FPU - - - FFREE
dd//d0+ O FPU - - - FST dd/2r M FPU - - - FST
dd//d8+ O FPU - - - FSTP dd/3r M FPU - - - FSTP
dd//e0+ O FPU - - - FUCOM dd/4r M FPU - - - FUCOM
dd//e8+ O FPU - - - FUCOMP dd/5r M FPU - - - FUCOMP
de//0 M MEM16 - - - FIADD ENC_SEPSZ de/0m M MEM16 - - - FIADD ENC_SEPSZ
de//1 M MEM16 - - - FIMUL ENC_SEPSZ de/1m M MEM16 - - - FIMUL ENC_SEPSZ
de//2 M MEM16 - - - FICOM ENC_SEPSZ de/2m M MEM16 - - - FICOM ENC_SEPSZ
de//3 M MEM16 - - - FICOMP ENC_SEPSZ de/3m M MEM16 - - - FICOMP ENC_SEPSZ
de//4 M MEM16 - - - FISUB ENC_SEPSZ de/4m M MEM16 - - - FISUB ENC_SEPSZ
de//5 M MEM16 - - - FISUBR ENC_SEPSZ de/5m M MEM16 - - - FISUBR ENC_SEPSZ
de//6 M MEM16 - - - FIDIV ENC_SEPSZ de/6m M MEM16 - - - FIDIV ENC_SEPSZ
de//7 M MEM16 - - - FIDIVR ENC_SEPSZ de/7m M MEM16 - - - FIDIVR ENC_SEPSZ
de//c0+ OA FPU FPU - - FADDP de/0r MA FPU FPU - - FADDP
de//c8+ OA FPU FPU - - FMULP de/1r MA FPU FPU - - FMULP
de//d9 NP - - - - FCOMPP ded9 NP - - - - FCOMPP
de//e0+ OA FPU FPU - - FSUBRP de/4r MA FPU FPU - - FSUBRP
de//e8+ OA FPU FPU - - FSUBP de/5r MA FPU FPU - - FSUBP
de//f0+ OA FPU FPU - - FDIVRP de/6r MA FPU FPU - - FDIVRP
de//f8+ OA FPU FPU - - FDIVP de/7r MA FPU FPU - - FDIVP
df//0 M MEM16 - - - FILD ENC_SEPSZ df/0m M MEM16 - - - FILD ENC_SEPSZ
df//1 M MEM16 - - - FISTTP ENC_SEPSZ df/1m M MEM16 - - - FISTTP ENC_SEPSZ
df//2 M MEM16 - - - FIST ENC_SEPSZ df/2m M MEM16 - - - FIST ENC_SEPSZ
df//3 M MEM16 - - - FISTP ENC_SEPSZ df/3m M MEM16 - - - FISTP ENC_SEPSZ
df//4 M FPU - - - FBLD df/4m M FPU - - - FBLD
df//5 M MEM64 - - - FILD ENC_SEPSZ df/5m M MEM64 - - - FILD ENC_SEPSZ
df//6 M FPU - - - FBSTP df/6m M FPU - - - FBSTP
df//7 M MEM64 - - - FISTP ENC_SEPSZ df/7m M MEM64 - - - FISTP ENC_SEPSZ
# FSTSW AX # FSTSW AX
df//e0 A GP16 - - - FSTSW dfe0 A GP16 - - - FSTSW
df//f0+ AO FPU FPU - - FCOMIP df/6r AM FPU FPU - - FCOMIP
df//f8+ AO FPU FPU - - FUCOMIP df/7r AM FPU FPU - - FUCOMIP
# #
# Control Flow Enforcement # Control Flow Enforcement
F3.0f01//5 M GP64 - - - RSTORSSP F3.0f01/5m M GP64 - - - RSTORSSP
F3.0f01//e8 NP - - - - SETSSBSY F3.0f01e8 NP - - - - SETSSBSY
F3.0f01//ea NP - - - - SAVEPREVSSP F3.0f01ea NP - - - - SAVEPREVSSP
F3.0f1e//c8+ O GP - - - RDSSP F3.0f1e/1r M GP - - - RDSSP
F3.0f1e//fa NP - - - - ENDBR64 F3.0f1efa NP - - - - ENDBR64
F3.0f1e//fb NP - - - - ENDBR32 F3.0f1efb NP - - - - ENDBR32
66.0f38f5 MR MEM GP - - WRUSS 66.0f38f5 MR MEM GP - - WRUSS
NP.0f38f6 MR MEM GP - - WRSS NP.0f38f6 MR MEM GP - - WRSS
F3.0fae//6 M GP - - - CLRSSBSY F3.0fae/6m M GP - - - CLRSSBSY
F3.0fae//e8+ O GP - - - INCSSP F3.0fae/5r M GP - - - INCSSP
# #
# CLDEMOTE # CLDEMOTE
NP.0f1c/0 M MEMZ - - - CLDEMOTE NP.0f1c/0 M MEMZ - - - CLDEMOTE
@@ -1409,26 +1402,30 @@ NP.0f1c/0 M MEMZ - - - CLDEMOTE
# VMX # VMX
66.0f3880 RM GP MEMZ - - INVEPT DEF64 66.0f3880 RM GP MEMZ - - INVEPT DEF64
66.0f3881 RM GP MEMZ - - INVVPID DEF64 66.0f3881 RM GP MEMZ - - INVVPID DEF64
NP.0f01//c1 NP - - - - VMCALL NP.0f01c1 NP - - - - VMCALL
66.0fc7//6 M MEMZ - - - VMCLEAR 66.0fc7/6m M MEMZ - - - VMCLEAR
NP.0f01//d4 NP - - - - VMFUNC NP.0f01d4 NP - - - - VMFUNC
NP.0f01//c2 NP - - - - VMLAUNCH NP.0f01c2 NP - - - - VMLAUNCH
NP.0f01//c3 NP - - - - VMRESUME NP.0f01c3 NP - - - - VMRESUME
NP.0fc7//6 M MEMZ - - - VMPTRLD NP.0fc7/6m M MEMZ - - - VMPTRLD
NP.0fc7//7 M MEMZ - - - VMPTRST NP.0fc7/7m M MEMZ - - - VMPTRST
NP.0f78 MR GP GP - - VMREAD DEF64 NP.0f78 MR GP GP - - VMREAD DEF64
NP.0f79 MR GP GP - - VMWRITE DEF64 NP.0f79 MR GP GP - - VMWRITE DEF64
NP.0f01//c4 NP - - - - VMXOFF NP.0f01c4 NP - - - - VMXOFF
F3.0fc7//6 M MEMZ - - - VMXON F3.0fc7/6m M MEMZ - - - VMXON
# SEAM/TDX
66.0f01cc NP - - - - TDCALL
66.0f01cd NP - - - - SEAMRET
66.0f01ce NP - - - - SEAMOPS
66.0f01cf NP - - - - SEAMCALL
# WAITPKG # WAITPKG
66.0fae//f0+ O GP32 - - - TPAUSE 66.0fae/6r M GP32 - - - TPAUSE
F3.0fae//f0+ O GP - - - UMONITOR F3.0fae/6r M GP - - - UMONITOR
F2.0fae//f0+ O GP32 - - - UMWAIT F2.0fae/6r M GP32 - - - UMWAIT
# PRWRITE # PRWRITE
F3.0fae//4 M GP - - - PTWRITE F3.0fae/4 M GP - - - PTWRITE
F3.0fae//e0+ O GP - - - PTWRITE
# GFNI # GFNI
66.0f38cf RM XMM XMM - - GF2P8MULB 66.0f38cf RM XMM XMM - - GF2P8MULB
@@ -1440,29 +1437,29 @@ F2.0f38f8 RM GP MEMZ - - ENQCMD
F3.0f38f8 RM GP MEMZ - - ENQCMDS F3.0f38f8 RM GP MEMZ - - ENQCMDS
# PCONFIG # PCONFIG
NP.0f01//c5 NP - - - - PCONFIG NP.0f01c5 NP - - - - PCONFIG
# WBNOINVD # WBNOINVD
F3.0f09 NP - - - - WBNOINVD F3.0f09 NP - - - - WBNOINVD
NP.0f01//ee NP - - - - RDPKRU NP.0f01ee NP - - - - RDPKRU
NP.0f01//ef NP - - - - WRPKRU NP.0f01ef NP - - - - WRPKRU
F3.0fae//c0+ O GP - - - RDFSBASE ONLY64 F3.0fae/0r M GP - - - RDFSBASE ONLY64
F3.0fae//c8+ O GP - - - RDGSBASE ONLY64 F3.0fae/1r M GP - - - RDGSBASE ONLY64
F3.0fae//d0+ O GP - - - WRFSBASE ONLY64 F3.0fae/2r M GP - - - WRFSBASE ONLY64
F3.0fae//d8+ O GP - - - WRGSBASE ONLY64 F3.0fae/3r M GP - - - WRGSBASE ONLY64
NP.0fae//4 M MEMZ - - - XSAVE INSTR_WIDTH NP.0fae/4m M MEMZ - - - XSAVE INSTR_WIDTH
NP.0fae//5 M MEMZ - - - XRSTOR INSTR_WIDTH NP.0fae/5m M MEMZ - - - XRSTOR INSTR_WIDTH
NP.0fae//6 M MEMZ - - - XSAVEOPT INSTR_WIDTH NP.0fae/6m M MEMZ - - - XSAVEOPT INSTR_WIDTH
66.0fae//6 M MEM8 - - - CLWB 66.0fae/6m M MEM8 - - - CLWB
NP.0fae//7 M MEM8 - - - CLFLUSH NP.0fae/7m M MEM8 - - - CLFLUSH
66.0fae//7 M MEM8 - - - CLFLUSHOPT 66.0fae/7m M MEM8 - - - CLFLUSHOPT
NP.0fc7//3 M MEMZ - - - XRSTORS INSTR_WIDTH NP.0fc7/3m M MEMZ - - - XRSTORS INSTR_WIDTH
NP.0fc7//4 M MEMZ - - - XSAVEC INSTR_WIDTH NP.0fc7/4m M MEMZ - - - XSAVEC INSTR_WIDTH
NP.0fc7//5 M MEMZ - - - XSAVES INSTR_WIDTH NP.0fc7/5m M MEMZ - - - XSAVES INSTR_WIDTH
NFx.0fc7//f0+ O GP - - - RDRAND NFx.0fc7/6r M GP - - - RDRAND
NFx.0fc7//f8+ O GP - - - RDSEED NFx.0fc7/7r M GP - - - RDSEED
F3.0fc7//f8+ O GP - - - RDPID DEF64 F3.0fc7/7r M GP - - - RDPID DEF64
66.0f3882 RM GP MEMZ - - INVPCID DEF64 66.0f3882 RM GP MEMZ - - INVPCID DEF64
NP.0f38c8 RM XMM XMM - - SHA1NEXTE NP.0f38c8 RM XMM XMM - - SHA1NEXTE
NP.0f38c9 RM XMM XMM - - SHA1MSG1 NP.0f38c9 RM XMM XMM - - SHA1MSG1

View File

@@ -63,12 +63,13 @@ ENCODINGS = {
"MRI": InstrFlags(modrm_idx=0^3, modreg_idx=1^3, imm_idx=2^3, imm_control=4), "MRI": InstrFlags(modrm_idx=0^3, modreg_idx=1^3, imm_idx=2^3, imm_control=4),
"RMI": InstrFlags(modrm_idx=1^3, modreg_idx=0^3, imm_idx=2^3, imm_control=4), "RMI": InstrFlags(modrm_idx=1^3, modreg_idx=0^3, imm_idx=2^3, imm_control=4),
"MRC": InstrFlags(modrm_idx=0^3, modreg_idx=1^3, zeroreg_idx=2^3, zeroreg_val=1), "MRC": InstrFlags(modrm_idx=0^3, modreg_idx=1^3, zeroreg_idx=2^3, zeroreg_val=1),
"AM": InstrFlags(modrm_idx=1^3, zeroreg_idx=0^3),
"MA": InstrFlags(modrm_idx=0^3, zeroreg_idx=1^3),
"I": InstrFlags(imm_idx=0^3, imm_control=4), "I": InstrFlags(imm_idx=0^3, imm_control=4),
"IA": InstrFlags(zeroreg_idx=0^3, imm_idx=1^3, imm_control=4), "IA": InstrFlags(zeroreg_idx=0^3, imm_idx=1^3, imm_control=4),
"O": InstrFlags(modreg_idx=0^3), "O": InstrFlags(modreg_idx=0^3),
"OI": InstrFlags(modreg_idx=0^3, imm_idx=1^3, imm_control=4), "OI": InstrFlags(modreg_idx=0^3, imm_idx=1^3, imm_control=4),
"OA": InstrFlags(modreg_idx=0^3, zeroreg_idx=1^3), "OA": InstrFlags(modreg_idx=0^3, zeroreg_idx=1^3),
"AO": InstrFlags(modreg_idx=1^3, zeroreg_idx=0^3),
"A": InstrFlags(zeroreg_idx=0^3), "A": InstrFlags(zeroreg_idx=0^3),
"D": InstrFlags(imm_idx=0^3, imm_control=6), "D": InstrFlags(imm_idx=0^3, imm_control=6),
"FD": InstrFlags(zeroreg_idx=0^3, imm_idx=1^3, imm_control=2), "FD": InstrFlags(zeroreg_idx=0^3, imm_idx=1^3, imm_control=2),
@@ -245,17 +246,17 @@ import re
opcode_regex = re.compile( opcode_regex = re.compile(
r"^(?:(?P<prefixes>(?P<vex>VEX\.)?(?P<legacy>NP|66|F2|F3|NFx)\." + r"^(?:(?P<prefixes>(?P<vex>VEX\.)?(?P<legacy>NP|66|F2|F3|NFx)\." +
r"(?:W(?P<rexw>[01]|IG)\.)?(?:L(?P<vexl>[01]|IG)\.)?))?" + r"(?:W(?P<rexw>[01]|IG)\.)?(?:L(?P<vexl>[01]|IG)\.)?))?" +
r"(?P<escape>(?:0f|0f38|0f3a)?)" + r"(?P<escape>0f38|0f3a|0f|)" +
r"(?P<opcode>[0-9a-f]{2})" + r"(?P<opcode>[0-9a-f]{2})" +
r"(?P<modrm>//?[0-7]|//[c-f][0-9a-f])?" + r"(?:(?P<extended>\+)|/(?P<modreg>[0-7][rm]?)|(?P<opcext>[c-f][0-9a-f]))?$")
r"(?P<extended>\+)?$")
class Opcode(NamedTuple): class Opcode(NamedTuple):
prefix: Union[None, Tuple[bool, str]] # (False, NP/66/F2/F3), (True, NP/F2/F3) prefix: Union[None, str] # None/NP/66/F2/F3/NFx
escape: int # [0, 0f, 0f38, 0f3a] escape: int # [0, 0f, 0f38, 0f3a]
opc: int opc: int
opcext: Union[None, Tuple[bool, int]] # (False, T8), (True, T72), None
extended: bool # Extend opc or opcext, if present extended: bool # Extend opc or opcext, if present
modreg: Union[None, Tuple[int, str]] # (modreg, "r"/"m"/"rm"), None
opcext: Union[None, int] # 0xc0-0xff, or 0
vex: bool vex: bool
vexl: Union[str, None] # 0, 1, IG, None = used, both vexl: Union[str, None] # 0, 1, IG, None = used, both
rexw: Union[str, None] # 0, 1, IG, None = used, both rexw: Union[str, None] # 0, 1, IG, None = used, both
@@ -264,22 +265,20 @@ class Opcode(NamedTuple):
def parse(cls, opcode_string): def parse(cls, opcode_string):
match = opcode_regex.match(opcode_string) match = opcode_regex.match(opcode_string)
if match is None: if match is None:
raise Exception(opcode_string)
return None return None
opcext = match.group("modrm") modreg = match.group("modreg")
if opcext: if modreg:
is72 = opcext[1] == "/" modreg = int(modreg[0]), modreg[1] if len(modreg) == 2 else "rm"
opcext = is72, int(opcext[1 + is72:], 16)
if match.group("extended") and opcext and not opcext[0]:
raise Exception("invalid opcode extension: {}".format(opcode_string))
return cls( return cls(
prefix=match.group("legacy"), prefix=match.group("legacy"),
escape=["", "0f", "0f38", "0f3a"].index(match.group("escape")), escape=["", "0f", "0f38", "0f3a"].index(match.group("escape")),
opc=int(match.group("opcode"), 16), opc=int(match.group("opcode"), 16),
opcext=opcext,
extended=match.group("extended") is not None, extended=match.group("extended") is not None,
modreg=modreg,
opcext=int(match.group("opcext") or "0", 16) or None,
vex=match.group("vex") is not None, vex=match.group("vex") is not None,
vexl=match.group("vexl"), vexl=match.group("vexl"),
rexw=match.group("rexw"), rexw=match.group("rexw"),
@@ -288,7 +287,10 @@ class Opcode(NamedTuple):
def for_trie(self): def for_trie(self):
opcode = [] opcode = []
opcode.append((EntryKind.TABLE_ROOT, [self.escape | self.vex << 2])) opcode.append((EntryKind.TABLE_ROOT, [self.escape | self.vex << 2]))
opcode.append((EntryKind.TABLE256, [self.opc])) if not self.extended:
opcode.append((EntryKind.TABLE256, [self.opc]))
else:
opcode.append((EntryKind.TABLE256, [self.opc + i for i in range(8)]))
if self.prefix: if self.prefix:
if self.prefix == "NFx": if self.prefix == "NFx":
opcode.append((EntryKind.TABLE_PREFIX, [0, 1])) opcode.append((EntryKind.TABLE_PREFIX, [0, 1]))
@@ -296,20 +298,11 @@ class Opcode(NamedTuple):
prefix_val = ["NP", "66", "F3", "F2"].index(self.prefix) prefix_val = ["NP", "66", "F3", "F2"].index(self.prefix)
opcode.append((EntryKind.TABLE_PREFIX, [prefix_val])) opcode.append((EntryKind.TABLE_PREFIX, [prefix_val]))
if self.opcext: if self.opcext:
opcext_val = self.opcext[1] opcode.append((EntryKind.TABLE16, [((self.opcext - 0xc0) >> 3) | 8]))
if not self.opcext[0]: opcode.append((EntryKind.TABLE8E, [self.opcext & 7]))
opcode.append((EntryKind.TABLE16, [opcext_val, opcext_val | 8])) if self.modreg:
elif opcext_val < 8: mod = {"m": [0], "r": [1<<3], "rm": [0, 1<<3]}[self.modreg[1]]
opcode.append((EntryKind.TABLE16, [opcext_val])) opcode.append((EntryKind.TABLE16, [self.modreg[0] + x for x in mod]))
else:
opcode.append((EntryKind.TABLE16, [((opcext_val - 0xc0) >> 3) | 8]))
if not self.extended:
opcode.append((EntryKind.TABLE8E, [opcext_val & 7]))
else:
opcode.append((EntryKind.TABLE8E, list(range(8))))
if self.extended and not self.opcext:
last_type, last_indices = opcode[-1]
opcode[-1] = last_type, [last_indices[0] + i for i in range(8)]
if self.vexl in ("0", "1") or self.rexw in ("0", "1"): if self.vexl in ("0", "1") or self.rexw in ("0", "1"):
rexw = {"0": [0], "1": [1<<0], "IG": [0, 1<<0]}[self.rexw or "IG"] rexw = {"0": [0], "1": [1<<0], "IG": [0, 1<<0]}[self.rexw or "IG"]
vexl = {"0": [0], "1": [1<<1], "IG": [0, 1<<1]}[self.vexl or "IG"] vexl = {"0": [0], "1": [1<<1], "IG": [0, 1<<1]}[self.vexl or "IG"]
@@ -449,7 +442,11 @@ def encode_table(entries):
opsizes = {8} if "SIZE_8" in desc.flags else {16, 32, 64} opsizes = {8} if "SIZE_8" in desc.flags else {16, 32, 64}
hasvex, vecsizes = False, {128} hasvex, vecsizes = False, {128}
opc_i = opcode.opc | (opcode.opcext[1] << 8 if opcode.opcext else 0) opc_i = opcode.opc
if opcode.opcext:
opc_i |= opcode.opcext << 8
if opcode.modreg:
opc_i |= opcode.modreg[0] << 8
opc_flags = "" opc_flags = ""
opc_flags += ["","|OPC_0F","|OPC_0F38","|OPC_0F3A"][opcode.escape] opc_flags += ["","|OPC_0F","|OPC_0F38","|OPC_0F3A"][opcode.escape]
if opcode.vex: if opcode.vex:
@@ -490,9 +487,10 @@ def encode_table(entries):
if enc.modrm_idx: if enc.modrm_idx:
if "NOMEM" in desc.flags: if "NOMEM" in desc.flags:
optypes[enc.modrm_idx^3] = "r" optypes[enc.modrm_idx^3] = "r"
elif ((opcode.opcext and opcode.opcext[0] and opcode.opcext[1] < 8) elif desc.operands[enc.modrm_idx^3].kind == OpKind.K_MEM:
or desc.operands[enc.modrm_idx^3].kind == OpKind.K_MEM):
optypes[enc.modrm_idx^3] = "m" optypes[enc.modrm_idx^3] = "m"
elif opcode.modreg:
optypes[enc.modrm_idx^3] = opcode.modreg[1]
else: else:
optypes[enc.modrm_idx^3] = "rm" optypes[enc.modrm_idx^3] = "rm"
if enc.modreg_idx: optypes[enc.modreg_idx^3] = "r" if enc.modreg_idx: optypes[enc.modreg_idx^3] = "r"