mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-24 12:23:31 +08:00
x86-64: fix {,V}PCMPESTR{I,M} disassembly in Intel mode
The operands don't allow disambiguating the insn in 64-bit mode, and hence suffixes need to be emitted not just in AT&T mode. Achieve this by re-using %LQ while dropping PCMPESTR_Fixup().
This commit is contained in:
@ -1,3 +1,8 @@
|
|||||||
|
2020-07-14 Jan Beulich <jbeulich@suse.com>
|
||||||
|
|
||||||
|
* testsuite/gas/i386/x86-64-avx-intel.d,
|
||||||
|
testsuite/gas/i386/x86-64-sse4_2-intel.d: Adjust expectations.
|
||||||
|
|
||||||
2020-07-14 Jan Beulich <jbeulich@suse.com>
|
2020-07-14 Jan Beulich <jbeulich@suse.com>
|
||||||
|
|
||||||
* testsuite/gas/i386/movbe-suffix.d,
|
* testsuite/gas/i386/movbe-suffix.d,
|
||||||
|
@ -781,11 +781,11 @@ Disassembly of section .text:
|
|||||||
[ ]*[a-f0-9]+: c4 e3 79 df 31 07 vaeskeygenassist xmm6,XMMWORD PTR \[rcx\],0x7
|
[ ]*[a-f0-9]+: c4 e3 79 df 31 07 vaeskeygenassist xmm6,XMMWORD PTR \[rcx\],0x7
|
||||||
[ ]*[a-f0-9]+: c4 e3 79 61 f4 07 vpcmpestri xmm6,xmm4,0x7
|
[ ]*[a-f0-9]+: c4 e3 79 61 f4 07 vpcmpestri xmm6,xmm4,0x7
|
||||||
[ ]*[a-f0-9]+: c4 e3 79 61 31 07 vpcmpestri xmm6,XMMWORD PTR \[rcx\],0x7
|
[ ]*[a-f0-9]+: c4 e3 79 61 31 07 vpcmpestri xmm6,XMMWORD PTR \[rcx\],0x7
|
||||||
[ ]*[a-f0-9]+: c4 e3 f9 61 f4 07 vpcmpestri xmm6,xmm4,0x7
|
[ ]*[a-f0-9]+: c4 e3 f9 61 f4 07 vpcmpestriq xmm6,xmm4,0x7
|
||||||
[ ]*[a-f0-9]+: c4 e3 79 61 31 07 vpcmpestri xmm6,XMMWORD PTR \[rcx\],0x7
|
[ ]*[a-f0-9]+: c4 e3 79 61 31 07 vpcmpestri xmm6,XMMWORD PTR \[rcx\],0x7
|
||||||
[ ]*[a-f0-9]+: c4 e3 79 60 f4 07 vpcmpestrm xmm6,xmm4,0x7
|
[ ]*[a-f0-9]+: c4 e3 79 60 f4 07 vpcmpestrm xmm6,xmm4,0x7
|
||||||
[ ]*[a-f0-9]+: c4 e3 79 60 31 07 vpcmpestrm xmm6,XMMWORD PTR \[rcx\],0x7
|
[ ]*[a-f0-9]+: c4 e3 79 60 31 07 vpcmpestrm xmm6,XMMWORD PTR \[rcx\],0x7
|
||||||
[ ]*[a-f0-9]+: c4 e3 f9 60 f4 07 vpcmpestrm xmm6,xmm4,0x7
|
[ ]*[a-f0-9]+: c4 e3 f9 60 f4 07 vpcmpestrmq xmm6,xmm4,0x7
|
||||||
[ ]*[a-f0-9]+: c4 e3 79 60 31 07 vpcmpestrm xmm6,XMMWORD PTR \[rcx\],0x7
|
[ ]*[a-f0-9]+: c4 e3 79 60 31 07 vpcmpestrm xmm6,XMMWORD PTR \[rcx\],0x7
|
||||||
[ ]*[a-f0-9]+: c4 e3 79 63 f4 07 vpcmpistri xmm6,xmm4,0x7
|
[ ]*[a-f0-9]+: c4 e3 79 63 f4 07 vpcmpistri xmm6,xmm4,0x7
|
||||||
[ ]*[a-f0-9]+: c4 e3 79 63 31 07 vpcmpistri xmm6,XMMWORD PTR \[rcx\],0x7
|
[ ]*[a-f0-9]+: c4 e3 79 63 31 07 vpcmpistri xmm6,XMMWORD PTR \[rcx\],0x7
|
||||||
|
@ -25,11 +25,11 @@ Disassembly of section .text:
|
|||||||
[ ]*[a-f0-9]+: 66 0f 38 37 c1 pcmpgtq xmm0,xmm1
|
[ ]*[a-f0-9]+: 66 0f 38 37 c1 pcmpgtq xmm0,xmm1
|
||||||
[ ]*[a-f0-9]+: 66 0f 3a 61 01 00 pcmpestri xmm0,XMMWORD PTR \[rcx\],0x0
|
[ ]*[a-f0-9]+: 66 0f 3a 61 01 00 pcmpestri xmm0,XMMWORD PTR \[rcx\],0x0
|
||||||
[ ]*[a-f0-9]+: 66 0f 3a 61 c1 00 pcmpestri xmm0,xmm1,0x0
|
[ ]*[a-f0-9]+: 66 0f 3a 61 c1 00 pcmpestri xmm0,xmm1,0x0
|
||||||
[ ]*[a-f0-9]+: 66 48 0f 3a 61 01 00 rex\.W pcmpestri xmm0,XMMWORD PTR \[rcx\],0x0
|
[ ]*[a-f0-9]+: 66 48 0f 3a 61 01 00 pcmpestriq xmm0,XMMWORD PTR \[rcx\],0x0
|
||||||
[ ]*[a-f0-9]+: 66 0f 3a 61 c1 00 pcmpestri xmm0,xmm1,0x0
|
[ ]*[a-f0-9]+: 66 0f 3a 61 c1 00 pcmpestri xmm0,xmm1,0x0
|
||||||
[ ]*[a-f0-9]+: 66 0f 3a 60 01 01 pcmpestrm xmm0,XMMWORD PTR \[rcx\],0x1
|
[ ]*[a-f0-9]+: 66 0f 3a 60 01 01 pcmpestrm xmm0,XMMWORD PTR \[rcx\],0x1
|
||||||
[ ]*[a-f0-9]+: 66 0f 3a 60 c1 01 pcmpestrm xmm0,xmm1,0x1
|
[ ]*[a-f0-9]+: 66 0f 3a 60 c1 01 pcmpestrm xmm0,xmm1,0x1
|
||||||
[ ]*[a-f0-9]+: 66 48 0f 3a 60 01 01 rex\.W pcmpestrm xmm0,XMMWORD PTR \[rcx\],0x1
|
[ ]*[a-f0-9]+: 66 48 0f 3a 60 01 01 pcmpestrmq xmm0,XMMWORD PTR \[rcx\],0x1
|
||||||
[ ]*[a-f0-9]+: 66 0f 3a 60 c1 01 pcmpestrm xmm0,xmm1,0x1
|
[ ]*[a-f0-9]+: 66 0f 3a 60 c1 01 pcmpestrm xmm0,xmm1,0x1
|
||||||
[ ]*[a-f0-9]+: 66 0f 3a 63 01 02 pcmpistri xmm0,XMMWORD PTR \[rcx\],0x2
|
[ ]*[a-f0-9]+: 66 0f 3a 63 01 02 pcmpistri xmm0,XMMWORD PTR \[rcx\],0x2
|
||||||
[ ]*[a-f0-9]+: 66 0f 3a 63 c1 02 pcmpistri xmm0,xmm1,0x2
|
[ ]*[a-f0-9]+: 66 0f 3a 63 c1 02 pcmpistri xmm0,xmm1,0x2
|
||||||
|
@ -1,3 +1,17 @@
|
|||||||
|
2020-07-14 Jan Beulich <jbeulich@suse.com>
|
||||||
|
|
||||||
|
* i386-dis.c (PCMPESTR_Fixup): Delete.
|
||||||
|
(dis386): Adjust "LQ" description.
|
||||||
|
(prefix_table): Make %LQ apply to AT&T case only for cvtsi2ss,
|
||||||
|
cvtsi2sd, ptwrite, vcvtsi2ss, and vcvtsi2sd. Replace use of
|
||||||
|
PCMPESTR_Fixup by !%LQ and EXx for pcmpestrm, pcmpestri,
|
||||||
|
vpcmpestrm, and vpcmpestri.
|
||||||
|
(putop): Honor "cond" when handling LQ.
|
||||||
|
* i386-dis-evex-prefix.h: Make %LQ apply to AT&T case only for
|
||||||
|
vcvtsi2ss and vcvtusi2ss.
|
||||||
|
* i386-dis-evex-w.h: Make %LQ apply to AT&T case only for
|
||||||
|
vcvtsi2sd and vcvtusi2sd.
|
||||||
|
|
||||||
2020-07-14 Jan Beulich <jbeulich@suse.com>
|
2020-07-14 Jan Beulich <jbeulich@suse.com>
|
||||||
|
|
||||||
* i386-dis.c (VCMP_Fixup, VCMP): Delete.
|
* i386-dis.c (VCMP_Fixup, VCMP): Delete.
|
||||||
|
@ -28,7 +28,7 @@
|
|||||||
/* PREFIX_EVEX_0F2A */
|
/* PREFIX_EVEX_0F2A */
|
||||||
{
|
{
|
||||||
{ Bad_Opcode },
|
{ Bad_Opcode },
|
||||||
{ "vcvtsi2ss%LQ", { XMScalar, VexScalar, EXxEVexR, Edq }, 0 },
|
{ "vcvtsi2ss{%LQ|}", { XMScalar, VexScalar, EXxEVexR, Edq }, 0 },
|
||||||
{ Bad_Opcode },
|
{ Bad_Opcode },
|
||||||
{ VEX_W_TABLE (EVEX_W_0F2A_P_3) },
|
{ VEX_W_TABLE (EVEX_W_0F2A_P_3) },
|
||||||
},
|
},
|
||||||
@ -272,7 +272,7 @@
|
|||||||
/* PREFIX_EVEX_0F7B */
|
/* PREFIX_EVEX_0F7B */
|
||||||
{
|
{
|
||||||
{ Bad_Opcode },
|
{ Bad_Opcode },
|
||||||
{ "vcvtusi2ss%LQ", { XMScalar, VexScalar, EXxEVexR, Edq }, 0 },
|
{ "vcvtusi2ss{%LQ|}", { XMScalar, VexScalar, EXxEVexR, Edq }, 0 },
|
||||||
{ VEX_W_TABLE (EVEX_W_0F7B_P_2) },
|
{ VEX_W_TABLE (EVEX_W_0F7B_P_2) },
|
||||||
{ VEX_W_TABLE (EVEX_W_0F7B_P_3) },
|
{ VEX_W_TABLE (EVEX_W_0F7B_P_3) },
|
||||||
},
|
},
|
||||||
|
@ -39,8 +39,8 @@
|
|||||||
},
|
},
|
||||||
/* EVEX_W_0F2A_P_3 */
|
/* EVEX_W_0F2A_P_3 */
|
||||||
{
|
{
|
||||||
{ "vcvtsi2sd%LQ", { XMScalar, VexScalar, Ed }, 0 },
|
{ "vcvtsi2sd{%LQ|}", { XMScalar, VexScalar, Ed }, 0 },
|
||||||
{ "vcvtsi2sd%LQ", { XMScalar, VexScalar, EXxEVexR64, Edq }, 0 },
|
{ "vcvtsi2sd{%LQ|}", { XMScalar, VexScalar, EXxEVexR64, Edq }, 0 },
|
||||||
},
|
},
|
||||||
/* EVEX_W_0F51_P_1 */
|
/* EVEX_W_0F51_P_1 */
|
||||||
{
|
{
|
||||||
@ -245,8 +245,8 @@
|
|||||||
},
|
},
|
||||||
/* EVEX_W_0F7B_P_3 */
|
/* EVEX_W_0F7B_P_3 */
|
||||||
{
|
{
|
||||||
{ "vcvtusi2sd%LQ", { XMScalar, VexScalar, Ed }, 0 },
|
{ "vcvtusi2sd{%LQ|}", { XMScalar, VexScalar, Ed }, 0 },
|
||||||
{ "vcvtusi2sd%LQ", { XMScalar, VexScalar, EXxEVexR64, Edq }, 0 },
|
{ "vcvtusi2sd{%LQ|}", { XMScalar, VexScalar, EXxEVexR64, Edq }, 0 },
|
||||||
},
|
},
|
||||||
/* EVEX_W_0F7E_P_1 */
|
/* EVEX_W_0F7E_P_1 */
|
||||||
{
|
{
|
||||||
|
@ -115,7 +115,6 @@ static void HLE_Fixup3 (int, int);
|
|||||||
static void CMPXCHG8B_Fixup (int, int);
|
static void CMPXCHG8B_Fixup (int, int);
|
||||||
static void XMM_Fixup (int, int);
|
static void XMM_Fixup (int, int);
|
||||||
static void FXSAVE_Fixup (int, int);
|
static void FXSAVE_Fixup (int, int);
|
||||||
static void PCMPESTR_Fixup (int, int);
|
|
||||||
|
|
||||||
static void MOVSXD_Fixup (int, int);
|
static void MOVSXD_Fixup (int, int);
|
||||||
|
|
||||||
@ -2287,8 +2286,8 @@ struct dis386 {
|
|||||||
"XZ" => print 'x', 'y', or 'z' if suffix_always is true or no
|
"XZ" => print 'x', 'y', or 'z' if suffix_always is true or no
|
||||||
register operands and no broadcast.
|
register operands and no broadcast.
|
||||||
"XW" => print 's', 'd' depending on the VEX.W bit (for FMA)
|
"XW" => print 's', 'd' depending on the VEX.W bit (for FMA)
|
||||||
"LQ" => print 'l' ('d' in Intel mode) or 'q' for memory
|
"LQ" => print 'l' ('d' in Intel mode) or 'q' for memory operand, cond
|
||||||
operand or no operand at all in 64bit mode, or if suffix_always
|
being false, or no operand at all in 64bit mode, or if suffix_always
|
||||||
is true.
|
is true.
|
||||||
"LB" => print "abs" in 64bit mode and behave as 'B' otherwise
|
"LB" => print "abs" in 64bit mode and behave as 'B' otherwise
|
||||||
"LS" => print "abs" in 64bit mode and behave as 'S' otherwise
|
"LS" => print "abs" in 64bit mode and behave as 'S' otherwise
|
||||||
@ -3703,9 +3702,9 @@ static const struct dis386 prefix_table[][4] = {
|
|||||||
/* PREFIX_0F2A */
|
/* PREFIX_0F2A */
|
||||||
{
|
{
|
||||||
{ "cvtpi2ps", { XM, EMCq }, PREFIX_OPCODE },
|
{ "cvtpi2ps", { XM, EMCq }, PREFIX_OPCODE },
|
||||||
{ "cvtsi2ss%LQ", { XM, Edq }, PREFIX_OPCODE },
|
{ "cvtsi2ss{%LQ|}", { XM, Edq }, PREFIX_OPCODE },
|
||||||
{ "cvtpi2pd", { XM, EMCq }, PREFIX_OPCODE },
|
{ "cvtpi2pd", { XM, EMCq }, PREFIX_OPCODE },
|
||||||
{ "cvtsi2sd%LQ", { XM, Edq }, 0 },
|
{ "cvtsi2sd{%LQ|}", { XM, Edq }, 0 },
|
||||||
},
|
},
|
||||||
|
|
||||||
/* PREFIX_0F2B */
|
/* PREFIX_0F2B */
|
||||||
@ -3966,13 +3965,13 @@ static const struct dis386 prefix_table[][4] = {
|
|||||||
/* PREFIX_0FAE_REG_4_MOD_0 */
|
/* PREFIX_0FAE_REG_4_MOD_0 */
|
||||||
{
|
{
|
||||||
{ "xsave", { FXSAVE }, 0 },
|
{ "xsave", { FXSAVE }, 0 },
|
||||||
{ "ptwrite%LQ", { Edq }, 0 },
|
{ "ptwrite{%LQ|}", { Edq }, 0 },
|
||||||
},
|
},
|
||||||
|
|
||||||
/* PREFIX_0FAE_REG_4_MOD_3 */
|
/* PREFIX_0FAE_REG_4_MOD_3 */
|
||||||
{
|
{
|
||||||
{ Bad_Opcode },
|
{ Bad_Opcode },
|
||||||
{ "ptwrite%LQ", { Edq }, 0 },
|
{ "ptwrite{%LQ|}", { Edq }, 0 },
|
||||||
},
|
},
|
||||||
|
|
||||||
/* PREFIX_0FAE_REG_5_MOD_0 */
|
/* PREFIX_0FAE_REG_5_MOD_0 */
|
||||||
@ -4592,14 +4591,14 @@ static const struct dis386 prefix_table[][4] = {
|
|||||||
{
|
{
|
||||||
{ Bad_Opcode },
|
{ Bad_Opcode },
|
||||||
{ Bad_Opcode },
|
{ Bad_Opcode },
|
||||||
{ "pcmpestrm", { XM, { PCMPESTR_Fixup, x_mode }, Ib }, PREFIX_OPCODE },
|
{ "pcmpestrm!%LQ", { XM, EXx, Ib }, PREFIX_OPCODE },
|
||||||
},
|
},
|
||||||
|
|
||||||
/* PREFIX_0F3A61 */
|
/* PREFIX_0F3A61 */
|
||||||
{
|
{
|
||||||
{ Bad_Opcode },
|
{ Bad_Opcode },
|
||||||
{ Bad_Opcode },
|
{ Bad_Opcode },
|
||||||
{ "pcmpestri", { XM, { PCMPESTR_Fixup, x_mode }, Ib }, PREFIX_OPCODE },
|
{ "pcmpestri!%LQ", { XM, EXx, Ib }, PREFIX_OPCODE },
|
||||||
},
|
},
|
||||||
|
|
||||||
/* PREFIX_0F3A62 */
|
/* PREFIX_0F3A62 */
|
||||||
@ -4676,9 +4675,9 @@ static const struct dis386 prefix_table[][4] = {
|
|||||||
/* PREFIX_VEX_0F2A */
|
/* PREFIX_VEX_0F2A */
|
||||||
{
|
{
|
||||||
{ Bad_Opcode },
|
{ Bad_Opcode },
|
||||||
{ "vcvtsi2ss%LQ", { XMScalar, VexScalar, Edq }, 0 },
|
{ "vcvtsi2ss{%LQ|}", { XMScalar, VexScalar, Edq }, 0 },
|
||||||
{ Bad_Opcode },
|
{ Bad_Opcode },
|
||||||
{ "vcvtsi2sd%LQ", { XMScalar, VexScalar, Edq }, 0 },
|
{ "vcvtsi2sd{%LQ|}", { XMScalar, VexScalar, Edq }, 0 },
|
||||||
},
|
},
|
||||||
|
|
||||||
/* PREFIX_VEX_0F2C */
|
/* PREFIX_VEX_0F2C */
|
||||||
@ -9847,12 +9846,12 @@ static const struct dis386 vex_len_table[][2] = {
|
|||||||
|
|
||||||
/* VEX_LEN_0F3A60_P_2 */
|
/* VEX_LEN_0F3A60_P_2 */
|
||||||
{
|
{
|
||||||
{ "vpcmpestrm", { XM, { PCMPESTR_Fixup, x_mode }, Ib }, 0 },
|
{ "vpcmpestrm!%LQ", { XM, EXx, Ib }, 0 },
|
||||||
},
|
},
|
||||||
|
|
||||||
/* VEX_LEN_0F3A61_P_2 */
|
/* VEX_LEN_0F3A61_P_2 */
|
||||||
{
|
{
|
||||||
{ "vpcmpestri", { XM, { PCMPESTR_Fixup, x_mode }, Ib }, 0 },
|
{ "vpcmpestri!%LQ", { XM, EXx, Ib }, 0 },
|
||||||
},
|
},
|
||||||
|
|
||||||
/* VEX_LEN_0F3A62_P_2 */
|
/* VEX_LEN_0F3A62_P_2 */
|
||||||
@ -13644,15 +13643,15 @@ putop (const char *in_template, int sizeflag)
|
|||||||
}
|
}
|
||||||
else if (l == 1 && last[0] == 'L')
|
else if (l == 1 && last[0] == 'L')
|
||||||
{
|
{
|
||||||
if ((intel_syntax && need_modrm)
|
if (cond ? modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)
|
||||||
|| (modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)))
|
: address_mode != mode_64bit)
|
||||||
break;
|
break;
|
||||||
if ((rex & REX_W))
|
if ((rex & REX_W))
|
||||||
{
|
{
|
||||||
USED_REX (REX_W);
|
USED_REX (REX_W);
|
||||||
*obufp++ = 'q';
|
*obufp++ = 'q';
|
||||||
}
|
}
|
||||||
else if((address_mode == mode_64bit && need_modrm)
|
else if((address_mode == mode_64bit && need_modrm && cond)
|
||||||
|| (sizeflag & SUFFIX_ALWAYS))
|
|| (sizeflag & SUFFIX_ALWAYS))
|
||||||
*obufp++ = intel_syntax? 'd' : 'l';
|
*obufp++ = intel_syntax? 'd' : 'l';
|
||||||
}
|
}
|
||||||
@ -16422,27 +16421,6 @@ FXSAVE_Fixup (int bytemode, int sizeflag)
|
|||||||
OP_M (bytemode, sizeflag);
|
OP_M (bytemode, sizeflag);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
PCMPESTR_Fixup (int bytemode, int sizeflag)
|
|
||||||
{
|
|
||||||
/* Add proper suffix to "{,v}pcmpestr{i,m}". */
|
|
||||||
if (!intel_syntax)
|
|
||||||
{
|
|
||||||
char *p = mnemonicendp;
|
|
||||||
|
|
||||||
USED_REX (REX_W);
|
|
||||||
if (rex & REX_W)
|
|
||||||
*p++ = 'q';
|
|
||||||
else if (sizeflag & SUFFIX_ALWAYS)
|
|
||||||
*p++ = 'l';
|
|
||||||
|
|
||||||
*p = '\0';
|
|
||||||
mnemonicendp = p;
|
|
||||||
}
|
|
||||||
|
|
||||||
OP_EX (bytemode, sizeflag);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Display the destination register operand for instructions with
|
/* Display the destination register operand for instructions with
|
||||||
VEX. */
|
VEX. */
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user