Properly handle multiple opcode prefixes
authorH.J. Lu <hjl.tools@gmail.com>
Fri, 2 May 2014 18:22:04 +0000 (11:22 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Mon, 5 May 2014 21:25:14 +0000 (14:25 -0700)
commit285ca99246160d12a3173076a661b6c524338baf
tree795e3b35ccd330d5ee60ebc04746ed242da80fc0
parentc888a17da5c7b06eec4b1ed21e4afe84f9a41347
Properly handle multiple opcode prefixes

This patch updates multiple opcode prefix processing:

1. Always print prefix together with bad opcode.
2. Since the last seen segment register prefix is active, we only print
the active segment register in the memory operand.
3. The 0xf2 and 0xf3 prefixes take precedence over the 0x66 prefix as the
opcode prefix.  Also the last of the 0xf2 and 0xf3 prefixes wins.
4. Ignore invalid 0xf2/0xf3 prefixes if they aren't mandatory.

gas/testsuite/

PR binutils/16893
* gas/i386/katmai.d: Expect "gs" as prefix.

* gas/i386/long-1.s: Replace movapd with movss.
* gas/i386/x86-64-long-1.s: Likewise.
* gas/i386/long-1-intel.d: Updated.
* gas/i386/long-1.d: Likewise.
* gas/i386/x86-64-long-1-intel.d: Likewise.
* gas/i386/x86-64-long-1.d: Likewise.

* gas/i386/prefix.s: Add tests for multiple 0x66, 0x67, 0xf0,
0xf2 and 0xf3 prefixes.
* gas/i386/prefix.d: Updated.

opcodes/

PR binutils/16893
* i386-dis.c (twobyte_has_mandatory_prefix): New variable.
(end_codep): Likewise.
(mandatory_prefix): Likewise.
(active_seg_prefix): Likewise.
(ckprefix): Set active_seg_prefix to the active segment register
prefix.
(seg_prefix): Removed.
(get_valid_dis386): Use the last of PREFIX_REPNZ and PREFIX_REPZ
for prefix index.  Ignore the index if it is invalid and the
mandatory prefix isn't required.
(print_insn): Set mandatory_prefix if the PREFIX_XXX prefix is
mandatory.  Don't set PREFIX_REPZ/PREFIX_REPNZ/PREFIX_LOCK bits
in used_prefixes here.  Don't print unused prefixes.  Check
active_seg_prefix for the active segment register prefix.
Restore the DFLAG bit in sizeflag if the data size prefix is
unused.  Check the unused mandatory PREFIX_XXX prefixes
(append_seg): Only print the segment register which gets used.
(OP_E_memory): Check active_seg_prefix for the segment register
prefix.
(OP_OFF): Likewise.
(OP_OFF64): Likewise.
(OP_DSreg): Set active_seg_prefix to PREFIX_DS if it is unset.
12 files changed:
gas/testsuite/ChangeLog
gas/testsuite/gas/i386/katmai.d
gas/testsuite/gas/i386/long-1-intel.d
gas/testsuite/gas/i386/long-1.d
gas/testsuite/gas/i386/long-1.s
gas/testsuite/gas/i386/prefix.d
gas/testsuite/gas/i386/prefix.s
gas/testsuite/gas/i386/x86-64-long-1-intel.d
gas/testsuite/gas/i386/x86-64-long-1.d
gas/testsuite/gas/i386/x86-64-long-1.s
opcodes/ChangeLog
opcodes/i386-dis.c