OSDN Git Service

*** empty log message ***
authorwilson <wilson@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 5 May 1992 17:27:49 +0000 (17:27 +0000)
committerwilson <wilson@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 5 May 1992 17:27:49 +0000 (17:27 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@905 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/calls.c
gcc/cse.c
gcc/expr.c
gcc/function.c
gcc/ginclude/stdarg.h
gcc/ginclude/varargs.h

index 90a4f67..90cdb8a 100644 (file)
@@ -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;
index e456a93..beb3e2b 100644 (file)
--- 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                         \
index 824e8e9..680e258 100644 (file)
@@ -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);
 
index 819245d..c9a9e95 100644 (file)
@@ -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)
index 0dee079..bb81825 100644 (file)
@@ -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 */
index 4ea1631..214bf6d 100644 (file)
@@ -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 */