From da4ad137d872ecd0da8958e5f9b62d55a1cd462f Mon Sep 17 00:00:00 2001 From: Alexis Engelke Date: Thu, 2 Jul 2020 08:58:35 +0200 Subject: [PATCH] instrs: Remove redundant IMM_8 --- instrs.txt | 356 ++++++++++++++++++++++---------------------- parseinstrs.py | 7 +- tests/test_decode.c | 12 ++ 3 files changed, 196 insertions(+), 179 deletions(-) diff --git a/instrs.txt b/instrs.txt index de07e69..857fe80 100644 --- a/instrs.txt +++ b/instrs.txt @@ -2,7 +2,7 @@ 01 MR GP GP - - ADD LOCK 02 RM GP GP - - ADD SIZE_8 03 RM GP GP - - ADD -04 IA GP IMM - - ADD SIZE_8 IMM_8 +04 IA GP IMM - - ADD SIZE_8 05 IA GP IMM - - ADD 06 NP - - - - PUSH_ES ONLY32 07 NP - - - - POP_ES ONLY32 @@ -10,7 +10,7 @@ 09 MR GP GP - - OR LOCK 0a RM GP GP - - OR SIZE_8 0b RM GP GP - - OR -0c IA GP IMM - - OR SIZE_8 IMM_8 +0c IA GP IMM - - OR SIZE_8 0d IA GP IMM - - OR 0e NP - - - - PUSH_CS ONLY32 #0f escape opcode @@ -18,7 +18,7 @@ 11 MR GP GP - - ADC LOCK 12 RM GP GP - - ADC SIZE_8 13 RM GP GP - - ADC -14 IA GP IMM - - ADC SIZE_8 IMM_8 +14 IA GP IMM - - ADC SIZE_8 15 IA GP IMM - - ADC 16 NP - - - - PUSH_SS ONLY32 17 NP - - - - POP_SS ONLY32 @@ -26,7 +26,7 @@ 19 MR GP GP - - SBB LOCK 1a RM GP GP - - SBB SIZE_8 1b RM GP GP - - SBB -1c IA GP IMM - - SBB SIZE_8 IMM_8 +1c IA GP IMM - - SBB SIZE_8 1d IA GP IMM - - SBB 1e NP - - - - PUSH_DS ONLY32 1f NP - - - - POP_DS ONLY32 @@ -34,7 +34,7 @@ 21 MR GP GP - - AND LOCK 22 RM GP GP - - AND SIZE_8 23 RM GP GP - - AND -24 IA GP IMM - - AND SIZE_8 IMM_8 +24 IA GP IMM - - AND SIZE_8 25 IA GP IMM - - AND #26 SEG=ES prefix 27 NP - - - - DAA ONLY32 @@ -42,7 +42,7 @@ 29 MR GP GP - - SUB LOCK 2a RM GP GP - - SUB SIZE_8 2b RM GP GP - - SUB -2c IA GP IMM - - SUB SIZE_8 IMM_8 +2c IA GP IMM - - SUB SIZE_8 2d IA GP IMM - - SUB #2e SEG=CS prefix 2f NP - - - - DAS ONLY32 @@ -50,7 +50,7 @@ 31 MR GP GP - - XOR LOCK 32 RM GP GP - - XOR SIZE_8 33 RM GP GP - - XOR -34 IA GP IMM - - XOR SIZE_8 IMM_8 +34 IA GP IMM - - XOR SIZE_8 35 IA GP IMM - - XOR #36 SEG=SS prefix 37 NP - - - - AAA ONLY32 @@ -58,7 +58,7 @@ 39 MR GP GP - - CMP 3a RM GP GP - - CMP SIZE_8 3b RM GP GP - - CMP -3c IA GP IMM - - CMP SIZE_8 IMM_8 +3c IA GP IMM - - CMP SIZE_8 3d IA GP IMM - - CMP #3e SEG=DS prefix 3f NP - - - - AAS ONLY32 INSTR_WIDTH @@ -99,14 +99,14 @@ 7d D IMM - - - JGE DEF64 IMM_8 7e D IMM - - - JLE DEF64 IMM_8 7f D IMM - - - JG DEF64 IMM_8 -80/0 MI GP IMM - - ADD IMM_8 SIZE_8 LOCK -80/1 MI GP IMM - - OR IMM_8 SIZE_8 LOCK -80/2 MI GP IMM - - ADC IMM_8 SIZE_8 LOCK -80/3 MI GP IMM - - SBB IMM_8 SIZE_8 LOCK -80/4 MI GP IMM - - AND IMM_8 SIZE_8 LOCK -80/5 MI GP IMM - - SUB IMM_8 SIZE_8 LOCK -80/6 MI GP IMM - - XOR IMM_8 SIZE_8 LOCK -80/7 MI GP IMM - - CMP IMM_8 SIZE_8 +80/0 MI GP IMM - - ADD SIZE_8 LOCK +80/1 MI GP IMM - - OR SIZE_8 LOCK +80/2 MI GP IMM - - ADC SIZE_8 LOCK +80/3 MI GP IMM - - SBB SIZE_8 LOCK +80/4 MI GP IMM - - AND SIZE_8 LOCK +80/5 MI GP IMM - - SUB SIZE_8 LOCK +80/6 MI GP IMM - - XOR SIZE_8 LOCK +80/7 MI GP IMM - - CMP SIZE_8 81/0 MI GP IMM - - ADD LOCK 81/1 MI GP IMM - - OR LOCK 81/2 MI GP IMM - - ADC LOCK @@ -115,14 +115,14 @@ 81/5 MI GP IMM - - SUB LOCK 81/6 MI GP IMM - - XOR LOCK 81/7 MI GP IMM - - CMP -82/0 MI GP IMM - - ADD ONLY32 IMM_8 SIZE_8 LOCK -82/1 MI GP IMM - - OR ONLY32 IMM_8 SIZE_8 LOCK -82/2 MI GP IMM - - ADC ONLY32 IMM_8 SIZE_8 LOCK -82/3 MI GP IMM - - SBB ONLY32 IMM_8 SIZE_8 LOCK -82/4 MI GP IMM - - AND ONLY32 IMM_8 SIZE_8 LOCK -82/5 MI GP IMM - - SUB ONLY32 IMM_8 SIZE_8 LOCK -82/6 MI GP IMM - - XOR ONLY32 IMM_8 SIZE_8 LOCK -82/7 MI GP IMM - - CMP ONLY32 IMM_8 SIZE_8 +82/0 MI GP IMM - - ADD ONLY32 SIZE_8 LOCK +82/1 MI GP IMM - - OR ONLY32 SIZE_8 LOCK +82/2 MI GP IMM - - ADC ONLY32 SIZE_8 LOCK +82/3 MI GP IMM - - SBB ONLY32 SIZE_8 LOCK +82/4 MI GP IMM - - AND ONLY32 SIZE_8 LOCK +82/5 MI GP IMM - - SUB ONLY32 SIZE_8 LOCK +82/6 MI GP IMM - - XOR ONLY32 SIZE_8 LOCK +82/7 MI GP IMM - - CMP ONLY32 SIZE_8 83/0 MI GP IMM - - ADD IMM_8 LOCK 83/1 MI GP IMM - - OR IMM_8 LOCK 83/2 MI GP IMM - - ADC IMM_8 LOCK @@ -169,7 +169,7 @@ a4 NP - - - - MOVS SIZE_8 INSTR_WIDTH a5 NP - - - - MOVS INSTR_WIDTH a6 NP - - - - CMPS SIZE_8 INSTR_WIDTH a7 NP - - - - CMPS INSTR_WIDTH -a8 IA GP IMM - - TEST SIZE_8 IMM_8 +a8 IA GP IMM - - TEST SIZE_8 a9 IA GP IMM - - TEST aa NP - - - - STOS SIZE_8 INSTR_WIDTH ab NP - - - - STOS INSTR_WIDTH @@ -177,30 +177,30 @@ ac NP - - - - LODS SIZE_8 INSTR_WIDTH ad NP - - - - LODS INSTR_WIDTH ae NP - - - - SCAS SIZE_8 INSTR_WIDTH af NP - - - - SCAS INSTR_WIDTH -b0+ OI GP IMM - - MOVABS SIZE_8 IMM_8 +b0+ OI GP IMM8 - - MOVABS SIZE_8 b8+ OI GP IMM - - MOVABS -c0/0 MI GP IMM - - ROL SIZE_8 IMM_8 -c0/1 MI GP IMM - - ROR SIZE_8 IMM_8 -c0/2 MI GP IMM - - RCL SIZE_8 IMM_8 -c0/3 MI GP IMM - - RCR SIZE_8 IMM_8 -c0/4 MI GP IMM - - SHL SIZE_8 IMM_8 -c0/5 MI GP IMM - - SHR SIZE_8 IMM_8 -c0/7 MI GP IMM - - SAR SIZE_8 IMM_8 -c1/0 MI GP IMM - - ROL IMM_8 -c1/1 MI GP IMM - - ROR IMM_8 -c1/2 MI GP IMM - - RCL IMM_8 -c1/3 MI GP IMM - - RCR IMM_8 -c1/4 MI GP IMM - - SHL IMM_8 -c1/5 MI GP IMM - - SHR IMM_8 -c1/7 MI GP IMM - - SAR IMM_8 +c0/0 MI GP IMM8 - - ROL SIZE_8 +c0/1 MI GP IMM8 - - ROR SIZE_8 +c0/2 MI GP IMM8 - - RCL SIZE_8 +c0/3 MI GP IMM8 - - RCR SIZE_8 +c0/4 MI GP IMM8 - - SHL SIZE_8 +c0/5 MI GP IMM8 - - SHR SIZE_8 +c0/7 MI GP IMM8 - - SAR SIZE_8 +c1/0 MI GP IMM8 - - ROL +c1/1 MI GP IMM8 - - ROR +c1/2 MI GP IMM8 - - RCL +c1/3 MI GP IMM8 - - RCR +c1/4 MI GP IMM8 - - SHL +c1/5 MI GP IMM8 - - SHR +c1/7 MI GP IMM8 - - SAR # RET immediate size handled in code c2 I IMM16 - - - RET DEF64 INSTR_WIDTH 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 +c6//0 MI GP IMM - - MOV SIZE_8 +c6//c0+ OI GP IMM - - MOV SIZE_8 +c6//f8 I IMM8 - - - XABORT c7//0 MI GP IMM - - MOV c7//c0+ OI GP IMM - - MOV c7//f8 D IMM - - - XBEGIN @@ -211,7 +211,7 @@ c9 NP - - - - LEAVE DEF64 INSTR_WIDTH ca I IMM16 - - - RETF INSTR_WIDTH cb NP - - - - RETF INSTR_WIDTH cc NP - - - - INT3 -cd I IMM8 - - - INT IMM_8 +cd I IMM8 - - - INT ce NP - - - - INTO ONLY32 cf NP - - - - IRET INSTR_WIDTH d0/0 M1 GP IMM8 - - ROL SIZE_8 @@ -242,8 +242,8 @@ d3/3 MC GP GP8 - - RCR d3/4 MC GP GP8 - - SHL d3/5 MC GP GP8 - - SHR d3/7 MC GP GP8 - - SAR -d4 I IMM - - - AAM ONLY32 SIZE_8 IMM_8 -d5 I IMM - - - AAD ONLY32 SIZE_8 IMM_8 +d4 I IMM - - - AAM ONLY32 SIZE_8 +d5 I IMM - - - AAD ONLY32 SIZE_8 #d6 unused d7 NP - - - - XLATB #d8-df FPU Escape @@ -251,10 +251,10 @@ e0 D IMM - - - LOOPNZ DEF64 IMM_8 e1 D IMM - - - LOOPZ DEF64 IMM_8 e2 D IMM - - - LOOP DEF64 IMM_8 e3 D IMM - - - JCXZ DEF64 IMM_8 -e4 IA GP IMM - - IN SIZE_8 IMM_8 -e5 IA GP IMM - - IN IMM_8 -e6 IA GP IMM - - OUT SIZE_8 IMM_8 -e7 IA GP IMM - - OUT IMM_8 +e4 IA GP IMM8 - - IN SIZE_8 +e5 IA GP IMM8 - - IN +e6 IA GP IMM8 - - OUT SIZE_8 +e7 IA GP IMM8 - - OUT e8 D IMM - - - CALL DEF64 e9 D IMM - - - JMP DEF64 #ea JMPf TODO, ONLY32 @@ -269,7 +269,7 @@ f1 NP - - - - INT1 #f3 REP/REPZ prefix f4 NP - - - - HLT f5 NP - - - - CMC -f6/0 MI GP IMM - - TEST SIZE_8 IMM_8 +f6/0 MI GP IMM - - TEST SIZE_8 f6/2 M GP - - - NOT SIZE_8 LOCK f6/3 M GP - - - NEG SIZE_8 LOCK f6/4 M GP - - - MUL SIZE_8 @@ -427,13 +427,13 @@ NP.0f37 NP - - - - GETSEC 0fa1 NP - - - - POP_FS DEF64 INSTR_WIDTH 0fa2 NP - - - - CPUID 0fa3 MR GP GP - - BT -0fa4 MRI GP GP IMM8 - SHLD IMM_8 +0fa4 MRI GP GP IMM8 - SHLD 0fa5 MRC GP GP GP8 - SHLD 0fa8 NP - - - - PUSH_GS DEF64 INSTR_WIDTH 0fa9 NP - - - - POP_GS DEF64 INSTR_WIDTH 0faa NP - - - - RSM 0fab MR GP GP - - BTS LOCK -0fac MRI GP GP IMM8 - SHRD IMM_8 +0fac MRI GP GP IMM8 - SHRD 0fad MRC GP GP GP8 - SHRD 0faf RM GP GP - - IMUL 0fb0 MR GP GP - - CMPXCHG SIZE_8 LOCK @@ -446,10 +446,10 @@ NP.0f37 NP - - - - GETSEC 0fb7 RM GP GP16 - - MOVZX RF3.0fb8 RM GP GP - - POPCNT 0fb9 RM GP GP - - UD1 -0fba/4 MI GP IMM8 - - BT IMM_8 -0fba/5 MI GP IMM8 - - BTS IMM_8 LOCK -0fba/6 MI GP IMM8 - - BTR IMM_8 LOCK -0fba/7 MI GP IMM8 - - BTC IMM_8 LOCK +0fba/4 MI GP IMM8 - - BT +0fba/5 MI GP IMM8 - - BTS LOCK +0fba/6 MI GP IMM8 - - BTR LOCK +0fba/7 MI GP IMM8 - - BTC LOCK 0fbb MR GP GP - - BTC LOCK RNP.0fbc RM GP GP - - BSF RF2.0fbc RM GP GP - - BSF @@ -493,14 +493,14 @@ NP.0f6b RM MMX MMX - - MMX_PACKSSDW NP.W0.0f6e RM MMX GP - - MMX_MOVD NP.W1.0f6e RM MMX GP - - MMX_MOVQ NP.0f6f RM MMX MMX - - MMX_MOVQ -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.0f71/2 MI MMX IMM8 - - MMX_PSRLW NOMEM +NP.0f71/4 MI MMX IMM8 - - MMX_PSRAW NOMEM +NP.0f71/6 MI MMX IMM8 - - MMX_PSLLW NOMEM +NP.0f72/2 MI MMX IMM8 - - MMX_PSRLD NOMEM +NP.0f72/4 MI MMX IMM8 - - MMX_PSRAD NOMEM +NP.0f72/6 MI MMX IMM8 - - MMX_PSLLD NOMEM +NP.0f73/2 MI MMX IMM8 - - MMX_PSRLQ NOMEM +NP.0f73/6 MI MMX IMM8 - - MMX_PSLLQ NOMEM NP.0f74 RM MMX MMX - - MMX_PCMPEQB NP.0f75 RM MMX MMX - - MMX_PCMPEQW NP.0f76 RM MMX MMX - - MMX_PCMPEQD @@ -508,8 +508,8 @@ NP.0f77 NP - - - - MMX_EMMS NP.W0.0f7e MR GP MMX - - MMX_MOVD NP.W1.0f7e MR GP MMX - - MMX_MOVQ NP.0f7f MR MMX MMX - - MMX_MOVQ -NP.0fc4 RMI MMX GP IMM8 - MMX_PINSRW IMM_8 -NP.0fc5 RMI GP MMX IMM8 - MMX_PEXTRW IMM_8 NOMEM +NP.0fc4 RMI MMX GP IMM8 - MMX_PINSRW +NP.0fc5 RMI GP MMX IMM8 - MMX_PEXTRW NOMEM NP.0fd1 RM MMX MMX - - MMX_PSRLW NP.0fd2 RM MMX MMX - - MMX_PSRLD NP.0fd3 RM MMX MMX - - MMX_PSRLQ @@ -570,7 +570,7 @@ 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 IMM8 - MMX_PALIGNR IMM_8 +NP.0f3a0f RMI MMX MMX IMM8 - MMX_PALIGNR # # SSE @@ -681,19 +681,19 @@ F2.0f5f RM XMM64 XMM64 - - SSE_MAXSD 66.W1.0f6e RM XMM GP - - SSE_MOVQ 66.0f6f RM XMM XMM - - SSE_MOVDQA F3.0f6f RM XMM XMM - - SSE_MOVDQU -66.0f70 RMI XMM XMM IMM8 - SSE_PSHUFD IMM_8 -F3.0f70 RMI XMM XMM IMM8 - SSE_PSHUFHW IMM_8 -F2.0f70 RMI XMM XMM IMM8 - SSE_PSHUFLW IMM_8 -66.0f71/2 MI XMM IMM8 - - SSE_PSRLW IMM_8 NOMEM -66.0f71/4 MI XMM IMM8 - - SSE_PSRAW IMM_8 NOMEM -66.0f71/6 MI XMM IMM8 - - SSE_PSLLW IMM_8 NOMEM -66.0f72/2 MI XMM IMM8 - - SSE_PSRLD IMM_8 NOMEM -66.0f72/4 MI XMM IMM8 - - SSE_PSRAD IMM_8 NOMEM -66.0f72/6 MI XMM IMM8 - - SSE_PSLLD IMM_8 NOMEM -66.0f73/2 MI XMM IMM8 - - SSE_PSRLQ IMM_8 NOMEM -66.0f73/3 MI XMM IMM8 - - SSE_PSRLDQ IMM_8 NOMEM -66.0f73/6 MI XMM IMM8 - - SSE_PSLLQ IMM_8 NOMEM -66.0f73/7 MI XMM IMM8 - - SSE_PSLLDQ IMM_8 NOMEM +66.0f70 RMI XMM XMM IMM8 - SSE_PSHUFD +F3.0f70 RMI XMM XMM IMM8 - SSE_PSHUFHW +F2.0f70 RMI XMM XMM IMM8 - SSE_PSHUFLW +66.0f71/2 MI XMM IMM8 - - SSE_PSRLW NOMEM +66.0f71/4 MI XMM IMM8 - - SSE_PSRAW NOMEM +66.0f71/6 MI XMM IMM8 - - SSE_PSLLW NOMEM +66.0f72/2 MI XMM IMM8 - - SSE_PSRLD NOMEM +66.0f72/4 MI XMM IMM8 - - SSE_PSRAD NOMEM +66.0f72/6 MI XMM IMM8 - - SSE_PSLLD NOMEM +66.0f73/2 MI XMM IMM8 - - SSE_PSRLQ NOMEM +66.0f73/3 MI XMM IMM8 - - SSE_PSRLDQ NOMEM +66.0f73/6 MI XMM IMM8 - - SSE_PSLLQ NOMEM +66.0f73/7 MI XMM IMM8 - - SSE_PSLLDQ NOMEM 66.0f74 RM XMM XMM - - SSE_PCMPEQB 66.0f75 RM XMM XMM - - SSE_PCMPEQW 66.0f76 RM XMM XMM - - SSE_PCMPEQD @@ -713,14 +713,14 @@ NP.0fae//3 M MEM32 - - - STMXCSR NP.0fae//e8+ NP - - - - LFENCE NP.0fae//f0+ NP - - - - MFENCE NP.0fae//f8+ NP - - - - SFENCE -NP.0fc2 RMI XMM XMM IMM8 - SSE_CMPPS IMM_8 -66.0fc2 RMI XMM XMM IMM8 - SSE_CMPPD IMM_8 -F3.0fc2 RMI XMM XMM32 IMM8 - SSE_CMPSS IMM_8 -F2.0fc2 RMI XMM XMM64 IMM8 - SSE_CMPSD IMM_8 -66.0fc4 RMI XMM GP IMM8 - SSE_PINSRW IMM_8 -66.0fc5 RMI GP XMM IMM8 - SSE_PEXTRW IMM_8 NOMEM -NP.0fc6 RMI XMM XMM IMM8 - SSE_SHUFPS IMM_8 -66.0fc6 RMI XMM XMM IMM8 - SSE_SHUFPD IMM_8 +NP.0fc2 RMI XMM XMM IMM8 - SSE_CMPPS +66.0fc2 RMI XMM XMM IMM8 - SSE_CMPPD +F3.0fc2 RMI XMM XMM32 IMM8 - SSE_CMPSS +F2.0fc2 RMI XMM XMM64 IMM8 - SSE_CMPSD +66.0fc4 RMI XMM GP IMM8 - SSE_PINSRW +66.0fc5 RMI GP XMM IMM8 - SSE_PEXTRW NOMEM +NP.0fc6 RMI XMM XMM IMM8 - SSE_SHUFPS +66.0fc6 RMI XMM XMM IMM8 - SSE_SHUFPD 66.0fd0 RM XMM XMM - - SSE_ADDSUBPD F2.0fd0 RM XMM XMM - - SSE_ADDSUBPS 66.0fd1 RM XMM XMM - - SSE_PSRLW @@ -822,44 +822,44 @@ F2.0ff0 RM XMM XMM - - SSE_LDDQU MUSTMEM 66.0f38f8 RM GP MEMZ - - MOVDIR64B MUSTMEM NP.0f38f9 MR GP GP - - MOVDIRI MUSTMEM # -66.0f3a08 RMI XMM XMM IMM8 - SSE_ROUNDPS IMM_8 -66.0f3a09 RMI XMM XMM IMM8 - SSE_ROUNDPD IMM_8 -66.0f3a0a RMI XMM32 XMM32 IMM8 - SSE_ROUNDSS IMM_8 -66.0f3a0b RMI XMM64 XMM64 IMM8 - SSE_ROUNDSD IMM_8 -66.0f3a0c RMI XMM XMM IMM8 - SSE_BLENDPS IMM_8 -66.0f3a0d RMI XMM XMM IMM8 - SSE_BLENDPD IMM_8 -66.0f3a0e RMI XMM XMM IMM8 - SSE_PBLENDW IMM_8 -66.0f3a0f RMI XMM XMM IMM8 - SSE_PALIGNR IMM_8 -66.0f3a14 MRI GP8 XMM IMM8 - SSE_PEXTRB IMM_8 -66.0f3a15 MRI GP16 XMM IMM8 - SSE_PEXTRW IMM_8 -66.W0.0f3a16 MRI GP XMM IMM8 - SSE_PEXTRD IMM_8 -66.W1.0f3a16 MRI GP XMM IMM8 - SSE_PEXTRQ IMM_8 -66.0f3a17 MRI GP32 XMM IMM8 - SSE_EXTRACTPS IMM_8 -66.0f3a20 RMI XMM GP8 IMM8 - SSE_PINSRB IMM_8 -66.0f3a21 RMI XMM XMM32 IMM8 - SSE_INSERTPS IMM_8 -66.W0.0f3a22 RMI XMM GP IMM8 - SSE_PINSRD IMM_8 -66.W1.0f3a22 RMI XMM GP IMM8 - SSE_PINSRQ IMM_8 -66.0f3a40 RMI XMM XMM IMM8 - SSE_DPPS IMM_8 -66.0f3a41 RMI XMM XMM IMM8 - SSE_DPPD IMM_8 -66.0f3a42 RMI XMM XMM IMM8 - SSE_MPSADBW IMM_8 -66.0f3a44 RMI XMM XMM IMM8 - SSE_PCLMULQDQ IMM_8 -66.0f3a60 RMI XMM XMM IMM8 - SSE_PCMPESTRM IMM_8 -66.0f3a61 RMI XMM XMM IMM8 - SSE_PCMPESTRI IMM_8 -66.0f3a62 RMI XMM XMM IMM8 - SSE_PCMPISTRM IMM_8 -66.0f3a63 RMI XMM XMM IMM8 - SSE_PCMPISTRI IMM_8 +66.0f3a08 RMI XMM XMM IMM8 - SSE_ROUNDPS +66.0f3a09 RMI XMM XMM IMM8 - SSE_ROUNDPD +66.0f3a0a RMI XMM32 XMM32 IMM8 - SSE_ROUNDSS +66.0f3a0b RMI XMM64 XMM64 IMM8 - SSE_ROUNDSD +66.0f3a0c RMI XMM XMM IMM8 - SSE_BLENDPS +66.0f3a0d RMI XMM XMM IMM8 - SSE_BLENDPD +66.0f3a0e RMI XMM XMM IMM8 - SSE_PBLENDW +66.0f3a0f RMI XMM XMM IMM8 - SSE_PALIGNR +66.0f3a14 MRI GP8 XMM IMM8 - SSE_PEXTRB +66.0f3a15 MRI GP16 XMM IMM8 - SSE_PEXTRW +66.W0.0f3a16 MRI GP XMM IMM8 - SSE_PEXTRD +66.W1.0f3a16 MRI GP XMM IMM8 - SSE_PEXTRQ +66.0f3a17 MRI GP32 XMM IMM8 - SSE_EXTRACTPS +66.0f3a20 RMI XMM GP8 IMM8 - SSE_PINSRB +66.0f3a21 RMI XMM XMM32 IMM8 - SSE_INSERTPS +66.W0.0f3a22 RMI XMM GP IMM8 - SSE_PINSRD +66.W1.0f3a22 RMI XMM GP IMM8 - SSE_PINSRQ +66.0f3a40 RMI XMM XMM IMM8 - SSE_DPPS +66.0f3a41 RMI XMM XMM IMM8 - SSE_DPPD +66.0f3a42 RMI XMM XMM IMM8 - SSE_MPSADBW +66.0f3a44 RMI XMM XMM IMM8 - SSE_PCLMULQDQ +66.0f3a60 RMI XMM XMM IMM8 - SSE_PCMPESTRM +66.0f3a61 RMI XMM XMM IMM8 - SSE_PCMPESTRI +66.0f3a62 RMI XMM XMM IMM8 - SSE_PCMPISTRM +66.0f3a63 RMI XMM XMM IMM8 - SSE_PCMPISTRI # 66.0f38db RM XMM XMM - - AESIMC 66.0f38dc RM XMM XMM - - AESENC 66.0f38dd RM XMM XMM - - AESENCLAST 66.0f38de RM XMM XMM - - AESDEC 66.0f38df RM XMM XMM - - AESDECLAST -66.0f3adf RMI XMM XMM IMM8 - AESKEYGENASSIST IMM_8 +66.0f3adf RMI XMM XMM IMM8 - AESKEYGENASSIST VEX.66.L0.0f38db RM XMM XMM - - VAESIMC VEX.66.L0.0f38dc RVM XMM XMM XMM - VAESENC VEX.66.L0.0f38dd RVM XMM XMM XMM - VAESENCLAST VEX.66.L0.0f38de RVM XMM XMM XMM - VAESDEC VEX.66.L0.0f38df RVM XMM XMM XMM - VAESDECLAST -VEX.66.L0.0f3adf RMI XMM XMM IMM8 - VAESKEYGENASSIST IMM_8 +VEX.66.L0.0f3adf RMI XMM XMM IMM8 - VAESKEYGENASSIST # # AVX VEX.NP.0f10 RM XMM XMM - - VMOVUPS @@ -973,19 +973,19 @@ VEX.66.W1.L0.0f6e RM XMM32 GP - - VMOVD ONLY32 VEX.66.W1.L0.0f6e RM XMM64 GP - - VMOVQ ONLY64 VEX.66.0f6f RM XMM XMM - - VMOVDQA 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 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.0f70 RMI XMM XMM IMM8 - VPSHUFD +VEX.F3.0f70 RMI XMM XMM IMM8 - VPSHUFHW +VEX.F2.0f70 RMI XMM XMM IMM8 - VPSHUFLW +VEX.66.0f71/2 VMI XMM XMM IMM8 - VPSRLW NOMEM +VEX.66.0f71/4 VMI XMM XMM IMM8 - VPSRAW NOMEM +VEX.66.0f71/6 VMI XMM XMM IMM8 - VPSLLW NOMEM +VEX.66.0f72/2 VMI XMM XMM IMM8 - VPSRLD NOMEM +VEX.66.0f72/4 VMI XMM XMM IMM8 - VPSRAD NOMEM +VEX.66.0f72/6 VMI XMM XMM IMM8 - VPSLLD NOMEM +VEX.66.0f73/2 VMI XMM XMM IMM8 - VPSRLQ NOMEM +VEX.66.0f73/3 VMI XMM XMM IMM8 - VPSRLDQ NOMEM +VEX.66.0f73/6 VMI XMM XMM IMM8 - VPSLLQ NOMEM +VEX.66.0f73/7 VMI XMM XMM IMM8 - VPSLLDQ 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 @@ -1003,14 +1003,14 @@ VEX.66.0f7f MR XMM XMM - - VMOVDQA VEX.F3.0f7f MR XMM XMM - - VMOVDQU VEX.NP.0fae//2 M GP32 - - - VLDMXCSR VEX.NP.0fae//3 M GP32 - - - VSTMXCSR -VEX.NP.0fc2 RVMI XMM XMM XMM IMM8 VCMPPS IMM_8 -VEX.66.0fc2 RVMI XMM XMM XMM IMM8 VCMPPD IMM_8 -VEX.F3.0fc2 RVMI XMM XMM XMM32 IMM8 VCMPSS IMM_8 VEXLIG -VEX.F2.0fc2 RVMI XMM XMM XMM64 IMM8 VCMPSD IMM_8 VEXLIG -VEX.66.W0.0fc4 RVMI XMM XMM GP IMM8 VPINSRW IMM_8 -VEX.66.W0.L0.0fc5 RMI GP XMM IMM8 - VPEXTRW IMM_8 -VEX.NP.0fc6 RVMI XMM XMM XMM IMM8 VSHUFPS IMM_8 -VEX.66.0fc6 RVMI XMM XMM XMM IMM8 VSHUFPD IMM_8 +VEX.NP.0fc2 RVMI XMM XMM XMM IMM8 VCMPPS +VEX.66.0fc2 RVMI XMM XMM XMM IMM8 VCMPPD +VEX.F3.0fc2 RVMI XMM XMM XMM32 IMM8 VCMPSS VEXLIG +VEX.F2.0fc2 RVMI XMM XMM XMM64 IMM8 VCMPSD VEXLIG +VEX.66.W0.0fc4 RVMI XMM XMM GP IMM8 VPINSRW +VEX.66.W0.L0.0fc5 RMI GP XMM IMM8 - VPEXTRW +VEX.NP.0fc6 RVMI XMM XMM XMM IMM8 VSHUFPS +VEX.66.0fc6 RVMI XMM XMM XMM IMM8 VSHUFPD VEX.NP.0fd0 RVM XMM XMM XMM - VADDSUBPS VEX.66.0fd0 RVM XMM XMM XMM - VADDSUBPD VEX.66.0fd1 RVM XMM XMM XMM - VPSRLW @@ -1204,43 +1204,43 @@ VEX.66.W0.0f38be RVM XMM XMM XMM - VFNMSUB231PS VEX.66.W1.0f38be RVM XMM XMM XMM - VFNMSUB231PD VEX.66.W0.0f38bf RVM XMM XMM XMM32 - VFNMSUB231SS VEXLIG VEX.66.W1.0f38bf RVM XMM XMM XMM64 - VFNMSUB231SD VEXLIG -VEX.66.W1.L1.0f3a00 VMI XMM XMM IMM8 - VPERMQ IMM_8 -VEX.66.W1.L1.0f3a01 VMI XMM XMM IMM8 - VPERMPD IMM_8 -VEX.66.W0.0f3a02 RVMI XMM XMM XMM IMM8 VPBLENDD IMM_8 -VEX.66.W0.0f3a04 RMI XMM XMM IMM8 - VPERMILPS IMM_8 -VEX.66.W0.0f3a05 RMI XMM XMM IMM8 - VPERMILPD IMM_8 -VEX.66.W0.L1.0f3a06 RVMI XMM XMM XMM IMM8 VPERM2F128 IMM_8 -VEX.66.0f3a08 RVMI XMM XMM XMM IMM8 VROUNDPS IMM_8 -VEX.66.0f3a09 RVMI XMM XMM XMM IMM8 VROUNDPD IMM_8 -VEX.66.0f3a0a RVMI XMM XMM XMM32 IMM8 VROUNDSS IMM_8 VEXLIG -VEX.66.0f3a0b RVMI XMM XMM XMM64 IMM8 VROUNDSD IMM_8 VEXLIG -VEX.66.0f3a0c RVMI XMM XMM XMM IMM8 VBLENDPS IMM_8 -VEX.66.0f3a0d RVMI XMM XMM XMM IMM8 VBLENDPD IMM_8 -VEX.66.0f3a0e RVMI XMM XMM XMM IMM8 VPBLENDW IMM_8 -VEX.66.0f3a0f RVMI XMM XMM XMM IMM8 VPALIGNR IMM_8 -VEX.66.W0.L0.0f3a14 MRI GP8 XMM IMM8 - VPEXTRB IMM_8 -VEX.66.W0.L0.0f3a15 MRI GP16 XMM IMM8 - VPEXTRW IMM_8 -VEX.66.W0.L0.0f3a16 MRI GP XMM IMM8 - VPEXTRD IMM_8 -VEX.66.W1.L0.0f3a16 MRI GP XMM IMM8 - VPEXTRQ IMM_8 -VEX.66.L0.0f3a17 MRI GP32 XMM IMM8 - VEXTRACTPS IMM_8 -VEX.66.W0.L1.0f3a18 RVMI XMM XMM XMM IMM8 VINSERTF128 IMM_8 -VEX.66.W0.L1.0f3a19 MRI XMM XMM IMM8 - VEXTRACTF128 IMM_8 -VEX.66.W0.L1.0f3a1d MRI XMM XMM IMM8 - VCVTPS2PH IMM_8 -VEX.66.W0.L0.0f3a20 RMI XMM GP8 IMM8 - VPINSRB IMM_8 -VEX.66.L0.0f3a21 RVMI XMM XMM XMM32 IMM8 VINSERTPS IMM_8 -VEX.66.W0.L0.0f3a22 RMI XMM GP IMM8 - VPINSRD IMM_8 -VEX.66.W1.L0.0f3a22 RMI XMM GP IMM8 - VPINSRQ IMM_8 -VEX.66.W0.L1.0f3a38 RVMI XMM XMM XMM IMM8 VINSERTI128 IMM_8 -VEX.66.W0.L1.0f3a39 MRI XMM XMM IMM8 - VEXTRACTI128 IMM_8 -VEX.66.0f3a40 RVMI XMM XMM XMM IMM8 VDPPS IMM_8 -VEX.66.0f3a41 RVMI XMM XMM XMM IMM8 VDPPD IMM_8 -VEX.66.0f3a42 RVMI XMM XMM XMM IMM8 VMPSADBW IMM_8 -VEX.66.0f3a44 RVMI XMM XMM XMM IMM8 VPCLMULQDQ IMM_8 -VEX.66.W0.L1.0f3a46 RVMI XMM XMM XMM IMM8 VPERM2I128 IMM_8 -VEX.66.0f3a60 RMI XMM XMM IMM8 - VPCMPESTRM IMM_8 -VEX.66.0f3a61 RMI XMM XMM IMM8 - VPCMPESTRI IMM_8 -VEX.66.0f3a62 RMI XMM XMM IMM8 - VPCMPISTRM IMM_8 -VEX.66.0f3a63 RMI XMM XMM IMM8 - VPCMPISTRI IMM_8 +VEX.66.W1.L1.0f3a00 VMI XMM XMM IMM8 - VPERMQ +VEX.66.W1.L1.0f3a01 VMI XMM XMM IMM8 - VPERMPD +VEX.66.W0.0f3a02 RVMI XMM XMM XMM IMM8 VPBLENDD +VEX.66.W0.0f3a04 RMI XMM XMM IMM8 - VPERMILPS +VEX.66.W0.0f3a05 RMI XMM XMM IMM8 - VPERMILPD +VEX.66.W0.L1.0f3a06 RVMI XMM XMM XMM IMM8 VPERM2F128 +VEX.66.0f3a08 RVMI XMM XMM XMM IMM8 VROUNDPS +VEX.66.0f3a09 RVMI XMM XMM XMM IMM8 VROUNDPD +VEX.66.0f3a0a RVMI XMM XMM XMM32 IMM8 VROUNDSS VEXLIG +VEX.66.0f3a0b RVMI XMM XMM XMM64 IMM8 VROUNDSD VEXLIG +VEX.66.0f3a0c RVMI XMM XMM XMM IMM8 VBLENDPS +VEX.66.0f3a0d RVMI XMM XMM XMM IMM8 VBLENDPD +VEX.66.0f3a0e RVMI XMM XMM XMM IMM8 VPBLENDW +VEX.66.0f3a0f RVMI XMM XMM XMM IMM8 VPALIGNR +VEX.66.W0.L0.0f3a14 MRI GP8 XMM IMM8 - VPEXTRB +VEX.66.W0.L0.0f3a15 MRI GP16 XMM IMM8 - VPEXTRW +VEX.66.W0.L0.0f3a16 MRI GP XMM IMM8 - VPEXTRD +VEX.66.W1.L0.0f3a16 MRI GP XMM IMM8 - VPEXTRQ +VEX.66.L0.0f3a17 MRI GP32 XMM IMM8 - VEXTRACTPS +VEX.66.W0.L1.0f3a18 RVMI XMM XMM XMM IMM8 VINSERTF128 +VEX.66.W0.L1.0f3a19 MRI XMM XMM IMM8 - VEXTRACTF128 +VEX.66.W0.L1.0f3a1d MRI XMM XMM IMM8 - VCVTPS2PH +VEX.66.W0.L0.0f3a20 RMI XMM GP8 IMM8 - VPINSRB +VEX.66.L0.0f3a21 RVMI XMM XMM XMM32 IMM8 VINSERTPS +VEX.66.W0.L0.0f3a22 RMI XMM GP IMM8 - VPINSRD +VEX.66.W1.L0.0f3a22 RMI XMM GP IMM8 - VPINSRQ +VEX.66.W0.L1.0f3a38 RVMI XMM XMM XMM IMM8 VINSERTI128 +VEX.66.W0.L1.0f3a39 MRI XMM XMM IMM8 - VEXTRACTI128 +VEX.66.0f3a40 RVMI XMM XMM XMM IMM8 VDPPS +VEX.66.0f3a41 RVMI XMM XMM XMM IMM8 VDPPD +VEX.66.0f3a42 RVMI XMM XMM XMM IMM8 VMPSADBW +VEX.66.0f3a44 RVMI XMM XMM XMM IMM8 VPCLMULQDQ +VEX.66.W0.L1.0f3a46 RVMI XMM XMM XMM IMM8 VPERM2I128 +VEX.66.0f3a60 RMI XMM XMM IMM8 - VPCMPESTRM +VEX.66.0f3a61 RMI XMM XMM IMM8 - VPCMPESTRI +VEX.66.0f3a62 RMI XMM XMM IMM8 - VPCMPISTRM +VEX.66.0f3a63 RMI XMM XMM IMM8 - VPCMPISTRI # # BMI1 VEX.NP.L0.0f38f2 RVM GP GP GP - ANDN @@ -1249,7 +1249,7 @@ VEX.NP.L0.0f38f3/2 VM GP GP - - BLSMSK VEX.NP.L0.0f38f3/3 VM GP GP - - BLSI VEX.NP.L0.0f38f7 RMV GP GP GP - BEXTR # BMI2 -VEX.F2.L0.0f3af0 RMI GP GP IMM8 - RORX IMM_8 +VEX.F2.L0.0f3af0 RMI GP GP IMM8 - RORX VEX.NP.L0.0f38f5 RMV GP GP GP - BZHI VEX.F2.L0.0f38f5 RVM GP GP GP - PDEP VEX.F3.L0.0f38f5 RVM GP GP GP - PEXT @@ -1436,8 +1436,8 @@ F3.0fae//e0+ O 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 +66.0f3ace RMI XMM XMM IMM8 - GF2P8AFFINEQB +66.0f3acf RMI XMM XMM IMM8 - GF2P8AFFINEINVQB # ENQCMD F2.0f38f8 RM GP MEMZ - - ENQCMD @@ -1474,7 +1474,7 @@ NP.0f38ca RM XMM XMM - - SHA1MSG2 NP.0f38cb RMA XMM XMM XMM - SHA256RNDS2 NP.0f38cc RM XMM XMM - - SHA256MSG1 NP.0f38cd RM XMM XMM - - SHA256MSG2 -NP.0f3acc RMI XMM XMM IMM8 - SHA1RNDS4 IMM_8 +NP.0f3acc RMI XMM XMM IMM8 - SHA1RNDS4 NP.0f1a RM BND MEMZ - - BNDLDX MUSTMEM 66.0f1a RM BND BND - - BNDMOV DEF64 diff --git a/parseinstrs.py b/parseinstrs.py index 6996638..c6f59b6 100644 --- a/parseinstrs.py +++ b/parseinstrs.py @@ -170,11 +170,16 @@ class InstrDesc(NamedTuple): if "DEF64" in self.flags: flags.sized64 = 1 if "SIZE_8" in self.flags: flags.size8 = 1 if "INSTR_WIDTH" in self.flags: flags.instr_width = 1 - if "IMM_8" in self.flags: flags.imm_control = {4: 5, 6: 7}[flags.imm_control] if "LOCK" in self.flags: flags.lock = 1 if "VSIB" in self.flags: flags.vsib = 1 if "MUSTMEM" in self.flags: setattr(flags, "op%d_regty"%(flags.modrm_idx^3), 0xf) + if flags.imm_control >= 4: + imm_op = next(op for op in self.operands if op.kind == OpKind.K_IMM) + if ("IMM_8" in self.flags or imm_op.size == 1 or + (imm_op.size == OpKind.SZ_OP and flags.size8)): + flags.imm_control |= 1 + enc = flags._encode(6) enc = tuple(int.from_bytes(enc[i:i+2], "little") for i in range(0, 6, 2)) # First 2 bytes are the mnemonic, last 6 bytes are the encoding. diff --git a/tests/test_decode.c b/tests/test_decode.c index 2757670..a7e02b1 100644 --- a/tests/test_decode.c +++ b/tests/test_decode.c @@ -130,6 +130,18 @@ main(int argc, char** argv) // [reg+s*reg+disp32] TEST64("\x42\x01\x84\x25\x01\x00\x00\x00", "[ADD mem4:r5+1*r12+0x1 reg4:r0]"); + TEST("\x04\x01", "[ADD reg1:r0 imm1:0x1]"); + TEST("\x66\x68\xff\xad", "[PUSH imm2:0xadff]"); + TEST32("\x68\xff\xad\x90\xbc", "[PUSH imm4:0xbc90adff]"); + TEST64("\x68\xff\xad\x90\xbc", "[PUSH imm8:0xffffffffbc90adff]"); + TEST("\x66\x6a\xff", "[PUSH imm2:0xffff]"); + TEST32("\x6a\xff", "[PUSH imm4:0xffffffff]"); + TEST64("\x6a\xff", "[PUSH imm8:0xffffffffffffffff]"); + TEST("\xb0\xf0", "[MOVABS reg1:r0 imm1:0xf0]"); + TEST("\xb8\xf0\xf0\xab\xff", "[MOVABS reg4:r0 imm4:0xffabf0f0]"); + TEST64("\x48\xb8\xf0\xf0\xab\xff\x00\x12\x12\xcd", "[MOVABS reg8:r0 imm8:0xcd121200ffabf0f0]"); + TEST64("\xcd\x80", "[INT imm1:0x80]"); + TEST("\x66\xc8\x00\x00\x00", "[ENTER_2 imm4:0x0]"); TEST("\x66\xc8\x00\x0f\x00", "[ENTER_2 imm4:0xf00]"); TEST("\x66\xc8\x00\x00\x01", "[ENTER_2 imm4:0x10000]");