[binutils-gdb] x86: simplify SAE checking

Jan Beulich jbeulich@sourceware.org
Fri Aug 23 07:24:33 GMT 2024


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=5637daa2064c44831f90e64df37bcd047160366e

commit 5637daa2064c44831f90e64df37bcd047160366e
Author: Jan Beulich <jbeulich@suse.com>
Date:   Fri Aug 23 09:24:10 2024 +0200

    x86: simplify SAE checking
    
    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).

Diff:
---
 gas/config/tc-i386.c | 22 ++++++++++------------
 1 file changed, 10 insertions(+), 12 deletions(-)

diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c
index 4e3af8941aa..ad68ba9322d 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;
 	}
     }


More information about the Binutils-cvs mailing list