OSDN Git Service

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