]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
x86: Split REX/REX2 old registers judgment.
authorCui, Lili <lili.cui@intel.com>
Wed, 22 May 2024 01:18:38 +0000 (09:18 +0800)
committerCui, Lili <lili.cui@intel.com>
Wed, 22 May 2024 01:18:38 +0000 (09:18 +0800)
Split "REX/REX2 old register checking" and "add empty rex prefix"
into two separate branches.

gas/ChangeLog:

        * config/tc-i386.c (establish_rex): Split the judgments.

gas/config/tc-i386.c

index 339e849a9716806f0763f9645c7814de032cbdc7..12af7ceec08120f7ace3d01b961395ef99a2d39f 100644 (file)
@@ -4303,22 +4303,20 @@ static void establish_rex (void)
   /* Respect a user-specified REX prefix.  */
   i.rex |= i.prefix[REX_PREFIX] & REX_OPCODE;
 
-  /* For 8 bit registers we need an empty rex prefix.  Also if the
-     instruction already has a prefix, we need to convert old
-     registers to new ones.  */
-
-  if ((i.types[first].bitfield.class == Reg && i.types[first].bitfield.byte
-       && ((i.op[first].regs->reg_flags & RegRex64) != 0 || i.rex != 0
-          || i.rex2 != 0))
-      || (i.types[last].bitfield.class == Reg && i.types[last].bitfield.byte
-         && ((i.op[last].regs->reg_flags & RegRex64) != 0 || i.rex != 0
-             || i.rex2 != 0)))
-    {
-      unsigned int x;
-
-      if (!is_apx_rex2_encoding () && !is_any_vex_encoding(&i.tm))
-       i.rex |= REX_OPCODE;
-      for (x = first; x <= last; x++)
+  /* For 8 bit RegRex64 registers without a prefix, we need an empty rex prefix.  */
+  if (((i.types[first].bitfield.class == Reg && i.types[first].bitfield.byte
+       && (i.op[first].regs->reg_flags & RegRex64) != 0)
+       || (i.types[last].bitfield.class == Reg && i.types[last].bitfield.byte
+          && (i.op[last].regs->reg_flags & RegRex64) != 0))
+      && !i.rex && !is_apx_rex2_encoding () && !is_any_vex_encoding (&i.tm))
+    i.rex |= REX_OPCODE;
+
+  /* For REX/REX2/EVEX prefix instructions, we need to convert old registers
+     (AL, CL, DL and BL) to new ones (AXL, CXL, DXL and BXL) and reject AH,
+     CH, DH and BH.  */
+  if (i.rex || i.rex2)
+    {
+      for (unsigned int x = first; x <= last; x++)
        {
          /* Look for 8 bit operand that uses old registers.  */
          if (i.types[x].bitfield.class == Reg && i.types[x].bitfield.byte