From 29008b51e3d245628fc8d3b998bf20af51aefee7 Mon Sep 17 00:00:00 2001 From: Jim Wilson Date: Tue, 19 May 1992 17:41:48 -0700 Subject: [PATCH] *** empty log message *** From-SVN: r1025 --- gcc/calls.c | 22 +++++++++++++++++----- gcc/config/i960/i960.c | 6 ++++-- gcc/config/i960/i960.h | 9 +++++++-- gcc/function.c | 4 ++++ 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) -- 2.7.4