OSDN Git Service

PR target/44364
authoramodra <amodra@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 22 Jun 2010 10:44:11 +0000 (10:44 +0000)
committeramodra <amodra@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 22 Jun 2010 10:44:11 +0000 (10:44 +0000)
* config/rs6000/e500.h (HARD_REGNO_CALLER_SAVE_MODE): Define.
* caller-save.c (insert_restore, insert_save): Use non-validate
form of adjust_address.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@161163 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/caller-save.c
gcc/config/rs6000/e500.h

index 6b02749..79e0bf8 100644 (file)
@@ -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
index 6bcfd4b..78b508c 100644 (file)
@@ -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);
 
index 05b20ad..744f4de 100644 (file)
@@ -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.
 
          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))