OSDN Git Service

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