aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJim Wilson <wilson@gcc.gnu.org>1992-05-05 10:27:49 -0700
committerJim Wilson <wilson@gcc.gnu.org>1992-05-05 10:27:49 -0700
commit6f90e075cd97143f441aa787926250a780482fe0 (patch)
tree487841743bc3aaf704ff84a33e716f54944fb89c
parentf6eed26d8041cda74e0d2cff541db2f033873e28 (diff)
downloadgcc-6f90e075cd97143f441aa787926250a780482fe0.zip
gcc-6f90e075cd97143f441aa787926250a780482fe0.tar.gz
gcc-6f90e075cd97143f441aa787926250a780482fe0.tar.bz2
*** empty log message ***
From-SVN: r905
-rw-r--r--gcc/calls.c40
-rw-r--r--gcc/cse.c15
-rw-r--r--gcc/expr.c3
-rw-r--r--gcc/function.c2
-rw-r--r--gcc/ginclude/stdarg.h4
-rw-r--r--gcc/ginclude/varargs.h4
6 files changed, 55 insertions, 13 deletions
diff --git a/gcc/calls.c b/gcc/calls.c
index 90a4f67..90cdb8a 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 e456a93..beb3e2b 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 824e8e9..680e258c 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 819245d..c9a9e95 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 0dee079..bb81825 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 4ea1631..214bf6d 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 */