OSDN Git Service

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