This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[Committed] S/390: Cleanup of s390_frame_info
- From: Andreas Krebbel <krebbel at linux dot vnet dot ibm dot com>
- To: gcc-patches at gcc dot gnu dot org
- Date: Wed, 9 Oct 2013 09:37:35 +0200
- Subject: [Committed] S/390: Cleanup of s390_frame_info
- Authentication-results: sourceware.org; auth=none
Just a cleanup of the s390_frame_info function.
Committed to mainline after regression test was fine.
Bye,
-Andreas-
2013-10-09 Andreas Krebbel <Andreas.Krebbel@de.ibm.com>
* config/s390/s390.c (s390_frame_info): Restructure function.
---
gcc/config/s390/s390.c | 112 ++++++++++!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1 file changed, 23 insertions(+), 1 deletion(-), 88 modifications(!)
Index: gcc/config/s390/s390.c
===================================================================
*** gcc/config/s390/s390.c.orig
--- gcc/config/s390/s390.c
*************** s390_optimize_register_info ()
*** 7781,7787 ****
static void
s390_frame_info (void)
{
! int i;
cfun_frame_layout.first_save_gpr_slot = cfun_frame_layout.first_save_gpr;
cfun_frame_layout.last_save_gpr_slot = cfun_frame_layout.last_save_gpr;
--- 7781,7787 ----
static void
s390_frame_info (void)
{
! HOST_WIDE_INT lowest_offset;
cfun_frame_layout.first_save_gpr_slot = cfun_frame_layout.first_save_gpr;
cfun_frame_layout.last_save_gpr_slot = cfun_frame_layout.last_save_gpr;
*************** s390_frame_info (void)
*** 7805,7810 ****
--- 7805,7811 ----
if (!TARGET_PACKED_STACK)
{
+ /* Fixed stack layout. */
cfun_frame_layout.backchain_offset = 0;
cfun_frame_layout.f0_offset = 16 * UNITS_PER_LONG;
cfun_frame_layout.f4_offset = cfun_frame_layout.f0_offset + 2 * 8;
*************** s390_frame_info (void)
*** 7812,7856 ****
cfun_frame_layout.gprs_offset = (cfun_frame_layout.first_save_gpr_slot
* UNITS_PER_LONG);
}
! else if (TARGET_BACKCHAIN) /* kernel stack layout */
{
cfun_frame_layout.backchain_offset = (STACK_POINTER_OFFSET
- UNITS_PER_LONG);
cfun_frame_layout.gprs_offset
! = (cfun_frame_layout.backchain_offset
! - (STACK_POINTER_REGNUM - cfun_frame_layout.first_save_gpr_slot + 1)
! * UNITS_PER_LONG);
! if (TARGET_64BIT)
! {
! cfun_frame_layout.f4_offset
! = (cfun_frame_layout.gprs_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)));
! }
! else
! {
! /* On 31 bit we have to care about alignment of the
! floating point regs to provide fastest access. */
! cfun_frame_layout.f0_offset
! = ((cfun_frame_layout.gprs_offset
! & ~(STACK_BOUNDARY / BITS_PER_UNIT - 1))
! - 8 * (cfun_fpr_save_p (FPR0_REGNUM)
! + cfun_fpr_save_p (FPR2_REGNUM)));
!
! cfun_frame_layout.f4_offset
! = (cfun_frame_layout.f0_offset
! - 8 * (cfun_fpr_save_p (FPR4_REGNUM)
! + cfun_fpr_save_p (FPR6_REGNUM)));
! }
}
! else /* no backchain */
{
cfun_frame_layout.f4_offset
= (STACK_POINTER_OFFSET
- 8 * (cfun_fpr_save_p (FPR4_REGNUM)
--- 7813,7842 ----
cfun_frame_layout.gprs_offset = (cfun_frame_layout.first_save_gpr_slot
* UNITS_PER_LONG);
}
! else if (TARGET_BACKCHAIN)
{
+ /* Kernel stack layout - packed stack, backchain, no float */
+ gcc_assert (TARGET_SOFT_FLOAT);
cfun_frame_layout.backchain_offset = (STACK_POINTER_OFFSET
- UNITS_PER_LONG);
+
+ /* The distance between the backchain and the return address
+ save slot must not change. So we always need a slot for the
+ stack pointer which resides in between. */
+ cfun_frame_layout.last_save_gpr_slot = STACK_POINTER_REGNUM;
+
cfun_frame_layout.gprs_offset
! = cfun_frame_layout.backchain_offset - cfun_gprs_save_area_size;
! /* FPRs will not be saved. Nevertheless pick sane values to
! keep area calculations valid. */
! cfun_frame_layout.f0_offset =
! cfun_frame_layout.f4_offset =
! cfun_frame_layout.f8_offset = cfun_frame_layout.gprs_offset;
}
! else
{
+ /* Packed stack layout without backchain. */
cfun_frame_layout.f4_offset
= (STACK_POINTER_OFFSET
- 8 * (cfun_fpr_save_p (FPR4_REGNUM)
*************** s390_frame_info (void)
*** 7863,7909 ****
cfun_frame_layout.gprs_offset
= cfun_frame_layout.f0_offset - cfun_gprs_save_area_size;
}
if (crtl->is_leaf
&& !TARGET_TPF_PROFILING
&& cfun_frame_layout.frame_size == 0
- && !cfun_save_high_fprs_p
&& !cfun->calls_alloca)
return;
! if (!TARGET_PACKED_STACK)
! cfun_frame_layout.frame_size += (STACK_POINTER_OFFSET
! + crtl->outgoing_args_size
! + cfun_frame_layout.high_fprs * 8);
else
! {
! if (TARGET_BACKCHAIN)
! cfun_frame_layout.frame_size += UNITS_PER_LONG;
! /* No alignment trouble here because f8-f15 are only saved under
! 64 bit. */
! cfun_frame_layout.f8_offset = (MIN (MIN (cfun_frame_layout.f0_offset,
! cfun_frame_layout.f4_offset),
! cfun_frame_layout.gprs_offset)
! - cfun_frame_layout.high_fprs * 8);
!
! cfun_frame_layout.frame_size += cfun_frame_layout.high_fprs * 8;
!
! for (i = FPR0_REGNUM; i <= FPR7_REGNUM; i++)
! if (cfun_fpr_save_p (i))
! cfun_frame_layout.frame_size += 8;
!
! cfun_frame_layout.frame_size += cfun_gprs_save_area_size;
! /* If under 31 bit an odd number of gprs has to be saved we have to adjust
! the frame size to sustain 8 byte alignment of stack frames. */
! cfun_frame_layout.frame_size = ((cfun_frame_layout.frame_size +
! STACK_BOUNDARY / BITS_PER_UNIT - 1)
! & ~(STACK_BOUNDARY / BITS_PER_UNIT - 1));
! cfun_frame_layout.frame_size += crtl->outgoing_args_size;
! }
}
/* Generate frame layout. Fills in register and frame data for the current
--- 7849,7897 ----
cfun_frame_layout.gprs_offset
= cfun_frame_layout.f0_offset - cfun_gprs_save_area_size;
+
+ cfun_frame_layout.f8_offset = (cfun_frame_layout.gprs_offset
+ - cfun_frame_layout.high_fprs * 8);
}
+ if (cfun_save_high_fprs_p)
+ cfun_frame_layout.frame_size += cfun_frame_layout.high_fprs * 8;
+
+ if (!crtl->is_leaf)
+ cfun_frame_layout.frame_size += crtl->outgoing_args_size;
+
+ /* In the following cases we have to allocate a STACK_POINTER_OFFSET
+ sized area at the bottom of the stack. This is required also for
+ leaf functions. When GCC generates a local stack reference it
+ will always add STACK_POINTER_OFFSET to all these references. */
if (crtl->is_leaf
&& !TARGET_TPF_PROFILING
&& cfun_frame_layout.frame_size == 0
&& !cfun->calls_alloca)
return;
! /* Calculate the number of bytes we have used in our own register
! save area. With the packed stack layout we can re-use the
! remaining bytes for normal stack elements. */
!
! if (TARGET_PACKED_STACK)
! lowest_offset = MIN (MIN (cfun_frame_layout.f0_offset,
! cfun_frame_layout.f4_offset),
! cfun_frame_layout.gprs_offset);
else
! lowest_offset = 0;
! if (TARGET_BACKCHAIN)
! lowest_offset = MIN (lowest_offset, cfun_frame_layout.backchain_offset);
! cfun_frame_layout.frame_size += STACK_POINTER_OFFSET - lowest_offset;
! /* If under 31 bit an odd number of gprs has to be saved we have to
! adjust the frame size to sustain 8 byte alignment of stack
! frames. */
! cfun_frame_layout.frame_size = ((cfun_frame_layout.frame_size +
! STACK_BOUNDARY / BITS_PER_UNIT - 1)
! & ~(STACK_BOUNDARY / BITS_PER_UNIT - 1));
}
/* Generate frame layout. Fills in register and frame data for the current