x86: improve resolution of register equates
authorJan Beulich <jbeulich@suse.com>
Wed, 23 Mar 2022 11:31:04 +0000 (12:31 +0100)
committerJan Beulich <jbeulich@suse.com>
Wed, 23 Mar 2022 11:31:04 +0000 (12:31 +0100)
Allow transitive (or recursive) equates to work in addition to direct
ones. The only requirements are that
- the equate being straight of a register, i.e. no expressions involved
  (albeit I'm afraid something like "%eax + 0" will be viewed as %eax),
- at the point of use there's no forward ref left which cannot be
  resolved, yet.

gas/config/tc-i386-intel.c
gas/config/tc-i386.c
gas/testsuite/gas/i386/equ.d
gas/testsuite/gas/i386/equ.s

index d0c30ddbd5d5e671173806310272e3fcc6b57d43..83d22407429e01208ac20a15c09331d22653acc3 100644 (file)
@@ -536,6 +536,9 @@ static int i386_intel_simplify (expressionS *e)
       if (e->X_add_symbol
          && !i386_intel_simplify_symbol (e->X_add_symbol))
        return 0;
+      if (!the_reg && this_operand >= 0
+         && e->X_op == O_symbol && !e->X_add_number)
+       the_reg = i.op[this_operand].regs;
       if (e->X_op == O_add || e->X_op == O_subtract)
        {
          base = intel_state.base;
index ec82144ed1b73aa9397c5fdd36d206314bbd3a84..93eec1c9ed43c8765fa635b291d40fa4e3bff5ed 100644 (file)
@@ -12974,6 +12974,14 @@ parse_register (char *reg_string, char **end_op)
       input_line_pointer = reg_string;
       c = get_symbol_name (&reg_string);
       symbolP = symbol_find (reg_string);
+      while (symbolP && S_GET_SEGMENT (symbolP) != reg_section)
+       {
+         const expressionS *e = symbol_get_value_expression(symbolP);
+
+         if (e->X_op != O_symbol || e->X_add_number)
+           break;
+         symbolP = e->X_add_symbol;
+       }
       if (symbolP && S_GET_SEGMENT (symbolP) == reg_section)
        {
          const expressionS *e = symbol_get_value_expression (symbolP);
index 0f270a6ccdf0efc2bfd7f39b3d2dcd9411663340..d7c863f45602dcb2dbee69d343a598f1412c7f2a 100644 (file)
@@ -13,6 +13,8 @@ Disassembly of section .text:
 [ 0-9a-f]+:[   0-9a-f]+test[   ]+%ecx,%ecx
 [ 0-9a-f]+:[   0-9a-f]+mov[    ]+%fs:\(%ecx,%ecx,4\),%ecx
 [ 0-9a-f]+:[   0-9a-f]+fadd[   ]+%st\(1\),%st
+[ 0-9a-f]+:[   0-9a-f]+fmul[   ]+%st\(1\),%st
+[ 0-9a-f]+:[   0-9a-f]+fsub[   ]+%st\(1\),%st
 [ 0-9a-f]+:[   0-9a-f]+mov[    ]+\$0xfffffffe,%eax
 [ 0-9a-f]+:[   0-9a-f]+mov[    ]+0xfffffffe,%eax
 [ 0-9a-f]+:[   0-9a-f]+mov[    ]+\$0x0,%eax[   0-9a-f]+:[      a-zA-Z0-9_]+xtrn
@@ -21,7 +23,11 @@ Disassembly of section .text:
 [ 0-9a-f]+:[   0-9a-f]+mov[    ]+%gs:\(%edx,%edx,8\),%edx
 [ 0-9a-f]+:[   0-9a-f]+mov[    ]+%gs:\(%edx,%edx,8\),%edx
 [ 0-9a-f]+:[   0-9a-f]+fadd[   ]+%st\(1\),%st
+[ 0-9a-f]+:[   0-9a-f]+fmul[   ]+%st\(1\),%st
+[ 0-9a-f]+:[   0-9a-f]+fsub[   ]+%st\(1\),%st
 [ 0-9a-f]+:[   0-9a-f]+fadd[   ]+%st\(7\),%st
+[ 0-9a-f]+:[   0-9a-f]+fmul[   ]+%st\(7\),%st
+[ 0-9a-f]+:[   0-9a-f]+fsub[   ]+%st\(7\),%st
 [ 0-9a-f]+:[   0-9a-f]+mov[    ]+0x4\(%edx\),%eax
 [ 0-9a-f]+:[   0-9a-f]+mov[    ]+0x4\(%edx\),%eax
 #pass
index e15148a741d9df90d44222be8bef75affe332f3f..c7c4e604f03cba68613749e7b68f021cab450c1d 100644 (file)
@@ -13,8 +13,12 @@ _start:
  .equ s, %fs
        testl   r, r
        movl    s:(r,r,4), r
+ .equ z, y
+ .equ y, x
  .equ x, %st(1)
        fadd    x
+       fmul    y
+       fsub    z
 
  .if r <> %ecx
  .err
@@ -37,8 +41,14 @@ _start:
        mov     r, s:[r+r*8]
        mov     r, s:[8*r+r]
        fadd    x
- .equ x, st(7)
-       fadd    x
+       fmul    y
+       fsub    z
+ .equ c, b
+ .equ b, a
+ .equ a, st(7)
+       fadd    a
+       fmul    b
+       fsub    c
  .equ r, edx + 4
        mov     eax, [r]
        mov     eax, [r]