From: Jan Beulich Date: Tue, 14 Jul 2020 08:42:33 +0000 (+0200) Subject: x86: drop Rdq, Rd, and MaskR X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=464d2b65680352965d877d9f4ac5430bd05934df;p=binutils-gdb.git x86: drop Rdq, Rd, and MaskR Rdq, Rd, and MaskR can be replaced by Edq, Ed / Rm, and MaskE respectively, as OP_R() doesn't enforce ModRM.mod == 3, and hence where MOD matters but hasn't been decoded yet it needs to be anyway. (The case of converting to Rm is temporary until a subsequent change.) --- diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog index 3769588a091..73b31e57134 100644 --- a/opcodes/ChangeLog +++ b/opcodes/ChangeLog @@ -1,3 +1,23 @@ +2020-07-14 Jan Beulich + + * i386-dis.c (Rd, Rdq, MaskR): Delete. + (MOD_EVEX_0F3828_P_1, MOD_EVEX_0F382A_P_1_W_1, + MOD_EVEX_0F3838_P_1, MOD_EVEX_0F383A_P_1_W_0, + MOD_EVEX_0F387A_W_0, MOD_EVEX_0F387B_W_0, + MOD_EVEX_0F387C): New enumerators. + (reg_table): Use Edq for rdssp. + (prefix_table): Use Edq for incssp. + (mod_table): Use Rm for move to/from %tr. Use MaskE for kand*, + kandn*, knot*, kor*, kxnor*, kxor*, kadd*, kunpck*, kortest*, + ktest*, and kshift*. Use Edq / MaskE for kmov*. + * i386-dis-evex.h: Reference mod_table[] for opcode 0F387C. + * i386-dis-evex-mod.h: New entries for opcodes 0F3828, 0F382A, + 0F3838, 0F383A, 0F387A, 0F387B, and 0F387C. + * i386-dis-evex-prefix.h: Reference mod_table[] for opcodes + 0F3828_P_1 and 0F3838_P_1. + * i386-dis-evex-w.h: Reference mod_table[] for opcodes + 0F382A_P_1, 0F383A_P_1, 0F387A, and 0F387B. + 2020-07-14 Jan Beulich * i386-dis.c (PREFIX_0F01_REG_7_MOD_3_RM_3, diff --git a/opcodes/i386-dis-evex-mod.h b/opcodes/i386-dis-evex-mod.h index acb497d30d7..4259368a04d 100644 --- a/opcodes/i386-dis-evex-mod.h +++ b/opcodes/i386-dis-evex-mod.h @@ -44,6 +44,26 @@ { { EVEX_LEN_TABLE (EVEX_LEN_0F381B_W_1_M_0) }, }, + /* MOD_EVEX_0F3828_P_1 */ + { + { Bad_Opcode }, + { "vpmovm2%BW", { XM, MaskE }, 0 }, + }, + /* MOD_EVEX_0F382A_P_1_W_1 */ + { + { Bad_Opcode }, + { "vpbroadcastmb2q", { XM, MaskE }, 0 }, + }, + /* MOD_EVEX_0F3838_P_1 */ + { + { Bad_Opcode }, + { "vpmovm2%DQ", { XM, MaskE }, 0 }, + }, + /* MOD_EVEX_0F383A_P_1_W_0 */ + { + { Bad_Opcode }, + { "vpbroadcastmw2d", { XM, MaskE }, 0 }, + }, /* MOD_EVEX_0F385A_W_0 */ { { EVEX_LEN_TABLE (EVEX_LEN_0F385A_W_0_M_0) }, @@ -60,6 +80,21 @@ { { EVEX_LEN_TABLE (EVEX_LEN_0F385B_W_1_M_0) }, }, + /* MOD_EVEX_0F387A_W_0 */ + { + { Bad_Opcode }, + { "vpbroadcastb", { XM, Ed }, PREFIX_DATA }, + }, + /* MOD_EVEX_0F387B_W_0 */ + { + { Bad_Opcode }, + { "vpbroadcastw", { XM, Ed }, PREFIX_DATA }, + }, + /* MOD_EVEX_0F387C */ + { + { Bad_Opcode }, + { "vpbroadcastK", { XM, Edq }, PREFIX_DATA }, + }, { /* MOD_EVEX_0F38C6_REG_1 */ { EVEX_LEN_TABLE (EVEX_LEN_0F38C6_R_1_M_0) }, diff --git a/opcodes/i386-dis-evex-prefix.h b/opcodes/i386-dis-evex-prefix.h index a9581ee7fe6..fa54400389d 100644 --- a/opcodes/i386-dis-evex-prefix.h +++ b/opcodes/i386-dis-evex-prefix.h @@ -250,7 +250,7 @@ /* PREFIX_EVEX_0F3828 */ { { Bad_Opcode }, - { "vpmovm2%BW", { XM, MaskR }, 0 }, + { MOD_TABLE (MOD_EVEX_0F3828_P_1) }, { VEX_W_TABLE (EVEX_W_0F3828_P_2) }, }, /* PREFIX_EVEX_0F3829 */ @@ -304,7 +304,7 @@ /* PREFIX_EVEX_0F3838 */ { { Bad_Opcode }, - { "vpmovm2%DQ", { XM, MaskR }, 0 }, + { MOD_TABLE (MOD_EVEX_0F3838_P_1) }, { "vpminsb", { XM, Vex, EXx }, 0 }, }, /* PREFIX_EVEX_0F3839 */ diff --git a/opcodes/i386-dis-evex-w.h b/opcodes/i386-dis-evex-w.h index 59ff1d49a23..a046d11f881 100644 --- a/opcodes/i386-dis-evex-w.h +++ b/opcodes/i386-dis-evex-w.h @@ -455,7 +455,7 @@ /* EVEX_W_0F382A_P_1 */ { { Bad_Opcode }, - { "vpbroadcastmb2q", { XM, MaskR }, 0 }, + { MOD_TABLE (MOD_EVEX_0F382A_P_1_W_1) }, }, /* EVEX_W_0F382A_P_2 */ { @@ -500,7 +500,7 @@ }, /* EVEX_W_0F383A_P_1 */ { - { "vpbroadcastmw2d", { XM, MaskR }, 0 }, + { MOD_TABLE (MOD_EVEX_0F383A_P_1_W_0) }, }, /* EVEX_W_0F3852_P_1 */ { @@ -544,11 +544,11 @@ }, /* EVEX_W_0F387A */ { - { "vpbroadcastb", { XM, Rd }, PREFIX_DATA }, + { MOD_TABLE (MOD_EVEX_0F387A_W_0) }, }, /* EVEX_W_0F387B */ { - { "vpbroadcastw", { XM, Rd }, PREFIX_DATA }, + { MOD_TABLE (MOD_EVEX_0F387B_W_0) }, }, /* EVEX_W_0F3883 */ { diff --git a/opcodes/i386-dis-evex.h b/opcodes/i386-dis-evex.h index 54176af11d4..c93394210cc 100644 --- a/opcodes/i386-dis-evex.h +++ b/opcodes/i386-dis-evex.h @@ -432,7 +432,7 @@ static const struct dis386 evex_table[][256] = { { VEX_W_TABLE (VEX_W_0F3879) }, { VEX_W_TABLE (EVEX_W_0F387A) }, { VEX_W_TABLE (EVEX_W_0F387B) }, - { "vpbroadcastK", { XM, Rdq }, PREFIX_DATA }, + { MOD_TABLE (MOD_EVEX_0F387C) }, { "vpermt2%BW", { XM, Vex, EXx }, PREFIX_DATA }, { "vpermt2%DQ", { XM, Vex, EXx }, PREFIX_DATA }, { "vpermt2p%XW", { XM, Vex, EXx }, PREFIX_DATA }, diff --git a/opcodes/i386-dis.c b/opcodes/i386-dis.c index 2f748b838f5..35399bc6d44 100644 --- a/opcodes/i386-dis.c +++ b/opcodes/i386-dis.c @@ -274,8 +274,6 @@ fetch_data (struct disassemble_info *info, bfd_byte *addr) #define Gm { OP_G, m_mode } #define Gva { OP_G, va_mode } #define Gw { OP_G, w_mode } -#define Rd { OP_R, d_mode } -#define Rdq { OP_R, dq_mode } #define Rm { OP_R, m_mode } #define Ib { OP_I, b_mode } #define sIb { OP_sI, b_mode } /* sign extened byte */ @@ -412,7 +410,6 @@ fetch_data (struct disassemble_info *info, bfd_byte *addr) #define MaskG { OP_G, mask_mode } #define MaskE { OP_E, mask_mode } #define MaskBDE { OP_E, mask_bd_mode } -#define MaskR { OP_R, mask_mode } #define MaskVex { OP_VEX, mask_mode } #define MVexVSIBDWpX { OP_M, vex_vsib_d_w_dq_mode } @@ -912,10 +909,17 @@ enum MOD_EVEX_0F381A_W_1, MOD_EVEX_0F381B_W_0, MOD_EVEX_0F381B_W_1, + MOD_EVEX_0F3828_P_1, + MOD_EVEX_0F382A_P_1_W_1, + MOD_EVEX_0F3838_P_1, + MOD_EVEX_0F383A_P_1_W_0, MOD_EVEX_0F385A_W_0, MOD_EVEX_0F385A_W_1, MOD_EVEX_0F385B_W_0, MOD_EVEX_0F385B_W_1, + MOD_EVEX_0F387A_W_0, + MOD_EVEX_0F387B_W_0, + MOD_EVEX_0F387C, MOD_EVEX_0F38C6_REG_1, MOD_EVEX_0F38C6_REG_2, MOD_EVEX_0F38C6_REG_5, @@ -2884,7 +2888,7 @@ static const struct dis386 reg_table[][8] = { /* REG_0F1E_P_1_MOD_3 */ { { "nopQ", { Ev }, 0 }, - { "rdsspK", { Rdq }, PREFIX_OPCODE }, + { "rdsspK", { Edq }, PREFIX_OPCODE }, { "nopQ", { Ev }, 0 }, { "nopQ", { Ev }, 0 }, { "nopQ", { Ev }, 0 }, @@ -3425,7 +3429,7 @@ static const struct dis386 prefix_table[][4] = { /* PREFIX_0FAE_REG_5_MOD_3 */ { { "lfence", { Skip_MODRM }, 0 }, - { "incsspK", { Rdq }, PREFIX_OPCODE }, + { "incsspK", { Edq }, PREFIX_OPCODE }, }, /* PREFIX_0FAE_REG_6_MOD_0 */ @@ -7990,12 +7994,12 @@ static const struct dis386 mod_table[][2] = { { /* MOD_0F24 */ { Bad_Opcode }, - { "movL", { Rd, Td }, 0 }, + { "movL", { Rm, Td }, 0 }, }, { /* MOD_0F26 */ { Bad_Opcode }, - { "movL", { Td, Rd }, 0 }, + { "movL", { Td, Rm }, 0 }, }, { /* MOD_0F2B_PREFIX_0 */ @@ -8286,157 +8290,157 @@ static const struct dis386 mod_table[][2] = { { /* MOD_VEX_W_0_0F41_P_0_LEN_1 */ { Bad_Opcode }, - { "kandw", { MaskG, MaskVex, MaskR }, 0 }, + { "kandw", { MaskG, MaskVex, MaskE }, 0 }, }, { /* MOD_VEX_W_1_0F41_P_0_LEN_1 */ { Bad_Opcode }, - { "kandq", { MaskG, MaskVex, MaskR }, 0 }, + { "kandq", { MaskG, MaskVex, MaskE }, 0 }, }, { /* MOD_VEX_W_0_0F41_P_2_LEN_1 */ { Bad_Opcode }, - { "kandb", { MaskG, MaskVex, MaskR }, 0 }, + { "kandb", { MaskG, MaskVex, MaskE }, 0 }, }, { /* MOD_VEX_W_1_0F41_P_2_LEN_1 */ { Bad_Opcode }, - { "kandd", { MaskG, MaskVex, MaskR }, 0 }, + { "kandd", { MaskG, MaskVex, MaskE }, 0 }, }, { /* MOD_VEX_W_0_0F42_P_0_LEN_1 */ { Bad_Opcode }, - { "kandnw", { MaskG, MaskVex, MaskR }, 0 }, + { "kandnw", { MaskG, MaskVex, MaskE }, 0 }, }, { /* MOD_VEX_W_1_0F42_P_0_LEN_1 */ { Bad_Opcode }, - { "kandnq", { MaskG, MaskVex, MaskR }, 0 }, + { "kandnq", { MaskG, MaskVex, MaskE }, 0 }, }, { /* MOD_VEX_W_0_0F42_P_2_LEN_1 */ { Bad_Opcode }, - { "kandnb", { MaskG, MaskVex, MaskR }, 0 }, + { "kandnb", { MaskG, MaskVex, MaskE }, 0 }, }, { /* MOD_VEX_W_1_0F42_P_2_LEN_1 */ { Bad_Opcode }, - { "kandnd", { MaskG, MaskVex, MaskR }, 0 }, + { "kandnd", { MaskG, MaskVex, MaskE }, 0 }, }, { /* MOD_VEX_W_0_0F44_P_0_LEN_0 */ { Bad_Opcode }, - { "knotw", { MaskG, MaskR }, 0 }, + { "knotw", { MaskG, MaskE }, 0 }, }, { /* MOD_VEX_W_1_0F44_P_0_LEN_0 */ { Bad_Opcode }, - { "knotq", { MaskG, MaskR }, 0 }, + { "knotq", { MaskG, MaskE }, 0 }, }, { /* MOD_VEX_W_0_0F44_P_2_LEN_0 */ { Bad_Opcode }, - { "knotb", { MaskG, MaskR }, 0 }, + { "knotb", { MaskG, MaskE }, 0 }, }, { /* MOD_VEX_W_1_0F44_P_2_LEN_0 */ { Bad_Opcode }, - { "knotd", { MaskG, MaskR }, 0 }, + { "knotd", { MaskG, MaskE }, 0 }, }, { /* MOD_VEX_W_0_0F45_P_0_LEN_1 */ { Bad_Opcode }, - { "korw", { MaskG, MaskVex, MaskR }, 0 }, + { "korw", { MaskG, MaskVex, MaskE }, 0 }, }, { /* MOD_VEX_W_1_0F45_P_0_LEN_1 */ { Bad_Opcode }, - { "korq", { MaskG, MaskVex, MaskR }, 0 }, + { "korq", { MaskG, MaskVex, MaskE }, 0 }, }, { /* MOD_VEX_W_0_0F45_P_2_LEN_1 */ { Bad_Opcode }, - { "korb", { MaskG, MaskVex, MaskR }, 0 }, + { "korb", { MaskG, MaskVex, MaskE }, 0 }, }, { /* MOD_VEX_W_1_0F45_P_2_LEN_1 */ { Bad_Opcode }, - { "kord", { MaskG, MaskVex, MaskR }, 0 }, + { "kord", { MaskG, MaskVex, MaskE }, 0 }, }, { /* MOD_VEX_W_0_0F46_P_0_LEN_1 */ { Bad_Opcode }, - { "kxnorw", { MaskG, MaskVex, MaskR }, 0 }, + { "kxnorw", { MaskG, MaskVex, MaskE }, 0 }, }, { /* MOD_VEX_W_1_0F46_P_0_LEN_1 */ { Bad_Opcode }, - { "kxnorq", { MaskG, MaskVex, MaskR }, 0 }, + { "kxnorq", { MaskG, MaskVex, MaskE }, 0 }, }, { /* MOD_VEX_W_0_0F46_P_2_LEN_1 */ { Bad_Opcode }, - { "kxnorb", { MaskG, MaskVex, MaskR }, 0 }, + { "kxnorb", { MaskG, MaskVex, MaskE }, 0 }, }, { /* MOD_VEX_W_1_0F46_P_2_LEN_1 */ { Bad_Opcode }, - { "kxnord", { MaskG, MaskVex, MaskR }, 0 }, + { "kxnord", { MaskG, MaskVex, MaskE }, 0 }, }, { /* MOD_VEX_W_0_0F47_P_0_LEN_1 */ { Bad_Opcode }, - { "kxorw", { MaskG, MaskVex, MaskR }, 0 }, + { "kxorw", { MaskG, MaskVex, MaskE }, 0 }, }, { /* MOD_VEX_W_1_0F47_P_0_LEN_1 */ { Bad_Opcode }, - { "kxorq", { MaskG, MaskVex, MaskR }, 0 }, + { "kxorq", { MaskG, MaskVex, MaskE }, 0 }, }, { /* MOD_VEX_W_0_0F47_P_2_LEN_1 */ { Bad_Opcode }, - { "kxorb", { MaskG, MaskVex, MaskR }, 0 }, + { "kxorb", { MaskG, MaskVex, MaskE }, 0 }, }, { /* MOD_VEX_W_1_0F47_P_2_LEN_1 */ { Bad_Opcode }, - { "kxord", { MaskG, MaskVex, MaskR }, 0 }, + { "kxord", { MaskG, MaskVex, MaskE }, 0 }, }, { /* MOD_VEX_W_0_0F4A_P_0_LEN_1 */ { Bad_Opcode }, - { "kaddw", { MaskG, MaskVex, MaskR }, 0 }, + { "kaddw", { MaskG, MaskVex, MaskE }, 0 }, }, { /* MOD_VEX_W_1_0F4A_P_0_LEN_1 */ { Bad_Opcode }, - { "kaddq", { MaskG, MaskVex, MaskR }, 0 }, + { "kaddq", { MaskG, MaskVex, MaskE }, 0 }, }, { /* MOD_VEX_W_0_0F4A_P_2_LEN_1 */ { Bad_Opcode }, - { "kaddb", { MaskG, MaskVex, MaskR }, 0 }, + { "kaddb", { MaskG, MaskVex, MaskE }, 0 }, }, { /* MOD_VEX_W_1_0F4A_P_2_LEN_1 */ { Bad_Opcode }, - { "kaddd", { MaskG, MaskVex, MaskR }, 0 }, + { "kaddd", { MaskG, MaskVex, MaskE }, 0 }, }, { /* MOD_VEX_W_0_0F4B_P_0_LEN_1 */ { Bad_Opcode }, - { "kunpckwd", { MaskG, MaskVex, MaskR }, 0 }, + { "kunpckwd", { MaskG, MaskVex, MaskE }, 0 }, }, { /* MOD_VEX_W_1_0F4B_P_0_LEN_1 */ { Bad_Opcode }, - { "kunpckdq", { MaskG, MaskVex, MaskR }, 0 }, + { "kunpckdq", { MaskG, MaskVex, MaskE }, 0 }, }, { /* MOD_VEX_W_0_0F4B_P_2_LEN_1 */ { Bad_Opcode }, - { "kunpckbw", { MaskG, MaskVex, MaskR }, 0 }, + { "kunpckbw", { MaskG, MaskVex, MaskE }, 0 }, }, { /* MOD_VEX_0F50 */ @@ -8516,72 +8520,72 @@ static const struct dis386 mod_table[][2] = { { /* MOD_VEX_W_0_0F92_P_0_LEN_0 */ { Bad_Opcode }, - { "kmovw", { MaskG, Rdq }, 0 }, + { "kmovw", { MaskG, Edq }, 0 }, }, { /* MOD_VEX_W_0_0F92_P_2_LEN_0 */ { Bad_Opcode }, - { "kmovb", { MaskG, Rdq }, 0 }, + { "kmovb", { MaskG, Edq }, 0 }, }, { /* MOD_VEX_0F92_P_3_LEN_0 */ { Bad_Opcode }, - { "kmovK", { MaskG, Rdq }, 0 }, + { "kmovK", { MaskG, Edq }, 0 }, }, { /* MOD_VEX_W_0_0F93_P_0_LEN_0 */ { Bad_Opcode }, - { "kmovw", { Gdq, MaskR }, 0 }, + { "kmovw", { Gdq, MaskE }, 0 }, }, { /* MOD_VEX_W_0_0F93_P_2_LEN_0 */ { Bad_Opcode }, - { "kmovb", { Gdq, MaskR }, 0 }, + { "kmovb", { Gdq, MaskE }, 0 }, }, { /* MOD_VEX_0F93_P_3_LEN_0 */ { Bad_Opcode }, - { "kmovK", { Gdq, MaskR }, 0 }, + { "kmovK", { Gdq, MaskE }, 0 }, }, { /* MOD_VEX_W_0_0F98_P_0_LEN_0 */ { Bad_Opcode }, - { "kortestw", { MaskG, MaskR }, 0 }, + { "kortestw", { MaskG, MaskE }, 0 }, }, { /* MOD_VEX_W_1_0F98_P_0_LEN_0 */ { Bad_Opcode }, - { "kortestq", { MaskG, MaskR }, 0 }, + { "kortestq", { MaskG, MaskE }, 0 }, }, { /* MOD_VEX_W_0_0F98_P_2_LEN_0 */ { Bad_Opcode }, - { "kortestb", { MaskG, MaskR }, 0 }, + { "kortestb", { MaskG, MaskE }, 0 }, }, { /* MOD_VEX_W_1_0F98_P_2_LEN_0 */ { Bad_Opcode }, - { "kortestd", { MaskG, MaskR }, 0 }, + { "kortestd", { MaskG, MaskE }, 0 }, }, { /* MOD_VEX_W_0_0F99_P_0_LEN_0 */ { Bad_Opcode }, - { "ktestw", { MaskG, MaskR }, 0 }, + { "ktestw", { MaskG, MaskE }, 0 }, }, { /* MOD_VEX_W_1_0F99_P_0_LEN_0 */ { Bad_Opcode }, - { "ktestq", { MaskG, MaskR }, 0 }, + { "ktestq", { MaskG, MaskE }, 0 }, }, { /* MOD_VEX_W_0_0F99_P_2_LEN_0 */ { Bad_Opcode }, - { "ktestb", { MaskG, MaskR }, 0 }, + { "ktestb", { MaskG, MaskE }, 0 }, }, { /* MOD_VEX_W_1_0F99_P_2_LEN_0 */ { Bad_Opcode }, - { "ktestd", { MaskG, MaskR }, 0 }, + { "ktestd", { MaskG, MaskE }, 0 }, }, { /* MOD_VEX_0FAE_REG_2 */ @@ -8643,22 +8647,22 @@ static const struct dis386 mod_table[][2] = { { /* MOD_VEX_0F3A30_L_0 */ { Bad_Opcode }, - { "kshiftr%BW", { MaskG, MaskR, Ib }, PREFIX_DATA }, + { "kshiftr%BW", { MaskG, MaskE, Ib }, PREFIX_DATA }, }, { /* MOD_VEX_0F3A31_L_0 */ { Bad_Opcode }, - { "kshiftr%DQ", { MaskG, MaskR, Ib }, PREFIX_DATA }, + { "kshiftr%DQ", { MaskG, MaskE, Ib }, PREFIX_DATA }, }, { /* MOD_VEX_0F3A32_L_0 */ { Bad_Opcode }, - { "kshiftl%BW", { MaskG, MaskR, Ib }, PREFIX_DATA }, + { "kshiftl%BW", { MaskG, MaskE, Ib }, PREFIX_DATA }, }, { /* MOD_VEX_0F3A33_L_0 */ { Bad_Opcode }, - { "kshiftl%DQ", { MaskG, MaskR, Ib }, PREFIX_DATA }, + { "kshiftl%DQ", { MaskG, MaskE, Ib }, PREFIX_DATA }, }, { /* MOD_VEX_0FXOP_09_12 */