From 61dd226f1c9d84ba0f1c3e1faabe440e6e1d2df4 Mon Sep 17 00:00:00 2001 From: Nathan Froyd <froydnj@codesourcery.com> Date: Sat, 23 Feb 2008 01:00:42 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 6 ++++++ gcc/config/rs6000/rs6000.c | 36 +++++++++++++++++++++++------------- 2 files changed, 29 insertions(+), 13 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9f35e8c652ac..9788e4d162a3 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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 diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index b3eb05506058..fb6aa19659ad 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); } -- GitLab