From: David Edelsohn Date: Sat, 18 Apr 1998 22:24:38 +0000 (+0000) Subject: rs6000.md (floatsidf2_loadaddr): rs6000_fpmem_offset will be negative in a stackless... X-Git-Tag: prereleases/egcs-1.0.3-prerelease~7 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4864f1a613382562cb383fc04916097ca9238010;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f1822e6f357c..25ce0286162d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +Sat Apr 18 19:06:59 1998 David Edelsohn + + * 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 * 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 c60cf77cbecc..e3ddfb23bc6e 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 47e0feb8e98b..dcb32d4c4c08 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 \"\"; }"