calls.c (store_one_arg): If parm is passed both in stack and in register and offset...
authorChandrakala Chavva <cchavva@redhat.com>
Thu, 28 Dec 2000 01:51:55 +0000 (20:51 -0500)
committerChandra Chavva <cchavva@gcc.gnu.org>
Thu, 28 Dec 2000 01:51:55 +0000 (20:51 -0500)
 * calls.c (store_one_arg):  If parm is passed both in stack and in
        register and offset is greater than reg_parm_stack_space, split
        the offset and call emit_push_insn().

From-SVN: r38503

gcc/ChangeLog
gcc/calls.c

index d6b885817df0f295c3c52e2b084d30958623dc71..b315295d741f6ec605be86240d72cfe331fc9bb5 100644 (file)
@@ -1,3 +1,9 @@
+2000-12-27  Chandrakala Chavva  <cchavva@redhat.com>
+
+       * calls.c (store_one_arg):  If parm is passed both in stack and in
+        register and offset is greater than reg_parm_stack_space, split
+        the offset and call emit_push_insn(). 
+
 2000-12-27  Nick Clifton  <nickc@redhat.com>
 
        * ifcvt.c (noce_emit_store_flag): Handle jump insns that are
index 9513c308507b2c9777dc4d8c8c9b19406e38f1c9..51d5566d3746f64b2f4b21fa02057138e1d8df6e 100644 (file)
@@ -4535,6 +4535,30 @@ store_one_arg (arg, argblock, flags, variable_size, reg_parm_stack_space)
            }
        }
 
+      /*  If parm is passed both in stack and in register and offset is 
+         greater than reg_parm_stack_space, split the offset. */
+      if (arg->reg && arg->pass_on_stack)
+       {
+         if (arg->offset.constant < reg_parm_stack_space && arg->offset.var)
+           error ("variable offset is passed paritially in stack and in reg");
+         else if (arg->offset.constant < reg_parm_stack_space && arg->size.var)
+           error ("variable size is passed partially in stack and in reg");
+         else if (arg->offset.constant < reg_parm_stack_space 
+             && ((arg->offset.constant + arg->size.constant) 
+                  > reg_parm_stack_space))
+          {
+           rtx size_rtx1 = GEN_INT (reg_parm_stack_space - arg->offset.constant);
+           emit_push_insn (arg->value, arg->mode, TREE_TYPE (pval), size_rtx1,
+                           TYPE_ALIGN (TREE_TYPE (pval)) / BITS_PER_UNIT, 
+                           partial, reg, excess, argblock, 
+                           ARGS_SIZE_RTX (arg->offset), reg_parm_stack_space,
+                           ARGS_SIZE_RTX (arg->alignment_pad));
+
+           size_rtx = GEN_INT (INTVAL(size_rtx) - reg_parm_stack_space);
+         }
+       }
+       
+
       emit_push_insn (arg->value, arg->mode, TREE_TYPE (pval), size_rtx,
                      TYPE_ALIGN (TREE_TYPE (pval)), partial, reg, excess,
                      argblock, ARGS_SIZE_RTX (arg->offset),