OSDN Git Service

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