OSDN Git Service

2000-09-25 Kazu Hirata <kazu@hxi.com>
[pf3gnuchains/gcc-fork.git] / gcc / explow.c
1 /* Subroutines for manipulating rtx's in semantically interesting ways.
2    Copyright (C) 1987, 1991, 1994, 1995, 1996, 1997, 1998,
3    1999, 2000 Free Software Foundation, Inc.
4
5 This file is part of GNU CC.
6
7 GNU CC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
11
12 GNU CC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GNU CC; see the file COPYING.  If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA.  */
21
22
23 #include "config.h"
24 #include "system.h"
25 #include "toplev.h"
26 #include "rtl.h"
27 #include "tree.h"
28 #include "tm_p.h"
29 #include "flags.h"
30 #include "function.h"
31 #include "expr.h"
32 #include "hard-reg-set.h"
33 #include "insn-config.h"
34 #include "recog.h"
35 #include "insn-flags.h"
36 #include "insn-codes.h"
37
38 #if !defined PREFERRED_STACK_BOUNDARY && defined STACK_BOUNDARY
39 #define PREFERRED_STACK_BOUNDARY STACK_BOUNDARY
40 #endif
41
42 static rtx break_out_memory_refs        PARAMS ((rtx));
43 static void emit_stack_probe            PARAMS ((rtx));
44
45
46 /* Truncate and perhaps sign-extend C as appropriate for MODE.  */
47
48 HOST_WIDE_INT
49 trunc_int_for_mode (c, mode)
50      HOST_WIDE_INT c;
51      enum machine_mode mode;
52 {
53   int width = GET_MODE_BITSIZE (mode);
54
55   /* Canonicalize BImode to 0 and STORE_FLAG_VALUE.  */
56   if (mode == BImode)
57     return c & 1 ? STORE_FLAG_VALUE : 0;
58
59   /* We clear out all bits that don't belong in MODE, unless they and our
60      sign bit are all one.  So we get either a reasonable negative
61      value or a reasonable unsigned value.  */
62
63   if (width < HOST_BITS_PER_WIDE_INT
64       && ((c & ((HOST_WIDE_INT) (-1) << (width - 1)))
65            != ((HOST_WIDE_INT) (-1) << (width - 1))))
66     c &= ((HOST_WIDE_INT) 1 << width) - 1;
67
68   /* If this would be an entire word for the target, but is not for
69      the host, then sign-extend on the host so that the number will look
70      the same way on the host that it would on the target.
71
72      For example, when building a 64 bit alpha hosted 32 bit sparc
73      targeted compiler, then we want the 32 bit unsigned value -1 to be
74      represented as a 64 bit value -1, and not as 0x00000000ffffffff.
75      The later confuses the sparc backend.  */
76
77   if (BITS_PER_WORD < HOST_BITS_PER_WIDE_INT
78       && BITS_PER_WORD == width
79       && (c & ((HOST_WIDE_INT) 1 << (width - 1))))
80     c |= ((HOST_WIDE_INT) (-1) << width);
81
82   return c;
83 }
84
85 /* Return an rtx for the sum of X and the integer C.
86
87    This function should be used via the `plus_constant' macro.  */
88
89 rtx
90 plus_constant_wide (x, c)
91      register rtx x;
92      register HOST_WIDE_INT c;
93 {
94   register RTX_CODE code;
95   register enum machine_mode mode;
96   register rtx tem;
97   int all_constant = 0;
98
99   if (c == 0)
100     return x;
101
102  restart:
103
104   code = GET_CODE (x);
105   mode = GET_MODE (x);
106   switch (code)
107     {
108     case CONST_INT:
109       return GEN_INT (INTVAL (x) + c);
110
111     case CONST_DOUBLE:
112       {
113         unsigned HOST_WIDE_INT l1 = CONST_DOUBLE_LOW (x);
114         HOST_WIDE_INT h1 = CONST_DOUBLE_HIGH (x);
115         unsigned HOST_WIDE_INT l2 = c;
116         HOST_WIDE_INT h2 = c < 0 ? ~0 : 0;
117         unsigned HOST_WIDE_INT lv;
118         HOST_WIDE_INT hv;
119
120         add_double (l1, h1, l2, h2, &lv, &hv);
121
122         return immed_double_const (lv, hv, VOIDmode);
123       }
124
125     case MEM:
126       /* If this is a reference to the constant pool, try replacing it with
127          a reference to a new constant.  If the resulting address isn't
128          valid, don't return it because we have no way to validize it.  */
129       if (GET_CODE (XEXP (x, 0)) == SYMBOL_REF
130           && CONSTANT_POOL_ADDRESS_P (XEXP (x, 0)))
131         {
132           /* Any rtl we create here must go in a saveable obstack, since
133              we might have been called from within combine.  */
134           push_obstacks_nochange ();
135           rtl_in_saveable_obstack ();
136           tem
137             = force_const_mem (GET_MODE (x),
138                                plus_constant (get_pool_constant (XEXP (x, 0)),
139                                               c));
140           pop_obstacks ();
141           if (memory_address_p (GET_MODE (tem), XEXP (tem, 0)))
142             return tem;
143         }
144       break;
145
146     case CONST:
147       /* If adding to something entirely constant, set a flag
148          so that we can add a CONST around the result.  */
149       x = XEXP (x, 0);
150       all_constant = 1;
151       goto restart;
152
153     case SYMBOL_REF:
154     case LABEL_REF:
155       all_constant = 1;
156       break;
157
158     case PLUS:
159       /* The interesting case is adding the integer to a sum.
160          Look for constant term in the sum and combine
161          with C.  For an integer constant term, we make a combined
162          integer.  For a constant term that is not an explicit integer,
163          we cannot really combine, but group them together anyway.  
164
165          Restart or use a recursive call in case the remaining operand is
166          something that we handle specially, such as a SYMBOL_REF.
167
168          We may not immediately return from the recursive call here, lest
169          all_constant gets lost.  */
170
171       if (GET_CODE (XEXP (x, 1)) == CONST_INT)
172         {
173           c += INTVAL (XEXP (x, 1));
174
175           if (GET_MODE (x) != VOIDmode)
176             c = trunc_int_for_mode (c, GET_MODE (x));
177
178           x = XEXP (x, 0);
179           goto restart;
180         }
181       else if (CONSTANT_P (XEXP (x, 0)))
182         {
183           x = gen_rtx_PLUS (mode,
184                             plus_constant (XEXP (x, 0), c),
185                             XEXP (x, 1));
186           c = 0;
187         }
188       else if (CONSTANT_P (XEXP (x, 1)))
189         {
190           x = gen_rtx_PLUS (mode,
191                             XEXP (x, 0),
192                             plus_constant (XEXP (x, 1), c));
193           c = 0;
194         }
195       break;
196       
197     default:
198       break;
199     }
200
201   if (c != 0)
202     x = gen_rtx_PLUS (mode, x, GEN_INT (c));
203
204   if (GET_CODE (x) == SYMBOL_REF || GET_CODE (x) == LABEL_REF)
205     return x;
206   else if (all_constant)
207     return gen_rtx_CONST (mode, x);
208   else
209     return x;
210 }
211
212 /* This is the same as `plus_constant', except that it handles LO_SUM.
213
214    This function should be used via the `plus_constant_for_output' macro.  */
215
216 rtx
217 plus_constant_for_output_wide (x, c)
218      register rtx x;
219      register HOST_WIDE_INT c;
220 {
221   register enum machine_mode mode = GET_MODE (x);
222
223   if (GET_CODE (x) == LO_SUM)
224     return gen_rtx_LO_SUM (mode, XEXP (x, 0),
225                            plus_constant_for_output (XEXP (x, 1), c));
226
227   else
228     return plus_constant (x, c);
229 }
230 \f
231 /* If X is a sum, return a new sum like X but lacking any constant terms.
232    Add all the removed constant terms into *CONSTPTR.
233    X itself is not altered.  The result != X if and only if
234    it is not isomorphic to X.  */
235
236 rtx
237 eliminate_constant_term (x, constptr)
238      rtx x;
239      rtx *constptr;
240 {
241   register rtx x0, x1;
242   rtx tem;
243
244   if (GET_CODE (x) != PLUS)
245     return x;
246
247   /* First handle constants appearing at this level explicitly.  */
248   if (GET_CODE (XEXP (x, 1)) == CONST_INT
249       && 0 != (tem = simplify_binary_operation (PLUS, GET_MODE (x), *constptr,
250                                                 XEXP (x, 1)))
251       && GET_CODE (tem) == CONST_INT)
252     {
253       *constptr = tem;
254       return eliminate_constant_term (XEXP (x, 0), constptr);
255     }
256
257   tem = const0_rtx;
258   x0 = eliminate_constant_term (XEXP (x, 0), &tem);
259   x1 = eliminate_constant_term (XEXP (x, 1), &tem);
260   if ((x1 != XEXP (x, 1) || x0 != XEXP (x, 0))
261       && 0 != (tem = simplify_binary_operation (PLUS, GET_MODE (x),
262                                                 *constptr, tem))
263       && GET_CODE (tem) == CONST_INT)
264     {
265       *constptr = tem;
266       return gen_rtx_PLUS (GET_MODE (x), x0, x1);
267     }
268
269   return x;
270 }
271
272 /* Returns the insn that next references REG after INSN, or 0
273    if REG is clobbered before next referenced or we cannot find
274    an insn that references REG in a straight-line piece of code.  */
275
276 rtx
277 find_next_ref (reg, insn)
278      rtx reg;
279      rtx insn;
280 {
281   rtx next;
282
283   for (insn = NEXT_INSN (insn); insn; insn = next)
284     {
285       next = NEXT_INSN (insn);
286       if (GET_CODE (insn) == NOTE)
287         continue;
288       if (GET_CODE (insn) == CODE_LABEL
289           || GET_CODE (insn) == BARRIER)
290         return 0;
291       if (GET_CODE (insn) == INSN
292           || GET_CODE (insn) == JUMP_INSN
293           || GET_CODE (insn) == CALL_INSN)
294         {
295           if (reg_set_p (reg, insn))
296             return 0;
297           if (reg_mentioned_p (reg, PATTERN (insn)))
298             return insn;
299           if (GET_CODE (insn) == JUMP_INSN)
300             {
301               if (any_uncondjump_p (insn))
302                 next = JUMP_LABEL (insn);
303               else
304                 return 0;
305             }
306           if (GET_CODE (insn) == CALL_INSN
307               && REGNO (reg) < FIRST_PSEUDO_REGISTER
308               && call_used_regs[REGNO (reg)])
309             return 0;
310         }
311       else
312         abort ();
313     }
314   return 0;
315 }
316
317 /* Return an rtx for the size in bytes of the value of EXP.  */
318
319 rtx
320 expr_size (exp)
321      tree exp;
322 {
323   tree size = size_in_bytes (TREE_TYPE (exp));
324
325   if (TREE_CODE (size) != INTEGER_CST
326       && contains_placeholder_p (size))
327     size = build (WITH_RECORD_EXPR, sizetype, size, exp);
328
329   return expand_expr (size, NULL_RTX, TYPE_MODE (sizetype),
330                       EXPAND_MEMORY_USE_BAD);
331 }
332 \f
333 /* Return a copy of X in which all memory references
334    and all constants that involve symbol refs
335    have been replaced with new temporary registers.
336    Also emit code to load the memory locations and constants
337    into those registers.
338
339    If X contains no such constants or memory references,
340    X itself (not a copy) is returned.
341
342    If a constant is found in the address that is not a legitimate constant
343    in an insn, it is left alone in the hope that it might be valid in the
344    address.
345
346    X may contain no arithmetic except addition, subtraction and multiplication.
347    Values returned by expand_expr with 1 for sum_ok fit this constraint.  */
348
349 static rtx
350 break_out_memory_refs (x)
351      register rtx x;
352 {
353   if (GET_CODE (x) == MEM
354       || (CONSTANT_P (x) && CONSTANT_ADDRESS_P (x)
355           && GET_MODE (x) != VOIDmode))
356     x = force_reg (GET_MODE (x), x);
357   else if (GET_CODE (x) == PLUS || GET_CODE (x) == MINUS
358            || GET_CODE (x) == MULT)
359     {
360       register rtx op0 = break_out_memory_refs (XEXP (x, 0));
361       register rtx op1 = break_out_memory_refs (XEXP (x, 1));
362
363       if (op0 != XEXP (x, 0) || op1 != XEXP (x, 1))
364         x = gen_rtx_fmt_ee (GET_CODE (x), Pmode, op0, op1);
365     }
366
367   return x;
368 }
369
370 #ifdef POINTERS_EXTEND_UNSIGNED
371
372 /* Given X, a memory address in ptr_mode, convert it to an address
373    in Pmode, or vice versa (TO_MODE says which way).  We take advantage of
374    the fact that pointers are not allowed to overflow by commuting arithmetic
375    operations over conversions so that address arithmetic insns can be
376    used.  */
377
378 rtx
379 convert_memory_address (to_mode, x)
380      enum machine_mode to_mode;
381      rtx x;
382 {
383   enum machine_mode from_mode = to_mode == ptr_mode ? Pmode : ptr_mode;
384   rtx temp;
385
386   /* Here we handle some special cases.  If none of them apply, fall through
387      to the default case.  */
388   switch (GET_CODE (x))
389     {
390     case CONST_INT:
391     case CONST_DOUBLE:
392       return x;
393
394     case LABEL_REF:
395       temp = gen_rtx_LABEL_REF (to_mode, XEXP (x, 0));
396       LABEL_REF_NONLOCAL_P (temp) = LABEL_REF_NONLOCAL_P (x);
397       return temp;
398
399     case SYMBOL_REF:
400       temp = gen_rtx_SYMBOL_REF (to_mode, XSTR (x, 0));
401       SYMBOL_REF_FLAG (temp) = SYMBOL_REF_FLAG (x);
402       CONSTANT_POOL_ADDRESS_P (temp) = CONSTANT_POOL_ADDRESS_P (x);
403       return temp;
404
405     case CONST:
406       return gen_rtx_CONST (to_mode, 
407                             convert_memory_address (to_mode, XEXP (x, 0)));
408
409     case PLUS:
410     case MULT:
411       /* For addition the second operand is a small constant, we can safely
412          permute the conversion and addition operation.  We can always safely
413          permute them if we are making the address narrower.  In addition,
414          always permute the operations if this is a constant.  */
415       if (GET_MODE_SIZE (to_mode) < GET_MODE_SIZE (from_mode)
416           || (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 1)) == CONST_INT
417               && (INTVAL (XEXP (x, 1)) + 20000 < 40000
418                   || CONSTANT_P (XEXP (x, 0)))))
419         return gen_rtx_fmt_ee (GET_CODE (x), to_mode, 
420                                convert_memory_address (to_mode, XEXP (x, 0)),
421                                convert_memory_address (to_mode, XEXP (x, 1)));
422       break;
423       
424     default:
425       break;
426     }
427
428   return convert_modes (to_mode, from_mode,
429                         x, POINTERS_EXTEND_UNSIGNED);
430 }
431 #endif
432
433 /* Given a memory address or facsimile X, construct a new address,
434    currently equivalent, that is stable: future stores won't change it.
435
436    X must be composed of constants, register and memory references
437    combined with addition, subtraction and multiplication:
438    in other words, just what you can get from expand_expr if sum_ok is 1.
439
440    Works by making copies of all regs and memory locations used
441    by X and combining them the same way X does.
442    You could also stabilize the reference to this address
443    by copying the address to a register with copy_to_reg;
444    but then you wouldn't get indexed addressing in the reference.  */
445
446 rtx
447 copy_all_regs (x)
448      register rtx x;
449 {
450   if (GET_CODE (x) == REG)
451     {
452       if (REGNO (x) != FRAME_POINTER_REGNUM
453 #if HARD_FRAME_POINTER_REGNUM != FRAME_POINTER_REGNUM
454           && REGNO (x) != HARD_FRAME_POINTER_REGNUM
455 #endif
456           )
457         x = copy_to_reg (x);
458     }
459   else if (GET_CODE (x) == MEM)
460     x = copy_to_reg (x);
461   else if (GET_CODE (x) == PLUS || GET_CODE (x) == MINUS
462            || GET_CODE (x) == MULT)
463     {
464       register rtx op0 = copy_all_regs (XEXP (x, 0));
465       register rtx op1 = copy_all_regs (XEXP (x, 1));
466       if (op0 != XEXP (x, 0) || op1 != XEXP (x, 1))
467         x = gen_rtx_fmt_ee (GET_CODE (x), Pmode, op0, op1);
468     }
469   return x;
470 }
471 \f
472 /* Return something equivalent to X but valid as a memory address
473    for something of mode MODE.  When X is not itself valid, this
474    works by copying X or subexpressions of it into registers.  */
475
476 rtx
477 memory_address (mode, x)
478      enum machine_mode mode;
479      register rtx x;
480 {
481   register rtx oldx = x;
482
483   if (GET_CODE (x) == ADDRESSOF)
484     return x;
485
486 #ifdef POINTERS_EXTEND_UNSIGNED
487   if (GET_MODE (x) == ptr_mode)
488     x = convert_memory_address (Pmode, x);
489 #endif
490
491   /* By passing constant addresses thru registers
492      we get a chance to cse them.  */
493   if (! cse_not_expected && CONSTANT_P (x) && CONSTANT_ADDRESS_P (x))
494     x = force_reg (Pmode, x);
495
496   /* Accept a QUEUED that refers to a REG
497      even though that isn't a valid address.
498      On attempting to put this in an insn we will call protect_from_queue
499      which will turn it into a REG, which is valid.  */
500   else if (GET_CODE (x) == QUEUED
501       && GET_CODE (QUEUED_VAR (x)) == REG)
502     ;
503
504   /* We get better cse by rejecting indirect addressing at this stage.
505      Let the combiner create indirect addresses where appropriate.
506      For now, generate the code so that the subexpressions useful to share
507      are visible.  But not if cse won't be done!  */
508   else
509     {
510       if (! cse_not_expected && GET_CODE (x) != REG)
511         x = break_out_memory_refs (x);
512
513       /* At this point, any valid address is accepted.  */
514       GO_IF_LEGITIMATE_ADDRESS (mode, x, win);
515
516       /* If it was valid before but breaking out memory refs invalidated it,
517          use it the old way.  */
518       if (memory_address_p (mode, oldx))
519         goto win2;
520
521       /* Perform machine-dependent transformations on X
522          in certain cases.  This is not necessary since the code
523          below can handle all possible cases, but machine-dependent
524          transformations can make better code.  */
525       LEGITIMIZE_ADDRESS (x, oldx, mode, win);
526
527       /* PLUS and MULT can appear in special ways
528          as the result of attempts to make an address usable for indexing.
529          Usually they are dealt with by calling force_operand, below.
530          But a sum containing constant terms is special
531          if removing them makes the sum a valid address:
532          then we generate that address in a register
533          and index off of it.  We do this because it often makes
534          shorter code, and because the addresses thus generated
535          in registers often become common subexpressions.  */
536       if (GET_CODE (x) == PLUS)
537         {
538           rtx constant_term = const0_rtx;
539           rtx y = eliminate_constant_term (x, &constant_term);
540           if (constant_term == const0_rtx
541               || ! memory_address_p (mode, y))
542             x = force_operand (x, NULL_RTX);
543           else
544             {
545               y = gen_rtx_PLUS (GET_MODE (x), copy_to_reg (y), constant_term);
546               if (! memory_address_p (mode, y))
547                 x = force_operand (x, NULL_RTX);
548               else
549                 x = y;
550             }
551         }
552
553       else if (GET_CODE (x) == MULT || GET_CODE (x) == MINUS)
554         x = force_operand (x, NULL_RTX);
555
556       /* If we have a register that's an invalid address,
557          it must be a hard reg of the wrong class.  Copy it to a pseudo.  */
558       else if (GET_CODE (x) == REG)
559         x = copy_to_reg (x);
560
561       /* Last resort: copy the value to a register, since
562          the register is a valid address.  */
563       else
564         x = force_reg (Pmode, x);
565
566       goto done;
567
568     win2:
569       x = oldx;
570     win:
571       if (flag_force_addr && ! cse_not_expected && GET_CODE (x) != REG
572           /* Don't copy an addr via a reg if it is one of our stack slots.  */
573           && ! (GET_CODE (x) == PLUS
574                 && (XEXP (x, 0) == virtual_stack_vars_rtx
575                     || XEXP (x, 0) == virtual_incoming_args_rtx)))
576         {
577           if (general_operand (x, Pmode))
578             x = force_reg (Pmode, x);
579           else
580             x = force_operand (x, NULL_RTX);
581         }
582     }
583
584  done:
585
586   /* If we didn't change the address, we are done.  Otherwise, mark
587      a reg as a pointer if we have REG or REG + CONST_INT.  */
588   if (oldx == x)
589     return x;
590   else if (GET_CODE (x) == REG)
591     mark_reg_pointer (x, BITS_PER_UNIT);
592   else if (GET_CODE (x) == PLUS
593            && GET_CODE (XEXP (x, 0)) == REG
594            && GET_CODE (XEXP (x, 1)) == CONST_INT)
595     mark_reg_pointer (XEXP (x, 0), BITS_PER_UNIT);
596
597   /* OLDX may have been the address on a temporary.  Update the address
598      to indicate that X is now used.  */
599   update_temp_slot_address (oldx, x);
600
601   return x;
602 }
603
604 /* Like `memory_address' but pretend `flag_force_addr' is 0.  */
605
606 rtx
607 memory_address_noforce (mode, x)
608      enum machine_mode mode;
609      rtx x;
610 {
611   int ambient_force_addr = flag_force_addr;
612   rtx val;
613
614   flag_force_addr = 0;
615   val = memory_address (mode, x);
616   flag_force_addr = ambient_force_addr;
617   return val;
618 }
619
620 /* Convert a mem ref into one with a valid memory address.
621    Pass through anything else unchanged.  */
622
623 rtx
624 validize_mem (ref)
625      rtx ref;
626 {
627   if (GET_CODE (ref) != MEM)
628     return ref;
629   if (memory_address_p (GET_MODE (ref), XEXP (ref, 0)))
630     return ref;
631   /* Don't alter REF itself, since that is probably a stack slot.  */
632   return change_address (ref, GET_MODE (ref), XEXP (ref, 0));
633 }
634 \f
635 /* Given REF, either a MEM or a REG, and T, either the type of X or
636    the expression corresponding to REF, set RTX_UNCHANGING_P if
637    appropriate.  */
638
639 void
640 maybe_set_unchanging (ref, t)
641      rtx ref;
642      tree t;
643 {
644   /* We can set RTX_UNCHANGING_P from TREE_READONLY for decls whose
645      initialization is only executed once, or whose initializer always
646      has the same value.  Currently we simplify this to PARM_DECLs in the
647      first case, and decls with TREE_CONSTANT initializers in the second.  */
648   if ((TREE_READONLY (t) && DECL_P (t)
649        && (TREE_CODE (t) == PARM_DECL
650            || DECL_INITIAL (t) == NULL_TREE
651            || TREE_CONSTANT (DECL_INITIAL (t))))
652       || TREE_CODE_CLASS (TREE_CODE (t)) == 'c')
653     RTX_UNCHANGING_P (ref) = 1;
654 }
655
656 /* Given REF, a MEM, and T, either the type of X or the expression
657    corresponding to REF, set the memory attributes.  OBJECTP is nonzero
658    if we are making a new object of this type.  */
659
660 void
661 set_mem_attributes (ref, t, objectp)
662      rtx ref;
663      tree t;
664      int objectp;
665 {
666   tree type;
667
668   /* It can happen that type_for_mode was given a mode for which there
669      is no language-level type.  In which case it returns NULL, which
670      we can see here.  */
671   if (t == NULL_TREE)
672     return;
673
674   type = TYPE_P (t) ? t : TREE_TYPE (t);
675
676   /* Get the alias set from the expression or type (perhaps using a
677      front-end routine) and then copy bits from the type.  */
678
679   /* It is incorrect to set RTX_UNCHANGING_P from TREE_READONLY (type)
680      here, because, in C and C++, the fact that a location is accessed
681      through a const expression does not mean that the value there can
682      never change.  */
683   MEM_ALIAS_SET (ref) = get_alias_set (t);
684   MEM_VOLATILE_P (ref) = TYPE_VOLATILE (type);
685   MEM_IN_STRUCT_P (ref) = AGGREGATE_TYPE_P (type);
686
687   /* If we are making an object of this type, we know that it is a scalar if
688      the type is not an aggregate. */
689   if (objectp && ! AGGREGATE_TYPE_P (type))
690     MEM_SCALAR_P (ref) = 1;
691
692   /* If T is a type, this is all we can do.  Otherwise, we may be able
693      to deduce some more information about the expression.  */
694   if (TYPE_P (t))
695     return;
696
697   maybe_set_unchanging (ref, t);
698   if (TREE_THIS_VOLATILE (t))
699     MEM_VOLATILE_P (ref) = 1;
700
701   /* Now see if we can say more about whether it's an aggregate or
702      scalar.  If we already know it's an aggregate, don't bother.  */
703   if (MEM_IN_STRUCT_P (ref))
704     return;
705
706   /* Now remove any NOPs: they don't change what the underlying object is.
707      Likewise for SAVE_EXPR.  */
708   while (TREE_CODE (t) == NOP_EXPR || TREE_CODE (t) == CONVERT_EXPR
709          || TREE_CODE (t) == NON_LVALUE_EXPR || TREE_CODE (t) == SAVE_EXPR)
710     t = TREE_OPERAND (t, 0);
711
712   /* Since we already know the type isn't an aggregate, if this is a decl,
713      it must be a scalar.  Or if it is a reference into an aggregate,
714      this is part of an aggregate.   Otherwise we don't know.  */
715   if (DECL_P (t))
716     MEM_SCALAR_P (ref) = 1;
717   else if (TREE_CODE (t) == COMPONENT_REF || TREE_CODE (t) == ARRAY_REF
718            || TREE_CODE (t) == BIT_FIELD_REF)
719     MEM_IN_STRUCT_P (ref) = 1;
720 }
721 \f
722 /* Return a modified copy of X with its memory address copied
723    into a temporary register to protect it from side effects.
724    If X is not a MEM, it is returned unchanged (and not copied).
725    Perhaps even if it is a MEM, if there is no need to change it.  */
726
727 rtx
728 stabilize (x)
729      rtx x;
730 {
731   register rtx addr;
732
733   if (GET_CODE (x) != MEM)
734     return x;
735
736   addr = XEXP (x, 0);
737   if (rtx_unstable_p (addr))
738     {
739       rtx temp = force_reg (Pmode, copy_all_regs (addr));
740       rtx mem = gen_rtx_MEM (GET_MODE (x), temp);
741
742       MEM_COPY_ATTRIBUTES (mem, x);
743       return mem;
744     }
745   return x;
746 }
747 \f
748 /* Copy the value or contents of X to a new temp reg and return that reg.  */
749
750 rtx
751 copy_to_reg (x)
752      rtx x;
753 {
754   register rtx temp = gen_reg_rtx (GET_MODE (x));
755  
756   /* If not an operand, must be an address with PLUS and MULT so
757      do the computation.  */ 
758   if (! general_operand (x, VOIDmode))
759     x = force_operand (x, temp);
760   
761   if (x != temp)
762     emit_move_insn (temp, x);
763
764   return temp;
765 }
766
767 /* Like copy_to_reg but always give the new register mode Pmode
768    in case X is a constant.  */
769
770 rtx
771 copy_addr_to_reg (x)
772      rtx x;
773 {
774   return copy_to_mode_reg (Pmode, x);
775 }
776
777 /* Like copy_to_reg but always give the new register mode MODE
778    in case X is a constant.  */
779
780 rtx
781 copy_to_mode_reg (mode, x)
782      enum machine_mode mode;
783      rtx x;
784 {
785   register rtx temp = gen_reg_rtx (mode);
786   
787   /* If not an operand, must be an address with PLUS and MULT so
788      do the computation.  */ 
789   if (! general_operand (x, VOIDmode))
790     x = force_operand (x, temp);
791
792   if (GET_MODE (x) != mode && GET_MODE (x) != VOIDmode)
793     abort ();
794   if (x != temp)
795     emit_move_insn (temp, x);
796   return temp;
797 }
798
799 /* Load X into a register if it is not already one.
800    Use mode MODE for the register.
801    X should be valid for mode MODE, but it may be a constant which
802    is valid for all integer modes; that's why caller must specify MODE.
803
804    The caller must not alter the value in the register we return,
805    since we mark it as a "constant" register.  */
806
807 rtx
808 force_reg (mode, x)
809      enum machine_mode mode;
810      rtx x;
811 {
812   register rtx temp, insn, set;
813
814   if (GET_CODE (x) == REG)
815     return x;
816   
817   temp = gen_reg_rtx (mode);
818   
819   if (! general_operand (x, mode))
820     x = force_operand (x, NULL_RTX);
821   
822   insn = emit_move_insn (temp, x);
823
824   /* Let optimizers know that TEMP's value never changes
825      and that X can be substituted for it.  Don't get confused
826      if INSN set something else (such as a SUBREG of TEMP).  */
827   if (CONSTANT_P (x)
828       && (set = single_set (insn)) != 0
829       && SET_DEST (set) == temp)
830     {
831       rtx note = find_reg_note (insn, REG_EQUAL, NULL_RTX);
832
833       if (note)
834         XEXP (note, 0) = x;
835       else
836         REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_EQUAL, x, REG_NOTES (insn));
837     }
838   return temp;
839 }
840
841 /* If X is a memory ref, copy its contents to a new temp reg and return
842    that reg.  Otherwise, return X.  */
843
844 rtx
845 force_not_mem (x)
846      rtx x;
847 {
848   register rtx temp;
849
850   if (GET_CODE (x) != MEM || GET_MODE (x) == BLKmode)
851     return x;
852
853   temp = gen_reg_rtx (GET_MODE (x));
854   emit_move_insn (temp, x);
855   return temp;
856 }
857
858 /* Copy X to TARGET (if it's nonzero and a reg)
859    or to a new temp reg and return that reg.
860    MODE is the mode to use for X in case it is a constant.  */
861
862 rtx
863 copy_to_suggested_reg (x, target, mode)
864      rtx x, target;
865      enum machine_mode mode;
866 {
867   register rtx temp;
868
869   if (target && GET_CODE (target) == REG)
870     temp = target;
871   else
872     temp = gen_reg_rtx (mode);
873
874   emit_move_insn (temp, x);
875   return temp;
876 }
877 \f
878 /* Return the mode to use to store a scalar of TYPE and MODE.
879    PUNSIGNEDP points to the signedness of the type and may be adjusted
880    to show what signedness to use on extension operations.
881
882    FOR_CALL is non-zero if this call is promoting args for a call.  */
883
884 enum machine_mode
885 promote_mode (type, mode, punsignedp, for_call)
886      tree type;
887      enum machine_mode mode;
888      int *punsignedp;
889      int for_call ATTRIBUTE_UNUSED;
890 {
891   enum tree_code code = TREE_CODE (type);
892   int unsignedp = *punsignedp;
893
894 #ifdef PROMOTE_FOR_CALL_ONLY
895   if (! for_call)
896     return mode;
897 #endif
898
899   switch (code)
900     {
901 #ifdef PROMOTE_MODE
902     case INTEGER_TYPE:   case ENUMERAL_TYPE:   case BOOLEAN_TYPE:
903     case CHAR_TYPE:      case REAL_TYPE:       case OFFSET_TYPE:
904       PROMOTE_MODE (mode, unsignedp, type);
905       break;
906 #endif
907
908 #ifdef POINTERS_EXTEND_UNSIGNED
909     case REFERENCE_TYPE:
910     case POINTER_TYPE:
911       mode = Pmode;
912       unsignedp = POINTERS_EXTEND_UNSIGNED;
913       break;
914 #endif
915       
916     default:
917       break;
918     }
919
920   *punsignedp = unsignedp;
921   return mode;
922 }
923 \f
924 /* Adjust the stack pointer by ADJUST (an rtx for a number of bytes).
925    This pops when ADJUST is positive.  ADJUST need not be constant.  */
926
927 void
928 adjust_stack (adjust)
929      rtx adjust;
930 {
931   rtx temp;
932   adjust = protect_from_queue (adjust, 0);
933
934   if (adjust == const0_rtx)
935     return;
936
937   /* We expect all variable sized adjustments to be multiple of
938      PREFERRED_STACK_BOUNDARY.  */
939   if (GET_CODE (adjust) == CONST_INT)
940     stack_pointer_delta -= INTVAL (adjust);
941
942   temp = expand_binop (Pmode,
943 #ifdef STACK_GROWS_DOWNWARD
944                        add_optab,
945 #else
946                        sub_optab,
947 #endif
948                        stack_pointer_rtx, adjust, stack_pointer_rtx, 0,
949                        OPTAB_LIB_WIDEN);
950
951   if (temp != stack_pointer_rtx)
952     emit_move_insn (stack_pointer_rtx, temp);
953 }
954
955 /* Adjust the stack pointer by minus ADJUST (an rtx for a number of bytes).
956    This pushes when ADJUST is positive.  ADJUST need not be constant.  */
957
958 void
959 anti_adjust_stack (adjust)
960      rtx adjust;
961 {
962   rtx temp;
963   adjust = protect_from_queue (adjust, 0);
964
965   if (adjust == const0_rtx)
966     return;
967
968   /* We expect all variable sized adjustments to be multiple of
969      PREFERRED_STACK_BOUNDARY.  */
970   if (GET_CODE (adjust) == CONST_INT)
971     stack_pointer_delta += INTVAL (adjust);
972
973   temp = expand_binop (Pmode,
974 #ifdef STACK_GROWS_DOWNWARD
975                        sub_optab,
976 #else
977                        add_optab,
978 #endif
979                        stack_pointer_rtx, adjust, stack_pointer_rtx, 0,
980                        OPTAB_LIB_WIDEN);
981
982   if (temp != stack_pointer_rtx)
983     emit_move_insn (stack_pointer_rtx, temp);
984 }
985
986 /* Round the size of a block to be pushed up to the boundary required
987    by this machine.  SIZE is the desired size, which need not be constant.  */
988
989 rtx
990 round_push (size)
991      rtx size;
992 {
993 #ifdef PREFERRED_STACK_BOUNDARY
994   int align = PREFERRED_STACK_BOUNDARY / BITS_PER_UNIT;
995   if (align == 1)
996     return size;
997   if (GET_CODE (size) == CONST_INT)
998     {
999       int new = (INTVAL (size) + align - 1) / align * align;
1000       if (INTVAL (size) != new)
1001         size = GEN_INT (new);
1002     }
1003   else
1004     {
1005       /* CEIL_DIV_EXPR needs to worry about the addition overflowing,
1006          but we know it can't.  So add ourselves and then do
1007          TRUNC_DIV_EXPR.  */
1008       size = expand_binop (Pmode, add_optab, size, GEN_INT (align - 1),
1009                            NULL_RTX, 1, OPTAB_LIB_WIDEN);
1010       size = expand_divmod (0, TRUNC_DIV_EXPR, Pmode, size, GEN_INT (align),
1011                             NULL_RTX, 1);
1012       size = expand_mult (Pmode, size, GEN_INT (align), NULL_RTX, 1);
1013     }
1014 #endif /* PREFERRED_STACK_BOUNDARY */
1015   return size;
1016 }
1017 \f
1018 /* Save the stack pointer for the purpose in SAVE_LEVEL.  PSAVE is a pointer
1019    to a previously-created save area.  If no save area has been allocated,
1020    this function will allocate one.  If a save area is specified, it
1021    must be of the proper mode.
1022
1023    The insns are emitted after insn AFTER, if nonzero, otherwise the insns
1024    are emitted at the current position.  */
1025
1026 void
1027 emit_stack_save (save_level, psave, after)
1028      enum save_level save_level;
1029      rtx *psave;
1030      rtx after;
1031 {
1032   rtx sa = *psave;
1033   /* The default is that we use a move insn and save in a Pmode object.  */
1034   rtx (*fcn) PARAMS ((rtx, rtx)) = gen_move_insn;
1035   enum machine_mode mode = STACK_SAVEAREA_MODE (save_level);
1036
1037   /* See if this machine has anything special to do for this kind of save.  */
1038   switch (save_level)
1039     {
1040 #ifdef HAVE_save_stack_block
1041     case SAVE_BLOCK:
1042       if (HAVE_save_stack_block)
1043         fcn = gen_save_stack_block;
1044       break;
1045 #endif
1046 #ifdef HAVE_save_stack_function
1047     case SAVE_FUNCTION:
1048       if (HAVE_save_stack_function)
1049         fcn = gen_save_stack_function;
1050       break;
1051 #endif
1052 #ifdef HAVE_save_stack_nonlocal
1053     case SAVE_NONLOCAL:
1054       if (HAVE_save_stack_nonlocal)
1055         fcn = gen_save_stack_nonlocal;
1056       break;
1057 #endif
1058     default:
1059       break;
1060     }
1061
1062   /* If there is no save area and we have to allocate one, do so.  Otherwise
1063      verify the save area is the proper mode.  */
1064
1065   if (sa == 0)
1066     {
1067       if (mode != VOIDmode)
1068         {
1069           if (save_level == SAVE_NONLOCAL)
1070             *psave = sa = assign_stack_local (mode, GET_MODE_SIZE (mode), 0);
1071           else
1072             *psave = sa = gen_reg_rtx (mode);
1073         }
1074     }
1075   else
1076     {
1077       if (mode == VOIDmode || GET_MODE (sa) != mode)
1078         abort ();
1079     }
1080
1081   if (after)
1082     {
1083       rtx seq;
1084
1085       start_sequence ();
1086       /* We must validize inside the sequence, to ensure that any instructions
1087          created by the validize call also get moved to the right place.  */
1088       if (sa != 0)
1089         sa = validize_mem (sa);
1090       emit_insn (fcn (sa, stack_pointer_rtx));
1091       seq = gen_sequence ();
1092       end_sequence ();
1093       emit_insn_after (seq, after);
1094     }
1095   else
1096     {
1097       if (sa != 0)
1098         sa = validize_mem (sa);
1099       emit_insn (fcn (sa, stack_pointer_rtx));
1100     }
1101 }
1102
1103 /* Restore the stack pointer for the purpose in SAVE_LEVEL.  SA is the save
1104    area made by emit_stack_save.  If it is zero, we have nothing to do. 
1105
1106    Put any emitted insns after insn AFTER, if nonzero, otherwise at 
1107    current position.  */
1108
1109 void
1110 emit_stack_restore (save_level, sa, after)
1111      enum save_level save_level;
1112      rtx after;
1113      rtx sa;
1114 {
1115   /* The default is that we use a move insn.  */
1116   rtx (*fcn) PARAMS ((rtx, rtx)) = gen_move_insn;
1117
1118   /* See if this machine has anything special to do for this kind of save.  */
1119   switch (save_level)
1120     {
1121 #ifdef HAVE_restore_stack_block
1122     case SAVE_BLOCK:
1123       if (HAVE_restore_stack_block)
1124         fcn = gen_restore_stack_block;
1125       break;
1126 #endif
1127 #ifdef HAVE_restore_stack_function
1128     case SAVE_FUNCTION:
1129       if (HAVE_restore_stack_function)
1130         fcn = gen_restore_stack_function;
1131       break;
1132 #endif
1133 #ifdef HAVE_restore_stack_nonlocal
1134     case SAVE_NONLOCAL:
1135       if (HAVE_restore_stack_nonlocal)
1136         fcn = gen_restore_stack_nonlocal;
1137       break;
1138 #endif
1139     default:
1140       break;
1141     }
1142
1143   if (sa != 0)
1144     sa = validize_mem (sa);
1145
1146   if (after)
1147     {
1148       rtx seq;
1149
1150       start_sequence ();
1151       emit_insn (fcn (stack_pointer_rtx, sa));
1152       seq = gen_sequence ();
1153       end_sequence ();
1154       emit_insn_after (seq, after);
1155     }
1156   else
1157     emit_insn (fcn (stack_pointer_rtx, sa));
1158 }
1159 \f
1160 #ifdef SETJMP_VIA_SAVE_AREA
1161 /* Optimize RTL generated by allocate_dynamic_stack_space for targets
1162    where SETJMP_VIA_SAVE_AREA is true.  The problem is that on these
1163    platforms, the dynamic stack space used can corrupt the original
1164    frame, thus causing a crash if a longjmp unwinds to it.  */
1165
1166 void
1167 optimize_save_area_alloca (insns)
1168      rtx insns;
1169 {
1170   rtx insn;
1171
1172   for (insn = insns; insn; insn = NEXT_INSN(insn))
1173     {
1174       rtx note;
1175
1176       if (GET_CODE (insn) != INSN)
1177         continue;
1178
1179       for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1180         {
1181           if (REG_NOTE_KIND (note) != REG_SAVE_AREA)
1182             continue;
1183
1184           if (!current_function_calls_setjmp)
1185             {
1186               rtx pat = PATTERN (insn);
1187
1188               /* If we do not see the note in a pattern matching
1189                  these precise characteristics, we did something
1190                  entirely wrong in allocate_dynamic_stack_space. 
1191
1192                  Note, one way this could happen is if SETJMP_VIA_SAVE_AREA
1193                  was defined on a machine where stacks grow towards higher
1194                  addresses.
1195
1196                  Right now only supported port with stack that grow upward
1197                  is the HPPA and it does not define SETJMP_VIA_SAVE_AREA.  */
1198               if (GET_CODE (pat) != SET
1199                   || SET_DEST (pat) != stack_pointer_rtx
1200                   || GET_CODE (SET_SRC (pat)) != MINUS
1201                   || XEXP (SET_SRC (pat), 0) != stack_pointer_rtx)
1202                 abort ();
1203
1204               /* This will now be transformed into a (set REG REG)
1205                  so we can just blow away all the other notes.  */
1206               XEXP (SET_SRC (pat), 1) = XEXP (note, 0);
1207               REG_NOTES (insn) = NULL_RTX;
1208             }
1209           else
1210             {
1211               /* setjmp was called, we must remove the REG_SAVE_AREA
1212                  note so that later passes do not get confused by its
1213                  presence.  */
1214               if (note == REG_NOTES (insn))
1215                 {
1216                   REG_NOTES (insn) = XEXP (note, 1);
1217                 }
1218               else
1219                 {
1220                   rtx srch;
1221
1222                   for (srch = REG_NOTES (insn); srch; srch = XEXP (srch, 1))
1223                     if (XEXP (srch, 1) == note)
1224                       break;
1225
1226                   if (srch == NULL_RTX)
1227                     abort();
1228
1229                   XEXP (srch, 1) = XEXP (note, 1);
1230                 }
1231             }
1232           /* Once we've seen the note of interest, we need not look at
1233              the rest of them.  */
1234           break;
1235         }
1236     }
1237 }
1238 #endif /* SETJMP_VIA_SAVE_AREA */
1239
1240 /* Return an rtx representing the address of an area of memory dynamically
1241    pushed on the stack.  This region of memory is always aligned to
1242    a multiple of BIGGEST_ALIGNMENT.
1243
1244    Any required stack pointer alignment is preserved.
1245
1246    SIZE is an rtx representing the size of the area.
1247    TARGET is a place in which the address can be placed.
1248
1249    KNOWN_ALIGN is the alignment (in bits) that we know SIZE has.  */
1250
1251 rtx
1252 allocate_dynamic_stack_space (size, target, known_align)
1253      rtx size;
1254      rtx target;
1255      int known_align;
1256 {
1257 #ifdef SETJMP_VIA_SAVE_AREA
1258   rtx setjmpless_size = NULL_RTX;
1259 #endif
1260
1261   /* If we're asking for zero bytes, it doesn't matter what we point
1262      to since we can't dereference it.  But return a reasonable
1263      address anyway.  */
1264   if (size == const0_rtx)
1265     return virtual_stack_dynamic_rtx;
1266
1267   /* Otherwise, show we're calling alloca or equivalent.  */
1268   current_function_calls_alloca = 1;
1269
1270   /* Ensure the size is in the proper mode.  */
1271   if (GET_MODE (size) != VOIDmode && GET_MODE (size) != Pmode)
1272     size = convert_to_mode (Pmode, size, 1);
1273
1274   /* We can't attempt to minimize alignment necessary, because we don't
1275      know the final value of preferred_stack_boundary yet while executing
1276      this code.  */
1277 #ifdef PREFERRED_STACK_BOUNDARY
1278   cfun->preferred_stack_boundary = PREFERRED_STACK_BOUNDARY;
1279 #endif
1280
1281   /* We will need to ensure that the address we return is aligned to
1282      BIGGEST_ALIGNMENT.  If STACK_DYNAMIC_OFFSET is defined, we don't
1283      always know its final value at this point in the compilation (it 
1284      might depend on the size of the outgoing parameter lists, for
1285      example), so we must align the value to be returned in that case.
1286      (Note that STACK_DYNAMIC_OFFSET will have a default non-zero value if
1287      STACK_POINTER_OFFSET or ACCUMULATE_OUTGOING_ARGS are defined).
1288      We must also do an alignment operation on the returned value if
1289      the stack pointer alignment is less strict that BIGGEST_ALIGNMENT.
1290
1291      If we have to align, we must leave space in SIZE for the hole
1292      that might result from the alignment operation.  */
1293
1294 #if defined (STACK_DYNAMIC_OFFSET) || defined (STACK_POINTER_OFFSET) || ! defined (PREFERRED_STACK_BOUNDARY)
1295 #define MUST_ALIGN 1
1296 #else
1297 #define MUST_ALIGN (PREFERRED_STACK_BOUNDARY < BIGGEST_ALIGNMENT)
1298 #endif
1299
1300   if (MUST_ALIGN)
1301     {
1302       if (GET_CODE (size) == CONST_INT)
1303         size = GEN_INT (INTVAL (size)
1304                         + (BIGGEST_ALIGNMENT / BITS_PER_UNIT - 1));
1305       else
1306         size = expand_binop (Pmode, add_optab, size,
1307                              GEN_INT (BIGGEST_ALIGNMENT / BITS_PER_UNIT - 1),
1308                              NULL_RTX, 1, OPTAB_LIB_WIDEN);
1309     }
1310
1311 #ifdef SETJMP_VIA_SAVE_AREA
1312   /* If setjmp restores regs from a save area in the stack frame,
1313      avoid clobbering the reg save area.  Note that the offset of
1314      virtual_incoming_args_rtx includes the preallocated stack args space.
1315      It would be no problem to clobber that, but it's on the wrong side
1316      of the old save area.  */
1317   {
1318     rtx dynamic_offset
1319       = expand_binop (Pmode, sub_optab, virtual_stack_dynamic_rtx,
1320                       stack_pointer_rtx, NULL_RTX, 1, OPTAB_LIB_WIDEN);
1321
1322     if (!current_function_calls_setjmp)
1323       {
1324         int align = PREFERRED_STACK_BOUNDARY / BITS_PER_UNIT;
1325
1326         /* See optimize_save_area_alloca to understand what is being
1327            set up here.  */
1328
1329 #if !defined(PREFERRED_STACK_BOUNDARY) || !defined(MUST_ALIGN) || (PREFERRED_STACK_BOUNDARY != BIGGEST_ALIGNMENT)
1330         /* If anyone creates a target with these characteristics, let them
1331            know that our optimization cannot work correctly in such a case.  */
1332         abort();
1333 #endif
1334
1335         if (GET_CODE (size) == CONST_INT)
1336           {
1337             int new = INTVAL (size) / align * align;
1338
1339             if (INTVAL (size) != new)
1340               setjmpless_size = GEN_INT (new);
1341             else
1342               setjmpless_size = size;
1343           }
1344         else
1345           {
1346             /* Since we know overflow is not possible, we avoid using
1347                CEIL_DIV_EXPR and use TRUNC_DIV_EXPR instead.  */
1348             setjmpless_size = expand_divmod (0, TRUNC_DIV_EXPR, Pmode, size,
1349                                              GEN_INT (align), NULL_RTX, 1);
1350             setjmpless_size = expand_mult (Pmode, setjmpless_size,
1351                                            GEN_INT (align), NULL_RTX, 1);
1352           }
1353         /* Our optimization works based upon being able to perform a simple
1354            transformation of this RTL into a (set REG REG) so make sure things
1355            did in fact end up in a REG.  */
1356         if (!register_operand (setjmpless_size, Pmode))
1357           setjmpless_size = force_reg (Pmode, setjmpless_size);
1358       }
1359
1360     size = expand_binop (Pmode, add_optab, size, dynamic_offset,
1361                          NULL_RTX, 1, OPTAB_LIB_WIDEN);
1362   }
1363 #endif /* SETJMP_VIA_SAVE_AREA */
1364
1365   /* Round the size to a multiple of the required stack alignment.
1366      Since the stack if presumed to be rounded before this allocation,
1367      this will maintain the required alignment.
1368
1369      If the stack grows downward, we could save an insn by subtracting
1370      SIZE from the stack pointer and then aligning the stack pointer.
1371      The problem with this is that the stack pointer may be unaligned
1372      between the execution of the subtraction and alignment insns and
1373      some machines do not allow this.  Even on those that do, some
1374      signal handlers malfunction if a signal should occur between those
1375      insns.  Since this is an extremely rare event, we have no reliable
1376      way of knowing which systems have this problem.  So we avoid even
1377      momentarily mis-aligning the stack.  */
1378
1379 #ifdef PREFERRED_STACK_BOUNDARY
1380   /* If we added a variable amount to SIZE,
1381      we can no longer assume it is aligned.  */
1382 #if !defined (SETJMP_VIA_SAVE_AREA)
1383   if (MUST_ALIGN || known_align % PREFERRED_STACK_BOUNDARY != 0)
1384 #endif
1385     size = round_push (size);
1386 #endif
1387
1388   do_pending_stack_adjust ();
1389
1390  /* We ought to be called always on the toplevel and stack ought to be aligned
1391     propertly.  */
1392 #ifdef PREFERRED_STACK_BOUNDARY
1393   if (stack_pointer_delta % (PREFERRED_STACK_BOUNDARY / BITS_PER_UNIT))
1394     abort ();
1395 #endif
1396
1397   /* If needed, check that we have the required amount of stack.  Take into
1398      account what has already been checked.  */
1399   if (flag_stack_check && ! STACK_CHECK_BUILTIN)
1400     probe_stack_range (STACK_CHECK_MAX_FRAME_SIZE + STACK_CHECK_PROTECT, size);
1401
1402   /* Don't use a TARGET that isn't a pseudo.  */
1403   if (target == 0 || GET_CODE (target) != REG
1404       || REGNO (target) < FIRST_PSEUDO_REGISTER)
1405     target = gen_reg_rtx (Pmode);
1406
1407   mark_reg_pointer (target, known_align);
1408
1409   /* Perform the required allocation from the stack.  Some systems do
1410      this differently than simply incrementing/decrementing from the
1411      stack pointer, such as acquiring the space by calling malloc().  */
1412 #ifdef HAVE_allocate_stack
1413   if (HAVE_allocate_stack)
1414     {
1415       enum machine_mode mode = STACK_SIZE_MODE;
1416       insn_operand_predicate_fn pred;
1417
1418       pred = insn_data[(int) CODE_FOR_allocate_stack].operand[0].predicate;
1419       if (pred && ! ((*pred) (target, Pmode)))
1420 #ifdef POINTERS_EXTEND_UNSIGNED
1421         target = convert_memory_address (Pmode, target);
1422 #else
1423         target = copy_to_mode_reg (Pmode, target);
1424 #endif
1425
1426       if (mode == VOIDmode)
1427         mode = Pmode;
1428
1429       size = convert_modes (mode, ptr_mode, size, 1);
1430       pred = insn_data[(int) CODE_FOR_allocate_stack].operand[1].predicate;
1431       if (pred && ! ((*pred) (size, mode)))
1432         size = copy_to_mode_reg (mode, size);
1433
1434       emit_insn (gen_allocate_stack (target, size));
1435     }
1436   else
1437 #endif
1438     {
1439 #ifndef STACK_GROWS_DOWNWARD
1440       emit_move_insn (target, virtual_stack_dynamic_rtx);
1441 #endif
1442       size = convert_modes (Pmode, ptr_mode, size, 1);
1443
1444       /* Check stack bounds if necessary.  */
1445       if (current_function_limit_stack)
1446         {
1447           rtx available;
1448           rtx space_available = gen_label_rtx ();
1449 #ifdef STACK_GROWS_DOWNWARD
1450           available = expand_binop (Pmode, sub_optab, 
1451                                     stack_pointer_rtx, stack_limit_rtx,
1452                                     NULL_RTX, 1, OPTAB_WIDEN);
1453 #else
1454           available = expand_binop (Pmode, sub_optab, 
1455                                     stack_limit_rtx, stack_pointer_rtx,
1456                                     NULL_RTX, 1, OPTAB_WIDEN);
1457 #endif
1458           emit_cmp_and_jump_insns (available, size, GEU, NULL_RTX, Pmode, 1,
1459                                    0, space_available);
1460 #ifdef HAVE_trap
1461           if (HAVE_trap)
1462             emit_insn (gen_trap ());
1463           else
1464 #endif
1465             error ("stack limits not supported on this target");
1466           emit_barrier ();
1467           emit_label (space_available);
1468         }
1469
1470       anti_adjust_stack (size);
1471 #ifdef SETJMP_VIA_SAVE_AREA
1472       if (setjmpless_size != NULL_RTX)
1473         {
1474           rtx note_target = get_last_insn ();
1475
1476           REG_NOTES (note_target)
1477             = gen_rtx_EXPR_LIST (REG_SAVE_AREA, setjmpless_size,
1478                                  REG_NOTES (note_target));
1479         }
1480 #endif /* SETJMP_VIA_SAVE_AREA */
1481 #ifdef STACK_GROWS_DOWNWARD
1482   emit_move_insn (target, virtual_stack_dynamic_rtx);
1483 #endif
1484     }
1485
1486   if (MUST_ALIGN)
1487     {
1488       /* CEIL_DIV_EXPR needs to worry about the addition overflowing,
1489          but we know it can't.  So add ourselves and then do
1490          TRUNC_DIV_EXPR.  */
1491       target = expand_binop (Pmode, add_optab, target,
1492                              GEN_INT (BIGGEST_ALIGNMENT / BITS_PER_UNIT - 1),
1493                              NULL_RTX, 1, OPTAB_LIB_WIDEN);
1494       target = expand_divmod (0, TRUNC_DIV_EXPR, Pmode, target,
1495                               GEN_INT (BIGGEST_ALIGNMENT / BITS_PER_UNIT),
1496                               NULL_RTX, 1);
1497       target = expand_mult (Pmode, target,
1498                             GEN_INT (BIGGEST_ALIGNMENT / BITS_PER_UNIT),
1499                             NULL_RTX, 1);
1500     }
1501   
1502   /* Some systems require a particular insn to refer to the stack
1503      to make the pages exist.  */
1504 #ifdef HAVE_probe
1505   if (HAVE_probe)
1506     emit_insn (gen_probe ());
1507 #endif
1508
1509   /* Record the new stack level for nonlocal gotos.  */
1510   if (nonlocal_goto_handler_slots != 0)
1511     emit_stack_save (SAVE_NONLOCAL, &nonlocal_goto_stack_level, NULL_RTX);
1512
1513   return target;
1514 }
1515 \f
1516 /* A front end may want to override GCC's stack checking by providing a 
1517    run-time routine to call to check the stack, so provide a mechanism for
1518    calling that routine.  */
1519
1520 static rtx stack_check_libfunc;
1521
1522 void
1523 set_stack_check_libfunc (libfunc)
1524      rtx libfunc;
1525 {
1526   stack_check_libfunc = libfunc;
1527 }
1528 \f
1529 /* Emit one stack probe at ADDRESS, an address within the stack.  */
1530
1531 static void
1532 emit_stack_probe (address)
1533      rtx address;
1534 {
1535   rtx memref = gen_rtx_MEM (word_mode, address);
1536
1537   MEM_VOLATILE_P (memref) = 1;
1538
1539   if (STACK_CHECK_PROBE_LOAD)
1540     emit_move_insn (gen_reg_rtx (word_mode), memref);
1541   else
1542     emit_move_insn (memref, const0_rtx);
1543 }
1544
1545 /* Probe a range of stack addresses from FIRST to FIRST+SIZE, inclusive. 
1546    FIRST is a constant and size is a Pmode RTX.  These are offsets from the
1547    current stack pointer.  STACK_GROWS_DOWNWARD says whether to add or
1548    subtract from the stack.  If SIZE is constant, this is done
1549    with a fixed number of probes.  Otherwise, we must make a loop.  */
1550
1551 #ifdef STACK_GROWS_DOWNWARD
1552 #define STACK_GROW_OP MINUS
1553 #else
1554 #define STACK_GROW_OP PLUS
1555 #endif
1556
1557 void
1558 probe_stack_range (first, size)
1559      HOST_WIDE_INT first;
1560      rtx size;
1561 {
1562   /* First see if the front end has set up a function for us to call to
1563      check the stack.  */
1564   if (stack_check_libfunc != 0)
1565     emit_library_call (stack_check_libfunc, 0, VOIDmode, 1,
1566                        memory_address (QImode,
1567                                        gen_rtx (STACK_GROW_OP, Pmode,
1568                                                 stack_pointer_rtx,
1569                                                 plus_constant (size, first))),
1570                        ptr_mode);
1571
1572   /* Next see if we have an insn to check the stack.  Use it if so.  */
1573 #ifdef HAVE_check_stack
1574   else if (HAVE_check_stack)
1575     {
1576       insn_operand_predicate_fn pred;
1577       rtx last_addr
1578         = force_operand (gen_rtx_STACK_GROW_OP (Pmode,
1579                                                 stack_pointer_rtx,
1580                                                 plus_constant (size, first)),
1581                          NULL_RTX);
1582
1583       pred = insn_data[(int) CODE_FOR_check_stack].operand[0].predicate;
1584       if (pred && ! ((*pred) (last_addr, Pmode)))
1585         last_addr = copy_to_mode_reg (Pmode, last_addr);
1586
1587       emit_insn (gen_check_stack (last_addr));
1588     }
1589 #endif
1590
1591   /* If we have to generate explicit probes, see if we have a constant
1592      small number of them to generate.  If so, that's the easy case.  */
1593   else if (GET_CODE (size) == CONST_INT
1594            && INTVAL (size) < 10 * STACK_CHECK_PROBE_INTERVAL)
1595     {
1596       HOST_WIDE_INT offset;
1597
1598       /* Start probing at FIRST + N * STACK_CHECK_PROBE_INTERVAL
1599          for values of N from 1 until it exceeds LAST.  If only one
1600          probe is needed, this will not generate any code.  Then probe
1601          at LAST.  */
1602       for (offset = first + STACK_CHECK_PROBE_INTERVAL;
1603            offset < INTVAL (size);
1604            offset = offset + STACK_CHECK_PROBE_INTERVAL)
1605         emit_stack_probe (gen_rtx_fmt_ee (STACK_GROW_OP, Pmode,
1606                                           stack_pointer_rtx,
1607                                           GEN_INT (offset)));
1608
1609       emit_stack_probe (gen_rtx_fmt_ee (STACK_GROW_OP, Pmode,
1610                                         stack_pointer_rtx,
1611                                         plus_constant (size, first)));
1612     }
1613
1614   /* In the variable case, do the same as above, but in a loop.  We emit loop
1615      notes so that loop optimization can be done.  */
1616   else
1617     {
1618       rtx test_addr
1619         = force_operand (gen_rtx_fmt_ee (STACK_GROW_OP, Pmode,
1620                                          stack_pointer_rtx,
1621                                          GEN_INT (first + STACK_CHECK_PROBE_INTERVAL)),
1622                          NULL_RTX);
1623       rtx last_addr
1624         = force_operand (gen_rtx_fmt_ee (STACK_GROW_OP, Pmode,
1625                                          stack_pointer_rtx,
1626                                          plus_constant (size, first)),
1627                          NULL_RTX);
1628       rtx incr = GEN_INT (STACK_CHECK_PROBE_INTERVAL);
1629       rtx loop_lab = gen_label_rtx ();
1630       rtx test_lab = gen_label_rtx ();
1631       rtx end_lab = gen_label_rtx ();
1632       rtx temp;
1633
1634       if (GET_CODE (test_addr) != REG
1635           || REGNO (test_addr) < FIRST_PSEUDO_REGISTER)
1636         test_addr = force_reg (Pmode, test_addr);
1637
1638       emit_note (NULL_PTR, NOTE_INSN_LOOP_BEG);
1639       emit_jump (test_lab);
1640
1641       emit_label (loop_lab);
1642       emit_stack_probe (test_addr);
1643
1644       emit_note (NULL_PTR, NOTE_INSN_LOOP_CONT);
1645
1646 #ifdef STACK_GROWS_DOWNWARD
1647 #define CMP_OPCODE GTU
1648       temp = expand_binop (Pmode, sub_optab, test_addr, incr, test_addr,
1649                            1, OPTAB_WIDEN);
1650 #else
1651 #define CMP_OPCODE LTU
1652       temp = expand_binop (Pmode, add_optab, test_addr, incr, test_addr,
1653                            1, OPTAB_WIDEN);
1654 #endif
1655
1656       if (temp != test_addr)
1657         abort ();
1658
1659       emit_label (test_lab);
1660       emit_cmp_and_jump_insns (test_addr, last_addr, CMP_OPCODE,
1661                                NULL_RTX, Pmode, 1, 0, loop_lab);
1662       emit_jump (end_lab);
1663       emit_note (NULL_PTR, NOTE_INSN_LOOP_END);
1664       emit_label (end_lab);
1665
1666       emit_stack_probe (last_addr);
1667     }
1668 }
1669 \f
1670 /* Return an rtx representing the register or memory location
1671    in which a scalar value of data type VALTYPE
1672    was returned by a function call to function FUNC.
1673    FUNC is a FUNCTION_DECL node if the precise function is known,
1674    otherwise 0.
1675    OUTGOING is 1 if on a machine with register windows this function
1676    should return the register in which the function will put its result
1677    and 0 otherwise. */
1678
1679 rtx
1680 hard_function_value (valtype, func, outgoing)
1681      tree valtype;
1682      tree func ATTRIBUTE_UNUSED;
1683      int outgoing ATTRIBUTE_UNUSED;
1684 {
1685   rtx val;
1686
1687 #ifdef FUNCTION_OUTGOING_VALUE
1688   if (outgoing)
1689     val = FUNCTION_OUTGOING_VALUE (valtype, func);
1690   else
1691 #endif
1692     val = FUNCTION_VALUE (valtype, func);
1693
1694   if (GET_CODE (val) == REG
1695       && GET_MODE (val) == BLKmode)
1696     {
1697       unsigned HOST_WIDE_INT bytes = int_size_in_bytes (valtype);
1698       enum machine_mode tmpmode;
1699
1700       for (tmpmode = GET_CLASS_NARROWEST_MODE (MODE_INT);
1701            tmpmode != VOIDmode;
1702            tmpmode = GET_MODE_WIDER_MODE (tmpmode))
1703         {
1704           /* Have we found a large enough mode?  */
1705           if (GET_MODE_SIZE (tmpmode) >= bytes)
1706             break;
1707         }
1708
1709       /* No suitable mode found.  */
1710       if (tmpmode == VOIDmode)
1711         abort ();
1712
1713       PUT_MODE (val, tmpmode);
1714     }      
1715   return val;
1716 }
1717
1718 /* Return an rtx representing the register or memory location
1719    in which a scalar value of mode MODE was returned by a library call.  */
1720
1721 rtx
1722 hard_libcall_value (mode)
1723      enum machine_mode mode;
1724 {
1725   return LIBCALL_VALUE (mode);
1726 }
1727
1728 /* Look up the tree code for a given rtx code
1729    to provide the arithmetic operation for REAL_ARITHMETIC.
1730    The function returns an int because the caller may not know
1731    what `enum tree_code' means.  */
1732
1733 int
1734 rtx_to_tree_code (code)
1735      enum rtx_code code;
1736 {
1737   enum tree_code tcode;
1738
1739   switch (code)
1740     {
1741     case PLUS:
1742       tcode = PLUS_EXPR;
1743       break;
1744     case MINUS:
1745       tcode = MINUS_EXPR;
1746       break;
1747     case MULT:
1748       tcode = MULT_EXPR;
1749       break;
1750     case DIV:
1751       tcode = RDIV_EXPR;
1752       break;
1753     case SMIN:
1754       tcode = MIN_EXPR;
1755       break;
1756     case SMAX:
1757       tcode = MAX_EXPR;
1758       break;
1759     default:
1760       tcode = LAST_AND_UNUSED_TREE_CODE;
1761       break;
1762     }
1763   return ((int) tcode);
1764 }