Only print prefixes before fwait
authorH.J. Lu <hjl.tools@gmail.com>
Tue, 10 Jun 2014 18:16:41 +0000 (11:16 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Tue, 10 Jun 2014 18:16:41 +0000 (11:16 -0700)
gas/testsuite/

* gas/i386/prefix.s: Add another fwait test.
* gas/i386/prefix.d: Updated.

opcodes/

* i386-dis.c (fwait_prefix): New.
(ckprefix): Set fwait_prefix.
(print_insn): Properly print prefixes before fwait.

gas/testsuite/ChangeLog
gas/testsuite/gas/i386/prefix.d
gas/testsuite/gas/i386/prefix.s
opcodes/ChangeLog
opcodes/i386-dis.c

index 768c26b..43a37e3 100644 (file)
@@ -1,3 +1,8 @@
+2014-06-10  H.J. Lu  <hongjiu.lu@intel.com>
+
+       * gas/i386/prefix.s: Add another fwait test.
+       * gas/i386/prefix.d: Updated.
+
 2014-06-09  Nick Clifton  <nickc@redhat.com>
 
        * gas/msp430/msp430x.d: Update to match revised assembler output.
index d9f0ae2..a334ab8 100644 (file)
@@ -12,6 +12,8 @@ Disassembly of section .text:
 [      ]*[a-f0-9]+:    9b 67 df e0             addr16 fstsw %ax
 [      ]*[a-f0-9]+:    36 67 66 f3 a7          repz cmpsw %es:\(%di\),%ss:\(%si\)
 [      ]*[a-f0-9]+:    26 9b                   es fwait
+[      ]*[a-f0-9]+:    9b                      fwait
+[      ]*[a-f0-9]+:    65 c7 05 00 00 00 00 00 00 00 00        movl   \$0x0,%gs:0x0
 [      ]*[a-f0-9]+:    66 f2 0f 38 17          data16 \(bad\) 
 [      ]*[a-f0-9]+:    f2 66 0f 54             repnz \(bad\)
 [      ]*[a-f0-9]+:    f2 0f 54                repnz \(bad\)
index 07020ea..9f90afa 100644 (file)
@@ -4,6 +4,9 @@
 
  es fwait
 
+       fwait
+       movl $0,%gs:fpu_owner_task
+
        .byte 0x66
        .byte 0xf2
        .byte 0x0f
index 6e3d6c9..581e5db 100644 (file)
@@ -1,3 +1,9 @@
+2014-06-10  H.J. Lu  <hongjiu.lu@intel.com>
+
+       * i386-dis.c (fwait_prefix): New.
+       (ckprefix): Set fwait_prefix.
+       (print_insn): Properly print prefixes before fwait.
+
 2014-06-07  Alan Modra  <amodra@gmail.com>
 
        * ppc-opc.c (UISIGNOPT): Define and use with cmpli.
index 3c48428..24406f3 100644 (file)
@@ -2883,6 +2883,7 @@ static int last_data_prefix;
 static int last_addr_prefix;
 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;
 /* The active segment register prefix.  */
@@ -11631,6 +11632,7 @@ ckprefix (void)
   last_addr_prefix = -1;
   last_rex_prefix = -1;
   last_seg_prefix = -1;
+  fwait_prefix = -1;
   active_seg_prefix = 0;
   for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
     all_prefixes[i] = 0;
@@ -11720,6 +11722,7 @@ ckprefix (void)
          /* fwait is really an instruction.  If there are prefixes
             before the fwait, they belong to the fwait, *not* to the
             following instruction.  */
+         fwait_prefix = i;
          if (prefixes || rex)
            {
              prefixes |= PREFIX_FWAIT;
@@ -12569,8 +12572,7 @@ print_insn (bfd_vma pc, disassemble_info *info)
        && ((*codep < 0xd8) || (*codep > 0xdf))))
     {
       /* Handle prefixes before fwait.  */
-      for (i = 0;
-          i < (int) ARRAY_SIZE (all_prefixes) && all_prefixes[i];
+      for (i = 0; i < fwait_prefix && all_prefixes[i];
           i++)
        (*info->fprintf_func) (info->stream, "%s ",
                               prefix_name (all_prefixes[i], sizeflag));