OSDN Git Service

Donn Terry (donn@interix.com)
[pf3gnuchains/gcc-fork.git] / gcc / calls.c
1 /* Convert function calls to rtl insns, for GNU C compiler.
2    Copyright (C) 1989, 92-97, 1998, 1999 Free Software Foundation, Inc.
3
4 This file is part of GNU CC.
5
6 GNU CC is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
9 any later version.
10
11 GNU CC is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GNU CC; see the file COPYING.  If not, write to
18 the Free Software Foundation, 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA.  */
20
21 #include "config.h"
22 #include "system.h"
23 #include "rtl.h"
24 #include "tree.h"
25 #include "flags.h"
26 #include "expr.h"
27 #include "regs.h"
28 #include "insn-flags.h"
29 #include "toplev.h"
30 #include "output.h"
31
32 #if !defined PREFERRED_STACK_BOUNDARY && defined STACK_BOUNDARY
33 #define PREFERRED_STACK_BOUNDARY STACK_BOUNDARY
34 #endif
35
36 /* Decide whether a function's arguments should be processed
37    from first to last or from last to first.
38
39    They should if the stack and args grow in opposite directions, but
40    only if we have push insns.  */
41
42 #ifdef PUSH_ROUNDING
43
44 #if defined (STACK_GROWS_DOWNWARD) != defined (ARGS_GROW_DOWNWARD)
45 #define PUSH_ARGS_REVERSED      /* If it's last to first */
46 #endif
47
48 #endif
49
50 /* Like PREFERRED_STACK_BOUNDARY but in units of bytes, not bits.  */
51 #define STACK_BYTES (PREFERRED_STACK_BOUNDARY / BITS_PER_UNIT)
52
53 /* Data structure and subroutines used within expand_call.  */
54
55 struct arg_data
56 {
57   /* Tree node for this argument.  */
58   tree tree_value;
59   /* Mode for value; TYPE_MODE unless promoted.  */
60   enum machine_mode mode;
61   /* Current RTL value for argument, or 0 if it isn't precomputed.  */
62   rtx value;
63   /* Initially-compute RTL value for argument; only for const functions.  */
64   rtx initial_value;
65   /* Register to pass this argument in, 0 if passed on stack, or an
66      PARALLEL if the arg is to be copied into multiple non-contiguous
67      registers.  */
68   rtx reg;
69   /* If REG was promoted from the actual mode of the argument expression,
70      indicates whether the promotion is sign- or zero-extended.  */
71   int unsignedp;
72   /* Number of registers to use.  0 means put the whole arg in registers.
73      Also 0 if not passed in registers.  */
74   int partial;
75   /* Non-zero if argument must be passed on stack.
76      Note that some arguments may be passed on the stack
77      even though pass_on_stack is zero, just because FUNCTION_ARG says so.
78      pass_on_stack identifies arguments that *cannot* go in registers.  */
79   int pass_on_stack;
80   /* Offset of this argument from beginning of stack-args.  */
81   struct args_size offset;
82   /* Similar, but offset to the start of the stack slot.  Different from
83      OFFSET if this arg pads downward.  */
84   struct args_size slot_offset;
85   /* Size of this argument on the stack, rounded up for any padding it gets,
86      parts of the argument passed in registers do not count.
87      If REG_PARM_STACK_SPACE is defined, then register parms
88      are counted here as well.  */
89   struct args_size size;
90   /* Location on the stack at which parameter should be stored.  The store
91      has already been done if STACK == VALUE.  */
92   rtx stack;
93   /* Location on the stack of the start of this argument slot.  This can
94      differ from STACK if this arg pads downward.  This location is known
95      to be aligned to FUNCTION_ARG_BOUNDARY.  */
96   rtx stack_slot;
97 #ifdef ACCUMULATE_OUTGOING_ARGS
98   /* Place that this stack area has been saved, if needed.  */
99   rtx save_area;
100 #endif
101   /* If an argument's alignment does not permit direct copying into registers,
102      copy in smaller-sized pieces into pseudos.  These are stored in a
103      block pointed to by this field.  The next field says how many
104      word-sized pseudos we made.  */
105   rtx *aligned_regs;
106   int n_aligned_regs;
107 };
108
109 #ifdef ACCUMULATE_OUTGOING_ARGS
110 /* A vector of one char per byte of stack space.  A byte if non-zero if
111    the corresponding stack location has been used.
112    This vector is used to prevent a function call within an argument from
113    clobbering any stack already set up.  */
114 static char *stack_usage_map;
115
116 /* Size of STACK_USAGE_MAP.  */
117 static int highest_outgoing_arg_in_use;
118
119 /* stack_arg_under_construction is nonzero when an argument may be
120    initialized with a constructor call (including a C function that
121    returns a BLKmode struct) and expand_call must take special action
122    to make sure the object being constructed does not overlap the
123    argument list for the constructor call.  */
124 int stack_arg_under_construction;
125 #endif
126
127 static int calls_function       PROTO ((tree, int));
128 static int calls_function_1     PROTO ((tree, int));
129 static void emit_call_1         PROTO ((rtx, tree, tree, HOST_WIDE_INT,
130                                         HOST_WIDE_INT, HOST_WIDE_INT, rtx,
131                                         rtx, int, rtx, int));
132 static void special_function_p  PROTO ((char *, tree, int *, int *,
133                                         int *, int *));
134 static void precompute_register_parameters      PROTO ((int, struct arg_data *,
135                                                         int *));
136 static void store_one_arg       PROTO ((struct arg_data *, rtx, int, int,
137                                         int));
138 static void store_unaligned_arguments_into_pseudos PROTO ((struct arg_data *,
139                                                            int));
140 static int finalize_must_preallocate            PROTO ((int, int,
141                                                         struct arg_data *,
142                                                         struct args_size *));
143 static void precompute_arguments                PROTO ((int, int, int,
144                                                         struct arg_data *,
145                                                         struct args_size *));
146 static int compute_argument_block_size          PROTO ((int, 
147                                                         struct args_size *));
148 static void initialize_argument_information     PROTO ((int,
149                                                         struct arg_data *,
150                                                         struct args_size *,
151                                                         int, tree, tree,
152                                                         CUMULATIVE_ARGS *,
153                                                         int, rtx *, int *,
154                                                         int *, int *));
155 static void compute_argument_addresses          PROTO ((struct arg_data *,
156                                                         rtx, int));
157 static rtx rtx_for_function_call                PROTO ((tree, tree));
158 static void load_register_parameters            PROTO ((struct arg_data *,
159                                                         int, rtx *));
160
161 #if defined(ACCUMULATE_OUTGOING_ARGS) && defined(REG_PARM_STACK_SPACE)
162 static rtx save_fixed_argument_area     PROTO ((int, rtx, int *, int *));
163 static void restore_fixed_argument_area PROTO ((rtx, rtx, int, int));
164 #endif
165 \f
166 /* If WHICH is 1, return 1 if EXP contains a call to the built-in function
167    `alloca'.
168
169    If WHICH is 0, return 1 if EXP contains a call to any function.
170    Actually, we only need return 1 if evaluating EXP would require pushing
171    arguments on the stack, but that is too difficult to compute, so we just
172    assume any function call might require the stack.  */
173
174 static tree calls_function_save_exprs;
175
176 static int
177 calls_function (exp, which)
178      tree exp;
179      int which;
180 {
181   int val;
182   calls_function_save_exprs = 0;
183   val = calls_function_1 (exp, which);
184   calls_function_save_exprs = 0;
185   return val;
186 }
187
188 static int
189 calls_function_1 (exp, which)
190      tree exp;
191      int which;
192 {
193   register int i;
194   enum tree_code code = TREE_CODE (exp);
195   int type = TREE_CODE_CLASS (code);
196   int length = tree_code_length[(int) code];
197
198   /* If this code is language-specific, we don't know what it will do.  */
199   if ((int) code >= NUM_TREE_CODES)
200     return 1;
201
202   /* Only expressions and references can contain calls.  */
203   if (type != 'e' && type != '<' && type != '1' && type != '2' && type != 'r'
204       && type != 'b')
205     return 0;
206
207   switch (code)
208     {
209     case CALL_EXPR:
210       if (which == 0)
211         return 1;
212       else if (TREE_CODE (TREE_OPERAND (exp, 0)) == ADDR_EXPR
213                && (TREE_CODE (TREE_OPERAND (TREE_OPERAND (exp, 0), 0))
214                    == FUNCTION_DECL))
215         {
216           tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
217
218           if ((DECL_BUILT_IN (fndecl)
219                && DECL_FUNCTION_CODE (fndecl) == BUILT_IN_ALLOCA)
220               || (DECL_SAVED_INSNS (fndecl)
221                   && (FUNCTION_FLAGS (DECL_SAVED_INSNS (fndecl))
222                       & FUNCTION_FLAGS_CALLS_ALLOCA)))
223             return 1;
224         }
225
226       /* Third operand is RTL.  */
227       length = 2;
228       break;
229
230     case SAVE_EXPR:
231       if (SAVE_EXPR_RTL (exp) != 0)
232         return 0;
233       if (value_member (exp, calls_function_save_exprs))
234         return 0;
235       calls_function_save_exprs = tree_cons (NULL_TREE, exp,
236                                              calls_function_save_exprs);
237       return (TREE_OPERAND (exp, 0) != 0
238               && calls_function_1 (TREE_OPERAND (exp, 0), which));
239
240     case BLOCK:
241       {
242         register tree local;
243
244         for (local = BLOCK_VARS (exp); local; local = TREE_CHAIN (local))
245           if (DECL_INITIAL (local) != 0
246               && calls_function_1 (DECL_INITIAL (local), which))
247             return 1;
248       }
249       {
250         register tree subblock;
251
252         for (subblock = BLOCK_SUBBLOCKS (exp);
253              subblock;
254              subblock = TREE_CHAIN (subblock))
255           if (calls_function_1 (subblock, which))
256             return 1;
257       }
258       return 0;
259
260     case METHOD_CALL_EXPR:
261       length = 3;
262       break;
263
264     case WITH_CLEANUP_EXPR:
265       length = 1;
266       break;
267
268     case RTL_EXPR:
269       return 0;
270       
271     default:
272       break;
273     }
274
275   for (i = 0; i < length; i++)
276     if (TREE_OPERAND (exp, i) != 0
277         && calls_function_1 (TREE_OPERAND (exp, i), which))
278       return 1;
279
280   return 0;
281 }
282 \f
283 /* Force FUNEXP into a form suitable for the address of a CALL,
284    and return that as an rtx.  Also load the static chain register
285    if FNDECL is a nested function.
286
287    CALL_FUSAGE points to a variable holding the prospective
288    CALL_INSN_FUNCTION_USAGE information.  */
289
290 rtx
291 prepare_call_address (funexp, fndecl, call_fusage, reg_parm_seen)
292      rtx funexp;
293      tree fndecl;
294      rtx *call_fusage;
295      int reg_parm_seen;
296 {
297   rtx static_chain_value = 0;
298
299   funexp = protect_from_queue (funexp, 0);
300
301   if (fndecl != 0)
302     /* Get possible static chain value for nested function in C.  */
303     static_chain_value = lookup_static_chain (fndecl);
304
305   /* Make a valid memory address and copy constants thru pseudo-regs,
306      but not for a constant address if -fno-function-cse.  */
307   if (GET_CODE (funexp) != SYMBOL_REF)
308     /* If we are using registers for parameters, force the
309        function address into a register now.  */
310     funexp = ((SMALL_REGISTER_CLASSES && reg_parm_seen)
311               ? force_not_mem (memory_address (FUNCTION_MODE, funexp))
312               : memory_address (FUNCTION_MODE, funexp));
313   else
314     {
315 #ifndef NO_FUNCTION_CSE
316       if (optimize && ! flag_no_function_cse)
317 #ifdef NO_RECURSIVE_FUNCTION_CSE
318         if (fndecl != current_function_decl)
319 #endif
320           funexp = force_reg (Pmode, funexp);
321 #endif
322     }
323
324   if (static_chain_value != 0)
325     {
326       emit_move_insn (static_chain_rtx, static_chain_value);
327
328       if (GET_CODE (static_chain_rtx) == REG)
329         use_reg (call_fusage, static_chain_rtx);
330     }
331
332   return funexp;
333 }
334
335 /* Generate instructions to call function FUNEXP,
336    and optionally pop the results.
337    The CALL_INSN is the first insn generated.
338
339    FNDECL is the declaration node of the function.  This is given to the
340    macro RETURN_POPS_ARGS to determine whether this function pops its own args.
341
342    FUNTYPE is the data type of the function.  This is given to the macro
343    RETURN_POPS_ARGS to determine whether this function pops its own args.
344    We used to allow an identifier for library functions, but that doesn't
345    work when the return type is an aggregate type and the calling convention
346    says that the pointer to this aggregate is to be popped by the callee.
347
348    STACK_SIZE is the number of bytes of arguments on the stack,
349    rounded up to PREFERRED_STACK_BOUNDARY; zero if the size is variable.
350    This is both to put into the call insn and
351    to generate explicit popping code if necessary.
352
353    STRUCT_VALUE_SIZE is the number of bytes wanted in a structure value.
354    It is zero if this call doesn't want a structure value.
355
356    NEXT_ARG_REG is the rtx that results from executing
357      FUNCTION_ARG (args_so_far, VOIDmode, void_type_node, 1)
358    just after all the args have had their registers assigned.
359    This could be whatever you like, but normally it is the first
360    arg-register beyond those used for args in this call,
361    or 0 if all the arg-registers are used in this call.
362    It is passed on to `gen_call' so you can put this info in the call insn.
363
364    VALREG is a hard register in which a value is returned,
365    or 0 if the call does not return a value.
366
367    OLD_INHIBIT_DEFER_POP is the value that `inhibit_defer_pop' had before
368    the args to this call were processed.
369    We restore `inhibit_defer_pop' to that value.
370
371    CALL_FUSAGE is either empty or an EXPR_LIST of USE expressions that
372    denote registers used by the called function.
373
374    IS_CONST is true if this is a `const' call.  */
375
376 static void
377 emit_call_1 (funexp, fndecl, funtype, stack_size, rounded_stack_size,
378              struct_value_size, next_arg_reg, valreg, old_inhibit_defer_pop,
379              call_fusage, is_const)
380      rtx funexp;
381      tree fndecl ATTRIBUTE_UNUSED;
382      tree funtype ATTRIBUTE_UNUSED;
383      HOST_WIDE_INT stack_size;
384      HOST_WIDE_INT rounded_stack_size;
385      HOST_WIDE_INT struct_value_size;
386      rtx next_arg_reg;
387      rtx valreg;
388      int old_inhibit_defer_pop;
389      rtx call_fusage;
390      int is_const;
391 {
392   rtx rounded_stack_size_rtx = GEN_INT (rounded_stack_size);
393   rtx struct_value_size_rtx = GEN_INT (struct_value_size);
394   rtx call_insn;
395 #ifndef ACCUMULATE_OUTGOING_ARGS
396   int already_popped = 0;
397   HOST_WIDE_INT n_popped = RETURN_POPS_ARGS (fndecl, funtype, stack_size);
398 #endif
399
400   /* Ensure address is valid.  SYMBOL_REF is already valid, so no need,
401      and we don't want to load it into a register as an optimization,
402      because prepare_call_address already did it if it should be done.  */
403   if (GET_CODE (funexp) != SYMBOL_REF)
404     funexp = memory_address (FUNCTION_MODE, funexp);
405
406 #ifndef ACCUMULATE_OUTGOING_ARGS
407 #if defined (HAVE_call_pop) && defined (HAVE_call_value_pop)
408   if (HAVE_call_pop && HAVE_call_value_pop && n_popped > 0)
409     {
410       rtx n_pop = GEN_INT (n_popped);
411       rtx pat;
412
413       /* If this subroutine pops its own args, record that in the call insn
414          if possible, for the sake of frame pointer elimination.  */
415
416       if (valreg)
417         pat = gen_call_value_pop (valreg,
418                                   gen_rtx_MEM (FUNCTION_MODE, funexp),
419                                   rounded_stack_size_rtx, next_arg_reg, n_pop);
420       else
421         pat = gen_call_pop (gen_rtx_MEM (FUNCTION_MODE, funexp),
422                             rounded_stack_size_rtx, next_arg_reg, n_pop);
423
424       emit_call_insn (pat);
425       already_popped = 1;
426     }
427   else
428 #endif
429 #endif
430
431 #if defined (HAVE_call) && defined (HAVE_call_value)
432   if (HAVE_call && HAVE_call_value)
433     {
434       if (valreg)
435         emit_call_insn (gen_call_value (valreg,
436                                         gen_rtx_MEM (FUNCTION_MODE, funexp),
437                                         rounded_stack_size_rtx, next_arg_reg,
438                                         NULL_RTX));
439       else
440         emit_call_insn (gen_call (gen_rtx_MEM (FUNCTION_MODE, funexp),
441                                   rounded_stack_size_rtx, next_arg_reg,
442                                   struct_value_size_rtx));
443     }
444   else
445 #endif
446     abort ();
447
448   /* Find the CALL insn we just emitted.  */
449   for (call_insn = get_last_insn ();
450        call_insn && GET_CODE (call_insn) != CALL_INSN;
451        call_insn = PREV_INSN (call_insn))
452     ;
453
454   if (! call_insn)
455     abort ();
456
457   /* Put the register usage information on the CALL.  If there is already
458      some usage information, put ours at the end.  */
459   if (CALL_INSN_FUNCTION_USAGE (call_insn))
460     {
461       rtx link;
462
463       for (link = CALL_INSN_FUNCTION_USAGE (call_insn); XEXP (link, 1) != 0;
464            link = XEXP (link, 1))
465         ;
466
467       XEXP (link, 1) = call_fusage;
468     }
469   else
470     CALL_INSN_FUNCTION_USAGE (call_insn) = call_fusage;
471
472   /* If this is a const call, then set the insn's unchanging bit.  */
473   if (is_const)
474     CONST_CALL_P (call_insn) = 1;
475
476   /* Restore this now, so that we do defer pops for this call's args
477      if the context of the call as a whole permits.  */
478   inhibit_defer_pop = old_inhibit_defer_pop;
479
480 #ifndef ACCUMULATE_OUTGOING_ARGS
481   /* If returning from the subroutine does not automatically pop the args,
482      we need an instruction to pop them sooner or later.
483      Perhaps do it now; perhaps just record how much space to pop later.
484
485      If returning from the subroutine does pop the args, indicate that the
486      stack pointer will be changed.  */
487
488   if (n_popped > 0)
489     {
490       if (!already_popped)
491         CALL_INSN_FUNCTION_USAGE (call_insn)
492           = gen_rtx_EXPR_LIST (VOIDmode,
493                                gen_rtx_CLOBBER (VOIDmode, stack_pointer_rtx),
494                                CALL_INSN_FUNCTION_USAGE (call_insn));
495       rounded_stack_size -= n_popped;
496       rounded_stack_size_rtx = GEN_INT (rounded_stack_size);
497     }
498
499   if (rounded_stack_size != 0)
500     {
501       if (flag_defer_pop && inhibit_defer_pop == 0 && !is_const)
502         pending_stack_adjust += rounded_stack_size;
503       else
504         adjust_stack (rounded_stack_size_rtx);
505     }
506 #endif
507 }
508
509 /* Determine if the function identified by NAME and FNDECL is one with
510    special properties we wish to know about.
511
512    For example, if the function might return more than one time (setjmp), then
513    set RETURNS_TWICE to a nonzero value.
514
515    Similarly set IS_LONGJMP for if the function is in the longjmp family.
516
517    Set IS_MALLOC for any of the standard memory allocation functions which
518    allocate from the heap.
519
520    Set MAY_BE_ALLOCA for any memory allocation function that might allocate
521    space from the stack such as alloca.  */
522
523 static void
524 special_function_p (name, fndecl, returns_twice, is_longjmp,
525                     is_malloc, may_be_alloca)
526      char *name;
527      tree fndecl;
528      int *returns_twice;
529      int *is_longjmp;
530      int *is_malloc;
531      int *may_be_alloca;
532 {
533   *returns_twice = 0;
534   *is_longjmp = 0;
535   *is_malloc = 0;
536   *may_be_alloca = 0;
537
538   if (name != 0 && IDENTIFIER_LENGTH (DECL_NAME (fndecl)) <= 17
539       /* Exclude functions not at the file scope, or not `extern',
540          since they are not the magic functions we would otherwise
541          think they are.  */
542       && DECL_CONTEXT (fndecl) == NULL_TREE && TREE_PUBLIC (fndecl))
543     {
544       char *tname = name;
545
546       /* We assume that alloca will always be called by name.  It
547          makes no sense to pass it as a pointer-to-function to
548          anything that does not understand its behavior.  */
549       *may_be_alloca
550         = (((IDENTIFIER_LENGTH (DECL_NAME (fndecl)) == 6
551              && name[0] == 'a'
552              && ! strcmp (name, "alloca"))
553             || (IDENTIFIER_LENGTH (DECL_NAME (fndecl)) == 16
554                 && name[0] == '_'
555                 && ! strcmp (name, "__builtin_alloca"))));
556
557       /* Disregard prefix _, __ or __x.  */
558       if (name[0] == '_')
559         {
560           if (name[1] == '_' && name[2] == 'x')
561             tname += 3;
562           else if (name[1] == '_')
563             tname += 2;
564           else
565             tname += 1;
566         }
567
568       if (tname[0] == 's')
569         {
570           *returns_twice
571              = ((tname[1] == 'e'
572                  && (! strcmp (tname, "setjmp")
573                      || ! strcmp (tname, "setjmp_syscall")))
574                 || (tname[1] == 'i'
575                     && ! strcmp (tname, "sigsetjmp"))
576                 || (tname[1] == 'a'
577                     && ! strcmp (tname, "savectx")));
578           if (tname[1] == 'i'
579               && ! strcmp (tname, "siglongjmp"))
580             *is_longjmp = 1;
581         }
582       else if ((tname[0] == 'q' && tname[1] == 's'
583                 && ! strcmp (tname, "qsetjmp"))
584                || (tname[0] == 'v' && tname[1] == 'f'
585                    && ! strcmp (tname, "vfork")))
586         *returns_twice = 1;
587
588       else if (tname[0] == 'l' && tname[1] == 'o'
589                && ! strcmp (tname, "longjmp"))
590         *is_longjmp = 1;
591       /* XXX should have "malloc" attribute on functions instead
592          of recognizing them by name.  */
593       else if (! strcmp (tname, "malloc")
594                || ! strcmp (tname, "calloc")
595                || ! strcmp (tname, "realloc")
596                /* Note use of NAME rather than TNAME here.  These functions
597                   are only reserved when preceded with __.  */
598                || ! strcmp (name, "__vn")       /* mangled __builtin_vec_new */
599                || ! strcmp (name, "__nw")       /* mangled __builtin_new */
600                || ! strcmp (name, "__builtin_new")
601                || ! strcmp (name, "__builtin_vec_new"))
602         *is_malloc = 1;
603     }
604 }
605
606 /* Precompute all register parameters as described by ARGS, storing values
607    into fields within the ARGS array.
608
609    NUM_ACTUALS indicates the total number elements in the ARGS array.
610
611    Set REG_PARM_SEEN if we encounter a register parameter.  */
612
613 static void
614 precompute_register_parameters (num_actuals, args, reg_parm_seen)
615      int num_actuals;
616      struct arg_data *args;
617      int *reg_parm_seen;
618 {
619   int i;
620
621   *reg_parm_seen = 0;
622
623   for (i = 0; i < num_actuals; i++)
624     if (args[i].reg != 0 && ! args[i].pass_on_stack)
625       {
626         *reg_parm_seen = 1;
627
628         if (args[i].value == 0)
629           {
630             push_temp_slots ();
631             args[i].value = expand_expr (args[i].tree_value, NULL_RTX,
632                                          VOIDmode, 0);
633             preserve_temp_slots (args[i].value);
634             pop_temp_slots ();
635
636             /* ANSI doesn't require a sequence point here,
637                but PCC has one, so this will avoid some problems.  */
638             emit_queue ();
639           }
640
641         /* If we are to promote the function arg to a wider mode,
642            do it now.  */
643
644         if (args[i].mode != TYPE_MODE (TREE_TYPE (args[i].tree_value)))
645           args[i].value
646             = convert_modes (args[i].mode,
647                              TYPE_MODE (TREE_TYPE (args[i].tree_value)),
648                              args[i].value, args[i].unsignedp);
649
650         /* If the value is expensive, and we are inside an appropriately 
651            short loop, put the value into a pseudo and then put the pseudo
652            into the hard reg.
653
654            For small register classes, also do this if this call uses
655            register parameters.  This is to avoid reload conflicts while
656            loading the parameters registers.  */
657
658         if ((! (GET_CODE (args[i].value) == REG
659                 || (GET_CODE (args[i].value) == SUBREG
660                     && GET_CODE (SUBREG_REG (args[i].value)) == REG)))
661             && args[i].mode != BLKmode
662             && rtx_cost (args[i].value, SET) > 2
663             && ((SMALL_REGISTER_CLASSES && *reg_parm_seen)
664                 || preserve_subexpressions_p ()))
665           args[i].value = copy_to_mode_reg (args[i].mode, args[i].value);
666       }
667 }
668
669 #if defined(ACCUMULATE_OUTGOING_ARGS) && defined(REG_PARM_STACK_SPACE)
670
671   /* The argument list is the property of the called routine and it
672      may clobber it.  If the fixed area has been used for previous
673      parameters, we must save and restore it.  */
674 static rtx
675 save_fixed_argument_area (reg_parm_stack_space, argblock,
676                           low_to_save, high_to_save)
677      int reg_parm_stack_space;
678      rtx argblock;
679      int *low_to_save;
680      int *high_to_save;
681 {
682   int i;
683   rtx save_area = NULL_RTX;
684
685   /* Compute the boundary of the that needs to be saved, if any.  */
686 #ifdef ARGS_GROW_DOWNWARD
687   for (i = 0; i < reg_parm_stack_space + 1; i++)
688 #else
689   for (i = 0; i < reg_parm_stack_space; i++)
690 #endif
691     {
692       if (i >= highest_outgoing_arg_in_use
693           || stack_usage_map[i] == 0)
694         continue;
695
696       if (*low_to_save == -1)
697         *low_to_save = i;
698
699       *high_to_save = i;
700     }
701
702   if (*low_to_save >= 0)
703     {
704       int num_to_save = *high_to_save - *low_to_save + 1;
705       enum machine_mode save_mode
706         = mode_for_size (num_to_save * BITS_PER_UNIT, MODE_INT, 1);
707       rtx stack_area;
708
709       /* If we don't have the required alignment, must do this in BLKmode.  */
710       if ((*low_to_save & (MIN (GET_MODE_SIZE (save_mode),
711                                 BIGGEST_ALIGNMENT / UNITS_PER_WORD) - 1)))
712         save_mode = BLKmode;
713
714 #ifdef ARGS_GROW_DOWNWARD
715       stack_area = gen_rtx_MEM (save_mode,
716                                 memory_address (save_mode,
717                                                 plus_constant (argblock,
718                                                                - *high_to_save)));
719 #else
720       stack_area = gen_rtx_MEM (save_mode,
721                                 memory_address (save_mode,
722                                                 plus_constant (argblock,
723                                                                *low_to_save)));
724 #endif
725       if (save_mode == BLKmode)
726         {
727           save_area = assign_stack_temp (BLKmode, num_to_save, 0);
728           emit_block_move (validize_mem (save_area), stack_area,
729                            GEN_INT (num_to_save),
730                            PARM_BOUNDARY / BITS_PER_UNIT);
731         }
732       else
733         {
734           save_area = gen_reg_rtx (save_mode);
735           emit_move_insn (save_area, stack_area);
736         }
737     }
738   return save_area;
739 }
740
741 static void
742 restore_fixed_argument_area (save_area, argblock, high_to_save, low_to_save)
743      rtx save_area;
744      rtx argblock;
745      int high_to_save;
746      int low_to_save;
747 {
748   enum machine_mode save_mode = GET_MODE (save_area);
749 #ifdef ARGS_GROW_DOWNWARD
750   rtx stack_area
751     = gen_rtx_MEM (save_mode,
752                    memory_address (save_mode,
753                                    plus_constant (argblock,
754                                                   - high_to_save)));
755 #else
756   rtx stack_area
757     = gen_rtx_MEM (save_mode,
758                    memory_address (save_mode,
759                                    plus_constant (argblock,
760                                                   low_to_save)));
761 #endif
762
763   if (save_mode != BLKmode)
764     emit_move_insn (stack_area, save_area);
765   else
766     emit_block_move (stack_area, validize_mem (save_area),
767                      GEN_INT (high_to_save - low_to_save + 1),
768                      PARM_BOUNDARY / BITS_PER_UNIT);
769 }
770 #endif
771           
772 /* If any elements in ARGS refer to parameters that are to be passed in
773    registers, but not in memory, and whose alignment does not permit a
774    direct copy into registers.  Copy the values into a group of pseudos
775    which we will later copy into the appropriate hard registers. 
776
777    Pseudos for each unaligned argument will be stored into the array
778    args[argnum].aligned_regs.  The caller is responsible for deallocating
779    the aligned_regs array if it is nonzero.  */
780
781 static void
782 store_unaligned_arguments_into_pseudos (args, num_actuals)
783      struct arg_data *args;
784      int num_actuals;
785 {
786   int i, j;
787      
788   for (i = 0; i < num_actuals; i++)
789     if (args[i].reg != 0 && ! args[i].pass_on_stack
790         && args[i].mode == BLKmode
791         && (TYPE_ALIGN (TREE_TYPE (args[i].tree_value))
792             < (unsigned int) MIN (BIGGEST_ALIGNMENT, BITS_PER_WORD)))
793       {
794         int bytes = int_size_in_bytes (TREE_TYPE (args[i].tree_value));
795         int big_endian_correction = 0;
796
797         args[i].n_aligned_regs
798           = args[i].partial ? args[i].partial
799             : (bytes + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD;
800
801         args[i].aligned_regs = (rtx *) xmalloc (sizeof (rtx)
802                                                 * args[i].n_aligned_regs);
803
804         /* Structures smaller than a word are aligned to the least
805            significant byte (to the right).  On a BYTES_BIG_ENDIAN machine,
806            this means we must skip the empty high order bytes when
807            calculating the bit offset.  */
808         if (BYTES_BIG_ENDIAN && bytes < UNITS_PER_WORD)
809           big_endian_correction = (BITS_PER_WORD  - (bytes * BITS_PER_UNIT));
810
811         for (j = 0; j < args[i].n_aligned_regs; j++)
812           {
813             rtx reg = gen_reg_rtx (word_mode);
814             rtx word = operand_subword_force (args[i].value, j, BLKmode);
815             int bitsize = MIN (bytes * BITS_PER_UNIT, BITS_PER_WORD);
816             int bitalign = TYPE_ALIGN (TREE_TYPE (args[i].tree_value));
817
818             args[i].aligned_regs[j] = reg;
819
820             /* There is no need to restrict this code to loading items
821                in TYPE_ALIGN sized hunks.  The bitfield instructions can
822                load up entire word sized registers efficiently.
823
824                ??? This may not be needed anymore.
825                We use to emit a clobber here but that doesn't let later
826                passes optimize the instructions we emit.  By storing 0 into
827                the register later passes know the first AND to zero out the
828                bitfield being set in the register is unnecessary.  The store
829                of 0 will be deleted as will at least the first AND.  */
830
831             emit_move_insn (reg, const0_rtx);
832
833             bytes -= bitsize / BITS_PER_UNIT;
834             store_bit_field (reg, bitsize, big_endian_correction, word_mode,
835                              extract_bit_field (word, bitsize, 0, 1,
836                                                 NULL_RTX, word_mode,
837                                                 word_mode,
838                                                 bitalign / BITS_PER_UNIT,
839                                                 BITS_PER_WORD),
840                              bitalign / BITS_PER_UNIT, BITS_PER_WORD);
841           }
842       }
843 }
844
845 /* Fill in ARGS_SIZE and ARGS array based on the parameters found in
846    ACTPARMS. 
847
848    NUM_ACTUALS is the total number of parameters.
849
850    N_NAMED_ARGS is the total number of named arguments.
851
852    FNDECL is the tree code for the target of this call (if known)
853
854    ARGS_SO_FAR holds state needed by the target to know where to place
855    the next argument.
856
857    REG_PARM_STACK_SPACE is the number of bytes of stack space reserved
858    for arguments which are passed in registers.
859
860    OLD_STACK_LEVEL is a pointer to an rtx which olds the old stack level
861    and may be modified by this routine.
862
863    OLD_PENDING_ADJ, MUST_PREALLOCATE and IS_CONST are pointers to integer
864    flags which may may be modified by this routine.  */
865
866 static void
867 initialize_argument_information (num_actuals, args, args_size, n_named_args,
868                                  actparms, fndecl, args_so_far,
869                                  reg_parm_stack_space, old_stack_level,
870                                  old_pending_adj, must_preallocate, is_const)
871      int num_actuals ATTRIBUTE_UNUSED;
872      struct arg_data *args;
873      struct args_size *args_size;
874      int n_named_args ATTRIBUTE_UNUSED;
875      tree actparms;
876      tree fndecl;
877      CUMULATIVE_ARGS *args_so_far;
878      int reg_parm_stack_space;
879      rtx *old_stack_level;
880      int *old_pending_adj;
881      int *must_preallocate;
882      int *is_const;
883 {
884   /* 1 if scanning parms front to back, -1 if scanning back to front.  */
885   int inc;
886
887   /* Count arg position in order args appear.  */
888   int argpos;
889
890   int i;
891   tree p;
892   
893   args_size->constant = 0;
894   args_size->var = 0;
895
896   /* In this loop, we consider args in the order they are written.
897      We fill up ARGS from the front or from the back if necessary
898      so that in any case the first arg to be pushed ends up at the front.  */
899
900 #ifdef PUSH_ARGS_REVERSED
901   i = num_actuals - 1, inc = -1;
902   /* In this case, must reverse order of args
903      so that we compute and push the last arg first.  */
904 #else
905   i = 0, inc = 1;
906 #endif
907
908   /* I counts args in order (to be) pushed; ARGPOS counts in order written.  */
909   for (p = actparms, argpos = 0; p; p = TREE_CHAIN (p), i += inc, argpos++)
910     {
911       tree type = TREE_TYPE (TREE_VALUE (p));
912       int unsignedp;
913       enum machine_mode mode;
914
915       args[i].tree_value = TREE_VALUE (p);
916
917       /* Replace erroneous argument with constant zero.  */
918       if (type == error_mark_node || TYPE_SIZE (type) == 0)
919         args[i].tree_value = integer_zero_node, type = integer_type_node;
920
921       /* If TYPE is a transparent union, pass things the way we would
922          pass the first field of the union.  We have already verified that
923          the modes are the same.  */
924       if (TYPE_TRANSPARENT_UNION (type))
925         type = TREE_TYPE (TYPE_FIELDS (type));
926
927       /* Decide where to pass this arg.
928
929          args[i].reg is nonzero if all or part is passed in registers.
930
931          args[i].partial is nonzero if part but not all is passed in registers,
932          and the exact value says how many words are passed in registers.
933
934          args[i].pass_on_stack is nonzero if the argument must at least be
935          computed on the stack.  It may then be loaded back into registers
936          if args[i].reg is nonzero.
937
938          These decisions are driven by the FUNCTION_... macros and must agree
939          with those made by function.c.  */
940
941       /* See if this argument should be passed by invisible reference.  */
942       if ((TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST
943            && contains_placeholder_p (TYPE_SIZE (type)))
944           || TREE_ADDRESSABLE (type)
945 #ifdef FUNCTION_ARG_PASS_BY_REFERENCE
946           || FUNCTION_ARG_PASS_BY_REFERENCE (*args_so_far, TYPE_MODE (type),
947                                              type, argpos < n_named_args)
948 #endif
949           )
950         {
951           /* If we're compiling a thunk, pass through invisible
952              references instead of making a copy.  */
953           if (current_function_is_thunk
954 #ifdef FUNCTION_ARG_CALLEE_COPIES
955               || (FUNCTION_ARG_CALLEE_COPIES (*args_so_far, TYPE_MODE (type),
956                                              type, argpos < n_named_args)
957                   /* If it's in a register, we must make a copy of it too.  */
958                   /* ??? Is this a sufficient test?  Is there a better one? */
959                   && !(TREE_CODE (args[i].tree_value) == VAR_DECL
960                        && REG_P (DECL_RTL (args[i].tree_value)))
961                   && ! TREE_ADDRESSABLE (type))
962 #endif
963               )
964             {
965               /* C++ uses a TARGET_EXPR to indicate that we want to make a
966                  new object from the argument.  If we are passing by
967                  invisible reference, the callee will do that for us, so we
968                  can strip off the TARGET_EXPR.  This is not always safe,
969                  but it is safe in the only case where this is a useful
970                  optimization; namely, when the argument is a plain object.
971                  In that case, the frontend is just asking the backend to
972                  make a bitwise copy of the argument. */
973                  
974               if (TREE_CODE (args[i].tree_value) == TARGET_EXPR
975                   && (TREE_CODE_CLASS (TREE_CODE (TREE_OPERAND
976                                                   (args[i].tree_value, 1)))
977                       == 'd')
978                   && ! REG_P (DECL_RTL (TREE_OPERAND (args[i].tree_value, 1))))
979                 args[i].tree_value = TREE_OPERAND (args[i].tree_value, 1);
980
981               args[i].tree_value = build1 (ADDR_EXPR,
982                                            build_pointer_type (type),
983                                            args[i].tree_value);
984               type = build_pointer_type (type);
985             }
986           else
987             {
988               /* We make a copy of the object and pass the address to the
989                  function being called.  */
990               rtx copy;
991
992               if (TYPE_SIZE (type) == 0
993                   || TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST
994                   || (flag_stack_check && ! STACK_CHECK_BUILTIN
995                       && (TREE_INT_CST_HIGH (TYPE_SIZE (type)) != 0
996                           || (TREE_INT_CST_LOW (TYPE_SIZE (type))
997                               > STACK_CHECK_MAX_VAR_SIZE * BITS_PER_UNIT))))
998                 {
999                   /* This is a variable-sized object.  Make space on the stack
1000                      for it.  */
1001                   rtx size_rtx = expr_size (TREE_VALUE (p));
1002
1003                   if (*old_stack_level == 0)
1004                     {
1005                       emit_stack_save (SAVE_BLOCK, old_stack_level, NULL_RTX);
1006                       *old_pending_adj = pending_stack_adjust;
1007                       pending_stack_adjust = 0;
1008                     }
1009
1010                   copy = gen_rtx_MEM (BLKmode,
1011                                       allocate_dynamic_stack_space (size_rtx,
1012                                                                     NULL_RTX,
1013                                                                     TYPE_ALIGN (type)));
1014                 }
1015               else
1016                 {
1017                   int size = int_size_in_bytes (type);
1018                   copy = assign_stack_temp (TYPE_MODE (type), size, 0);
1019                 }
1020
1021               MEM_SET_IN_STRUCT_P (copy, AGGREGATE_TYPE_P (type));
1022
1023               store_expr (args[i].tree_value, copy, 0);
1024               *is_const = 0;
1025
1026               args[i].tree_value = build1 (ADDR_EXPR,
1027                                            build_pointer_type (type),
1028                                            make_tree (type, copy));
1029               type = build_pointer_type (type);
1030             }
1031         }
1032
1033       mode = TYPE_MODE (type);
1034       unsignedp = TREE_UNSIGNED (type);
1035
1036 #ifdef PROMOTE_FUNCTION_ARGS
1037       mode = promote_mode (type, mode, &unsignedp, 1);
1038 #endif
1039
1040       args[i].unsignedp = unsignedp;
1041       args[i].mode = mode;
1042       args[i].reg = FUNCTION_ARG (*args_so_far, mode, type,
1043                                   argpos < n_named_args);
1044 #ifdef FUNCTION_ARG_PARTIAL_NREGS
1045       if (args[i].reg)
1046         args[i].partial
1047           = FUNCTION_ARG_PARTIAL_NREGS (*args_so_far, mode, type,
1048                                         argpos < n_named_args);
1049 #endif
1050
1051       args[i].pass_on_stack = MUST_PASS_IN_STACK (mode, type);
1052
1053       /* If FUNCTION_ARG returned a (parallel [(expr_list (nil) ...) ...]),
1054          it means that we are to pass this arg in the register(s) designated
1055          by the PARALLEL, but also to pass it in the stack.  */
1056       if (args[i].reg && GET_CODE (args[i].reg) == PARALLEL
1057           && XEXP (XVECEXP (args[i].reg, 0, 0), 0) == 0)
1058         args[i].pass_on_stack = 1;
1059
1060       /* If this is an addressable type, we must preallocate the stack
1061          since we must evaluate the object into its final location.
1062
1063          If this is to be passed in both registers and the stack, it is simpler
1064          to preallocate.  */
1065       if (TREE_ADDRESSABLE (type)
1066           || (args[i].pass_on_stack && args[i].reg != 0))
1067         *must_preallocate = 1;
1068
1069       /* If this is an addressable type, we cannot pre-evaluate it.  Thus,
1070          we cannot consider this function call constant.  */
1071       if (TREE_ADDRESSABLE (type))
1072         *is_const = 0;
1073
1074       /* Compute the stack-size of this argument.  */
1075       if (args[i].reg == 0 || args[i].partial != 0
1076           || reg_parm_stack_space > 0
1077           || args[i].pass_on_stack)
1078         locate_and_pad_parm (mode, type,
1079 #ifdef STACK_PARMS_IN_REG_PARM_AREA
1080                              1,
1081 #else
1082                              args[i].reg != 0,
1083 #endif
1084                              fndecl, args_size, &args[i].offset,
1085                              &args[i].size);
1086
1087 #ifndef ARGS_GROW_DOWNWARD
1088       args[i].slot_offset = *args_size;
1089 #endif
1090
1091       /* If a part of the arg was put into registers,
1092          don't include that part in the amount pushed.  */
1093       if (reg_parm_stack_space == 0 && ! args[i].pass_on_stack)
1094         args[i].size.constant -= ((args[i].partial * UNITS_PER_WORD)
1095                                   / (PARM_BOUNDARY / BITS_PER_UNIT)
1096                                   * (PARM_BOUNDARY / BITS_PER_UNIT));
1097       
1098       /* Update ARGS_SIZE, the total stack space for args so far.  */
1099
1100       args_size->constant += args[i].size.constant;
1101       if (args[i].size.var)
1102         {
1103           ADD_PARM_SIZE (*args_size, args[i].size.var);
1104         }
1105
1106       /* Since the slot offset points to the bottom of the slot,
1107          we must record it after incrementing if the args grow down.  */
1108 #ifdef ARGS_GROW_DOWNWARD
1109       args[i].slot_offset = *args_size;
1110
1111       args[i].slot_offset.constant = -args_size->constant;
1112       if (args_size->var)
1113         {
1114           SUB_PARM_SIZE (args[i].slot_offset, args_size->var);
1115         }
1116 #endif
1117
1118       /* Increment ARGS_SO_FAR, which has info about which arg-registers
1119          have been used, etc.  */
1120
1121       FUNCTION_ARG_ADVANCE (*args_so_far, TYPE_MODE (type), type,
1122                             argpos < n_named_args);
1123     }
1124 }
1125
1126 /* Update ARGS_SIZE to contain the total size for the argument block.
1127    Return the original constant component of the argument block's size.
1128
1129    REG_PARM_STACK_SPACE holds the number of bytes of stack space reserved
1130    for arguments passed in registers.  */
1131
1132 static int
1133 compute_argument_block_size (reg_parm_stack_space, args_size)
1134      int reg_parm_stack_space;
1135      struct args_size *args_size;
1136 {
1137   int unadjusted_args_size = args_size->constant;
1138
1139   /* Compute the actual size of the argument block required.  The variable
1140      and constant sizes must be combined, the size may have to be rounded,
1141      and there may be a minimum required size.  */
1142
1143   if (args_size->var)
1144     {
1145       args_size->var = ARGS_SIZE_TREE (*args_size);
1146       args_size->constant = 0;
1147
1148 #ifdef PREFERRED_STACK_BOUNDARY
1149       if (PREFERRED_STACK_BOUNDARY != BITS_PER_UNIT)
1150         args_size->var = round_up (args_size->var, STACK_BYTES);
1151 #endif
1152
1153       if (reg_parm_stack_space > 0)
1154         {
1155           args_size->var
1156             = size_binop (MAX_EXPR, args_size->var,
1157                           size_int (reg_parm_stack_space));
1158
1159 #ifndef OUTGOING_REG_PARM_STACK_SPACE
1160           /* The area corresponding to register parameters is not to count in
1161              the size of the block we need.  So make the adjustment.  */
1162           args_size->var
1163             = size_binop (MINUS_EXPR, args_size->var,
1164                           size_int (reg_parm_stack_space));
1165 #endif
1166         }
1167     }
1168   else
1169     {
1170 #ifdef PREFERRED_STACK_BOUNDARY
1171       args_size->constant = (((args_size->constant
1172                                + pending_stack_adjust
1173                                + STACK_BYTES - 1)
1174                               / STACK_BYTES * STACK_BYTES)
1175                              - pending_stack_adjust);
1176 #endif
1177
1178       args_size->constant = MAX (args_size->constant,
1179                                  reg_parm_stack_space);
1180
1181 #ifdef MAYBE_REG_PARM_STACK_SPACE
1182       if (reg_parm_stack_space == 0)
1183         args_size->constant = 0;
1184 #endif
1185
1186 #ifndef OUTGOING_REG_PARM_STACK_SPACE
1187       args_size->constant -= reg_parm_stack_space;
1188 #endif
1189     }
1190   return unadjusted_args_size;
1191 }
1192
1193 /* Precompute parameters has needed for a function call.
1194
1195    IS_CONST indicates the target function is a pure function.
1196
1197    MUST_PREALLOCATE indicates that we must preallocate stack space for
1198    any stack arguments.
1199
1200    NUM_ACTUALS is the number of arguments.
1201
1202    ARGS is an array containing information for each argument; this routine
1203    fills in the INITIAL_VALUE and VALUE fields for each precomputed argument.
1204
1205    ARGS_SIZE contains information about the size of the arg list.  */
1206
1207 static void
1208 precompute_arguments (is_const, must_preallocate, num_actuals, args, args_size)
1209      int is_const;
1210      int must_preallocate;
1211      int num_actuals;
1212      struct arg_data *args;
1213      struct args_size *args_size;
1214 {
1215   int i;
1216
1217   /* If this function call is cse'able, precompute all the parameters.
1218      Note that if the parameter is constructed into a temporary, this will
1219      cause an additional copy because the parameter will be constructed
1220      into a temporary location and then copied into the outgoing arguments.
1221      If a parameter contains a call to alloca and this function uses the
1222      stack, precompute the parameter.  */
1223
1224   /* If we preallocated the stack space, and some arguments must be passed
1225      on the stack, then we must precompute any parameter which contains a
1226      function call which will store arguments on the stack.
1227      Otherwise, evaluating the parameter may clobber previous parameters
1228      which have already been stored into the stack.  */
1229
1230   for (i = 0; i < num_actuals; i++)
1231     if (is_const
1232         || ((args_size->var != 0 || args_size->constant != 0)
1233             && calls_function (args[i].tree_value, 1))
1234         || (must_preallocate
1235             && (args_size->var != 0 || args_size->constant != 0)
1236             && calls_function (args[i].tree_value, 0)))
1237       {
1238         /* If this is an addressable type, we cannot pre-evaluate it.  */
1239         if (TREE_ADDRESSABLE (TREE_TYPE (args[i].tree_value)))
1240           abort ();
1241
1242         push_temp_slots ();
1243
1244         args[i].initial_value = args[i].value
1245           = expand_expr (args[i].tree_value, NULL_RTX, VOIDmode, 0);
1246
1247         preserve_temp_slots (args[i].value);
1248         pop_temp_slots ();
1249
1250         /* ANSI doesn't require a sequence point here,
1251            but PCC has one, so this will avoid some problems.  */
1252         emit_queue ();
1253
1254         args[i].initial_value = args[i].value
1255           = protect_from_queue (args[i].initial_value, 0);
1256
1257         if (TYPE_MODE (TREE_TYPE (args[i].tree_value)) != args[i].mode)
1258           args[i].value
1259             = convert_modes (args[i].mode, 
1260                              TYPE_MODE (TREE_TYPE (args[i].tree_value)),
1261                              args[i].value, args[i].unsignedp);
1262       }
1263 }
1264
1265 /* Given the current state of MUST_PREALLOCATE and information about
1266    arguments to a function call in NUM_ACTUALS, ARGS and ARGS_SIZE,
1267    compute and return the final value for MUST_PREALLOCATE.  */
1268
1269 static int
1270 finalize_must_preallocate (must_preallocate, num_actuals, args, args_size)
1271      int must_preallocate;
1272      int num_actuals;
1273      struct arg_data *args;
1274      struct args_size *args_size;
1275 {
1276   /* See if we have or want to preallocate stack space.
1277
1278      If we would have to push a partially-in-regs parm
1279      before other stack parms, preallocate stack space instead.
1280
1281      If the size of some parm is not a multiple of the required stack
1282      alignment, we must preallocate.
1283
1284      If the total size of arguments that would otherwise create a copy in
1285      a temporary (such as a CALL) is more than half the total argument list
1286      size, preallocation is faster.
1287
1288      Another reason to preallocate is if we have a machine (like the m88k)
1289      where stack alignment is required to be maintained between every
1290      pair of insns, not just when the call is made.  However, we assume here
1291      that such machines either do not have push insns (and hence preallocation
1292      would occur anyway) or the problem is taken care of with
1293      PUSH_ROUNDING.  */
1294
1295   if (! must_preallocate)
1296     {
1297       int partial_seen = 0;
1298       int copy_to_evaluate_size = 0;
1299       int i;
1300
1301       for (i = 0; i < num_actuals && ! must_preallocate; i++)
1302         {
1303           if (args[i].partial > 0 && ! args[i].pass_on_stack)
1304             partial_seen = 1;
1305           else if (partial_seen && args[i].reg == 0)
1306             must_preallocate = 1;
1307
1308           if (TYPE_MODE (TREE_TYPE (args[i].tree_value)) == BLKmode
1309               && (TREE_CODE (args[i].tree_value) == CALL_EXPR
1310                   || TREE_CODE (args[i].tree_value) == TARGET_EXPR
1311                   || TREE_CODE (args[i].tree_value) == COND_EXPR
1312                   || TREE_ADDRESSABLE (TREE_TYPE (args[i].tree_value))))
1313             copy_to_evaluate_size
1314               += int_size_in_bytes (TREE_TYPE (args[i].tree_value));
1315         }
1316
1317       if (copy_to_evaluate_size * 2 >= args_size->constant
1318           && args_size->constant > 0)
1319         must_preallocate = 1;
1320     }
1321   return must_preallocate;
1322 }
1323
1324 /* If we preallocated stack space, compute the address of each argument
1325    and store it into the ARGS array.
1326
1327    We need not ensure it is a valid memory address here; it will be 
1328    validized when it is used.
1329
1330    ARGBLOCK is an rtx for the address of the outgoing arguments.  */
1331
1332 static void
1333 compute_argument_addresses (args, argblock, num_actuals)
1334      struct arg_data *args;
1335      rtx argblock;
1336      int num_actuals;
1337 {
1338   if (argblock)
1339     {
1340       rtx arg_reg = argblock;
1341       int i, arg_offset = 0;
1342
1343       if (GET_CODE (argblock) == PLUS)
1344         arg_reg = XEXP (argblock, 0), arg_offset = INTVAL (XEXP (argblock, 1));
1345
1346       for (i = 0; i < num_actuals; i++)
1347         {
1348           rtx offset = ARGS_SIZE_RTX (args[i].offset);
1349           rtx slot_offset = ARGS_SIZE_RTX (args[i].slot_offset);
1350           rtx addr;
1351
1352           /* Skip this parm if it will not be passed on the stack.  */
1353           if (! args[i].pass_on_stack && args[i].reg != 0)
1354             continue;
1355
1356           if (GET_CODE (offset) == CONST_INT)
1357             addr = plus_constant (arg_reg, INTVAL (offset));
1358           else
1359             addr = gen_rtx_PLUS (Pmode, arg_reg, offset);
1360
1361           addr = plus_constant (addr, arg_offset);
1362           args[i].stack = gen_rtx_MEM (args[i].mode, addr);
1363           MEM_SET_IN_STRUCT_P 
1364             (args[i].stack,
1365              AGGREGATE_TYPE_P (TREE_TYPE (args[i].tree_value)));
1366
1367           if (GET_CODE (slot_offset) == CONST_INT)
1368             addr = plus_constant (arg_reg, INTVAL (slot_offset));
1369           else
1370             addr = gen_rtx_PLUS (Pmode, arg_reg, slot_offset);
1371
1372           addr = plus_constant (addr, arg_offset);
1373           args[i].stack_slot = gen_rtx_MEM (args[i].mode, addr);
1374         }
1375     }
1376 }
1377                                                
1378 /* Given a FNDECL and EXP, return an rtx suitable for use as a target address
1379    in a call instruction.
1380
1381    FNDECL is the tree node for the target function.  For an indirect call
1382    FNDECL will be NULL_TREE.
1383
1384    EXP is the CALL_EXPR for this call.  */
1385
1386 static rtx
1387 rtx_for_function_call (fndecl, exp)
1388      tree fndecl;
1389      tree exp;
1390 {
1391   rtx funexp;
1392
1393   /* Get the function to call, in the form of RTL.  */
1394   if (fndecl)
1395     {
1396       /* If this is the first use of the function, see if we need to
1397          make an external definition for it.  */
1398       if (! TREE_USED (fndecl))
1399         {
1400           assemble_external (fndecl);
1401           TREE_USED (fndecl) = 1;
1402         }
1403
1404       /* Get a SYMBOL_REF rtx for the function address.  */
1405       funexp = XEXP (DECL_RTL (fndecl), 0);
1406     }
1407   else
1408     /* Generate an rtx (probably a pseudo-register) for the address.  */
1409     {
1410       rtx funaddr;
1411       push_temp_slots ();
1412       funaddr = funexp = 
1413           expand_expr (TREE_OPERAND (exp, 0), NULL_RTX, VOIDmode, 0);
1414       pop_temp_slots ();        /* FUNEXP can't be BLKmode */
1415
1416       /* Check the function is executable.  */
1417       if (current_function_check_memory_usage)
1418         {
1419 #ifdef POINTERS_EXTEND_UNSIGNED
1420           /* It might be OK to convert funexp in place, but there's
1421              a lot going on between here and when it happens naturally
1422              that this seems safer. */
1423           funaddr = convert_memory_address (Pmode, funexp);
1424 #endif
1425           emit_library_call (chkr_check_exec_libfunc, 1,
1426                              VOIDmode, 1,
1427                              funaddr, Pmode);
1428         }
1429       emit_queue ();
1430     }
1431   return funexp;
1432 }
1433
1434 /* Do the register loads required for any wholly-register parms or any
1435    parms which are passed both on the stack and in a register.  Their
1436    expressions were already evaluated. 
1437
1438    Mark all register-parms as living through the call, putting these USE
1439    insns in the CALL_INSN_FUNCTION_USAGE field.  */
1440
1441 static void
1442 load_register_parameters (args, num_actuals, call_fusage)
1443      struct arg_data *args;
1444      int num_actuals;
1445      rtx *call_fusage;
1446 {
1447   int i, j;
1448
1449 #ifdef LOAD_ARGS_REVERSED
1450   for (i = num_actuals - 1; i >= 0; i--)
1451 #else
1452   for (i = 0; i < num_actuals; i++)
1453 #endif
1454     {
1455       rtx reg = args[i].reg;
1456       int partial = args[i].partial;
1457       int nregs;
1458
1459       if (reg)
1460         {
1461           /* Set to non-negative if must move a word at a time, even if just
1462              one word (e.g, partial == 1 && mode == DFmode).  Set to -1 if
1463              we just use a normal move insn.  This value can be zero if the
1464              argument is a zero size structure with no fields.  */
1465           nregs = (partial ? partial
1466                    : (TYPE_MODE (TREE_TYPE (args[i].tree_value)) == BLKmode
1467                       ? ((int_size_in_bytes (TREE_TYPE (args[i].tree_value))
1468                           + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)
1469                       : -1));
1470
1471           /* Handle calls that pass values in multiple non-contiguous
1472              locations.  The Irix 6 ABI has examples of this.  */
1473
1474           if (GET_CODE (reg) == PARALLEL)
1475             {
1476               emit_group_load (reg, args[i].value,
1477                                int_size_in_bytes (TREE_TYPE (args[i].tree_value)),
1478                                (TYPE_ALIGN (TREE_TYPE (args[i].tree_value))
1479                                 / BITS_PER_UNIT));
1480             }
1481
1482           /* If simple case, just do move.  If normal partial, store_one_arg
1483              has already loaded the register for us.  In all other cases,
1484              load the register(s) from memory.  */
1485
1486           else if (nregs == -1)
1487             emit_move_insn (reg, args[i].value);
1488
1489           /* If we have pre-computed the values to put in the registers in
1490              the case of non-aligned structures, copy them in now.  */
1491
1492           else if (args[i].n_aligned_regs != 0)
1493             for (j = 0; j < args[i].n_aligned_regs; j++)
1494               emit_move_insn (gen_rtx_REG (word_mode, REGNO (reg) + j),
1495                               args[i].aligned_regs[j]);
1496
1497           else if (partial == 0 || args[i].pass_on_stack)
1498             move_block_to_reg (REGNO (reg),
1499                                validize_mem (args[i].value), nregs,
1500                                args[i].mode);
1501
1502           /* Handle calls that pass values in multiple non-contiguous
1503              locations.  The Irix 6 ABI has examples of this.  */
1504           if (GET_CODE (reg) == PARALLEL)
1505             use_group_regs (call_fusage, reg);
1506           else if (nregs == -1)
1507             use_reg (call_fusage, reg);
1508           else
1509             use_regs (call_fusage, REGNO (reg), nregs == 0 ? 1 : nregs);
1510         }
1511     }
1512 }
1513
1514 /* Generate all the code for a function call
1515    and return an rtx for its value.
1516    Store the value in TARGET (specified as an rtx) if convenient.
1517    If the value is stored in TARGET then TARGET is returned.
1518    If IGNORE is nonzero, then we ignore the value of the function call.  */
1519
1520 rtx
1521 expand_call (exp, target, ignore)
1522      tree exp;
1523      rtx target;
1524      int ignore;
1525 {
1526   /* List of actual parameters.  */
1527   tree actparms = TREE_OPERAND (exp, 1);
1528   /* RTX for the function to be called.  */
1529   rtx funexp;
1530   /* Data type of the function.  */
1531   tree funtype;
1532   /* Declaration of the function being called,
1533      or 0 if the function is computed (not known by name).  */
1534   tree fndecl = 0;
1535   char *name = 0;
1536
1537   /* Register in which non-BLKmode value will be returned,
1538      or 0 if no value or if value is BLKmode.  */
1539   rtx valreg;
1540   /* Address where we should return a BLKmode value;
1541      0 if value not BLKmode.  */
1542   rtx structure_value_addr = 0;
1543   /* Nonzero if that address is being passed by treating it as
1544      an extra, implicit first parameter.  Otherwise,
1545      it is passed by being copied directly into struct_value_rtx.  */
1546   int structure_value_addr_parm = 0;
1547   /* Size of aggregate value wanted, or zero if none wanted
1548      or if we are using the non-reentrant PCC calling convention
1549      or expecting the value in registers.  */
1550   HOST_WIDE_INT struct_value_size = 0;
1551   /* Nonzero if called function returns an aggregate in memory PCC style,
1552      by returning the address of where to find it.  */
1553   int pcc_struct_value = 0;
1554
1555   /* Number of actual parameters in this call, including struct value addr.  */
1556   int num_actuals;
1557   /* Number of named args.  Args after this are anonymous ones
1558      and they must all go on the stack.  */
1559   int n_named_args;
1560
1561   /* Vector of information about each argument.
1562      Arguments are numbered in the order they will be pushed,
1563      not the order they are written.  */
1564   struct arg_data *args;
1565
1566   /* Total size in bytes of all the stack-parms scanned so far.  */
1567   struct args_size args_size;
1568   /* Size of arguments before any adjustments (such as rounding).  */
1569   int unadjusted_args_size;
1570   /* Data on reg parms scanned so far.  */
1571   CUMULATIVE_ARGS args_so_far;
1572   /* Nonzero if a reg parm has been scanned.  */
1573   int reg_parm_seen;
1574   /* Nonzero if this is an indirect function call.  */
1575
1576   /* Nonzero if we must avoid push-insns in the args for this call. 
1577      If stack space is allocated for register parameters, but not by the
1578      caller, then it is preallocated in the fixed part of the stack frame.
1579      So the entire argument block must then be preallocated (i.e., we
1580      ignore PUSH_ROUNDING in that case).  */
1581
1582 #ifdef PUSH_ROUNDING
1583   int must_preallocate = 0;
1584 #else
1585   int must_preallocate = 1;
1586 #endif
1587
1588   /* Size of the stack reserved for parameter registers.  */
1589   int reg_parm_stack_space = 0;
1590
1591   /* Address of space preallocated for stack parms
1592      (on machines that lack push insns), or 0 if space not preallocated.  */
1593   rtx argblock = 0;
1594
1595   /* Nonzero if it is plausible that this is a call to alloca.  */
1596   int may_be_alloca;
1597   /* Nonzero if this is a call to malloc or a related function. */
1598   int is_malloc;
1599   /* Nonzero if this is a call to setjmp or a related function.  */
1600   int returns_twice;
1601   /* Nonzero if this is a call to `longjmp'.  */
1602   int is_longjmp;
1603   /* Nonzero if this is a call to an inline function.  */
1604   int is_integrable = 0;
1605   /* Nonzero if this is a call to a `const' function.
1606      Note that only explicitly named functions are handled as `const' here.  */
1607   int is_const = 0;
1608   /* Nonzero if this is a call to a `volatile' function.  */
1609   int is_volatile = 0;
1610 #if defined(ACCUMULATE_OUTGOING_ARGS) && defined(REG_PARM_STACK_SPACE)
1611   /* Define the boundary of the register parm stack space that needs to be
1612      save, if any.  */
1613   int low_to_save = -1, high_to_save;
1614   rtx save_area = 0;            /* Place that it is saved */
1615 #endif
1616
1617 #ifdef ACCUMULATE_OUTGOING_ARGS
1618   int initial_highest_arg_in_use = highest_outgoing_arg_in_use;
1619   char *initial_stack_usage_map = stack_usage_map;
1620   int old_stack_arg_under_construction;
1621 #endif
1622
1623   rtx old_stack_level = 0;
1624   int old_pending_adj = 0;
1625   int old_inhibit_defer_pop = inhibit_defer_pop;
1626   rtx call_fusage = 0;
1627   register tree p;
1628   register int i;
1629
1630   /* The value of the function call can be put in a hard register.  But
1631      if -fcheck-memory-usage, code which invokes functions (and thus
1632      damages some hard registers) can be inserted before using the value.
1633      So, target is always a pseudo-register in that case.  */
1634   if (current_function_check_memory_usage)
1635     target = 0;
1636
1637   /* See if we can find a DECL-node for the actual function.
1638      As a result, decide whether this is a call to an integrable function.  */
1639
1640   p = TREE_OPERAND (exp, 0);
1641   if (TREE_CODE (p) == ADDR_EXPR)
1642     {
1643       fndecl = TREE_OPERAND (p, 0);
1644       if (TREE_CODE (fndecl) != FUNCTION_DECL)
1645         fndecl = 0;
1646       else
1647         {
1648           if (!flag_no_inline
1649               && fndecl != current_function_decl
1650               && DECL_INLINE (fndecl)
1651               && DECL_SAVED_INSNS (fndecl)
1652               && RTX_INTEGRATED_P (DECL_SAVED_INSNS (fndecl)))
1653             is_integrable = 1;
1654           else if (! TREE_ADDRESSABLE (fndecl))
1655             {
1656               /* In case this function later becomes inlinable,
1657                  record that there was already a non-inline call to it.
1658
1659                  Use abstraction instead of setting TREE_ADDRESSABLE
1660                  directly.  */
1661               if (DECL_INLINE (fndecl) && warn_inline && !flag_no_inline
1662                   && optimize > 0)
1663                 {
1664                   warning_with_decl (fndecl, "can't inline call to `%s'");
1665                   warning ("called from here");
1666                 }
1667               mark_addressable (fndecl);
1668             }
1669
1670           if (TREE_READONLY (fndecl) && ! TREE_THIS_VOLATILE (fndecl)
1671               && TYPE_MODE (TREE_TYPE (exp)) != VOIDmode)
1672             is_const = 1;
1673
1674           if (TREE_THIS_VOLATILE (fndecl))
1675             is_volatile = 1;
1676         }
1677     }
1678
1679   /* If we don't have specific function to call, see if we have a 
1680      constant or `noreturn' function from the type.  */
1681   if (fndecl == 0)
1682     {
1683       is_const = TREE_READONLY (TREE_TYPE (TREE_TYPE (p)));
1684       is_volatile = TREE_THIS_VOLATILE (TREE_TYPE (TREE_TYPE (p)));
1685     }
1686
1687 #ifdef REG_PARM_STACK_SPACE
1688 #ifdef MAYBE_REG_PARM_STACK_SPACE
1689   reg_parm_stack_space = MAYBE_REG_PARM_STACK_SPACE;
1690 #else
1691   reg_parm_stack_space = REG_PARM_STACK_SPACE (fndecl);
1692 #endif
1693 #endif
1694
1695 #if defined(PUSH_ROUNDING) && ! defined(OUTGOING_REG_PARM_STACK_SPACE)
1696   if (reg_parm_stack_space > 0)
1697     must_preallocate = 1;
1698 #endif
1699
1700   /* Warn if this value is an aggregate type,
1701      regardless of which calling convention we are using for it.  */
1702   if (warn_aggregate_return && AGGREGATE_TYPE_P (TREE_TYPE (exp)))
1703     warning ("function call has aggregate value");
1704
1705   /* Set up a place to return a structure.  */
1706
1707   /* Cater to broken compilers.  */
1708   if (aggregate_value_p (exp))
1709     {
1710       /* This call returns a big structure.  */
1711       is_const = 0;
1712
1713 #ifdef PCC_STATIC_STRUCT_RETURN
1714       {
1715         pcc_struct_value = 1;
1716         /* Easier than making that case work right.  */
1717         if (is_integrable)
1718           {
1719             /* In case this is a static function, note that it has been
1720                used.  */
1721             if (! TREE_ADDRESSABLE (fndecl))
1722               mark_addressable (fndecl);
1723             is_integrable = 0;
1724           }
1725       }
1726 #else /* not PCC_STATIC_STRUCT_RETURN */
1727       {
1728         struct_value_size = int_size_in_bytes (TREE_TYPE (exp));
1729
1730         if (target && GET_CODE (target) == MEM)
1731           structure_value_addr = XEXP (target, 0);
1732         else
1733           {
1734             /* Assign a temporary to hold the value.  */
1735             tree d;
1736
1737             /* For variable-sized objects, we must be called with a target
1738                specified.  If we were to allocate space on the stack here,
1739                we would have no way of knowing when to free it.  */
1740
1741             if (struct_value_size < 0)
1742               abort ();
1743
1744             /* This DECL is just something to feed to mark_addressable;
1745                it doesn't get pushed.  */
1746             d = build_decl (VAR_DECL, NULL_TREE, TREE_TYPE (exp));
1747             DECL_RTL (d) = assign_temp (TREE_TYPE (exp), 1, 0, 1);
1748             mark_addressable (d);
1749             structure_value_addr = XEXP (DECL_RTL (d), 0);
1750             TREE_USED (d) = 1;
1751             target = 0;
1752           }
1753       }
1754 #endif /* not PCC_STATIC_STRUCT_RETURN */
1755     }
1756
1757   /* If called function is inline, try to integrate it.  */
1758
1759   if (is_integrable)
1760     {
1761       rtx temp;
1762 #ifdef ACCUMULATE_OUTGOING_ARGS
1763       rtx before_call = get_last_insn ();
1764 #endif
1765
1766       temp = expand_inline_function (fndecl, actparms, target,
1767                                      ignore, TREE_TYPE (exp),
1768                                      structure_value_addr);
1769
1770       /* If inlining succeeded, return.  */
1771       if (temp != (rtx) (HOST_WIDE_INT) -1)
1772         {
1773 #ifdef ACCUMULATE_OUTGOING_ARGS
1774           /* If the outgoing argument list must be preserved, push
1775              the stack before executing the inlined function if it
1776              makes any calls.  */
1777
1778           for (i = reg_parm_stack_space - 1; i >= 0; i--)
1779             if (i < highest_outgoing_arg_in_use && stack_usage_map[i] != 0)
1780               break;
1781
1782           if (stack_arg_under_construction || i >= 0)
1783             {
1784               rtx first_insn
1785                 = before_call ? NEXT_INSN (before_call) : get_insns ();
1786               rtx insn, seq;
1787
1788               /* Look for a call in the inline function code.
1789                  If OUTGOING_ARGS_SIZE (DECL_SAVED_INSNS (fndecl)) is
1790                  nonzero then there is a call and it is not necessary
1791                  to scan the insns.  */
1792
1793               if (OUTGOING_ARGS_SIZE (DECL_SAVED_INSNS (fndecl)) == 0)
1794                 for (insn = first_insn; insn; insn = NEXT_INSN (insn))
1795                   if (GET_CODE (insn) == CALL_INSN)
1796                     break;
1797
1798               if (insn)
1799                 {
1800                   /* Reserve enough stack space so that the largest
1801                      argument list of any function call in the inline
1802                      function does not overlap the argument list being
1803                      evaluated.  This is usually an overestimate because
1804                      allocate_dynamic_stack_space reserves space for an
1805                      outgoing argument list in addition to the requested
1806                      space, but there is no way to ask for stack space such
1807                      that an argument list of a certain length can be
1808                      safely constructed. 
1809
1810                      Add the stack space reserved for register arguments, if
1811                      any, in the inline function.  What is really needed is the
1812                      largest value of reg_parm_stack_space in the inline
1813                      function, but that is not available.  Using the current
1814                      value of reg_parm_stack_space is wrong, but gives
1815                      correct results on all supported machines.  */
1816
1817                   int adjust = (OUTGOING_ARGS_SIZE (DECL_SAVED_INSNS (fndecl))
1818                                 + reg_parm_stack_space);
1819
1820                   start_sequence ();
1821                   emit_stack_save (SAVE_BLOCK, &old_stack_level, NULL_RTX);
1822                   allocate_dynamic_stack_space (GEN_INT (adjust),
1823                                                 NULL_RTX, BITS_PER_UNIT);
1824                   seq = get_insns ();
1825                   end_sequence ();
1826                   emit_insns_before (seq, first_insn);
1827                   emit_stack_restore (SAVE_BLOCK, old_stack_level, NULL_RTX);
1828                 }
1829             }
1830 #endif
1831
1832           /* If the result is equivalent to TARGET, return TARGET to simplify
1833              checks in store_expr.  They can be equivalent but not equal in the
1834              case of a function that returns BLKmode.  */
1835           if (temp != target && rtx_equal_p (temp, target))
1836             return target;
1837           return temp;
1838         }
1839
1840       /* If inlining failed, mark FNDECL as needing to be compiled
1841          separately after all.  If function was declared inline,
1842          give a warning.  */
1843       if (DECL_INLINE (fndecl) && warn_inline && !flag_no_inline
1844           && optimize > 0 && ! TREE_ADDRESSABLE (fndecl))
1845         {
1846           warning_with_decl (fndecl, "inlining failed in call to `%s'");
1847           warning ("called from here");
1848         }
1849       mark_addressable (fndecl);
1850     }
1851
1852   function_call_count++;
1853
1854   if (fndecl && DECL_NAME (fndecl))
1855     name = IDENTIFIER_POINTER (DECL_NAME (fndecl));
1856
1857   /* See if this is a call to a function that can return more than once
1858      or a call to longjmp or malloc.  */
1859   special_function_p (name, fndecl, &returns_twice, &is_longjmp,
1860                       &is_malloc, &may_be_alloca);
1861
1862   if (may_be_alloca)
1863     current_function_calls_alloca = 1;
1864
1865   /* Operand 0 is a pointer-to-function; get the type of the function.  */
1866   funtype = TREE_TYPE (TREE_OPERAND (exp, 0));
1867   if (! POINTER_TYPE_P (funtype))
1868     abort ();
1869   funtype = TREE_TYPE (funtype);
1870
1871   /* When calling a const function, we must pop the stack args right away,
1872      so that the pop is deleted or moved with the call.  */
1873   if (is_const)
1874     NO_DEFER_POP;
1875
1876   /* Don't let pending stack adjusts add up to too much.
1877      Also, do all pending adjustments now
1878      if there is any chance this might be a call to alloca.  */
1879
1880   if (pending_stack_adjust >= 32
1881       || (pending_stack_adjust > 0 && may_be_alloca))
1882     do_pending_stack_adjust ();
1883
1884   /* Push the temporary stack slot level so that we can free any temporaries
1885      we make.  */
1886   push_temp_slots ();
1887
1888   /* Start updating where the next arg would go.
1889
1890      On some machines (such as the PA) indirect calls have a different
1891      calling convention than normal calls.  The last argument in
1892      INIT_CUMULATIVE_ARGS tells the backend if this is an indirect call
1893      or not.  */
1894   INIT_CUMULATIVE_ARGS (args_so_far, funtype, NULL_RTX, (fndecl == 0));
1895
1896   /* If struct_value_rtx is 0, it means pass the address
1897      as if it were an extra parameter.  */
1898   if (structure_value_addr && struct_value_rtx == 0)
1899     {
1900       /* If structure_value_addr is a REG other than
1901          virtual_outgoing_args_rtx, we can use always use it.  If it
1902          is not a REG, we must always copy it into a register.
1903          If it is virtual_outgoing_args_rtx, we must copy it to another
1904          register in some cases.  */
1905       rtx temp = (GET_CODE (structure_value_addr) != REG
1906 #ifdef ACCUMULATE_OUTGOING_ARGS
1907                   || (stack_arg_under_construction
1908                       && structure_value_addr == virtual_outgoing_args_rtx)
1909 #endif
1910                   ? copy_addr_to_reg (structure_value_addr)
1911                   : structure_value_addr);
1912
1913       actparms
1914         = tree_cons (error_mark_node,
1915                      make_tree (build_pointer_type (TREE_TYPE (funtype)),
1916                                 temp),
1917                      actparms);
1918       structure_value_addr_parm = 1;
1919     }
1920
1921   /* Count the arguments and set NUM_ACTUALS.  */
1922   for (p = actparms, i = 0; p; p = TREE_CHAIN (p)) i++;
1923   num_actuals = i;
1924
1925   /* Compute number of named args.
1926      Normally, don't include the last named arg if anonymous args follow.
1927      We do include the last named arg if STRICT_ARGUMENT_NAMING is nonzero.
1928      (If no anonymous args follow, the result of list_length is actually
1929      one too large.  This is harmless.)
1930
1931      If PRETEND_OUTGOING_VARARGS_NAMED is set and STRICT_ARGUMENT_NAMING is
1932      zero, this machine will be able to place unnamed args that were passed in
1933      registers into the stack.  So treat all args as named.  This allows the
1934      insns emitting for a specific argument list to be independent of the
1935      function declaration.
1936
1937      If PRETEND_OUTGOING_VARARGS_NAMED is not set, we do not have any reliable
1938      way to pass unnamed args in registers, so we must force them into
1939      memory.  */
1940
1941   if ((STRICT_ARGUMENT_NAMING
1942        || ! PRETEND_OUTGOING_VARARGS_NAMED)
1943       && TYPE_ARG_TYPES (funtype) != 0)
1944     n_named_args
1945       = (list_length (TYPE_ARG_TYPES (funtype))
1946          /* Don't include the last named arg.  */
1947          - (STRICT_ARGUMENT_NAMING ? 0 : 1)
1948          /* Count the struct value address, if it is passed as a parm.  */
1949          + structure_value_addr_parm);
1950   else
1951     /* If we know nothing, treat all args as named.  */
1952     n_named_args = num_actuals;
1953
1954   /* Make a vector to hold all the information about each arg.  */
1955   args = (struct arg_data *) alloca (num_actuals * sizeof (struct arg_data));
1956   bzero ((char *) args, num_actuals * sizeof (struct arg_data));
1957
1958   /* Build up entries inthe ARGS array, compute the size of the arguments
1959      into ARGS_SIZE, etc.  */
1960   initialize_argument_information (num_actuals, args, &args_size, n_named_args,
1961                                    actparms, fndecl, &args_so_far,
1962                                    reg_parm_stack_space, &old_stack_level,
1963                                    &old_pending_adj, &must_preallocate,
1964                                    &is_const);
1965
1966 #ifdef FINAL_REG_PARM_STACK_SPACE
1967   reg_parm_stack_space = FINAL_REG_PARM_STACK_SPACE (args_size.constant,
1968                                                      args_size.var);
1969 #endif
1970       
1971   if (args_size.var)
1972     {
1973       /* If this function requires a variable-sized argument list, don't try to
1974          make a cse'able block for this call.  We may be able to do this
1975          eventually, but it is too complicated to keep track of what insns go
1976          in the cse'able block and which don't.  */
1977
1978       is_const = 0;
1979       must_preallocate = 1;
1980     }
1981
1982   /* Compute the actual size of the argument block required.  The variable
1983      and constant sizes must be combined, the size may have to be rounded,
1984      and there may be a minimum required size.  */
1985   unadjusted_args_size
1986     = compute_argument_block_size (reg_parm_stack_space, &args_size);
1987
1988   /* Now make final decision about preallocating stack space.  */
1989   must_preallocate = finalize_must_preallocate (must_preallocate,
1990                                                 num_actuals, args, &args_size);
1991
1992   /* If the structure value address will reference the stack pointer, we must
1993      stabilize it.  We don't need to do this if we know that we are not going
1994      to adjust the stack pointer in processing this call.  */
1995
1996   if (structure_value_addr
1997       && (reg_mentioned_p (virtual_stack_dynamic_rtx, structure_value_addr)
1998        || reg_mentioned_p (virtual_outgoing_args_rtx, structure_value_addr))
1999       && (args_size.var
2000 #ifndef ACCUMULATE_OUTGOING_ARGS
2001           || args_size.constant
2002 #endif
2003           ))
2004     structure_value_addr = copy_to_reg (structure_value_addr);
2005
2006   /* Precompute any arguments as needed.  */
2007   precompute_arguments (is_const, must_preallocate, num_actuals,
2008                         args, &args_size);
2009
2010   /* Now we are about to start emitting insns that can be deleted
2011      if a libcall is deleted.  */
2012   if (is_const || is_malloc)
2013     start_sequence ();
2014
2015   /* If we have no actual push instructions, or shouldn't use them,
2016      make space for all args right now.  */
2017
2018   if (args_size.var != 0)
2019     {
2020       if (old_stack_level == 0)
2021         {
2022           emit_stack_save (SAVE_BLOCK, &old_stack_level, NULL_RTX);
2023           old_pending_adj = pending_stack_adjust;
2024           pending_stack_adjust = 0;
2025 #ifdef ACCUMULATE_OUTGOING_ARGS
2026           /* stack_arg_under_construction says whether a stack arg is
2027              being constructed at the old stack level.  Pushing the stack
2028              gets a clean outgoing argument block.  */
2029           old_stack_arg_under_construction = stack_arg_under_construction;
2030           stack_arg_under_construction = 0;
2031 #endif
2032         }
2033       argblock = push_block (ARGS_SIZE_RTX (args_size), 0, 0);
2034     }
2035   else
2036     {
2037       /* Note that we must go through the motions of allocating an argument
2038          block even if the size is zero because we may be storing args
2039          in the area reserved for register arguments, which may be part of
2040          the stack frame.  */
2041
2042       int needed = args_size.constant;
2043
2044       /* Store the maximum argument space used.  It will be pushed by
2045          the prologue (if ACCUMULATE_OUTGOING_ARGS, or stack overflow
2046          checking).  */
2047
2048       if (needed > current_function_outgoing_args_size)
2049         current_function_outgoing_args_size = needed;
2050
2051       if (must_preallocate)
2052         {
2053 #ifdef ACCUMULATE_OUTGOING_ARGS
2054           /* Since the stack pointer will never be pushed, it is possible for
2055              the evaluation of a parm to clobber something we have already
2056              written to the stack.  Since most function calls on RISC machines
2057              do not use the stack, this is uncommon, but must work correctly.
2058
2059              Therefore, we save any area of the stack that was already written
2060              and that we are using.  Here we set up to do this by making a new
2061              stack usage map from the old one.  The actual save will be done
2062              by store_one_arg. 
2063
2064              Another approach might be to try to reorder the argument
2065              evaluations to avoid this conflicting stack usage.  */
2066
2067 #ifndef OUTGOING_REG_PARM_STACK_SPACE
2068           /* Since we will be writing into the entire argument area, the
2069              map must be allocated for its entire size, not just the part that
2070              is the responsibility of the caller.  */
2071           needed += reg_parm_stack_space;
2072 #endif
2073
2074 #ifdef ARGS_GROW_DOWNWARD
2075           highest_outgoing_arg_in_use = MAX (initial_highest_arg_in_use,
2076                                              needed + 1);
2077 #else
2078           highest_outgoing_arg_in_use = MAX (initial_highest_arg_in_use,
2079                                              needed);
2080 #endif
2081           stack_usage_map = (char *) alloca (highest_outgoing_arg_in_use);
2082
2083           if (initial_highest_arg_in_use)
2084             bcopy (initial_stack_usage_map, stack_usage_map,
2085                    initial_highest_arg_in_use);
2086
2087           if (initial_highest_arg_in_use != highest_outgoing_arg_in_use)
2088             bzero (&stack_usage_map[initial_highest_arg_in_use],
2089                    highest_outgoing_arg_in_use - initial_highest_arg_in_use);
2090           needed = 0;
2091
2092           /* The address of the outgoing argument list must not be copied to a
2093              register here, because argblock would be left pointing to the
2094              wrong place after the call to allocate_dynamic_stack_space below.
2095              */
2096
2097           argblock = virtual_outgoing_args_rtx;
2098
2099 #else /* not ACCUMULATE_OUTGOING_ARGS */
2100           if (inhibit_defer_pop == 0)
2101             {
2102               /* Try to reuse some or all of the pending_stack_adjust
2103                  to get this space.  Maybe we can avoid any pushing.  */
2104               if (needed > pending_stack_adjust)
2105                 {
2106                   needed -= pending_stack_adjust;
2107                   pending_stack_adjust = 0;
2108                 }
2109               else
2110                 {
2111                   pending_stack_adjust -= needed;
2112                   needed = 0;
2113                 }
2114             }
2115           /* Special case this because overhead of `push_block' in this
2116              case is non-trivial.  */
2117           if (needed == 0)
2118             argblock = virtual_outgoing_args_rtx;
2119           else
2120             argblock = push_block (GEN_INT (needed), 0, 0);
2121
2122           /* We only really need to call `copy_to_reg' in the case where push
2123              insns are going to be used to pass ARGBLOCK to a function
2124              call in ARGS.  In that case, the stack pointer changes value
2125              from the allocation point to the call point, and hence
2126              the value of VIRTUAL_OUTGOING_ARGS_RTX changes as well.
2127              But might as well always do it.  */
2128           argblock = copy_to_reg (argblock);
2129 #endif /* not ACCUMULATE_OUTGOING_ARGS */
2130         }
2131     }
2132
2133 #ifdef ACCUMULATE_OUTGOING_ARGS
2134   /* The save/restore code in store_one_arg handles all cases except one:
2135      a constructor call (including a C function returning a BLKmode struct)
2136      to initialize an argument.  */
2137   if (stack_arg_under_construction)
2138     {
2139 #ifndef OUTGOING_REG_PARM_STACK_SPACE
2140       rtx push_size = GEN_INT (reg_parm_stack_space + args_size.constant);
2141 #else
2142       rtx push_size = GEN_INT (args_size.constant);
2143 #endif
2144       if (old_stack_level == 0)
2145         {
2146           emit_stack_save (SAVE_BLOCK, &old_stack_level, NULL_RTX);
2147           old_pending_adj = pending_stack_adjust;
2148           pending_stack_adjust = 0;
2149           /* stack_arg_under_construction says whether a stack arg is
2150              being constructed at the old stack level.  Pushing the stack
2151              gets a clean outgoing argument block.  */
2152           old_stack_arg_under_construction = stack_arg_under_construction;
2153           stack_arg_under_construction = 0;
2154           /* Make a new map for the new argument list.  */
2155           stack_usage_map = (char *)alloca (highest_outgoing_arg_in_use);
2156           bzero (stack_usage_map, highest_outgoing_arg_in_use);
2157           highest_outgoing_arg_in_use = 0;
2158         }
2159       allocate_dynamic_stack_space (push_size, NULL_RTX, BITS_PER_UNIT);
2160     }
2161   /* If argument evaluation might modify the stack pointer, copy the
2162      address of the argument list to a register.  */
2163   for (i = 0; i < num_actuals; i++)
2164     if (args[i].pass_on_stack)
2165       {
2166         argblock = copy_addr_to_reg (argblock);
2167         break;
2168       }
2169 #endif
2170
2171   compute_argument_addresses (args, argblock, num_actuals);
2172
2173 #ifdef PUSH_ARGS_REVERSED
2174 #ifdef PREFERRED_STACK_BOUNDARY
2175   /* If we push args individually in reverse order, perform stack alignment
2176      before the first push (the last arg).  */
2177   if (argblock == 0)
2178     anti_adjust_stack (GEN_INT (args_size.constant - unadjusted_args_size));
2179 #endif
2180 #endif
2181
2182   /* Don't try to defer pops if preallocating, not even from the first arg,
2183      since ARGBLOCK probably refers to the SP.  */
2184   if (argblock)
2185     NO_DEFER_POP;
2186
2187   funexp = rtx_for_function_call (fndecl, exp);
2188
2189   /* Figure out the register where the value, if any, will come back.  */
2190   valreg = 0;
2191   if (TYPE_MODE (TREE_TYPE (exp)) != VOIDmode
2192       && ! structure_value_addr)
2193     {
2194       if (pcc_struct_value)
2195         valreg = hard_function_value (build_pointer_type (TREE_TYPE (exp)),
2196                                       fndecl);
2197       else
2198         valreg = hard_function_value (TREE_TYPE (exp), fndecl);
2199     }
2200
2201   /* Precompute all register parameters.  It isn't safe to compute anything
2202      once we have started filling any specific hard regs.  */
2203   precompute_register_parameters (num_actuals, args, &reg_parm_seen);
2204
2205 #if defined(ACCUMULATE_OUTGOING_ARGS) && defined(REG_PARM_STACK_SPACE)
2206
2207   /* Save the fixed argument area if it's part of the caller's frame and
2208      is clobbered by argument setup for this call.  */
2209   save_area = save_fixed_argument_area (reg_parm_stack_space, argblock,
2210                                         &low_to_save, &high_to_save);
2211 #endif
2212                         
2213
2214   /* Now store (and compute if necessary) all non-register parms.
2215      These come before register parms, since they can require block-moves,
2216      which could clobber the registers used for register parms.
2217      Parms which have partial registers are not stored here,
2218      but we do preallocate space here if they want that.  */
2219
2220   for (i = 0; i < num_actuals; i++)
2221     if (args[i].reg == 0 || args[i].pass_on_stack)
2222       store_one_arg (&args[i], argblock, may_be_alloca,
2223                      args_size.var != 0, reg_parm_stack_space);
2224
2225   /* If we have a parm that is passed in registers but not in memory
2226      and whose alignment does not permit a direct copy into registers,
2227      make a group of pseudos that correspond to each register that we
2228      will later fill.  */
2229   if (STRICT_ALIGNMENT)
2230     store_unaligned_arguments_into_pseudos (args, num_actuals);
2231
2232   /* Now store any partially-in-registers parm.
2233      This is the last place a block-move can happen.  */
2234   if (reg_parm_seen)
2235     for (i = 0; i < num_actuals; i++)
2236       if (args[i].partial != 0 && ! args[i].pass_on_stack)
2237         store_one_arg (&args[i], argblock, may_be_alloca,
2238                        args_size.var != 0, reg_parm_stack_space);
2239
2240 #ifndef PUSH_ARGS_REVERSED
2241 #ifdef PREFERRED_STACK_BOUNDARY
2242   /* If we pushed args in forward order, perform stack alignment
2243      after pushing the last arg.  */
2244   if (argblock == 0)
2245     anti_adjust_stack (GEN_INT (args_size.constant - unadjusted_args_size));
2246 #endif
2247 #endif
2248
2249   /* If register arguments require space on the stack and stack space
2250      was not preallocated, allocate stack space here for arguments
2251      passed in registers.  */
2252 #if ! defined(ACCUMULATE_OUTGOING_ARGS) && defined(OUTGOING_REG_PARM_STACK_SPACE)
2253   if (must_preallocate == 0 && reg_parm_stack_space > 0)
2254     anti_adjust_stack (GEN_INT (reg_parm_stack_space));
2255 #endif
2256
2257   /* Pass the function the address in which to return a structure value.  */
2258   if (structure_value_addr && ! structure_value_addr_parm)
2259     {
2260       emit_move_insn (struct_value_rtx,
2261                       force_reg (Pmode,
2262                                  force_operand (structure_value_addr,
2263                                                 NULL_RTX)));
2264
2265       /* Mark the memory for the aggregate as write-only.  */
2266       if (current_function_check_memory_usage)
2267         emit_library_call (chkr_set_right_libfunc, 1,
2268                            VOIDmode, 3,
2269                            structure_value_addr, Pmode, 
2270                            GEN_INT (struct_value_size), TYPE_MODE (sizetype),
2271                            GEN_INT (MEMORY_USE_WO),
2272                            TYPE_MODE (integer_type_node));
2273
2274       if (GET_CODE (struct_value_rtx) == REG)
2275           use_reg (&call_fusage, struct_value_rtx);
2276     }
2277
2278   funexp = prepare_call_address (funexp, fndecl, &call_fusage, reg_parm_seen);
2279
2280   load_register_parameters (args, num_actuals, &call_fusage);
2281
2282   /* Perform postincrements before actually calling the function.  */
2283   emit_queue ();
2284
2285   /* All arguments and registers used for the call must be set up by now!  */
2286
2287   /* Generate the actual call instruction.  */
2288   emit_call_1 (funexp, fndecl, funtype, unadjusted_args_size,
2289                args_size.constant, struct_value_size,
2290                FUNCTION_ARG (args_so_far, VOIDmode, void_type_node, 1),
2291                valreg, old_inhibit_defer_pop, call_fusage, is_const);
2292
2293   /* If call is cse'able, make appropriate pair of reg-notes around it.
2294      Test valreg so we don't crash; may safely ignore `const'
2295      if return type is void.  Disable for PARALLEL return values, because
2296      we have no way to move such values into a pseudo register.  */
2297   if (is_const && valreg != 0 && GET_CODE (valreg) != PARALLEL)
2298     {
2299       rtx note = 0;
2300       rtx temp = gen_reg_rtx (GET_MODE (valreg));
2301       rtx insns;
2302
2303       /* Mark the return value as a pointer if needed.  */
2304       if (TREE_CODE (TREE_TYPE (exp)) == POINTER_TYPE)
2305         {
2306           tree pointed_to = TREE_TYPE (TREE_TYPE (exp));
2307           mark_reg_pointer (temp, TYPE_ALIGN (pointed_to) / BITS_PER_UNIT);
2308         }
2309
2310       /* Construct an "equal form" for the value which mentions all the
2311          arguments in order as well as the function name.  */
2312 #ifdef PUSH_ARGS_REVERSED
2313       for (i = 0; i < num_actuals; i++)
2314         note = gen_rtx_EXPR_LIST (VOIDmode, args[i].initial_value, note);
2315 #else
2316       for (i = num_actuals - 1; i >= 0; i--)
2317         note = gen_rtx_EXPR_LIST (VOIDmode, args[i].initial_value, note);
2318 #endif
2319       note = gen_rtx_EXPR_LIST (VOIDmode, funexp, note);
2320
2321       insns = get_insns ();
2322       end_sequence ();
2323
2324       emit_libcall_block (insns, temp, valreg, note);
2325
2326       valreg = temp;
2327     }
2328   else if (is_const)
2329     {
2330       /* Otherwise, just write out the sequence without a note.  */
2331       rtx insns = get_insns ();
2332
2333       end_sequence ();
2334       emit_insns (insns);
2335     }
2336   else if (is_malloc)
2337     {
2338       rtx temp = gen_reg_rtx (GET_MODE (valreg));
2339       rtx last, insns;
2340
2341       /* The return value from a malloc-like function is a pointer. */
2342       if (TREE_CODE (TREE_TYPE (exp)) == POINTER_TYPE)
2343         mark_reg_pointer (temp, BIGGEST_ALIGNMENT / BITS_PER_UNIT);
2344
2345       emit_move_insn (temp, valreg);
2346
2347       /* The return value from a malloc-like function can not alias
2348          anything else.  */
2349       last = get_last_insn ();
2350       REG_NOTES (last) = 
2351         gen_rtx_EXPR_LIST (REG_NOALIAS, temp, REG_NOTES (last));
2352
2353       /* Write out the sequence.  */
2354       insns = get_insns ();
2355       end_sequence ();
2356       emit_insns (insns);
2357       valreg = temp;
2358     }
2359
2360   /* For calls to `setjmp', etc., inform flow.c it should complain
2361      if nonvolatile values are live.  */
2362
2363   if (returns_twice)
2364     {
2365       emit_note (name, NOTE_INSN_SETJMP);
2366       current_function_calls_setjmp = 1;
2367     }
2368
2369   if (is_longjmp)
2370     current_function_calls_longjmp = 1;
2371
2372   /* Notice functions that cannot return.
2373      If optimizing, insns emitted below will be dead.
2374      If not optimizing, they will exist, which is useful
2375      if the user uses the `return' command in the debugger.  */
2376
2377   if (is_volatile || is_longjmp)
2378     emit_barrier ();
2379
2380   /* If value type not void, return an rtx for the value.  */
2381
2382   /* If there are cleanups to be called, don't use a hard reg as target.
2383      We need to double check this and see if it matters anymore.  */
2384   if (any_pending_cleanups (1)
2385       && target && REG_P (target)
2386       && REGNO (target) < FIRST_PSEUDO_REGISTER)
2387     target = 0;
2388
2389   if (TYPE_MODE (TREE_TYPE (exp)) == VOIDmode
2390       || ignore)
2391     {
2392       target = const0_rtx;
2393     }
2394   else if (structure_value_addr)
2395     {
2396       if (target == 0 || GET_CODE (target) != MEM)
2397         {
2398           target = gen_rtx_MEM (TYPE_MODE (TREE_TYPE (exp)),
2399                                 memory_address (TYPE_MODE (TREE_TYPE (exp)),
2400                                                 structure_value_addr));
2401           MEM_SET_IN_STRUCT_P (target,
2402                                AGGREGATE_TYPE_P (TREE_TYPE (exp)));
2403         }
2404     }
2405   else if (pcc_struct_value)
2406     {
2407       /* This is the special C++ case where we need to
2408          know what the true target was.  We take care to
2409          never use this value more than once in one expression.  */
2410       target = gen_rtx_MEM (TYPE_MODE (TREE_TYPE (exp)),
2411                             copy_to_reg (valreg));
2412       MEM_SET_IN_STRUCT_P (target, AGGREGATE_TYPE_P (TREE_TYPE (exp)));
2413     }
2414   /* Handle calls that return values in multiple non-contiguous locations.
2415      The Irix 6 ABI has examples of this.  */
2416   else if (GET_CODE (valreg) == PARALLEL)
2417     {
2418       int bytes = int_size_in_bytes (TREE_TYPE (exp));
2419
2420       if (target == 0)
2421         {
2422           target = assign_stack_temp (TYPE_MODE (TREE_TYPE (exp)), bytes, 0);
2423           MEM_SET_IN_STRUCT_P (target, AGGREGATE_TYPE_P (TREE_TYPE (exp)));
2424           preserve_temp_slots (target);
2425         }
2426
2427       emit_group_store (target, valreg, bytes,
2428                         TYPE_ALIGN (TREE_TYPE (exp)) / BITS_PER_UNIT);
2429     }
2430   else if (target && GET_MODE (target) == TYPE_MODE (TREE_TYPE (exp))
2431            && GET_MODE (target) == GET_MODE (valreg))
2432     /* TARGET and VALREG cannot be equal at this point because the latter
2433        would not have REG_FUNCTION_VALUE_P true, while the former would if
2434        it were referring to the same register.
2435
2436        If they refer to the same register, this move will be a no-op, except
2437        when function inlining is being done.  */
2438     emit_move_insn (target, valreg);
2439   else if (TYPE_MODE (TREE_TYPE (exp)) == BLKmode)
2440     target = copy_blkmode_from_reg (target, valreg, TREE_TYPE (exp));
2441   else
2442     target = copy_to_reg (valreg);
2443
2444 #ifdef PROMOTE_FUNCTION_RETURN
2445   /* If we promoted this return value, make the proper SUBREG.  TARGET
2446      might be const0_rtx here, so be careful.  */
2447   if (GET_CODE (target) == REG
2448       && TYPE_MODE (TREE_TYPE (exp)) != BLKmode
2449       && GET_MODE (target) != TYPE_MODE (TREE_TYPE (exp)))
2450     {
2451       tree type = TREE_TYPE (exp);
2452       int unsignedp = TREE_UNSIGNED (type);
2453
2454       /* If we don't promote as expected, something is wrong.  */
2455       if (GET_MODE (target)
2456           != promote_mode (type, TYPE_MODE (type), &unsignedp, 1))
2457         abort ();
2458
2459       target = gen_rtx_SUBREG (TYPE_MODE (type), target, 0);
2460       SUBREG_PROMOTED_VAR_P (target) = 1;
2461       SUBREG_PROMOTED_UNSIGNED_P (target) = unsignedp;
2462     }
2463 #endif
2464
2465   /* If size of args is variable or this was a constructor call for a stack
2466      argument, restore saved stack-pointer value.  */
2467
2468   if (old_stack_level)
2469     {
2470       emit_stack_restore (SAVE_BLOCK, old_stack_level, NULL_RTX);
2471       pending_stack_adjust = old_pending_adj;
2472 #ifdef ACCUMULATE_OUTGOING_ARGS
2473       stack_arg_under_construction = old_stack_arg_under_construction;
2474       highest_outgoing_arg_in_use = initial_highest_arg_in_use;
2475       stack_usage_map = initial_stack_usage_map;
2476 #endif
2477     }
2478 #ifdef ACCUMULATE_OUTGOING_ARGS
2479   else
2480     {
2481 #ifdef REG_PARM_STACK_SPACE
2482       if (save_area)
2483         restore_fixed_argument_area (save_area, argblock,
2484                                      high_to_save, low_to_save);
2485 #endif
2486
2487       /* If we saved any argument areas, restore them.  */
2488       for (i = 0; i < num_actuals; i++)
2489         if (args[i].save_area)
2490           {
2491             enum machine_mode save_mode = GET_MODE (args[i].save_area);
2492             rtx stack_area
2493               = gen_rtx_MEM (save_mode,
2494                              memory_address (save_mode,
2495                                              XEXP (args[i].stack_slot, 0)));
2496
2497             if (save_mode != BLKmode)
2498               emit_move_insn (stack_area, args[i].save_area);
2499             else
2500               emit_block_move (stack_area, validize_mem (args[i].save_area),
2501                                GEN_INT (args[i].size.constant),
2502                                PARM_BOUNDARY / BITS_PER_UNIT);
2503           }
2504
2505       highest_outgoing_arg_in_use = initial_highest_arg_in_use;
2506       stack_usage_map = initial_stack_usage_map;
2507     }
2508 #endif
2509
2510   /* If this was alloca, record the new stack level for nonlocal gotos.  
2511      Check for the handler slots since we might not have a save area
2512      for non-local gotos.  */
2513
2514   if (may_be_alloca && nonlocal_goto_handler_slots != 0)
2515     emit_stack_save (SAVE_NONLOCAL, &nonlocal_goto_stack_level, NULL_RTX);
2516
2517   pop_temp_slots ();
2518
2519   /* Free up storage we no longer need.  */
2520   for (i = 0; i < num_actuals; ++i)
2521     if (args[i].aligned_regs)
2522       free (args[i].aligned_regs);
2523
2524   return target;
2525 }
2526 \f
2527 /* Output a library call to function FUN (a SYMBOL_REF rtx)
2528    (emitting the queue unless NO_QUEUE is nonzero),
2529    for a value of mode OUTMODE,
2530    with NARGS different arguments, passed as alternating rtx values
2531    and machine_modes to convert them to.
2532    The rtx values should have been passed through protect_from_queue already.
2533
2534    NO_QUEUE will be true if and only if the library call is a `const' call
2535    which will be enclosed in REG_LIBCALL/REG_RETVAL notes; it is equivalent
2536    to the variable is_const in expand_call.
2537
2538    NO_QUEUE must be true for const calls, because if it isn't, then
2539    any pending increment will be emitted between REG_LIBCALL/REG_RETVAL notes,
2540    and will be lost if the libcall sequence is optimized away.
2541
2542    NO_QUEUE must be false for non-const calls, because if it isn't, the
2543    call insn will have its CONST_CALL_P bit set, and it will be incorrectly
2544    optimized.  For instance, the instruction scheduler may incorrectly
2545    move memory references across the non-const call.  */
2546
2547 void
2548 emit_library_call VPROTO((rtx orgfun, int no_queue, enum machine_mode outmode,
2549                           int nargs, ...))
2550 {
2551 #ifndef ANSI_PROTOTYPES
2552   rtx orgfun;
2553   int no_queue;
2554   enum machine_mode outmode;
2555   int nargs;
2556 #endif
2557   va_list p;
2558   /* Total size in bytes of all the stack-parms scanned so far.  */
2559   struct args_size args_size;
2560   /* Size of arguments before any adjustments (such as rounding).  */
2561   struct args_size original_args_size;
2562   register int argnum;
2563   rtx fun;
2564   int inc;
2565   int count;
2566   rtx argblock = 0;
2567   CUMULATIVE_ARGS args_so_far;
2568   struct arg { rtx value; enum machine_mode mode; rtx reg; int partial;
2569                struct args_size offset; struct args_size size; rtx save_area; };
2570   struct arg *argvec;
2571   int old_inhibit_defer_pop = inhibit_defer_pop;
2572   rtx call_fusage = 0;
2573   int reg_parm_stack_space = 0;
2574 #if defined(ACCUMULATE_OUTGOING_ARGS) && defined(REG_PARM_STACK_SPACE)
2575   /* Define the boundary of the register parm stack space that needs to be
2576      save, if any.  */
2577   int low_to_save = -1, high_to_save;
2578   rtx save_area = 0;            /* Place that it is saved */
2579 #endif
2580
2581 #ifdef ACCUMULATE_OUTGOING_ARGS
2582   int initial_highest_arg_in_use = highest_outgoing_arg_in_use;
2583   char *initial_stack_usage_map = stack_usage_map;
2584   int needed;
2585 #endif
2586
2587 #ifdef REG_PARM_STACK_SPACE
2588   /* Size of the stack reserved for parameter registers.  */
2589 #ifdef MAYBE_REG_PARM_STACK_SPACE
2590   reg_parm_stack_space = MAYBE_REG_PARM_STACK_SPACE;
2591 #else
2592   reg_parm_stack_space = REG_PARM_STACK_SPACE ((tree) 0);
2593 #endif
2594 #endif
2595
2596   VA_START (p, nargs);
2597
2598 #ifndef ANSI_PROTOTYPES
2599   orgfun = va_arg (p, rtx);
2600   no_queue = va_arg (p, int);
2601   outmode = va_arg (p, enum machine_mode);
2602   nargs = va_arg (p, int);
2603 #endif
2604
2605   fun = orgfun;
2606
2607   /* Copy all the libcall-arguments out of the varargs data
2608      and into a vector ARGVEC.
2609
2610      Compute how to pass each argument.  We only support a very small subset
2611      of the full argument passing conventions to limit complexity here since
2612      library functions shouldn't have many args.  */
2613
2614   argvec = (struct arg *) alloca (nargs * sizeof (struct arg));
2615   bzero ((char *) argvec, nargs * sizeof (struct arg));
2616
2617
2618   INIT_CUMULATIVE_ARGS (args_so_far, NULL_TREE, fun, 0);
2619
2620   args_size.constant = 0;
2621   args_size.var = 0;
2622
2623   push_temp_slots ();
2624
2625   for (count = 0; count < nargs; count++)
2626     {
2627       rtx val = va_arg (p, rtx);
2628       enum machine_mode mode = va_arg (p, enum machine_mode);
2629
2630       /* We cannot convert the arg value to the mode the library wants here;
2631          must do it earlier where we know the signedness of the arg.  */
2632       if (mode == BLKmode
2633           || (GET_MODE (val) != mode && GET_MODE (val) != VOIDmode))
2634         abort ();
2635
2636       /* On some machines, there's no way to pass a float to a library fcn.
2637          Pass it as a double instead.  */
2638 #ifdef LIBGCC_NEEDS_DOUBLE
2639       if (LIBGCC_NEEDS_DOUBLE && mode == SFmode)
2640         val = convert_modes (DFmode, SFmode, val, 0), mode = DFmode;
2641 #endif
2642
2643       /* There's no need to call protect_from_queue, because
2644          either emit_move_insn or emit_push_insn will do that.  */
2645
2646       /* Make sure it is a reasonable operand for a move or push insn.  */
2647       if (GET_CODE (val) != REG && GET_CODE (val) != MEM
2648           && ! (CONSTANT_P (val) && LEGITIMATE_CONSTANT_P (val)))
2649         val = force_operand (val, NULL_RTX);
2650
2651 #ifdef FUNCTION_ARG_PASS_BY_REFERENCE
2652       if (FUNCTION_ARG_PASS_BY_REFERENCE (args_so_far, mode, NULL_TREE, 1))
2653         {
2654           /* We do not support FUNCTION_ARG_CALLEE_COPIES here since it can
2655              be viewed as just an efficiency improvement.  */
2656           rtx slot = assign_stack_temp (mode, GET_MODE_SIZE (mode), 0);
2657           emit_move_insn (slot, val);
2658           val = force_operand (XEXP (slot, 0), NULL_RTX);
2659           mode = Pmode;
2660         }
2661 #endif
2662
2663       argvec[count].value = val;
2664       argvec[count].mode = mode;
2665
2666       argvec[count].reg = FUNCTION_ARG (args_so_far, mode, NULL_TREE, 1);
2667       if (argvec[count].reg && GET_CODE (argvec[count].reg) == PARALLEL)
2668         abort ();
2669 #ifdef FUNCTION_ARG_PARTIAL_NREGS
2670       argvec[count].partial
2671         = FUNCTION_ARG_PARTIAL_NREGS (args_so_far, mode, NULL_TREE, 1);
2672 #else
2673       argvec[count].partial = 0;
2674 #endif
2675
2676       locate_and_pad_parm (mode, NULL_TREE,
2677                            argvec[count].reg && argvec[count].partial == 0,
2678                            NULL_TREE, &args_size, &argvec[count].offset,
2679                            &argvec[count].size);
2680
2681       if (argvec[count].size.var)
2682         abort ();
2683
2684       if (reg_parm_stack_space == 0 && argvec[count].partial)
2685         argvec[count].size.constant -= argvec[count].partial * UNITS_PER_WORD;
2686
2687       if (argvec[count].reg == 0 || argvec[count].partial != 0
2688           || reg_parm_stack_space > 0)
2689         args_size.constant += argvec[count].size.constant;
2690
2691       FUNCTION_ARG_ADVANCE (args_so_far, mode, (tree) 0, 1);
2692     }
2693   va_end (p);
2694
2695 #ifdef FINAL_REG_PARM_STACK_SPACE
2696   reg_parm_stack_space = FINAL_REG_PARM_STACK_SPACE (args_size.constant,
2697                                                      args_size.var);
2698 #endif
2699       
2700   /* If this machine requires an external definition for library
2701      functions, write one out.  */
2702   assemble_external_libcall (fun);
2703
2704   original_args_size = args_size;
2705 #ifdef PREFERRED_STACK_BOUNDARY
2706   args_size.constant = (((args_size.constant + (STACK_BYTES - 1))
2707                          / STACK_BYTES) * STACK_BYTES);
2708 #endif
2709
2710   args_size.constant = MAX (args_size.constant,
2711                             reg_parm_stack_space);
2712
2713 #ifndef OUTGOING_REG_PARM_STACK_SPACE
2714   args_size.constant -= reg_parm_stack_space;
2715 #endif
2716
2717   if (args_size.constant > current_function_outgoing_args_size)
2718     current_function_outgoing_args_size = args_size.constant;
2719
2720 #ifdef ACCUMULATE_OUTGOING_ARGS
2721   /* Since the stack pointer will never be pushed, it is possible for
2722      the evaluation of a parm to clobber something we have already
2723      written to the stack.  Since most function calls on RISC machines
2724      do not use the stack, this is uncommon, but must work correctly.
2725
2726      Therefore, we save any area of the stack that was already written
2727      and that we are using.  Here we set up to do this by making a new
2728      stack usage map from the old one.
2729
2730      Another approach might be to try to reorder the argument
2731      evaluations to avoid this conflicting stack usage.  */
2732
2733   needed = args_size.constant;
2734
2735 #ifndef OUTGOING_REG_PARM_STACK_SPACE
2736   /* Since we will be writing into the entire argument area, the
2737      map must be allocated for its entire size, not just the part that
2738      is the responsibility of the caller.  */
2739   needed += reg_parm_stack_space;
2740 #endif
2741
2742 #ifdef ARGS_GROW_DOWNWARD
2743   highest_outgoing_arg_in_use = MAX (initial_highest_arg_in_use,
2744                                      needed + 1);
2745 #else
2746   highest_outgoing_arg_in_use = MAX (initial_highest_arg_in_use,
2747                                      needed);
2748 #endif
2749   stack_usage_map = (char *) alloca (highest_outgoing_arg_in_use);
2750
2751   if (initial_highest_arg_in_use)
2752     bcopy (initial_stack_usage_map, stack_usage_map,
2753            initial_highest_arg_in_use);
2754
2755   if (initial_highest_arg_in_use != highest_outgoing_arg_in_use)
2756     bzero (&stack_usage_map[initial_highest_arg_in_use],
2757            highest_outgoing_arg_in_use - initial_highest_arg_in_use);
2758   needed = 0;
2759
2760   /* The address of the outgoing argument list must not be copied to a
2761      register here, because argblock would be left pointing to the
2762      wrong place after the call to allocate_dynamic_stack_space below.
2763      */
2764
2765   argblock = virtual_outgoing_args_rtx;
2766 #else /* not ACCUMULATE_OUTGOING_ARGS */
2767 #ifndef PUSH_ROUNDING
2768   argblock = push_block (GEN_INT (args_size.constant), 0, 0);
2769 #endif
2770 #endif
2771
2772 #ifdef PUSH_ARGS_REVERSED
2773 #ifdef PREFERRED_STACK_BOUNDARY
2774   /* If we push args individually in reverse order, perform stack alignment
2775      before the first push (the last arg).  */
2776   if (argblock == 0)
2777     anti_adjust_stack (GEN_INT (args_size.constant
2778                                 - original_args_size.constant));
2779 #endif
2780 #endif
2781
2782 #ifdef PUSH_ARGS_REVERSED
2783   inc = -1;
2784   argnum = nargs - 1;
2785 #else
2786   inc = 1;
2787   argnum = 0;
2788 #endif
2789
2790 #if defined(ACCUMULATE_OUTGOING_ARGS) && defined(REG_PARM_STACK_SPACE)
2791   /* The argument list is the property of the called routine and it
2792      may clobber it.  If the fixed area has been used for previous
2793      parameters, we must save and restore it.
2794
2795      Here we compute the boundary of the that needs to be saved, if any.  */
2796
2797 #ifdef ARGS_GROW_DOWNWARD
2798   for (count = 0; count < reg_parm_stack_space + 1; count++)
2799 #else
2800   for (count = 0; count < reg_parm_stack_space; count++)
2801 #endif
2802     {
2803       if (count >=  highest_outgoing_arg_in_use
2804           || stack_usage_map[count] == 0)
2805         continue;
2806
2807       if (low_to_save == -1)
2808         low_to_save = count;
2809
2810       high_to_save = count;
2811     }
2812
2813   if (low_to_save >= 0)
2814     {
2815       int num_to_save = high_to_save - low_to_save + 1;
2816       enum machine_mode save_mode
2817         = mode_for_size (num_to_save * BITS_PER_UNIT, MODE_INT, 1);
2818       rtx stack_area;
2819
2820       /* If we don't have the required alignment, must do this in BLKmode.  */
2821       if ((low_to_save & (MIN (GET_MODE_SIZE (save_mode),
2822                                BIGGEST_ALIGNMENT / UNITS_PER_WORD) - 1)))
2823         save_mode = BLKmode;
2824
2825 #ifdef ARGS_GROW_DOWNWARD
2826       stack_area = gen_rtx_MEM (save_mode,
2827                                 memory_address (save_mode,
2828                                                 plus_constant (argblock,
2829                                                                - high_to_save)));
2830 #else
2831       stack_area = gen_rtx_MEM (save_mode,
2832                                 memory_address (save_mode,
2833                                                 plus_constant (argblock,
2834                                                                low_to_save)));
2835 #endif
2836       if (save_mode == BLKmode)
2837         {
2838           save_area = assign_stack_temp (BLKmode, num_to_save, 0);
2839           emit_block_move (validize_mem (save_area), stack_area,
2840                            GEN_INT (num_to_save),
2841                            PARM_BOUNDARY / BITS_PER_UNIT);
2842         }
2843       else
2844         {
2845           save_area = gen_reg_rtx (save_mode);
2846           emit_move_insn (save_area, stack_area);
2847         }
2848     }
2849 #endif
2850           
2851   /* Push the args that need to be pushed.  */
2852
2853   /* ARGNUM indexes the ARGVEC array in the order in which the arguments
2854      are to be pushed.  */
2855   for (count = 0; count < nargs; count++, argnum += inc)
2856     {
2857       register enum machine_mode mode = argvec[argnum].mode;
2858       register rtx val = argvec[argnum].value;
2859       rtx reg = argvec[argnum].reg;
2860       int partial = argvec[argnum].partial;
2861 #ifdef ACCUMULATE_OUTGOING_ARGS
2862       int lower_bound, upper_bound, i;
2863 #endif
2864
2865       if (! (reg != 0 && partial == 0))
2866         {
2867 #ifdef ACCUMULATE_OUTGOING_ARGS
2868           /* If this is being stored into a pre-allocated, fixed-size, stack
2869              area, save any previous data at that location.  */
2870
2871 #ifdef ARGS_GROW_DOWNWARD
2872           /* stack_slot is negative, but we want to index stack_usage_map
2873              with positive values.  */
2874           upper_bound = -argvec[argnum].offset.constant + 1;
2875           lower_bound = upper_bound - argvec[argnum].size.constant;
2876 #else
2877           lower_bound = argvec[argnum].offset.constant;
2878           upper_bound = lower_bound + argvec[argnum].size.constant;
2879 #endif
2880
2881           for (i = lower_bound; i < upper_bound; i++)
2882             if (stack_usage_map[i]
2883                 /* Don't store things in the fixed argument area at this point;
2884                    it has already been saved.  */
2885                 && i > reg_parm_stack_space)
2886               break;
2887
2888           if (i != upper_bound)
2889             {
2890               /* We need to make a save area.  See what mode we can make it. */
2891               enum machine_mode save_mode
2892                 = mode_for_size (argvec[argnum].size.constant * BITS_PER_UNIT,
2893                                  MODE_INT, 1);
2894               rtx stack_area
2895                 = gen_rtx_MEM (save_mode,
2896                                memory_address (save_mode,
2897                                                plus_constant (argblock, argvec[argnum].offset.constant)));
2898               argvec[argnum].save_area = gen_reg_rtx (save_mode);
2899               emit_move_insn (argvec[argnum].save_area, stack_area);
2900             }
2901 #endif
2902           emit_push_insn (val, mode, NULL_TREE, NULL_RTX, 0, partial, reg, 0,
2903                           argblock, GEN_INT (argvec[argnum].offset.constant),
2904                           reg_parm_stack_space);
2905
2906 #ifdef ACCUMULATE_OUTGOING_ARGS
2907           /* Now mark the segment we just used.  */
2908           for (i = lower_bound; i < upper_bound; i++)
2909             stack_usage_map[i] = 1;
2910 #endif
2911
2912           NO_DEFER_POP;
2913         }
2914     }
2915
2916 #ifndef PUSH_ARGS_REVERSED
2917 #ifdef PREFERRED_STACK_BOUNDARY
2918   /* If we pushed args in forward order, perform stack alignment
2919      after pushing the last arg.  */
2920   if (argblock == 0)
2921     anti_adjust_stack (GEN_INT (args_size.constant
2922                                 - original_args_size.constant));
2923 #endif
2924 #endif
2925
2926 #ifdef PUSH_ARGS_REVERSED
2927   argnum = nargs - 1;
2928 #else
2929   argnum = 0;
2930 #endif
2931
2932   fun = prepare_call_address (fun, NULL_TREE, &call_fusage, 0);
2933
2934   /* Now load any reg parms into their regs.  */
2935
2936   /* ARGNUM indexes the ARGVEC array in the order in which the arguments
2937      are to be pushed.  */
2938   for (count = 0; count < nargs; count++, argnum += inc)
2939     {
2940       register rtx val = argvec[argnum].value;
2941       rtx reg = argvec[argnum].reg;
2942       int partial = argvec[argnum].partial;
2943
2944       if (reg != 0 && partial == 0)
2945         emit_move_insn (reg, val);
2946       NO_DEFER_POP;
2947     }
2948
2949   /* For version 1.37, try deleting this entirely.  */
2950   if (! no_queue)
2951     emit_queue ();
2952
2953   /* Any regs containing parms remain in use through the call.  */
2954   for (count = 0; count < nargs; count++)
2955     if (argvec[count].reg != 0)
2956        use_reg (&call_fusage, argvec[count].reg);
2957
2958   /* Don't allow popping to be deferred, since then
2959      cse'ing of library calls could delete a call and leave the pop.  */
2960   NO_DEFER_POP;
2961
2962   /* We pass the old value of inhibit_defer_pop + 1 to emit_call_1, which
2963      will set inhibit_defer_pop to that value.  */
2964
2965   /* The return type is needed to decide how many bytes the function pops.
2966      Signedness plays no role in that, so for simplicity, we pretend it's
2967      always signed.  We also assume that the list of arguments passed has
2968      no impact, so we pretend it is unknown.  */
2969
2970   emit_call_1 (fun, 
2971                get_identifier (XSTR (orgfun, 0)), 
2972                build_function_type (outmode == VOIDmode ? void_type_node
2973                                     : type_for_mode (outmode, 0), NULL_TREE),
2974                original_args_size.constant, args_size.constant, 0,
2975                FUNCTION_ARG (args_so_far, VOIDmode, void_type_node, 1),
2976                outmode != VOIDmode ? hard_libcall_value (outmode) : NULL_RTX,
2977                old_inhibit_defer_pop + 1, call_fusage, no_queue);
2978
2979   pop_temp_slots ();
2980
2981   /* Now restore inhibit_defer_pop to its actual original value.  */
2982   OK_DEFER_POP;
2983
2984 #ifdef ACCUMULATE_OUTGOING_ARGS
2985 #ifdef REG_PARM_STACK_SPACE
2986   if (save_area)
2987     {
2988       enum machine_mode save_mode = GET_MODE (save_area);
2989 #ifdef ARGS_GROW_DOWNWARD
2990       rtx stack_area
2991         = gen_rtx_MEM (save_mode,
2992                        memory_address (save_mode,
2993                                        plus_constant (argblock,
2994                                                        - high_to_save)));
2995 #else
2996       rtx stack_area
2997         = gen_rtx_MEM (save_mode,
2998                        memory_address (save_mode,
2999                                        plus_constant (argblock, low_to_save)));
3000 #endif
3001
3002       if (save_mode != BLKmode)
3003         emit_move_insn (stack_area, save_area);
3004       else
3005         emit_block_move (stack_area, validize_mem (save_area),
3006                          GEN_INT (high_to_save - low_to_save + 1),
3007                          PARM_BOUNDARY / BITS_PER_UNIT);
3008     }
3009 #endif
3010           
3011   /* If we saved any argument areas, restore them.  */
3012   for (count = 0; count < nargs; count++)
3013     if (argvec[count].save_area)
3014       {
3015         enum machine_mode save_mode = GET_MODE (argvec[count].save_area);
3016         rtx stack_area
3017           = gen_rtx_MEM (save_mode,
3018                          memory_address (save_mode,
3019                                          plus_constant (argblock, argvec[count].offset.constant)));
3020
3021         emit_move_insn (stack_area, argvec[count].save_area);
3022       }
3023
3024   highest_outgoing_arg_in_use = initial_highest_arg_in_use;
3025   stack_usage_map = initial_stack_usage_map;
3026 #endif
3027 }
3028 \f
3029 /* Like emit_library_call except that an extra argument, VALUE,
3030    comes second and says where to store the result.
3031    (If VALUE is zero, this function chooses a convenient way
3032    to return the value.
3033
3034    This function returns an rtx for where the value is to be found.
3035    If VALUE is nonzero, VALUE is returned.  */
3036
3037 rtx
3038 emit_library_call_value VPROTO((rtx orgfun, rtx value, int no_queue,
3039                                 enum machine_mode outmode, int nargs, ...))
3040 {
3041 #ifndef ANSI_PROTOTYPES
3042   rtx orgfun;
3043   rtx value;
3044   int no_queue;
3045   enum machine_mode outmode;
3046   int nargs;
3047 #endif
3048   va_list p;
3049   /* Total size in bytes of all the stack-parms scanned so far.  */
3050   struct args_size args_size;
3051   /* Size of arguments before any adjustments (such as rounding).  */
3052   struct args_size original_args_size;
3053   register int argnum;
3054   rtx fun;
3055   int inc;
3056   int count;
3057   rtx argblock = 0;
3058   CUMULATIVE_ARGS args_so_far;
3059   struct arg { rtx value; enum machine_mode mode; rtx reg; int partial;
3060                struct args_size offset; struct args_size size; rtx save_area; };
3061   struct arg *argvec;
3062   int old_inhibit_defer_pop = inhibit_defer_pop;
3063   rtx call_fusage = 0;
3064   rtx mem_value = 0;
3065   int pcc_struct_value = 0;
3066   int struct_value_size = 0;
3067   int is_const;
3068   int reg_parm_stack_space = 0;
3069 #ifdef ACCUMULATE_OUTGOING_ARGS
3070   int needed;
3071 #endif
3072
3073 #if defined(ACCUMULATE_OUTGOING_ARGS) && defined(REG_PARM_STACK_SPACE)
3074   /* Define the boundary of the register parm stack space that needs to be
3075      save, if any.  */
3076   int low_to_save = -1, high_to_save;
3077   rtx save_area = 0;            /* Place that it is saved */
3078 #endif
3079
3080 #ifdef ACCUMULATE_OUTGOING_ARGS
3081   /* Size of the stack reserved for parameter registers.  */
3082   int initial_highest_arg_in_use = highest_outgoing_arg_in_use;
3083   char *initial_stack_usage_map = stack_usage_map;
3084 #endif
3085
3086 #ifdef REG_PARM_STACK_SPACE
3087 #ifdef MAYBE_REG_PARM_STACK_SPACE
3088   reg_parm_stack_space = MAYBE_REG_PARM_STACK_SPACE;
3089 #else
3090   reg_parm_stack_space = REG_PARM_STACK_SPACE ((tree) 0);
3091 #endif
3092 #endif
3093
3094   VA_START (p, nargs);
3095
3096 #ifndef ANSI_PROTOTYPES
3097   orgfun = va_arg (p, rtx);
3098   value = va_arg (p, rtx);
3099   no_queue = va_arg (p, int);
3100   outmode = va_arg (p, enum machine_mode);
3101   nargs = va_arg (p, int);
3102 #endif
3103
3104   is_const = no_queue;
3105   fun = orgfun;
3106
3107   /* If this kind of value comes back in memory,
3108      decide where in memory it should come back.  */
3109   if (aggregate_value_p (type_for_mode (outmode, 0)))
3110     {
3111 #ifdef PCC_STATIC_STRUCT_RETURN
3112       rtx pointer_reg
3113         = hard_function_value (build_pointer_type (type_for_mode (outmode, 0)),
3114                                0);
3115       mem_value = gen_rtx_MEM (outmode, pointer_reg);
3116       pcc_struct_value = 1;
3117       if (value == 0)
3118         value = gen_reg_rtx (outmode);
3119 #else /* not PCC_STATIC_STRUCT_RETURN */
3120       struct_value_size = GET_MODE_SIZE (outmode);
3121       if (value != 0 && GET_CODE (value) == MEM)
3122         mem_value = value;
3123       else
3124         mem_value = assign_stack_temp (outmode, GET_MODE_SIZE (outmode), 0);
3125 #endif
3126
3127       /* This call returns a big structure.  */
3128       is_const = 0;
3129     }
3130
3131   /* ??? Unfinished: must pass the memory address as an argument.  */
3132
3133   /* Copy all the libcall-arguments out of the varargs data
3134      and into a vector ARGVEC.
3135
3136      Compute how to pass each argument.  We only support a very small subset
3137      of the full argument passing conventions to limit complexity here since
3138      library functions shouldn't have many args.  */
3139
3140   argvec = (struct arg *) alloca ((nargs + 1) * sizeof (struct arg));
3141   bzero ((char *) argvec, (nargs + 1) * sizeof (struct arg));
3142
3143   INIT_CUMULATIVE_ARGS (args_so_far, NULL_TREE, fun, 0);
3144
3145   args_size.constant = 0;
3146   args_size.var = 0;
3147
3148   count = 0;
3149
3150   push_temp_slots ();
3151
3152   /* If there's a structure value address to be passed,
3153      either pass it in the special place, or pass it as an extra argument.  */
3154   if (mem_value && struct_value_rtx == 0 && ! pcc_struct_value)
3155     {
3156       rtx addr = XEXP (mem_value, 0);
3157       nargs++;
3158
3159       /* Make sure it is a reasonable operand for a move or push insn.  */
3160       if (GET_CODE (addr) != REG && GET_CODE (addr) != MEM
3161           && ! (CONSTANT_P (addr) && LEGITIMATE_CONSTANT_P (addr)))
3162         addr = force_operand (addr, NULL_RTX);
3163
3164       argvec[count].value = addr;
3165       argvec[count].mode = Pmode;
3166       argvec[count].partial = 0;
3167
3168       argvec[count].reg = FUNCTION_ARG (args_so_far, Pmode, NULL_TREE, 1);
3169 #ifdef FUNCTION_ARG_PARTIAL_NREGS
3170       if (FUNCTION_ARG_PARTIAL_NREGS (args_so_far, Pmode, NULL_TREE, 1))
3171         abort ();
3172 #endif
3173
3174       locate_and_pad_parm (Pmode, NULL_TREE,
3175                            argvec[count].reg && argvec[count].partial == 0,
3176                            NULL_TREE, &args_size, &argvec[count].offset,
3177                            &argvec[count].size);
3178
3179
3180       if (argvec[count].reg == 0 || argvec[count].partial != 0
3181           || reg_parm_stack_space > 0)
3182         args_size.constant += argvec[count].size.constant;
3183
3184       FUNCTION_ARG_ADVANCE (args_so_far, Pmode, (tree) 0, 1);
3185
3186       count++;
3187     }
3188
3189   for (; count < nargs; count++)
3190     {
3191       rtx val = va_arg (p, rtx);
3192       enum machine_mode mode = va_arg (p, enum machine_mode);
3193
3194       /* We cannot convert the arg value to the mode the library wants here;
3195          must do it earlier where we know the signedness of the arg.  */
3196       if (mode == BLKmode
3197           || (GET_MODE (val) != mode && GET_MODE (val) != VOIDmode))
3198         abort ();
3199
3200       /* On some machines, there's no way to pass a float to a library fcn.
3201          Pass it as a double instead.  */
3202 #ifdef LIBGCC_NEEDS_DOUBLE
3203       if (LIBGCC_NEEDS_DOUBLE && mode == SFmode)
3204         val = convert_modes (DFmode, SFmode, val, 0), mode = DFmode;
3205 #endif
3206
3207       /* There's no need to call protect_from_queue, because
3208          either emit_move_insn or emit_push_insn will do that.  */
3209
3210       /* Make sure it is a reasonable operand for a move or push insn.  */
3211       if (GET_CODE (val) != REG && GET_CODE (val) != MEM
3212           && ! (CONSTANT_P (val) && LEGITIMATE_CONSTANT_P (val)))
3213         val = force_operand (val, NULL_RTX);
3214
3215 #ifdef FUNCTION_ARG_PASS_BY_REFERENCE
3216       if (FUNCTION_ARG_PASS_BY_REFERENCE (args_so_far, mode, NULL_TREE, 1))
3217         {
3218           /* We do not support FUNCTION_ARG_CALLEE_COPIES here since it can
3219              be viewed as just an efficiency improvement.  */
3220           rtx slot = assign_stack_temp (mode, GET_MODE_SIZE (mode), 0);
3221           emit_move_insn (slot, val);
3222           val = XEXP (slot, 0);
3223           mode = Pmode;
3224         }
3225 #endif
3226
3227       argvec[count].value = val;
3228       argvec[count].mode = mode;
3229
3230       argvec[count].reg = FUNCTION_ARG (args_so_far, mode, NULL_TREE, 1);
3231       if (argvec[count].reg && GET_CODE (argvec[count].reg) == PARALLEL)
3232         abort ();
3233 #ifdef FUNCTION_ARG_PARTIAL_NREGS
3234       argvec[count].partial
3235         = FUNCTION_ARG_PARTIAL_NREGS (args_so_far, mode, NULL_TREE, 1);
3236 #else
3237       argvec[count].partial = 0;
3238 #endif
3239
3240       locate_and_pad_parm (mode, NULL_TREE,
3241                            argvec[count].reg && argvec[count].partial == 0,
3242                            NULL_TREE, &args_size, &argvec[count].offset,
3243                            &argvec[count].size);
3244
3245       if (argvec[count].size.var)
3246         abort ();
3247
3248       if (reg_parm_stack_space == 0 && argvec[count].partial)
3249         argvec[count].size.constant -= argvec[count].partial * UNITS_PER_WORD;
3250
3251       if (argvec[count].reg == 0 || argvec[count].partial != 0
3252           || reg_parm_stack_space > 0)
3253         args_size.constant += argvec[count].size.constant;
3254
3255       FUNCTION_ARG_ADVANCE (args_so_far, mode, (tree) 0, 1);
3256     }
3257   va_end (p);
3258
3259 #ifdef FINAL_REG_PARM_STACK_SPACE
3260   reg_parm_stack_space = FINAL_REG_PARM_STACK_SPACE (args_size.constant,
3261                                                      args_size.var);
3262 #endif
3263   /* If this machine requires an external definition for library
3264      functions, write one out.  */
3265   assemble_external_libcall (fun);
3266
3267   original_args_size = args_size;
3268 #ifdef PREFERRED_STACK_BOUNDARY
3269   args_size.constant = (((args_size.constant + (STACK_BYTES - 1))
3270                          / STACK_BYTES) * STACK_BYTES);
3271 #endif
3272
3273   args_size.constant = MAX (args_size.constant,
3274                             reg_parm_stack_space);
3275
3276 #ifndef OUTGOING_REG_PARM_STACK_SPACE
3277   args_size.constant -= reg_parm_stack_space;
3278 #endif
3279
3280   if (args_size.constant > current_function_outgoing_args_size)
3281     current_function_outgoing_args_size = args_size.constant;
3282
3283 #ifdef ACCUMULATE_OUTGOING_ARGS
3284   /* Since the stack pointer will never be pushed, it is possible for
3285      the evaluation of a parm to clobber something we have already
3286      written to the stack.  Since most function calls on RISC machines
3287      do not use the stack, this is uncommon, but must work correctly.
3288
3289      Therefore, we save any area of the stack that was already written
3290      and that we are using.  Here we set up to do this by making a new
3291      stack usage map from the old one.
3292
3293      Another approach might be to try to reorder the argument
3294      evaluations to avoid this conflicting stack usage.  */
3295
3296   needed = args_size.constant;
3297
3298 #ifndef OUTGOING_REG_PARM_STACK_SPACE
3299   /* Since we will be writing into the entire argument area, the
3300      map must be allocated for its entire size, not just the part that
3301      is the responsibility of the caller.  */
3302   needed += reg_parm_stack_space;
3303 #endif
3304
3305 #ifdef ARGS_GROW_DOWNWARD
3306   highest_outgoing_arg_in_use = MAX (initial_highest_arg_in_use,
3307                                      needed + 1);
3308 #else
3309   highest_outgoing_arg_in_use = MAX (initial_highest_arg_in_use,
3310                                      needed);
3311 #endif
3312   stack_usage_map = (char *) alloca (highest_outgoing_arg_in_use);
3313
3314   if (initial_highest_arg_in_use)
3315     bcopy (initial_stack_usage_map, stack_usage_map,
3316            initial_highest_arg_in_use);
3317
3318   if (initial_highest_arg_in_use != highest_outgoing_arg_in_use)
3319     bzero (&stack_usage_map[initial_highest_arg_in_use],
3320            highest_outgoing_arg_in_use - initial_highest_arg_in_use);
3321   needed = 0;
3322
3323   /* The address of the outgoing argument list must not be copied to a
3324      register here, because argblock would be left pointing to the
3325      wrong place after the call to allocate_dynamic_stack_space below.
3326      */
3327
3328   argblock = virtual_outgoing_args_rtx;
3329 #else /* not ACCUMULATE_OUTGOING_ARGS */
3330 #ifndef PUSH_ROUNDING
3331   argblock = push_block (GEN_INT (args_size.constant), 0, 0);
3332 #endif
3333 #endif
3334
3335 #ifdef PUSH_ARGS_REVERSED
3336 #ifdef PREFERRED_STACK_BOUNDARY
3337   /* If we push args individually in reverse order, perform stack alignment
3338      before the first push (the last arg).  */
3339   if (argblock == 0)
3340     anti_adjust_stack (GEN_INT (args_size.constant
3341                                 - original_args_size.constant));
3342 #endif
3343 #endif
3344
3345 #ifdef PUSH_ARGS_REVERSED
3346   inc = -1;
3347   argnum = nargs - 1;
3348 #else
3349   inc = 1;
3350   argnum = 0;
3351 #endif
3352
3353 #if defined(ACCUMULATE_OUTGOING_ARGS) && defined(REG_PARM_STACK_SPACE)
3354   /* The argument list is the property of the called routine and it
3355      may clobber it.  If the fixed area has been used for previous
3356      parameters, we must save and restore it.
3357
3358      Here we compute the boundary of the that needs to be saved, if any.  */
3359
3360 #ifdef ARGS_GROW_DOWNWARD
3361   for (count = 0; count < reg_parm_stack_space + 1; count++)
3362 #else
3363   for (count = 0; count < reg_parm_stack_space; count++)
3364 #endif
3365     {
3366       if (count >=  highest_outgoing_arg_in_use
3367           || stack_usage_map[count] == 0)
3368         continue;
3369
3370       if (low_to_save == -1)
3371         low_to_save = count;
3372
3373       high_to_save = count;
3374     }
3375
3376   if (low_to_save >= 0)
3377     {
3378       int num_to_save = high_to_save - low_to_save + 1;
3379       enum machine_mode save_mode
3380         = mode_for_size (num_to_save * BITS_PER_UNIT, MODE_INT, 1);
3381       rtx stack_area;
3382
3383       /* If we don't have the required alignment, must do this in BLKmode.  */
3384       if ((low_to_save & (MIN (GET_MODE_SIZE (save_mode),
3385                                BIGGEST_ALIGNMENT / UNITS_PER_WORD) - 1)))
3386         save_mode = BLKmode;
3387
3388 #ifdef ARGS_GROW_DOWNWARD
3389       stack_area = gen_rtx_MEM (save_mode,
3390                                 memory_address (save_mode,
3391                                                 plus_constant (argblock,
3392                                                                - high_to_save)));
3393 #else
3394       stack_area = gen_rtx_MEM (save_mode,
3395                                 memory_address (save_mode,
3396                                                 plus_constant (argblock,
3397                                                                low_to_save)));
3398 #endif
3399       if (save_mode == BLKmode)
3400         {
3401           save_area = assign_stack_temp (BLKmode, num_to_save, 0);
3402           emit_block_move (validize_mem (save_area), stack_area,
3403                            GEN_INT (num_to_save),
3404                            PARM_BOUNDARY / BITS_PER_UNIT);
3405         }
3406       else
3407         {
3408           save_area = gen_reg_rtx (save_mode);
3409           emit_move_insn (save_area, stack_area);
3410         }
3411     }
3412 #endif
3413           
3414   /* Push the args that need to be pushed.  */
3415
3416   /* ARGNUM indexes the ARGVEC array in the order in which the arguments
3417      are to be pushed.  */
3418   for (count = 0; count < nargs; count++, argnum += inc)
3419     {
3420       register enum machine_mode mode = argvec[argnum].mode;
3421       register rtx val = argvec[argnum].value;
3422       rtx reg = argvec[argnum].reg;
3423       int partial = argvec[argnum].partial;
3424 #ifdef ACCUMULATE_OUTGOING_ARGS
3425       int lower_bound, upper_bound, i;
3426 #endif
3427
3428       if (! (reg != 0 && partial == 0))
3429         {
3430 #ifdef ACCUMULATE_OUTGOING_ARGS
3431           /* If this is being stored into a pre-allocated, fixed-size, stack
3432              area, save any previous data at that location.  */
3433
3434 #ifdef ARGS_GROW_DOWNWARD
3435           /* stack_slot is negative, but we want to index stack_usage_map
3436              with positive values.  */
3437           upper_bound = -argvec[argnum].offset.constant + 1;
3438           lower_bound = upper_bound - argvec[argnum].size.constant;
3439 #else
3440           lower_bound = argvec[argnum].offset.constant;
3441           upper_bound = lower_bound + argvec[argnum].size.constant;
3442 #endif
3443
3444           for (i = lower_bound; i < upper_bound; i++)
3445             if (stack_usage_map[i]
3446                 /* Don't store things in the fixed argument area at this point;
3447                    it has already been saved.  */
3448                 && i > reg_parm_stack_space)
3449               break;
3450
3451           if (i != upper_bound)
3452             {
3453               /* We need to make a save area.  See what mode we can make it. */
3454               enum machine_mode save_mode
3455                 = mode_for_size (argvec[argnum].size.constant * BITS_PER_UNIT,
3456                                  MODE_INT, 1);
3457               rtx stack_area
3458                 = gen_rtx_MEM (save_mode,
3459                                memory_address (save_mode,
3460                                                plus_constant (argblock,
3461                                                               argvec[argnum].offset.constant)));
3462               argvec[argnum].save_area = gen_reg_rtx (save_mode);
3463               emit_move_insn (argvec[argnum].save_area, stack_area);
3464             }
3465 #endif
3466           emit_push_insn (val, mode, NULL_TREE, NULL_RTX, 0, partial, reg, 0,
3467                           argblock, GEN_INT (argvec[argnum].offset.constant),
3468                           reg_parm_stack_space);
3469
3470 #ifdef ACCUMULATE_OUTGOING_ARGS
3471           /* Now mark the segment we just used.  */
3472           for (i = lower_bound; i < upper_bound; i++)
3473             stack_usage_map[i] = 1;
3474 #endif
3475
3476           NO_DEFER_POP;
3477         }
3478     }
3479
3480 #ifndef PUSH_ARGS_REVERSED
3481 #ifdef PREFERRED_STACK_BOUNDARY
3482   /* If we pushed args in forward order, perform stack alignment
3483      after pushing the last arg.  */
3484   if (argblock == 0)
3485     anti_adjust_stack (GEN_INT (args_size.constant
3486                                 - original_args_size.constant));
3487 #endif
3488 #endif
3489
3490 #ifdef PUSH_ARGS_REVERSED
3491   argnum = nargs - 1;
3492 #else
3493   argnum = 0;
3494 #endif
3495
3496   fun = prepare_call_address (fun, NULL_TREE, &call_fusage, 0);
3497
3498   /* Now load any reg parms into their regs.  */
3499
3500   /* ARGNUM indexes the ARGVEC array in the order in which the arguments
3501      are to be pushed.  */
3502   for (count = 0; count < nargs; count++, argnum += inc)
3503     {
3504       register rtx val = argvec[argnum].value;
3505       rtx reg = argvec[argnum].reg;
3506       int partial = argvec[argnum].partial;
3507
3508       if (reg != 0 && partial == 0)
3509         emit_move_insn (reg, val);
3510       NO_DEFER_POP;
3511     }
3512
3513 #if 0
3514   /* For version 1.37, try deleting this entirely.  */
3515   if (! no_queue)
3516     emit_queue ();
3517 #endif
3518
3519   /* Any regs containing parms remain in use through the call.  */
3520   for (count = 0; count < nargs; count++)
3521     if (argvec[count].reg != 0)
3522        use_reg (&call_fusage, argvec[count].reg);
3523
3524   /* Pass the function the address in which to return a structure value.  */
3525   if (mem_value != 0 && struct_value_rtx != 0 && ! pcc_struct_value)
3526     {
3527       emit_move_insn (struct_value_rtx,
3528                       force_reg (Pmode,
3529                                  force_operand (XEXP (mem_value, 0),
3530                                                 NULL_RTX)));
3531       if (GET_CODE (struct_value_rtx) == REG)
3532           use_reg (&call_fusage, struct_value_rtx);
3533     }
3534
3535   /* Don't allow popping to be deferred, since then
3536      cse'ing of library calls could delete a call and leave the pop.  */
3537   NO_DEFER_POP;
3538
3539   /* We pass the old value of inhibit_defer_pop + 1 to emit_call_1, which
3540      will set inhibit_defer_pop to that value.  */
3541   /* See the comment in emit_library_call about the function type we build
3542      and pass here.  */
3543
3544   emit_call_1 (fun, 
3545                get_identifier (XSTR (orgfun, 0)),
3546                build_function_type (type_for_mode (outmode, 0), NULL_TREE),
3547                original_args_size.constant, args_size.constant,
3548                struct_value_size,
3549                FUNCTION_ARG (args_so_far, VOIDmode, void_type_node, 1),
3550                mem_value == 0 ? hard_libcall_value (outmode) : NULL_RTX,
3551                old_inhibit_defer_pop + 1, call_fusage, is_const);
3552
3553   /* Now restore inhibit_defer_pop to its actual original value.  */
3554   OK_DEFER_POP;
3555
3556   pop_temp_slots ();
3557
3558   /* Copy the value to the right place.  */
3559   if (outmode != VOIDmode)
3560     {
3561       if (mem_value)
3562         {
3563           if (value == 0)
3564             value = mem_value;
3565           if (value != mem_value)
3566             emit_move_insn (value, mem_value);
3567         }
3568       else if (value != 0)
3569         emit_move_insn (value, hard_libcall_value (outmode));
3570       else
3571         value = hard_libcall_value (outmode);
3572     }
3573
3574 #ifdef ACCUMULATE_OUTGOING_ARGS
3575 #ifdef REG_PARM_STACK_SPACE
3576   if (save_area)
3577     {
3578       enum machine_mode save_mode = GET_MODE (save_area);
3579 #ifdef ARGS_GROW_DOWNWARD
3580       rtx stack_area
3581         = gen_rtx_MEM (save_mode,
3582                        memory_address (save_mode,
3583                                        plus_constant (argblock,
3584                                                       - high_to_save)));
3585 #else
3586       rtx stack_area
3587         = gen_rtx_MEM (save_mode,
3588                        memory_address (save_mode,
3589                                        plus_constant (argblock, low_to_save)));
3590 #endif
3591       if (save_mode != BLKmode)
3592         emit_move_insn (stack_area, save_area);
3593       else
3594         emit_block_move (stack_area, validize_mem (save_area),
3595                          GEN_INT (high_to_save - low_to_save + 1),
3596                              PARM_BOUNDARY / BITS_PER_UNIT);
3597     }
3598 #endif
3599           
3600   /* If we saved any argument areas, restore them.  */
3601   for (count = 0; count < nargs; count++)
3602     if (argvec[count].save_area)
3603       {
3604         enum machine_mode save_mode = GET_MODE (argvec[count].save_area);
3605         rtx stack_area
3606           = gen_rtx_MEM (save_mode,
3607                      memory_address (save_mode, plus_constant (argblock,
3608                                      argvec[count].offset.constant)));
3609
3610         emit_move_insn (stack_area, argvec[count].save_area);
3611       }
3612
3613   highest_outgoing_arg_in_use = initial_highest_arg_in_use;
3614   stack_usage_map = initial_stack_usage_map;
3615 #endif
3616
3617   return value;
3618 }
3619 \f
3620 #if 0
3621 /* Return an rtx which represents a suitable home on the stack
3622    given TYPE, the type of the argument looking for a home.
3623    This is called only for BLKmode arguments.
3624
3625    SIZE is the size needed for this target.
3626    ARGS_ADDR is the address of the bottom of the argument block for this call.
3627    OFFSET describes this parameter's offset into ARGS_ADDR.  It is meaningless
3628    if this machine uses push insns.  */
3629
3630 static rtx
3631 target_for_arg (type, size, args_addr, offset)
3632      tree type;
3633      rtx size;
3634      rtx args_addr;
3635      struct args_size offset;
3636 {
3637   rtx target;
3638   rtx offset_rtx = ARGS_SIZE_RTX (offset);
3639
3640   /* We do not call memory_address if possible,
3641      because we want to address as close to the stack
3642      as possible.  For non-variable sized arguments,
3643      this will be stack-pointer relative addressing.  */
3644   if (GET_CODE (offset_rtx) == CONST_INT)
3645     target = plus_constant (args_addr, INTVAL (offset_rtx));
3646   else
3647     {
3648       /* I have no idea how to guarantee that this
3649          will work in the presence of register parameters.  */
3650       target = gen_rtx_PLUS (Pmode, args_addr, offset_rtx);
3651       target = memory_address (QImode, target);
3652     }
3653
3654   return gen_rtx_MEM (BLKmode, target);
3655 }
3656 #endif
3657 \f
3658 /* Store a single argument for a function call
3659    into the register or memory area where it must be passed.
3660    *ARG describes the argument value and where to pass it.
3661
3662    ARGBLOCK is the address of the stack-block for all the arguments,
3663    or 0 on a machine where arguments are pushed individually.
3664
3665    MAY_BE_ALLOCA nonzero says this could be a call to `alloca'
3666    so must be careful about how the stack is used. 
3667
3668    VARIABLE_SIZE nonzero says that this was a variable-sized outgoing
3669    argument stack.  This is used if ACCUMULATE_OUTGOING_ARGS to indicate
3670    that we need not worry about saving and restoring the stack.
3671
3672    FNDECL is the declaration of the function we are calling.  */
3673
3674 static void
3675 store_one_arg (arg, argblock, may_be_alloca, variable_size,
3676                reg_parm_stack_space)
3677      struct arg_data *arg;
3678      rtx argblock;
3679      int may_be_alloca;
3680      int variable_size ATTRIBUTE_UNUSED;
3681      int reg_parm_stack_space;
3682 {
3683   register tree pval = arg->tree_value;
3684   rtx reg = 0;
3685   int partial = 0;
3686   int used = 0;
3687 #ifdef ACCUMULATE_OUTGOING_ARGS
3688   int i, lower_bound, upper_bound;
3689 #endif
3690
3691   if (TREE_CODE (pval) == ERROR_MARK)
3692     return;
3693
3694   /* Push a new temporary level for any temporaries we make for
3695      this argument.  */
3696   push_temp_slots ();
3697
3698 #ifdef ACCUMULATE_OUTGOING_ARGS
3699   /* If this is being stored into a pre-allocated, fixed-size, stack area,
3700      save any previous data at that location.  */
3701   if (argblock && ! variable_size && arg->stack)
3702     {
3703 #ifdef ARGS_GROW_DOWNWARD
3704       /* stack_slot is negative, but we want to index stack_usage_map
3705          with positive values.  */
3706       if (GET_CODE (XEXP (arg->stack_slot, 0)) == PLUS)
3707         upper_bound = -INTVAL (XEXP (XEXP (arg->stack_slot, 0), 1)) + 1;
3708       else
3709         upper_bound = 0;
3710
3711       lower_bound = upper_bound - arg->size.constant;
3712 #else
3713       if (GET_CODE (XEXP (arg->stack_slot, 0)) == PLUS)
3714         lower_bound = INTVAL (XEXP (XEXP (arg->stack_slot, 0), 1));
3715       else
3716         lower_bound = 0;
3717
3718       upper_bound = lower_bound + arg->size.constant;
3719 #endif
3720
3721       for (i = lower_bound; i < upper_bound; i++)
3722         if (stack_usage_map[i]
3723             /* Don't store things in the fixed argument area at this point;
3724                it has already been saved.  */
3725             && i > reg_parm_stack_space)
3726           break;
3727
3728       if (i != upper_bound)
3729         {
3730           /* We need to make a save area.  See what mode we can make it.  */
3731           enum machine_mode save_mode
3732             = mode_for_size (arg->size.constant * BITS_PER_UNIT, MODE_INT, 1);
3733           rtx stack_area
3734             = gen_rtx_MEM (save_mode,
3735                            memory_address (save_mode,
3736                                            XEXP (arg->stack_slot, 0)));
3737
3738           if (save_mode == BLKmode)
3739             {
3740               arg->save_area = assign_stack_temp (BLKmode,
3741                                                   arg->size.constant, 0);
3742               MEM_SET_IN_STRUCT_P (arg->save_area,
3743                                    AGGREGATE_TYPE_P (TREE_TYPE
3744                                                      (arg->tree_value))); 
3745               preserve_temp_slots (arg->save_area);
3746               emit_block_move (validize_mem (arg->save_area), stack_area,
3747                                GEN_INT (arg->size.constant),
3748                                PARM_BOUNDARY / BITS_PER_UNIT);
3749             }
3750           else
3751             {
3752               arg->save_area = gen_reg_rtx (save_mode);
3753               emit_move_insn (arg->save_area, stack_area);
3754             }
3755         }
3756     }
3757
3758   /* Now that we have saved any slots that will be overwritten by this
3759      store, mark all slots this store will use.  We must do this before
3760      we actually expand the argument since the expansion itself may
3761      trigger library calls which might need to use the same stack slot.  */
3762   if (argblock && ! variable_size && arg->stack)
3763     for (i = lower_bound; i < upper_bound; i++)
3764       stack_usage_map[i] = 1;
3765 #endif
3766
3767   /* If this isn't going to be placed on both the stack and in registers,
3768      set up the register and number of words.  */
3769   if (! arg->pass_on_stack)
3770     reg = arg->reg, partial = arg->partial;
3771
3772   if (reg != 0 && partial == 0)
3773     /* Being passed entirely in a register.  We shouldn't be called in
3774        this case.   */
3775     abort ();
3776
3777   /* If this arg needs special alignment, don't load the registers
3778      here.  */
3779   if (arg->n_aligned_regs != 0)
3780     reg = 0;
3781   
3782   /* If this is being passed partially in a register, we can't evaluate
3783      it directly into its stack slot.  Otherwise, we can.  */
3784   if (arg->value == 0)
3785     {
3786 #ifdef ACCUMULATE_OUTGOING_ARGS
3787       /* stack_arg_under_construction is nonzero if a function argument is
3788          being evaluated directly into the outgoing argument list and
3789          expand_call must take special action to preserve the argument list
3790          if it is called recursively.
3791
3792          For scalar function arguments stack_usage_map is sufficient to
3793          determine which stack slots must be saved and restored.  Scalar
3794          arguments in general have pass_on_stack == 0.
3795
3796          If this argument is initialized by a function which takes the
3797          address of the argument (a C++ constructor or a C function
3798          returning a BLKmode structure), then stack_usage_map is
3799          insufficient and expand_call must push the stack around the
3800          function call.  Such arguments have pass_on_stack == 1.
3801
3802          Note that it is always safe to set stack_arg_under_construction,
3803          but this generates suboptimal code if set when not needed.  */
3804
3805       if (arg->pass_on_stack)
3806         stack_arg_under_construction++;
3807 #endif
3808       arg->value = expand_expr (pval,
3809                                 (partial
3810                                  || TYPE_MODE (TREE_TYPE (pval)) != arg->mode)
3811                                 ? NULL_RTX : arg->stack,
3812                                 VOIDmode, 0);
3813
3814       /* If we are promoting object (or for any other reason) the mode
3815          doesn't agree, convert the mode.  */
3816
3817       if (arg->mode != TYPE_MODE (TREE_TYPE (pval)))
3818         arg->value = convert_modes (arg->mode, TYPE_MODE (TREE_TYPE (pval)),
3819                                     arg->value, arg->unsignedp);
3820
3821 #ifdef ACCUMULATE_OUTGOING_ARGS
3822       if (arg->pass_on_stack)
3823         stack_arg_under_construction--;
3824 #endif
3825     }
3826
3827   /* Don't allow anything left on stack from computation
3828      of argument to alloca.  */
3829   if (may_be_alloca)
3830     do_pending_stack_adjust ();
3831
3832   if (arg->value == arg->stack)
3833     {
3834       /* If the value is already in the stack slot, we are done moving
3835          data.  */
3836       if (current_function_check_memory_usage && GET_CODE (arg->stack) == MEM)
3837         {
3838           emit_library_call (chkr_set_right_libfunc, 1, VOIDmode, 3,
3839                              XEXP (arg->stack, 0), Pmode, 
3840                              ARGS_SIZE_RTX (arg->size),
3841                              TYPE_MODE (sizetype),
3842                              GEN_INT (MEMORY_USE_RW),
3843                              TYPE_MODE (integer_type_node));
3844         }
3845     }
3846   else if (arg->mode != BLKmode)
3847     {
3848       register int size;
3849
3850       /* Argument is a scalar, not entirely passed in registers.
3851          (If part is passed in registers, arg->partial says how much
3852          and emit_push_insn will take care of putting it there.)
3853          
3854          Push it, and if its size is less than the
3855          amount of space allocated to it,
3856          also bump stack pointer by the additional space.
3857          Note that in C the default argument promotions
3858          will prevent such mismatches.  */
3859
3860       size = GET_MODE_SIZE (arg->mode);
3861       /* Compute how much space the push instruction will push.
3862          On many machines, pushing a byte will advance the stack
3863          pointer by a halfword.  */
3864 #ifdef PUSH_ROUNDING
3865       size = PUSH_ROUNDING (size);
3866 #endif
3867       used = size;
3868
3869       /* Compute how much space the argument should get:
3870          round up to a multiple of the alignment for arguments.  */
3871       if (none != FUNCTION_ARG_PADDING (arg->mode, TREE_TYPE (pval)))
3872         used = (((size + PARM_BOUNDARY / BITS_PER_UNIT - 1)
3873                  / (PARM_BOUNDARY / BITS_PER_UNIT))
3874                 * (PARM_BOUNDARY / BITS_PER_UNIT));
3875
3876       /* This isn't already where we want it on the stack, so put it there.
3877          This can either be done with push or copy insns.  */
3878       emit_push_insn (arg->value, arg->mode, TREE_TYPE (pval), NULL_RTX, 0,
3879                       partial, reg, used - size, argblock,
3880                       ARGS_SIZE_RTX (arg->offset), reg_parm_stack_space);
3881     }
3882   else
3883     {
3884       /* BLKmode, at least partly to be pushed.  */
3885
3886       register int excess;
3887       rtx size_rtx;
3888
3889       /* Pushing a nonscalar.
3890          If part is passed in registers, PARTIAL says how much
3891          and emit_push_insn will take care of putting it there.  */
3892
3893       /* Round its size up to a multiple
3894          of the allocation unit for arguments.  */
3895
3896       if (arg->size.var != 0)
3897         {
3898           excess = 0;
3899           size_rtx = ARGS_SIZE_RTX (arg->size);
3900         }
3901       else
3902         {
3903           /* PUSH_ROUNDING has no effect on us, because
3904              emit_push_insn for BLKmode is careful to avoid it.  */
3905           excess = (arg->size.constant - int_size_in_bytes (TREE_TYPE (pval))
3906                     + partial * UNITS_PER_WORD);
3907           size_rtx = expr_size (pval);
3908         }
3909
3910       emit_push_insn (arg->value, arg->mode, TREE_TYPE (pval), size_rtx,
3911                       TYPE_ALIGN (TREE_TYPE (pval)) / BITS_PER_UNIT, partial,
3912                       reg, excess, argblock, ARGS_SIZE_RTX (arg->offset),
3913                       reg_parm_stack_space);
3914     }
3915
3916
3917   /* Unless this is a partially-in-register argument, the argument is now
3918      in the stack. 
3919
3920      ??? Note that this can change arg->value from arg->stack to
3921      arg->stack_slot and it matters when they are not the same.
3922      It isn't totally clear that this is correct in all cases.  */
3923   if (partial == 0)
3924     arg->value = arg->stack_slot;
3925
3926   /* Once we have pushed something, pops can't safely
3927      be deferred during the rest of the arguments.  */
3928   NO_DEFER_POP;
3929
3930   /* ANSI doesn't require a sequence point here,
3931      but PCC has one, so this will avoid some problems.  */
3932   emit_queue ();
3933
3934   /* Free any temporary slots made in processing this argument.  Show
3935      that we might have taken the address of something and pushed that
3936      as an operand.  */
3937   preserve_temp_slots (NULL_RTX);
3938   free_temp_slots ();
3939   pop_temp_slots ();
3940 }