OSDN Git Service

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