OSDN Git Service

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