i386: Check vector length for vshufXXX/vinsertXXX/vextractXXX
authorH.J. Lu <hjl.tools@gmail.com>
Mon, 17 Jun 2019 17:20:04 +0000 (10:20 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Mon, 17 Jun 2019 17:21:36 +0000 (10:21 -0700)
Since not all vector lengths are supported by vshufXXX, vinsertXXX and
vextractXXX, decode them only with supported vector lengths.

gas/

PR binutils/24691
* testsuite/gas/i386/disassem.s: Add test for vshuff32x4 with
invalid vector length.
* testsuite/gas/i386/x86-64-disassem.s: Likewise.
* testsuite/gas/i386/disassem.d: Updated.
* testsuite/gas/i386/x86-64-disassem.d: Likewise.

opcodes/

PR binutils/24691
* i386-dis-evex.h (evex_table): Update EVEX_W_0F3A23_P_2,
EVEX_W_0F3A38_P_2, EVEX_W_0F3A39_P_2, EVEX_W_0F3A3A_P_2,
EVEX_W_0F3A3B_P_2 and EVEX_W_0F3A43_P_2.
(evex_len_table): Add EVEX_LEN_0F3A23_P_2_W_0,
EVEX_LEN_0F3A23_P_2_W_1, EVEX_LEN_0F3A38_P_2_W_0,
EVEX_LEN_0F3A38_P_2_W_1, EVEX_LEN_0F3A39_P_2_W_0,
EVEX_LEN_0F3A39_P_2_W_1, EVEX_LEN_0F3A3A_P_2_W_0,
EVEX_LEN_0F3A3A_P_2_W_1, EVEX_LEN_0F3A3B_P_2_W_0,
EVEX_LEN_0F3A3B_P_2_W_1, EVEX_LEN_0F3A43_P_2_W_0 and
EVEX_LEN_0F3A43_P_2_W_1.
* i386-dis.c (EVEX_LEN_0F3A23_P_2_W_0): New enum.
(EVEX_LEN_0F3A23_P_2_W_1): Likewise.
(EVEX_LEN_0F3A38_P_2_W_0): Likewise.
(EVEX_LEN_0F3A38_P_2_W_1): Likewise.
(EVEX_LEN_0F3A39_P_2_W_0): Likewise.
(EVEX_LEN_0F3A39_P_2_W_1): Likewise.
(EVEX_LEN_0F3A3A_P_2_W_0): Likewise.
(EVEX_LEN_0F3A3A_P_2_W_1): Likewise.
(EVEX_LEN_0F3A3B_P_2_W_0): Likewise.
(EVEX_LEN_0F3A3B_P_2_W_1): Likewise.
(EVEX_LEN_0F3A43_P_2_W_0): Likewise.
(EVEX_LEN_0F3A43_P_2_W_1): Likewise.

gas/ChangeLog
gas/testsuite/gas/i386/disassem.d
gas/testsuite/gas/i386/disassem.s
gas/testsuite/gas/i386/x86-64-disassem.d
gas/testsuite/gas/i386/x86-64-disassem.s
opcodes/ChangeLog
opcodes/i386-dis-evex.h
opcodes/i386-dis.c

index 0cf119d7191e664d8ff0ef4bdeffde76d53970fd..c7ed06e6d00b2d0bd00270d18676fec44dc483da 100644 (file)
@@ -1,3 +1,12 @@
+2019-06-17  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR binutils/24691
+       * testsuite/gas/i386/disassem.s: Add test for vshuff32x4 with
+       invalid vector length.
+       * testsuite/gas/i386/x86-64-disassem.s: Likewise.
+       * testsuite/gas/i386/disassem.d: Updated.
+       * testsuite/gas/i386/x86-64-disassem.d: Likewise.
+
 2019-06-14  Alan Modra  <amodra@gmail.com>
 
        * Makefile.in: Regenerate.
index 530e3a17d560941cc4aebb33c12087325fd64676..27f37b6e2f743c2cb75160a8880c467285f208ee 100644 (file)
@@ -347,6 +347,8 @@ Disassembly of section \.text:
 [      ]*[a-f0-9]+:[   ]*62 f2 ad 08 1c[       ]*\(bad\)[ ]*
 [      ]*[a-f0-9]+:[   ]*01 01[        ]*add[  ]*%eax,\(%ecx\)
 [      ]*[a-f0-9]+:[   ]*62 f3 7d 28 1b[       ]*\(bad\)[ ]*
-[      ]*[a-f0-9]+:[   ]*c8[   ]*.byte[        ]*0xc8
+[      ]*[a-f0-9]+:[   ]*c8 25 62 f3[  ]*enter[ ]*\$0x6225,\$0xf3
+[      ]*[a-f0-9]+:[   ]*62 f3 75 08 23[       ]*\(bad\)[ ]*
+[      ]*[a-f0-9]+:[   ]*c2[   ]*.byte[        ]*0xc2
 [      ]*[a-f0-9]+:[   ]*25[   ]*.byte[        ]*0x25
 #pass
index 00eeb396d4e33296b96ef4133729f2e946834b9e..d33001875623e9e502e79471cdfcda7ee73e66d8 100644 (file)
 .byte 0x62, 0xf2, 0xad, 0x08, 0x1c, 0x01
 .byte 0x1
 .byte 0x62, 0xf3, 0x7d, 0x28, 0x1b, 0xc8, 0x25
+.byte 0x62, 0xf3
+.byte 0x62, 0xf3, 0x75, 0x08, 0x23, 0xc2, 0x25
index a7c2c3ec964c853cd3e9828dc8df73a908fa839d..3dcbc104eb52377eab729a078f5b2d0b6c85852c 100644 (file)
@@ -346,6 +346,8 @@ Disassembly of section \.text:
 [      ]*[a-f0-9]+:[   ]*62 72 ad 08 1c[       ]*\(bad\)[ ]*
 [      ]*[a-f0-9]+:[   ]*01 01[        ]*add[  ]*%eax,\(%rcx\)
 [      ]*[a-f0-9]+:[   ]*62 f3 7d 28 1b[       ]*\(bad\)[ ]*
-[      ]*[a-f0-9]+:[   ]*c8[   ]*.byte[        ]*0xc8
+[      ]*[a-f0-9]+:[   ]*c8 25 62 f3[  ]*enterq[ ]*\$0x6225,\$0xf3
+[      ]*[a-f0-9]+:[   ]*62 f3 75 08 23[       ]*\(bad\)[ ]*
+[      ]*[a-f0-9]+:[   ]*c2[   ]*.byte[        ]*0xc2
 [      ]*[a-f0-9]+:[   ]*25[   ]*.byte[        ]*0x25
 #pass
index ef4e87d14c1d2fc4cd4d6400601af13a34a63989..7535052760cd0902ad16dd8d11328245bdbc42ee 100644 (file)
 .byte 0x62, 0x72, 0xad, 0x08, 0x1c, 0x01
 .byte 0x1
 .byte 0x62, 0xf3, 0x7d, 0x28, 0x1b, 0xc8, 0x25
+.byte 0x62, 0xf3
+.byte 0x62, 0xf3, 0x75, 0x08, 0x23, 0xc2, 0x25
index aa9562c84c69a774fb6c935fb430be695356b4b9..b76a899860d3a98c75ead62ae96ff07303a56876 100644 (file)
@@ -1,3 +1,29 @@
+2019-06-17  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR binutils/24691
+       * i386-dis-evex.h (evex_table): Update EVEX_W_0F3A23_P_2,
+       EVEX_W_0F3A38_P_2, EVEX_W_0F3A39_P_2, EVEX_W_0F3A3A_P_2,
+       EVEX_W_0F3A3B_P_2 and EVEX_W_0F3A43_P_2.
+       (evex_len_table): Add EVEX_LEN_0F3A23_P_2_W_0,
+       EVEX_LEN_0F3A23_P_2_W_1, EVEX_LEN_0F3A38_P_2_W_0,
+       EVEX_LEN_0F3A38_P_2_W_1, EVEX_LEN_0F3A39_P_2_W_0,
+       EVEX_LEN_0F3A39_P_2_W_1, EVEX_LEN_0F3A3A_P_2_W_0,
+       EVEX_LEN_0F3A3A_P_2_W_1, EVEX_LEN_0F3A3B_P_2_W_0,
+       EVEX_LEN_0F3A3B_P_2_W_1, EVEX_LEN_0F3A43_P_2_W_0 and
+       EVEX_LEN_0F3A43_P_2_W_1.
+       * i386-dis.c (EVEX_LEN_0F3A23_P_2_W_0): New enum.
+       (EVEX_LEN_0F3A23_P_2_W_1): Likewise.
+       (EVEX_LEN_0F3A38_P_2_W_0): Likewise.
+       (EVEX_LEN_0F3A38_P_2_W_1): Likewise.
+       (EVEX_LEN_0F3A39_P_2_W_0): Likewise.
+       (EVEX_LEN_0F3A39_P_2_W_1): Likewise.
+       (EVEX_LEN_0F3A3A_P_2_W_0): Likewise.
+       (EVEX_LEN_0F3A3A_P_2_W_1): Likewise.
+       (EVEX_LEN_0F3A3B_P_2_W_0): Likewise.
+       (EVEX_LEN_0F3A3B_P_2_W_1): Likewise.
+       (EVEX_LEN_0F3A43_P_2_W_0): Likewise.
+       (EVEX_LEN_0F3A43_P_2_W_1): Likewise.
+
 2019-06-14  Nick Clifton  <nickc@redhat.com>
 
        * po/fr.po; Updated French translation.
index 0003e7791de6dc11caea719a1b4b803a67ccecde..f34f8bc1a1254c52c7e668dcf743edb8021e58b5 100644 (file)
@@ -3940,28 +3940,28 @@ static const struct dis386 evex_table[][256] = {
   },
   /* EVEX_W_0F3A23_P_2 */
   {
-    { "vshuff32x4",    { XM, Vex, EXx, Ib }, 0 },
-    { "vshuff64x2",    { XM, Vex, EXx, Ib }, 0 },
+    { EVEX_LEN_TABLE (EVEX_LEN_0F3A23_P_2_W_0) },
+    { EVEX_LEN_TABLE (EVEX_LEN_0F3A23_P_2_W_1) },
   },
   /* EVEX_W_0F3A38_P_2 */
   {
-    { "vinserti32x4",  { XM, Vex, EXxmm, Ib }, 0 },
-    { "vinserti64x2",  { XM, Vex, EXxmm, Ib }, 0 },
+    { EVEX_LEN_TABLE (EVEX_LEN_0F3A38_P_2_W_0) },
+    { EVEX_LEN_TABLE (EVEX_LEN_0F3A38_P_2_W_1) },
   },
   /* EVEX_W_0F3A39_P_2 */
   {
-    { "vextracti32x4", { EXxmm, XM, Ib }, 0 },
-    { "vextracti64x2", { EXxmm, XM, Ib }, 0 },
+    { EVEX_LEN_TABLE (EVEX_LEN_0F3A39_P_2_W_0) },
+    { EVEX_LEN_TABLE (EVEX_LEN_0F3A39_P_2_W_1) },
   },
   /* EVEX_W_0F3A3A_P_2 */
   {
-    { "vinserti32x8",  { XM, Vex, EXxmmq, Ib }, 0 },
-    { "vinserti64x4",  { XM, Vex, EXxmmq, Ib }, 0 },
+    { EVEX_LEN_TABLE (EVEX_LEN_0F3A3A_P_2_W_0) },
+    { EVEX_LEN_TABLE (EVEX_LEN_0F3A3A_P_2_W_1) },
   },
   /* EVEX_W_0F3A3B_P_2 */
   {
-    { "vextracti32x8", { EXxmmq, XM, Ib }, 0 },
-    { "vextracti64x4", { EXxmmq, XM, Ib }, 0 },
+    { EVEX_LEN_TABLE (EVEX_LEN_0F3A3B_P_2_W_0) },
+    { EVEX_LEN_TABLE (EVEX_LEN_0F3A3B_P_2_W_1) },
   },
   /* EVEX_W_0F3A3E_P_2 */
   {
@@ -3979,8 +3979,8 @@ static const struct dis386 evex_table[][256] = {
   },
   /* EVEX_W_0F3A43_P_2 */
   {
-    { "vshufi32x4",    { XM, Vex, EXx, Ib }, 0 },
-    { "vshufi64x2",    { XM, Vex, EXx, Ib }, 0 },
+    { EVEX_LEN_TABLE (EVEX_LEN_0F3A43_P_2_W_0) },
+    { EVEX_LEN_TABLE (EVEX_LEN_0F3A43_P_2_W_1) },
   },
   /* EVEX_W_0F3A50_P_2 */
   {
@@ -4185,4 +4185,88 @@ static const struct dis386 evex_table[][256] = {
     { "vextractf64x4", { EXxmmq, XM, Ib }, 0 },
   },
 
+  /* EVEX_LEN_0F3A23_P_2_W_0 */
+  {
+    { Bad_Opcode },
+    { "vshuff32x4",    { XM, Vex, EXx, Ib }, 0 },
+    { "vshuff32x4",    { XM, Vex, EXx, Ib }, 0 },
+  },
+
+  /* EVEX_LEN_0F3A23_P_2_W_1 */
+  {
+    { Bad_Opcode },
+    { "vshuff64x2",    { XM, Vex, EXx, Ib }, 0 },
+    { "vshuff64x2",    { XM, Vex, EXx, Ib }, 0 },
+  },
+
+  /* EVEX_LEN_0F3A38_P_2_W_0 */
+  {
+    { Bad_Opcode },
+    { "vinserti32x4",  { XM, Vex, EXxmm, Ib }, 0 },
+    { "vinserti32x4",  { XM, Vex, EXxmm, Ib }, 0 },
+  },
+
+  /* EVEX_LEN_0F3A38_P_2_W_1 */
+  {
+    { Bad_Opcode },
+    { "vinserti64x2",  { XM, Vex, EXxmm, Ib }, 0 },
+    { "vinserti64x2",  { XM, Vex, EXxmm, Ib }, 0 },
+  },
+
+  /* EVEX_LEN_0F3A39_P_2_W_0 */
+  {
+    { Bad_Opcode },
+    { "vextracti32x4", { EXxmm, XM, Ib }, 0 },
+    { "vextracti32x4", { EXxmm, XM, Ib }, 0 },
+  },
+
+  /* EVEX_LEN_0F3A39_P_2_W_1 */
+  {
+    { Bad_Opcode },
+    { "vextracti64x2", { EXxmm, XM, Ib }, 0 },
+    { "vextracti64x2", { EXxmm, XM, Ib }, 0 },
+  },
+
+  /* EVEX_LEN_0F3A3A_P_2_W_0 */
+  {
+    { Bad_Opcode },
+    { "vinserti32x8",  { XM, Vex, EXxmmq, Ib }, 0 },
+    { "vinserti32x8",  { XM, Vex, EXxmmq, Ib }, 0 },
+  },
+
+  /* EVEX_LEN_0F3A3A_P_2_W_1 */
+  {
+    { Bad_Opcode },
+    { "vinserti64x4",  { XM, Vex, EXxmmq, Ib }, 0 },
+    { "vinserti64x4",  { XM, Vex, EXxmmq, Ib }, 0 },
+  },
+
+  /* EVEX_LEN_0F3A3B_P_2_W_0 */
+  {
+    { Bad_Opcode },
+    { "vextracti32x8", { EXxmmq, XM, Ib }, 0 },
+    { "vextracti32x8", { EXxmmq, XM, Ib }, 0 },
+  },
+
+  /* EVEX_LEN_0F3A3B_P_2_W_1 */
+  {
+    { Bad_Opcode },
+    { "vextracti64x4", { EXxmmq, XM, Ib }, 0 },
+    { "vextracti64x4", { EXxmmq, XM, Ib }, 0 },
+  },
+
+  /* EVEX_LEN_0F3A43_P_2_W_0 */
+  {
+    { Bad_Opcode },
+    { "vshufi32x4",    { XM, Vex, EXx, Ib }, 0 },
+    { "vshufi32x4",    { XM, Vex, EXx, Ib }, 0 },
+  },
+
+  /* EVEX_LEN_0F3A43_P_2_W_1 */
+  {
+    { Bad_Opcode },
+    { "vshufi64x2",    { XM, Vex, EXx, Ib }, 0 },
+    { "vshufi64x2",    { XM, Vex, EXx, Ib }, 0 },
+  },
+
 #endif /* NEED_EVEX_LEN_TABLE */
index 5d1bd6b0300ac0769f32acab537fc1c310232c54..496b8f26a8c6fbb8f1b845ac929c44fbd1e9f7c5 100644 (file)
@@ -1945,7 +1945,19 @@ enum
   EVEX_LEN_0F3A1A_P_2_W_0,
   EVEX_LEN_0F3A1A_P_2_W_1,
   EVEX_LEN_0F3A1B_P_2_W_0,
-  EVEX_LEN_0F3A1B_P_2_W_1
+  EVEX_LEN_0F3A1B_P_2_W_1,
+  EVEX_LEN_0F3A23_P_2_W_0,
+  EVEX_LEN_0F3A23_P_2_W_1,
+  EVEX_LEN_0F3A38_P_2_W_0,
+  EVEX_LEN_0F3A38_P_2_W_1,
+  EVEX_LEN_0F3A39_P_2_W_0,
+  EVEX_LEN_0F3A39_P_2_W_1,
+  EVEX_LEN_0F3A3A_P_2_W_0,
+  EVEX_LEN_0F3A3A_P_2_W_1,
+  EVEX_LEN_0F3A3B_P_2_W_0,
+  EVEX_LEN_0F3A3B_P_2_W_1,
+  EVEX_LEN_0F3A43_P_2_W_0,
+  EVEX_LEN_0F3A43_P_2_W_1
 };
 
 enum