Use float stack slots for e500 promoted arguments

Daniel Jacobowitz drow@false.org
Thu Jul 3 23:28:00 GMT 2008


On Thu, Jul 03, 2008 at 11:33:41AM -0700, Steve Ellcey wrote:
> But it did not help with the test case I sent you.  I get the same
> error.

But from a different backtrace.  Could you try this patch?  It fixes
your testcase, and does not perturb the code used for e500 floating
point as far as I can tell.

Block-mode parameters are generally PARALLEL.  So the PARALLEL check
from before in assign_parm_setup_block_p was handling this case, and
I didn't realize it.

Testing now on x86_64-linux.

-- 
Daniel Jacobowitz
CodeSourcery

2008-07-03  Daniel Jacobowitz  <dan@codesourcery.com>

	* function.c (assign_parm_remove_parallels): Check mode of
	entry_parm.
	(assign_parm_setup_block_p): Also check mode of entry_parm.

Index: function.c
===================================================================
--- function.c	(revision 137326)
+++ function.c	(working copy)
@@ -2364,8 +2364,7 @@ assign_parm_remove_parallels (struct ass
      This can be done with register operations rather than on the
      stack, even if we will store the reconstituted parameter on the
      stack later.  */
-  if (GET_CODE (entry_parm) == PARALLEL
-      && data->passed_mode != BLKmode)
+  if (GET_CODE (entry_parm) == PARALLEL && GET_MODE (entry_parm) != BLKmode)
     {
       rtx parmreg = gen_reg_rtx (GET_MODE (entry_parm));
       emit_group_store (parmreg, entry_parm, NULL_TREE,
@@ -2421,6 +2420,8 @@ assign_parm_setup_block_p (struct assign
 {
   if (data->nominal_mode == BLKmode)
     return true;
+  if (GET_MODE (data->entry_parm) == BLKmode)
+    return true;
 
 #ifdef BLOCK_REG_PADDING
   /* Only assign_parm_setup_block knows how to deal with register arguments



More information about the Gcc-patches mailing list