mirror of
https://github.com/bminor/binutils-gdb.git
synced 2025-11-16 12:34:43 +00:00
For several instructions including vps{l,r}l{d,q,w,dq} and vpsra{d,w},
their VEX part do not have the following version:
vpsrlw $0x1f,(%r15,%rcx,4),%xmm0
Thus, {evex} prefix should not be inserted when their second operand is
memory, while we still need them for register as second operand. Add a
new macro %ME to solve this problem.
For vpsraq, there is no VEX version, so the {evex} prefix should always
be eliminated.
gas/ChangeLog:
PR binutils/32403
* testsuite/gas/i386/i386.exp: Run new test.
* testsuite/gas/i386/x86-64.exp: Ditto.
* testsuite/gas/i386/evex-only.d: New test.
* testsuite/gas/i386/evex-only.s: Ditto.
* testsuite/gas/i386/x86-64-evex-only.d: Ditto.
* testsuite/gas/i386/x86-64-evex-only.s: Ditto.
opcodes/ChangeLog:
PR binutils/32403
* i386-dis-evex-reg.h: Use %ME instead of %XE for vps{l,r}l{w,dq}
and vpsraw. Split table for vpsra{d,q}.
* i386-dis-evex-w.h: Use %ME instead of %XE for vps{l,r}l{d,q}
and vpsrad. Eliminate vpsraq {evex} prefix.
* i386-dis-evex.h: Split table for vpsra{d,q}.
* i386-dis.c: (EVEX_W_0F72_R_4): New.
(EVEX_W_0FE2): Ditto.
(struct dis386): Add comment for %ME.
(putop): Handle %ME.
Co-authored-by: Haochen Jiang <haochen.jiang@intel.com>
Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
126 lines
4.1 KiB
C
126 lines
4.1 KiB
C
/* REG_EVEX_0F71 */
|
|
{
|
|
{ Bad_Opcode },
|
|
{ Bad_Opcode },
|
|
{ "%MEvpsrlw", { Vex, EXx, Ib }, PREFIX_DATA },
|
|
{ Bad_Opcode },
|
|
{ "%MEvpsraw", { Vex, EXx, Ib }, PREFIX_DATA },
|
|
{ Bad_Opcode },
|
|
{ "%MEvpsllw", { Vex, EXx, Ib }, PREFIX_DATA },
|
|
},
|
|
/* REG_EVEX_0F72 */
|
|
{
|
|
{ "vpror%DQ", { Vex, EXx, Ib }, PREFIX_DATA },
|
|
{ "vprol%DQ", { Vex, EXx, Ib }, PREFIX_DATA },
|
|
{ VEX_W_TABLE (EVEX_W_0F72_R_2) },
|
|
{ Bad_Opcode },
|
|
{ VEX_W_TABLE (EVEX_W_0F72_R_4) },
|
|
{ Bad_Opcode },
|
|
{ VEX_W_TABLE (EVEX_W_0F72_R_6) },
|
|
},
|
|
/* REG_EVEX_0F73 */
|
|
{
|
|
{ Bad_Opcode },
|
|
{ Bad_Opcode },
|
|
{ VEX_W_TABLE (EVEX_W_0F73_R_2) },
|
|
{ "%MEvpsrldqY", { Vex, EXx, Ib }, PREFIX_DATA },
|
|
{ Bad_Opcode },
|
|
{ Bad_Opcode },
|
|
{ VEX_W_TABLE (EVEX_W_0F73_R_6) },
|
|
{ "%MEvpslldqY", { Vex, EXx, Ib }, PREFIX_DATA },
|
|
},
|
|
/* REG_EVEX_0F38C6_L_2 */
|
|
{
|
|
{ Bad_Opcode },
|
|
{ "vgatherpf0dp%XW", { MVexVSIBDWpX }, PREFIX_DATA },
|
|
{ "vgatherpf1dp%XW", { MVexVSIBDWpX }, PREFIX_DATA },
|
|
{ Bad_Opcode },
|
|
{ Bad_Opcode },
|
|
{ "vscatterpf0dp%XW", { MVexVSIBDWpX }, PREFIX_DATA },
|
|
{ "vscatterpf1dp%XW", { MVexVSIBDWpX }, PREFIX_DATA },
|
|
},
|
|
/* REG_EVEX_0F38C7_L_2 */
|
|
{
|
|
{ Bad_Opcode },
|
|
{ "vgatherpf0qp%XW", { MVexVSIBQWpX }, PREFIX_DATA },
|
|
{ "vgatherpf1qp%XW", { MVexVSIBQWpX }, PREFIX_DATA },
|
|
{ Bad_Opcode },
|
|
{ Bad_Opcode },
|
|
{ "vscatterpf0qp%XW", { MVexVSIBQWpX }, PREFIX_DATA },
|
|
{ "vscatterpf1qp%XW", { MVexVSIBQWpX }, PREFIX_DATA },
|
|
},
|
|
/* REG_EVEX_MAP4_80 */
|
|
{
|
|
{ "%NFaddA", { VexGb, Eb, Ib }, NO_PREFIX },
|
|
{ "%NForA", { VexGb, Eb, Ib }, NO_PREFIX },
|
|
{ "adcA", { VexGb, Eb, Ib }, NO_PREFIX },
|
|
{ "sbbA", { VexGb, Eb, Ib }, NO_PREFIX },
|
|
{ "%NFandA", { VexGb, Eb, Ib }, NO_PREFIX },
|
|
{ "%NFsubA", { VexGb, Eb, Ib }, NO_PREFIX },
|
|
{ "%NFxorA", { VexGb, Eb, Ib }, NO_PREFIX },
|
|
{ "%NEccmp%SCA%DF", { Eb, Ib }, NO_PREFIX },
|
|
},
|
|
/* REG_EVEX_MAP4_81 */
|
|
{
|
|
{ "%NFaddQ", { VexGv, Ev, Iv }, PREFIX_NP_OR_DATA },
|
|
{ "%NForQ", { VexGv, Ev, Iv }, PREFIX_NP_OR_DATA },
|
|
{ "adcQ", { VexGv, Ev, Iv }, PREFIX_NP_OR_DATA },
|
|
{ "sbbQ", { VexGv, Ev, Iv }, PREFIX_NP_OR_DATA },
|
|
{ "%NFandQ", { VexGv, Ev, Iv }, PREFIX_NP_OR_DATA },
|
|
{ "%NFsubQ", { VexGv, Ev, Iv }, PREFIX_NP_OR_DATA },
|
|
{ "%NFxorQ", { VexGv, Ev, Iv }, PREFIX_NP_OR_DATA },
|
|
{ "%NEccmp%SCQ%DF", { Ev, Iv }, PREFIX_NP_OR_DATA },
|
|
},
|
|
/* REG_EVEX_MAP4_83 */
|
|
{
|
|
{ "%NFaddQ", { VexGv, Ev, sIb }, PREFIX_NP_OR_DATA },
|
|
{ "%NForQ", { VexGv, Ev, sIb }, PREFIX_NP_OR_DATA },
|
|
{ "adcQ", { VexGv, Ev, sIb }, PREFIX_NP_OR_DATA },
|
|
{ "sbbQ", { VexGv, Ev, sIb }, PREFIX_NP_OR_DATA },
|
|
{ "%NFandQ", { VexGv, Ev, sIb }, PREFIX_NP_OR_DATA },
|
|
{ "%NFsubQ", { VexGv, Ev, sIb }, PREFIX_NP_OR_DATA },
|
|
{ "%NFxorQ", { VexGv, Ev, sIb }, PREFIX_NP_OR_DATA },
|
|
{ "%NEccmp%SCQ%DF", { Ev, sIb }, PREFIX_NP_OR_DATA },
|
|
},
|
|
/* REG_EVEX_MAP4_8F */
|
|
{
|
|
{ VEX_W_TABLE (EVEX_W_MAP4_8F_R_0) },
|
|
},
|
|
/* REG_EVEX_MAP4_F6 */
|
|
{
|
|
{ "%NEctest%SCA%DF", { Eb, Ib }, NO_PREFIX },
|
|
{ "%NEctest%SCA%DF", { Eb, Ib }, NO_PREFIX },
|
|
{ "notA", { VexGb, Eb }, NO_PREFIX },
|
|
{ "%NFnegA", { VexGb, Eb }, NO_PREFIX },
|
|
{ "%NFmulA", { Eb }, NO_PREFIX },
|
|
{ "%NFimulA", { Eb }, NO_PREFIX },
|
|
{ "%NFdivA", { Eb }, NO_PREFIX },
|
|
{ "%NFidivA", { Eb }, NO_PREFIX },
|
|
},
|
|
/* REG_EVEX_MAP4_F7 */
|
|
{
|
|
{ "%NEctest%SCQ%DF", { Ev, Iv }, PREFIX_NP_OR_DATA },
|
|
{ "%NEctest%SCQ%DF", { Ev, Iv }, PREFIX_NP_OR_DATA },
|
|
{ "notQ", { VexGv, Ev }, PREFIX_NP_OR_DATA },
|
|
{ "%NFnegQ", { VexGv, Ev }, PREFIX_NP_OR_DATA },
|
|
{ "%NFmulQ", { Ev }, PREFIX_NP_OR_DATA },
|
|
{ "%NFimulQ", { Ev }, PREFIX_NP_OR_DATA },
|
|
{ "%NFdivQ", { Ev }, PREFIX_NP_OR_DATA },
|
|
{ "%NFidivQ", { Ev }, PREFIX_NP_OR_DATA },
|
|
},
|
|
/* REG_EVEX_MAP4_FE */
|
|
{
|
|
{ "%NFincA", { VexGb, Eb }, NO_PREFIX },
|
|
{ "%NFdecA", { VexGb, Eb }, NO_PREFIX },
|
|
},
|
|
/* REG_EVEX_MAP4_FF */
|
|
{
|
|
{ "%NFincQ", { VexGv, Ev }, PREFIX_NP_OR_DATA },
|
|
{ "%NFdecQ", { VexGv, Ev }, PREFIX_NP_OR_DATA },
|
|
{ Bad_Opcode },
|
|
{ Bad_Opcode },
|
|
{ Bad_Opcode },
|
|
{ Bad_Opcode },
|
|
{ VEX_W_TABLE (EVEX_W_MAP4_FF_R_6) },
|
|
},
|