PR 2512.
authorAlan Modra <amodra@gmail.com>
Fri, 7 Apr 2006 06:40:57 +0000 (06:40 +0000)
committerAlan Modra <amodra@gmail.com>
Fri, 7 Apr 2006 06:40:57 +0000 (06:40 +0000)
* config/tc-i386.c (match_template): Move 64-bit operand tests
inside loop.

gas/ChangeLog
gas/config/tc-i386.c

index f3a22a3..aab0c09 100644 (file)
@@ -1,3 +1,9 @@
+2006-04-07  Alan Modra  <amodra@bigpond.net.au>
+
+       PR 2512.
+       * config/tc-i386.c (match_template): Move 64-bit operand tests
+       inside loop.
+
 2006-04-06  Carlos O'Donell  <carlos@codesourcery.com>
 
        * po/Make-in: Add install-html target.
index fe222da..be384bc 100644 (file)
@@ -2263,19 +2263,7 @@ match_template ()
                              : (i.suffix == LONG_DOUBLE_MNEM_SUFFIX
                                 ? No_xSuf : 0))))));
 
-  t = current_templates->start;
-  if (i.suffix == QWORD_MNEM_SUFFIX
-      && flag_code != CODE_64BIT
-      && (intel_syntax
-         ? !(t->opcode_modifier & IgnoreSize)
-           && !intel_float_operand (t->name)
-         : intel_float_operand (t->name) != 2)
-      && (!(t->operand_types[0] & (RegMMX | RegXMM))
-         || !(t->operand_types[t->operands > 1] & (RegMMX | RegXMM)))
-      && (t->base_opcode != 0x0fc7
-         || t->extension_opcode != 1 /* cmpxchg8b */))
-    t = current_templates->end;
-  for (; t < current_templates->end; t++)
+  for (t = current_templates->start; t < current_templates->end; t++)
     {
       /* Must have right number of operands.  */
       if (i.operands != t->operands)
@@ -2287,6 +2275,19 @@ match_template ()
               && (t->opcode_modifier & IgnoreSize)))
        continue;
 
+      /* In general, don't allow 64-bit operands in 32-bit mode.  */
+      if (i.suffix == QWORD_MNEM_SUFFIX
+         && flag_code != CODE_64BIT
+         && (intel_syntax
+             ? (!(t->opcode_modifier & IgnoreSize)
+                && !intel_float_operand (t->name))
+             : intel_float_operand (t->name) != 2)
+         && (!(t->operand_types[0] & (RegMMX | RegXMM))
+             || !(t->operand_types[t->operands > 1] & (RegMMX | RegXMM)))
+         && (t->base_opcode != 0x0fc7
+             || t->extension_opcode != 1 /* cmpxchg8b */))
+       continue;
+
       /* Do not verify operands when there are none.  */
       else if (!t->operands)
        {