From 031bdf836f2fc1f872ffd17df5d9246705965943 Mon Sep 17 00:00:00 2001 From: krebbel Date: Wed, 9 Oct 2013 07:24:35 +0000 Subject: [PATCH] 2013-10-09 Andreas Krebbel * 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 --- gcc/ChangeLog | 7 +++++++ gcc/config/s390/s390.c | 37 +++++++++++++++++-------------------- 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 + * 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 + * config/s390/s390.c (s390_frame_info): Restructure function. 2013-10-09 Andreas Krebbel 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; } -- 2.11.4.GIT