aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathan Froyd <froydnj@codesourcery.com>2008-02-23 01:00:42 +0000
committerNathan Froyd <froydnj@gcc.gnu.org>2008-02-23 01:00:42 +0000
commit61dd226f1c9d84ba0f1c3e1faabe440e6e1d2df4 (patch)
treefc8d0ee8fd48c04b14099c057f2fab16c384236c
parent2165fd3855ad8437510ebba80c57fdfa8b25984b (diff)
downloadgcc-61dd226f1c9d84ba0f1c3e1faabe440e6e1d2df4.zip
gcc-61dd226f1c9d84ba0f1c3e1faabe440e6e1d2df4.tar.gz
gcc-61dd226f1c9d84ba0f1c3e1faabe440e6e1d2df4.tar.bz2
rs6000.c (rs6000_legitimize_address): Check to ensure that we can address an entire entity > 8 bytes.
* 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
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/rs6000/rs6000.c36
2 files changed, 29 insertions, 13 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 9f35e8c..9788e4d 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,11 @@
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
strings when optimizing for size, unless the target cares about
alignment.
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index b3eb055..fb6aa19 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -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);
}