diff options
author | Alan Modra <amodra@gmail.com> | 2010-06-22 20:14:11 +0930 |
---|---|---|
committer | Alan Modra <amodra@gcc.gnu.org> | 2010-06-22 20:14:11 +0930 |
commit | 8d2547f23f5ffbcc884ad0218def1ff3b9fc516b (patch) | |
tree | 9301d636aeb8282a23bfd34356ae6754e571e6de /gcc | |
parent | 3a4ec5cc08d808313a7e0d820193a9c405a313c5 (diff) | |
download | gcc-8d2547f23f5ffbcc884ad0218def1ff3b9fc516b.zip gcc-8d2547f23f5ffbcc884ad0218def1ff3b9fc516b.tar.gz gcc-8d2547f23f5ffbcc884ad0218def1ff3b9fc516b.tar.bz2 |
re PR target/44364 (Wrong code with e500 double floating point)
PR target/44364
* config/rs6000/e500.h (HARD_REGNO_CALLER_SAVE_MODE): Define.
* caller-save.c (insert_restore, insert_save): Use non-validate
form of adjust_address.
From-SVN: r161163
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/caller-save.c | 4 | ||||
-rw-r--r-- | gcc/config/rs6000/e500.h | 9 |
3 files changed, 17 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6b02749..79e0bf8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2010-06-22 Alan Modra <amodra@gmail.com> + + PR target/44364 + * config/rs6000/e500.h (HARD_REGNO_CALLER_SAVE_MODE): Define. + * caller-save.c (insert_restore, insert_save): Use non-validate + form of adjust_address. + 2010-06-21 John David Anglin <dave.anglin@nrc-cnrc.gc.ca> PR target/39690 diff --git a/gcc/caller-save.c b/gcc/caller-save.c index 6bcfd4b..78b508c 100644 --- a/gcc/caller-save.c +++ b/gcc/caller-save.c @@ -1212,7 +1212,7 @@ insert_restore (struct insn_chain *chain, int before_p, int regno, /* Check that insn to restore REGNO in save_mode[regno] is correct. */ && reg_save_code (regno, save_mode[regno]) >= 0) - mem = adjust_address (mem, save_mode[regno], 0); + mem = adjust_address_nv (mem, save_mode[regno], 0); else mem = copy_rtx (mem); @@ -1293,7 +1293,7 @@ insert_save (struct insn_chain *chain, int before_p, int regno, /* Check that insn to save REGNO in save_mode[regno] is correct. */ && reg_save_code (regno, save_mode[regno]) >= 0) - mem = adjust_address (mem, save_mode[regno], 0); + mem = adjust_address_nv (mem, save_mode[regno], 0); else mem = copy_rtx (mem); diff --git a/gcc/config/rs6000/e500.h b/gcc/config/rs6000/e500.h index 05b20ad..744f4de4 100644 --- a/gcc/config/rs6000/e500.h +++ b/gcc/config/rs6000/e500.h @@ -1,5 +1,5 @@ /* Enable E500 support. - Copyright (C) 2003, 2004, 2006, 2007, 2008, 2009 Free Software + Copyright (C) 2003, 2004, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. This file is part of GCC. @@ -46,3 +46,10 @@ error ("E500 and FPRs not supported"); \ } \ } while (0) + +/* When setting up caller-save slots (MODE == VOIDmode) ensure we + allocate space for DFmode. Save gprs in the correct mode too. */ +#define HARD_REGNO_CALLER_SAVE_MODE(REGNO, NREGS, MODE) \ + (TARGET_E500_DOUBLE && ((MODE) == VOIDmode || (MODE) == DFmode) \ + ? DFmode \ + : choose_hard_reg_mode ((REGNO), (NREGS), false)) |