OSDN Git Service

* simplify-rtx.c (simplify_binary_operation): Revert last change.
[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 GCC.
6
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2, or (at your option) any later
10 version.
11
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15 for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING.  If not, write to the Free
19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
20 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 "optabs.h"
33 #include "hard-reg-set.h"
34 #include "insn-config.h"
35 #include "recog.h"
36
37 static rtx break_out_memory_refs        PARAMS ((rtx));
38 static void emit_stack_probe            PARAMS ((rtx));
39
40
41 /* Truncate and perhaps sign-extend C as appropriate for MODE.  */
42
43 HOST_WIDE_INT
44 trunc_int_for_mode (c, mode)
45      HOST_WIDE_INT c;
46      enum machine_mode mode;
47 {
48   int width = GET_MODE_BITSIZE (mode);
49
50   /* Canonicalize BImode to 0 and STORE_FLAG_VALUE.  */
51   if (mode == BImode)
52     return c & 1 ? STORE_FLAG_VALUE : 0;
53
54   /* Sign-extend for the requested mode.  */
55
56   if (width < HOST_BITS_PER_WIDE_INT)
57     {
58       HOST_WIDE_INT sign = 1;
59       sign <<= width - 1;
60       c &= (sign << 1) - 1;
61       c ^= sign;
62       c -= sign;
63     }
64
65   return c;
66 }
67
68 /* Return an rtx for the sum of X and the integer C.
69
70    This function should be used via the `plus_constant' macro.  */
71
72 rtx
73 plus_constant_wide (x, c)
74      register rtx x;
75      register HOST_WIDE_INT c;
76 {
77   register RTX_CODE code;
78   rtx y;
79   register enum machine_mode mode;
80   register rtx tem;
81   int all_constant = 0;
82
83   if (c == 0)
84     return x;
85
86  restart:
87
88   code = GET_CODE (x);
89   mode = GET_MODE (x);
90   y = x;
91
92   switch (code)
93     {
94     case CONST_INT:
95       return GEN_INT (INTVAL (x) + c);
96
97     case CONST_DOUBLE:
98       {
99         unsigned HOST_WIDE_INT l1 = CONST_DOUBLE_LOW (x);
100         HOST_WIDE_INT h1 = CONST_DOUBLE_HIGH (x);
101         unsigned HOST_WIDE_INT l2 = c;
102         HOST_WIDE_INT h2 = c < 0 ? ~0 : 0;
103         unsigned HOST_WIDE_INT lv;
104         HOST_WIDE_INT hv;
105
106         add_double (l1, h1, l2, h2, &lv, &hv);
107
108         return immed_double_const (lv, hv, VOIDmode);
109       }
110
111     case MEM:
112       /* If this is a reference to the constant pool, try replacing it with
113          a reference to a new constant.  If the resulting address isn't
114          valid, don't return it because we have no way to validize it.  */
115       if (GET_CODE (XEXP (x, 0)) == SYMBOL_REF
116           && CONSTANT_POOL_ADDRESS_P (XEXP (x, 0)))
117         {
118           tem
119             = force_const_mem (GET_MODE (x),
120                                plus_constant (get_pool_constant (XEXP (x, 0)),
121                                               c));
122           if (memory_address_p (GET_MODE (tem), XEXP (tem, 0)))
123             return tem;
124         }
125       break;
126
127     case CONST:
128       /* If adding to something entirely constant, set a flag
129          so that we can add a CONST around the result.  */
130       x = XEXP (x, 0);
131       all_constant = 1;
132       goto restart;
133
134     case SYMBOL_REF:
135     case LABEL_REF:
136       all_constant = 1;
137       break;
138
139     case PLUS:
140       /* The interesting case is adding the integer to a sum.
141          Look for constant term in the sum and combine
142          with C.  For an integer constant term, we make a combined
143          integer.  For a constant term that is not an explicit integer,
144          we cannot really combine, but group them together anyway.  
145
146          Restart or use a recursive call in case the remaining operand is
147          something that we handle specially, such as a SYMBOL_REF.
148
149          We may not immediately return from the recursive call here, lest
150          all_constant gets lost.  */
151
152       if (GET_CODE (XEXP (x, 1)) == CONST_INT)
153         {
154           c += INTVAL (XEXP (x, 1));
155
156           if (GET_MODE (x) != VOIDmode)
157             c = trunc_int_for_mode (c, GET_MODE (x));
158
159           x = XEXP (x, 0);
160           goto restart;
161         }
162       else if (CONSTANT_P (XEXP (x, 1)))
163         {
164           x = gen_rtx_PLUS (mode, XEXP (x, 0), plus_constant (XEXP (x, 1), c));
165           c = 0;
166         }
167       else if (find_constant_term_loc (&y))
168         {
169           /* We need to be careful since X may be shared and we can't
170              modify it in place.  */
171           rtx copy = copy_rtx (x);
172           rtx *const_loc = find_constant_term_loc (&copy);
173
174           *const_loc = plus_constant (*const_loc, c);
175           x = copy;
176           c = 0;
177         }
178       break;
179
180     default:
181       break;
182     }
183
184   if (c != 0)
185     x = gen_rtx_PLUS (mode, x, GEN_INT (c));
186
187   if (GET_CODE (x) == SYMBOL_REF || GET_CODE (x) == LABEL_REF)
188     return x;
189   else if (all_constant)
190     return gen_rtx_CONST (mode, x);
191   else
192     return x;
193 }
194 \f
195 /* If X is a sum, return a new sum like X but lacking any constant terms.
196    Add all the removed constant terms into *CONSTPTR.
197    X itself is not altered.  The result != X if and only if
198    it is not isomorphic to X.  */
199
200 rtx
201 eliminate_constant_term (x, constptr)
202      rtx x;
203      rtx *constptr;
204 {
205   register rtx x0, x1;
206   rtx tem;
207
208   if (GET_CODE (x) != PLUS)
209     return x;
210
211   /* First handle constants appearing at this level explicitly.  */
212   if (GET_CODE (XEXP (x, 1)) == CONST_INT
213       && 0 != (tem = simplify_binary_operation (PLUS, GET_MODE (x), *constptr,
214                                                 XEXP (x, 1)))
215       && GET_CODE (tem) == CONST_INT)
216     {
217       *constptr = tem;
218       return eliminate_constant_term (XEXP (x, 0), constptr);
219     }
220
221   tem = const0_rtx;
222   x0 = eliminate_constant_term (XEXP (x, 0), &tem);
223   x1 = eliminate_constant_term (XEXP (x, 1), &tem);
224   if ((x1 != XEXP (x, 1) || x0 != XEXP (x, 0))
225       && 0 != (tem = simplify_binary_operation (PLUS, GET_MODE (x),
226                                                 *constptr, tem))
227       && GET_CODE (tem) == CONST_INT)
228     {
229       *constptr = tem;
230       return gen_rtx_PLUS (GET_MODE (x), x0, x1);
231     }
232
233   return x;
234 }
235
236 /* Returns the insn that next references REG after INSN, or 0
237    if REG is clobbered before next referenced or we cannot find
238    an insn that references REG in a straight-line piece of code.  */
239
240 rtx
241 find_next_ref (reg, insn)
242      rtx reg;
243      rtx insn;
244 {
245   rtx next;
246
247   for (insn = NEXT_INSN (insn); insn; insn = next)
248     {
249       next = NEXT_INSN (insn);
250       if (GET_CODE (insn) == NOTE)
251         continue;
252       if (GET_CODE (insn) == CODE_LABEL
253           || GET_CODE (insn) == BARRIER)
254         return 0;
255       if (GET_CODE (insn) == INSN
256           || GET_CODE (insn) == JUMP_INSN
257           || GET_CODE (insn) == CALL_INSN)
258         {
259           if (reg_set_p (reg, insn))
260             return 0;
261           if (reg_mentioned_p (reg, PATTERN (insn)))
262             return insn;
263           if (GET_CODE (insn) == JUMP_INSN)
264             {
265               if (any_uncondjump_p (insn))
266                 next = JUMP_LABEL (insn);
267               else
268                 return 0;
269             }
270           if (GET_CODE (insn) == CALL_INSN
271               && REGNO (reg) < FIRST_PSEUDO_REGISTER
272               && call_used_regs[REGNO (reg)])
273             return 0;
274         }
275       else
276         abort ();
277     }
278   return 0;
279 }
280
281 /* Return an rtx for the size in bytes of the value of EXP.  */
282
283 rtx
284 expr_size (exp)
285      tree exp;
286 {
287   tree size;
288
289   if (TREE_CODE_CLASS (TREE_CODE (exp)) == 'd'
290       && DECL_SIZE_UNIT (exp) != 0)
291     size = DECL_SIZE_UNIT (exp);
292   else
293     size = size_in_bytes (TREE_TYPE (exp));
294
295   if (TREE_CODE (size) != INTEGER_CST
296       && contains_placeholder_p (size))
297     size = build (WITH_RECORD_EXPR, sizetype, size, exp);
298
299   return expand_expr (size, NULL_RTX, TYPE_MODE (sizetype),
300                       EXPAND_MEMORY_USE_BAD);
301 }
302 \f
303 /* Return a copy of X in which all memory references
304    and all constants that involve symbol refs
305    have been replaced with new temporary registers.
306    Also emit code to load the memory locations and constants
307    into those registers.
308
309    If X contains no such constants or memory references,
310    X itself (not a copy) is returned.
311
312    If a constant is found in the address that is not a legitimate constant
313    in an insn, it is left alone in the hope that it might be valid in the
314    address.
315
316    X may contain no arithmetic except addition, subtraction and multiplication.
317    Values returned by expand_expr with 1 for sum_ok fit this constraint.  */
318
319 static rtx
320 break_out_memory_refs (x)
321      register rtx x;
322 {
323   if (GET_CODE (x) == MEM
324       || (CONSTANT_P (x) && CONSTANT_ADDRESS_P (x)
325           && GET_MODE (x) != VOIDmode))
326     x = force_reg (GET_MODE (x), x);
327   else if (GET_CODE (x) == PLUS || GET_CODE (x) == MINUS
328            || GET_CODE (x) == MULT)
329     {
330       register rtx op0 = break_out_memory_refs (XEXP (x, 0));
331       register rtx op1 = break_out_memory_refs (XEXP (x, 1));
332
333       if (op0 != XEXP (x, 0) || op1 != XEXP (x, 1))
334         x = gen_rtx_fmt_ee (GET_CODE (x), Pmode, op0, op1);
335     }
336
337   return x;
338 }
339
340 #ifdef POINTERS_EXTEND_UNSIGNED
341
342 /* Given X, a memory address in ptr_mode, convert it to an address
343    in Pmode, or vice versa (TO_MODE says which way).  We take advantage of
344    the fact that pointers are not allowed to overflow by commuting arithmetic
345    operations over conversions so that address arithmetic insns can be
346    used.  */
347
348 rtx
349 convert_memory_address (to_mode, x)
350      enum machine_mode to_mode;
351      rtx x;
352 {
353   enum machine_mode from_mode = to_mode == ptr_mode ? Pmode : ptr_mode;
354   rtx temp;
355
356   /* Here we handle some special cases.  If none of them apply, fall through
357      to the default case.  */
358   switch (GET_CODE (x))
359     {
360     case CONST_INT:
361     case CONST_DOUBLE:
362       return x;
363
364     case SUBREG:
365       if (POINTERS_EXTEND_UNSIGNED >= 0
366           && GET_MODE (SUBREG_REG (x)) == to_mode)
367         return SUBREG_REG (x);
368       break;
369
370     case LABEL_REF:
371       if (POINTERS_EXTEND_UNSIGNED >= 0)
372         {
373           temp = gen_rtx_LABEL_REF (to_mode, XEXP (x, 0));
374           LABEL_REF_NONLOCAL_P (temp) = LABEL_REF_NONLOCAL_P (x);
375           return temp;
376         }
377       break;
378
379     case SYMBOL_REF:
380       if (POINTERS_EXTEND_UNSIGNED >= 0)
381         {
382           temp = gen_rtx_SYMBOL_REF (to_mode, XSTR (x, 0));
383           SYMBOL_REF_FLAG (temp) = SYMBOL_REF_FLAG (x);
384           CONSTANT_POOL_ADDRESS_P (temp) = CONSTANT_POOL_ADDRESS_P (x);
385           STRING_POOL_ADDRESS_P (temp) = STRING_POOL_ADDRESS_P (x);
386           return temp;
387         }
388       break;
389
390     case CONST:
391       if (POINTERS_EXTEND_UNSIGNED >= 0)
392         return gen_rtx_CONST (to_mode, 
393                               convert_memory_address (to_mode, XEXP (x, 0)));
394       break;
395
396     case PLUS:
397     case MULT:
398       /* For addition the second operand is a small constant, we can safely
399          permute the conversion and addition operation.  We can always safely
400          permute them if we are making the address narrower.  In addition,
401          always permute the operations if this is a constant.  */
402       if (POINTERS_EXTEND_UNSIGNED >= 0
403           && (GET_MODE_SIZE (to_mode) < GET_MODE_SIZE (from_mode)
404               || (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 1)) == CONST_INT
405                   && (INTVAL (XEXP (x, 1)) + 20000 < 40000
406                       || CONSTANT_P (XEXP (x, 0))))))
407         return gen_rtx_fmt_ee (GET_CODE (x), to_mode, 
408                                convert_memory_address (to_mode, XEXP (x, 0)),
409                                convert_memory_address (to_mode, XEXP (x, 1)));
410       break;
411       
412     default:
413       break;
414     }
415
416   return convert_modes (to_mode, from_mode,
417                         x, POINTERS_EXTEND_UNSIGNED);
418 }
419 #endif
420
421 /* Given a memory address or facsimile X, construct a new address,
422    currently equivalent, that is stable: future stores won't change it.
423
424    X must be composed of constants, register and memory references
425    combined with addition, subtraction and multiplication:
426    in other words, just what you can get from expand_expr if sum_ok is 1.
427
428    Works by making copies of all regs and memory locations used
429    by X and combining them the same way X does.
430    You could also stabilize the reference to this address
431    by copying the address to a register with copy_to_reg;
432    but then you wouldn't get indexed addressing in the reference.  */
433
434 rtx
435 copy_all_regs (x)
436      register rtx x;
437 {
438   if (GET_CODE (x) == REG)
439     {
440       if (REGNO (x) != FRAME_POINTER_REGNUM
441 #if HARD_FRAME_POINTER_REGNUM != FRAME_POINTER_REGNUM
442           && REGNO (x) != HARD_FRAME_POINTER_REGNUM
443 #endif
444           )
445         x = copy_to_reg (x);
446     }
447   else if (GET_CODE (x) == MEM)
448     x = copy_to_reg (x);
449   else if (GET_CODE (x) == PLUS || GET_CODE (x) == MINUS
450            || GET_CODE (x) == MULT)
451     {
452       register rtx op0 = copy_all_regs (XEXP (x, 0));
453       register rtx op1 = copy_all_regs (XEXP (x, 1));
454       if (op0 != XEXP (x, 0) || op1 != XEXP (x, 1))
455         x = gen_rtx_fmt_ee (GET_CODE (x), Pmode, op0, op1);
456     }
457   return x;
458 }
459 \f
460 /* Return something equivalent to X but valid as a memory address
461    for something of mode MODE.  When X is not itself valid, this
462    works by copying X or subexpressions of it into registers.  */
463
464 rtx
465 memory_address (mode, x)
466      enum machine_mode mode;
467      register rtx x;
468 {
469   register rtx oldx = x;
470
471   if (GET_CODE (x) == ADDRESSOF)
472     return x;
473
474 #ifdef POINTERS_EXTEND_UNSIGNED
475   if (GET_MODE (x) == ptr_mode)
476     x = convert_memory_address (Pmode, x);
477 #endif
478
479   /* By passing constant addresses thru registers
480      we get a chance to cse them.  */
481   if (! cse_not_expected && CONSTANT_P (x) && CONSTANT_ADDRESS_P (x))
482     x = force_reg (Pmode, x);
483
484   /* Accept a QUEUED that refers to a REG
485      even though that isn't a valid address.
486      On attempting to put this in an insn we will call protect_from_queue
487      which will turn it into a REG, which is valid.  */
488   else if (GET_CODE (x) == QUEUED
489       && GET_CODE (QUEUED_VAR (x)) == REG)
490     ;
491
492   /* We get better cse by rejecting indirect addressing at this stage.
493      Let the combiner create indirect addresses where appropriate.
494      For now, generate the code so that the subexpressions useful to share
495      are visible.  But not if cse won't be done!  */
496   else
497     {
498       if (! cse_not_expected && GET_CODE (x) != REG)
499         x = break_out_memory_refs (x);
500
501       /* At this point, any valid address is accepted.  */
502       GO_IF_LEGITIMATE_ADDRESS (mode, x, win);
503
504       /* If it was valid before but breaking out memory refs invalidated it,
505          use it the old way.  */
506       if (memory_address_p (mode, oldx))
507         goto win2;
508
509       /* Perform machine-dependent transformations on X
510          in certain cases.  This is not necessary since the code
511          below can handle all possible cases, but machine-dependent
512          transformations can make better code.  */
513       LEGITIMIZE_ADDRESS (x, oldx, mode, win);
514
515       /* PLUS and MULT can appear in special ways
516          as the result of attempts to make an address usable for indexing.
517          Usually they are dealt with by calling force_operand, below.
518          But a sum containing constant terms is special
519          if removing them makes the sum a valid address:
520          then we generate that address in a register
521          and index off of it.  We do this because it often makes
522          shorter code, and because the addresses thus generated
523          in registers often become common subexpressions.  */
524       if (GET_CODE (x) == PLUS)
525         {
526           rtx constant_term = const0_rtx;
527           rtx y = eliminate_constant_term (x, &constant_term);
528           if (constant_term == const0_rtx
529               || ! memory_address_p (mode, y))
530             x = force_operand (x, NULL_RTX);
531           else
532             {
533               y = gen_rtx_PLUS (GET_MODE (x), copy_to_reg (y), constant_term);
534               if (! memory_address_p (mode, y))
535                 x = force_operand (x, NULL_RTX);
536               else
537                 x = y;
538             }
539         }
540
541       else if (GET_CODE (x) == MULT || GET_CODE (x) == MINUS)
542         x = force_operand (x, NULL_RTX);
543
544       /* If we have a register that's an invalid address,
545          it must be a hard reg of the wrong class.  Copy it to a pseudo.  */
546       else if (GET_CODE (x) == REG)
547         x = copy_to_reg (x);
548
549       /* Last resort: copy the value to a register, since
550          the register is a valid address.  */
551       else
552         x = force_reg (Pmode, x);
553
554       goto done;
555
556     win2:
557       x = oldx;
558     win:
559       if (flag_force_addr && ! cse_not_expected && GET_CODE (x) != REG
560           /* Don't copy an addr via a reg if it is one of our stack slots.  */
561           && ! (GET_CODE (x) == PLUS
562                 && (XEXP (x, 0) == virtual_stack_vars_rtx
563                     || XEXP (x, 0) == virtual_incoming_args_rtx)))
564         {
565           if (general_operand (x, Pmode))
566             x = force_reg (Pmode, x);
567           else
568             x = force_operand (x, NULL_RTX);
569         }
570     }
571
572  done:
573
574   /* If we didn't change the address, we are done.  Otherwise, mark
575      a reg as a pointer if we have REG or REG + CONST_INT.  */
576   if (oldx == x)
577     return x;
578   else if (GET_CODE (x) == REG)
579     mark_reg_pointer (x, BITS_PER_UNIT);
580   else if (GET_CODE (x) == PLUS
581            && GET_CODE (XEXP (x, 0)) == REG
582            && GET_CODE (XEXP (x, 1)) == CONST_INT)
583     mark_reg_pointer (XEXP (x, 0), BITS_PER_UNIT);
584
585   /* OLDX may have been the address on a temporary.  Update the address
586      to indicate that X is now used.  */
587   update_temp_slot_address (oldx, x);
588
589   return x;
590 }
591
592 /* Like `memory_address' but pretend `flag_force_addr' is 0.  */
593
594 rtx
595 memory_address_noforce (mode, x)
596      enum machine_mode mode;
597      rtx x;
598 {
599   int ambient_force_addr = flag_force_addr;
600   rtx val;
601
602   flag_force_addr = 0;
603   val = memory_address (mode, x);
604   flag_force_addr = ambient_force_addr;
605   return val;
606 }
607
608 /* Convert a mem ref into one with a valid memory address.
609    Pass through anything else unchanged.  */
610
611 rtx
612 validize_mem (ref)
613      rtx ref;
614 {
615   if (GET_CODE (ref) != MEM)
616     return ref;
617   if (! (flag_force_addr && CONSTANT_ADDRESS_P (XEXP (ref, 0)))
618       && memory_address_p (GET_MODE (ref), XEXP (ref, 0)))
619     return ref;
620
621   /* Don't alter REF itself, since that is probably a stack slot.  */
622   return replace_equiv_address (ref, XEXP (ref, 0));
623 }
624 \f
625 /* Given REF, either a MEM or a REG, and T, either the type of X or
626    the expression corresponding to REF, set RTX_UNCHANGING_P if
627    appropriate.  */
628
629 void
630 maybe_set_unchanging (ref, t)
631      rtx ref;
632      tree t;
633 {
634   /* We can set RTX_UNCHANGING_P from TREE_READONLY for decls whose
635      initialization is only executed once, or whose initializer always
636      has the same value.  Currently we simplify this to PARM_DECLs in the
637      first case, and decls with TREE_CONSTANT initializers in the second.  */
638   if ((TREE_READONLY (t) && DECL_P (t)
639        && (TREE_CODE (t) == PARM_DECL
640            || DECL_INITIAL (t) == NULL_TREE
641            || TREE_CONSTANT (DECL_INITIAL (t))))
642       || TREE_CODE_CLASS (TREE_CODE (t)) == 'c')
643     RTX_UNCHANGING_P (ref) = 1;
644 }
645
646 /* Given REF, a MEM, and T, either the type of X or the expression
647    corresponding to REF, set the memory attributes.  OBJECTP is nonzero
648    if we are making a new object of this type.  */
649
650 void
651 set_mem_attributes (ref, t, objectp)
652      rtx ref;
653      tree t;
654      int objectp;
655 {
656   tree type;
657
658   /* It can happen that type_for_mode was given a mode for which there
659      is no language-level type.  In which case it returns NULL, which
660      we can see here.  */
661   if (t == NULL_TREE)
662     return;
663
664   type = TYPE_P (t) ? t : TREE_TYPE (t);
665
666   /* Get the alias set from the expression or type (perhaps using a
667      front-end routine) and then copy bits from the type.  */
668
669   /* It is incorrect to set RTX_UNCHANGING_P from TREE_READONLY (type)
670      here, because, in C and C++, the fact that a location is accessed
671      through a const expression does not mean that the value there can
672      never change.  */
673
674   /* If we have already set DECL_RTL = ref, get_alias_set will get the
675      wrong answer, as it assumes that DECL_RTL already has the right alias
676      info.  Callers should not set DECL_RTL until after the call to
677      set_mem_attributes.  */
678   if (DECL_P (t) && ref == DECL_RTL_IF_SET (t))
679     abort ();
680
681   set_mem_alias_set (ref, get_alias_set (t));
682
683   MEM_VOLATILE_P (ref) = TYPE_VOLATILE (type);
684   MEM_IN_STRUCT_P (ref) = AGGREGATE_TYPE_P (type);
685
686   /* If we are making an object of this type, we know that it is a scalar if
687      the type is not an aggregate.  */
688   if (objectp && ! AGGREGATE_TYPE_P (type))
689     MEM_SCALAR_P (ref) = 1;
690
691   /* If T is a type, this is all we can do.  Otherwise, we may be able
692      to deduce some more information about the expression.  */
693   if (TYPE_P (t))
694     return;
695
696   maybe_set_unchanging (ref, t);
697   if (TREE_THIS_VOLATILE (t))
698     MEM_VOLATILE_P (ref) = 1;
699
700   /* Now see if we can say more about whether it's an aggregate or
701      scalar.  If we already know it's an aggregate, don't bother.  */
702   if (MEM_IN_STRUCT_P (ref))
703     return;
704
705   /* Now remove any NOPs: they don't change what the underlying object is.
706      Likewise for SAVE_EXPR.  */
707   while (TREE_CODE (t) == NOP_EXPR || TREE_CODE (t) == CONVERT_EXPR
708          || TREE_CODE (t) == NON_LVALUE_EXPR || TREE_CODE (t) == SAVE_EXPR)
709     t = TREE_OPERAND (t, 0);
710
711   /* Since we already know the type isn't an aggregate, if this is a decl,
712      it must be a scalar.  Or if it is a reference into an aggregate,
713      this is part of an aggregate.   Otherwise we don't know.  */
714   if (DECL_P (t))
715     MEM_SCALAR_P (ref) = 1;
716   else if (TREE_CODE (t) == COMPONENT_REF || TREE_CODE (t) == ARRAY_REF
717            || TREE_CODE (t) == ARRAY_RANGE_REF
718            || TREE_CODE (t) == BIT_FIELD_REF)
719     MEM_IN_STRUCT_P (ref) = 1;
720 }
721 \f
722 /* Return a modified copy of X with its memory address copied
723    into a temporary register to protect it from side effects.
724    If X is not a MEM, it is returned unchanged (and not copied).
725    Perhaps even if it is a MEM, if there is no need to change it.  */
726
727 rtx
728 stabilize (x)
729      rtx x;
730 {
731
732   if (GET_CODE (x) != MEM
733       || ! rtx_unstable_p (XEXP (x, 0)))
734     return x;
735
736   return
737     replace_equiv_address (x, force_reg (Pmode, copy_all_regs (XEXP (x, 0))));
738 }
739 \f
740 /* Copy the value or contents of X to a new temp reg and return that reg.  */
741
742 rtx
743 copy_to_reg (x)
744      rtx x;
745 {
746   register rtx temp = gen_reg_rtx (GET_MODE (x));
747  
748   /* If not an operand, must be an address with PLUS and MULT so
749      do the computation.  */ 
750   if (! general_operand (x, VOIDmode))
751     x = force_operand (x, temp);
752   
753   if (x != temp)
754     emit_move_insn (temp, x);
755
756   return temp;
757 }
758
759 /* Like copy_to_reg but always give the new register mode Pmode
760    in case X is a constant.  */
761
762 rtx
763 copy_addr_to_reg (x)
764      rtx x;
765 {
766   return copy_to_mode_reg (Pmode, x);
767 }
768
769 /* Like copy_to_reg but always give the new register mode MODE
770    in case X is a constant.  */
771
772 rtx
773 copy_to_mode_reg (mode, x)
774      enum machine_mode mode;
775      rtx x;
776 {
777   register rtx temp = gen_reg_rtx (mode);
778   
779   /* If not an operand, must be an address with PLUS and MULT so
780      do the computation.  */ 
781   if (! general_operand (x, VOIDmode))
782     x = force_operand (x, temp);
783
784   if (GET_MODE (x) != mode && GET_MODE (x) != VOIDmode)
785     abort ();
786   if (x != temp)
787     emit_move_insn (temp, x);
788   return temp;
789 }
790
791 /* Load X into a register if it is not already one.
792    Use mode MODE for the register.
793    X should be valid for mode MODE, but it may be a constant which
794    is valid for all integer modes; that's why caller must specify MODE.
795
796    The caller must not alter the value in the register we return,
797    since we mark it as a "constant" register.  */
798
799 rtx
800 force_reg (mode, x)
801      enum machine_mode mode;
802      rtx x;
803 {
804   register rtx temp, insn, set;
805
806   if (GET_CODE (x) == REG)
807     return x;
808   
809   temp = gen_reg_rtx (mode);
810   
811   if (! general_operand (x, mode))
812     x = force_operand (x, NULL_RTX);
813   
814   insn = emit_move_insn (temp, x);
815
816   /* Let optimizers know that TEMP's value never changes
817      and that X can be substituted for it.  Don't get confused
818      if INSN set something else (such as a SUBREG of TEMP).  */
819   if (CONSTANT_P (x)
820       && (set = single_set (insn)) != 0
821       && SET_DEST (set) == temp)
822     {
823       rtx note = find_reg_note (insn, REG_EQUAL, NULL_RTX);
824
825       if (note)
826         XEXP (note, 0) = x;
827       else
828         REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_EQUAL, x, REG_NOTES (insn));
829     }
830   return temp;
831 }
832
833 /* If X is a memory ref, copy its contents to a new temp reg and return
834    that reg.  Otherwise, return X.  */
835
836 rtx
837 force_not_mem (x)
838      rtx x;
839 {
840   register rtx temp;
841
842   if (GET_CODE (x) != MEM || GET_MODE (x) == BLKmode)
843     return x;
844
845   temp = gen_reg_rtx (GET_MODE (x));
846   emit_move_insn (temp, x);
847   return temp;
848 }
849
850 /* Copy X to TARGET (if it's nonzero and a reg)
851    or to a new temp reg and return that reg.
852    MODE is the mode to use for X in case it is a constant.  */
853
854 rtx
855 copy_to_suggested_reg (x, target, mode)
856      rtx x, target;
857      enum machine_mode mode;
858 {
859   register rtx temp;
860
861   if (target && GET_CODE (target) == REG)
862     temp = target;
863   else
864     temp = gen_reg_rtx (mode);
865
866   emit_move_insn (temp, x);
867   return temp;
868 }
869 \f
870 /* Return the mode to use to store a scalar of TYPE and MODE.
871    PUNSIGNEDP points to the signedness of the type and may be adjusted
872    to show what signedness to use on extension operations.
873
874    FOR_CALL is non-zero if this call is promoting args for a call.  */
875
876 enum machine_mode
877 promote_mode (type, mode, punsignedp, for_call)
878      tree type;
879      enum machine_mode mode;
880      int *punsignedp;
881      int for_call ATTRIBUTE_UNUSED;
882 {
883   enum tree_code code = TREE_CODE (type);
884   int unsignedp = *punsignedp;
885
886 #ifdef PROMOTE_FOR_CALL_ONLY
887   if (! for_call)
888     return mode;
889 #endif
890
891   switch (code)
892     {
893 #ifdef PROMOTE_MODE
894     case INTEGER_TYPE:   case ENUMERAL_TYPE:   case BOOLEAN_TYPE:
895     case CHAR_TYPE:      case REAL_TYPE:       case OFFSET_TYPE:
896       PROMOTE_MODE (mode, unsignedp, type);
897       break;
898 #endif
899
900 #ifdef POINTERS_EXTEND_UNSIGNED
901     case REFERENCE_TYPE:
902     case POINTER_TYPE:
903       mode = Pmode;
904       unsignedp = POINTERS_EXTEND_UNSIGNED;
905       break;
906 #endif
907       
908     default:
909       break;
910     }
911
912   *punsignedp = unsignedp;
913   return mode;
914 }
915 \f
916 /* Adjust the stack pointer by ADJUST (an rtx for a number of bytes).
917    This pops when ADJUST is positive.  ADJUST need not be constant.  */
918
919 void
920 adjust_stack (adjust)
921      rtx adjust;
922 {
923   rtx temp;
924   adjust = protect_from_queue (adjust, 0);
925
926   if (adjust == const0_rtx)
927     return;
928
929   /* We expect all variable sized adjustments to be multiple of
930      PREFERRED_STACK_BOUNDARY.  */
931   if (GET_CODE (adjust) == CONST_INT)
932     stack_pointer_delta -= INTVAL (adjust);
933
934   temp = expand_binop (Pmode,
935 #ifdef STACK_GROWS_DOWNWARD
936                        add_optab,
937 #else
938                        sub_optab,
939 #endif
940                        stack_pointer_rtx, adjust, stack_pointer_rtx, 0,
941                        OPTAB_LIB_WIDEN);
942
943   if (temp != stack_pointer_rtx)
944     emit_move_insn (stack_pointer_rtx, temp);
945 }
946
947 /* Adjust the stack pointer by minus ADJUST (an rtx for a number of bytes).
948    This pushes when ADJUST is positive.  ADJUST need not be constant.  */
949
950 void
951 anti_adjust_stack (adjust)
952      rtx adjust;
953 {
954   rtx temp;
955   adjust = protect_from_queue (adjust, 0);
956
957   if (adjust == const0_rtx)
958     return;
959
960   /* We expect all variable sized adjustments to be multiple of
961      PREFERRED_STACK_BOUNDARY.  */
962   if (GET_CODE (adjust) == CONST_INT)
963     stack_pointer_delta += INTVAL (adjust);
964
965   temp = expand_binop (Pmode,
966 #ifdef STACK_GROWS_DOWNWARD
967                        sub_optab,
968 #else
969                        add_optab,
970 #endif
971                        stack_pointer_rtx, adjust, stack_pointer_rtx, 0,
972                        OPTAB_LIB_WIDEN);
973
974   if (temp != stack_pointer_rtx)
975     emit_move_insn (stack_pointer_rtx, temp);
976 }
977
978 /* Round the size of a block to be pushed up to the boundary required
979    by this machine.  SIZE is the desired size, which need not be constant.  */
980
981 rtx
982 round_push (size)
983      rtx size;
984 {
985   int align = PREFERRED_STACK_BOUNDARY / BITS_PER_UNIT;
986   if (align == 1)
987     return size;
988   if (GET_CODE (size) == CONST_INT)
989     {
990       int new = (INTVAL (size) + align - 1) / align * align;
991       if (INTVAL (size) != new)
992         size = GEN_INT (new);
993     }
994   else
995     {
996       /* CEIL_DIV_EXPR needs to worry about the addition overflowing,
997          but we know it can't.  So add ourselves and then do
998          TRUNC_DIV_EXPR.  */
999       size = expand_binop (Pmode, add_optab, size, GEN_INT (align - 1),
1000                            NULL_RTX, 1, OPTAB_LIB_WIDEN);
1001       size = expand_divmod (0, TRUNC_DIV_EXPR, Pmode, size, GEN_INT (align),
1002                             NULL_RTX, 1);
1003       size = expand_mult (Pmode, size, GEN_INT (align), NULL_RTX, 1);
1004     }
1005   return size;
1006 }
1007 \f
1008 /* Save the stack pointer for the purpose in SAVE_LEVEL.  PSAVE is a pointer
1009    to a previously-created save area.  If no save area has been allocated,
1010    this function will allocate one.  If a save area is specified, it
1011    must be of the proper mode.
1012
1013    The insns are emitted after insn AFTER, if nonzero, otherwise the insns
1014    are emitted at the current position.  */
1015
1016 void
1017 emit_stack_save (save_level, psave, after)
1018      enum save_level save_level;
1019      rtx *psave;
1020      rtx after;
1021 {
1022   rtx sa = *psave;
1023   /* The default is that we use a move insn and save in a Pmode object.  */
1024   rtx (*fcn) PARAMS ((rtx, rtx)) = gen_move_insn;
1025   enum machine_mode mode = STACK_SAVEAREA_MODE (save_level);
1026
1027   /* See if this machine has anything special to do for this kind of save.  */
1028   switch (save_level)
1029     {
1030 #ifdef HAVE_save_stack_block
1031     case SAVE_BLOCK:
1032       if (HAVE_save_stack_block)
1033         fcn = gen_save_stack_block;
1034       break;
1035 #endif
1036 #ifdef HAVE_save_stack_function
1037     case SAVE_FUNCTION:
1038       if (HAVE_save_stack_function)
1039         fcn = gen_save_stack_function;
1040       break;
1041 #endif
1042 #ifdef HAVE_save_stack_nonlocal
1043     case SAVE_NONLOCAL:
1044       if (HAVE_save_stack_nonlocal)
1045         fcn = gen_save_stack_nonlocal;
1046       break;
1047 #endif
1048     default:
1049       break;
1050     }
1051
1052   /* If there is no save area and we have to allocate one, do so.  Otherwise
1053      verify the save area is the proper mode.  */
1054
1055   if (sa == 0)
1056     {
1057       if (mode != VOIDmode)
1058         {
1059           if (save_level == SAVE_NONLOCAL)
1060             *psave = sa = assign_stack_local (mode, GET_MODE_SIZE (mode), 0);
1061           else
1062             *psave = sa = gen_reg_rtx (mode);
1063         }
1064     }
1065   else
1066     {
1067       if (mode == VOIDmode || GET_MODE (sa) != mode)
1068         abort ();
1069     }
1070
1071   if (after)
1072     {
1073       rtx seq;
1074
1075       start_sequence ();
1076       /* We must validize inside the sequence, to ensure that any instructions
1077          created by the validize call also get moved to the right place.  */
1078       if (sa != 0)
1079         sa = validize_mem (sa);
1080       emit_insn (fcn (sa, stack_pointer_rtx));
1081       seq = gen_sequence ();
1082       end_sequence ();
1083       emit_insn_after (seq, after);
1084     }
1085   else
1086     {
1087       if (sa != 0)
1088         sa = validize_mem (sa);
1089       emit_insn (fcn (sa, stack_pointer_rtx));
1090     }
1091 }
1092
1093 /* Restore the stack pointer for the purpose in SAVE_LEVEL.  SA is the save
1094    area made by emit_stack_save.  If it is zero, we have nothing to do. 
1095
1096    Put any emitted insns after insn AFTER, if nonzero, otherwise at 
1097    current position.  */
1098
1099 void
1100 emit_stack_restore (save_level, sa, after)
1101      enum save_level save_level;
1102      rtx after;
1103      rtx sa;
1104 {
1105   /* The default is that we use a move insn.  */
1106   rtx (*fcn) PARAMS ((rtx, rtx)) = gen_move_insn;
1107
1108   /* See if this machine has anything special to do for this kind of save.  */
1109   switch (save_level)
1110     {
1111 #ifdef HAVE_restore_stack_block
1112     case SAVE_BLOCK:
1113       if (HAVE_restore_stack_block)
1114         fcn = gen_restore_stack_block;
1115       break;
1116 #endif
1117 #ifdef HAVE_restore_stack_function
1118     case SAVE_FUNCTION:
1119       if (HAVE_restore_stack_function)
1120         fcn = gen_restore_stack_function;
1121       break;
1122 #endif
1123 #ifdef HAVE_restore_stack_nonlocal
1124     case SAVE_NONLOCAL:
1125       if (HAVE_restore_stack_nonlocal)
1126         fcn = gen_restore_stack_nonlocal;
1127       break;
1128 #endif
1129     default:
1130       break;
1131     }
1132
1133   if (sa != 0)
1134     sa = validize_mem (sa);
1135
1136   if (after)
1137     {
1138       rtx seq;
1139
1140       start_sequence ();
1141       emit_insn (fcn (stack_pointer_rtx, sa));
1142       seq = gen_sequence ();
1143       end_sequence ();
1144       emit_insn_after (seq, after);
1145     }
1146   else
1147     emit_insn (fcn (stack_pointer_rtx, sa));
1148 }
1149 \f
1150 #ifdef SETJMP_VIA_SAVE_AREA
1151 /* Optimize RTL generated by allocate_dynamic_stack_space for targets
1152    where SETJMP_VIA_SAVE_AREA is true.  The problem is that on these
1153    platforms, the dynamic stack space used can corrupt the original
1154    frame, thus causing a crash if a longjmp unwinds to it.  */
1155
1156 void
1157 optimize_save_area_alloca (insns)
1158      rtx insns;
1159 {
1160   rtx insn;
1161
1162   for (insn = insns; insn; insn = NEXT_INSN(insn))
1163     {
1164       rtx note;
1165
1166       if (GET_CODE (insn) != INSN)
1167         continue;
1168
1169       for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1170         {
1171           if (REG_NOTE_KIND (note) != REG_SAVE_AREA)
1172             continue;
1173
1174           if (!current_function_calls_setjmp)
1175             {
1176               rtx pat = PATTERN (insn);
1177
1178               /* If we do not see the note in a pattern matching
1179                  these precise characteristics, we did something
1180                  entirely wrong in allocate_dynamic_stack_space. 
1181
1182                  Note, one way this could happen is if SETJMP_VIA_SAVE_AREA
1183                  was defined on a machine where stacks grow towards higher
1184                  addresses.
1185
1186                  Right now only supported port with stack that grow upward
1187                  is the HPPA and it does not define SETJMP_VIA_SAVE_AREA.  */
1188               if (GET_CODE (pat) != SET
1189                   || SET_DEST (pat) != stack_pointer_rtx
1190                   || GET_CODE (SET_SRC (pat)) != MINUS
1191                   || XEXP (SET_SRC (pat), 0) != stack_pointer_rtx)
1192                 abort ();
1193
1194               /* This will now be transformed into a (set REG REG)
1195                  so we can just blow away all the other notes.  */
1196               XEXP (SET_SRC (pat), 1) = XEXP (note, 0);
1197               REG_NOTES (insn) = NULL_RTX;
1198             }
1199           else
1200             {
1201               /* setjmp was called, we must remove the REG_SAVE_AREA
1202                  note so that later passes do not get confused by its
1203                  presence.  */
1204               if (note == REG_NOTES (insn))
1205                 {
1206                   REG_NOTES (insn) = XEXP (note, 1);
1207                 }
1208               else
1209                 {
1210                   rtx srch;
1211
1212                   for (srch = REG_NOTES (insn); srch; srch = XEXP (srch, 1))
1213                     if (XEXP (srch, 1) == note)
1214                       break;
1215
1216                   if (srch == NULL_RTX)
1217                     abort();
1218
1219                   XEXP (srch, 1) = XEXP (note, 1);
1220                 }
1221             }
1222           /* Once we've seen the note of interest, we need not look at
1223              the rest of them.  */
1224           break;
1225         }
1226     }
1227 }
1228 #endif /* SETJMP_VIA_SAVE_AREA */
1229
1230 /* Return an rtx representing the address of an area of memory dynamically
1231    pushed on the stack.  This region of memory is always aligned to
1232    a multiple of BIGGEST_ALIGNMENT.
1233
1234    Any required stack pointer alignment is preserved.
1235
1236    SIZE is an rtx representing the size of the area.
1237    TARGET is a place in which the address can be placed.
1238
1239    KNOWN_ALIGN is the alignment (in bits) that we know SIZE has.  */
1240
1241 rtx
1242 allocate_dynamic_stack_space (size, target, known_align)
1243      rtx size;
1244      rtx target;
1245      int known_align;
1246 {
1247 #ifdef SETJMP_VIA_SAVE_AREA
1248   rtx setjmpless_size = NULL_RTX;
1249 #endif
1250
1251   /* If we're asking for zero bytes, it doesn't matter what we point
1252      to since we can't dereference it.  But return a reasonable
1253      address anyway.  */
1254   if (size == const0_rtx)
1255     return virtual_stack_dynamic_rtx;
1256
1257   /* Otherwise, show we're calling alloca or equivalent.  */
1258   current_function_calls_alloca = 1;
1259
1260   /* Ensure the size is in the proper mode.  */
1261   if (GET_MODE (size) != VOIDmode && GET_MODE (size) != Pmode)
1262     size = convert_to_mode (Pmode, size, 1);
1263
1264   /* We can't attempt to minimize alignment necessary, because we don't
1265      know the final value of preferred_stack_boundary yet while executing
1266      this code.  */
1267   cfun->preferred_stack_boundary = PREFERRED_STACK_BOUNDARY;
1268
1269   /* We will need to ensure that the address we return is aligned to
1270      BIGGEST_ALIGNMENT.  If STACK_DYNAMIC_OFFSET is defined, we don't
1271      always know its final value at this point in the compilation (it 
1272      might depend on the size of the outgoing parameter lists, for
1273      example), so we must align the value to be returned in that case.
1274      (Note that STACK_DYNAMIC_OFFSET will have a default non-zero value if
1275      STACK_POINTER_OFFSET or ACCUMULATE_OUTGOING_ARGS are defined).
1276      We must also do an alignment operation on the returned value if
1277      the stack pointer alignment is less strict that BIGGEST_ALIGNMENT.
1278
1279      If we have to align, we must leave space in SIZE for the hole
1280      that might result from the alignment operation.  */
1281
1282 #if defined (STACK_DYNAMIC_OFFSET) || defined (STACK_POINTER_OFFSET)
1283 #define MUST_ALIGN 1
1284 #else
1285 #define MUST_ALIGN (PREFERRED_STACK_BOUNDARY < BIGGEST_ALIGNMENT)
1286 #endif
1287
1288   if (MUST_ALIGN)
1289     size
1290       = force_operand (plus_constant (size, 
1291                                       BIGGEST_ALIGNMENT / BITS_PER_UNIT - 1),
1292                        NULL_RTX);
1293
1294 #ifdef SETJMP_VIA_SAVE_AREA
1295   /* If setjmp restores regs from a save area in the stack frame,
1296      avoid clobbering the reg save area.  Note that the offset of
1297      virtual_incoming_args_rtx includes the preallocated stack args space.
1298      It would be no problem to clobber that, but it's on the wrong side
1299      of the old save area.  */
1300   {
1301     rtx dynamic_offset
1302       = expand_binop (Pmode, sub_optab, virtual_stack_dynamic_rtx,
1303                       stack_pointer_rtx, NULL_RTX, 1, OPTAB_LIB_WIDEN);
1304
1305     if (!current_function_calls_setjmp)
1306       {
1307         int align = PREFERRED_STACK_BOUNDARY / BITS_PER_UNIT;
1308
1309         /* See optimize_save_area_alloca to understand what is being
1310            set up here.  */
1311
1312         /* ??? Code below assumes that the save area needs maximal
1313            alignment.  This constraint may be too strong.  */
1314         if (PREFERRED_STACK_BOUNDARY != BIGGEST_ALIGNMENT)
1315           abort ();
1316
1317         if (GET_CODE (size) == CONST_INT)
1318           {
1319             HOST_WIDE_INT new = INTVAL (size) / align * align;
1320
1321             if (INTVAL (size) != new)
1322               setjmpless_size = GEN_INT (new);
1323             else
1324               setjmpless_size = size;
1325           }
1326         else
1327           {
1328             /* Since we know overflow is not possible, we avoid using
1329                CEIL_DIV_EXPR and use TRUNC_DIV_EXPR instead.  */
1330             setjmpless_size = expand_divmod (0, TRUNC_DIV_EXPR, Pmode, size,
1331                                              GEN_INT (align), NULL_RTX, 1);
1332             setjmpless_size = expand_mult (Pmode, setjmpless_size,
1333                                            GEN_INT (align), NULL_RTX, 1);
1334           }
1335         /* Our optimization works based upon being able to perform a simple
1336            transformation of this RTL into a (set REG REG) so make sure things
1337            did in fact end up in a REG.  */
1338         if (!register_operand (setjmpless_size, Pmode))
1339           setjmpless_size = force_reg (Pmode, setjmpless_size);
1340       }
1341
1342     size = expand_binop (Pmode, add_optab, size, dynamic_offset,
1343                          NULL_RTX, 1, OPTAB_LIB_WIDEN);
1344   }
1345 #endif /* SETJMP_VIA_SAVE_AREA */
1346
1347   /* Round the size to a multiple of the required stack alignment.
1348      Since the stack if presumed to be rounded before this allocation,
1349      this will maintain the required alignment.
1350
1351      If the stack grows downward, we could save an insn by subtracting
1352      SIZE from the stack pointer and then aligning the stack pointer.
1353      The problem with this is that the stack pointer may be unaligned
1354      between the execution of the subtraction and alignment insns and
1355      some machines do not allow this.  Even on those that do, some
1356      signal handlers malfunction if a signal should occur between those
1357      insns.  Since this is an extremely rare event, we have no reliable
1358      way of knowing which systems have this problem.  So we avoid even
1359      momentarily mis-aligning the stack.  */
1360
1361   /* If we added a variable amount to SIZE,
1362      we can no longer assume it is aligned.  */
1363 #if !defined (SETJMP_VIA_SAVE_AREA)
1364   if (MUST_ALIGN || known_align % PREFERRED_STACK_BOUNDARY != 0)
1365 #endif
1366     size = round_push (size);
1367
1368   do_pending_stack_adjust ();
1369
1370  /* We ought to be called always on the toplevel and stack ought to be aligned
1371     propertly.  */
1372   if (stack_pointer_delta % (PREFERRED_STACK_BOUNDARY / BITS_PER_UNIT))
1373     abort ();
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 }