OSDN Git Service

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