]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
x86: simplify SAE checking
authorJan Beulich <jbeulich@suse.com>
Fri, 23 Aug 2024 07:24:10 +0000 (09:24 +0200)
committerJan Beulich <jbeulich@suse.com>
Fri, 23 Aug 2024 07:24:10 +0000 (09:24 +0200)
To determine whether SAE (with or without StaticRounding) is permitted
there's no need to iterate over all operands. Even less so starting at
the front (thus needlessly inspecting immediate operands as well).
Leverage the pattern across all relevant templates and check only the
last two operands, and also only for non-512 ones (besides the non-LIG
case that was already checked for).

gas/config/tc-i386.c

index 4e3af8941aa23c7232bf6f7728fcd086fe975a83..ad68ba9322df3c947afbf2f3c865ada5b9e07583 100644 (file)
@@ -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;
        }
     }