Commit db72d7a1 by David Edelsohn Committed by David Edelsohn

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: r19283
parent a1ecb5ca
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 15:41:16 1998 Jim Wilson <wilson@cygnus.com> Sat Apr 18 15:41:16 1998 Jim Wilson <wilson@cygnus.com>
* regmove.c (fixup_match_1): In three places, in flag_exceptions * regmove.c (fixup_match_1): In three places, in flag_exceptions
......
...@@ -3228,10 +3228,13 @@ rs6000_stack_info () ...@@ -3228,10 +3228,13 @@ rs6000_stack_info ()
info_ptr->total_size = RS6000_ALIGN (total_raw_size, ABI_STACK_BOUNDARY / BITS_PER_UNIT); info_ptr->total_size = RS6000_ALIGN (total_raw_size, ABI_STACK_BOUNDARY / BITS_PER_UNIT);
/* Determine if we need to allocate any stack frame. /* 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 For AIX we need to push the stack if a frame pointer is needed (because
total stack size is more than 220 bytes, or if we make calls. 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 For V.4 we don't have the stack cushion that AIX uses, but assume that
the debugger can handle stackless frames. */ the debugger can handle stackless frames. */
...@@ -3247,7 +3250,8 @@ rs6000_stack_info () ...@@ -3247,7 +3250,8 @@ rs6000_stack_info ()
else else
info_ptr->push_p = (frame_pointer_needed info_ptr->push_p = (frame_pointer_needed
|| write_symbols != NO_DEBUG || write_symbols != NO_DEBUG
|| info_ptr->total_size > 220); || ((info_ptr->total_size - info_ptr->fixed_size)
> (TARGET_32BIT ? 220 : 296)));
/* Calculate the offsets */ /* Calculate the offsets */
switch (abi) switch (abi)
...@@ -3289,7 +3293,15 @@ rs6000_stack_info () ...@@ -3289,7 +3293,15 @@ rs6000_stack_info ()
} }
if (info_ptr->fpmem_p) 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 */ /* Zero offsets if we're not saving those registers */
if (!info_ptr->fp_size) if (!info_ptr->fp_size)
...@@ -3310,14 +3322,6 @@ rs6000_stack_info () ...@@ -3310,14 +3322,6 @@ rs6000_stack_info ()
if (!info_ptr->main_save_p) if (!info_ptr->main_save_p)
info_ptr->main_save_offset = 0; 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; return info_ptr;
} }
......
...@@ -3701,8 +3701,6 @@ ...@@ -3701,8 +3701,6 @@
xop[2] = GEN_INT ((rs6000_fpmem_offset >> 16) + ((rs6000_fpmem_offset & 0x8000) >> 15)); xop[2] = GEN_INT ((rs6000_fpmem_offset >> 16) + ((rs6000_fpmem_offset & 0x8000) >> 15));
output_asm_insn (\"{cau|addis} %0,%1,%2\", xop); output_asm_insn (\"{cau|addis} %0,%1,%2\", xop);
} }
else if (rs6000_fpmem_offset < 0)
abort ();
return \"\"; return \"\";
}" }"
......
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