OSDN Git Service

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