s390.c (s390_delegitimize_address): Handle PLTOFF and PLT unspecs.
authorAndreas Krebbel <Andreas.Krebbel@de.ibm.com>
Tue, 22 Mar 2011 07:29:53 +0000 (07:29 +0000)
committerAndreas Krebbel <krebbel@gcc.gnu.org>
Tue, 22 Mar 2011 07:29:53 +0000 (07:29 +0000)
2011-03-22  Andreas Krebbel  <Andreas.Krebbel@de.ibm.com>

* config/s390/s390.c (s390_delegitimize_address): Handle PLTOFF
and PLT unspecs.

From-SVN: r171279

gcc/ChangeLog
gcc/config/s390/s390.c

index 4c0e0ca107e16659ba37ad2bef6497f0c9850631..1e44957cffc94205c528e27a8a46e2c4eec03fcb 100644 (file)
@@ -1,3 +1,8 @@
+2011-03-22  Andreas Krebbel  <Andreas.Krebbel@de.ibm.com>
+
+       * config/s390/s390.c (s390_delegitimize_address): Handle PLTOFF
+       and PLT unspecs.
+
 2011-03-21  Richard Sandiford  <richard.sandiford@linaro.org>
 
        * expr.h (prepare_operand): Move to...
index 532a42fa3c046917ddbaef10964ed5aa1f7c1d3a..050129847c14e829d0a6ba1fb8ace9c109b6b70c 100644 (file)
@@ -5019,7 +5019,12 @@ s390_delegitimize_address (rtx orig_x)
   /* Extract the symbol ref from:
      (plus:SI (reg:SI 12 %r12)
               (const:SI (unspec:SI [(symbol_ref/f:SI ("*.LC0"))]
-                                   UNSPEC_GOTOFF)))  */
+                                   UNSPEC_GOTOFF/PLTOFF)))
+     and
+     (plus:SI (reg:SI 12 %r12)
+              (const:SI (plus:SI (unspec:SI [(symbol_ref:SI ("L"))]
+                                             UNSPEC_GOTOFF/PLTOFF)
+                                (const_int 4 [0x4]))))  */
   if (GET_CODE (x) == PLUS
       && REG_P (XEXP (x, 0))
       && REGNO (XEXP (x, 0)) == PIC_OFFSET_TABLE_REGNUM
@@ -5027,8 +5032,14 @@ s390_delegitimize_address (rtx orig_x)
     {
       /* The const operand.  */
       y = XEXP (XEXP (x, 1), 0);
+
+      if (GET_CODE (y) == PLUS
+         && GET_CODE (XEXP (y, 1)) == CONST_INT)
+       y = XEXP (y, 0);
+
       if (GET_CODE (y) == UNSPEC
-         && XINT (y, 1) == UNSPEC_GOTOFF)
+         && (XINT (y, 1) == UNSPEC_GOTOFF
+             || XINT (y, 1) == UNSPEC_PLTOFF))
        return XVECEXP (y, 0, 0);
     }
 
@@ -5050,9 +5061,14 @@ s390_delegitimize_address (rtx orig_x)
     }
   else if (GET_CODE (x) == CONST)
     {
+      /* Extract the symbol ref from:
+        (mem:QI (const:DI (unspec:DI [(symbol_ref:DI ("foo"))]
+                                      UNSPEC_PLT/GOTENT)))  */
+
       y = XEXP (x, 0);
       if (GET_CODE (y) == UNSPEC
-         && XINT (y, 1) == UNSPEC_GOTENT)
+         && (XINT (y, 1) == UNSPEC_GOTENT
+             || XINT (y, 1) == UNSPEC_PLT))
        y = XVECEXP (y, 0, 0);
       else
        return orig_x;