OSDN Git Service

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