]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
rs6000.md (floatsidf2_loadaddr): rs6000_fpmem_offset will be negative in a stackless...
authorDavid Edelsohn <edelsohn@mhpcc.edu>
Sat, 18 Apr 1998 22:24:38 +0000 (22:24 +0000)
committerJeff Law <law@gcc.gnu.org>
Sat, 18 Apr 1998 22:24:38 +0000 (16:24 -0600)
        * 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

gcc/ChangeLog
gcc/config/rs6000/rs6000.c
gcc/config/rs6000/rs6000.md

index f1822e6f357ca0ede2ac28ea667b07851bb43aad..25ce0286162d03418abfd30989f6799aad8a2619 100644 (file)
@@ -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.
index c60cf77cbecc037b3ada129162ef6f169f1b8799..e3ddfb23bc6efee513234d56735ff6825b86637d 100644 (file)
@@ -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;
 }
 
index 47e0feb8e98bda9389c7a54e925de37505c570b5..dcb32d4c4c08155cd63e00b8226b5b7ec05e76ef 100644 (file)
       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 \"\";
 }"