aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Edelsohn <edelsohn@mhpcc.edu>1998-04-18 22:24:38 +0000
committerJeff Law <law@gcc.gnu.org>1998-04-18 16:24:38 -0600
commit4864f1a613382562cb383fc04916097ca9238010 (patch)
tree7a93f55bc01788e32c790f9b0f616d27a7e3d55f
parentdc790b3c86321ec6c7ad2962e25f240c19b24940 (diff)
rs6000.md (floatsidf2_loadaddr): rs6000_fpmem_offset will be negative in a stackless frame.
* rs6000.md (floatsidf2_loadaddr): rs6000_fpmem_offset will be negative in a stackless frame. * rs6000.c (rs6000_stack_info): Don't include fixed-size link area in stackless frame size. Support 64-bit stackless frame size. Combine fpmem offset calculations and don't add total_size to offset if not pushing a stack frame. From-SVN: r19288
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/config/rs6000/rs6000.c32
-rw-r--r--gcc/config/rs6000/rs6000.md2
3 files changed, 27 insertions, 16 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index f1822e6f357..25ce0286162 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,12 @@
+Sat Apr 18 19:06:59 1998 David Edelsohn <edelsohn@mhpcc.edu>
+
+ * rs6000.md (floatsidf2_loadaddr): rs6000_fpmem_offset will be
+ negative in a stackless frame.
+ * rs6000.c (rs6000_stack_info): Don't include fixed-size link area
+ in stackless frame size. Support 64-bit stackless frame size.
+ Combine fpmem offset calculations and don't add total_size to
+ offset if not pushing a stack frame.
+
Sat Apr 18 17:55:57 1998 Jim Wilson <wilson@cygnus.com>
* i386.md (fix_truncsfdi2+[123]): Add + to operand 1 constraints.
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index c60cf77cbec..e3ddfb23bc6 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -3217,10 +3217,13 @@ rs6000_stack_info ()
info_ptr->total_size = RS6000_ALIGN (total_raw_size, ABI_STACK_BOUNDARY / BITS_PER_UNIT);
- /* Determine if we need to allocate any stack frame.
- For AIX We need to push the stack if a frame pointer is needed (because
- the stack might be dynamically adjusted), if we are debugging, if the
- total stack size is more than 220 bytes, or if we make calls.
+ /* Determine if we need to allocate any stack frame:
+
+ For AIX we need to push the stack if a frame pointer is needed (because
+ the stack might be dynamically adjusted), if we are debugging, if we
+ make calls, or if the sum of fp_save, gp_save, fpmem, and local variables
+ are more than the space needed to save all non-volatile registers:
+ 32-bit: 18*8 + 19*4 = 220 or 64-bit: 18*8 + 19*8 = 296
For V.4 we don't have the stack cushion that AIX uses, but assume that
the debugger can handle stackless frames. */
@@ -3236,7 +3239,8 @@ rs6000_stack_info ()
else
info_ptr->push_p = (frame_pointer_needed
|| write_symbols != NO_DEBUG
- || info_ptr->total_size > 220);
+ || ((info_ptr->total_size - info_ptr->fixed_size)
+ > (TARGET_32BIT ? 220 : 296)));
/* Calculate the offsets */
switch (abi)
@@ -3278,7 +3282,15 @@ rs6000_stack_info ()
}
if (info_ptr->fpmem_p)
- info_ptr->fpmem_offset = STARTING_FRAME_OFFSET - info_ptr->total_size + info_ptr->vars_size;
+ {
+ info_ptr->fpmem_offset = info_ptr->main_save_offset - info_ptr->fpmem_size;
+ rs6000_fpmem_size = info_ptr->fpmem_size;
+ rs6000_fpmem_offset = info_ptr->push_p
+ ? info_ptr->total_size + info_ptr->fpmem_offset
+ : info_ptr->fpmem_offset;
+ }
+ else
+ info_ptr->fpmem_offset = 0;
/* Zero offsets if we're not saving those registers */
if (!info_ptr->fp_size)
@@ -3299,14 +3311,6 @@ rs6000_stack_info ()
if (!info_ptr->main_save_p)
info_ptr->main_save_offset = 0;
- if (!info_ptr->fpmem_p)
- info_ptr->fpmem_offset = 0;
- else
- {
- rs6000_fpmem_size = info_ptr->fpmem_size;
- rs6000_fpmem_offset = info_ptr->total_size + info_ptr->fpmem_offset;
- }
-
return info_ptr;
}
diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md
index 47e0feb8e98..dcb32d4c4c0 100644
--- a/gcc/config/rs6000/rs6000.md
+++ b/gcc/config/rs6000/rs6000.md
@@ -3701,8 +3701,6 @@
xop[2] = GEN_INT ((rs6000_fpmem_offset >> 16) + ((rs6000_fpmem_offset & 0x8000) >> 15));
output_asm_insn (\"{cau|addis} %0,%1,%2\", xop);
}
- else if (rs6000_fpmem_offset < 0)
- abort ();
return \"\";
}"