diff options
author | David Edelsohn <edelsohn@mhpcc.edu> | 1998-04-18 22:24:38 +0000 |
---|---|---|
committer | Jeff Law <law@gcc.gnu.org> | 1998-04-18 16:24:38 -0600 |
commit | 4864f1a613382562cb383fc04916097ca9238010 (patch) | |
tree | 7a93f55bc01788e32c790f9b0f616d27a7e3d55f | |
parent | dc790b3c86321ec6c7ad2962e25f240c19b24940 (diff) | |
download | gcc-4864f1a613382562cb383fc04916097ca9238010.zip gcc-4864f1a613382562cb383fc04916097ca9238010.tar.gz gcc-4864f1a613382562cb383fc04916097ca9238010.tar.bz2 |
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/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/config/rs6000/rs6000.c | 32 | ||||
-rw-r--r-- | gcc/config/rs6000/rs6000.md | 2 |
3 files changed, 27 insertions, 16 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f1822e6..25ce028 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 c60cf77..e3ddfb2 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 47e0feb..dcb32d4 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 \"\"; }" |