* config/s390/s390.c (s390_emit_epilogue): Change epilogue
authorhpenner <hpenner@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 26 Mar 2002 08:44:47 +0000 (08:44 +0000)
committerhpenner <hpenner@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 26 Mar 2002 08:44:47 +0000 (08:44 +0000)
        code to not restoring global registers.

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

gcc/ChangeLog
gcc/config/s390/s390.c

index 347905c..c199e44 100644 (file)
@@ -1,3 +1,8 @@
+2002-03-26  Hartmut Penner  <hpenner@de.ibm.com>
+
+       * config/s390/s390.c (s390_emit_epilogue): Change epilogue
+       code to not restoring global registers. 
+
 2002-03-26  Neil Booth  <neil@daikokuya.demon.co.uk>
 
        * Makefile.in (ggc-common.o): Update.
index 2881aab..8c183e7 100644 (file)
@@ -3177,15 +3177,15 @@ s390_emit_epilogue ()
 
       if (frame.save_fprs_p)
        for (i = 24; i < 32; i++)
-         if (regs_ever_live[i])
+         if (regs_ever_live[i] && !global_regs[i])
            restore_fpr (frame_pointer, 
                         offset - 64 + (i-24) * 8, i);
     }
   else
     {
-      if (regs_ever_live[18])
+      if (regs_ever_live[18] && !global_regs[18])
        restore_fpr (frame_pointer, offset + STACK_POINTER_OFFSET - 16, 18);
-      if (regs_ever_live[19]
+      if (regs_ever_live[19] && !global_regs[19])
        restore_fpr (frame_pointer, offset + STACK_POINTER_OFFSET - 8, 19);
     }
 
@@ -3198,6 +3198,24 @@ s390_emit_epilogue ()
   if (frame.first_restore_gpr != -1)
     {
       rtx addr;
+      int i;
+
+      /* Check for global register and save them 
+        to stack location from where they get restored.  */
+
+      for (i = frame.first_restore_gpr; 
+          i <= frame.last_save_gpr;
+          i++)
+       {
+         if (global_regs[i])
+           {
+             addr = plus_constant (frame_pointer, 
+                    offset + i * UNITS_PER_WORD);
+             addr = gen_rtx_MEM (Pmode, addr);
+             set_mem_alias_set (addr, s390_sr_alias_set);
+             emit_move_insn (addr, gen_rtx_REG (Pmode, i));
+           }  
+       }
 
       /* Fetch return address from stack before load multiple,
         this will do good for scheduling.  */