OSDN Git Service

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