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
 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)
       /* 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);
 
   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)
       /* 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);
 
   else
     mem = copy_rtx (mem);
 
index 05b20ad..744f4de 100644 (file)
@@ -1,5 +1,5 @@
 /* Enable E500 support.
 /* 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.
 
    Foundation, Inc.
    This file is part of GCC.
 
          error ("E500 and FPRs not supported");                        \
       }                                                                        \
   } while (0)
          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))