diff options
-rw-r--r-- | gas/config/tc-i386.c | 22 |
1 files changed, 10 insertions, 12 deletions
diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c index 4e3af89..ad68ba9 100644 --- a/gas/config/tc-i386.c +++ b/gas/config/tc-i386.c @@ -8024,18 +8024,16 @@ check_VecOperands (const insn_template *t) return 1; } - /* Non-EVEX.LIG forms need to have a ZMM register as at least one - operand. */ - if (t->opcode_modifier.evex != EVEXLIG) - { - for (op = 0; op < t->operands; ++op) - if (i.types[op].bitfield.zmmword) - break; - if (op >= t->operands) - { - i.error = operand_size_mismatch; - return 1; - } + /* Non-EVEX.{LIG,512} forms need to have a ZMM register as at least one + operand. There's no need to check all operands, though: Either of the + last two operands will be of the right size in all relevant templates. */ + if (t->opcode_modifier.evex != EVEXLIG + && t->opcode_modifier.evex != EVEX512 + && !i.types[t->operands - 1].bitfield.zmmword + && !i.types[t->operands - 2].bitfield.zmmword) + { + i.error = operand_size_mismatch; + return 1; } } |