OSDN Git Service

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