OSDN Git Service

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