mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-27 06:17:47 +08:00
x86: correct decoding of packed-FP-only AVX encodings
Various AVX insns utilizing the X macro fail to reject F3/F2 embedded prefix encodings. As the PREFIX_OPCODE attribute wasn't used by any non-legacy-encoded insns so far, re-use it to achieve the intended effect.
This commit is contained in:
@ -1,3 +1,9 @@
|
|||||||
|
2020-06-09 Jan Beulich <jbeulich@suse.com>
|
||||||
|
|
||||||
|
* testsuite/gas/i386/prefix.s: Add bogus REP / EVEX.W prefix
|
||||||
|
with VEX/EVEX encoding tests.
|
||||||
|
* testsuite/gas/i386/prefix.d: Adjust expectations.
|
||||||
|
|
||||||
2020-06-09 Jan Beulich <jbeulich@suse.com>
|
2020-06-09 Jan Beulich <jbeulich@suse.com>
|
||||||
|
|
||||||
* config/tc-i386.c (process_suffix): Restrict defaulting to 'q'
|
* config/tc-i386.c (process_suffix): Restrict defaulting to 'q'
|
||||||
|
@ -72,6 +72,20 @@ Disassembly of section .text:
|
|||||||
[ ]*[a-f0-9]+: 90 nop
|
[ ]*[a-f0-9]+: 90 nop
|
||||||
[ ]*[a-f0-9]+: f2 0f c7 \(bad\)
|
[ ]*[a-f0-9]+: f2 0f c7 \(bad\)
|
||||||
[ ]*[a-f0-9]+: f0 90 lock nop
|
[ ]*[a-f0-9]+: f0 90 lock nop
|
||||||
|
[ ]*[a-f0-9]+: f3 0f 28 repz \(bad\) *
|
||||||
|
[ ]*[a-f0-9]+: ff cc dec %esp
|
||||||
|
[ ]*[a-f0-9]+: c5 fa 28 \(bad\) *
|
||||||
|
[ ]*[a-f0-9]+: ff cc dec %esp
|
||||||
|
[ ]*[a-f0-9]+: c4 e1 7b 28 \(bad\) *
|
||||||
|
[ ]*[a-f0-9]+: ff cc dec %esp
|
||||||
|
[ ]*[a-f0-9]+: 62 f1 fc 08 28 \(bad\) *
|
||||||
|
[ ]*[a-f0-9]+: ff cc dec %esp
|
||||||
|
[ ]*[a-f0-9]+: 62 f1 7e 08 28 \(bad\) *
|
||||||
|
[ ]*[a-f0-9]+: ff cc dec %esp
|
||||||
|
[ ]*[a-f0-9]+: 62 f1 7d 08 28 \(bad\) *
|
||||||
|
[ ]*[a-f0-9]+: ff cc dec %esp
|
||||||
|
[ ]*[a-f0-9]+: 62 f1 ff 08 28 \(bad\) *
|
||||||
|
[ ]*[a-f0-9]+: ff cc dec %esp
|
||||||
[ ]*[a-f0-9]+: c5 fb e6 40 20 vcvtpd2dqx 0x20\(%eax\),%xmm0
|
[ ]*[a-f0-9]+: c5 fb e6 40 20 vcvtpd2dqx 0x20\(%eax\),%xmm0
|
||||||
[ ]*[a-f0-9]+: 62 f1 ff 18 e6 40 04 vcvtpd2dq 0x20\(%eax\)\{1to2\},%xmm0
|
[ ]*[a-f0-9]+: 62 f1 ff 18 e6 40 04 vcvtpd2dq 0x20\(%eax\)\{1to2\},%xmm0
|
||||||
[ ]*[a-f0-9]+: c5 fb e6 40 20 vcvtpd2dqx 0x20\(%eax\),%xmm0
|
[ ]*[a-f0-9]+: c5 fb e6 40 20 vcvtpd2dqx 0x20\(%eax\),%xmm0
|
||||||
|
@ -391,6 +391,66 @@
|
|||||||
|
|
||||||
nop
|
nop
|
||||||
|
|
||||||
|
repz; movaps %xmm7, %xmm7
|
||||||
|
int $3
|
||||||
|
|
||||||
|
# "repz" vmovaps %xmm7, %xmm7
|
||||||
|
.byte 0xc5
|
||||||
|
.byte 0xfa
|
||||||
|
.byte 0x28
|
||||||
|
.byte 0xff
|
||||||
|
|
||||||
|
int $3
|
||||||
|
|
||||||
|
# "repnz" {vex3} vmovaps %xmm7, %xmm7
|
||||||
|
.byte 0xc4
|
||||||
|
.byte 0xe1
|
||||||
|
.byte 0x7b
|
||||||
|
.byte 0x28
|
||||||
|
.byte 0xff
|
||||||
|
|
||||||
|
int $3
|
||||||
|
|
||||||
|
# "EVEX.W1" vmovaps %xmm7, %xmm7
|
||||||
|
.byte 0x62
|
||||||
|
.byte 0xf1
|
||||||
|
.byte 0xfc
|
||||||
|
.byte 0x08
|
||||||
|
.byte 0x28
|
||||||
|
.byte 0xff
|
||||||
|
|
||||||
|
int $3
|
||||||
|
|
||||||
|
# "repz" vmovaps %xmm7, %xmm7
|
||||||
|
.byte 0x62
|
||||||
|
.byte 0xf1
|
||||||
|
.byte 0x7e
|
||||||
|
.byte 0x08
|
||||||
|
.byte 0x28
|
||||||
|
.byte 0xff
|
||||||
|
|
||||||
|
int $3
|
||||||
|
|
||||||
|
# "EVEX.W0" vmovapd %xmm7, %xmm7
|
||||||
|
.byte 0x62
|
||||||
|
.byte 0xf1
|
||||||
|
.byte 0x7d
|
||||||
|
.byte 0x08
|
||||||
|
.byte 0x28
|
||||||
|
.byte 0xff
|
||||||
|
|
||||||
|
int $3
|
||||||
|
|
||||||
|
# "repnz" vmovapd %xmm7, %xmm7
|
||||||
|
.byte 0x62
|
||||||
|
.byte 0xf1
|
||||||
|
.byte 0xff
|
||||||
|
.byte 0x08
|
||||||
|
.byte 0x28
|
||||||
|
.byte 0xff
|
||||||
|
|
||||||
|
int $3
|
||||||
|
|
||||||
vcvtpd2dqx 0x20(%eax),%xmm0
|
vcvtpd2dqx 0x20(%eax),%xmm0
|
||||||
vcvtpd2dq 0x20(%eax){1to2},%xmm0
|
vcvtpd2dq 0x20(%eax){1to2},%xmm0
|
||||||
vcvtpd2dqx 0x20(%eax),%xmm0
|
vcvtpd2dqx 0x20(%eax),%xmm0
|
||||||
|
@ -1,3 +1,13 @@
|
|||||||
|
2020-06-09 Jan Beulich <jbeulich@suse.com>
|
||||||
|
|
||||||
|
* i386-dis.c (vex_table): Use PREFIX_OPCODE for vunpcklpX,
|
||||||
|
vunpckhpX, vmovapX, vandpX, vandnpX, vorpX, vxorpX and vshufpX.
|
||||||
|
(vex_len_table) : Likewise for vmovlpX, vmovhpX, vmovntpX, and
|
||||||
|
vmovmskpX.
|
||||||
|
(print_insn): Drop pointless check against bad_opcode. Split
|
||||||
|
prefix validation into legacy and VEX-and-alike parts.
|
||||||
|
(putop): Re-work 'X' macro handling.
|
||||||
|
|
||||||
2020-06-09 Jan Beulich <jbeulich@suse.com>
|
2020-06-09 Jan Beulich <jbeulich@suse.com>
|
||||||
|
|
||||||
* i386-dis.c (MOD_0F51): Rename to ...
|
* i386-dis.c (MOD_0F51): Rename to ...
|
||||||
|
@ -8485,8 +8485,8 @@ static const struct dis386 vex_table[][256] = {
|
|||||||
{ PREFIX_TABLE (PREFIX_VEX_0F11) },
|
{ PREFIX_TABLE (PREFIX_VEX_0F11) },
|
||||||
{ PREFIX_TABLE (PREFIX_VEX_0F12) },
|
{ PREFIX_TABLE (PREFIX_VEX_0F12) },
|
||||||
{ MOD_TABLE (MOD_VEX_0F13) },
|
{ MOD_TABLE (MOD_VEX_0F13) },
|
||||||
{ "vunpcklpX", { XM, Vex, EXx }, 0 },
|
{ "vunpcklpX", { XM, Vex, EXx }, PREFIX_OPCODE },
|
||||||
{ "vunpckhpX", { XM, Vex, EXx }, 0 },
|
{ "vunpckhpX", { XM, Vex, EXx }, PREFIX_OPCODE },
|
||||||
{ PREFIX_TABLE (PREFIX_VEX_0F16) },
|
{ PREFIX_TABLE (PREFIX_VEX_0F16) },
|
||||||
{ MOD_TABLE (MOD_VEX_0F17) },
|
{ MOD_TABLE (MOD_VEX_0F17) },
|
||||||
/* 18 */
|
/* 18 */
|
||||||
@ -8508,8 +8508,8 @@ static const struct dis386 vex_table[][256] = {
|
|||||||
{ Bad_Opcode },
|
{ Bad_Opcode },
|
||||||
{ Bad_Opcode },
|
{ Bad_Opcode },
|
||||||
/* 28 */
|
/* 28 */
|
||||||
{ "vmovapX", { XM, EXx }, 0 },
|
{ "vmovapX", { XM, EXx }, PREFIX_OPCODE },
|
||||||
{ "vmovapX", { EXxS, XM }, 0 },
|
{ "vmovapX", { EXxS, XM }, PREFIX_OPCODE },
|
||||||
{ PREFIX_TABLE (PREFIX_VEX_0F2A) },
|
{ PREFIX_TABLE (PREFIX_VEX_0F2A) },
|
||||||
{ MOD_TABLE (MOD_VEX_0F2B) },
|
{ MOD_TABLE (MOD_VEX_0F2B) },
|
||||||
{ PREFIX_TABLE (PREFIX_VEX_0F2C) },
|
{ PREFIX_TABLE (PREFIX_VEX_0F2C) },
|
||||||
@ -8557,10 +8557,10 @@ static const struct dis386 vex_table[][256] = {
|
|||||||
{ PREFIX_TABLE (PREFIX_VEX_0F51) },
|
{ PREFIX_TABLE (PREFIX_VEX_0F51) },
|
||||||
{ PREFIX_TABLE (PREFIX_VEX_0F52) },
|
{ PREFIX_TABLE (PREFIX_VEX_0F52) },
|
||||||
{ PREFIX_TABLE (PREFIX_VEX_0F53) },
|
{ PREFIX_TABLE (PREFIX_VEX_0F53) },
|
||||||
{ "vandpX", { XM, Vex, EXx }, 0 },
|
{ "vandpX", { XM, Vex, EXx }, PREFIX_OPCODE },
|
||||||
{ "vandnpX", { XM, Vex, EXx }, 0 },
|
{ "vandnpX", { XM, Vex, EXx }, PREFIX_OPCODE },
|
||||||
{ "vorpX", { XM, Vex, EXx }, 0 },
|
{ "vorpX", { XM, Vex, EXx }, PREFIX_OPCODE },
|
||||||
{ "vxorpX", { XM, Vex, EXx }, 0 },
|
{ "vxorpX", { XM, Vex, EXx }, PREFIX_OPCODE },
|
||||||
/* 58 */
|
/* 58 */
|
||||||
{ PREFIX_TABLE (PREFIX_VEX_0F58) },
|
{ PREFIX_TABLE (PREFIX_VEX_0F58) },
|
||||||
{ PREFIX_TABLE (PREFIX_VEX_0F59) },
|
{ PREFIX_TABLE (PREFIX_VEX_0F59) },
|
||||||
@ -8685,7 +8685,7 @@ static const struct dis386 vex_table[][256] = {
|
|||||||
{ Bad_Opcode },
|
{ Bad_Opcode },
|
||||||
{ PREFIX_TABLE (PREFIX_VEX_0FC4) },
|
{ PREFIX_TABLE (PREFIX_VEX_0FC4) },
|
||||||
{ PREFIX_TABLE (PREFIX_VEX_0FC5) },
|
{ PREFIX_TABLE (PREFIX_VEX_0FC5) },
|
||||||
{ "vshufpX", { XM, Vex, EXx, Ib }, 0 },
|
{ "vshufpX", { XM, Vex, EXx, Ib }, PREFIX_OPCODE },
|
||||||
{ Bad_Opcode },
|
{ Bad_Opcode },
|
||||||
/* c8 */
|
/* c8 */
|
||||||
{ Bad_Opcode },
|
{ Bad_Opcode },
|
||||||
@ -9355,7 +9355,7 @@ static const struct dis386 vex_len_table[][2] = {
|
|||||||
|
|
||||||
/* VEX_LEN_0F13_M_0 */
|
/* VEX_LEN_0F13_M_0 */
|
||||||
{
|
{
|
||||||
{ "vmovlpX", { EXq, XM }, 0 },
|
{ "vmovlpX", { EXq, XM }, PREFIX_OPCODE },
|
||||||
},
|
},
|
||||||
|
|
||||||
/* VEX_LEN_0F16_P_0_M_0 */
|
/* VEX_LEN_0F16_P_0_M_0 */
|
||||||
@ -9375,7 +9375,7 @@ static const struct dis386 vex_len_table[][2] = {
|
|||||||
|
|
||||||
/* VEX_LEN_0F17_M_0 */
|
/* VEX_LEN_0F17_M_0 */
|
||||||
{
|
{
|
||||||
{ "vmovhpX", { EXq, XM }, 0 },
|
{ "vmovhpX", { EXq, XM }, PREFIX_OPCODE },
|
||||||
},
|
},
|
||||||
|
|
||||||
/* VEX_LEN_0F41_P_0 */
|
/* VEX_LEN_0F41_P_0 */
|
||||||
@ -10592,7 +10592,7 @@ static const struct dis386 mod_table[][2] = {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
/* MOD_VEX_0F2B */
|
/* MOD_VEX_0F2B */
|
||||||
{ "vmovntpX", { Mx, XM }, 0 },
|
{ "vmovntpX", { Mx, XM }, PREFIX_OPCODE },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
/* MOD_VEX_W_0_0F41_P_0_LEN_1 */
|
/* MOD_VEX_W_0_0F41_P_0_LEN_1 */
|
||||||
@ -10752,7 +10752,7 @@ static const struct dis386 mod_table[][2] = {
|
|||||||
{
|
{
|
||||||
/* MOD_VEX_0F50 */
|
/* MOD_VEX_0F50 */
|
||||||
{ Bad_Opcode },
|
{ Bad_Opcode },
|
||||||
{ "vmovmskpX", { Gdq, XS }, 0 },
|
{ "vmovmskpX", { Gdq, XS }, PREFIX_OPCODE },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
/* MOD_VEX_0F71_REG_2 */
|
/* MOD_VEX_0F71_REG_2 */
|
||||||
@ -12266,14 +12266,18 @@ print_insn (bfd_vma pc, disassemble_info *info)
|
|||||||
PREFIX_REPZ/PREFIX_REPNZ fix, we check the PREFIX_DATA prefix
|
PREFIX_REPZ/PREFIX_REPNZ fix, we check the PREFIX_DATA prefix
|
||||||
separately. */
|
separately. */
|
||||||
if (dp->prefix_requirement == PREFIX_OPCODE
|
if (dp->prefix_requirement == PREFIX_OPCODE
|
||||||
&& dp != &bad_opcode
|
&& (((need_vex
|
||||||
&& (((prefixes
|
? vex.prefix == REPE_PREFIX_OPCODE
|
||||||
& (PREFIX_REPZ | PREFIX_REPNZ)) != 0
|
|| vex.prefix == REPNE_PREFIX_OPCODE
|
||||||
|
: (prefixes
|
||||||
|
& (PREFIX_REPZ | PREFIX_REPNZ)) != 0)
|
||||||
&& (used_prefixes
|
&& (used_prefixes
|
||||||
& (PREFIX_REPZ | PREFIX_REPNZ)) == 0)
|
& (PREFIX_REPZ | PREFIX_REPNZ)) == 0)
|
||||||
|| ((((prefixes
|
|| (((need_vex
|
||||||
|
? vex.prefix == DATA_PREFIX_OPCODE
|
||||||
|
: ((prefixes
|
||||||
& (PREFIX_REPZ | PREFIX_REPNZ | PREFIX_DATA))
|
& (PREFIX_REPZ | PREFIX_REPNZ | PREFIX_DATA))
|
||||||
== PREFIX_DATA)
|
== PREFIX_DATA))
|
||||||
&& (used_prefixes & PREFIX_DATA) == 0))))
|
&& (used_prefixes & PREFIX_DATA) == 0))))
|
||||||
{
|
{
|
||||||
(*info->fprintf_func) (info->stream, "(bad)");
|
(*info->fprintf_func) (info->stream, "(bad)");
|
||||||
@ -13230,21 +13234,15 @@ putop (const char *in_template, int sizeflag)
|
|||||||
SAVE_LAST (*p);
|
SAVE_LAST (*p);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (need_vex && vex.prefix)
|
if (need_vex
|
||||||
|
? vex.prefix == DATA_PREFIX_OPCODE
|
||||||
|
: prefixes & PREFIX_DATA)
|
||||||
{
|
{
|
||||||
if (vex.prefix == DATA_PREFIX_OPCODE)
|
|
||||||
*obufp++ = 'd';
|
*obufp++ = 'd';
|
||||||
else
|
used_prefixes |= PREFIX_DATA;
|
||||||
*obufp++ = 's';
|
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
if (prefixes & PREFIX_DATA)
|
|
||||||
*obufp++ = 'd';
|
|
||||||
else
|
else
|
||||||
*obufp++ = 's';
|
*obufp++ = 's';
|
||||||
used_prefixes |= (prefixes & PREFIX_DATA);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case 'Y':
|
case 'Y':
|
||||||
if (l == 0 && len == 1)
|
if (l == 0 && len == 1)
|
||||||
|
Reference in New Issue
Block a user