OSDN Git Service

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