From: Jim Wilson Date: Tue, 5 May 1992 17:27:49 +0000 (-0700) Subject: *** empty log message *** X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=6f90e075cd97143f441aa787926250a780482fe0;p=gcc.git *** empty log message *** From-SVN: r905 --- diff --git a/gcc/calls.c b/gcc/calls.c index 90a4f670ee9..90cdb8acbc9 100644 --- a/gcc/calls.c +++ b/gcc/calls.c @@ -432,6 +432,9 @@ expand_call (exp, target, ignore) #endif #endif + /* Size of the stack reserved for paramter registers. */ + int reg_parm_stack_space = 0; + /* 1 if scanning parms front to back, -1 if scanning back to front. */ int inc; /* Address of space preallocated for stack parms @@ -513,6 +516,14 @@ expand_call (exp, target, ignore) is_volatile = TYPE_VOLATILE (TREE_TYPE (TREE_TYPE (p))); +#ifdef REG_PARM_STACK_SPACE +#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 +#endif + /* Warn if this value is an aggregate type, regardless of which calling convention we are using for it. */ if (warn_aggregate_return @@ -844,7 +855,7 @@ expand_call (exp, target, ignore) /* Compute the stack-size of this argument. */ if (args[i].reg == 0 || args[i].partial != 0 #ifdef REG_PARM_STACK_SPACE - || REG_PARM_STACK_SPACE (fndecl) > 0 + || reg_parm_stack_space > 0 #endif || args[i].pass_on_stack) locate_and_pad_parm (TYPE_MODE (type), type, @@ -896,6 +907,11 @@ expand_call (exp, target, ignore) argpos < n_named_args); } +#ifdef FINAL_REG_PARM_STACK_SPACE + reg_parm_stack_space = FINAL_REG_PARM_STACK_SPACE (args_size.constant, + args_size.var); +#endif + /* Compute the actual size of the argument block required. The variable and constant sizes must be combined, the size may have to be rounded, and there may be a minimum required size. */ @@ -920,7 +936,7 @@ expand_call (exp, target, ignore) #endif #ifdef REG_PARM_STACK_SPACE - if (REG_PARM_STACK_SPACE (fndecl) > 0) + if (reg_parm_stack_space > 0) { args_size.var = size_binop (MAX_EXPR, args_size.var, @@ -931,7 +947,7 @@ expand_call (exp, target, ignore) the size of the block we need. So make the adjustment. */ args_size.var = size_binop (MINUS_EXPR, args_size.var, - size_int (REG_PARM_STACK_SPACE (fndecl))); + size_int (reg_parm_stack_space)); #endif } #endif @@ -945,9 +961,9 @@ expand_call (exp, target, ignore) #ifdef REG_PARM_STACK_SPACE args_size.constant = MAX (args_size.constant, - REG_PARM_STACK_SPACE (fndecl)); + reg_parm_stack_space); #ifndef OUTGOING_REG_PARM_STACK_SPACE - args_size.constant -= REG_PARM_STACK_SPACE (fndecl); + args_size.constant -= reg_parm_stack_space; #endif #endif } @@ -1082,7 +1098,7 @@ expand_call (exp, target, ignore) /* Since we will be writing into the entire argument area, the map must be allocated for its entire size, not just the part that is the responsibility of the caller. */ - needed += REG_PARM_STACK_SPACE (fndecl); + needed += reg_parm_stack_space; #endif #ifdef ARGS_GROW_DOWNWARD @@ -1246,7 +1262,7 @@ expand_call (exp, target, ignore) Here we compute the boundary of the that needs to be saved, if any. */ - for (i = 0; i < REG_PARM_STACK_SPACE (fndecl); i++) + for (i = 0; i < reg_parm_stack_space; i++) { if (i >= highest_outgoing_arg_in_use || stack_usage_map[i] == 0) @@ -1299,7 +1315,7 @@ expand_call (exp, target, ignore) for (i = 0; i < num_actuals; i++) if (args[i].reg == 0 || args[i].pass_on_stack) store_one_arg (&args[i], argblock, may_be_alloca, - args_size.var != 0, fndecl); + args_size.var != 0, fndecl, reg_parm_stack_space); /* Now store any partially-in-registers parm. This is the last place a block-move can happen. */ @@ -1307,7 +1323,7 @@ expand_call (exp, target, ignore) for (i = 0; i < num_actuals; i++) if (args[i].partial != 0 && ! args[i].pass_on_stack) store_one_arg (&args[i], argblock, may_be_alloca, - args_size.var != 0, fndecl); + args_size.var != 0, fndecl, reg_parm_stack_space); #ifndef PUSH_ARGS_REVERSED #ifdef STACK_BOUNDARY @@ -1618,12 +1634,14 @@ target_for_arg (type, size, args_addr, offset) FNDECL is the declaration of the function we are calling. */ static void -store_one_arg (arg, argblock, may_be_alloca, variable_size, fndecl) +store_one_arg (arg, argblock, may_be_alloca, variable_size, fndecl, + reg_parm_stack_space) struct arg_data *arg; rtx argblock; int may_be_alloca; int variable_size; tree fndecl; + int reg_parm_stack_space; { register tree pval = arg->tree_value; rtx reg = 0; @@ -1662,7 +1680,7 @@ store_one_arg (arg, argblock, may_be_alloca, variable_size, fndecl) #ifdef REG_PARM_STACK_SPACE /* Don't store things in the fixed argument area at this point; it has already been saved. */ - && i > REG_PARM_STACK_SPACE (fndecl) + && i > reg_parm_stack_space #endif ) break; diff --git a/gcc/cse.c b/gcc/cse.c index e456a93bbc2..beb3e2b5dec 100644 --- a/gcc/cse.c +++ b/gcc/cse.c @@ -524,10 +524,21 @@ struct write_data || XEXP (X, 0) == virtual_stack_vars_rtx \ || XEXP (X, 0) == virtual_incoming_args_rtx))) -/* Similar, but also allows reference to the stack pointer. */ +/* Similar, but also allows reference to the stack pointer. + + This used to include FIXED_BASE_PLUS_P, however, we can't assume that + arg_pointer_rtx by itself is nonzero, because on at least one machine, + the i960, the arg pointer is zero when it is unused. */ #define NONZERO_BASE_PLUS_P(X) \ - (FIXED_BASE_PLUS_P (X) \ + ((X) == frame_pointer_rtx \ + || (X) == virtual_stack_vars_rtx \ + || (X) == virtual_incoming_args_rtx \ + || (GET_CODE (X) == PLUS && GET_CODE (XEXP (X, 1)) == CONST_INT \ + && (XEXP (X, 0) == frame_pointer_rtx \ + || XEXP (X, 0) == arg_pointer_rtx \ + || XEXP (X, 0) == virtual_stack_vars_rtx \ + || XEXP (X, 0) == virtual_incoming_args_rtx)) \ || (X) == stack_pointer_rtx \ || (X) == virtual_stack_dynamic_rtx \ || (X) == virtual_outgoing_args_rtx \ diff --git a/gcc/expr.c b/gcc/expr.c index 824e8e936af..680e258c071 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -3681,6 +3681,9 @@ expand_expr (exp, target, tmode, modifier) temp = simplify_binary_operation (PLUS, mode, XEXP (op1, 0), op0); if (temp != 0) op0 = temp; + /* Ensure that MULT comes first if there is one. */ + else if (GET_CODE (op0) == MULT) + op0 = gen_rtx (PLUS, mode, op0, XEXP (op1, 0)); else op0 = gen_rtx (PLUS, mode, XEXP (op1, 0), op0); diff --git a/gcc/function.c b/gcc/function.c index 819245d0219..c9a9e952084 100644 --- a/gcc/function.c +++ b/gcc/function.c @@ -2916,9 +2916,11 @@ assign_parms (fndecl, second_time) minimum length. */ #ifdef REG_PARM_STACK_SPACE +#ifndef MAYBE_REG_PARM_STACK_SPACE current_function_args_size = MAX (current_function_args_size, REG_PARM_STACK_SPACE (fndecl)); #endif +#endif #ifdef STACK_BOUNDARY #define STACK_BYTES (STACK_BOUNDARY / BITS_PER_UNIT) diff --git a/gcc/ginclude/stdarg.h b/gcc/ginclude/stdarg.h index 0dee079a2b7..bb81825d71a 100644 --- a/gcc/ginclude/stdarg.h +++ b/gcc/ginclude/stdarg.h @@ -25,6 +25,9 @@ #ifdef __sparc__ #include "va-sparc.h" #else +#ifdef __i960__ +#include "va-i960.h" +#else #ifdef _HIDDEN_VA_LIST /* On OSF1, this means varargs.h is "half-loaded". */ #undef _VA_LIST @@ -56,6 +59,7 @@ void va_end (va_list); /* Defined in libgcc.a */ (AP += __va_rounded_size (TYPE), \ *((TYPE *) (AP - __va_rounded_size (TYPE)))) +#endif /* not i960 */ #endif /* not sparc */ #endif /* not mips */ #endif /* not hp9000s800 */ diff --git a/gcc/ginclude/varargs.h b/gcc/ginclude/varargs.h index 4ea1631ca03..214bf6d9cee 100644 --- a/gcc/ginclude/varargs.h +++ b/gcc/ginclude/varargs.h @@ -28,6 +28,9 @@ #ifdef __hp9000s800__ #include "va-hp800.h" #else +#ifdef __i960__ +#include "va-i960.h" +#else #ifdef __NeXT__ @@ -95,6 +98,7 @@ typedef char * __va___list; (AP += __va_rounded_size (TYPE), \ *((TYPE *) (AP - __va_rounded_size (TYPE)))) +#endif /* not i960 */ #endif /* not hp800 */ #endif /* not m88k */ #endif /* not pyr */