diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2015-04-15 09:24:45 -0700 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2015-04-15 09:57:23 -0700 |
commit | 507bd32558eb1c0054b7989d52ac1ab25cc5b0ac (patch) | |
tree | 27dff41800fe072646194a8f56bfdb4f3a5adf84 /opcodes/i386-dis.c | |
parent | f0fba320ab5effaff5255b5526a37f0987637e3e (diff) | |
download | gdb-507bd32558eb1c0054b7989d52ac1ab25cc5b0ac.zip gdb-507bd32558eb1c0054b7989d52ac1ab25cc5b0ac.tar.gz gdb-507bd32558eb1c0054b7989d52ac1ab25cc5b0ac.tar.bz2 |
Replace mandatory_prefix with prefix_requirement
* i386-dis.c (PREFIX_MANDATORY_REPZ): Removed.
(PREFIX_MANDATORY_REPNZ): Likewise.
(PREFIX_MANDATORY_DATA): Likewise.
(PREFIX_MANDATORY_ADDR): Likewise.
(PREFIX_MANDATORY_LOCK): Likewise.
(PREFIX_MANDATORY): Likewise.
(PREFIX_UD_SHIFT): Set to 8
(PREFIX_UD_REPZ): Updated.
(PREFIX_UD_REPNZ): Likewise.
(PREFIX_UD_DATA): Likewise.
(PREFIX_UD_ADDR): Likewise.
(PREFIX_UD_LOCK): Likewise.
(PREFIX_IGNORED_SHIFT): New.
(PREFIX_IGNORED_REPZ): Likewise.
(PREFIX_IGNORED_REPNZ): Likewise.
(PREFIX_IGNORED_DATA): Likewise.
(PREFIX_IGNORED_ADDR): Likewise.
(PREFIX_IGNORED_LOCK): Likewise.
(PREFIX_OPCODE): Likewise.
(PREFIX_IGNORED): Likewise.
(Bad_Opcode): Replace PREFIX_MANDATORY with 0.
(dis386_twobyte): Replace PREFIX_MANDATORY with PREFIX_OPCODE.
(three_byte_table): Likewise.
(mod_table): Likewise.
(mandatory_prefix): Renamed to ...
(prefix_requirement): This.
(prefix_table): Replace PREFIX_MANDATORY with PREFIX_OPCODE.
Update PREFIX_90 entry.
(get_valid_dis386): Check prefix_requirement to see if a prefix
should be ignored.
(print_insn): Replace mandatory_prefix with prefix_requirement.
Diffstat (limited to 'opcodes/i386-dis.c')
-rw-r--r-- | opcodes/i386-dis.c | 625 |
1 files changed, 315 insertions, 310 deletions
diff --git a/opcodes/i386-dis.c b/opcodes/i386-dis.c index 740b800..1841488 100644 --- a/opcodes/i386-dis.c +++ b/opcodes/i386-dis.c @@ -222,24 +222,31 @@ fetch_data (struct disassemble_info *info, bfd_byte *addr) } /* Possible values for prefix requirement. */ -#define PREFIX_MANDATORY_REPZ PREFIX_REPZ -#define PREFIX_MANDATORY_REPNZ PREFIX_REPNZ -#define PREFIX_MANDATORY_DATA PREFIX_DATA -#define PREFIX_MANDATORY_ADDR PREFIX_ADDR -#define PREFIX_MANDATORY_LOCK PREFIX_LOCK -#define PREFIX_UD_SHIFT 16 -#define PREFIX_UD_REPZ (PREFIX_MANDATORY_REPZ << PREFIX_UD_SHIFT) -#define PREFIX_UD_REPNZ (PREFIX_MANDATORY_REPNZ << PREFIX_UD_SHIFT) -#define PREFIX_UD_DATA (PREFIX_MANDATORY_DATA << PREFIX_UD_SHIFT) -#define PREFIX_UD_ADDR (PREFIX_MANDATORY_ADDR << PREFIX_UD_SHIFT) -#define PREFIX_UD_LOCK (PREFIX_MANDATORY_LOCK << PREFIX_UD_SHIFT) - -#define PREFIX_MANDATORY (PREFIX_MANDATORY_REPZ \ - | PREFIX_MANDATORY_REPNZ \ - | PREFIX_MANDATORY_DATA) +#define PREFIX_UD_SHIFT 8 +#define PREFIX_UD_REPZ (PREFIX_REPZ << PREFIX_UD_SHIFT) +#define PREFIX_UD_REPNZ (PREFIX_REPNZ << PREFIX_UD_SHIFT) +#define PREFIX_UD_DATA (PREFIX_DATA << PREFIX_UD_SHIFT) +#define PREFIX_UD_ADDR (PREFIX_ADDR << PREFIX_UD_SHIFT) +#define PREFIX_UD_LOCK (PREFIX_LOCK << PREFIX_UD_SHIFT) +#define PREFIX_IGNORED_SHIFT 16 +#define PREFIX_IGNORED_REPZ (PREFIX_REPZ << PREFIX_IGNORED_SHIFT) +#define PREFIX_IGNORED_REPNZ (PREFIX_REPNZ << PREFIX_IGNORED_SHIFT) +#define PREFIX_IGNORED_DATA (PREFIX_DATA << PREFIX_IGNORED_SHIFT) +#define PREFIX_IGNORED_ADDR (PREFIX_ADDR << PREFIX_IGNORED_SHIFT) +#define PREFIX_IGNORED_LOCK (PREFIX_LOCK << PREFIX_IGNORED_SHIFT) + +/* Opcode prefixes. */ +#define PREFIX_OPCODE (PREFIX_REPZ \ + | PREFIX_REPNZ \ + | PREFIX_DATA) + +/* Prefixes ignored. */ +#define PREFIX_IGNORED (PREFIX_IGNORED_REPZ \ + | PREFIX_IGNORED_REPNZ \ + | PREFIX_IGNORED_DATA) #define XX { NULL, 0 } -#define Bad_Opcode NULL, { { NULL, 0 } }, PREFIX_MANDATORY +#define Bad_Opcode NULL, { { NULL, 0 } }, 0 #define Eb { OP_E, b_mode } #define Ebnd { OP_E, bnd_mode } @@ -2744,8 +2751,8 @@ static const struct dis386 dis386_twobyte[] = { { PREFIX_TABLE (PREFIX_0F11) }, { PREFIX_TABLE (PREFIX_0F12) }, { MOD_TABLE (MOD_0F13) }, - { "unpcklpX", { XM, EXx }, PREFIX_MANDATORY }, - { "unpckhpX", { XM, EXx }, PREFIX_MANDATORY }, + { "unpcklpX", { XM, EXx }, PREFIX_OPCODE }, + { "unpckhpX", { XM, EXx }, PREFIX_OPCODE }, { PREFIX_TABLE (PREFIX_0F16) }, { MOD_TABLE (MOD_0F17) }, /* 18 */ @@ -2767,8 +2774,8 @@ static const struct dis386 dis386_twobyte[] = { { MOD_TABLE (MOD_0F26) }, { Bad_Opcode }, /* 28 */ - { "movapX", { XM, EXx }, PREFIX_MANDATORY }, - { "movapX", { EXxS, XM }, PREFIX_MANDATORY }, + { "movapX", { XM, EXx }, PREFIX_OPCODE }, + { "movapX", { EXxS, XM }, PREFIX_OPCODE }, { PREFIX_TABLE (PREFIX_0F2A) }, { PREFIX_TABLE (PREFIX_0F2B) }, { PREFIX_TABLE (PREFIX_0F2C) }, @@ -2785,9 +2792,9 @@ static const struct dis386 dis386_twobyte[] = { { Bad_Opcode }, { "getsec", { XX }, 0 }, /* 38 */ - { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F38, PREFIX_MANDATORY) }, + { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F38, PREFIX_OPCODE) }, { Bad_Opcode }, - { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F3A, PREFIX_MANDATORY) }, + { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F3A, PREFIX_OPCODE) }, { Bad_Opcode }, { Bad_Opcode }, { Bad_Opcode }, @@ -2816,10 +2823,10 @@ static const struct dis386 dis386_twobyte[] = { { PREFIX_TABLE (PREFIX_0F51) }, { PREFIX_TABLE (PREFIX_0F52) }, { PREFIX_TABLE (PREFIX_0F53) }, - { "andpX", { XM, EXx }, PREFIX_MANDATORY }, - { "andnpX", { XM, EXx }, PREFIX_MANDATORY }, - { "orpX", { XM, EXx }, PREFIX_MANDATORY }, - { "xorpX", { XM, EXx }, PREFIX_MANDATORY }, + { "andpX", { XM, EXx }, PREFIX_OPCODE }, + { "andnpX", { XM, EXx }, PREFIX_OPCODE }, + { "orpX", { XM, EXx }, PREFIX_OPCODE }, + { "xorpX", { XM, EXx }, PREFIX_OPCODE }, /* 58 */ { PREFIX_TABLE (PREFIX_0F58) }, { PREFIX_TABLE (PREFIX_0F59) }, @@ -2833,29 +2840,29 @@ static const struct dis386 dis386_twobyte[] = { { PREFIX_TABLE (PREFIX_0F60) }, { PREFIX_TABLE (PREFIX_0F61) }, { PREFIX_TABLE (PREFIX_0F62) }, - { "packsswb", { MX, EM }, PREFIX_MANDATORY }, - { "pcmpgtb", { MX, EM }, PREFIX_MANDATORY }, - { "pcmpgtw", { MX, EM }, PREFIX_MANDATORY }, - { "pcmpgtd", { MX, EM }, PREFIX_MANDATORY }, - { "packuswb", { MX, EM }, PREFIX_MANDATORY }, + { "packsswb", { MX, EM }, PREFIX_OPCODE }, + { "pcmpgtb", { MX, EM }, PREFIX_OPCODE }, + { "pcmpgtw", { MX, EM }, PREFIX_OPCODE }, + { "pcmpgtd", { MX, EM }, PREFIX_OPCODE }, + { "packuswb", { MX, EM }, PREFIX_OPCODE }, /* 68 */ - { "punpckhbw", { MX, EM }, PREFIX_MANDATORY }, - { "punpckhwd", { MX, EM }, PREFIX_MANDATORY }, - { "punpckhdq", { MX, EM }, PREFIX_MANDATORY }, - { "packssdw", { MX, EM }, PREFIX_MANDATORY }, + { "punpckhbw", { MX, EM }, PREFIX_OPCODE }, + { "punpckhwd", { MX, EM }, PREFIX_OPCODE }, + { "punpckhdq", { MX, EM }, PREFIX_OPCODE }, + { "packssdw", { MX, EM }, PREFIX_OPCODE }, { PREFIX_TABLE (PREFIX_0F6C) }, { PREFIX_TABLE (PREFIX_0F6D) }, - { "movK", { MX, Edq }, PREFIX_MANDATORY }, + { "movK", { MX, Edq }, PREFIX_OPCODE }, { PREFIX_TABLE (PREFIX_0F6F) }, /* 70 */ { PREFIX_TABLE (PREFIX_0F70) }, { REG_TABLE (REG_0F71) }, { REG_TABLE (REG_0F72) }, { REG_TABLE (REG_0F73) }, - { "pcmpeqb", { MX, EM }, PREFIX_MANDATORY }, - { "pcmpeqw", { MX, EM }, PREFIX_MANDATORY }, - { "pcmpeqd", { MX, EM }, PREFIX_MANDATORY }, - { "emms", { XX }, PREFIX_MANDATORY }, + { "pcmpeqb", { MX, EM }, PREFIX_OPCODE }, + { "pcmpeqw", { MX, EM }, PREFIX_OPCODE }, + { "pcmpeqd", { MX, EM }, PREFIX_OPCODE }, + { "emms", { XX }, PREFIX_OPCODE }, /* 78 */ { PREFIX_TABLE (PREFIX_0F78) }, { PREFIX_TABLE (PREFIX_0F79) }, @@ -2942,9 +2949,9 @@ static const struct dis386 dis386_twobyte[] = { { "xaddS", { Evh1, Gv }, 0 }, { PREFIX_TABLE (PREFIX_0FC2) }, { PREFIX_TABLE (PREFIX_0FC3) }, - { "pinsrw", { MX, Edqw, Ib }, PREFIX_MANDATORY }, - { "pextrw", { Gdq, MS, Ib }, PREFIX_MANDATORY }, - { "shufpX", { XM, EXx, Ib }, PREFIX_MANDATORY }, + { "pinsrw", { MX, Edqw, Ib }, PREFIX_OPCODE }, + { "pextrw", { Gdq, MS, Ib }, PREFIX_OPCODE }, + { "shufpX", { XM, EXx, Ib }, PREFIX_OPCODE }, { REG_TABLE (REG_0FC7) }, /* c8 */ { "bswap", { RMeAX }, 0 }, @@ -2957,57 +2964,57 @@ static const struct dis386 dis386_twobyte[] = { { "bswap", { RMeDI }, 0 }, /* d0 */ { PREFIX_TABLE (PREFIX_0FD0) }, - { "psrlw", { MX, EM }, PREFIX_MANDATORY }, - { "psrld", { MX, EM }, PREFIX_MANDATORY }, - { "psrlq", { MX, EM }, PREFIX_MANDATORY }, - { "paddq", { MX, EM }, PREFIX_MANDATORY }, - { "pmullw", { MX, EM }, PREFIX_MANDATORY }, + { "psrlw", { MX, EM }, PREFIX_OPCODE }, + { "psrld", { MX, EM }, PREFIX_OPCODE }, + { "psrlq", { MX, EM }, PREFIX_OPCODE }, + { "paddq", { MX, EM }, PREFIX_OPCODE }, + { "pmullw", { MX, EM }, PREFIX_OPCODE }, { PREFIX_TABLE (PREFIX_0FD6) }, { MOD_TABLE (MOD_0FD7) }, /* d8 */ - { "psubusb", { MX, EM }, PREFIX_MANDATORY }, - { "psubusw", { MX, EM }, PREFIX_MANDATORY }, - { "pminub", { MX, EM }, PREFIX_MANDATORY }, - { "pand", { MX, EM }, PREFIX_MANDATORY }, - { "paddusb", { MX, EM }, PREFIX_MANDATORY }, - { "paddusw", { MX, EM }, PREFIX_MANDATORY }, - { "pmaxub", { MX, EM }, PREFIX_MANDATORY }, - { "pandn", { MX, EM }, PREFIX_MANDATORY }, + { "psubusb", { MX, EM }, PREFIX_OPCODE }, + { "psubusw", { MX, EM }, PREFIX_OPCODE }, + { "pminub", { MX, EM }, PREFIX_OPCODE }, + { "pand", { MX, EM }, PREFIX_OPCODE }, + { "paddusb", { MX, EM }, PREFIX_OPCODE }, + { "paddusw", { MX, EM }, PREFIX_OPCODE }, + { "pmaxub", { MX, EM }, PREFIX_OPCODE }, + { "pandn", { MX, EM }, PREFIX_OPCODE }, /* e0 */ - { "pavgb", { MX, EM }, PREFIX_MANDATORY }, - { "psraw", { MX, EM }, PREFIX_MANDATORY }, - { "psrad", { MX, EM }, PREFIX_MANDATORY }, - { "pavgw", { MX, EM }, PREFIX_MANDATORY }, - { "pmulhuw", { MX, EM }, PREFIX_MANDATORY }, - { "pmulhw", { MX, EM }, PREFIX_MANDATORY }, + { "pavgb", { MX, EM }, PREFIX_OPCODE }, + { "psraw", { MX, EM }, PREFIX_OPCODE }, + { "psrad", { MX, EM }, PREFIX_OPCODE }, + { "pavgw", { MX, EM }, PREFIX_OPCODE }, + { "pmulhuw", { MX, EM }, PREFIX_OPCODE }, + { "pmulhw", { MX, EM }, PREFIX_OPCODE }, { PREFIX_TABLE (PREFIX_0FE6) }, { PREFIX_TABLE (PREFIX_0FE7) }, /* e8 */ - { "psubsb", { MX, EM }, PREFIX_MANDATORY }, - { "psubsw", { MX, EM }, PREFIX_MANDATORY }, - { "pminsw", { MX, EM }, PREFIX_MANDATORY }, - { "por", { MX, EM }, PREFIX_MANDATORY }, - { "paddsb", { MX, EM }, PREFIX_MANDATORY }, - { "paddsw", { MX, EM }, PREFIX_MANDATORY }, - { "pmaxsw", { MX, EM }, PREFIX_MANDATORY }, - { "pxor", { MX, EM }, PREFIX_MANDATORY }, + { "psubsb", { MX, EM }, PREFIX_OPCODE }, + { "psubsw", { MX, EM }, PREFIX_OPCODE }, + { "pminsw", { MX, EM }, PREFIX_OPCODE }, + { "por", { MX, EM }, PREFIX_OPCODE }, + { "paddsb", { MX, EM }, PREFIX_OPCODE }, + { "paddsw", { MX, EM }, PREFIX_OPCODE }, + { "pmaxsw", { MX, EM }, PREFIX_OPCODE }, + { "pxor", { MX, EM }, PREFIX_OPCODE }, /* f0 */ { PREFIX_TABLE (PREFIX_0FF0) }, - { "psllw", { MX, EM }, PREFIX_MANDATORY }, - { "pslld", { MX, EM }, PREFIX_MANDATORY }, - { "psllq", { MX, EM }, PREFIX_MANDATORY }, - { "pmuludq", { MX, EM }, PREFIX_MANDATORY }, - { "pmaddwd", { MX, EM }, PREFIX_MANDATORY }, - { "psadbw", { MX, EM }, PREFIX_MANDATORY }, + { "psllw", { MX, EM }, PREFIX_OPCODE }, + { "pslld", { MX, EM }, PREFIX_OPCODE }, + { "psllq", { MX, EM }, PREFIX_OPCODE }, + { "pmuludq", { MX, EM }, PREFIX_OPCODE }, + { "pmaddwd", { MX, EM }, PREFIX_OPCODE }, + { "psadbw", { MX, EM }, PREFIX_OPCODE }, { PREFIX_TABLE (PREFIX_0FF7) }, /* f8 */ - { "psubb", { MX, EM }, PREFIX_MANDATORY }, - { "psubw", { MX, EM }, PREFIX_MANDATORY }, - { "psubd", { MX, EM }, PREFIX_MANDATORY }, - { "psubq", { MX, EM }, PREFIX_MANDATORY }, - { "paddb", { MX, EM }, PREFIX_MANDATORY }, - { "paddw", { MX, EM }, PREFIX_MANDATORY }, - { "paddd", { MX, EM }, PREFIX_MANDATORY }, + { "psubb", { MX, EM }, PREFIX_OPCODE }, + { "psubw", { MX, EM }, PREFIX_OPCODE }, + { "psubd", { MX, EM }, PREFIX_OPCODE }, + { "psubq", { MX, EM }, PREFIX_OPCODE }, + { "paddb", { MX, EM }, PREFIX_OPCODE }, + { "paddw", { MX, EM }, PREFIX_OPCODE }, + { "paddd", { MX, EM }, PREFIX_OPCODE }, { Bad_Opcode }, }; @@ -3074,7 +3081,7 @@ static int last_rex_prefix; static int last_seg_prefix; static int fwait_prefix; /* The PREFIX_REPZ/PREFIX_REPNZ/PREFIX_DATA prefix is mandatory. */ -static int mandatory_prefix; +static int prefix_requirement; /* The active segment register prefix. */ static int active_seg_prefix; #define MAX_CODE_LENGTH 15 @@ -3673,37 +3680,38 @@ static const struct dis386 prefix_table[][4] = { { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } }, 0 }, { "pause", { XX }, 0 }, { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } }, 0 }, + { NULL, { { NULL, 0 } }, PREFIX_IGNORED } }, /* PREFIX_0F10 */ { - { "movups", { XM, EXx }, PREFIX_MANDATORY }, - { "movss", { XM, EXd }, PREFIX_MANDATORY }, - { "movupd", { XM, EXx }, PREFIX_MANDATORY }, - { "movsd", { XM, EXq }, PREFIX_MANDATORY }, + { "movups", { XM, EXx }, PREFIX_OPCODE }, + { "movss", { XM, EXd }, PREFIX_OPCODE }, + { "movupd", { XM, EXx }, PREFIX_OPCODE }, + { "movsd", { XM, EXq }, PREFIX_OPCODE }, }, /* PREFIX_0F11 */ { - { "movups", { EXxS, XM }, PREFIX_MANDATORY }, - { "movss", { EXdS, XM }, PREFIX_MANDATORY }, - { "movupd", { EXxS, XM }, PREFIX_MANDATORY }, - { "movsd", { EXqS, XM }, PREFIX_MANDATORY }, + { "movups", { EXxS, XM }, PREFIX_OPCODE }, + { "movss", { EXdS, XM }, PREFIX_OPCODE }, + { "movupd", { EXxS, XM }, PREFIX_OPCODE }, + { "movsd", { EXqS, XM }, PREFIX_OPCODE }, }, /* PREFIX_0F12 */ { { MOD_TABLE (MOD_0F12_PREFIX_0) }, - { "movsldup", { XM, EXx }, PREFIX_MANDATORY }, - { "movlpd", { XM, EXq }, PREFIX_MANDATORY }, - { "movddup", { XM, EXq }, PREFIX_MANDATORY }, + { "movsldup", { XM, EXx }, PREFIX_OPCODE }, + { "movlpd", { XM, EXq }, PREFIX_OPCODE }, + { "movddup", { XM, EXq }, PREFIX_OPCODE }, }, /* PREFIX_0F16 */ { { MOD_TABLE (MOD_0F16_PREFIX_0) }, - { "movshdup", { XM, EXx }, PREFIX_MANDATORY }, - { "movhpd", { XM, EXq }, PREFIX_MANDATORY }, + { "movshdup", { XM, EXx }, PREFIX_OPCODE }, + { "movhpd", { XM, EXq }, PREFIX_OPCODE }, }, /* PREFIX_0F1A */ @@ -3724,9 +3732,9 @@ static const struct dis386 prefix_table[][4] = { /* PREFIX_0F2A */ { - { "cvtpi2ps", { XM, EMCq }, PREFIX_MANDATORY }, - { "cvtsi2ss%LQ", { XM, Ev }, PREFIX_MANDATORY }, - { "cvtpi2pd", { XM, EMCq }, PREFIX_MANDATORY }, + { "cvtpi2ps", { XM, EMCq }, PREFIX_OPCODE }, + { "cvtsi2ss%LQ", { XM, Ev }, PREFIX_OPCODE }, + { "cvtpi2pd", { XM, EMCq }, PREFIX_OPCODE }, { "cvtsi2sd%LQ", { XM, Ev }, 0 }, }, @@ -3740,18 +3748,18 @@ static const struct dis386 prefix_table[][4] = { /* PREFIX_0F2C */ { - { "cvttps2pi", { MXC, EXq }, PREFIX_MANDATORY }, - { "cvttss2siY", { Gv, EXd }, PREFIX_MANDATORY }, - { "cvttpd2pi", { MXC, EXx }, PREFIX_MANDATORY }, - { "cvttsd2siY", { Gv, EXq }, PREFIX_MANDATORY }, + { "cvttps2pi", { MXC, EXq }, PREFIX_OPCODE }, + { "cvttss2siY", { Gv, EXd }, PREFIX_OPCODE }, + { "cvttpd2pi", { MXC, EXx }, PREFIX_OPCODE }, + { "cvttsd2siY", { Gv, EXq }, PREFIX_OPCODE }, }, /* PREFIX_0F2D */ { - { "cvtps2pi", { MXC, EXq }, PREFIX_MANDATORY }, - { "cvtss2siY", { Gv, EXd }, PREFIX_MANDATORY }, - { "cvtpd2pi", { MXC, EXx }, PREFIX_MANDATORY }, - { "cvtsd2siY", { Gv, EXq }, PREFIX_MANDATORY }, + { "cvtps2pi", { MXC, EXq }, PREFIX_OPCODE }, + { "cvtss2siY", { Gv, EXd }, PREFIX_OPCODE }, + { "cvtpd2pi", { MXC, EXx }, PREFIX_OPCODE }, + { "cvtsd2siY", { Gv, EXq }, PREFIX_OPCODE }, }, /* PREFIX_0F2E */ @@ -3770,135 +3778,135 @@ static const struct dis386 prefix_table[][4] = { /* PREFIX_0F51 */ { - { "sqrtps", { XM, EXx }, PREFIX_MANDATORY }, - { "sqrtss", { XM, EXd }, PREFIX_MANDATORY }, - { "sqrtpd", { XM, EXx }, PREFIX_MANDATORY }, - { "sqrtsd", { XM, EXq }, PREFIX_MANDATORY }, + { "sqrtps", { XM, EXx }, PREFIX_OPCODE }, + { "sqrtss", { XM, EXd }, PREFIX_OPCODE }, + { "sqrtpd", { XM, EXx }, PREFIX_OPCODE }, + { "sqrtsd", { XM, EXq }, PREFIX_OPCODE }, }, /* PREFIX_0F52 */ { - { "rsqrtps",{ XM, EXx }, PREFIX_MANDATORY }, - { "rsqrtss",{ XM, EXd }, PREFIX_MANDATORY }, + { "rsqrtps",{ XM, EXx }, PREFIX_OPCODE }, + { "rsqrtss",{ XM, EXd }, PREFIX_OPCODE }, }, /* PREFIX_0F53 */ { - { "rcpps", { XM, EXx }, PREFIX_MANDATORY }, - { "rcpss", { XM, EXd }, PREFIX_MANDATORY }, + { "rcpps", { XM, EXx }, PREFIX_OPCODE }, + { "rcpss", { XM, EXd }, PREFIX_OPCODE }, }, /* PREFIX_0F58 */ { - { "addps", { XM, EXx }, PREFIX_MANDATORY }, - { "addss", { XM, EXd }, PREFIX_MANDATORY }, - { "addpd", { XM, EXx }, PREFIX_MANDATORY }, - { "addsd", { XM, EXq }, PREFIX_MANDATORY }, + { "addps", { XM, EXx }, PREFIX_OPCODE }, + { "addss", { XM, EXd }, PREFIX_OPCODE }, + { "addpd", { XM, EXx }, PREFIX_OPCODE }, + { "addsd", { XM, EXq }, PREFIX_OPCODE }, }, /* PREFIX_0F59 */ { - { "mulps", { XM, EXx }, PREFIX_MANDATORY }, - { "mulss", { XM, EXd }, PREFIX_MANDATORY }, - { "mulpd", { XM, EXx }, PREFIX_MANDATORY }, - { "mulsd", { XM, EXq }, PREFIX_MANDATORY }, + { "mulps", { XM, EXx }, PREFIX_OPCODE }, + { "mulss", { XM, EXd }, PREFIX_OPCODE }, + { "mulpd", { XM, EXx }, PREFIX_OPCODE }, + { "mulsd", { XM, EXq }, PREFIX_OPCODE }, }, /* PREFIX_0F5A */ { - { "cvtps2pd", { XM, EXq }, PREFIX_MANDATORY }, - { "cvtss2sd", { XM, EXd }, PREFIX_MANDATORY }, - { "cvtpd2ps", { XM, EXx }, PREFIX_MANDATORY }, - { "cvtsd2ss", { XM, EXq }, PREFIX_MANDATORY }, + { "cvtps2pd", { XM, EXq }, PREFIX_OPCODE }, + { "cvtss2sd", { XM, EXd }, PREFIX_OPCODE }, + { "cvtpd2ps", { XM, EXx }, PREFIX_OPCODE }, + { "cvtsd2ss", { XM, EXq }, PREFIX_OPCODE }, }, /* PREFIX_0F5B */ { - { "cvtdq2ps", { XM, EXx }, PREFIX_MANDATORY }, - { "cvttps2dq", { XM, EXx }, PREFIX_MANDATORY }, - { "cvtps2dq", { XM, EXx }, PREFIX_MANDATORY }, + { "cvtdq2ps", { XM, EXx }, PREFIX_OPCODE }, + { "cvttps2dq", { XM, EXx }, PREFIX_OPCODE }, + { "cvtps2dq", { XM, EXx }, PREFIX_OPCODE }, }, /* PREFIX_0F5C */ { - { "subps", { XM, EXx }, PREFIX_MANDATORY }, - { "subss", { XM, EXd }, PREFIX_MANDATORY }, - { "subpd", { XM, EXx }, PREFIX_MANDATORY }, - { "subsd", { XM, EXq }, PREFIX_MANDATORY }, + { "subps", { XM, EXx }, PREFIX_OPCODE }, + { "subss", { XM, EXd }, PREFIX_OPCODE }, + { "subpd", { XM, EXx }, PREFIX_OPCODE }, + { "subsd", { XM, EXq }, PREFIX_OPCODE }, }, /* PREFIX_0F5D */ { - { "minps", { XM, EXx }, PREFIX_MANDATORY }, - { "minss", { XM, EXd }, PREFIX_MANDATORY }, - { "minpd", { XM, EXx }, PREFIX_MANDATORY }, - { "minsd", { XM, EXq }, PREFIX_MANDATORY }, + { "minps", { XM, EXx }, PREFIX_OPCODE }, + { "minss", { XM, EXd }, PREFIX_OPCODE }, + { "minpd", { XM, EXx }, PREFIX_OPCODE }, + { "minsd", { XM, EXq }, PREFIX_OPCODE }, }, /* PREFIX_0F5E */ { - { "divps", { XM, EXx }, PREFIX_MANDATORY }, - { "divss", { XM, EXd }, PREFIX_MANDATORY }, - { "divpd", { XM, EXx }, PREFIX_MANDATORY }, - { "divsd", { XM, EXq }, PREFIX_MANDATORY }, + { "divps", { XM, EXx }, PREFIX_OPCODE }, + { "divss", { XM, EXd }, PREFIX_OPCODE }, + { "divpd", { XM, EXx }, PREFIX_OPCODE }, + { "divsd", { XM, EXq }, PREFIX_OPCODE }, }, /* PREFIX_0F5F */ { - { "maxps", { XM, EXx }, PREFIX_MANDATORY }, - { "maxss", { XM, EXd }, PREFIX_MANDATORY }, - { "maxpd", { XM, EXx }, PREFIX_MANDATORY }, - { "maxsd", { XM, EXq }, PREFIX_MANDATORY }, + { "maxps", { XM, EXx }, PREFIX_OPCODE }, + { "maxss", { XM, EXd }, PREFIX_OPCODE }, + { "maxpd", { XM, EXx }, PREFIX_OPCODE }, + { "maxsd", { XM, EXq }, PREFIX_OPCODE }, }, /* PREFIX_0F60 */ { - { "punpcklbw",{ MX, EMd }, PREFIX_MANDATORY }, + { "punpcklbw",{ MX, EMd }, PREFIX_OPCODE }, { Bad_Opcode }, - { "punpcklbw",{ MX, EMx }, PREFIX_MANDATORY }, + { "punpcklbw",{ MX, EMx }, PREFIX_OPCODE }, }, /* PREFIX_0F61 */ { - { "punpcklwd",{ MX, EMd }, PREFIX_MANDATORY }, + { "punpcklwd",{ MX, EMd }, PREFIX_OPCODE }, { Bad_Opcode }, - { "punpcklwd",{ MX, EMx }, PREFIX_MANDATORY }, + { "punpcklwd",{ MX, EMx }, PREFIX_OPCODE }, }, /* PREFIX_0F62 */ { - { "punpckldq",{ MX, EMd }, PREFIX_MANDATORY }, + { "punpckldq",{ MX, EMd }, PREFIX_OPCODE }, { Bad_Opcode }, - { "punpckldq",{ MX, EMx }, PREFIX_MANDATORY }, + { "punpckldq",{ MX, EMx }, PREFIX_OPCODE }, }, /* PREFIX_0F6C */ { { Bad_Opcode }, { Bad_Opcode }, - { "punpcklqdq", { XM, EXx }, PREFIX_MANDATORY }, + { "punpcklqdq", { XM, EXx }, PREFIX_OPCODE }, }, /* PREFIX_0F6D */ { { Bad_Opcode }, { Bad_Opcode }, - { "punpckhqdq", { XM, EXx }, PREFIX_MANDATORY }, + { "punpckhqdq", { XM, EXx }, PREFIX_OPCODE }, }, /* PREFIX_0F6F */ { - { "movq", { MX, EM }, PREFIX_MANDATORY }, - { "movdqu", { XM, EXx }, PREFIX_MANDATORY }, - { "movdqa", { XM, EXx }, PREFIX_MANDATORY }, + { "movq", { MX, EM }, PREFIX_OPCODE }, + { "movdqu", { XM, EXx }, PREFIX_OPCODE }, + { "movdqa", { XM, EXx }, PREFIX_OPCODE }, }, /* PREFIX_0F70 */ { - { "pshufw", { MX, EM, Ib }, PREFIX_MANDATORY }, - { "pshufhw",{ XM, EXx, Ib }, PREFIX_MANDATORY }, - { "pshufd", { XM, EXx, Ib }, PREFIX_MANDATORY }, - { "pshuflw",{ XM, EXx, Ib }, PREFIX_MANDATORY }, + { "pshufw", { MX, EM, Ib }, PREFIX_OPCODE }, + { "pshufhw",{ XM, EXx, Ib }, PREFIX_OPCODE }, + { "pshufd", { XM, EXx, Ib }, PREFIX_OPCODE }, + { "pshuflw",{ XM, EXx, Ib }, PREFIX_OPCODE }, }, /* PREFIX_0F73_REG_3 */ @@ -3935,30 +3943,30 @@ static const struct dis386 prefix_table[][4] = { { { Bad_Opcode }, { Bad_Opcode }, - { "haddpd", { XM, EXx }, PREFIX_MANDATORY }, - { "haddps", { XM, EXx }, PREFIX_MANDATORY }, + { "haddpd", { XM, EXx }, PREFIX_OPCODE }, + { "haddps", { XM, EXx }, PREFIX_OPCODE }, }, /* PREFIX_0F7D */ { { Bad_Opcode }, { Bad_Opcode }, - { "hsubpd", { XM, EXx }, PREFIX_MANDATORY }, - { "hsubps", { XM, EXx }, PREFIX_MANDATORY }, + { "hsubpd", { XM, EXx }, PREFIX_OPCODE }, + { "hsubps", { XM, EXx }, PREFIX_OPCODE }, }, /* PREFIX_0F7E */ { - { "movK", { Edq, MX }, PREFIX_MANDATORY }, - { "movq", { XM, EXq }, PREFIX_MANDATORY }, - { "movK", { Edq, XM }, PREFIX_MANDATORY }, + { "movK", { Edq, MX }, PREFIX_OPCODE }, + { "movq", { XM, EXq }, PREFIX_OPCODE }, + { "movK", { Edq, XM }, PREFIX_OPCODE }, }, /* PREFIX_0F7F */ { - { "movq", { EMS, MX }, PREFIX_MANDATORY }, - { "movdqu", { EXxS, XM }, PREFIX_MANDATORY }, - { "movdqa", { EXxS, XM }, PREFIX_MANDATORY }, + { "movq", { EMS, MX }, PREFIX_OPCODE }, + { "movdqu", { EXxS, XM }, PREFIX_OPCODE }, + { "movdqa", { EXxS, XM }, PREFIX_OPCODE }, }, /* PREFIX_0FAE_REG_0 */ @@ -4028,15 +4036,15 @@ static const struct dis386 prefix_table[][4] = { /* PREFIX_0FC2 */ { - { "cmpps", { XM, EXx, CMP }, PREFIX_MANDATORY }, - { "cmpss", { XM, EXd, CMP }, PREFIX_MANDATORY }, - { "cmppd", { XM, EXx, CMP }, PREFIX_MANDATORY }, - { "cmpsd", { XM, EXq, CMP }, PREFIX_MANDATORY }, + { "cmpps", { XM, EXx, CMP }, PREFIX_OPCODE }, + { "cmpss", { XM, EXd, CMP }, PREFIX_OPCODE }, + { "cmppd", { XM, EXx, CMP }, PREFIX_OPCODE }, + { "cmpsd", { XM, EXq, CMP }, PREFIX_OPCODE }, }, /* PREFIX_0FC3 */ { - { "movntiS", { Ma, Gv }, PREFIX_MANDATORY }, + { "movntiS", { Ma, Gv }, PREFIX_OPCODE }, }, /* PREFIX_0FC7_REG_6 */ @@ -4065,14 +4073,14 @@ static const struct dis386 prefix_table[][4] = { /* PREFIX_0FE6 */ { { Bad_Opcode }, - { "cvtdq2pd", { XM, EXq }, PREFIX_MANDATORY }, - { "cvttpd2dq", { XM, EXx }, PREFIX_MANDATORY }, - { "cvtpd2dq", { XM, EXx }, PREFIX_MANDATORY }, + { "cvtdq2pd", { XM, EXq }, PREFIX_OPCODE }, + { "cvttpd2dq", { XM, EXx }, PREFIX_OPCODE }, + { "cvtpd2dq", { XM, EXx }, PREFIX_OPCODE }, }, /* PREFIX_0FE7 */ { - { "movntq", { Mq, MX }, PREFIX_MANDATORY }, + { "movntq", { Mq, MX }, PREFIX_OPCODE }, { Bad_Opcode }, { MOD_TABLE (MOD_0FE7_PREFIX_2) }, }, @@ -4087,93 +4095,93 @@ static const struct dis386 prefix_table[][4] = { /* PREFIX_0FF7 */ { - { "maskmovq", { MX, MS }, PREFIX_MANDATORY }, + { "maskmovq", { MX, MS }, PREFIX_OPCODE }, { Bad_Opcode }, - { "maskmovdqu", { XM, XS }, PREFIX_MANDATORY }, + { "maskmovdqu", { XM, XS }, PREFIX_OPCODE }, }, /* PREFIX_0F3810 */ { { Bad_Opcode }, { Bad_Opcode }, - { "pblendvb", { XM, EXx, XMM0 }, PREFIX_MANDATORY }, + { "pblendvb", { XM, EXx, XMM0 }, PREFIX_OPCODE }, }, /* PREFIX_0F3814 */ { { Bad_Opcode }, { Bad_Opcode }, - { "blendvps", { XM, EXx, XMM0 }, PREFIX_MANDATORY }, + { "blendvps", { XM, EXx, XMM0 }, PREFIX_OPCODE }, }, /* PREFIX_0F3815 */ { { Bad_Opcode }, { Bad_Opcode }, - { "blendvpd", { XM, EXx, XMM0 }, PREFIX_MANDATORY }, + { "blendvpd", { XM, EXx, XMM0 }, PREFIX_OPCODE }, }, /* PREFIX_0F3817 */ { { Bad_Opcode }, { Bad_Opcode }, - { "ptest", { XM, EXx }, PREFIX_MANDATORY }, + { "ptest", { XM, EXx }, PREFIX_OPCODE }, }, /* PREFIX_0F3820 */ { { Bad_Opcode }, { Bad_Opcode }, - { "pmovsxbw", { XM, EXq }, PREFIX_MANDATORY }, + { "pmovsxbw", { XM, EXq }, PREFIX_OPCODE }, }, /* PREFIX_0F3821 */ { { Bad_Opcode }, { Bad_Opcode }, - { "pmovsxbd", { XM, EXd }, PREFIX_MANDATORY }, + { "pmovsxbd", { XM, EXd }, PREFIX_OPCODE }, }, /* PREFIX_0F3822 */ { { Bad_Opcode }, { Bad_Opcode }, - { "pmovsxbq", { XM, EXw }, PREFIX_MANDATORY }, + { "pmovsxbq", { XM, EXw }, PREFIX_OPCODE }, }, /* PREFIX_0F3823 */ { { Bad_Opcode }, { Bad_Opcode }, - { "pmovsxwd", { XM, EXq }, PREFIX_MANDATORY }, + { "pmovsxwd", { XM, EXq }, PREFIX_OPCODE }, }, /* PREFIX_0F3824 */ { { Bad_Opcode }, { Bad_Opcode }, - { "pmovsxwq", { XM, EXd }, PREFIX_MANDATORY }, + { "pmovsxwq", { XM, EXd }, PREFIX_OPCODE }, }, /* PREFIX_0F3825 */ { { Bad_Opcode }, { Bad_Opcode }, - { "pmovsxdq", { XM, EXq }, PREFIX_MANDATORY }, + { "pmovsxdq", { XM, EXq }, PREFIX_OPCODE }, }, /* PREFIX_0F3828 */ { { Bad_Opcode }, { Bad_Opcode }, - { "pmuldq", { XM, EXx }, PREFIX_MANDATORY }, + { "pmuldq", { XM, EXx }, PREFIX_OPCODE }, }, /* PREFIX_0F3829 */ { { Bad_Opcode }, { Bad_Opcode }, - { "pcmpeqq", { XM, EXx }, PREFIX_MANDATORY }, + { "pcmpeqq", { XM, EXx }, PREFIX_OPCODE }, }, /* PREFIX_0F382A */ @@ -4187,235 +4195,235 @@ static const struct dis386 prefix_table[][4] = { { { Bad_Opcode }, { Bad_Opcode }, - { "packusdw", { XM, EXx }, PREFIX_MANDATORY }, + { "packusdw", { XM, EXx }, PREFIX_OPCODE }, }, /* PREFIX_0F3830 */ { { Bad_Opcode }, { Bad_Opcode }, - { "pmovzxbw", { XM, EXq }, PREFIX_MANDATORY }, + { "pmovzxbw", { XM, EXq }, PREFIX_OPCODE }, }, /* PREFIX_0F3831 */ { { Bad_Opcode }, { Bad_Opcode }, - { "pmovzxbd", { XM, EXd }, PREFIX_MANDATORY }, + { "pmovzxbd", { XM, EXd }, PREFIX_OPCODE }, }, /* PREFIX_0F3832 */ { { Bad_Opcode }, { Bad_Opcode }, - { "pmovzxbq", { XM, EXw }, PREFIX_MANDATORY }, + { "pmovzxbq", { XM, EXw }, PREFIX_OPCODE }, }, /* PREFIX_0F3833 */ { { Bad_Opcode }, { Bad_Opcode }, - { "pmovzxwd", { XM, EXq }, PREFIX_MANDATORY }, + { "pmovzxwd", { XM, EXq }, PREFIX_OPCODE }, }, /* PREFIX_0F3834 */ { { Bad_Opcode }, { Bad_Opcode }, - { "pmovzxwq", { XM, EXd }, PREFIX_MANDATORY }, + { "pmovzxwq", { XM, EXd }, PREFIX_OPCODE }, }, /* PREFIX_0F3835 */ { { Bad_Opcode }, { Bad_Opcode }, - { "pmovzxdq", { XM, EXq }, PREFIX_MANDATORY }, + { "pmovzxdq", { XM, EXq }, PREFIX_OPCODE }, }, /* PREFIX_0F3837 */ { { Bad_Opcode }, { Bad_Opcode }, - { "pcmpgtq", { XM, EXx }, PREFIX_MANDATORY }, + { "pcmpgtq", { XM, EXx }, PREFIX_OPCODE }, }, /* PREFIX_0F3838 */ { { Bad_Opcode }, { Bad_Opcode }, - { "pminsb", { XM, EXx }, PREFIX_MANDATORY }, + { "pminsb", { XM, EXx }, PREFIX_OPCODE }, }, /* PREFIX_0F3839 */ { { Bad_Opcode }, { Bad_Opcode }, - { "pminsd", { XM, EXx }, PREFIX_MANDATORY }, + { "pminsd", { XM, EXx }, PREFIX_OPCODE }, }, /* PREFIX_0F383A */ { { Bad_Opcode }, { Bad_Opcode }, - { "pminuw", { XM, EXx }, PREFIX_MANDATORY }, + { "pminuw", { XM, EXx }, PREFIX_OPCODE }, }, /* PREFIX_0F383B */ { { Bad_Opcode }, { Bad_Opcode }, - { "pminud", { XM, EXx }, PREFIX_MANDATORY }, + { "pminud", { XM, EXx }, PREFIX_OPCODE }, }, /* PREFIX_0F383C */ { { Bad_Opcode }, { Bad_Opcode }, - { "pmaxsb", { XM, EXx }, PREFIX_MANDATORY }, + { "pmaxsb", { XM, EXx }, PREFIX_OPCODE }, }, /* PREFIX_0F383D */ { { Bad_Opcode }, { Bad_Opcode }, - { "pmaxsd", { XM, EXx }, PREFIX_MANDATORY }, + { "pmaxsd", { XM, EXx }, PREFIX_OPCODE }, }, /* PREFIX_0F383E */ { { Bad_Opcode }, { Bad_Opcode }, - { "pmaxuw", { XM, EXx }, PREFIX_MANDATORY }, + { "pmaxuw", { XM, EXx }, PREFIX_OPCODE }, }, /* PREFIX_0F383F */ { { Bad_Opcode }, { Bad_Opcode }, - { "pmaxud", { XM, EXx }, PREFIX_MANDATORY }, + { "pmaxud", { XM, EXx }, PREFIX_OPCODE }, }, /* PREFIX_0F3840 */ { { Bad_Opcode }, { Bad_Opcode }, - { "pmulld", { XM, EXx }, PREFIX_MANDATORY }, + { "pmulld", { XM, EXx }, PREFIX_OPCODE }, }, /* PREFIX_0F3841 */ { { Bad_Opcode }, { Bad_Opcode }, - { "phminposuw", { XM, EXx }, PREFIX_MANDATORY }, + { "phminposuw", { XM, EXx }, PREFIX_OPCODE }, }, /* PREFIX_0F3880 */ { { Bad_Opcode }, { Bad_Opcode }, - { "invept", { Gm, Mo }, PREFIX_MANDATORY }, + { "invept", { Gm, Mo }, PREFIX_OPCODE }, }, /* PREFIX_0F3881 */ { { Bad_Opcode }, { Bad_Opcode }, - { "invvpid", { Gm, Mo }, PREFIX_MANDATORY }, + { "invvpid", { Gm, Mo }, PREFIX_OPCODE }, }, /* PREFIX_0F3882 */ { { Bad_Opcode }, { Bad_Opcode }, - { "invpcid", { Gm, M }, PREFIX_MANDATORY }, + { "invpcid", { Gm, M }, PREFIX_OPCODE }, }, /* PREFIX_0F38C8 */ { - { "sha1nexte", { XM, EXxmm }, PREFIX_MANDATORY }, + { "sha1nexte", { XM, EXxmm }, PREFIX_OPCODE }, }, /* PREFIX_0F38C9 */ { - { "sha1msg1", { XM, EXxmm }, PREFIX_MANDATORY }, + { "sha1msg1", { XM, EXxmm }, PREFIX_OPCODE }, }, /* PREFIX_0F38CA */ { - { "sha1msg2", { XM, EXxmm }, PREFIX_MANDATORY }, + { "sha1msg2", { XM, EXxmm }, PREFIX_OPCODE }, }, /* PREFIX_0F38CB */ { - { "sha256rnds2", { XM, EXxmm, XMM0 }, PREFIX_MANDATORY }, + { "sha256rnds2", { XM, EXxmm, XMM0 }, PREFIX_OPCODE }, }, /* PREFIX_0F38CC */ { - { "sha256msg1", { XM, EXxmm }, PREFIX_MANDATORY }, + { "sha256msg1", { XM, EXxmm }, PREFIX_OPCODE }, }, /* PREFIX_0F38CD */ { - { "sha256msg2", { XM, EXxmm }, PREFIX_MANDATORY }, + { "sha256msg2", { XM, EXxmm }, PREFIX_OPCODE }, }, /* PREFIX_0F38DB */ { { Bad_Opcode }, { Bad_Opcode }, - { "aesimc", { XM, EXx }, PREFIX_MANDATORY }, + { "aesimc", { XM, EXx }, PREFIX_OPCODE }, }, /* PREFIX_0F38DC */ { { Bad_Opcode }, { Bad_Opcode }, - { "aesenc", { XM, EXx }, PREFIX_MANDATORY }, + { "aesenc", { XM, EXx }, PREFIX_OPCODE }, }, /* PREFIX_0F38DD */ { { Bad_Opcode }, { Bad_Opcode }, - { "aesenclast", { XM, EXx }, PREFIX_MANDATORY }, + { "aesenclast", { XM, EXx }, PREFIX_OPCODE }, }, /* PREFIX_0F38DE */ { { Bad_Opcode }, { Bad_Opcode }, - { "aesdec", { XM, EXx }, PREFIX_MANDATORY }, + { "aesdec", { XM, EXx }, PREFIX_OPCODE }, }, /* PREFIX_0F38DF */ { { Bad_Opcode }, { Bad_Opcode }, - { "aesdeclast", { XM, EXx }, PREFIX_MANDATORY }, + { "aesdeclast", { XM, EXx }, PREFIX_OPCODE }, }, /* PREFIX_0F38F0 */ { - { "movbeS", { Gv, { MOVBE_Fixup, v_mode } }, PREFIX_MANDATORY }, + { "movbeS", { Gv, { MOVBE_Fixup, v_mode } }, PREFIX_OPCODE }, { Bad_Opcode }, - { "movbeS", { Gv, { MOVBE_Fixup, v_mode } }, PREFIX_MANDATORY }, - { "crc32", { Gdq, { CRC32_Fixup, b_mode } }, PREFIX_MANDATORY }, + { "movbeS", { Gv, { MOVBE_Fixup, v_mode } }, PREFIX_OPCODE }, + { "crc32", { Gdq, { CRC32_Fixup, b_mode } }, PREFIX_OPCODE }, }, /* PREFIX_0F38F1 */ { - { "movbeS", { { MOVBE_Fixup, v_mode }, Gv }, PREFIX_MANDATORY }, + { "movbeS", { { MOVBE_Fixup, v_mode }, Gv }, PREFIX_OPCODE }, { Bad_Opcode }, - { "movbeS", { { MOVBE_Fixup, v_mode }, Gv }, PREFIX_MANDATORY }, - { "crc32", { Gdq, { CRC32_Fixup, v_mode } }, PREFIX_MANDATORY }, + { "movbeS", { { MOVBE_Fixup, v_mode }, Gv }, PREFIX_OPCODE }, + { "crc32", { Gdq, { CRC32_Fixup, v_mode } }, PREFIX_OPCODE }, }, /* PREFIX_0F38F6 */ { { Bad_Opcode }, - { "adoxS", { Gdq, Edq}, PREFIX_MANDATORY }, - { "adcxS", { Gdq, Edq}, PREFIX_MANDATORY }, + { "adoxS", { Gdq, Edq}, PREFIX_OPCODE }, + { "adcxS", { Gdq, Edq}, PREFIX_OPCODE }, { Bad_Opcode }, }, @@ -4423,166 +4431,166 @@ static const struct dis386 prefix_table[][4] = { { { Bad_Opcode }, { Bad_Opcode }, - { "roundps", { XM, EXx, Ib }, PREFIX_MANDATORY }, + { "roundps", { XM, EXx, Ib }, PREFIX_OPCODE }, }, /* PREFIX_0F3A09 */ { { Bad_Opcode }, { Bad_Opcode }, - { "roundpd", { XM, EXx, Ib }, PREFIX_MANDATORY }, + { "roundpd", { XM, EXx, Ib }, PREFIX_OPCODE }, }, /* PREFIX_0F3A0A */ { { Bad_Opcode }, { Bad_Opcode }, - { "roundss", { XM, EXd, Ib }, PREFIX_MANDATORY }, + { "roundss", { XM, EXd, Ib }, PREFIX_OPCODE }, }, /* PREFIX_0F3A0B */ { { Bad_Opcode }, { Bad_Opcode }, - { "roundsd", { XM, EXq, Ib }, PREFIX_MANDATORY }, + { "roundsd", { XM, EXq, Ib }, PREFIX_OPCODE }, }, /* PREFIX_0F3A0C */ { { Bad_Opcode }, { Bad_Opcode }, - { "blendps", { XM, EXx, Ib }, PREFIX_MANDATORY }, + { "blendps", { XM, EXx, Ib }, PREFIX_OPCODE }, }, /* PREFIX_0F3A0D */ { { Bad_Opcode }, { Bad_Opcode }, - { "blendpd", { XM, EXx, Ib }, PREFIX_MANDATORY }, + { "blendpd", { XM, EXx, Ib }, PREFIX_OPCODE }, }, /* PREFIX_0F3A0E */ { { Bad_Opcode }, { Bad_Opcode }, - { "pblendw", { XM, EXx, Ib }, PREFIX_MANDATORY }, + { "pblendw", { XM, EXx, Ib }, PREFIX_OPCODE }, }, /* PREFIX_0F3A14 */ { { Bad_Opcode }, { Bad_Opcode }, - { "pextrb", { Edqb, XM, Ib }, PREFIX_MANDATORY }, + { "pextrb", { Edqb, XM, Ib }, PREFIX_OPCODE }, }, /* PREFIX_0F3A15 */ { { Bad_Opcode }, { Bad_Opcode }, - { "pextrw", { Edqw, XM, Ib }, PREFIX_MANDATORY }, + { "pextrw", { Edqw, XM, Ib }, PREFIX_OPCODE }, }, /* PREFIX_0F3A16 */ { { Bad_Opcode }, { Bad_Opcode }, - { "pextrK", { Edq, XM, Ib }, PREFIX_MANDATORY }, + { "pextrK", { Edq, XM, Ib }, PREFIX_OPCODE }, }, /* PREFIX_0F3A17 */ { { Bad_Opcode }, { Bad_Opcode }, - { "extractps", { Edqd, XM, Ib }, PREFIX_MANDATORY }, + { "extractps", { Edqd, XM, Ib }, PREFIX_OPCODE }, }, /* PREFIX_0F3A20 */ { { Bad_Opcode }, { Bad_Opcode }, - { "pinsrb", { XM, Edqb, Ib }, PREFIX_MANDATORY }, + { "pinsrb", { XM, Edqb, Ib }, PREFIX_OPCODE }, }, /* PREFIX_0F3A21 */ { { Bad_Opcode }, { Bad_Opcode }, - { "insertps", { XM, EXd, Ib }, PREFIX_MANDATORY }, + { "insertps", { XM, EXd, Ib }, PREFIX_OPCODE }, }, /* PREFIX_0F3A22 */ { { Bad_Opcode }, { Bad_Opcode }, - { "pinsrK", { XM, Edq, Ib }, PREFIX_MANDATORY }, + { "pinsrK", { XM, Edq, Ib }, PREFIX_OPCODE }, }, /* PREFIX_0F3A40 */ { { Bad_Opcode }, { Bad_Opcode }, - { "dpps", { XM, EXx, Ib }, PREFIX_MANDATORY }, + { "dpps", { XM, EXx, Ib }, PREFIX_OPCODE }, }, /* PREFIX_0F3A41 */ { { Bad_Opcode }, { Bad_Opcode }, - { "dppd", { XM, EXx, Ib }, PREFIX_MANDATORY }, + { "dppd", { XM, EXx, Ib }, PREFIX_OPCODE }, }, /* PREFIX_0F3A42 */ { { Bad_Opcode }, { Bad_Opcode }, - { "mpsadbw", { XM, EXx, Ib }, PREFIX_MANDATORY }, + { "mpsadbw", { XM, EXx, Ib }, PREFIX_OPCODE }, }, /* PREFIX_0F3A44 */ { { Bad_Opcode }, { Bad_Opcode }, - { "pclmulqdq", { XM, EXx, PCLMUL }, PREFIX_MANDATORY }, + { "pclmulqdq", { XM, EXx, PCLMUL }, PREFIX_OPCODE }, }, /* PREFIX_0F3A60 */ { { Bad_Opcode }, { Bad_Opcode }, - { "pcmpestrm", { XM, EXx, Ib }, PREFIX_MANDATORY }, + { "pcmpestrm", { XM, EXx, Ib }, PREFIX_OPCODE }, }, /* PREFIX_0F3A61 */ { { Bad_Opcode }, { Bad_Opcode }, - { "pcmpestri", { XM, EXx, Ib }, PREFIX_MANDATORY }, + { "pcmpestri", { XM, EXx, Ib }, PREFIX_OPCODE }, }, /* PREFIX_0F3A62 */ { { Bad_Opcode }, { Bad_Opcode }, - { "pcmpistrm", { XM, EXx, Ib }, PREFIX_MANDATORY }, + { "pcmpistrm", { XM, EXx, Ib }, PREFIX_OPCODE }, }, /* PREFIX_0F3A63 */ { { Bad_Opcode }, { Bad_Opcode }, - { "pcmpistri", { XM, EXx, Ib }, PREFIX_MANDATORY }, + { "pcmpistri", { XM, EXx, Ib }, PREFIX_OPCODE }, }, /* PREFIX_0F3ACC */ { - { "sha1rnds4", { XM, EXxmm, Ib }, PREFIX_MANDATORY }, + { "sha1rnds4", { XM, EXxmm, Ib }, PREFIX_OPCODE }, }, /* PREFIX_0F3ADF */ { { Bad_Opcode }, { Bad_Opcode }, - { "aeskeygenassist", { XM, EXx, Ib }, PREFIX_MANDATORY }, + { "aeskeygenassist", { XM, EXx, Ib }, PREFIX_OPCODE }, }, /* PREFIX_VEX_0F10 */ @@ -6851,19 +6859,19 @@ static const struct dis386 three_byte_table[][256] = { /* THREE_BYTE_0F38 */ { /* 00 */ - { "pshufb", { MX, EM }, PREFIX_MANDATORY }, - { "phaddw", { MX, EM }, PREFIX_MANDATORY }, - { "phaddd", { MX, EM }, PREFIX_MANDATORY }, - { "phaddsw", { MX, EM }, PREFIX_MANDATORY }, - { "pmaddubsw", { MX, EM }, PREFIX_MANDATORY }, - { "phsubw", { MX, EM }, PREFIX_MANDATORY }, - { "phsubd", { MX, EM }, PREFIX_MANDATORY }, - { "phsubsw", { MX, EM }, PREFIX_MANDATORY }, + { "pshufb", { MX, EM }, PREFIX_OPCODE }, + { "phaddw", { MX, EM }, PREFIX_OPCODE }, + { "phaddd", { MX, EM }, PREFIX_OPCODE }, + { "phaddsw", { MX, EM }, PREFIX_OPCODE }, + { "pmaddubsw", { MX, EM }, PREFIX_OPCODE }, + { "phsubw", { MX, EM }, PREFIX_OPCODE }, + { "phsubd", { MX, EM }, PREFIX_OPCODE }, + { "phsubsw", { MX, EM }, PREFIX_OPCODE }, /* 08 */ - { "psignb", { MX, EM }, PREFIX_MANDATORY }, - { "psignw", { MX, EM }, PREFIX_MANDATORY }, - { "psignd", { MX, EM }, PREFIX_MANDATORY }, - { "pmulhrsw", { MX, EM }, PREFIX_MANDATORY }, + { "psignb", { MX, EM }, PREFIX_OPCODE }, + { "psignw", { MX, EM }, PREFIX_OPCODE }, + { "psignd", { MX, EM }, PREFIX_OPCODE }, + { "pmulhrsw", { MX, EM }, PREFIX_OPCODE }, { Bad_Opcode }, { Bad_Opcode }, { Bad_Opcode }, @@ -6882,9 +6890,9 @@ static const struct dis386 three_byte_table[][256] = { { Bad_Opcode }, { Bad_Opcode }, { Bad_Opcode }, - { "pabsb", { MX, EM }, PREFIX_MANDATORY }, - { "pabsw", { MX, EM }, PREFIX_MANDATORY }, - { "pabsd", { MX, EM }, PREFIX_MANDATORY }, + { "pabsb", { MX, EM }, PREFIX_OPCODE }, + { "pabsw", { MX, EM }, PREFIX_OPCODE }, + { "pabsd", { MX, EM }, PREFIX_OPCODE }, { Bad_Opcode }, /* 20 */ { PREFIX_TABLE (PREFIX_0F3820) }, @@ -7158,7 +7166,7 @@ static const struct dis386 three_byte_table[][256] = { { PREFIX_TABLE (PREFIX_0F3A0C) }, { PREFIX_TABLE (PREFIX_0F3A0D) }, { PREFIX_TABLE (PREFIX_0F3A0E) }, - { "palignr", { MX, EM, Ib }, PREFIX_MANDATORY }, + { "palignr", { MX, EM, Ib }, PREFIX_OPCODE }, /* 10 */ { Bad_Opcode }, { Bad_Opcode }, @@ -7470,7 +7478,7 @@ static const struct dis386 three_byte_table[][256] = { { Bad_Opcode }, { Bad_Opcode }, /* 20 */ - { "ptest", { XX }, PREFIX_MANDATORY }, + { "ptest", { XX }, PREFIX_OPCODE }, { Bad_Opcode }, { Bad_Opcode }, { Bad_Opcode }, @@ -7507,45 +7515,45 @@ static const struct dis386 three_byte_table[][256] = { { Bad_Opcode }, /* 40 */ { Bad_Opcode }, - { "phaddbw", { XM, EXq }, PREFIX_MANDATORY }, - { "phaddbd", { XM, EXq }, PREFIX_MANDATORY }, - { "phaddbq", { XM, EXq }, PREFIX_MANDATORY }, + { "phaddbw", { XM, EXq }, PREFIX_OPCODE }, + { "phaddbd", { XM, EXq }, PREFIX_OPCODE }, + { "phaddbq", { XM, EXq }, PREFIX_OPCODE }, { Bad_Opcode }, { Bad_Opcode }, - { "phaddwd", { XM, EXq }, PREFIX_MANDATORY }, - { "phaddwq", { XM, EXq }, PREFIX_MANDATORY }, + { "phaddwd", { XM, EXq }, PREFIX_OPCODE }, + { "phaddwq", { XM, EXq }, PREFIX_OPCODE }, /* 48 */ { Bad_Opcode }, { Bad_Opcode }, { Bad_Opcode }, - { "phadddq", { XM, EXq }, PREFIX_MANDATORY }, + { "phadddq", { XM, EXq }, PREFIX_OPCODE }, { Bad_Opcode }, { Bad_Opcode }, { Bad_Opcode }, { Bad_Opcode }, /* 50 */ { Bad_Opcode }, - { "phaddubw", { XM, EXq }, PREFIX_MANDATORY }, - { "phaddubd", { XM, EXq }, PREFIX_MANDATORY }, - { "phaddubq", { XM, EXq }, PREFIX_MANDATORY }, + { "phaddubw", { XM, EXq }, PREFIX_OPCODE }, + { "phaddubd", { XM, EXq }, PREFIX_OPCODE }, + { "phaddubq", { XM, EXq }, PREFIX_OPCODE }, { Bad_Opcode }, { Bad_Opcode }, - { "phadduwd", { XM, EXq }, PREFIX_MANDATORY }, - { "phadduwq", { XM, EXq }, PREFIX_MANDATORY }, + { "phadduwd", { XM, EXq }, PREFIX_OPCODE }, + { "phadduwq", { XM, EXq }, PREFIX_OPCODE }, /* 58 */ { Bad_Opcode }, { Bad_Opcode }, { Bad_Opcode }, - { "phaddudq", { XM, EXq }, PREFIX_MANDATORY }, + { "phaddudq", { XM, EXq }, PREFIX_OPCODE }, { Bad_Opcode }, { Bad_Opcode }, { Bad_Opcode }, { Bad_Opcode }, /* 60 */ { Bad_Opcode }, - { "phsubbw", { XM, EXq }, PREFIX_MANDATORY }, - { "phsubbd", { XM, EXq }, PREFIX_MANDATORY }, - { "phsubbq", { XM, EXq }, PREFIX_MANDATORY }, + { "phsubbw", { XM, EXq }, PREFIX_OPCODE }, + { "phsubbd", { XM, EXq }, PREFIX_OPCODE }, + { "phsubbq", { XM, EXq }, PREFIX_OPCODE }, { Bad_Opcode }, { Bad_Opcode }, { Bad_Opcode }, @@ -11591,12 +11599,12 @@ static const struct dis386 mod_table[][2] = { }, { /* MOD_0F12_PREFIX_0 */ - { "movlps", { XM, EXq }, PREFIX_MANDATORY }, - { "movhlps", { XM, EXq }, PREFIX_MANDATORY }, + { "movlps", { XM, EXq }, PREFIX_OPCODE }, + { "movhlps", { XM, EXq }, PREFIX_OPCODE }, }, { /* MOD_0F13 */ - { "movlpX", { EXq, XM }, PREFIX_MANDATORY }, + { "movlpX", { EXq, XM }, PREFIX_OPCODE }, }, { /* MOD_0F16_PREFIX_0 */ @@ -11605,7 +11613,7 @@ static const struct dis386 mod_table[][2] = { }, { /* MOD_0F17 */ - { "movhpX", { EXq, XM }, PREFIX_MANDATORY }, + { "movhpX", { EXq, XM }, PREFIX_OPCODE }, }, { /* MOD_0F18_REG_0 */ @@ -11666,24 +11674,24 @@ static const struct dis386 mod_table[][2] = { }, { /* MOD_0F2B_PREFIX_0 */ - {"movntps", { Mx, XM }, PREFIX_MANDATORY }, + {"movntps", { Mx, XM }, PREFIX_OPCODE }, }, { /* MOD_0F2B_PREFIX_1 */ - {"movntss", { Md, XM }, PREFIX_MANDATORY }, + {"movntss", { Md, XM }, PREFIX_OPCODE }, }, { /* MOD_0F2B_PREFIX_2 */ - {"movntpd", { Mx, XM }, PREFIX_MANDATORY }, + {"movntpd", { Mx, XM }, PREFIX_OPCODE }, }, { /* MOD_0F2B_PREFIX_3 */ - {"movntsd", { Mq, XM }, PREFIX_MANDATORY }, + {"movntsd", { Mq, XM }, PREFIX_OPCODE }, }, { /* MOD_0F51 */ { Bad_Opcode }, - { "movmskpX", { Gdq, XS }, PREFIX_MANDATORY }, + { "movmskpX", { Gdq, XS }, PREFIX_OPCODE }, }, { /* MOD_0F71_REG_2 */ @@ -12430,12 +12438,10 @@ get_valid_dis386 (const struct dis386 *dp, disassemble_info *info) last_prefix = last_repnz_prefix; } - /* Ignore the invalid index if it isn't mandatory. */ - if (!mandatory_prefix - && (prefix_table[dp->op[1].bytemode][vindex].name - == NULL) - && (prefix_table[dp->op[1].bytemode][vindex].op[0].bytemode - == 0)) + /* Check if prefix should be ignored. */ + if ((((prefix_table[dp->op[1].bytemode][vindex].prefix_requirement + & PREFIX_IGNORED) >> PREFIX_IGNORED_SHIFT) + & prefix) != 0) vindex = 0; } @@ -13031,14 +13037,14 @@ print_insn (bfd_vma pc, disassemble_info *info) threebyte = *++codep; dp = &dis386_twobyte[threebyte]; need_modrm = twobyte_has_modrm[*codep]; - mandatory_prefix = dp->prefix_requirement; + prefix_requirement = dp->prefix_requirement; codep++; } else { dp = &dis386[*codep]; need_modrm = onebyte_has_modrm[*codep]; - mandatory_prefix = 0; + prefix_requirement = 0; codep++; } @@ -13138,8 +13144,7 @@ print_insn (bfd_vma pc, disassemble_info *info) used by putop and MMX/SSE operand and may be overriden by the PREFIX_REPZ/PREFIX_REPNZ fix, we check the PREFIX_DATA prefix separately. */ - /* TODO we should check which prefix is mandatory. */ - if (mandatory_prefix + if (prefix_requirement == PREFIX_OPCODE && dp != &bad_opcode && (((prefixes & (PREFIX_REPZ | PREFIX_REPNZ)) != 0 |