rs6000.c (rs6000_legitimize_address): Check to ensure that we can address an entire...
authorNathan Froyd <froydnj@codesourcery.com>
Sat, 23 Feb 2008 01:00:42 +0000 (01:00 +0000)
committerNathan Froyd <froydnj@gcc.gnu.org>
Sat, 23 Feb 2008 01:00:42 +0000 (01:00 +0000)
* config/rs6000/rs6000.c (rs6000_legitimize_address): Check to
ensure that we can address an entire entity > 8 bytes.  Don't
generate reg+reg addressing for such data.

From-SVN: r132567

gcc/ChangeLog
gcc/config/rs6000/rs6000.c

index 9f35e8c652aca082c509ee7a9891e206eae87524..9788e4d162a37d7c5a2947d964fbd0ecc474d33c 100644 (file)
@@ -1,3 +1,9 @@
+2008-02-22  Nathan Froyd  <froydnj@codesourcery.com>
+
+       * config/rs6000/rs6000.c (rs6000_legitimize_address): Check to
+       ensure that we can address an entire entity > 8 bytes.  Don't
+       generate reg+reg addressing for such data.
+
 2008-02-22  Nathan Froyd  <froydnj@codesourcery.com>
 
        * config/rs6000/rs6000.h (CONSTANT_ALIGNMENT): Don't overalign
index b3eb055060584893e11b0835b58cf429d630765a..fb6aa19659ad8426b4736cd4c48b8fd0c726343b 100644 (file)
@@ -3630,19 +3630,29 @@ rs6000_legitimize_address (rtx x, rtx oldx ATTRIBUTE_UNUSED,
       /* We accept [reg + reg] and [reg + OFFSET].  */
 
       if (GET_CODE (x) == PLUS)
-       {
-         rtx op1 = XEXP (x, 0);
-         rtx op2 = XEXP (x, 1);
-
-         op1 = force_reg (Pmode, op1);
-
-         if (GET_CODE (op2) != REG
-             && (GET_CODE (op2) != CONST_INT
-                 || !SPE_CONST_OFFSET_OK (INTVAL (op2))))
-           op2 = force_reg (Pmode, op2);
-
-         return gen_rtx_PLUS (Pmode, op1, op2);
-       }
+       {
+         rtx op1 = XEXP (x, 0);
+         rtx op2 = XEXP (x, 1);
+         rtx y;
+
+         op1 = force_reg (Pmode, op1);
+
+         if (GET_CODE (op2) != REG
+             && (GET_CODE (op2) != CONST_INT
+                 || !SPE_CONST_OFFSET_OK (INTVAL (op2))
+                 || (GET_MODE_SIZE (mode) > 8
+                     && !SPE_CONST_OFFSET_OK (INTVAL (op2) + 8))))
+           op2 = force_reg (Pmode, op2);
+
+         /* We can't always do [reg + reg] for these, because [reg +
+            reg + offset] is not a legitimate addressing mode.  */
+         y = gen_rtx_PLUS (Pmode, op1, op2);
+
+         if (GET_MODE_SIZE (mode) > 8 && REG_P (op2))
+           return force_reg (Pmode, y);
+         else
+           return y;
+       }
 
       return force_reg (Pmode, x);
     }