diff --git a/gas/ChangeLog b/gas/ChangeLog index f3a22a3a87f..aab0c09e6ca 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,9 @@ +2006-04-07 Alan Modra + + PR 2512. + * config/tc-i386.c (match_template): Move 64-bit operand tests + inside loop. + 2006-04-06 Carlos O'Donell * po/Make-in: Add install-html target. diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c index fe222da3542..be384bc99a7 100644 --- a/gas/config/tc-i386.c +++ b/gas/config/tc-i386.c @@ -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) {