OSDN Git Service

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