diff options
author | Andreas Krebbel <Andreas.Krebbel@de.ibm.com> | 2013-10-09 07:24:35 +0000 |
---|---|---|
committer | Andreas Krebbel <krebbel@gcc.gnu.org> | 2013-10-09 07:24:35 +0000 |
commit | e179df8301f1b520082b486b43b24c464865ce26 (patch) | |
tree | 1e9d1a76a5fab9343445813471e406051b493cc8 | |
parent | 74129172c65297ba6d2023670e31de1f422db9ee (diff) | |
download | gcc-e179df8301f1b520082b486b43b24c464865ce26.zip gcc-e179df8301f1b520082b486b43b24c464865ce26.tar.gz gcc-e179df8301f1b520082b486b43b24c464865ce26.tar.bz2 |
s390.c (s390_register_info_stdarg_fpr): Remove packed stack special handling.
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.
From-SVN: r203305
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/config/s390/s390.c | 37 |
2 files changed, 24 insertions, 20 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5694033..d4560bc 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 28a09ec..f0d6a59 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; } |