OSDN Git Service

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