s390.c (s390_delegitimize_address): Handle GOTOFF unspecs.
authorAndreas Krebbel <Andreas.Krebbel@de.ibm.com>
Fri, 18 Mar 2011 17:32:29 +0000 (17:32 +0000)
committerAndreas Krebbel <krebbel@gcc.gnu.org>
Fri, 18 Mar 2011 17:32:29 +0000 (17:32 +0000)
2011-03-18  Andreas Krebbel  <Andreas.Krebbel@de.ibm.com>

* config/s390/s390.c (s390_delegitimize_address): Handle GOTOFF
unspecs.

From-SVN: r171157

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

index 519ba5d44c8ea77b638111dd96f646063f46ddd4..4dda33c52b2a1ea72b2b0a964042dce8e6fa290a 100644 (file)
@@ -1,3 +1,8 @@
+2011-03-18  Andreas Krebbel  <Andreas.Krebbel@de.ibm.com>
+
+       * config/s390/s390.c (s390_delegitimize_address): Handle GOTOFF
+       unspecs.
+
 2011-03-18  Andreas Krebbel  <Andreas.Krebbel@de.ibm.com>
 
        * config/s390/s390.c (s390_chunkify_start): Prevent literal pool
index dcbd4ac5391eccc492499302606deffd12a84db8..53083ae173042935656a98dd1efeec12015ffc30 100644 (file)
@@ -5015,6 +5015,23 @@ s390_delegitimize_address (rtx orig_x)
 
   orig_x = delegitimize_mem_from_attrs (orig_x);
   x = orig_x;
+
+  /* Extract the symbol ref from:
+     (plus:SI (reg:SI 12 %r12)
+              (const:SI (unspec:SI [(symbol_ref/f:SI ("*.LC0"))]
+                                   UNSPEC_GOTOFF)))  */
+  if (GET_CODE (x) == PLUS
+      && REG_P (XEXP (x, 0))
+      && REGNO (XEXP (x, 0)) == PIC_OFFSET_TABLE_REGNUM
+      && GET_CODE (XEXP (x, 1)) == CONST)
+    {
+      /* The const operand.  */
+      y = XEXP (XEXP (x, 1), 0);
+      if (GET_CODE (y) == UNSPEC
+         && XINT (y, 1) == UNSPEC_GOTOFF)
+       return XVECEXP (y, 0, 0);
+    }
+
   if (GET_CODE (x) != MEM)
     return orig_x;