]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
x86: reduce check_{byte,word,long,qword}_reg() overhead
authorJan Beulich <jbeulich@suse.com>
Fri, 31 May 2024 08:22:50 +0000 (10:22 +0200)
committerJan Beulich <jbeulich@suse.com>
Fri, 31 May 2024 08:22:50 +0000 (10:22 +0200)
These run after template matching. Therefore it is quite pointless for
them to check all operands, when operand sizes matching across operands
is already known. Exit the loops early in such cases.

In check_byte_reg() also drop a long-stale part of a comment.

gas/config/tc-i386.c

index 9e13f2fc9f166d4a06daf49c9decc4ed0db1fe79..95f5810a87c9d0bbc1db457c3ec7b50009dc5ae7 100644 (file)
@@ -9850,11 +9850,13 @@ check_byte_reg (void)
       if (i.types[op].bitfield.class != Reg)
        continue;
 
-      /* If this is an eight bit register, it's OK.  If it's the 16 or
-        32 bit version of an eight bit register, we will just use the
-        low portion, and that's OK too.  */
+      /* If this is an eight bit register, it's OK.  */
       if (i.types[op].bitfield.byte)
-       continue;
+       {
+         if (i.tm.opcode_modifier.checkoperandsize)
+           break;
+         continue;
+       }
 
       /* I/O port address operands are OK too.  */
       if (i.tm.operand_types[op].bitfield.instance == RegD
@@ -9908,6 +9910,9 @@ check_long_reg (void)
                i.suffix);
        return 0;
       }
+    else if (i.tm.opcode_modifier.checkoperandsize)
+      break;
+
   return 1;
 }
 
@@ -9943,6 +9948,9 @@ check_qword_reg (void)
                register_prefix, i.op[op].regs->reg_name, i.suffix);
        return 0;
       }
+    else if (i.tm.opcode_modifier.checkoperandsize)
+      break;
+
   return 1;
 }
 
@@ -9978,6 +9986,9 @@ check_word_reg (void)
                i.suffix);
        return 0;
       }
+    else if (i.tm.opcode_modifier.checkoperandsize)
+      break;
+
   return 1;
 }