aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2010-06-22 20:14:11 +0930
committerAlan Modra <amodra@gcc.gnu.org>2010-06-22 20:14:11 +0930
commit8d2547f23f5ffbcc884ad0218def1ff3b9fc516b (patch)
tree9301d636aeb8282a23bfd34356ae6754e571e6de /gcc
parent3a4ec5cc08d808313a7e0d820193a9c405a313c5 (diff)
downloadgcc-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/ChangeLog7
-rw-r--r--gcc/caller-save.c4
-rw-r--r--gcc/config/rs6000/e500.h9
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))