aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorHartmut Penner <hpenner@de.ibm.com>2002-03-26 08:44:47 +0000
committerHartmut Penner <hpenner@gcc.gnu.org>2002-03-26 08:44:47 +0000
commit1447dc6909ad299386f6c88b4533516ce24d6931 (patch)
treecf41a1ae192f810fe46e06ff7453a5e2b6406733 /gcc
parentf2a8c7f078fbdc091766de05db4d5b745adbff61 (diff)
downloadgcc-1447dc6909ad299386f6c88b4533516ce24d6931.zip
gcc-1447dc6909ad299386f6c88b4533516ce24d6931.tar.gz
gcc-1447dc6909ad299386f6c88b4533516ce24d6931.tar.bz2
s390.c (s390_emit_epilogue): Change epilogue code to not restoring global registers.
* config/s390/s390.c (s390_emit_epilogue): Change epilogue code to not restoring global registers. From-SVN: r51374
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/config/s390/s390.c24
2 files changed, 26 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 347905c..c199e44 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/config/s390/s390.c b/gcc/config/s390/s390.c
index 2881aab..8c183e7 100644
--- a/gcc/config/s390/s390.c
+++ b/gcc/config/s390/s390.c
@@ -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. */