OSDN Git Service

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