OSDN Git Service

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