OSDN Git Service

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