OSDN Git Service

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