From 86a80a50f2cb244e6b9ec18b93675972baa50d78 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Thu, 1 May 2014 09:39:51 -0700 Subject: [PATCH] Handle prefixes before fwait 0x9b (fwait) is both an instruction and an opcode prefix. When 0x9b is treated as an instruction, we need to handle any prefixes before it. This patch handles it properly. gas/testsuite/ PR binutils/16891 * gas/i386/opcode.s: Add test for fwait with prefix. * gas/i386/opcode-intel.d: Updated. * gas/i386/opcode-suffix.d: Likewise. * gas/i386/opcode.d: Likewise. opcodes/ PR binutils/16891 * i386-dis.c (print_insn): Handle prefixes before fwait. --- gas/testsuite/ChangeLog | 8 ++++++++ gas/testsuite/gas/i386/opcode-intel.d | 2 ++ gas/testsuite/gas/i386/opcode-suffix.d | 2 ++ gas/testsuite/gas/i386/opcode.d | 2 ++ gas/testsuite/gas/i386/opcode.s | 3 +++ opcodes/ChangeLog | 5 +++++ opcodes/i386-dis.c | 8 +++++++- 7 files changed, 29 insertions(+), 1 deletion(-) diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog index fac6a8b09a1..d59d640e114 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2014-05-01 H.J. Lu + + PR binutils/16891 + * gas/i386/opcode.s: Add test for fwait with prefix. + * gas/i386/opcode-intel.d: Updated. + * gas/i386/opcode-suffix.d: Likewise. + * gas/i386/opcode.d: Likewise. + 2014-04-23 Will Newton * gas/arm/backslash-at.d: Fix dump output regexps for diff --git a/gas/testsuite/gas/i386/opcode-intel.d b/gas/testsuite/gas/i386/opcode-intel.d index 23b7afad6df..a1ebe455433 100644 --- a/gas/testsuite/gas/i386/opcode-intel.d +++ b/gas/testsuite/gas/i386/opcode-intel.d @@ -592,4 +592,6 @@ Disassembly of section .text: [ ]*[a-f0-9]+: 0f 4b 90 90 90 90 90 cmovnp edx,DWORD PTR \[eax-0x6f6f6f70\] [ ]*[a-f0-9]+: 66 0f 4a 90 90 90 90 90 cmovp dx,WORD PTR \[eax-0x6f6f6f70\] [ ]*[a-f0-9]+: 66 0f 4b 90 90 90 90 90 cmovnp dx,WORD PTR \[eax-0x6f6f6f70\] +[ ]*[a-f0-9]+: 26 9b [ ]*es fwait +[ ]*[a-f0-9]+: 9b [ ]*fwait #pass diff --git a/gas/testsuite/gas/i386/opcode-suffix.d b/gas/testsuite/gas/i386/opcode-suffix.d index 74e0adbbb19..21ad22bcb94 100644 --- a/gas/testsuite/gas/i386/opcode-suffix.d +++ b/gas/testsuite/gas/i386/opcode-suffix.d @@ -592,4 +592,6 @@ Disassembly of section .text: [ ]*[a-f0-9]+: 0f 4b 90 90 90 90 90 cmovnpl -0x6f6f6f70\(%eax\),%edx [ ]*[a-f0-9]+: 66 0f 4a 90 90 90 90 90 cmovpw -0x6f6f6f70\(%eax\),%dx [ ]*[a-f0-9]+: 66 0f 4b 90 90 90 90 90 cmovnpw -0x6f6f6f70\(%eax\),%dx +[ ]*[a-f0-9]+: 26 9b [ ]*es fwait +[ ]*[a-f0-9]+: 9b [ ]*fwait #pass diff --git a/gas/testsuite/gas/i386/opcode.d b/gas/testsuite/gas/i386/opcode.d index 1a94fc81f14..371e40ac091 100644 --- a/gas/testsuite/gas/i386/opcode.d +++ b/gas/testsuite/gas/i386/opcode.d @@ -591,4 +591,6 @@ Disassembly of section .text: [ ]*[a-f0-9]+: 0f 4b 90 90 90 90 90 cmovnp -0x6f6f6f70\(%eax\),%edx [ ]*[a-f0-9]+: 66 0f 4a 90 90 90 90 90 cmovp -0x6f6f6f70\(%eax\),%dx [ ]*[a-f0-9]+: 66 0f 4b 90 90 90 90 90 cmovnp -0x6f6f6f70\(%eax\),%dx +[ ]*[a-f0-9]+: 26 9b [ ]*es fwait +[ ]*[a-f0-9]+: 9b [ ]*fwait #pass diff --git a/gas/testsuite/gas/i386/opcode.s b/gas/testsuite/gas/i386/opcode.s index a07e42372df..72333a557b5 100644 --- a/gas/testsuite/gas/i386/opcode.s +++ b/gas/testsuite/gas/i386/opcode.s @@ -589,3 +589,6 @@ foo: cmovpo 0x90909090(%eax),%edx cmovpe 0x90909090(%eax),%dx cmovpo 0x90909090(%eax),%dx + + es fwait + fwait diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog index 05ad78a4ccc..747aa238b64 100644 --- a/opcodes/ChangeLog +++ b/opcodes/ChangeLog @@ -1,3 +1,8 @@ +2014-05-01 H.J. Lu + + PR binutils/16891 + * i386-dis.c (print_insn): Handle prefixes before fwait. + 2014-04-26 Alan Modra * po/POTFILES.in: Regenerate. diff --git a/opcodes/i386-dis.c b/opcodes/i386-dis.c index 0e076060e0e..c36c6323198 100644 --- a/opcodes/i386-dis.c +++ b/opcodes/i386-dis.c @@ -12548,8 +12548,14 @@ print_insn (bfd_vma pc, disassemble_info *info) if (((prefixes & PREFIX_FWAIT) && ((*codep < 0xd8) || (*codep > 0xdf)))) { + /* Handle prefixes before fwait. */ + for (i = 0; + i < (int) ARRAY_SIZE (all_prefixes) && all_prefixes[i]; + i++) + (*info->fprintf_func) (info->stream, "%s ", + prefix_name (all_prefixes[i], sizeflag)); (*info->fprintf_func) (info->stream, "fwait"); - return 1; + return i + 1; } if (*codep == 0x0f) -- 2.30.2