X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=opcodes%2Fi386-dis.c;h=441866d6c978c4458c58585383c6337814f7017e;hb=1a20473059c7a088b9f3c4188c09976eebbc3ab4;hp=77813e131e620bb5ce38ff334abb7fbfa5cb6549;hpb=dc1e8a474f904419abaa27da4be5b0f735a87255;p=deliverable%2Fbinutils-gdb.git diff --git a/opcodes/i386-dis.c b/opcodes/i386-dis.c index 77813e131e..441866d6c9 100644 --- a/opcodes/i386-dis.c +++ b/opcodes/i386-dis.c @@ -153,8 +153,6 @@ static int prefixes; static int rex; /* Bits of REX we've already used. */ static int rex_used; -/* REX bits in original REX prefix ignored. */ -static int rex_ignored; /* Mark parts used in the REX prefix. When we are testing for empty prefix (for 8bit register REX extension), just mask it out. Otherwise test for REX bit is excuse for existence of REX @@ -778,8 +776,10 @@ enum MOD_0F01_REG_5, MOD_0F01_REG_7, MOD_0F12_PREFIX_0, + MOD_0F12_PREFIX_2, MOD_0F13, MOD_0F16_PREFIX_0, + MOD_0F16_PREFIX_2, MOD_0F17, MOD_0F18_REG_0, MOD_0F18_REG_1, @@ -800,7 +800,7 @@ enum MOD_0F2B_PREFIX_1, MOD_0F2B_PREFIX_2, MOD_0F2B_PREFIX_3, - MOD_0F51, + MOD_0F50, MOD_0F71_REG_2, MOD_0F71_REG_4, MOD_0F71_REG_6, @@ -842,8 +842,10 @@ enum MOD_C4_32BIT, MOD_C5_32BIT, MOD_VEX_0F12_PREFIX_0, + MOD_VEX_0F12_PREFIX_2, MOD_VEX_0F13, MOD_VEX_0F16_PREFIX_0, + MOD_VEX_0F16_PREFIX_2, MOD_VEX_0F17, MOD_VEX_0F2B, MOD_VEX_W_0_0F41_P_0_LEN_1, @@ -930,7 +932,12 @@ enum MOD_VEX_W_1_0F3A33_P_2_LEN_0, MOD_EVEX_0F12_PREFIX_0, + MOD_EVEX_0F12_PREFIX_2, + MOD_EVEX_0F13, MOD_EVEX_0F16_PREFIX_0, + MOD_EVEX_0F16_PREFIX_2, + MOD_EVEX_0F17, + MOD_EVEX_0F2B, MOD_EVEX_0F38C6_REG_1, MOD_EVEX_0F38C6_REG_2, MOD_EVEX_0F38C6_REG_5, @@ -959,8 +966,10 @@ enum enum { PREFIX_90 = 0, + PREFIX_0F01_REG_3_RM_1, PREFIX_0F01_REG_5_MOD_0, PREFIX_0F01_REG_5_MOD_3_RM_0, + PREFIX_0F01_REG_5_MOD_3_RM_1, PREFIX_0F01_REG_5_MOD_3_RM_2, PREFIX_0F01_REG_7_MOD_3_RM_2, PREFIX_0F01_REG_7_MOD_3_RM_3, @@ -1413,24 +1422,13 @@ enum PREFIX_EVEX_0F10, PREFIX_EVEX_0F11, PREFIX_EVEX_0F12, - PREFIX_EVEX_0F13, - PREFIX_EVEX_0F14, - PREFIX_EVEX_0F15, PREFIX_EVEX_0F16, - PREFIX_EVEX_0F17, - PREFIX_EVEX_0F28, - PREFIX_EVEX_0F29, PREFIX_EVEX_0F2A, - PREFIX_EVEX_0F2B, PREFIX_EVEX_0F2C, PREFIX_EVEX_0F2D, PREFIX_EVEX_0F2E, PREFIX_EVEX_0F2F, PREFIX_EVEX_0F51, - PREFIX_EVEX_0F54, - PREFIX_EVEX_0F55, - PREFIX_EVEX_0F56, - PREFIX_EVEX_0F57, PREFIX_EVEX_0F58, PREFIX_EVEX_0F59, PREFIX_EVEX_0F5A, @@ -1480,7 +1478,6 @@ enum PREFIX_EVEX_0FC2, PREFIX_EVEX_0FC4, PREFIX_EVEX_0FC5, - PREFIX_EVEX_0FC6, PREFIX_EVEX_0FD1, PREFIX_EVEX_0FD2, PREFIX_EVEX_0FD3, @@ -1740,7 +1737,7 @@ enum { X86_64_06 = 0, X86_64_07, - X86_64_0D, + X86_64_0E, X86_64_16, X86_64_17, X86_64_1E, @@ -1804,11 +1801,11 @@ enum { VEX_LEN_0F12_P_0_M_0 = 0, VEX_LEN_0F12_P_0_M_1, - VEX_LEN_0F12_P_2, +#define VEX_LEN_0F12_P_2_M_0 VEX_LEN_0F12_P_0_M_0 VEX_LEN_0F13_M_0, VEX_LEN_0F16_P_0_M_0, VEX_LEN_0F16_P_0_M_1, - VEX_LEN_0F16_P_2, +#define VEX_LEN_0F16_P_2_M_0 VEX_LEN_0F16_P_0_M_0 VEX_LEN_0F17_M_0, VEX_LEN_0F41_P_0, VEX_LEN_0F41_P_2, @@ -2038,61 +2035,21 @@ enum VEX_W_0F3ACE_P_2, VEX_W_0F3ACF_P_2, - EVEX_W_0F10_P_0, EVEX_W_0F10_P_1, - EVEX_W_0F10_P_2, EVEX_W_0F10_P_3, - EVEX_W_0F11_P_0, EVEX_W_0F11_P_1, - EVEX_W_0F11_P_2, EVEX_W_0F11_P_3, - EVEX_W_0F12_P_0_M_0, EVEX_W_0F12_P_0_M_1, EVEX_W_0F12_P_1, - EVEX_W_0F12_P_2, EVEX_W_0F12_P_3, - EVEX_W_0F13_P_0, - EVEX_W_0F13_P_2, - EVEX_W_0F14_P_0, - EVEX_W_0F14_P_2, - EVEX_W_0F15_P_0, - EVEX_W_0F15_P_2, - EVEX_W_0F16_P_0_M_0, EVEX_W_0F16_P_0_M_1, EVEX_W_0F16_P_1, - EVEX_W_0F16_P_2, - EVEX_W_0F17_P_0, - EVEX_W_0F17_P_2, - EVEX_W_0F28_P_0, - EVEX_W_0F28_P_2, - EVEX_W_0F29_P_0, - EVEX_W_0F29_P_2, EVEX_W_0F2A_P_3, - EVEX_W_0F2B_P_0, - EVEX_W_0F2B_P_2, - EVEX_W_0F2E_P_0, - EVEX_W_0F2E_P_2, - EVEX_W_0F2F_P_0, - EVEX_W_0F2F_P_2, - EVEX_W_0F51_P_0, EVEX_W_0F51_P_1, - EVEX_W_0F51_P_2, EVEX_W_0F51_P_3, - EVEX_W_0F54_P_0, - EVEX_W_0F54_P_2, - EVEX_W_0F55_P_0, - EVEX_W_0F55_P_2, - EVEX_W_0F56_P_0, - EVEX_W_0F56_P_2, - EVEX_W_0F57_P_0, - EVEX_W_0F57_P_2, - EVEX_W_0F58_P_0, EVEX_W_0F58_P_1, - EVEX_W_0F58_P_2, EVEX_W_0F58_P_3, - EVEX_W_0F59_P_0, EVEX_W_0F59_P_1, - EVEX_W_0F59_P_2, EVEX_W_0F59_P_3, EVEX_W_0F5A_P_0, EVEX_W_0F5A_P_1, @@ -2101,21 +2058,13 @@ enum EVEX_W_0F5B_P_0, EVEX_W_0F5B_P_1, EVEX_W_0F5B_P_2, - EVEX_W_0F5C_P_0, EVEX_W_0F5C_P_1, - EVEX_W_0F5C_P_2, EVEX_W_0F5C_P_3, - EVEX_W_0F5D_P_0, EVEX_W_0F5D_P_1, - EVEX_W_0F5D_P_2, EVEX_W_0F5D_P_3, - EVEX_W_0F5E_P_0, EVEX_W_0F5E_P_1, - EVEX_W_0F5E_P_2, EVEX_W_0F5E_P_3, - EVEX_W_0F5F_P_0, EVEX_W_0F5F_P_1, - EVEX_W_0F5F_P_2, EVEX_W_0F5F_P_3, EVEX_W_0F62_P_2, EVEX_W_0F66_P_2, @@ -2145,12 +2094,8 @@ enum EVEX_W_0F7F_P_1, EVEX_W_0F7F_P_2, EVEX_W_0F7F_P_3, - EVEX_W_0FC2_P_0, EVEX_W_0FC2_P_1, - EVEX_W_0FC2_P_2, EVEX_W_0FC2_P_3, - EVEX_W_0FC6_P_0, - EVEX_W_0FC6_P_2, EVEX_W_0FD2_P_2, EVEX_W_0FD3_P_2, EVEX_W_0FD4_P_2, @@ -2378,7 +2323,7 @@ static const struct dis386 dis386[] = { { "orS", { Gv, EvS }, 0 }, { "orB", { AL, Ib }, 0 }, { "orS", { eAX, Iv }, 0 }, - { X86_64_TABLE (X86_64_0D) }, + { X86_64_TABLE (X86_64_0E) }, { Bad_Opcode }, /* 0x0f extended opcode escape */ /* 10 */ { "adcB", { Ebh1, Gb }, 0 }, @@ -2744,7 +2689,7 @@ static const struct dis386 dis386_twobyte[] = { { "cmovleS", { Gv, Ev }, 0 }, { "cmovgS", { Gv, Ev }, 0 }, /* 50 */ - { MOD_TABLE (MOD_0F51) }, + { MOD_TABLE (MOD_0F50) }, { PREFIX_TABLE (PREFIX_0F51) }, { PREFIX_TABLE (PREFIX_0F52) }, { PREFIX_TABLE (PREFIX_0F53) }, @@ -3627,6 +3572,14 @@ static const struct dis386 prefix_table[][4] = { { NULL, { { NULL, 0 } }, PREFIX_IGNORED } }, + /* PREFIX_0F01_REG_3_RM_1 */ + { + { "vmmcall", { Skip_MODRM }, 0 }, + { "vmgexit", { Skip_MODRM }, 0 }, + { Bad_Opcode }, + { "vmgexit", { Skip_MODRM }, 0 }, + }, + /* PREFIX_0F01_REG_5_MOD_0 */ { { Bad_Opcode }, @@ -3635,8 +3588,18 @@ static const struct dis386 prefix_table[][4] = { /* PREFIX_0F01_REG_5_MOD_3_RM_0 */ { - { Bad_Opcode }, + { "serialize", { Skip_MODRM }, PREFIX_OPCODE }, { "setssbsy", { Skip_MODRM }, PREFIX_OPCODE }, + { Bad_Opcode }, + { "xsusldtrk", { Skip_MODRM }, PREFIX_OPCODE }, + }, + + /* PREFIX_0F01_REG_5_MOD_3_RM_1 */ + { + { Bad_Opcode }, + { Bad_Opcode }, + { Bad_Opcode }, + { "xresldtrk", { Skip_MODRM }, PREFIX_OPCODE }, }, /* PREFIX_0F01_REG_5_MOD_3_RM_2 */ @@ -3682,7 +3645,7 @@ static const struct dis386 prefix_table[][4] = { { { MOD_TABLE (MOD_0F12_PREFIX_0) }, { "movsldup", { XM, EXx }, PREFIX_OPCODE }, - { "movlpd", { XM, EXq }, PREFIX_OPCODE }, + { MOD_TABLE (MOD_0F12_PREFIX_2) }, { "movddup", { XM, EXq }, PREFIX_OPCODE }, }, @@ -3690,7 +3653,7 @@ static const struct dis386 prefix_table[][4] = { { { MOD_TABLE (MOD_0F16_PREFIX_0) }, { "movshdup", { XM, EXx }, PREFIX_OPCODE }, - { "movhpd", { XM, EXq }, PREFIX_OPCODE }, + { MOD_TABLE (MOD_0F16_PREFIX_2) }, }, /* PREFIX_0F1A */ @@ -4687,7 +4650,7 @@ static const struct dis386 prefix_table[][4] = { { { MOD_TABLE (MOD_VEX_0F12_PREFIX_0) }, { "vmovsldup", { XM, EXx }, 0 }, - { VEX_LEN_TABLE (VEX_LEN_0F12_P_2) }, + { MOD_TABLE (MOD_VEX_0F12_PREFIX_2) }, { "vmovddup", { XM, EXymmq }, 0 }, }, @@ -4695,7 +4658,7 @@ static const struct dis386 prefix_table[][4] = { { { MOD_TABLE (MOD_VEX_0F16_PREFIX_0) }, { "vmovshdup", { XM, EXx }, 0 }, - { VEX_LEN_TABLE (VEX_LEN_0F16_P_2) }, + { MOD_TABLE (MOD_VEX_0F16_PREFIX_2) }, }, /* PREFIX_VEX_0F2A */ @@ -6806,7 +6769,7 @@ static const struct dis386 x86_64_table[][2] = { { "popP", { es }, 0 }, }, - /* X86_64_0D */ + /* X86_64_0E */ { { "pushP", { cs }, 0 }, }, @@ -8465,8 +8428,8 @@ static const struct dis386 vex_table[][256] = { { PREFIX_TABLE (PREFIX_VEX_0F11) }, { PREFIX_TABLE (PREFIX_VEX_0F12) }, { MOD_TABLE (MOD_VEX_0F13) }, - { "vunpcklpX", { XM, Vex, EXx }, 0 }, - { "vunpckhpX", { XM, Vex, EXx }, 0 }, + { "vunpcklpX", { XM, Vex, EXx }, PREFIX_OPCODE }, + { "vunpckhpX", { XM, Vex, EXx }, PREFIX_OPCODE }, { PREFIX_TABLE (PREFIX_VEX_0F16) }, { MOD_TABLE (MOD_VEX_0F17) }, /* 18 */ @@ -8488,8 +8451,8 @@ static const struct dis386 vex_table[][256] = { { Bad_Opcode }, { Bad_Opcode }, /* 28 */ - { "vmovapX", { XM, EXx }, 0 }, - { "vmovapX", { EXxS, XM }, 0 }, + { "vmovapX", { XM, EXx }, PREFIX_OPCODE }, + { "vmovapX", { EXxS, XM }, PREFIX_OPCODE }, { PREFIX_TABLE (PREFIX_VEX_0F2A) }, { MOD_TABLE (MOD_VEX_0F2B) }, { PREFIX_TABLE (PREFIX_VEX_0F2C) }, @@ -8537,10 +8500,10 @@ static const struct dis386 vex_table[][256] = { { PREFIX_TABLE (PREFIX_VEX_0F51) }, { PREFIX_TABLE (PREFIX_VEX_0F52) }, { PREFIX_TABLE (PREFIX_VEX_0F53) }, - { "vandpX", { XM, Vex, EXx }, 0 }, - { "vandnpX", { XM, Vex, EXx }, 0 }, - { "vorpX", { XM, Vex, EXx }, 0 }, - { "vxorpX", { XM, Vex, EXx }, 0 }, + { "vandpX", { XM, Vex, EXx }, PREFIX_OPCODE }, + { "vandnpX", { XM, Vex, EXx }, PREFIX_OPCODE }, + { "vorpX", { XM, Vex, EXx }, PREFIX_OPCODE }, + { "vxorpX", { XM, Vex, EXx }, PREFIX_OPCODE }, /* 58 */ { PREFIX_TABLE (PREFIX_VEX_0F58) }, { PREFIX_TABLE (PREFIX_VEX_0F59) }, @@ -8665,7 +8628,7 @@ static const struct dis386 vex_table[][256] = { { Bad_Opcode }, { PREFIX_TABLE (PREFIX_VEX_0FC4) }, { PREFIX_TABLE (PREFIX_VEX_0FC5) }, - { "vshufpX", { XM, Vex, EXx, Ib }, 0 }, + { "vshufpX", { XM, Vex, EXx, Ib }, PREFIX_OPCODE }, { Bad_Opcode }, /* c8 */ { Bad_Opcode }, @@ -9318,9 +9281,9 @@ static const struct dis386 vex_table[][256] = { #include "i386-dis-evex.h" static const struct dis386 vex_len_table[][2] = { - /* VEX_LEN_0F12_P_0_M_0 */ + /* VEX_LEN_0F12_P_0_M_0 / VEX_LEN_0F12_P_2_M_0 */ { - { "vmovlps", { XM, Vex128, EXq }, 0 }, + { "vmovlpX", { XM, Vex128, EXq }, 0 }, }, /* VEX_LEN_0F12_P_0_M_1 */ @@ -9328,19 +9291,14 @@ static const struct dis386 vex_len_table[][2] = { { "vmovhlps", { XM, Vex128, EXq }, 0 }, }, - /* VEX_LEN_0F12_P_2 */ - { - { "vmovlpd", { XM, Vex128, EXq }, 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 / VEX_LEN_0F16_P_2_M_0 */ { - { "vmovhps", { XM, Vex128, EXq }, 0 }, + { "vmovhpX", { XM, Vex128, EXq }, 0 }, }, /* VEX_LEN_0F16_P_0_M_1 */ @@ -9348,14 +9306,9 @@ static const struct dis386 vex_len_table[][2] = { { "vmovlhps", { XM, Vex128, EXq }, 0 }, }, - /* VEX_LEN_0F16_P_2 */ - { - { "vmovhpd", { XM, Vex128, EXq }, 0 }, - }, - /* VEX_LEN_0F17_M_0 */ { - { "vmovhpX", { EXq, XM }, 0 }, + { "vmovhpX", { EXq, XM }, PREFIX_OPCODE }, }, /* VEX_LEN_0F41_P_0 */ @@ -10264,8 +10217,12 @@ static const struct dis386 mod_table[][2] = { }, { /* MOD_0F12_PREFIX_0 */ - { "movlps", { XM, EXq }, PREFIX_OPCODE }, - { "movhlps", { XM, EXq }, PREFIX_OPCODE }, + { "movlpX", { XM, EXq }, 0 }, + { "movhlps", { XM, EXq }, 0 }, + }, + { + /* MOD_0F12_PREFIX_2 */ + { "movlpX", { XM, EXq }, 0 }, }, { /* MOD_0F13 */ @@ -10273,9 +10230,13 @@ static const struct dis386 mod_table[][2] = { }, { /* MOD_0F16_PREFIX_0 */ - { "movhps", { XM, EXq }, 0 }, + { "movhpX", { XM, EXq }, 0 }, { "movlhps", { XM, EXq }, 0 }, }, + { + /* MOD_0F16_PREFIX_2 */ + { "movhpX", { XM, EXq }, 0 }, + }, { /* MOD_0F17 */ { "movhpX", { EXq, XM }, PREFIX_OPCODE }, @@ -10364,7 +10325,7 @@ static const struct dis386 mod_table[][2] = { {"movntsd", { Mq, XM }, PREFIX_OPCODE }, }, { - /* MOD_0F51 */ + /* MOD_0F50 */ { Bad_Opcode }, { "movmskpX", { Gdq, XS }, PREFIX_OPCODE }, }, @@ -10557,6 +10518,10 @@ static const struct dis386 mod_table[][2] = { { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_0) }, { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_1) }, }, + { + /* MOD_VEX_0F12_PREFIX_2 */ + { VEX_LEN_TABLE (VEX_LEN_0F12_P_2_M_0) }, + }, { /* MOD_VEX_0F13 */ { VEX_LEN_TABLE (VEX_LEN_0F13_M_0) }, @@ -10566,13 +10531,17 @@ static const struct dis386 mod_table[][2] = { { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_0) }, { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_1) }, }, + { + /* MOD_VEX_0F16_PREFIX_2 */ + { VEX_LEN_TABLE (VEX_LEN_0F16_P_2_M_0) }, + }, { /* MOD_VEX_0F17 */ { VEX_LEN_TABLE (VEX_LEN_0F17_M_0) }, }, { /* MOD_VEX_0F2B */ - { "vmovntpX", { Mx, XM }, 0 }, + { "vmovntpX", { Mx, XM }, PREFIX_OPCODE }, }, { /* MOD_VEX_W_0_0F41_P_0_LEN_1 */ @@ -10732,7 +10701,7 @@ static const struct dis386 mod_table[][2] = { { /* MOD_VEX_0F50 */ { Bad_Opcode }, - { "vmovmskpX", { Gdq, XS }, 0 }, + { "vmovmskpX", { Gdq, XS }, PREFIX_OPCODE }, }, { /* MOD_VEX_0F71_REG_2 */ @@ -11018,7 +10987,7 @@ static const struct dis386 rm_table[][8] = { { /* RM_0F01_REG_3 */ { "vmrun", { Skip_MODRM }, 0 }, - { "vmmcall", { Skip_MODRM }, 0 }, + { PREFIX_TABLE (PREFIX_0F01_REG_3_RM_1) }, { "vmload", { Skip_MODRM }, 0 }, { "vmsave", { Skip_MODRM }, 0 }, { "stgi", { Skip_MODRM }, 0 }, @@ -11029,7 +10998,7 @@ static const struct dis386 rm_table[][8] = { { /* RM_0F01_REG_5_MOD_3 */ { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_0) }, - { Bad_Opcode }, + { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_1) }, { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_2) }, { Bad_Opcode }, { Bad_Opcode }, @@ -11086,7 +11055,6 @@ ckprefix (void) { int newrex, i, length; rex = 0; - rex_ignored = 0; prefixes = 0; used_prefixes = 0; rex_used = 0; @@ -11546,8 +11514,6 @@ get_valid_dis386 (const struct dis386 *dp, disassemble_info *info) case USE_XOP_8F_TABLE: FETCH_DATA (info, codep + 3); - /* All bits in the REX prefix are ignored. */ - rex_ignored = rex; rex = ~(*codep >> 5) & 0x7; /* VEX_TABLE_INDEX is the mmmmm part of the XOP byte 1 "RCB.mmmmm". */ @@ -11609,8 +11575,6 @@ get_valid_dis386 (const struct dis386 *dp, disassemble_info *info) case USE_VEX_C4_TABLE: /* VEX prefix. */ FETCH_DATA (info, codep + 3); - /* All bits in the REX prefix are ignored. */ - rex_ignored = rex; rex = ~(*codep >> 5) & 0x7; switch ((*codep & 0x1f)) { @@ -11676,8 +11640,6 @@ get_valid_dis386 (const struct dis386 *dp, disassemble_info *info) case USE_VEX_C5_TABLE: /* VEX prefix. */ FETCH_DATA (info, codep + 2); - /* All bits in the REX prefix are ignored. */ - rex_ignored = rex; rex = (*codep & 0x80) ? 0 : REX_R; /* For the 2-byte VEX prefix in 32-bit mode, the highest bit in @@ -11726,8 +11688,6 @@ get_valid_dis386 (const struct dis386 *dp, disassemble_info *info) /* EVEX prefix. */ vex.evex = 1; FETCH_DATA (info, codep + 4); - /* All bits in the REX prefix are ignored. */ - rex_ignored = rex; /* The first byte after 0x62. */ rex = ~(*codep >> 5) & 0x7; vex.r = *codep & 0x10; @@ -12208,7 +12168,7 @@ print_insn (bfd_vma pc, disassemble_info *info) } /* Check if the REX prefix is used. */ - if (rex_ignored == 0 && (rex ^ rex_used) == 0 && last_rex_prefix >= 0) + if ((rex ^ rex_used) == 0 && !need_vex && last_rex_prefix >= 0) all_prefixes[last_rex_prefix] = 0; /* Check if the SEG prefix is used. */ @@ -12224,7 +12184,8 @@ print_insn (bfd_vma pc, disassemble_info *info) /* Check if the DATA prefix is used. */ if ((prefixes & PREFIX_DATA) != 0 - && (used_prefixes & PREFIX_DATA) != 0) + && (used_prefixes & PREFIX_DATA) != 0 + && !need_vex) all_prefixes[last_data_prefix] = 0; /* Print the extra prefixes. */ @@ -12246,15 +12207,20 @@ print_insn (bfd_vma pc, disassemble_info *info) PREFIX_REPZ/PREFIX_REPNZ fix, we check the PREFIX_DATA prefix separately. */ if (dp->prefix_requirement == PREFIX_OPCODE - && dp != &bad_opcode - && (((prefixes - & (PREFIX_REPZ | PREFIX_REPNZ)) != 0 + && (((need_vex + ? vex.prefix == REPE_PREFIX_OPCODE + || vex.prefix == REPNE_PREFIX_OPCODE + : (prefixes + & (PREFIX_REPZ | PREFIX_REPNZ)) != 0) && (used_prefixes & (PREFIX_REPZ | PREFIX_REPNZ)) == 0) - || ((((prefixes - & (PREFIX_REPZ | PREFIX_REPNZ | PREFIX_DATA)) - == PREFIX_DATA) - && (used_prefixes & PREFIX_DATA) == 0)))) + || (((need_vex + ? vex.prefix == DATA_PREFIX_OPCODE + : ((prefixes + & (PREFIX_REPZ | PREFIX_REPNZ | PREFIX_DATA)) + == PREFIX_DATA)) + && (used_prefixes & PREFIX_DATA) == 0)) + || (vex.evex && !vex.w != !(used_prefixes & PREFIX_DATA)))) { (*info->fprintf_func) (info->stream, "(bad)"); return end_codep - priv.the_buffer; @@ -13210,21 +13176,15 @@ putop (const char *in_template, int sizeflag) SAVE_LAST (*p); 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'; - else - *obufp++ = 's'; + *obufp++ = 'd'; + used_prefixes |= PREFIX_DATA; } else - { - if (prefixes & PREFIX_DATA) - *obufp++ = 'd'; - else - *obufp++ = 's'; - used_prefixes |= (prefixes & PREFIX_DATA); - } + *obufp++ = 's'; break; case 'Y': if (l == 0 && len == 1) @@ -14263,10 +14223,11 @@ OP_E_memory (int bytemode, int sizeflag) } if ((havebase || haveindex || needindex || needaddr32 || riprel) - && (bytemode != v_bnd_mode) - && (bytemode != v_bndmk_mode) - && (bytemode != bnd_mode) - && (bytemode != bnd_swap_mode)) + && (address_mode != mode_64bit + || ((bytemode != v_bnd_mode) + && (bytemode != v_bndmk_mode) + && (bytemode != bnd_mode) + && (bytemode != bnd_swap_mode)))) used_prefixes |= PREFIX_ADDR; if (havedisp || (intel_syntax && riprel)) @@ -14347,6 +14308,14 @@ OP_E_memory (int bytemode, int sizeflag) } } } + else if (bytemode == v_bnd_mode + || bytemode == v_bndmk_mode + || bytemode == bnd_mode + || bytemode == bnd_swap_mode) + { + oappend ("(bad)"); + return; + } else { /* 16 bit address mode */