summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkrebbel <krebbel@138bc75d-0d04-0410-961f-82ee72b054a4>2013-10-09 07:24:35 +0000
committerkrebbel <krebbel@138bc75d-0d04-0410-961f-82ee72b054a4>2013-10-09 07:24:35 +0000
commit031bdf836f2fc1f872ffd17df5d9246705965943 (patch)
tree1e9d1a76a5fab9343445813471e406051b493cc8
parent62eb92367733c8eb368833e6c8fc8dfda50c1266 (diff)
downloadgcc-031bdf836f2fc1f872ffd17df5d9246705965943.tar.gz
2013-10-09 Andreas Krebbel <Andreas.Krebbel@de.ibm.com>
* config/s390/s390.c (s390_register_info_stdarg_fpr): Remove packed stack special handling. (s390_frame_info, s390_emit_prologue, s390_emit_epilogue): Switch back to fixed stack slots for FPRs saved due to stdarg. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@203305 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/config/s390/s390.c37
2 files changed, 24 insertions, 20 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 56940339fba..d4560bcd5a5 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,12 @@
2013-10-09 Andreas Krebbel <Andreas.Krebbel@de.ibm.com>
+ * config/s390/s390.c (s390_register_info_stdarg_fpr): Remove
+ packed stack special handling.
+ (s390_frame_info, s390_emit_prologue, s390_emit_epilogue): Switch
+ back to fixed stack slots for FPRs saved due to stdarg.
+
+2013-10-09 Andreas Krebbel <Andreas.Krebbel@de.ibm.com>
+
* config/s390/s390.c (s390_frame_info): Restructure function.
2013-10-09 Andreas Krebbel <Andreas.Krebbel@de.ibm.com>
diff --git a/gcc/config/s390/s390.c b/gcc/config/s390/s390.c
index 28a09ecf349..f0d6a59e978 100644
--- a/gcc/config/s390/s390.c
+++ b/gcc/config/s390/s390.c
@@ -7589,13 +7589,6 @@ s390_register_info_stdarg_fpr ()
if (max_fpr > FP_ARG_NUM_REG)
max_fpr = FP_ARG_NUM_REG;
- /* The va_arg algorithm accesses the FPRs in the reg save area using
- a constant offset from r0. With the packed stack layout omitting
- FPRs from the beginning would change the offset for the
- subsequent FPRs. */
- if (TARGET_PACKED_STACK)
- min_fpr = 0;
-
for (i = min_fpr; i < max_fpr; i++)
cfun_set_fpr_save (i + FPR0_REGNUM);
}
@@ -7836,16 +7829,20 @@ s390_frame_info (void)
}
else
{
+ int num_fprs;
+
/* Packed stack layout without backchain. */
- cfun_frame_layout.f4_offset
- = (STACK_POINTER_OFFSET
- - 8 * (cfun_fpr_save_p (FPR4_REGNUM)
- + cfun_fpr_save_p (FPR6_REGNUM)));
- cfun_frame_layout.f0_offset
- = (cfun_frame_layout.f4_offset
- - 8 * (cfun_fpr_save_p (FPR0_REGNUM)
- + cfun_fpr_save_p (FPR2_REGNUM)));
+ /* With stdarg FPRs need their dedicated slots. */
+ num_fprs = (TARGET_64BIT && cfun->stdarg ? 2
+ : (cfun_fpr_save_p (FPR4_REGNUM) +
+ cfun_fpr_save_p (FPR6_REGNUM)));
+ cfun_frame_layout.f4_offset = STACK_POINTER_OFFSET - 8 * num_fprs;
+
+ num_fprs = (cfun->stdarg ? 2
+ : (cfun_fpr_save_p (FPR0_REGNUM)
+ + cfun_fpr_save_p (FPR2_REGNUM)));
+ cfun_frame_layout.f0_offset = cfun_frame_layout.f4_offset - 8 * num_fprs;
cfun_frame_layout.gprs_offset
= cfun_frame_layout.f0_offset - cfun_gprs_save_area_size;
@@ -8680,8 +8677,8 @@ s390_emit_prologue (void)
save_fpr (stack_pointer_rtx, offset, i);
offset += 8;
}
- else if (!TARGET_PACKED_STACK)
- offset += 8;
+ else if (!TARGET_PACKED_STACK || cfun->stdarg)
+ offset += 8;
}
/* Save f4 and f6. */
@@ -8693,12 +8690,12 @@ s390_emit_prologue (void)
insn = save_fpr (stack_pointer_rtx, offset, i);
offset += 8;
- /* If f4 and f6 are call clobbered they are saved due to stdargs and
- therefore are not frame related. */
+ /* If f4 and f6 are call clobbered they are saved due to
+ stdargs and therefore are not frame related. */
if (!call_really_used_regs[i])
RTX_FRAME_RELATED_P (insn) = 1;
}
- else if (!TARGET_PACKED_STACK)
+ else if (!TARGET_PACKED_STACK || call_really_used_regs[i])
offset += 8;
}