OSDN Git Service

2011-03-22 Andreas Krebbel <Andreas.Krebbel@de.ibm.com>
authorkrebbel <krebbel@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 22 Mar 2011 07:29:53 +0000 (07:29 +0000)
committerkrebbel <krebbel@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 22 Mar 2011 07:29:53 +0000 (07:29 +0000)
* config/s390/s390.c (s390_delegitimize_address): Handle PLTOFF
and PLT unspecs.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@171279 138bc75d-0d04-0410-961f-82ee72b054a4

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

index 4c0e0ca..1e44957 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 532a42f..0501298 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;