OSDN Git Service

2003-05-23 Larin Hennessy <larin@science.oregonstate.edu>
[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
662      We cannot do this for non-static aggregates, because of the double
663      writes that can be generated by store_constructor, depending on the
664      contents of the initializer.  Yes, this does eliminate a good fraction
665      of the number of uses of RTX_UNCHANGING_P for a language like Ada.
666      It also eliminates a good quantity of bugs.  Let this be incentive to
667      eliminate RTX_UNCHANGING_P entirely in favour of a more reliable
668      solution, perhaps based on alias sets.  */
669
670   if ((TREE_READONLY (t) && DECL_P (t)
671        && (TREE_STATIC (t) || ! AGGREGATE_TYPE_P (TREE_TYPE (t)))
672        && (TREE_CODE (t) == PARM_DECL
673            || (DECL_INITIAL (t) && TREE_CONSTANT (DECL_INITIAL (t)))))
674       || TREE_CODE_CLASS (TREE_CODE (t)) == 'c')
675     RTX_UNCHANGING_P (ref) = 1;
676 }
677 \f
678 /* Return a modified copy of X with its memory address copied
679    into a temporary register to protect it from side effects.
680    If X is not a MEM, it is returned unchanged (and not copied).
681    Perhaps even if it is a MEM, if there is no need to change it.  */
682
683 rtx
684 stabilize (x)
685      rtx x;
686 {
687   if (GET_CODE (x) != MEM
688       || ! rtx_unstable_p (XEXP (x, 0)))
689     return x;
690
691   return
692     replace_equiv_address (x, force_reg (Pmode, copy_all_regs (XEXP (x, 0))));
693 }
694 \f
695 /* Copy the value or contents of X to a new temp reg and return that reg.  */
696
697 rtx
698 copy_to_reg (x)
699      rtx x;
700 {
701   rtx temp = gen_reg_rtx (GET_MODE (x));
702
703   /* If not an operand, must be an address with PLUS and MULT so
704      do the computation.  */
705   if (! general_operand (x, VOIDmode))
706     x = force_operand (x, temp);
707
708   if (x != temp)
709     emit_move_insn (temp, x);
710
711   return temp;
712 }
713
714 /* Like copy_to_reg but always give the new register mode Pmode
715    in case X is a constant.  */
716
717 rtx
718 copy_addr_to_reg (x)
719      rtx x;
720 {
721   return copy_to_mode_reg (Pmode, x);
722 }
723
724 /* Like copy_to_reg but always give the new register mode MODE
725    in case X is a constant.  */
726
727 rtx
728 copy_to_mode_reg (mode, x)
729      enum machine_mode mode;
730      rtx x;
731 {
732   rtx temp = gen_reg_rtx (mode);
733
734   /* If not an operand, must be an address with PLUS and MULT so
735      do the computation.  */
736   if (! general_operand (x, VOIDmode))
737     x = force_operand (x, temp);
738
739   if (GET_MODE (x) != mode && GET_MODE (x) != VOIDmode)
740     abort ();
741   if (x != temp)
742     emit_move_insn (temp, x);
743   return temp;
744 }
745
746 /* Load X into a register if it is not already one.
747    Use mode MODE for the register.
748    X should be valid for mode MODE, but it may be a constant which
749    is valid for all integer modes; that's why caller must specify MODE.
750
751    The caller must not alter the value in the register we return,
752    since we mark it as a "constant" register.  */
753
754 rtx
755 force_reg (mode, x)
756      enum machine_mode mode;
757      rtx x;
758 {
759   rtx temp, insn, set;
760
761   if (GET_CODE (x) == REG)
762     return x;
763
764   if (general_operand (x, mode))
765     {
766       temp = gen_reg_rtx (mode);
767       insn = emit_move_insn (temp, x);
768     }
769   else
770     {
771       temp = force_operand (x, NULL_RTX);
772       if (GET_CODE (temp) == REG)
773         insn = get_last_insn ();
774       else
775         {
776           rtx temp2 = gen_reg_rtx (mode);
777           insn = emit_move_insn (temp2, temp);
778           temp = temp2;
779         }
780     }
781
782   /* Let optimizers know that TEMP's value never changes
783      and that X can be substituted for it.  Don't get confused
784      if INSN set something else (such as a SUBREG of TEMP).  */
785   if (CONSTANT_P (x)
786       && (set = single_set (insn)) != 0
787       && SET_DEST (set) == temp
788       && ! rtx_equal_p (x, SET_SRC (set)))
789     set_unique_reg_note (insn, REG_EQUAL, x);
790
791   return temp;
792 }
793
794 /* If X is a memory ref, copy its contents to a new temp reg and return
795    that reg.  Otherwise, return X.  */
796
797 rtx
798 force_not_mem (x)
799      rtx x;
800 {
801   rtx temp;
802
803   if (GET_CODE (x) != MEM || GET_MODE (x) == BLKmode)
804     return x;
805
806   temp = gen_reg_rtx (GET_MODE (x));
807   emit_move_insn (temp, x);
808   return temp;
809 }
810
811 /* Copy X to TARGET (if it's nonzero and a reg)
812    or to a new temp reg and return that reg.
813    MODE is the mode to use for X in case it is a constant.  */
814
815 rtx
816 copy_to_suggested_reg (x, target, mode)
817      rtx x, target;
818      enum machine_mode mode;
819 {
820   rtx temp;
821
822   if (target && GET_CODE (target) == REG)
823     temp = target;
824   else
825     temp = gen_reg_rtx (mode);
826
827   emit_move_insn (temp, x);
828   return temp;
829 }
830 \f
831 /* Return the mode to use to store a scalar of TYPE and MODE.
832    PUNSIGNEDP points to the signedness of the type and may be adjusted
833    to show what signedness to use on extension operations.
834
835    FOR_CALL is nonzero if this call is promoting args for a call.  */
836
837 enum machine_mode
838 promote_mode (type, mode, punsignedp, for_call)
839      tree type;
840      enum machine_mode mode;
841      int *punsignedp;
842      int for_call ATTRIBUTE_UNUSED;
843 {
844   enum tree_code code = TREE_CODE (type);
845   int unsignedp = *punsignedp;
846
847 #ifdef PROMOTE_FOR_CALL_ONLY
848   if (! for_call)
849     return mode;
850 #endif
851
852   switch (code)
853     {
854 #ifdef PROMOTE_MODE
855     case INTEGER_TYPE:   case ENUMERAL_TYPE:   case BOOLEAN_TYPE:
856     case CHAR_TYPE:      case REAL_TYPE:       case OFFSET_TYPE:
857       PROMOTE_MODE (mode, unsignedp, type);
858       break;
859 #endif
860
861 #ifdef POINTERS_EXTEND_UNSIGNED
862     case REFERENCE_TYPE:
863     case POINTER_TYPE:
864       mode = Pmode;
865       unsignedp = POINTERS_EXTEND_UNSIGNED;
866       break;
867 #endif
868
869     default:
870       break;
871     }
872
873   *punsignedp = unsignedp;
874   return mode;
875 }
876 \f
877 /* Adjust the stack pointer by ADJUST (an rtx for a number of bytes).
878    This pops when ADJUST is positive.  ADJUST need not be constant.  */
879
880 void
881 adjust_stack (adjust)
882      rtx adjust;
883 {
884   rtx temp;
885   adjust = protect_from_queue (adjust, 0);
886
887   if (adjust == const0_rtx)
888     return;
889
890   /* We expect all variable sized adjustments to be multiple of
891      PREFERRED_STACK_BOUNDARY.  */
892   if (GET_CODE (adjust) == CONST_INT)
893     stack_pointer_delta -= INTVAL (adjust);
894
895   temp = expand_binop (Pmode,
896 #ifdef STACK_GROWS_DOWNWARD
897                        add_optab,
898 #else
899                        sub_optab,
900 #endif
901                        stack_pointer_rtx, adjust, stack_pointer_rtx, 0,
902                        OPTAB_LIB_WIDEN);
903
904   if (temp != stack_pointer_rtx)
905     emit_move_insn (stack_pointer_rtx, temp);
906 }
907
908 /* Adjust the stack pointer by minus ADJUST (an rtx for a number of bytes).
909    This pushes when ADJUST is positive.  ADJUST need not be constant.  */
910
911 void
912 anti_adjust_stack (adjust)
913      rtx adjust;
914 {
915   rtx temp;
916   adjust = protect_from_queue (adjust, 0);
917
918   if (adjust == const0_rtx)
919     return;
920
921   /* We expect all variable sized adjustments to be multiple of
922      PREFERRED_STACK_BOUNDARY.  */
923   if (GET_CODE (adjust) == CONST_INT)
924     stack_pointer_delta += INTVAL (adjust);
925
926   temp = expand_binop (Pmode,
927 #ifdef STACK_GROWS_DOWNWARD
928                        sub_optab,
929 #else
930                        add_optab,
931 #endif
932                        stack_pointer_rtx, adjust, stack_pointer_rtx, 0,
933                        OPTAB_LIB_WIDEN);
934
935   if (temp != stack_pointer_rtx)
936     emit_move_insn (stack_pointer_rtx, temp);
937 }
938
939 /* Round the size of a block to be pushed up to the boundary required
940    by this machine.  SIZE is the desired size, which need not be constant.  */
941
942 rtx
943 round_push (size)
944      rtx size;
945 {
946   int align = PREFERRED_STACK_BOUNDARY / BITS_PER_UNIT;
947
948   if (align == 1)
949     return size;
950
951   if (GET_CODE (size) == CONST_INT)
952     {
953       HOST_WIDE_INT new = (INTVAL (size) + align - 1) / align * align;
954
955       if (INTVAL (size) != new)
956         size = GEN_INT (new);
957     }
958   else
959     {
960       /* CEIL_DIV_EXPR needs to worry about the addition overflowing,
961          but we know it can't.  So add ourselves and then do
962          TRUNC_DIV_EXPR.  */
963       size = expand_binop (Pmode, add_optab, size, GEN_INT (align - 1),
964                            NULL_RTX, 1, OPTAB_LIB_WIDEN);
965       size = expand_divmod (0, TRUNC_DIV_EXPR, Pmode, size, GEN_INT (align),
966                             NULL_RTX, 1);
967       size = expand_mult (Pmode, size, GEN_INT (align), NULL_RTX, 1);
968     }
969
970   return size;
971 }
972 \f
973 /* Save the stack pointer for the purpose in SAVE_LEVEL.  PSAVE is a pointer
974    to a previously-created save area.  If no save area has been allocated,
975    this function will allocate one.  If a save area is specified, it
976    must be of the proper mode.
977
978    The insns are emitted after insn AFTER, if nonzero, otherwise the insns
979    are emitted at the current position.  */
980
981 void
982 emit_stack_save (save_level, psave, after)
983      enum save_level save_level;
984      rtx *psave;
985      rtx after;
986 {
987   rtx sa = *psave;
988   /* The default is that we use a move insn and save in a Pmode object.  */
989   rtx (*fcn) PARAMS ((rtx, rtx)) = gen_move_insn;
990   enum machine_mode mode = STACK_SAVEAREA_MODE (save_level);
991
992   /* See if this machine has anything special to do for this kind of save.  */
993   switch (save_level)
994     {
995 #ifdef HAVE_save_stack_block
996     case SAVE_BLOCK:
997       if (HAVE_save_stack_block)
998         fcn = gen_save_stack_block;
999       break;
1000 #endif
1001 #ifdef HAVE_save_stack_function
1002     case SAVE_FUNCTION:
1003       if (HAVE_save_stack_function)
1004         fcn = gen_save_stack_function;
1005       break;
1006 #endif
1007 #ifdef HAVE_save_stack_nonlocal
1008     case SAVE_NONLOCAL:
1009       if (HAVE_save_stack_nonlocal)
1010         fcn = gen_save_stack_nonlocal;
1011       break;
1012 #endif
1013     default:
1014       break;
1015     }
1016
1017   /* If there is no save area and we have to allocate one, do so.  Otherwise
1018      verify the save area is the proper mode.  */
1019
1020   if (sa == 0)
1021     {
1022       if (mode != VOIDmode)
1023         {
1024           if (save_level == SAVE_NONLOCAL)
1025             *psave = sa = assign_stack_local (mode, GET_MODE_SIZE (mode), 0);
1026           else
1027             *psave = sa = gen_reg_rtx (mode);
1028         }
1029     }
1030   else
1031     {
1032       if (mode == VOIDmode || GET_MODE (sa) != mode)
1033         abort ();
1034     }
1035
1036   if (after)
1037     {
1038       rtx seq;
1039
1040       start_sequence ();
1041       /* We must validize inside the sequence, to ensure that any instructions
1042          created by the validize call also get moved to the right place.  */
1043       if (sa != 0)
1044         sa = validize_mem (sa);
1045       emit_insn (fcn (sa, stack_pointer_rtx));
1046       seq = get_insns ();
1047       end_sequence ();
1048       emit_insn_after (seq, after);
1049     }
1050   else
1051     {
1052       if (sa != 0)
1053         sa = validize_mem (sa);
1054       emit_insn (fcn (sa, stack_pointer_rtx));
1055     }
1056 }
1057
1058 /* Restore the stack pointer for the purpose in SAVE_LEVEL.  SA is the save
1059    area made by emit_stack_save.  If it is zero, we have nothing to do.
1060
1061    Put any emitted insns after insn AFTER, if nonzero, otherwise at
1062    current position.  */
1063
1064 void
1065 emit_stack_restore (save_level, sa, after)
1066      enum save_level save_level;
1067      rtx after;
1068      rtx sa;
1069 {
1070   /* The default is that we use a move insn.  */
1071   rtx (*fcn) PARAMS ((rtx, rtx)) = gen_move_insn;
1072
1073   /* See if this machine has anything special to do for this kind of save.  */
1074   switch (save_level)
1075     {
1076 #ifdef HAVE_restore_stack_block
1077     case SAVE_BLOCK:
1078       if (HAVE_restore_stack_block)
1079         fcn = gen_restore_stack_block;
1080       break;
1081 #endif
1082 #ifdef HAVE_restore_stack_function
1083     case SAVE_FUNCTION:
1084       if (HAVE_restore_stack_function)
1085         fcn = gen_restore_stack_function;
1086       break;
1087 #endif
1088 #ifdef HAVE_restore_stack_nonlocal
1089     case SAVE_NONLOCAL:
1090       if (HAVE_restore_stack_nonlocal)
1091         fcn = gen_restore_stack_nonlocal;
1092       break;
1093 #endif
1094     default:
1095       break;
1096     }
1097
1098   if (sa != 0)
1099     {
1100       sa = validize_mem (sa);
1101       /* These clobbers prevent the scheduler from moving
1102          references to variable arrays below the code
1103          that deletes (pops) the arrays.  */
1104       emit_insn (gen_rtx_CLOBBER (VOIDmode,
1105                     gen_rtx_MEM (BLKmode, 
1106                         gen_rtx_SCRATCH (VOIDmode))));
1107       emit_insn (gen_rtx_CLOBBER (VOIDmode,
1108                     gen_rtx_MEM (BLKmode, stack_pointer_rtx)));
1109     }
1110
1111   if (after)
1112     {
1113       rtx seq;
1114
1115       start_sequence ();
1116       emit_insn (fcn (stack_pointer_rtx, sa));
1117       seq = get_insns ();
1118       end_sequence ();
1119       emit_insn_after (seq, after);
1120     }
1121   else
1122     emit_insn (fcn (stack_pointer_rtx, sa));
1123 }
1124 \f
1125 #ifdef SETJMP_VIA_SAVE_AREA
1126 /* Optimize RTL generated by allocate_dynamic_stack_space for targets
1127    where SETJMP_VIA_SAVE_AREA is true.  The problem is that on these
1128    platforms, the dynamic stack space used can corrupt the original
1129    frame, thus causing a crash if a longjmp unwinds to it.  */
1130
1131 void
1132 optimize_save_area_alloca (insns)
1133      rtx insns;
1134 {
1135   rtx insn;
1136
1137   for (insn = insns; insn; insn = NEXT_INSN(insn))
1138     {
1139       rtx note;
1140
1141       if (GET_CODE (insn) != INSN)
1142         continue;
1143
1144       for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1145         {
1146           if (REG_NOTE_KIND (note) != REG_SAVE_AREA)
1147             continue;
1148
1149           if (!current_function_calls_setjmp)
1150             {
1151               rtx pat = PATTERN (insn);
1152
1153               /* If we do not see the note in a pattern matching
1154                  these precise characteristics, we did something
1155                  entirely wrong in allocate_dynamic_stack_space.
1156
1157                  Note, one way this could happen is if SETJMP_VIA_SAVE_AREA
1158                  was defined on a machine where stacks grow towards higher
1159                  addresses.
1160
1161                  Right now only supported port with stack that grow upward
1162                  is the HPPA and it does not define SETJMP_VIA_SAVE_AREA.  */
1163               if (GET_CODE (pat) != SET
1164                   || SET_DEST (pat) != stack_pointer_rtx
1165                   || GET_CODE (SET_SRC (pat)) != MINUS
1166                   || XEXP (SET_SRC (pat), 0) != stack_pointer_rtx)
1167                 abort ();
1168
1169               /* This will now be transformed into a (set REG REG)
1170                  so we can just blow away all the other notes.  */
1171               XEXP (SET_SRC (pat), 1) = XEXP (note, 0);
1172               REG_NOTES (insn) = NULL_RTX;
1173             }
1174           else
1175             {
1176               /* setjmp was called, we must remove the REG_SAVE_AREA
1177                  note so that later passes do not get confused by its
1178                  presence.  */
1179               if (note == REG_NOTES (insn))
1180                 {
1181                   REG_NOTES (insn) = XEXP (note, 1);
1182                 }
1183               else
1184                 {
1185                   rtx srch;
1186
1187                   for (srch = REG_NOTES (insn); srch; srch = XEXP (srch, 1))
1188                     if (XEXP (srch, 1) == note)
1189                       break;
1190
1191                   if (srch == NULL_RTX)
1192                     abort ();
1193
1194                   XEXP (srch, 1) = XEXP (note, 1);
1195                 }
1196             }
1197           /* Once we've seen the note of interest, we need not look at
1198              the rest of them.  */
1199           break;
1200         }
1201     }
1202 }
1203 #endif /* SETJMP_VIA_SAVE_AREA */
1204
1205 /* Return an rtx representing the address of an area of memory dynamically
1206    pushed on the stack.  This region of memory is always aligned to
1207    a multiple of BIGGEST_ALIGNMENT.
1208
1209    Any required stack pointer alignment is preserved.
1210
1211    SIZE is an rtx representing the size of the area.
1212    TARGET is a place in which the address can be placed.
1213
1214    KNOWN_ALIGN is the alignment (in bits) that we know SIZE has.  */
1215
1216 rtx
1217 allocate_dynamic_stack_space (size, target, known_align)
1218      rtx size;
1219      rtx target;
1220      int known_align;
1221 {
1222 #ifdef SETJMP_VIA_SAVE_AREA
1223   rtx setjmpless_size = NULL_RTX;
1224 #endif
1225
1226   /* If we're asking for zero bytes, it doesn't matter what we point
1227      to since we can't dereference it.  But return a reasonable
1228      address anyway.  */
1229   if (size == const0_rtx)
1230     return virtual_stack_dynamic_rtx;
1231
1232   /* Otherwise, show we're calling alloca or equivalent.  */
1233   current_function_calls_alloca = 1;
1234
1235   /* Ensure the size is in the proper mode.  */
1236   if (GET_MODE (size) != VOIDmode && GET_MODE (size) != Pmode)
1237     size = convert_to_mode (Pmode, size, 1);
1238
1239   /* We can't attempt to minimize alignment necessary, because we don't
1240      know the final value of preferred_stack_boundary yet while executing
1241      this code.  */
1242   cfun->preferred_stack_boundary = PREFERRED_STACK_BOUNDARY;
1243
1244   /* We will need to ensure that the address we return is aligned to
1245      BIGGEST_ALIGNMENT.  If STACK_DYNAMIC_OFFSET is defined, we don't
1246      always know its final value at this point in the compilation (it
1247      might depend on the size of the outgoing parameter lists, for
1248      example), so we must align the value to be returned in that case.
1249      (Note that STACK_DYNAMIC_OFFSET will have a default nonzero value if
1250      STACK_POINTER_OFFSET or ACCUMULATE_OUTGOING_ARGS are defined).
1251      We must also do an alignment operation on the returned value if
1252      the stack pointer alignment is less strict that BIGGEST_ALIGNMENT.
1253
1254      If we have to align, we must leave space in SIZE for the hole
1255      that might result from the alignment operation.  */
1256
1257 #if defined (STACK_DYNAMIC_OFFSET) || defined (STACK_POINTER_OFFSET)
1258 #define MUST_ALIGN 1
1259 #else
1260 #define MUST_ALIGN (PREFERRED_STACK_BOUNDARY < BIGGEST_ALIGNMENT)
1261 #endif
1262
1263   if (MUST_ALIGN)
1264     size
1265       = force_operand (plus_constant (size,
1266                                       BIGGEST_ALIGNMENT / BITS_PER_UNIT - 1),
1267                        NULL_RTX);
1268
1269 #ifdef SETJMP_VIA_SAVE_AREA
1270   /* If setjmp restores regs from a save area in the stack frame,
1271      avoid clobbering the reg save area.  Note that the offset of
1272      virtual_incoming_args_rtx includes the preallocated stack args space.
1273      It would be no problem to clobber that, but it's on the wrong side
1274      of the old save area.  */
1275   {
1276     rtx dynamic_offset
1277       = expand_binop (Pmode, sub_optab, virtual_stack_dynamic_rtx,
1278                       stack_pointer_rtx, NULL_RTX, 1, OPTAB_LIB_WIDEN);
1279
1280     if (!current_function_calls_setjmp)
1281       {
1282         int align = PREFERRED_STACK_BOUNDARY / BITS_PER_UNIT;
1283
1284         /* See optimize_save_area_alloca to understand what is being
1285            set up here.  */
1286
1287         /* ??? Code below assumes that the save area needs maximal
1288            alignment.  This constraint may be too strong.  */
1289         if (PREFERRED_STACK_BOUNDARY != BIGGEST_ALIGNMENT)
1290           abort ();
1291
1292         if (GET_CODE (size) == CONST_INT)
1293           {
1294             HOST_WIDE_INT new = INTVAL (size) / align * align;
1295
1296             if (INTVAL (size) != new)
1297               setjmpless_size = GEN_INT (new);
1298             else
1299               setjmpless_size = size;
1300           }
1301         else
1302           {
1303             /* Since we know overflow is not possible, we avoid using
1304                CEIL_DIV_EXPR and use TRUNC_DIV_EXPR instead.  */
1305             setjmpless_size = expand_divmod (0, TRUNC_DIV_EXPR, Pmode, size,
1306                                              GEN_INT (align), NULL_RTX, 1);
1307             setjmpless_size = expand_mult (Pmode, setjmpless_size,
1308                                            GEN_INT (align), NULL_RTX, 1);
1309           }
1310         /* Our optimization works based upon being able to perform a simple
1311            transformation of this RTL into a (set REG REG) so make sure things
1312            did in fact end up in a REG.  */
1313         if (!register_operand (setjmpless_size, Pmode))
1314           setjmpless_size = force_reg (Pmode, setjmpless_size);
1315       }
1316
1317     size = expand_binop (Pmode, add_optab, size, dynamic_offset,
1318                          NULL_RTX, 1, OPTAB_LIB_WIDEN);
1319   }
1320 #endif /* SETJMP_VIA_SAVE_AREA */
1321
1322   /* Round the size to a multiple of the required stack alignment.
1323      Since the stack if presumed to be rounded before this allocation,
1324      this will maintain the required alignment.
1325
1326      If the stack grows downward, we could save an insn by subtracting
1327      SIZE from the stack pointer and then aligning the stack pointer.
1328      The problem with this is that the stack pointer may be unaligned
1329      between the execution of the subtraction and alignment insns and
1330      some machines do not allow this.  Even on those that do, some
1331      signal handlers malfunction if a signal should occur between those
1332      insns.  Since this is an extremely rare event, we have no reliable
1333      way of knowing which systems have this problem.  So we avoid even
1334      momentarily mis-aligning the stack.  */
1335
1336   /* If we added a variable amount to SIZE,
1337      we can no longer assume it is aligned.  */
1338 #if !defined (SETJMP_VIA_SAVE_AREA)
1339   if (MUST_ALIGN || known_align % PREFERRED_STACK_BOUNDARY != 0)
1340 #endif
1341     size = round_push (size);
1342
1343   do_pending_stack_adjust ();
1344
1345  /* We ought to be called always on the toplevel and stack ought to be aligned
1346     properly.  */
1347   if (stack_pointer_delta % (PREFERRED_STACK_BOUNDARY / BITS_PER_UNIT))
1348     abort ();
1349
1350   /* If needed, check that we have the required amount of stack.  Take into
1351      account what has already been checked.  */
1352   if (flag_stack_check && ! STACK_CHECK_BUILTIN)
1353     probe_stack_range (STACK_CHECK_MAX_FRAME_SIZE + STACK_CHECK_PROTECT, size);
1354
1355   /* Don't use a TARGET that isn't a pseudo or is the wrong mode.  */
1356   if (target == 0 || GET_CODE (target) != REG
1357       || REGNO (target) < FIRST_PSEUDO_REGISTER
1358       || GET_MODE (target) != Pmode)
1359     target = gen_reg_rtx (Pmode);
1360
1361   mark_reg_pointer (target, known_align);
1362
1363   /* Perform the required allocation from the stack.  Some systems do
1364      this differently than simply incrementing/decrementing from the
1365      stack pointer, such as acquiring the space by calling malloc().  */
1366 #ifdef HAVE_allocate_stack
1367   if (HAVE_allocate_stack)
1368     {
1369       enum machine_mode mode = STACK_SIZE_MODE;
1370       insn_operand_predicate_fn pred;
1371
1372       /* We don't have to check against the predicate for operand 0 since
1373          TARGET is known to be a pseudo of the proper mode, which must
1374          be valid for the operand.  For operand 1, convert to the
1375          proper mode and validate.  */
1376       if (mode == VOIDmode)
1377         mode = insn_data[(int) CODE_FOR_allocate_stack].operand[1].mode;
1378
1379       pred = insn_data[(int) CODE_FOR_allocate_stack].operand[1].predicate;
1380       if (pred && ! ((*pred) (size, mode)))
1381         size = copy_to_mode_reg (mode, convert_to_mode (mode, size, 1));
1382
1383       emit_insn (gen_allocate_stack (target, size));
1384     }
1385   else
1386 #endif
1387     {
1388 #ifndef STACK_GROWS_DOWNWARD
1389       emit_move_insn (target, virtual_stack_dynamic_rtx);
1390 #endif
1391
1392       /* Check stack bounds if necessary.  */
1393       if (current_function_limit_stack)
1394         {
1395           rtx available;
1396           rtx space_available = gen_label_rtx ();
1397 #ifdef STACK_GROWS_DOWNWARD
1398           available = expand_binop (Pmode, sub_optab,
1399                                     stack_pointer_rtx, stack_limit_rtx,
1400                                     NULL_RTX, 1, OPTAB_WIDEN);
1401 #else
1402           available = expand_binop (Pmode, sub_optab,
1403                                     stack_limit_rtx, stack_pointer_rtx,
1404                                     NULL_RTX, 1, OPTAB_WIDEN);
1405 #endif
1406           emit_cmp_and_jump_insns (available, size, GEU, NULL_RTX, Pmode, 1,
1407                                    space_available);
1408 #ifdef HAVE_trap
1409           if (HAVE_trap)
1410             emit_insn (gen_trap ());
1411           else
1412 #endif
1413             error ("stack limits not supported on this target");
1414           emit_barrier ();
1415           emit_label (space_available);
1416         }
1417
1418       anti_adjust_stack (size);
1419 #ifdef SETJMP_VIA_SAVE_AREA
1420       if (setjmpless_size != NULL_RTX)
1421         {
1422           rtx note_target = get_last_insn ();
1423
1424           REG_NOTES (note_target)
1425             = gen_rtx_EXPR_LIST (REG_SAVE_AREA, setjmpless_size,
1426                                  REG_NOTES (note_target));
1427         }
1428 #endif /* SETJMP_VIA_SAVE_AREA */
1429
1430 #ifdef STACK_GROWS_DOWNWARD
1431       emit_move_insn (target, virtual_stack_dynamic_rtx);
1432 #endif
1433     }
1434
1435   if (MUST_ALIGN)
1436     {
1437       /* CEIL_DIV_EXPR needs to worry about the addition overflowing,
1438          but we know it can't.  So add ourselves and then do
1439          TRUNC_DIV_EXPR.  */
1440       target = expand_binop (Pmode, add_optab, target,
1441                              GEN_INT (BIGGEST_ALIGNMENT / BITS_PER_UNIT - 1),
1442                              NULL_RTX, 1, OPTAB_LIB_WIDEN);
1443       target = expand_divmod (0, TRUNC_DIV_EXPR, Pmode, target,
1444                               GEN_INT (BIGGEST_ALIGNMENT / BITS_PER_UNIT),
1445                               NULL_RTX, 1);
1446       target = expand_mult (Pmode, target,
1447                             GEN_INT (BIGGEST_ALIGNMENT / BITS_PER_UNIT),
1448                             NULL_RTX, 1);
1449     }
1450
1451   /* Record the new stack level for nonlocal gotos.  */
1452   if (nonlocal_goto_handler_slots != 0)
1453     emit_stack_save (SAVE_NONLOCAL, &nonlocal_goto_stack_level, NULL_RTX);
1454
1455   return target;
1456 }
1457 \f
1458 /* A front end may want to override GCC's stack checking by providing a
1459    run-time routine to call to check the stack, so provide a mechanism for
1460    calling that routine.  */
1461
1462 static GTY(()) rtx stack_check_libfunc;
1463
1464 void
1465 set_stack_check_libfunc (libfunc)
1466      rtx libfunc;
1467 {
1468   stack_check_libfunc = libfunc;
1469 }
1470 \f
1471 /* Emit one stack probe at ADDRESS, an address within the stack.  */
1472
1473 static void
1474 emit_stack_probe (address)
1475      rtx address;
1476 {
1477   rtx memref = gen_rtx_MEM (word_mode, address);
1478
1479   MEM_VOLATILE_P (memref) = 1;
1480
1481   if (STACK_CHECK_PROBE_LOAD)
1482     emit_move_insn (gen_reg_rtx (word_mode), memref);
1483   else
1484     emit_move_insn (memref, const0_rtx);
1485 }
1486
1487 /* Probe a range of stack addresses from FIRST to FIRST+SIZE, inclusive.
1488    FIRST is a constant and size is a Pmode RTX.  These are offsets from the
1489    current stack pointer.  STACK_GROWS_DOWNWARD says whether to add or
1490    subtract from the stack.  If SIZE is constant, this is done
1491    with a fixed number of probes.  Otherwise, we must make a loop.  */
1492
1493 #ifdef STACK_GROWS_DOWNWARD
1494 #define STACK_GROW_OP MINUS
1495 #else
1496 #define STACK_GROW_OP PLUS
1497 #endif
1498
1499 void
1500 probe_stack_range (first, size)
1501      HOST_WIDE_INT first;
1502      rtx size;
1503 {
1504   /* First ensure SIZE is Pmode.  */
1505   if (GET_MODE (size) != VOIDmode && GET_MODE (size) != Pmode)
1506     size = convert_to_mode (Pmode, size, 1);
1507
1508   /* Next see if the front end has set up a function for us to call to
1509      check the stack.  */
1510   if (stack_check_libfunc != 0)
1511     {
1512       rtx addr = memory_address (QImode,
1513                                  gen_rtx_fmt_ee (STACK_GROW_OP, Pmode,
1514                                                  stack_pointer_rtx,
1515                                                  plus_constant (size, first)));
1516
1517 #ifdef POINTERS_EXTEND_UNSIGNED
1518       if (GET_MODE (addr) != ptr_mode)
1519         addr = convert_memory_address (ptr_mode, addr);
1520 #endif
1521
1522       emit_library_call (stack_check_libfunc, LCT_NORMAL, VOIDmode, 1, addr,
1523                          ptr_mode);
1524     }
1525
1526   /* Next see if we have an insn to check the stack.  Use it if so.  */
1527 #ifdef HAVE_check_stack
1528   else if (HAVE_check_stack)
1529     {
1530       insn_operand_predicate_fn pred;
1531       rtx last_addr
1532         = force_operand (gen_rtx_fmt_ee (STACK_GROW_OP, Pmode,
1533                                          stack_pointer_rtx,
1534                                          plus_constant (size, first)),
1535                          NULL_RTX);
1536
1537       pred = insn_data[(int) CODE_FOR_check_stack].operand[0].predicate;
1538       if (pred && ! ((*pred) (last_addr, Pmode)))
1539         last_addr = copy_to_mode_reg (Pmode, last_addr);
1540
1541       emit_insn (gen_check_stack (last_addr));
1542     }
1543 #endif
1544
1545   /* If we have to generate explicit probes, see if we have a constant
1546      small number of them to generate.  If so, that's the easy case.  */
1547   else if (GET_CODE (size) == CONST_INT
1548            && INTVAL (size) < 10 * STACK_CHECK_PROBE_INTERVAL)
1549     {
1550       HOST_WIDE_INT offset;
1551
1552       /* Start probing at FIRST + N * STACK_CHECK_PROBE_INTERVAL
1553          for values of N from 1 until it exceeds LAST.  If only one
1554          probe is needed, this will not generate any code.  Then probe
1555          at LAST.  */
1556       for (offset = first + STACK_CHECK_PROBE_INTERVAL;
1557            offset < INTVAL (size);
1558            offset = offset + STACK_CHECK_PROBE_INTERVAL)
1559         emit_stack_probe (gen_rtx_fmt_ee (STACK_GROW_OP, Pmode,
1560                                           stack_pointer_rtx,
1561                                           GEN_INT (offset)));
1562
1563       emit_stack_probe (gen_rtx_fmt_ee (STACK_GROW_OP, Pmode,
1564                                         stack_pointer_rtx,
1565                                         plus_constant (size, first)));
1566     }
1567
1568   /* In the variable case, do the same as above, but in a loop.  We emit loop
1569      notes so that loop optimization can be done.  */
1570   else
1571     {
1572       rtx test_addr
1573         = force_operand (gen_rtx_fmt_ee (STACK_GROW_OP, Pmode,
1574                                          stack_pointer_rtx,
1575                                          GEN_INT (first + STACK_CHECK_PROBE_INTERVAL)),
1576                          NULL_RTX);
1577       rtx last_addr
1578         = force_operand (gen_rtx_fmt_ee (STACK_GROW_OP, Pmode,
1579                                          stack_pointer_rtx,
1580                                          plus_constant (size, first)),
1581                          NULL_RTX);
1582       rtx incr = GEN_INT (STACK_CHECK_PROBE_INTERVAL);
1583       rtx loop_lab = gen_label_rtx ();
1584       rtx test_lab = gen_label_rtx ();
1585       rtx end_lab = gen_label_rtx ();
1586       rtx temp;
1587
1588       if (GET_CODE (test_addr) != REG
1589           || REGNO (test_addr) < FIRST_PSEUDO_REGISTER)
1590         test_addr = force_reg (Pmode, test_addr);
1591
1592       emit_note (NULL, NOTE_INSN_LOOP_BEG);
1593       emit_jump (test_lab);
1594
1595       emit_label (loop_lab);
1596       emit_stack_probe (test_addr);
1597
1598       emit_note (NULL, NOTE_INSN_LOOP_CONT);
1599
1600 #ifdef STACK_GROWS_DOWNWARD
1601 #define CMP_OPCODE GTU
1602       temp = expand_binop (Pmode, sub_optab, test_addr, incr, test_addr,
1603                            1, OPTAB_WIDEN);
1604 #else
1605 #define CMP_OPCODE LTU
1606       temp = expand_binop (Pmode, add_optab, test_addr, incr, test_addr,
1607                            1, OPTAB_WIDEN);
1608 #endif
1609
1610       if (temp != test_addr)
1611         abort ();
1612
1613       emit_label (test_lab);
1614       emit_cmp_and_jump_insns (test_addr, last_addr, CMP_OPCODE,
1615                                NULL_RTX, Pmode, 1, loop_lab);
1616       emit_jump (end_lab);
1617       emit_note (NULL, NOTE_INSN_LOOP_END);
1618       emit_label (end_lab);
1619
1620       emit_stack_probe (last_addr);
1621     }
1622 }
1623 \f
1624 /* Return an rtx representing the register or memory location
1625    in which a scalar value of data type VALTYPE
1626    was returned by a function call to function FUNC.
1627    FUNC is a FUNCTION_DECL node if the precise function is known,
1628    otherwise 0.
1629    OUTGOING is 1 if on a machine with register windows this function
1630    should return the register in which the function will put its result
1631    and 0 otherwise.  */
1632
1633 rtx
1634 hard_function_value (valtype, func, outgoing)
1635      tree valtype;
1636      tree func ATTRIBUTE_UNUSED;
1637      int outgoing ATTRIBUTE_UNUSED;
1638 {
1639   rtx val;
1640
1641 #ifdef FUNCTION_OUTGOING_VALUE
1642   if (outgoing)
1643     val = FUNCTION_OUTGOING_VALUE (valtype, func);
1644   else
1645 #endif
1646     val = FUNCTION_VALUE (valtype, func);
1647
1648   if (GET_CODE (val) == REG
1649       && GET_MODE (val) == BLKmode)
1650     {
1651       unsigned HOST_WIDE_INT bytes = int_size_in_bytes (valtype);
1652       enum machine_mode tmpmode;
1653
1654       /* int_size_in_bytes can return -1.  We don't need a check here
1655          since the value of bytes will be large enough that no mode
1656          will match and we will abort later in this function.  */
1657
1658       for (tmpmode = GET_CLASS_NARROWEST_MODE (MODE_INT);
1659            tmpmode != VOIDmode;
1660            tmpmode = GET_MODE_WIDER_MODE (tmpmode))
1661         {
1662           /* Have we found a large enough mode?  */
1663           if (GET_MODE_SIZE (tmpmode) >= bytes)
1664             break;
1665         }
1666
1667       /* No suitable mode found.  */
1668       if (tmpmode == VOIDmode)
1669         abort ();
1670
1671       PUT_MODE (val, tmpmode);
1672     }
1673   return val;
1674 }
1675
1676 /* Return an rtx representing the register or memory location
1677    in which a scalar value of mode MODE was returned by a library call.  */
1678
1679 rtx
1680 hard_libcall_value (mode)
1681      enum machine_mode mode;
1682 {
1683   return LIBCALL_VALUE (mode);
1684 }
1685
1686 /* Look up the tree code for a given rtx code
1687    to provide the arithmetic operation for REAL_ARITHMETIC.
1688    The function returns an int because the caller may not know
1689    what `enum tree_code' means.  */
1690
1691 int
1692 rtx_to_tree_code (code)
1693      enum rtx_code code;
1694 {
1695   enum tree_code tcode;
1696
1697   switch (code)
1698     {
1699     case PLUS:
1700       tcode = PLUS_EXPR;
1701       break;
1702     case MINUS:
1703       tcode = MINUS_EXPR;
1704       break;
1705     case MULT:
1706       tcode = MULT_EXPR;
1707       break;
1708     case DIV:
1709       tcode = RDIV_EXPR;
1710       break;
1711     case SMIN:
1712       tcode = MIN_EXPR;
1713       break;
1714     case SMAX:
1715       tcode = MAX_EXPR;
1716       break;
1717     default:
1718       tcode = LAST_AND_UNUSED_TREE_CODE;
1719       break;
1720     }
1721   return ((int) tcode);
1722 }
1723
1724 #include "gt-explow.h"