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