/* 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 },
   },
 
     { 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 },
-  },
 
   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,
   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);
   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:
            *obufp++ = 'b';
          break;
        case 'B':
-         if (l == 0 && len == 1)
+         if (l == 0)
            {
            case_B:
              if (intel_syntax)
              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))
                {
 
              goto case_B;
            }
+         else
+           abort ();
          break;
        case 'C':
          if (intel_syntax && !alt)
            *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
          /* 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;
          /* Fall through.  */
          goto case_P;
        case 'P':
-         if (l == 0 && len == 1)
+         if (l == 0)
            {
            case_P:
              if (intel_syntax)
                    }
                }
            }
-         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))
                    }
                }
            }
+         else
+           abort ();
          break;
        case 'U':
          if (intel_syntax)
          /* Fall through.  */
          goto case_Q;
        case 'Q':
-         if (l == 0 && len == 1)
+         if (l == 0)
            {
            case_Q:
              if (intel_syntax && !alt)
                    }
                }
            }
-         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;
                      || (sizeflag & SUFFIX_ALWAYS))
                *obufp++ = intel_syntax? 'd' : 'l';
            }
+         else
+           abort ();
          break;
        case 'R':
          USED_REX (REX_W);
            used_prefixes |= (prefixes & PREFIX_DATA);
          break;
        case 'V':
-         if (l == 0 && len == 1)
+         if (l == 0)
            {
              if (intel_syntax)
                break;
                  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';
                  *obufp++ = 's';
                }
            }
+         else
+           abort ();
          /* Fall through.  */
          goto case_S;
        case 'S':
-         if (l == 0 && len == 1)
+         if (l == 0)
            {
            case_S:
              if (intel_syntax)
                    }
                }
            }
-         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))
                {
 
              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)
            *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
                    abort ();
                }
            }
+         else
+           abort ();
          break;
        case 'W':
-         if (l == 0 && len == 1)
+         if (l == 0)
            {
              /* operand size flag for cwtl, cbtw */
              USED_REX (REX_W);
              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)
            }
          break;
        }
+
+      if (len == l)
+       len = l = 0;
     }
   *obufp = 0;
   mnemonicendp = obufp;