From f5ac80f86a6b0b29dfdd1a4ad129c8268d341c32 Mon Sep 17 00:00:00 2001 From: DJ Delorie Date: Fri, 26 Oct 2012 19:11:02 -0400 Subject: rl78.c (rl78_as_legitimate_address): Do not allow reg+addend addresses for the _far namespace. * config/rl78/rl78.c (rl78_as_legitimate_address): Do not allow reg+addend addresses for the _far namespace. From-SVN: r192866 --- gcc/ChangeLog | 5 +++++ gcc/config/rl78/rl78.c | 7 +++++++ 2 files changed, 12 insertions(+) (limited to 'gcc') diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1668c54..8b3c2b2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2012-10-26 DJ Delorie + + * config/rl78/rl78.c (rl78_as_legitimate_address): Do not allow + reg+addend addresses for the _far namespace. + 2012-10-26 Segher Boessenkool * config/rs6000/sync.md (ATOMIC): Correct DI condition. diff --git a/gcc/config/rl78/rl78.c b/gcc/config/rl78/rl78.c index 990c1bb..5e5050b 100644 --- a/gcc/config/rl78/rl78.c +++ b/gcc/config/rl78/rl78.c @@ -686,6 +686,13 @@ rl78_as_legitimate_address (enum machine_mode mode ATTRIBUTE_UNUSED, rtx x, if (! characterize_address (x, &base, &index, &addend)) return false; + /* We can't extract the high/low portions of a PLUS address + involving a register during devirtualization, so make sure all + such __far addresses do not have addends. This forces GCC to do + the sum separately. */ + if (addend && base && as == ADDR_SPACE_FAR) + return false; + if (base && index) { int ir = REGNO (index); -- cgit v1.1