From eb34d29be8766b7466becebdd94e8121e88a44d4 Mon Sep 17 00:00:00 2001 From: Jan Beulich Date: Thu, 22 Jul 2021 13:09:03 +0200 Subject: [PATCH] x86: drop vex_scalar_w_dq_mode It has only a single use and can easily be represented by dq_mode instead. Plus its handling in intel_operand_size() was duplicating that of vex_vsib_{d,q}_w_dq_mode anyway. --- opcodes/i386-dis-evex-prefix.h | 4 +-- opcodes/i386-dis-evex.h | 42 +++++++++++++++---------------- opcodes/i386-dis.c | 46 +++++++++++++--------------------- 3 files changed, 41 insertions(+), 51 deletions(-) diff --git a/opcodes/i386-dis-evex-prefix.h b/opcodes/i386-dis-evex-prefix.h index 417eb1bfbff..5c24618bec4 100644 --- a/opcodes/i386-dis-evex-prefix.h +++ b/opcodes/i386-dis-evex-prefix.h @@ -358,7 +358,7 @@ { { Bad_Opcode }, { Bad_Opcode }, - { "vfmsub132s%XW", { XMScalar, VexScalar, EXVexWdqScalar, EXxEVexR }, 0 }, + { "vfmsub132s%XW", { XMScalar, VexScalar, EXdq, EXxEVexR }, 0 }, { "v4fmaddss", { XMScalar, VexScalar, Mxmm }, 0 }, }, /* PREFIX_EVEX_0F38AA */ @@ -372,6 +372,6 @@ { { Bad_Opcode }, { Bad_Opcode }, - { "vfmsub213s%XW", { XMScalar, VexScalar, EXVexWdqScalar, EXxEVexR }, 0 }, + { "vfmsub213s%XW", { XMScalar, VexScalar, EXdq, EXxEVexR }, 0 }, { "v4fnmaddss", { XMScalar, VexScalar, Mxmm }, 0 }, }, diff --git a/opcodes/i386-dis-evex.h b/opcodes/i386-dis-evex.h index 5f1ebaded85..287c7a84635 100644 --- a/opcodes/i386-dis-evex.h +++ b/opcodes/i386-dis-evex.h @@ -343,7 +343,7 @@ static const struct dis386 evex_table[][256] = { { PREFIX_TABLE (PREFIX_EVEX_0F382A) }, { VEX_W_TABLE (EVEX_W_0F382B) }, { "vscalefp%XW", { XM, Vex, EXx, EXxEVexR }, PREFIX_DATA }, - { "vscalefs%XW", { XMScalar, VexScalar, EXVexWdqScalar, EXxEVexR }, PREFIX_DATA }, + { "vscalefs%XW", { XMScalar, VexScalar, EXdq, EXxEVexR }, PREFIX_DATA }, { Bad_Opcode }, { Bad_Opcode }, /* 30 */ @@ -368,7 +368,7 @@ static const struct dis386 evex_table[][256] = { { "vpmull%DQ", { XM, Vex, EXx }, PREFIX_DATA }, { Bad_Opcode }, { "vgetexpp%XW", { XM, EXx, EXxEVexS }, PREFIX_DATA }, - { "vgetexps%XW", { XMScalar, VexScalar, EXVexWdqScalar, EXxEVexS }, PREFIX_DATA }, + { "vgetexps%XW", { XMScalar, VexScalar, EXdq, EXxEVexS }, PREFIX_DATA }, { "vplzcnt%DQ", { XM, EXx }, PREFIX_DATA }, { "vpsrlv%DQ", { XM, Vex, EXx }, PREFIX_DATA }, { "vpsrav%DQ", { XM, Vex, EXx }, PREFIX_DATA }, @@ -379,9 +379,9 @@ static const struct dis386 evex_table[][256] = { { Bad_Opcode }, { Bad_Opcode }, { "vrcp14p%XW", { XM, EXx }, PREFIX_DATA }, - { "vrcp14s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA }, + { "vrcp14s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA }, { "vrsqrt14p%XW", { XM, EXx }, 0 }, - { "vrsqrt14s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA }, + { "vrsqrt14s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA }, /* 50 */ { "vpdpbusd", { XM, Vex, EXx }, PREFIX_DATA }, { "vpdpbusds", { XM, Vex, EXx }, PREFIX_DATA }, @@ -465,13 +465,13 @@ static const struct dis386 evex_table[][256] = { { "vfmsubadd132p%XW", { XM, Vex, EXx, EXxEVexR }, PREFIX_DATA }, /* 98 */ { "vfmadd132p%XW", { XM, Vex, EXx, EXxEVexR }, PREFIX_DATA }, - { "vfmadd132s%XW", { XMScalar, VexScalar, EXVexWdqScalar, EXxEVexR }, PREFIX_DATA }, + { "vfmadd132s%XW", { XMScalar, VexScalar, EXdq, EXxEVexR }, PREFIX_DATA }, { PREFIX_TABLE (PREFIX_EVEX_0F389A) }, { PREFIX_TABLE (PREFIX_EVEX_0F389B) }, { "vfnmadd132p%XW", { XM, Vex, EXx, EXxEVexR }, PREFIX_DATA }, - { "vfnmadd132s%XW", { XMScalar, VexScalar, EXVexWdqScalar, EXxEVexR }, PREFIX_DATA }, + { "vfnmadd132s%XW", { XMScalar, VexScalar, EXdq, EXxEVexR }, PREFIX_DATA }, { "vfnmsub132p%XW", { XM, Vex, EXx, EXxEVexR }, PREFIX_DATA }, - { "vfnmsub132s%XW", { XMScalar, VexScalar, EXVexWdqScalar, EXxEVexR }, PREFIX_DATA }, + { "vfnmsub132s%XW", { XMScalar, VexScalar, EXdq, EXxEVexR }, PREFIX_DATA }, /* A0 */ { "vpscatterd%DQ", { MVexVSIBDWpX, XM }, PREFIX_DATA }, { "vpscatterq%DQ", { MVexVSIBQWpX, XMGatherQ }, PREFIX_DATA }, @@ -483,13 +483,13 @@ static const struct dis386 evex_table[][256] = { { "vfmsubadd213p%XW", { XM, Vex, EXx, EXxEVexR }, PREFIX_DATA }, /* A8 */ { "vfmadd213p%XW", { XM, Vex, EXx, EXxEVexR }, PREFIX_DATA }, - { "vfmadd213s%XW", { XMScalar, VexScalar, EXVexWdqScalar, EXxEVexR }, PREFIX_DATA }, + { "vfmadd213s%XW", { XMScalar, VexScalar, EXdq, EXxEVexR }, PREFIX_DATA }, { PREFIX_TABLE (PREFIX_EVEX_0F38AA) }, { PREFIX_TABLE (PREFIX_EVEX_0F38AB) }, { "vfnmadd213p%XW", { XM, Vex, EXx, EXxEVexR }, PREFIX_DATA }, - { "vfnmadd213s%XW", { XMScalar, VexScalar, EXVexWdqScalar, EXxEVexR }, PREFIX_DATA }, + { "vfnmadd213s%XW", { XMScalar, VexScalar, EXdq, EXxEVexR }, PREFIX_DATA }, { "vfnmsub213p%XW", { XM, Vex, EXx, EXxEVexR }, PREFIX_DATA }, - { "vfnmsub213s%XW", { XMScalar, VexScalar, EXVexWdqScalar, EXxEVexR }, PREFIX_DATA }, + { "vfnmsub213s%XW", { XMScalar, VexScalar, EXdq, EXxEVexR }, PREFIX_DATA }, /* B0 */ { Bad_Opcode }, { Bad_Opcode }, @@ -501,13 +501,13 @@ static const struct dis386 evex_table[][256] = { { "vfmsubadd231p%XW", { XM, Vex, EXx, EXxEVexR }, PREFIX_DATA }, /* B8 */ { "vfmadd231p%XW", { XM, Vex, EXx, EXxEVexR }, PREFIX_DATA }, - { "vfmadd231s%XW", { XMScalar, VexScalar, EXVexWdqScalar, EXxEVexR }, PREFIX_DATA }, + { "vfmadd231s%XW", { XMScalar, VexScalar, EXdq, EXxEVexR }, PREFIX_DATA }, { "vfmsub231p%XW", { XM, Vex, EXx, EXxEVexR }, PREFIX_DATA }, - { "vfmsub231s%XW", { XMScalar, VexScalar, EXVexWdqScalar, EXxEVexR }, PREFIX_DATA }, + { "vfmsub231s%XW", { XMScalar, VexScalar, EXdq, EXxEVexR }, PREFIX_DATA }, { "vfnmadd231p%XW", { XM, Vex, EXx, EXxEVexR }, PREFIX_DATA }, - { "vfnmadd231s%XW", { XMScalar, VexScalar, EXVexWdqScalar, EXxEVexR }, PREFIX_DATA }, + { "vfnmadd231s%XW", { XMScalar, VexScalar, EXdq, EXxEVexR }, PREFIX_DATA }, { "vfnmsub231p%XW", { XM, Vex, EXx, EXxEVexR }, PREFIX_DATA }, - { "vfnmsub231s%XW", { XMScalar, VexScalar, EXVexWdqScalar, EXxEVexR }, PREFIX_DATA }, + { "vfnmsub231s%XW", { XMScalar, VexScalar, EXdq, EXxEVexR }, PREFIX_DATA }, /* C0 */ { Bad_Opcode }, { Bad_Opcode }, @@ -521,9 +521,9 @@ static const struct dis386 evex_table[][256] = { { "vexp2p%XW", { XM, EXx, EXxEVexS }, PREFIX_DATA }, { Bad_Opcode }, { "vrcp28p%XW", { XM, EXx, EXxEVexS }, PREFIX_DATA }, - { "vrcp28s%XW", { XMScalar, VexScalar, EXVexWdqScalar, EXxEVexS }, PREFIX_DATA }, + { "vrcp28s%XW", { XMScalar, VexScalar, EXdq, EXxEVexS }, PREFIX_DATA }, { "vrsqrt28p%XW", { XM, EXx, EXxEVexS }, PREFIX_DATA }, - { "vrsqrt28s%XW", { XMScalar, VexScalar, EXVexWdqScalar, EXxEVexS }, PREFIX_DATA }, + { "vrsqrt28s%XW", { XMScalar, VexScalar, EXdq, EXxEVexS }, PREFIX_DATA }, { Bad_Opcode }, { VEX_W_TABLE (VEX_W_0F38CF) }, /* D0 */ @@ -627,7 +627,7 @@ static const struct dis386 evex_table[][256] = { { Bad_Opcode }, { "vpternlog%DQ", { XM, Vex, EXx, Ib }, PREFIX_DATA }, { "vgetmantp%XW", { XM, EXx, EXxEVexS, Ib }, PREFIX_DATA }, - { "vgetmants%XW", { XMScalar, VexScalar, EXVexWdqScalar, EXxEVexS, Ib }, PREFIX_DATA }, + { "vgetmants%XW", { XMScalar, VexScalar, EXdq, EXxEVexS, Ib }, PREFIX_DATA }, /* 28 */ { Bad_Opcode }, { Bad_Opcode }, @@ -675,13 +675,13 @@ static const struct dis386 evex_table[][256] = { { Bad_Opcode }, /* 50 */ { "vrangep%XW", { XM, Vex, EXx, EXxEVexS, Ib }, PREFIX_DATA }, - { "vranges%XW", { XMScalar, VexScalar, EXVexWdqScalar, EXxEVexS, Ib }, PREFIX_DATA }, + { "vranges%XW", { XMScalar, VexScalar, EXdq, EXxEVexS, Ib }, PREFIX_DATA }, { Bad_Opcode }, { Bad_Opcode }, { "vfixupimmp%XW", { XM, Vex, EXx, EXxEVexS, Ib }, PREFIX_DATA }, - { "vfixupimms%XW", { XMScalar, VexScalar, EXVexWdqScalar, EXxEVexS, Ib }, PREFIX_DATA }, + { "vfixupimms%XW", { XMScalar, VexScalar, EXdq, EXxEVexS, Ib }, PREFIX_DATA }, { "vreducep%XW", { XM, EXx, EXxEVexS, Ib }, PREFIX_DATA }, - { "vreduces%XW", { XMScalar, VexScalar, EXVexWdqScalar, EXxEVexS, Ib }, PREFIX_DATA }, + { "vreduces%XW", { XMScalar, VexScalar, EXdq, EXxEVexS, Ib }, PREFIX_DATA }, /* 58 */ { Bad_Opcode }, { Bad_Opcode }, @@ -699,7 +699,7 @@ static const struct dis386 evex_table[][256] = { { Bad_Opcode }, { Bad_Opcode }, { "vfpclassp%XW%XZ", { MaskG, EXx, Ib }, PREFIX_DATA }, - { "vfpclasss%XW", { MaskG, EXVexWdqScalar, Ib }, PREFIX_DATA }, + { "vfpclasss%XW", { MaskG, EXdq, Ib }, PREFIX_DATA }, /* 68 */ { Bad_Opcode }, { Bad_Opcode }, diff --git a/opcodes/i386-dis.c b/opcodes/i386-dis.c index 27b6b8e8f44..6efc15b851b 100644 --- a/opcodes/i386-dis.c +++ b/opcodes/i386-dis.c @@ -358,6 +358,7 @@ fetch_data (struct disassemble_info *info, bfd_byte *addr) #define EXdS { OP_EX, d_swap_mode } #define EXq { OP_EX, q_mode } #define EXqS { OP_EX, q_swap_mode } +#define EXdq { OP_EX, dq_mode } #define EXx { OP_EX, x_mode } #define EXxS { OP_EX, x_swap_mode } #define EXxmm { OP_EX, xmm_mode } @@ -368,7 +369,6 @@ fetch_data (struct disassemble_info *info, bfd_byte *addr) #define EXxmmdw { OP_EX, xmmdw_mode } #define EXxmmqd { OP_EX, xmmqd_mode } #define EXymmq { OP_EX, ymmq_mode } -#define EXVexWdqScalar { OP_EX, vex_scalar_w_dq_mode } #define EXEvexXGscat { OP_EX, evex_x_gscat_mode } #define EXEvexXNoBcst { OP_EX, evex_x_nobcst_mode } #define MS { OP_MS, v_mode } @@ -507,7 +507,7 @@ enum v_bnd_mode, /* like v_bnd_mode in 32bit, no RIP-rel in 64bit mode. */ v_bndmk_mode, - /* operand size depends on REX prefixes. */ + /* operand size depends on REX.W / VEX.W. */ dq_mode, /* registers like dq_mode, memory like w_mode, displacements like v_mode without considering Intel64 ISA. */ @@ -545,8 +545,6 @@ enum /* scalar, ignore vector length. */ scalar_mode, - /* Operand size depends on the VEX.W bit, ignore vector length. */ - vex_scalar_w_dq_mode, /* Static rounding. */ evex_rounding_mode, @@ -6300,13 +6298,13 @@ static const struct dis386 vex_table[][256] = { { "vfmsubadd132p%XW", { XM, Vex, EXx }, PREFIX_DATA }, /* 98 */ { "vfmadd132p%XW", { XM, Vex, EXx }, PREFIX_DATA }, - { "vfmadd132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA }, + { "vfmadd132s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA }, { "vfmsub132p%XW", { XM, Vex, EXx }, PREFIX_DATA }, - { "vfmsub132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA }, + { "vfmsub132s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA }, { "vfnmadd132p%XW", { XM, Vex, EXx }, PREFIX_DATA }, - { "vfnmadd132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA }, + { "vfnmadd132s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA }, { "vfnmsub132p%XW", { XM, Vex, EXx }, PREFIX_DATA }, - { "vfnmsub132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA }, + { "vfnmsub132s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA }, /* a0 */ { Bad_Opcode }, { Bad_Opcode }, @@ -6318,13 +6316,13 @@ static const struct dis386 vex_table[][256] = { { "vfmsubadd213p%XW", { XM, Vex, EXx }, PREFIX_DATA }, /* a8 */ { "vfmadd213p%XW", { XM, Vex, EXx }, PREFIX_DATA }, - { "vfmadd213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA }, + { "vfmadd213s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA }, { "vfmsub213p%XW", { XM, Vex, EXx }, PREFIX_DATA }, - { "vfmsub213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA }, + { "vfmsub213s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA }, { "vfnmadd213p%XW", { XM, Vex, EXx }, PREFIX_DATA }, - { "vfnmadd213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA }, + { "vfnmadd213s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA }, { "vfnmsub213p%XW", { XM, Vex, EXx }, PREFIX_DATA }, - { "vfnmsub213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA }, + { "vfnmsub213s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA }, /* b0 */ { Bad_Opcode }, { Bad_Opcode }, @@ -6336,13 +6334,13 @@ static const struct dis386 vex_table[][256] = { { "vfmsubadd231p%XW", { XM, Vex, EXx }, PREFIX_DATA }, /* b8 */ { "vfmadd231p%XW", { XM, Vex, EXx }, PREFIX_DATA }, - { "vfmadd231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA }, + { "vfmadd231s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA }, { "vfmsub231p%XW", { XM, Vex, EXx }, PREFIX_DATA }, - { "vfmsub231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA }, + { "vfmsub231s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA }, { "vfnmadd231p%XW", { XM, Vex, EXx }, PREFIX_DATA }, - { "vfnmadd231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA }, + { "vfnmadd231s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA }, { "vfnmsub231p%XW", { XM, Vex, EXx }, PREFIX_DATA }, - { "vfnmsub231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA }, + { "vfnmsub231s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA }, /* c0 */ { Bad_Opcode }, { Bad_Opcode }, @@ -11170,15 +11168,6 @@ intel_operand_size (int bytemode, int sizeflag) case o_mode: oappend ("OWORD PTR "); break; - case vex_scalar_w_dq_mode: - if (!need_vex) - abort (); - - if (vex.w) - oappend ("QWORD PTR "); - else - oappend ("DWORD PTR "); - break; case vex_vsib_d_w_dq_mode: case vex_vsib_q_w_dq_mode: if (!need_vex) @@ -11371,7 +11360,6 @@ OP_E_memory (int bytemode, int sizeflag) break; } /* fall through */ - case vex_scalar_w_dq_mode: case vex_vsib_d_w_dq_mode: case vex_vsib_q_w_dq_mode: case evex_x_gscat_mode: @@ -12496,8 +12484,7 @@ print_vector_reg (unsigned int reg, int bytemode) && bytemode != b_mode && bytemode != w_mode && bytemode != d_mode - && bytemode != q_mode - && bytemode != vex_scalar_w_dq_mode) + && bytemode != q_mode) { switch (vex.length) { @@ -12627,6 +12614,9 @@ OP_EX (int bytemode, int sizeflag) MODRM_CHECK; codep++; + if (bytemode == dq_mode) + bytemode = vex.w ? q_mode : d_mode; + if (modrm.mod != 3) { OP_E_memory (bytemode, sizeflag); -- 2.30.2