x86: extend %BW use to VP{COMPRESS,EXPAND}{B,W}
authorJan Beulich <jbeulich@suse.com>
Tue, 14 Jul 2020 08:29:25 +0000 (10:29 +0200)
committerJan Beulich <jbeulich@suse.com>
Tue, 14 Jul 2020 08:29:25 +0000 (10:29 +0200)
Unlike the earlier ones these also need their operands adjusted. Replace
the (mis-described: there's nothing "scalar" here) {b,w}_scalar_mode by
a single new mode, with the actual unit width controlled by EVEX.W.

opcodes/ChangeLog
opcodes/i386-dis-evex-prefix.h
opcodes/i386-dis-evex-w.h
opcodes/i386-dis.c

index cfce6b7050598b4a6c5a9d1c3661a03f9a16d150..f0b4d8c99a477615e6ed0e82841c33cfab96bb54 100644 (file)
@@ -1,3 +1,16 @@
+2020-07-14  Jan Beulich  <jbeulich@suse.com>
+
+       * i386-dis.c (EVEX_W_0F3862_P_2, EVEX_W_0F3863_P_2): Delete.
+       (EXbScalar, EXwScalar): Fold to ...
+       (EXbwUnit): ... this.
+       (b_scalar_mode, w_scalar_mode): Fold to ...
+       (bw_unit_mode): ... this.
+       (intel_operand_size, OP_E_memory): Replace b_scalar_mode /
+       w_scalar_mode handling by bw_unit_mode one.
+       * i386-dis-evex-w.h: Move entries for opcodes 0F3862 and 0F3863
+       ...
+       * i386-dis-evex-prefix.h: ... here.
+
 2020-07-14  Jan Beulich  <jbeulich@suse.com>
 
        * i386-dis.c (PCMPESTR_Fixup): Delete.
index 1929f2485dad24204dcf3a28460f2956e2c14eaa..04c93813c1053aaa26ebd940f3e9ec9fed663330 100644 (file)
   {
     { Bad_Opcode },
     { Bad_Opcode },
-    { VEX_W_TABLE (EVEX_W_0F3862_P_2) },
+    { "vpexpand%BW", { XM, EXbwUnit }, 0 },
   },
   /* PREFIX_EVEX_0F3863 */
   {
     { Bad_Opcode },
     { Bad_Opcode },
-    { VEX_W_TABLE (EVEX_W_0F3863_P_2) },
+    { "vpcompress%BW",   { EXbwUnit, XM }, 0 },
   },
   /* PREFIX_EVEX_0F3864 */
   {
index 2d92290b885bc71f62669a20e4d3bb350447ba92..695cf8195d53ec9199e7b37b4667ce1ca92e195b 100644 (file)
     { MOD_TABLE (MOD_EVEX_0F385B_P_2_W_0) },
     { MOD_TABLE (MOD_EVEX_0F385B_P_2_W_1) },
   },
-  /* EVEX_W_0F3862_P_2 */
-  {
-    { "vpexpandb", { XM, EXbScalar }, 0 },
-    { "vpexpandw", { XM, EXwScalar }, 0 },
-  },
-  /* EVEX_W_0F3863_P_2 */
-  {
-    { "vpcompressb",   { EXbScalar, XM }, 0 },
-    { "vpcompressw",   { EXwScalar, XM }, 0 },
-  },
   /* EVEX_W_0F3870_P_2 */
   {
     { Bad_Opcode },
index 5a0282b2698d492f123b4db6c4674828cca0a163..b68e737bd79ca8a45d1f25cc25267722cb538289 100644 (file)
@@ -358,9 +358,8 @@ fetch_data (struct disassemble_info *info, bfd_byte *addr)
 #define EMS { OP_EM, v_swap_mode }
 #define EMd { OP_EM, d_mode }
 #define EMx { OP_EM, x_mode }
-#define EXbScalar { OP_EX, b_scalar_mode }
+#define EXbwUnit { OP_EX, bw_unit_mode }
 #define EXw { OP_EX, w_mode }
-#define EXwScalar { OP_EX, w_scalar_mode }
 #define EXd { OP_EX, d_mode }
 #define EXdS { OP_EX, d_swap_mode }
 #define EXq { OP_EX, q_mode }
@@ -488,6 +487,8 @@ enum
   x_mode,
   /* Similar to x_mode, but with different EVEX mem shifts.  */
   evex_x_gscat_mode,
+  /* Similar to x_mode, but with yet different EVEX mem shifts.  */
+  bw_unit_mode,
   /* Similar to x_mode, but with disabled broadcast.  */
   evex_x_nobcst_mode,
   /* Similar to x_mode, but with operands swapped and disabled broadcast
@@ -579,10 +580,6 @@ enum
 
   /* scalar, ignore vector length.  */
   scalar_mode,
-  /* like b_mode, ignore vector length.  */
-  b_scalar_mode,
-  /* like w_mode, ignore vector length.  */
-  w_scalar_mode,
   /* like d_swap_mode, ignore vector length.  */
   d_scalar_swap_mode,
   /* like q_swap_mode, ignore vector length.  */
@@ -2183,8 +2180,6 @@ enum
   EVEX_W_0F3859_P_2,
   EVEX_W_0F385A_P_2,
   EVEX_W_0F385B_P_2,
-  EVEX_W_0F3862_P_2,
-  EVEX_W_0F3863_P_2,
   EVEX_W_0F3870_P_2,
   EVEX_W_0F3872_P_1,
   EVEX_W_0F3872_P_2,
@@ -14109,8 +14104,7 @@ intel_operand_size (int bytemode, int sizeflag)
     case x_swap_mode:
     case evex_x_gscat_mode:
     case evex_x_nobcst_mode:
-    case b_scalar_mode:
-    case w_scalar_mode:
+    case bw_unit_mode:
       if (need_vex)
        {
          switch (vex.length)
@@ -14592,11 +14586,12 @@ OP_E_memory (int bytemode, int sizeflag)
        case d_scalar_swap_mode:
          shift = 2;
          break;
-       case w_scalar_mode:
+       case bw_unit_mode:
+         shift = vex.w ? 1 : 0;
+         break;
        case xmm_mw_mode:
          shift = 1;
          break;
-       case b_scalar_mode:
        case xmm_mb_mode:
          shift = 0;
          break;