*** empty log message ***
authorJim Wilson <wilson@gcc.gnu.org>
Wed, 20 May 1992 00:41:48 +0000 (17:41 -0700)
committerJim Wilson <wilson@gcc.gnu.org>
Wed, 20 May 1992 00:41:48 +0000 (17:41 -0700)
From-SVN: r1025

gcc/calls.c
gcc/config/i960/i960.c
gcc/config/i960/i960.h
gcc/function.c

index b2d28e35ee8b6ed03af8396e1e928ed48dc684d9..99eb8e95e01c4c1da521d442c53d3fcac1165c28 100644 (file)
@@ -1485,15 +1485,27 @@ expand_call (exp, target, ignore)
   else if (structure_value_addr)
     {
       if (target == 0 || GET_CODE (target) != MEM)
-       target = gen_rtx (MEM, TYPE_MODE (TREE_TYPE (exp)),
-                         memory_address (TYPE_MODE (TREE_TYPE (exp)),
-                                         structure_value_addr));
+       {
+         target = gen_rtx (MEM, TYPE_MODE (TREE_TYPE (exp)),
+                           memory_address (TYPE_MODE (TREE_TYPE (exp)),
+                                           structure_value_addr));
+         MEM_IN_STRUCT_P (target)
+           = (TREE_CODE (TREE_TYPE (exp)) == ARRAY_TYPE
+              || TREE_CODE (TREE_TYPE (exp)) == RECORD_TYPE
+              || TREE_CODE (TREE_TYPE (exp)) == UNION_TYPE);
+       }
     }
   else if (pcc_struct_value)
     {
       if (target == 0)
-       target = gen_rtx (MEM, TYPE_MODE (TREE_TYPE (exp)),
-                         copy_to_reg (valreg));
+       {
+         target = gen_rtx (MEM, TYPE_MODE (TREE_TYPE (exp)),
+                           copy_to_reg (valreg));
+         MEM_IN_STRUCT_P (target)
+           = (TREE_CODE (TREE_TYPE (exp)) == ARRAY_TYPE
+              || TREE_CODE (TREE_TYPE (exp)) == RECORD_TYPE
+              || TREE_CODE (TREE_TYPE (exp)) == UNION_TYPE);
+       }
       else if (TYPE_MODE (TREE_TYPE (exp)) != BLKmode)
        emit_move_insn (target, gen_rtx (MEM, TYPE_MODE (TREE_TYPE (exp)),
                                         copy_to_reg (valreg)));
index afa51f4564fec388ff92e358974cef5d05c9dae3..50341ed36b50041ce50504751ffe7b7cb62220d5 100644 (file)
@@ -1919,7 +1919,8 @@ i960_function_arg_advance (cum, mode, type, named)
   i960_arg_size_and_align (mode, type, &size, &align);
 
   if (named == 0 || size > 4 || cum->ca_nstackparms != 0
-      || (size + ROUND (cum->ca_nregparms, align)) > NPARM_REGS)
+      || (size + ROUND (cum->ca_nregparms, align)) > NPARM_REGS
+      || MUST_PASS_IN_STACK (mode, type))
     cum->ca_nstackparms = ROUND (cum->ca_nstackparms, align) + size;
   else
     cum->ca_nregparms = ROUND (cum->ca_nregparms, align) + size;
@@ -1941,7 +1942,8 @@ i960_function_arg (cum, mode, type, named)
   i960_arg_size_and_align (mode, type, &size, &align);
 
   if (named == 0 || size > 4 || cum->ca_nstackparms != 0
-      || (size + ROUND (cum->ca_nregparms, align)) > NPARM_REGS)
+      || (size + ROUND (cum->ca_nregparms, align)) > NPARM_REGS
+      || MUST_PASS_IN_STACK (mode, type))
     {
       cum->ca_nstackparms = ROUND (cum->ca_nstackparms, align);
       ret = 0;
index 67656862af26292b41affe2adb1f74056de01a7f..4d1bb424d456f82bf0ed3f0c9b3c8b9c14213d8d 100644 (file)
@@ -790,8 +790,13 @@ struct cum_args { int ca_nregparms; int ca_nstackparms; };
 /* Indicate the alignment boundary for an argument of the specified mode and
    type.  */
 #define FUNCTION_ARG_BOUNDARY(MODE, TYPE)                              \
-  ((TYPE) && TYPE_ALIGN (TYPE) > PARM_BOUNDARY ? TYPE_ALIGN (TYPE)     \
-   : PARM_BOUNDARY)
+  (((TYPE) != 0)                                                       \
+   ? ((TYPE_ALIGN (TYPE) <= PARM_BOUNDARY)                             \
+      ? PARM_BOUNDARY                                                  \
+      : TYPE_ALIGN (TYPE))                                             \
+   : ((GET_MODE_ALIGNMENT (MODE) <= PARM_BOUNDARY)                     \
+      ? PARM_BOUNDARY                                                  \
+      : GET_MODE_ALIGNMENT (MODE)))
 
 /* Determine where to put an argument to a function.
    Value is zero to push the argument on the stack,
index c2fc5e86a4fa58149e4301db6e7365cdd44f4210..f5218e04d9636cab29d2ff6627e27ad899bbf64b 100644 (file)
@@ -3031,7 +3031,11 @@ locate_and_pad_parm (passed_mode, type, in_regs, fndecl,
      area reserved for registers, skip that area.  */
   if (! in_regs)
     {
+#ifdef MAYBE_REG_PARM_STACK_SPACE
+      reg_parm_stack_space = MAYBE_REG_PARM_STACK_SPACE;
+#else
       reg_parm_stack_space = REG_PARM_STACK_SPACE (fndecl);
+#endif
       if (reg_parm_stack_space > 0)
        {
          if (initial_offset_ptr->var)