aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJim Wilson <wilson@gcc.gnu.org>1992-05-19 17:41:48 -0700
committerJim Wilson <wilson@gcc.gnu.org>1992-05-19 17:41:48 -0700
commit29008b51e3d245628fc8d3b998bf20af51aefee7 (patch)
treefad8df8ca658769658ac9759b72733f205cd89cf
parentcbc3885de26e5378b74d8f208f5f5e0da2247437 (diff)
downloadgcc-29008b51e3d245628fc8d3b998bf20af51aefee7.zip
gcc-29008b51e3d245628fc8d3b998bf20af51aefee7.tar.gz
gcc-29008b51e3d245628fc8d3b998bf20af51aefee7.tar.bz2
*** empty log message ***
From-SVN: r1025
-rw-r--r--gcc/calls.c22
-rw-r--r--gcc/config/i960/i960.c6
-rw-r--r--gcc/config/i960/i960.h9
-rw-r--r--gcc/function.c4
4 files changed, 32 insertions, 9 deletions
diff --git a/gcc/calls.c b/gcc/calls.c
index b2d28e3..99eb8e9 100644
--- a/gcc/calls.c
+++ b/gcc/calls.c
@@ -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)));
diff --git a/gcc/config/i960/i960.c b/gcc/config/i960/i960.c
index afa51f4..50341ed 100644
--- a/gcc/config/i960/i960.c
+++ b/gcc/config/i960/i960.c
@@ -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;
diff --git a/gcc/config/i960/i960.h b/gcc/config/i960/i960.h
index 6765686..4d1bb42 100644
--- a/gcc/config/i960/i960.h
+++ b/gcc/config/i960/i960.h
@@ -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,
diff --git a/gcc/function.c b/gcc/function.c
index c2fc5e8..f5218e0 100644
--- a/gcc/function.c
+++ b/gcc/function.c
@@ -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)