/* 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;