x86: use %LW / %XW instead of going through vex_w_table[]

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.
This commit is contained in:
Jan Beulich 2020-07-06 13:44:03 +02:00
parent bc152a17ff
commit 21a3faebba
4 changed files with 77 additions and 192 deletions

View 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> 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, * i386-dis.c (MOD_EVEX_0F381A_P_2_W_0, MOD_EVEX_0F381A_P_2_W_1,

View File

@ -564,13 +564,13 @@
/* PREFIX_EVEX_0F3838 */ /* PREFIX_EVEX_0F3838 */
{ {
{ Bad_Opcode }, { Bad_Opcode },
{ VEX_W_TABLE (EVEX_W_0F3838_P_1) }, { "vpmovm2%LW", { XM, MaskR }, 0 },
{ "vpminsb", { XM, Vex, EXx }, 0 }, { "vpminsb", { XM, Vex, EXx }, 0 },
}, },
/* PREFIX_EVEX_0F3839 */ /* PREFIX_EVEX_0F3839 */
{ {
{ Bad_Opcode }, { Bad_Opcode },
{ VEX_W_TABLE (EVEX_W_0F3839_P_1) }, { "vpmov%LW2m", { XMask, EXx }, 0 },
{ "vpmins%LW", { XM, Vex, EXx }, 0 }, { "vpmins%LW", { XM, Vex, EXx }, 0 },
}, },
/* PREFIX_EVEX_0F383A */ /* PREFIX_EVEX_0F383A */
@ -601,7 +601,7 @@
{ {
{ Bad_Opcode }, { Bad_Opcode },
{ Bad_Opcode }, { Bad_Opcode },
{ VEX_W_TABLE (EVEX_W_0F3840_P_2) }, { "vpmull%LW", { XM, Vex, EXx }, 0 },
}, },
/* PREFIX_EVEX_0F3842 */ /* PREFIX_EVEX_0F3842 */
{ {
@ -699,7 +699,7 @@
{ {
{ Bad_Opcode }, { Bad_Opcode },
{ Bad_Opcode }, { Bad_Opcode },
{ VEX_W_TABLE (EVEX_W_0F3855_P_2) }, { "vpopcnt%LW", { XM, EXx }, 0 },
}, },
/* PREFIX_EVEX_0F3859 */ /* PREFIX_EVEX_0F3859 */
{ {
@ -754,7 +754,7 @@
{ Bad_Opcode }, { Bad_Opcode },
{ Bad_Opcode }, { Bad_Opcode },
{ Bad_Opcode }, { Bad_Opcode },
{ VEX_W_TABLE (EVEX_W_0F3868_P_3) }, { "vp2intersect%LW", { XMask, Vex, EXx, EXxEVexS }, 0 },
}, },
/* PREFIX_EVEX_0F3870 */ /* PREFIX_EVEX_0F3870 */
{ {
@ -766,7 +766,7 @@
{ {
{ Bad_Opcode }, { Bad_Opcode },
{ Bad_Opcode }, { Bad_Opcode },
{ VEX_W_TABLE (EVEX_W_0F3871_P_2) }, { "vpshldv%LW", { XM, Vex, EXx }, 0 },
}, },
/* PREFIX_EVEX_0F3872 */ /* PREFIX_EVEX_0F3872 */
{ {
@ -779,7 +779,7 @@
{ {
{ Bad_Opcode }, { Bad_Opcode },
{ Bad_Opcode }, { Bad_Opcode },
{ VEX_W_TABLE (EVEX_W_0F3873_P_2) }, { "vpshrdv%LW", { XM, Vex, EXx }, 0 },
}, },
/* PREFIX_EVEX_0F3875 */ /* PREFIX_EVEX_0F3875 */
{ {
@ -1251,13 +1251,13 @@
{ {
{ Bad_Opcode }, { Bad_Opcode },
{ Bad_Opcode }, { Bad_Opcode },
{ VEX_W_TABLE (EVEX_W_0F3A50_P_2) }, { "vrangep%XW", { XM, Vex, EXx, EXxEVexS, Ib }, 0 },
}, },
/* PREFIX_EVEX_0F3A51 */ /* PREFIX_EVEX_0F3A51 */
{ {
{ Bad_Opcode }, { Bad_Opcode },
{ Bad_Opcode }, { Bad_Opcode },
{ VEX_W_TABLE (EVEX_W_0F3A51_P_2) }, { "vranges%XW", { XMScalar, VexScalar, EXVexWdqScalar, EXxEVexS, Ib }, 0 },
}, },
/* PREFIX_EVEX_0F3A54 */ /* PREFIX_EVEX_0F3A54 */
{ {
@ -1275,25 +1275,25 @@
{ {
{ Bad_Opcode }, { Bad_Opcode },
{ Bad_Opcode }, { Bad_Opcode },
{ VEX_W_TABLE (EVEX_W_0F3A56_P_2) }, { "vreducep%XW", { XM, EXx, EXxEVexS, Ib }, 0 },
}, },
/* PREFIX_EVEX_0F3A57 */ /* PREFIX_EVEX_0F3A57 */
{ {
{ Bad_Opcode }, { Bad_Opcode },
{ Bad_Opcode }, { Bad_Opcode },
{ VEX_W_TABLE (EVEX_W_0F3A57_P_2) }, { "vreduces%XW", { XMScalar, VexScalar, EXVexWdqScalar, EXxEVexS, Ib }, 0 },
}, },
/* PREFIX_EVEX_0F3A66 */ /* PREFIX_EVEX_0F3A66 */
{ {
{ Bad_Opcode }, { Bad_Opcode },
{ Bad_Opcode }, { Bad_Opcode },
{ VEX_W_TABLE (EVEX_W_0F3A66_P_2) }, { "vfpclassp%XW%XZ", { XMask, EXx, Ib }, 0 },
}, },
/* PREFIX_EVEX_0F3A67 */ /* PREFIX_EVEX_0F3A67 */
{ {
{ Bad_Opcode }, { Bad_Opcode },
{ Bad_Opcode }, { Bad_Opcode },
{ VEX_W_TABLE (EVEX_W_0F3A67_P_2) }, { "vfpclasss%XW", { XMask, EXVexWdqScalar, Ib }, 0 },
}, },
/* PREFIX_EVEX_0F3A70 */ /* PREFIX_EVEX_0F3A70 */
{ {
@ -1305,7 +1305,7 @@
{ {
{ Bad_Opcode }, { Bad_Opcode },
{ Bad_Opcode }, { Bad_Opcode },
{ VEX_W_TABLE (EVEX_W_0F3A71_P_2) }, { "vpshld%LW", { XM, Vex, EXx, Ib }, 0 },
}, },
/* PREFIX_EVEX_0F3A72 */ /* PREFIX_EVEX_0F3A72 */
{ {
@ -1317,5 +1317,5 @@
{ {
{ Bad_Opcode }, { Bad_Opcode },
{ Bad_Opcode }, { Bad_Opcode },
{ VEX_W_TABLE (EVEX_W_0F3A73_P_2) }, { "vpshrd%LW", { XM, Vex, EXx, Ib }, 0 },
}, },

View File

@ -518,25 +518,10 @@
{ Bad_Opcode }, { Bad_Opcode },
{ "vpcmpgtq", { XMask, Vex, EXx }, 0 }, { "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 */ /* EVEX_W_0F383A_P_1 */
{ {
{ "vpbroadcastmw2d", { XM, MaskR }, 0 }, { "vpbroadcastmw2d", { XM, MaskR }, 0 },
}, },
/* EVEX_W_0F3840_P_2 */
{
{ "vpmulld", { XM, Vex, EXx }, 0 },
{ "vpmullq", { XM, Vex, EXx }, 0 },
},
/* EVEX_W_0F3852_P_1 */ /* EVEX_W_0F3852_P_1 */
{ {
{ "vdpbf16ps", { XM, Vex, EXx }, 0 }, { "vdpbf16ps", { XM, Vex, EXx }, 0 },
@ -547,11 +532,6 @@
{ "vpopcntb", { XM, EXx }, 0 }, { "vpopcntb", { XM, EXx }, 0 },
{ "vpopcntw", { 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 */ /* EVEX_W_0F3859_P_2 */
{ {
{ "vbroadcasti32x2", { XM, EXxmm_mq }, 0 }, { "vbroadcasti32x2", { XM, EXxmm_mq }, 0 },
@ -582,21 +562,11 @@
{ "vpblendmb", { XM, Vex, EXx }, 0 }, { "vpblendmb", { XM, Vex, EXx }, 0 },
{ "vpblendmw", { 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 */ /* EVEX_W_0F3870_P_2 */
{ {
{ Bad_Opcode }, { Bad_Opcode },
{ "vpshldvw", { XM, Vex, EXx }, 0 }, { "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 */ /* EVEX_W_0F3872_P_1 */
{ {
{ "vcvtneps2bf16%XY", { XMxmmq, EXx }, 0 }, { "vcvtneps2bf16%XY", { XMxmmq, EXx }, 0 },
@ -612,11 +582,6 @@
{ "vcvtne2ps2bf16", { XM, Vex, EXx}, 0 }, { "vcvtne2ps2bf16", { XM, Vex, EXx}, 0 },
{ Bad_Opcode }, { Bad_Opcode },
}, },
/* EVEX_W_0F3873_P_2 */
{
{ "vpshrdvd", { XM, Vex, EXx }, 0 },
{ "vpshrdvq", { XM, Vex, EXx }, 0 },
},
/* EVEX_W_0F3875_P_2 */ /* EVEX_W_0F3875_P_2 */
{ {
{ "vpermi2b", { XM, Vex, EXx }, 0 }, { "vpermi2b", { XM, Vex, EXx }, 0 },
@ -786,53 +751,13 @@
{ EVEX_LEN_TABLE (EVEX_LEN_0F3A43_P_2_W_0) }, { EVEX_LEN_TABLE (EVEX_LEN_0F3A43_P_2_W_0) },
{ EVEX_LEN_TABLE (EVEX_LEN_0F3A43_P_2_W_1) }, { 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 */ /* EVEX_W_0F3A70_P_2 */
{ {
{ Bad_Opcode }, { Bad_Opcode },
{ "vpshldw", { XM, Vex, EXx, Ib }, 0 }, { "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 */ /* EVEX_W_0F3A72_P_2 */
{ {
{ Bad_Opcode }, { Bad_Opcode },
{ "vpshrdw", { XM, Vex, EXx, Ib }, 0 }, { "vpshrdw", { XM, Vex, EXx, Ib }, 0 },
}, },
/* EVEX_W_0F3A73_P_2 */
{
{ "vpshrdd", { XM, Vex, EXx, Ib }, 0 },
{ "vpshrdq", { XM, Vex, EXx, Ib }, 0 },
},

View File

@ -2071,26 +2071,19 @@ enum
EVEX_W_0F3835_P_1, EVEX_W_0F3835_P_1,
EVEX_W_0F3835_P_2, EVEX_W_0F3835_P_2,
EVEX_W_0F3837_P_2, EVEX_W_0F3837_P_2,
EVEX_W_0F3838_P_1,
EVEX_W_0F3839_P_1,
EVEX_W_0F383A_P_1, EVEX_W_0F383A_P_1,
EVEX_W_0F3840_P_2,
EVEX_W_0F3852_P_1, EVEX_W_0F3852_P_1,
EVEX_W_0F3854_P_2, EVEX_W_0F3854_P_2,
EVEX_W_0F3855_P_2,
EVEX_W_0F3859_P_2, EVEX_W_0F3859_P_2,
EVEX_W_0F385A_P_2, EVEX_W_0F385A_P_2,
EVEX_W_0F385B_P_2, EVEX_W_0F385B_P_2,
EVEX_W_0F3862_P_2, EVEX_W_0F3862_P_2,
EVEX_W_0F3863_P_2, EVEX_W_0F3863_P_2,
EVEX_W_0F3866_P_2, EVEX_W_0F3866_P_2,
EVEX_W_0F3868_P_3,
EVEX_W_0F3870_P_2, EVEX_W_0F3870_P_2,
EVEX_W_0F3871_P_2,
EVEX_W_0F3872_P_1, EVEX_W_0F3872_P_1,
EVEX_W_0F3872_P_2, EVEX_W_0F3872_P_2,
EVEX_W_0F3872_P_3, EVEX_W_0F3872_P_3,
EVEX_W_0F3873_P_2,
EVEX_W_0F3875_P_2, EVEX_W_0F3875_P_2,
EVEX_W_0F387A_P_2, EVEX_W_0F387A_P_2,
EVEX_W_0F387B_P_2, EVEX_W_0F387B_P_2,
@ -2127,16 +2120,8 @@ enum
EVEX_W_0F3A3F_P_2, EVEX_W_0F3A3F_P_2,
EVEX_W_0F3A42_P_2, EVEX_W_0F3A42_P_2,
EVEX_W_0F3A43_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_0F3A70_P_2,
EVEX_W_0F3A71_P_2,
EVEX_W_0F3A72_P_2, EVEX_W_0F3A72_P_2,
EVEX_W_0F3A73_P_2,
}; };
typedef void (*op_rtn) (int bytemode, int sizeflag); typedef void (*op_rtn) (int bytemode, int sizeflag);
@ -12626,17 +12611,18 @@ putop (const char *in_template, int sizeflag)
const char *p; const char *p;
int alt = 0; int alt = 0;
int cond = 1; int cond = 1;
unsigned int l = 0, len = 1; unsigned int l = 0, len = 0;
char last[4]; char last[4];
#define SAVE_LAST(c) \
if (l < len && l < sizeof (last)) \
last[l++] = c; \
else \
abort ();
for (p = in_template; *p; p++) for (p = in_template; *p; p++)
{ {
if (len > l)
{
if (l >= sizeof (last) || !ISUPPER (*p))
abort ();
last[l++] = *p;
continue;
}
switch (*p) switch (*p)
{ {
default: default:
@ -12674,7 +12660,7 @@ putop (const char *in_template, int sizeflag)
*obufp++ = 'b'; *obufp++ = 'b';
break; break;
case 'B': case 'B':
if (l == 0 && len == 1) if (l == 0)
{ {
case_B: case_B:
if (intel_syntax) if (intel_syntax)
@ -12682,16 +12668,8 @@ putop (const char *in_template, int sizeflag)
if (sizeflag & SUFFIX_ALWAYS) if (sizeflag & SUFFIX_ALWAYS)
*obufp++ = 'b'; *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 if (address_mode == mode_64bit
&& !(prefixes & PREFIX_ADDR)) && !(prefixes & PREFIX_ADDR))
{ {
@ -12702,6 +12680,8 @@ putop (const char *in_template, int sizeflag)
goto case_B; goto case_B;
} }
else
abort ();
break; break;
case 'C': case 'C':
if (intel_syntax && !alt) if (intel_syntax && !alt)
@ -12793,13 +12773,10 @@ putop (const char *in_template, int sizeflag)
*obufp++ = 'd'; *obufp++ = 'd';
break; break;
case 'Z': case 'Z':
if (l != 0 || len != 1) if (l != 0)
{ {
if (l != 1 || len != 2 || last[0] != 'X') if (l != 1 || last[0] != 'X')
{ abort ();
SAVE_LAST (*p);
break;
}
if (!need_vex || !vex.evex) if (!need_vex || !vex.evex)
abort (); abort ();
if (intel_syntax if (intel_syntax
@ -12831,11 +12808,8 @@ putop (const char *in_template, int sizeflag)
/* Fall through. */ /* Fall through. */
goto case_L; goto case_L;
case 'L': case 'L':
if (l != 0 || len != 1) if (l != 0)
{ abort ();
SAVE_LAST (*p);
break;
}
case_L: case_L:
if (intel_syntax) if (intel_syntax)
break; break;
@ -12883,7 +12857,7 @@ putop (const char *in_template, int sizeflag)
/* Fall through. */ /* Fall through. */
goto case_P; goto case_P;
case 'P': case 'P':
if (l == 0 && len == 1) if (l == 0)
{ {
case_P: case_P:
if (intel_syntax) 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) if ((prefixes & PREFIX_DATA)
|| (rex & REX_W) || (rex & REX_W)
|| (sizeflag & SUFFIX_ALWAYS)) || (sizeflag & SUFFIX_ALWAYS))
@ -12939,6 +12907,8 @@ putop (const char *in_template, int sizeflag)
} }
} }
} }
else
abort ();
break; break;
case 'U': case 'U':
if (intel_syntax) if (intel_syntax)
@ -12953,7 +12923,7 @@ putop (const char *in_template, int sizeflag)
/* Fall through. */ /* Fall through. */
goto case_Q; goto case_Q;
case 'Q': case 'Q':
if (l == 0 && len == 1) if (l == 0)
{ {
case_Q: case_Q:
if (intel_syntax && !alt) 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) if ((intel_syntax && need_modrm)
|| (modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS))) || (modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)))
break; break;
@ -12992,6 +12957,8 @@ putop (const char *in_template, int sizeflag)
|| (sizeflag & SUFFIX_ALWAYS)) || (sizeflag & SUFFIX_ALWAYS))
*obufp++ = intel_syntax? 'd' : 'l'; *obufp++ = intel_syntax? 'd' : 'l';
} }
else
abort ();
break; break;
case 'R': case 'R':
USED_REX (REX_W); USED_REX (REX_W);
@ -13013,7 +12980,7 @@ putop (const char *in_template, int sizeflag)
used_prefixes |= (prefixes & PREFIX_DATA); used_prefixes |= (prefixes & PREFIX_DATA);
break; break;
case 'V': case 'V':
if (l == 0 && len == 1) if (l == 0)
{ {
if (intel_syntax) if (intel_syntax)
break; break;
@ -13025,16 +12992,8 @@ putop (const char *in_template, int sizeflag)
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) if (rex & REX_W)
{ {
*obufp++ = 'a'; *obufp++ = 'a';
@ -13042,10 +13001,12 @@ putop (const char *in_template, int sizeflag)
*obufp++ = 's'; *obufp++ = 's';
} }
} }
else
abort ();
/* Fall through. */ /* Fall through. */
goto case_S; goto case_S;
case 'S': case 'S':
if (l == 0 && len == 1) if (l == 0)
{ {
case_S: case_S:
if (intel_syntax) 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 if (address_mode == mode_64bit
&& !(prefixes & PREFIX_ADDR)) && !(prefixes & PREFIX_ADDR))
{ {
@ -13084,13 +13037,12 @@ putop (const char *in_template, int sizeflag)
goto case_S; goto case_S;
} }
else
abort ();
break; break;
case 'X': case 'X':
if (l != 0 || len != 1) if (l != 0)
{ abort ();
SAVE_LAST (*p);
break;
}
if (need_vex if (need_vex
? vex.prefix == DATA_PREFIX_OPCODE ? vex.prefix == DATA_PREFIX_OPCODE
: prefixes & PREFIX_DATA) : prefixes & PREFIX_DATA)
@ -13102,15 +13054,8 @@ putop (const char *in_template, int sizeflag)
*obufp++ = 's'; *obufp++ = 's';
break; break;
case 'Y': case 'Y':
if (l == 0 && len == 1) if (l == 1 && last[0] == 'X')
abort ();
else
{ {
if (l != 1 || len != 2 || last[0] != 'X')
{
SAVE_LAST (*p);
break;
}
if (!need_vex) if (!need_vex)
abort (); abort ();
if (intel_syntax if (intel_syntax
@ -13130,9 +13075,11 @@ putop (const char *in_template, int sizeflag)
abort (); abort ();
} }
} }
else
abort ();
break; break;
case 'W': case 'W':
if (l == 0 && len == 1) if (l == 0)
{ {
/* operand size flag for cwtl, cbtw */ /* operand size flag for cwtl, cbtw */
USED_REX (REX_W); USED_REX (REX_W);
@ -13150,23 +13097,19 @@ putop (const char *in_template, int sizeflag)
if (!(rex & REX_W)) if (!(rex & REX_W))
used_prefixes |= (prefixes & PREFIX_DATA); 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) if (!need_vex)
abort (); abort ();
if (last[0] == 'X') if (last[0] == 'X')
*obufp++ = vex.w ? 'd': 's'; *obufp++ = vex.w ? 'd': 's';
else else if (last[0] == 'L')
*obufp++ = vex.w ? 'q': 'd'; *obufp++ = vex.w ? 'q': 'd';
else
abort ();
} }
else
abort ();
break; break;
case '^': case '^':
if (intel_syntax) if (intel_syntax)
@ -13201,6 +13144,9 @@ putop (const char *in_template, int sizeflag)
} }
break; break;
} }
if (len == l)
len = l = 0;
} }
*obufp = 0; *obufp = 0;
mnemonicendp = obufp; mnemonicendp = obufp;