From 4e95c8d1524aab875352b1ee6621f971622ff139 Mon Sep 17 00:00:00 2001 From: Alexis Engelke Date: Sun, 5 Jul 2020 14:53:54 +0200 Subject: [PATCH] instrs: Several operand size and AVX-related fixes --- instrs.txt | 71 +++++++++++++++++++++++---------------------- tests/test_decode.c | 37 +++++++++++++++++++++++ 2 files changed, 74 insertions(+), 34 deletions(-) diff --git a/instrs.txt b/instrs.txt index ff575d9..36f8e60 100644 --- a/instrs.txt +++ b/instrs.txt @@ -302,8 +302,8 @@ ff/6 M GP - - - PUSH DEF64 0f00/1 M GP16 - - - STR 0f00/2 M GP16 - - - LLDT 0f00/3 M GP16 - - - LTR -0f00/4 M GP - - - VERR -0f00/5 M GP - - - VERW +0f00/4 M GP16 - - - VERR +0f00/5 M GP16 - - - VERW 0f01//0 M MEMZ - - - SGDT 0f01//1 M MEMZ - - - SIDT 0f01//2 M MEMZ - - - LGDT @@ -490,8 +490,8 @@ 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 -NP.W1.0f6e RM MMX GP - - MMX_MOVQ +NP.W0.0f6e RM MMX GP32 - - MMX_MOVD +NP.W1.0f6e RM MMX GP64 - - MMX_MOVQ NP.0f6f RM MMX MMX - - MMX_MOVQ NP.0f71/2 MI MMX IMM8 - - MMX_PSRLW NOMEM NP.0f71/4 MI MMX IMM8 - - MMX_PSRAW NOMEM @@ -505,11 +505,11 @@ 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 -NP.W1.0f7e MR GP MMX - - MMX_MOVQ +NP.W0.0f7e MR GP32 MMX - - MMX_MOVD +NP.W1.0f7e MR GP64 MMX - - MMX_MOVQ NP.0f7f MR MMX MMX - - MMX_MOVQ NP.0fc4 RMI MMX GP IMM8 - MMX_PINSRW -NP.0fc5 RMI GP MMX IMM8 - MMX_PEXTRW NOMEM +NP.0fc5 RMI GP MMX IMM8 - MMX_PEXTRW DEF64 NOMEM NP.0fd1 RM MMX MMX - - MMX_PSRLW NP.0fd2 RM MMX MMX - - MMX_PSRLD NP.0fd3 RM MMX MMX - - MMX_PSRLQ @@ -677,8 +677,8 @@ F2.0f5f RM XMM64 XMM64 - - SSE_MAXSD 66.0f6b RM XMM XMM - - SSE_PACKSSDW 66.0f6c RM XMM XMM - - SSE_PUNPCKLQDQ 66.0f6d RM XMM XMM - - SSE_PUNPCKHQDQ -66.W0.0f6e RM XMM GP - - SSE_MOVD -66.W1.0f6e RM XMM GP - - SSE_MOVQ +66.W0.0f6e RM XMM GP32 - - SSE_MOVD +66.W1.0f6e RM XMM GP64 - - SSE_MOVQ 66.0f6f RM XMM XMM - - SSE_MOVDQA F3.0f6f RM XMM XMM - - SSE_MOVDQU 66.0f70 RMI XMM XMM IMM8 - SSE_PSHUFD @@ -701,8 +701,8 @@ F2.0f70 RMI XMM XMM IMM8 - SSE_PSHUFLW F2.0f7c RM XMM XMM - - SSE_HADDPS 66.0f7d RM XMM XMM - - SSE_HSUBPD F2.0f7d RM XMM XMM - - SSE_HSUBPS -66.W0.0f7e MR GP XMM32 - - SSE_MOVD -66.W1.0f7e MR GP XMM64 - - SSE_MOVQ +66.W0.0f7e MR GP32 XMM32 - - SSE_MOVD +66.W1.0f7e MR GP64 XMM64 - - SSE_MOVQ F3.0f7e RM XMM XMM64 - - SSE_MOVQ 66.0f7f MR XMM XMM - - SSE_MOVDQA F3.0f7f MR XMM XMM - - SSE_MOVDQU @@ -717,8 +717,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 +66.0fc4 RMI XMM GP16 IMM8 - SSE_PINSRW +66.0fc5 RMI GP XMM IMM8 - SSE_PEXTRW DEF64 NOMEM NP.0fc6 RMI XMM XMM IMM8 - SSE_SHUFPS 66.0fc6 RMI XMM XMM IMM8 - SSE_SHUFPD 66.0fd0 RM XMM XMM - - SSE_ADDSUBPD @@ -832,13 +832,13 @@ NP.0f38f9 MR MEM GP - - MOVDIRI 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.W0.0f3a16 MRI GP32 XMM IMM8 - SSE_PEXTRD +66.W1.0f3a16 MRI GP64 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.W0.0f3a22 RMI XMM GP32 IMM8 - SSE_PINSRD +66.W1.0f3a22 RMI XMM GP64 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 @@ -1007,8 +1007,8 @@ VEX.NP.0fc2 RVMI XMM XMM XMM IMM8 VCMPPS VEX.66.0fc2 RVMI XMM XMM XMM IMM8 VCMPPD VEX.F3.LIG.0fc2 RVMI XMM XMM XMM32 IMM8 VCMPSS VEX.F2.LIG.0fc2 RVMI XMM XMM XMM64 IMM8 VCMPSD -VEX.66.W0.0fc4 RVMI XMM XMM GP IMM8 VPINSRW -VEX.66.W0.L0.0fc5 RMI GP XMM IMM8 - VPEXTRW +VEX.66.WIG.L0.0fc4 RVMI XMM XMM GP16 IMM8 VPINSRW +VEX.66.WIG.L0.0fc5 RMI GP XMM IMM8 - VPEXTRW DEF64 NOMEM 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 @@ -1129,7 +1129,7 @@ VEX.66.W0.0f3847 RVM XMM XMM XMM - VPSLLVD VEX.66.W1.0f3847 RVM XMM XMM XMM - VPSLLVQ VEX.66.W0.0f3858 RM XMM XMM32 - - VPBROADCASTD VEX.66.W0.0f3859 RM XMM XMM64 - - VPBROADCASTQ -VEX.66.W0.L1.0f385a RM XMM MEM128 - - VPBROADCASTI128 +VEX.66.W0.L1.0f385a RM XMM MEM128 - - VBROADCASTI128 VEX.66.W0.0f3878 RM XMM XMM8 - - VPBROADCASTB VEX.66.W0.0f3879 RM XMM XMM16 - - VPBROADCASTW VEX.66.W0.0f388c RVM XMM XMM XMM - VPMASKMOVD @@ -1218,29 +1218,32 @@ 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.WIG.L0.0f3a14 MRI GP8 XMM IMM8 - VPEXTRB +# TODO: also WIG for PEXTRW? +VEX.66.WIG.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.W1.L0.0f3a16 MRI GP XMM IMM8 - VPEXTRD ONLY32 +VEX.66.W1.L0.0f3a16 MRI GP XMM IMM8 - VPEXTRQ ONLY64 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.0f3a18 RVMI XMM XMM XMM128 IMM8 VINSERTF128 +VEX.66.W0.L1.0f3a19 MRI XMM128 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.WIG.L0.0f3a20 RVMI XMM 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.W0.L0.0f3a22 RVMI XMM XMM GP IMM8 VPINSRD +VEX.66.W1.L0.0f3a22 RVMI XMM XMM GP IMM8 VPINSRD ONLY32 +VEX.66.W1.L0.0f3a22 RVMI XMM XMM GP IMM8 VPINSRQ ONLY64 +VEX.66.W0.L1.0f3a38 RVMI XMM XMM XMM128 IMM8 VINSERTI128 +VEX.66.W0.L1.0f3a39 MRI XMM128 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 +VEX.66.L0.0f3a60 RMI XMM XMM IMM8 - VPCMPESTRM +VEX.66.L0.0f3a61 RMI XMM XMM IMM8 - VPCMPESTRI +VEX.66.L0.0f3a62 RMI XMM XMM IMM8 - VPCMPISTRM +VEX.66.L0.0f3a63 RMI XMM XMM IMM8 - VPCMPISTRI # # BMI1 VEX.NP.L0.0f38f2 RVM GP GP GP - ANDN diff --git a/tests/test_decode.c b/tests/test_decode.c index 4f271f9..6a81e38 100644 --- a/tests/test_decode.c +++ b/tests/test_decode.c @@ -212,6 +212,8 @@ main(int argc, char** argv) TEST("\x66\x0f\xc6\xc0\x01", "[SSE_SHUFPD reg16:r0 reg16:r0 imm1:0x1]"); TEST("\xf3\x0f\x7e\x5c\x24\x08", "[SSE_MOVQ reg16:r3 mem8:r4+0x8]"); + TEST32("\xc4\xe1\x00\x58\xc1", "[VADDPS reg16:r0 reg16:r7 reg16:r1]"); // MSB in vvvv ignored + TEST64("\xc4\xe1\x00\x58\xc1", "[VADDPS reg16:r0 reg16:r15 reg16:r1]"); TEST("\xc5\xf9\x6e\xc8", "[VMOVD reg4:r1 reg4:r0]"); TEST64("\xc4\xe1\xf9\x6e\xc8", "[VMOVQ reg8:r1 reg8:r0]"); TEST32("\xc4\xe1\xf9\x6e\xc8", "[VMOVD reg4:r1 reg4:r0]"); @@ -220,6 +222,41 @@ main(int argc, char** argv) TEST64("\xc4\xe1\xf2\x2a\xc0", "[VCVTSI2SS reg16:r0 reg16:r1 reg8:r0]"); TEST64("\xc4\xe2\x75\x90\x04\xe7", "[VPGATHERDD reg32:r0 mem32:r7+8*r4 reg32:r1]"); + TEST("\xc4\xe3\x79\x14\xc0\x00", "[VPEXTRB reg1:r0 reg16:r0 imm1:0x0]"); + TEST("\xc4\xe3\xf9\x14\xc0\x00", "[VPEXTRB reg1:r0 reg16:r0 imm1:0x0]"); + TEST("\xc4\xe3\x79\x15\xc0\x00", "[VPEXTRW reg2:r0 reg16:r0 imm1:0x0]"); + TEST("\xc4\xe3\xf9\x15\xc0\x00", "[VPEXTRW reg2:r0 reg16:r0 imm1:0x0]"); + TEST32("\xc4\xe1\x79\xc5\xc0\x00", "[VPEXTRW reg4:r0 reg16:r0 imm1:0x0]"); + TEST64("\xc4\xe1\x79\xc5\xc0\x00", "[VPEXTRW reg8:r0 reg16:r0 imm1:0x0]"); + TEST("\xc4\xe3\x79\x16\xc0\x00", "[VPEXTRD reg4:r0 reg16:r0 imm1:0x0]"); + TEST32("\xc4\xe3\xf9\x16\xc0\x00", "[VPEXTRD reg4:r0 reg16:r0 imm1:0x0]"); + TEST64("\xc4\xe3\xf9\x16\xc0\x00", "[VPEXTRQ reg8:r0 reg16:r0 imm1:0x0]"); + + TEST("\xc4\xe3\x71\x20\xc0\x00", "[VPINSRB reg16:r0 reg16:r1 reg1:r0 imm1:0x0]"); + TEST("\xc4\xe3\xf1\x20\xc0\x00", "[VPINSRB reg16:r0 reg16:r1 reg1:r0 imm1:0x0]"); + TEST("\xc4\xe1\x71\xc4\xc0\x00", "[VPINSRW reg16:r0 reg16:r1 reg2:r0 imm1:0x0]"); + TEST("\xc4\xe1\xf1\xc4\xc0\x00", "[VPINSRW reg16:r0 reg16:r1 reg2:r0 imm1:0x0]"); + TEST("\xc4\xe3\x71\x22\xc0\x00", "[VPINSRD reg16:r0 reg16:r1 reg4:r0 imm1:0x0]"); + TEST32("\xc4\xe3\xf1\x22\xc0\x00", "[VPINSRD reg16:r0 reg16:r1 reg4:r0 imm1:0x0]"); + TEST64("\xc4\xe3\xf1\x22\xc0\x00", "[VPINSRQ reg16:r0 reg16:r1 reg8:r0 imm1:0x0]"); + TEST("\xc4\xe3\x75\x20\xc0\x00", "UD"); // VEX.L != 0 + TEST("\xc4\xe1\x75\xc4\xc0\x00", "UD"); // VEX.L != 0 + TEST("\xc4\xe1\xf5\xc4\xc0\x00", "UD"); // VEX.L != 0 + TEST("\xc4\xe3\x75\x22\xc0\x00", "UD"); // VEX.L != 0 + TEST("\xc4\xe3\xf5\x22\xc0\x00", "UD"); // VEX.L != 0 + + TEST("\xc4\xe2\x71\x45\xc2", "[VPSRLVD reg16:r0 reg16:r1 reg16:r2]"); + TEST("\xc4\xe2\x75\x45\xc2", "[VPSRLVD reg32:r0 reg32:r1 reg32:r2]"); + TEST("\xc4\xe2\xf1\x45\xc2", "[VPSRLVQ reg16:r0 reg16:r1 reg16:r2]"); + TEST("\xc4\xe2\xf5\x45\xc2", "[VPSRLVQ reg32:r0 reg32:r1 reg32:r2]"); + + TEST("\xc4\xe2\x7d\x5a\x20", "[VBROADCASTI128 reg32:r4 mem16:r0]"); + TEST64("\xc4\x62\x7d\x5a\x20", "[VBROADCASTI128 reg32:r12 mem16:r0]"); + TEST("\xc4\xe2\x75\x5a\x20", "UD"); // VEX.vvvv != 1111 + TEST("\xc4\xe2\x7d\x5a\xc0", "UD"); // ModRM.mod != 11 + TEST("\xc4\xe2\x79\x5a\x20", "UD"); // VEX.L != 1 + TEST("\xc4\xe2\xfd\x5a\x20", "UD"); // VEX.W != 0 + puts(failed ? "Some tests FAILED" : "All tests PASSED"); return failed ? EXIT_FAILURE : EXIT_SUCCESS; }