x86: use %LW / %XW instead of going through vex_w_table[]
authorJan Beulich <jbeulich@suse.com>
Mon, 6 Jul 2020 11:44:03 +0000 (13:44 +0200)
committerJan Beulich <jbeulich@suse.com>
Mon, 6 Jul 2020 11:44:03 +0000 (13:44 +0200)
Since we have these macros, there's no point having unnecessary table
depth.

VFPCLASSP{S,D} are now the first instance of using two %-prefixed
macros, which has pointed out a problem with the implementation. Instead
of using custom code in various case blocks, do the macro accumulation
centralized at the top of the main loop of putop(), and zap the
accumulated macros at the bottom of that loop once it has been
processed.

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

index 1ee200f0d2e1fca60719fdf602f75b35be2a41da..3de6d6462230ab51e902e5808054fd37b65fad79 100644 (file)
@@ -1,3 +1,17 @@
+2020-07-06  Jan Beulich  <jbeulich@suse.com>
+
+       * i386-dis.c (EVEX_W_0F3838_P_1,
+       EVEX_W_0F3839_P_1, EVEX_W_0F3840_P_2, EVEX_W_0F3855_P_2,
+       EVEX_W_0F3868_P_3, EVEX_W_0F3871_P_2, EVEX_W_0F3873_P_2,
+       EVEX_W_0F3A50_P_2, EVEX_W_0F3A51_P_2, EVEX_W_0F3A56_P_2,
+       EVEX_W_0F3A57_P_2, EVEX_W_0F3A66_P_2, EVEX_W_0F3A67_P_2,
+       EVEX_W_0F3A71_P_2, EVEX_W_0F3A73_P_2): Delete.
+       (putop): Centralize management of last[]. Delete SAVE_LAST.
+       * i386-dis-evex-w.h: Move entries for opcodes 0F3838, 0F3839,
+       0F3840, 0F3855, 0F3868, 0F3871, 0F3873, 0F3A50, 0F3A51, 0F3A56,
+       0F3A57, 0F3A66, 0F3A67, 0F3A71, and 0F3A73 ...
+       * i386-dis-evex-prefix.h: here.
+
 2020-07-06  Jan Beulich  <jbeulich@suse.com>
 
        * i386-dis.c (MOD_EVEX_0F381A_P_2_W_0, MOD_EVEX_0F381A_P_2_W_1,
index 4bfa31977f05e86e605d9fa4229bdfc3c8380384..bff0a42500006e260917cc67a00572a9c211acae 100644 (file)
   /* PREFIX_EVEX_0F3838 */
   {
     { Bad_Opcode },
-    { VEX_W_TABLE (EVEX_W_0F3838_P_1) },
+    { "vpmovm2%LW",    { XM, MaskR }, 0 },
     { "vpminsb",       { XM, Vex, EXx }, 0 },
   },
   /* PREFIX_EVEX_0F3839 */
   {
     { Bad_Opcode },
-    { VEX_W_TABLE (EVEX_W_0F3839_P_1) },
+    { "vpmov%LW2m",    { XMask, EXx }, 0 },
     { "vpmins%LW",     { XM, Vex, EXx }, 0 },
   },
   /* PREFIX_EVEX_0F383A */
   {
     { Bad_Opcode },
     { Bad_Opcode },
-    { VEX_W_TABLE (EVEX_W_0F3840_P_2) },
+    { "vpmull%LW",     { XM, Vex, EXx }, 0 },
   },
   /* PREFIX_EVEX_0F3842 */
   {
   {
     { Bad_Opcode },
     { Bad_Opcode },
-    { VEX_W_TABLE (EVEX_W_0F3855_P_2) },
+    { "vpopcnt%LW",    { XM, EXx }, 0 },
   },
   /* PREFIX_EVEX_0F3859 */
   {
     { Bad_Opcode },
     { Bad_Opcode },
     { Bad_Opcode },
-    { VEX_W_TABLE (EVEX_W_0F3868_P_3) },
+    { "vp2intersect%LW", { XMask, Vex, EXx, EXxEVexS }, 0 },
   },
   /* PREFIX_EVEX_0F3870 */
   {
   {
     { Bad_Opcode },
     { Bad_Opcode },
-    { VEX_W_TABLE (EVEX_W_0F3871_P_2) },
+    { "vpshldv%LW",  { XM, Vex, EXx }, 0 },
   },
   /* PREFIX_EVEX_0F3872 */
   {
   {
     { Bad_Opcode },
     { Bad_Opcode },
-    { VEX_W_TABLE (EVEX_W_0F3873_P_2) },
+    { "vpshrdv%LW",  { XM, Vex, EXx }, 0 },
   },
   /* PREFIX_EVEX_0F3875 */
   {
   {
     { Bad_Opcode },
     { Bad_Opcode },
-    { VEX_W_TABLE (EVEX_W_0F3A50_P_2) },
+    { "vrangep%XW",    { XM, Vex, EXx, EXxEVexS, Ib }, 0 },
   },
   /* PREFIX_EVEX_0F3A51 */
   {
     { Bad_Opcode },
     { Bad_Opcode },
-    { VEX_W_TABLE (EVEX_W_0F3A51_P_2) },
+    { "vranges%XW",    { XMScalar, VexScalar, EXVexWdqScalar, EXxEVexS, Ib }, 0 },
   },
   /* PREFIX_EVEX_0F3A54 */
   {
   {
     { Bad_Opcode },
     { Bad_Opcode },
-    { VEX_W_TABLE (EVEX_W_0F3A56_P_2) },
+    { "vreducep%XW",   { XM, EXx, EXxEVexS, Ib }, 0 },
   },
   /* PREFIX_EVEX_0F3A57 */
   {
     { Bad_Opcode },
     { Bad_Opcode },
-    { VEX_W_TABLE (EVEX_W_0F3A57_P_2) },
+    { "vreduces%XW",   { XMScalar, VexScalar, EXVexWdqScalar, EXxEVexS, Ib }, 0 },
   },
   /* PREFIX_EVEX_0F3A66 */
   {
     { Bad_Opcode },
     { Bad_Opcode },
-    { VEX_W_TABLE (EVEX_W_0F3A66_P_2) },
+    { "vfpclassp%XW%XZ",       { XMask, EXx, Ib }, 0 },
   },
   /* PREFIX_EVEX_0F3A67 */
   {
     { Bad_Opcode },
     { Bad_Opcode },
-    { VEX_W_TABLE (EVEX_W_0F3A67_P_2) },
+    { "vfpclasss%XW",  { XMask, EXVexWdqScalar, Ib }, 0 },
   },
   /* PREFIX_EVEX_0F3A70 */
   {
   {
     { Bad_Opcode },
     { Bad_Opcode },
-    { VEX_W_TABLE (EVEX_W_0F3A71_P_2) },
+    { "vpshld%LW",   { XM, Vex, EXx, Ib }, 0 },
   },
   /* PREFIX_EVEX_0F3A72 */
   {
   {
     { Bad_Opcode },
     { Bad_Opcode },
-    { VEX_W_TABLE (EVEX_W_0F3A73_P_2) },
+    { "vpshrd%LW",   { XM, Vex, EXx, Ib }, 0 },
   },
index 1370c5cc4e7b8e6cad1dbf81c6ef11c4b3bd5889..6d0d48e5408545d93b5d2a3b0e4bc4acf83fecd3 100644 (file)
     { Bad_Opcode },
     { "vpcmpgtq",      { XMask, Vex, EXx }, 0 },
   },
-  /* EVEX_W_0F3838_P_1 */
-  {
-    { "vpmovm2d",      { XM, MaskR }, 0 },
-    { "vpmovm2q",      { XM, MaskR }, 0 },
-  },
-  /* EVEX_W_0F3839_P_1 */
-  {
-    { "vpmovd2m",      { XMask, EXx }, 0 },
-    { "vpmovq2m",      { XMask, EXx }, 0 },
-  },
   /* EVEX_W_0F383A_P_1 */
   {
     { "vpbroadcastmw2d",       { XM, MaskR }, 0 },
   },
-  /* EVEX_W_0F3840_P_2 */
-  {
-    { "vpmulld",       { XM, Vex, EXx }, 0 },
-    { "vpmullq",       { XM, Vex, EXx }, 0 },
-  },
   /* EVEX_W_0F3852_P_1 */
   {
     { "vdpbf16ps",     { XM, Vex, EXx }, 0 },
     { "vpopcntb",      { XM, EXx }, 0 },
     { "vpopcntw",      { XM, EXx }, 0 },
   },
-  /* EVEX_W_0F3855_P_2 */
-  {
-    { "vpopcntd",      { XM, EXx }, 0 },
-    { "vpopcntq",      { XM, EXx }, 0 },
-  },
   /* EVEX_W_0F3859_P_2 */
   {
     { "vbroadcasti32x2",       { XM, EXxmm_mq }, 0 },
     { "vpblendmb",     { XM, Vex, EXx }, 0 },
     { "vpblendmw",     { XM, Vex, EXx }, 0 },
   },
-  /* EVEX_W_0F3868_P_3 */
-  {
-    { "vp2intersectd", { XMask, Vex, EXx, EXxEVexS }, 0 },
-    { "vp2intersectq", { XMask, Vex, EXx, EXxEVexS }, 0 },
-  },
   /* EVEX_W_0F3870_P_2 */
   {
     { Bad_Opcode },
     { "vpshldvw",  { XM, Vex, EXx }, 0 },
   },
-  /* EVEX_W_0F3871_P_2 */
-  {
-    { "vpshldvd",  { XM, Vex, EXx }, 0 },
-    { "vpshldvq",  { XM, Vex, EXx }, 0 },
-  },
   /* EVEX_W_0F3872_P_1 */
   {
     { "vcvtneps2bf16%XY", { XMxmmq, EXx }, 0 },
     { "vcvtne2ps2bf16", { XM, Vex, EXx}, 0 },
     { Bad_Opcode },
   },
-  /* EVEX_W_0F3873_P_2 */
-  {
-    { "vpshrdvd",  { XM, Vex, EXx }, 0 },
-    { "vpshrdvq",  { XM, Vex, EXx }, 0 },
-  },
   /* EVEX_W_0F3875_P_2 */
   {
     { "vpermi2b",      { XM, Vex, EXx }, 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 */
-  {
-    { "vrangeps",      { XM, Vex, EXx, EXxEVexS, Ib }, 0 },
-    { "vrangepd",      { XM, Vex, EXx, EXxEVexS, Ib }, 0 },
-  },
-  /* EVEX_W_0F3A51_P_2 */
-  {
-    { "vrangess",      { XMScalar, VexScalar, EXxmm_md, EXxEVexS, Ib }, 0 },
-    { "vrangesd",      { XMScalar, VexScalar, EXxmm_mq, EXxEVexS, Ib }, 0 },
-  },
-  /* EVEX_W_0F3A56_P_2 */
-  {
-    { "vreduceps",     { XM, EXx, EXxEVexS, Ib }, 0 },
-    { "vreducepd",     { XM, EXx, EXxEVexS, Ib }, 0 },
-  },
-  /* EVEX_W_0F3A57_P_2 */
-  {
-    { "vreducess",     { XMScalar, VexScalar, EXxmm_md, EXxEVexS, Ib }, 0 },
-    { "vreducesd",     { XMScalar, VexScalar, EXxmm_mq, EXxEVexS, Ib }, 0 },
-  },
-  /* EVEX_W_0F3A66_P_2 */
-  {
-    { "vfpclassps%XZ", { XMask, EXx, Ib }, 0 },
-    { "vfpclasspd%XZ", { XMask, EXx, Ib }, 0 },
-  },
-  /* EVEX_W_0F3A67_P_2 */
-  {
-    { "vfpclassss",    { XMask, EXxmm_md, Ib }, 0 },
-    { "vfpclasssd",    { XMask, EXxmm_mq, Ib }, 0 },
-  },
   /* EVEX_W_0F3A70_P_2 */
   {
     { Bad_Opcode },
     { "vpshldw",   { XM, Vex, EXx, Ib }, 0 },
   },
-  /* EVEX_W_0F3A71_P_2 */
-  {
-    { "vpshldd",   { XM, Vex, EXx, Ib }, 0 },
-    { "vpshldq",   { XM, Vex, EXx, Ib }, 0 },
-  },
   /* EVEX_W_0F3A72_P_2 */
   {
     { Bad_Opcode },
     { "vpshrdw",   { XM, Vex, EXx, Ib }, 0 },
   },
-  /* EVEX_W_0F3A73_P_2 */
-  {
-    { "vpshrdd",   { XM, Vex, EXx, Ib }, 0 },
-    { "vpshrdq",   { XM, Vex, EXx, Ib }, 0 },
-  },
index 3133d8eee62cfee8ed054b6138ff1114bc447f8f..0a5daa30bfdefd1626875639da25ed3a92dab068 100644 (file)
@@ -2071,26 +2071,19 @@ enum
   EVEX_W_0F3835_P_1,
   EVEX_W_0F3835_P_2,
   EVEX_W_0F3837_P_2,
-  EVEX_W_0F3838_P_1,
-  EVEX_W_0F3839_P_1,
   EVEX_W_0F383A_P_1,
-  EVEX_W_0F3840_P_2,
   EVEX_W_0F3852_P_1,
   EVEX_W_0F3854_P_2,
-  EVEX_W_0F3855_P_2,
   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_0F3866_P_2,
-  EVEX_W_0F3868_P_3,
   EVEX_W_0F3870_P_2,
-  EVEX_W_0F3871_P_2,
   EVEX_W_0F3872_P_1,
   EVEX_W_0F3872_P_2,
   EVEX_W_0F3872_P_3,
-  EVEX_W_0F3873_P_2,
   EVEX_W_0F3875_P_2,
   EVEX_W_0F387A_P_2,
   EVEX_W_0F387B_P_2,
@@ -2127,16 +2120,8 @@ enum
   EVEX_W_0F3A3F_P_2,
   EVEX_W_0F3A42_P_2,
   EVEX_W_0F3A43_P_2,
-  EVEX_W_0F3A50_P_2,
-  EVEX_W_0F3A51_P_2,
-  EVEX_W_0F3A56_P_2,
-  EVEX_W_0F3A57_P_2,
-  EVEX_W_0F3A66_P_2,
-  EVEX_W_0F3A67_P_2,
   EVEX_W_0F3A70_P_2,
-  EVEX_W_0F3A71_P_2,
   EVEX_W_0F3A72_P_2,
-  EVEX_W_0F3A73_P_2,
 };
 
 typedef void (*op_rtn) (int bytemode, int sizeflag);
@@ -12626,17 +12611,18 @@ putop (const char *in_template, int sizeflag)
   const char *p;
   int alt = 0;
   int cond = 1;
-  unsigned int l = 0, len = 1;
+  unsigned int l = 0, len = 0;
   char last[4];
 
-#define SAVE_LAST(c)                   \
-  if (l < len && l < sizeof (last))    \
-    last[l++] = c;                     \
-  else                                 \
-    abort ();
-
   for (p = in_template; *p; p++)
     {
+      if (len > l)
+       {
+         if (l >= sizeof (last) || !ISUPPER (*p))
+           abort ();
+         last[l++] = *p;
+         continue;
+       }
       switch (*p)
        {
        default:
@@ -12674,7 +12660,7 @@ putop (const char *in_template, int sizeflag)
            *obufp++ = 'b';
          break;
        case 'B':
-         if (l == 0 && len == 1)
+         if (l == 0)
            {
            case_B:
              if (intel_syntax)
@@ -12682,16 +12668,8 @@ putop (const char *in_template, int sizeflag)
              if (sizeflag & SUFFIX_ALWAYS)
                *obufp++ = 'b';
            }
-         else
+         else if (l == 1 && last[0] == 'L')
            {
-             if (l != 1
-                 || len != 2
-                 || last[0] != 'L')
-               {
-                 SAVE_LAST (*p);
-                 break;
-               }
-
              if (address_mode == mode_64bit
                  && !(prefixes & PREFIX_ADDR))
                {
@@ -12702,6 +12680,8 @@ putop (const char *in_template, int sizeflag)
 
              goto case_B;
            }
+         else
+           abort ();
          break;
        case 'C':
          if (intel_syntax && !alt)
@@ -12793,13 +12773,10 @@ putop (const char *in_template, int sizeflag)
            *obufp++ = 'd';
          break;
        case 'Z':
-         if (l != 0 || len != 1)
+         if (l != 0)
            {
-             if (l != 1 || len != 2 || last[0] != 'X')
-               {
-                 SAVE_LAST (*p);
-                 break;
-               }
+             if (l != 1 || last[0] != 'X')
+               abort ();
              if (!need_vex || !vex.evex)
                abort ();
              if (intel_syntax
@@ -12831,11 +12808,8 @@ putop (const char *in_template, int sizeflag)
          /* Fall through.  */
          goto case_L;
        case 'L':
-         if (l != 0 || len != 1)
-           {
-             SAVE_LAST (*p);
-             break;
-           }
+         if (l != 0)
+           abort ();
        case_L:
          if (intel_syntax)
            break;
@@ -12883,7 +12857,7 @@ putop (const char *in_template, int sizeflag)
          /* Fall through.  */
          goto case_P;
        case 'P':
-         if (l == 0 && len == 1)
+         if (l == 0)
            {
            case_P:
              if (intel_syntax)
@@ -12914,14 +12888,8 @@ putop (const char *in_template, int sizeflag)
                    }
                }
            }
-         else
+         else if (l == 1 && last[0] == 'L')
            {
-             if (l != 1 || len != 2 || last[0] != 'L')
-               {
-                 SAVE_LAST (*p);
-                 break;
-               }
-
              if ((prefixes & PREFIX_DATA)
                  || (rex & REX_W)
                  || (sizeflag & SUFFIX_ALWAYS))
@@ -12939,6 +12907,8 @@ putop (const char *in_template, int sizeflag)
                    }
                }
            }
+         else
+           abort ();
          break;
        case 'U':
          if (intel_syntax)
@@ -12953,7 +12923,7 @@ putop (const char *in_template, int sizeflag)
          /* Fall through.  */
          goto case_Q;
        case 'Q':
-         if (l == 0 && len == 1)
+         if (l == 0)
            {
            case_Q:
              if (intel_syntax && !alt)
@@ -12973,13 +12943,8 @@ putop (const char *in_template, int sizeflag)
                    }
                }
            }
-         else
+         else if (l == 1 && last[0] == 'L')
            {
-             if (l != 1 || len != 2 || last[0] != 'L')
-               {
-                 SAVE_LAST (*p);
-                 break;
-               }
              if ((intel_syntax && need_modrm)
                  || (modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)))
                break;
@@ -12992,6 +12957,8 @@ putop (const char *in_template, int sizeflag)
                      || (sizeflag & SUFFIX_ALWAYS))
                *obufp++ = intel_syntax? 'd' : 'l';
            }
+         else
+           abort ();
          break;
        case 'R':
          USED_REX (REX_W);
@@ -13013,7 +12980,7 @@ putop (const char *in_template, int sizeflag)
            used_prefixes |= (prefixes & PREFIX_DATA);
          break;
        case 'V':
-         if (l == 0 && len == 1)
+         if (l == 0)
            {
              if (intel_syntax)
                break;
@@ -13025,16 +12992,8 @@ putop (const char *in_template, int sizeflag)
                  break;
                }
            }
-         else
+         else if (l == 1 && last[0] == 'L')
            {
-             if (l != 1
-                 || len != 2
-                 || last[0] != 'L')
-               {
-                 SAVE_LAST (*p);
-                 break;
-               }
-
              if (rex & REX_W)
                {
                  *obufp++ = 'a';
@@ -13042,10 +13001,12 @@ putop (const char *in_template, int sizeflag)
                  *obufp++ = 's';
                }
            }
+         else
+           abort ();
          /* Fall through.  */
          goto case_S;
        case 'S':
-         if (l == 0 && len == 1)
+         if (l == 0)
            {
            case_S:
              if (intel_syntax)
@@ -13064,16 +13025,8 @@ putop (const char *in_template, int sizeflag)
                    }
                }
            }
-         else
+         else if (l == 1 && last[0] == 'L')
            {
-             if (l != 1
-                 || len != 2
-                 || last[0] != 'L')
-               {
-                 SAVE_LAST (*p);
-                 break;
-               }
-
              if (address_mode == mode_64bit
                  && !(prefixes & PREFIX_ADDR))
                {
@@ -13084,13 +13037,12 @@ putop (const char *in_template, int sizeflag)
 
              goto case_S;
            }
+         else
+           abort ();
          break;
        case 'X':
-         if (l != 0 || len != 1)
-           {
-             SAVE_LAST (*p);
-             break;
-           }
+         if (l != 0)
+           abort ();
          if (need_vex
              ? vex.prefix == DATA_PREFIX_OPCODE
              : prefixes & PREFIX_DATA)
@@ -13102,15 +13054,8 @@ putop (const char *in_template, int sizeflag)
            *obufp++ = 's';
          break;
        case 'Y':
-         if (l == 0 && len == 1)
-           abort ();
-         else
+         if (l == 1 && last[0] == 'X')
            {
-             if (l != 1 || len != 2 || last[0] != 'X')
-               {
-                 SAVE_LAST (*p);
-                 break;
-               }
              if (!need_vex)
                abort ();
              if (intel_syntax
@@ -13130,9 +13075,11 @@ putop (const char *in_template, int sizeflag)
                    abort ();
                }
            }
+         else
+           abort ();
          break;
        case 'W':
-         if (l == 0 && len == 1)
+         if (l == 0)
            {
              /* operand size flag for cwtl, cbtw */
              USED_REX (REX_W);
@@ -13150,23 +13097,19 @@ putop (const char *in_template, int sizeflag)
              if (!(rex & REX_W))
                used_prefixes |= (prefixes & PREFIX_DATA);
            }
-         else
+         else if (l == 1)
            {
-             if (l != 1
-                 || len != 2
-                 || (last[0] != 'X'
-                     && last[0] != 'L'))
-               {
-                 SAVE_LAST (*p);
-                 break;
-               }
              if (!need_vex)
                abort ();
              if (last[0] == 'X')
                *obufp++ = vex.w ? 'd': 's';
-             else
+             else if (last[0] == 'L')
                *obufp++ = vex.w ? 'q': 'd';
+             else
+               abort ();
            }
+         else
+           abort ();
          break;
        case '^':
          if (intel_syntax)
@@ -13201,6 +13144,9 @@ putop (const char *in_template, int sizeflag)
            }
          break;
        }
+
+      if (len == l)
+       len = l = 0;
     }
   *obufp = 0;
   mnemonicendp = obufp;
This page took 0.033237 seconds and 4 git commands to generate.