aboutsummaryrefslogtreecommitdiff
path: root/gcc/config/avr
diff options
context:
space:
mode:
authorAndy Hutchinson <hutchinsonandy@aim.com>2008-09-14 12:50:10 +0000
committerAnatoly Sokolov <aesok@gcc.gnu.org>2008-09-14 16:50:10 +0400
commit9215065fd6861ffbe6e5d7348dca6720f594612b (patch)
treeb1ce23fee97293e0ddc968da9d75c9fcfe96e8f3 /gcc/config/avr
parentf67894ed5f8520f7c6367122dda3a5f9feabd0e5 (diff)
downloadgcc-9215065fd6861ffbe6e5d7348dca6720f594612b.zip
gcc-9215065fd6861ffbe6e5d7348dca6720f594612b.tar.gz
gcc-9215065fd6861ffbe6e5d7348dca6720f594612b.tar.bz2
re PR target/19636 (Can't compile large switch statement)
PR target/19636 PR target/24894 PR target/31644 PR target/31786 * config/avr/avr.c (legitimate_address_p): Fix problem where subreg is not recognized as a valid register usage. Allow REG_X to be used as a base pointer. * config/avr/avr.h (LEGITIMIZE_RELOAD_ADDRESS): Remove code that forces a reload when using a base register. From-SVN: r140360
Diffstat (limited to 'gcc/config/avr')
-rw-r--r--gcc/config/avr/avr.c3
-rw-r--r--gcc/config/avr/avr.h4
2 files changed, 3 insertions, 4 deletions
diff --git a/gcc/config/avr/avr.c b/gcc/config/avr/avr.c
index fb217bb..279aea5 100644
--- a/gcc/config/avr/avr.c
+++ b/gcc/config/avr/avr.c
@@ -1089,6 +1089,8 @@ legitimate_address_p (enum machine_mode mode, rtx x, int strict)
true_regnum (XEXP (x, 0)));
debug_rtx (x);
}
+ if (!strict && GET_CODE (x) == SUBREG)
+ x = SUBREG_REG (x);
if (REG_P (x) && (strict ? REG_OK_FOR_BASE_STRICT_P (x)
: REG_OK_FOR_BASE_NOSTRICT_P (x)))
r = POINTER_REGS;
@@ -1103,6 +1105,7 @@ legitimate_address_p (enum machine_mode mode, rtx x, int strict)
if (fit)
{
if (! strict
+ || REGNO (XEXP (x,0)) == REG_X
|| REGNO (XEXP (x,0)) == REG_Y
|| REGNO (XEXP (x,0)) == REG_Z)
r = BASE_POINTER_REGS;
diff --git a/gcc/config/avr/avr.h b/gcc/config/avr/avr.h
index 7440985..3b7cbbb 100644
--- a/gcc/config/avr/avr.h
+++ b/gcc/config/avr/avr.h
@@ -483,10 +483,6 @@ do { \
OPNUM, TYPE); \
goto WIN; \
} \
- push_reload (XEXP (X, 0), NULL_RTX, &XEXP (X, 0), NULL, \
- BASE_POINTER_REGS, GET_MODE (X), VOIDmode, 0, 0, \
- OPNUM, TYPE); \
- goto WIN; \
} \
else if (! (frame_pointer_needed && XEXP (X,0) == frame_pointer_rtx)) \
{ \