Commit 74129172 by Andreas Krebbel Committed by Andreas Krebbel

s390.c (s390_frame_info): Restructure function.

2013-10-09  Andreas Krebbel  <Andreas.Krebbel@de.ibm.com>

	* config/s390/s390.c (s390_frame_info): Restructure function.

From-SVN: r203304
parent 6455a49e
2013-10-09 Andreas Krebbel <Andreas.Krebbel@de.ibm.com> 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>
* config/s390/s390.c (struct s390_frame_layout): New field * config/s390/s390.c (struct s390_frame_layout): New field
gpr_save_slots. gpr_save_slots.
(cfun_save_arg_fprs_p, cfun_gpr_save_slot): New macros. (cfun_save_arg_fprs_p, cfun_gpr_save_slot): New macros.
......
...@@ -7781,7 +7781,7 @@ s390_optimize_register_info () ...@@ -7781,7 +7781,7 @@ s390_optimize_register_info ()
static void static void
s390_frame_info (void) s390_frame_info (void)
{ {
int i; HOST_WIDE_INT lowest_offset;
cfun_frame_layout.first_save_gpr_slot = cfun_frame_layout.first_save_gpr; 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; cfun_frame_layout.last_save_gpr_slot = cfun_frame_layout.last_save_gpr;
...@@ -7805,6 +7805,7 @@ s390_frame_info (void) ...@@ -7805,6 +7805,7 @@ s390_frame_info (void)
if (!TARGET_PACKED_STACK) if (!TARGET_PACKED_STACK)
{ {
/* Fixed stack layout. */
cfun_frame_layout.backchain_offset = 0; cfun_frame_layout.backchain_offset = 0;
cfun_frame_layout.f0_offset = 16 * UNITS_PER_LONG; cfun_frame_layout.f0_offset = 16 * UNITS_PER_LONG;
cfun_frame_layout.f4_offset = cfun_frame_layout.f0_offset + 2 * 8; cfun_frame_layout.f4_offset = cfun_frame_layout.f0_offset + 2 * 8;
...@@ -7812,45 +7813,30 @@ s390_frame_info (void) ...@@ -7812,45 +7813,30 @@ s390_frame_info (void)
cfun_frame_layout.gprs_offset = (cfun_frame_layout.first_save_gpr_slot cfun_frame_layout.gprs_offset = (cfun_frame_layout.first_save_gpr_slot
* UNITS_PER_LONG); * UNITS_PER_LONG);
} }
else if (TARGET_BACKCHAIN) /* kernel stack layout */ 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 cfun_frame_layout.backchain_offset = (STACK_POINTER_OFFSET
- UNITS_PER_LONG); - 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) /* The distance between the backchain and the return address
{ save slot must not change. So we always need a slot for the
cfun_frame_layout.f4_offset stack pointer which resides in between. */
= (cfun_frame_layout.gprs_offset cfun_frame_layout.last_save_gpr_slot = STACK_POINTER_REGNUM;
- 8 * (cfun_fpr_save_p (FPR4_REGNUM)
+ cfun_fpr_save_p (FPR6_REGNUM)));
cfun_frame_layout.f0_offset cfun_frame_layout.gprs_offset
= (cfun_frame_layout.f4_offset = cfun_frame_layout.backchain_offset - cfun_gprs_save_area_size;
- 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 /* FPRs will not be saved. Nevertheless pick sane values to
= (cfun_frame_layout.f0_offset keep area calculations valid. */
- 8 * (cfun_fpr_save_p (FPR4_REGNUM) cfun_frame_layout.f0_offset =
+ cfun_fpr_save_p (FPR6_REGNUM))); cfun_frame_layout.f4_offset =
} cfun_frame_layout.f8_offset = cfun_frame_layout.gprs_offset;
} }
else /* no backchain */ else
{ {
/* Packed stack layout without backchain. */
cfun_frame_layout.f4_offset cfun_frame_layout.f4_offset
= (STACK_POINTER_OFFSET = (STACK_POINTER_OFFSET
- 8 * (cfun_fpr_save_p (FPR4_REGNUM) - 8 * (cfun_fpr_save_p (FPR4_REGNUM)
...@@ -7863,47 +7849,49 @@ s390_frame_info (void) ...@@ -7863,47 +7849,49 @@ s390_frame_info (void)
cfun_frame_layout.gprs_offset cfun_frame_layout.gprs_offset
= cfun_frame_layout.f0_offset - cfun_gprs_save_area_size; = 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 if (crtl->is_leaf
&& !TARGET_TPF_PROFILING && !TARGET_TPF_PROFILING
&& cfun_frame_layout.frame_size == 0 && cfun_frame_layout.frame_size == 0
&& !cfun_save_high_fprs_p
&& !cfun->calls_alloca) && !cfun->calls_alloca)
return; return;
if (!TARGET_PACKED_STACK) /* Calculate the number of bytes we have used in our own register
cfun_frame_layout.frame_size += (STACK_POINTER_OFFSET save area. With the packed stack layout we can re-use the
+ crtl->outgoing_args_size remaining bytes for normal stack elements. */
+ 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 if (TARGET_PACKED_STACK)
64 bit. */ lowest_offset = MIN (MIN (cfun_frame_layout.f0_offset,
cfun_frame_layout.f8_offset = (MIN (MIN (cfun_frame_layout.f0_offset, cfun_frame_layout.f4_offset),
cfun_frame_layout.f4_offset), cfun_frame_layout.gprs_offset);
cfun_frame_layout.gprs_offset) else
- cfun_frame_layout.high_fprs * 8); lowest_offset = 0;
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 (TARGET_BACKCHAIN)
lowest_offset = MIN (lowest_offset, cfun_frame_layout.backchain_offset);
/* If under 31 bit an odd number of gprs has to be saved we have to adjust cfun_frame_layout.frame_size += STACK_POINTER_OFFSET - lowest_offset;
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; /* 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 /* Generate frame layout. Fills in register and frame data for the current
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment