diff options
author | Nathan Froyd <froydnj@codesourcery.com> | 2008-02-23 01:00:42 +0000 |
---|---|---|
committer | Nathan Froyd <froydnj@gcc.gnu.org> | 2008-02-23 01:00:42 +0000 |
commit | 61dd226f1c9d84ba0f1c3e1faabe440e6e1d2df4 (patch) | |
tree | fc8d0ee8fd48c04b14099c057f2fab16c384236c /gcc | |
parent | 2165fd3855ad8437510ebba80c57fdfa8b25984b (diff) | |
download | gcc-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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/config/rs6000/rs6000.c | 36 |
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); } |