OSDN Git Service

Mon May 25 03:34:42 1998 Craig Burley <burley@gnu.org>
[pf3gnuchains/gcc-fork.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) () = gen_move_insn;
870   enum machine_mode mode = Pmode;
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         {
879           fcn = gen_save_stack_block;
880           mode = insn_operand_mode[CODE_FOR_save_stack_block][0];
881         }
882       break;
883 #endif
884 #ifdef HAVE_save_stack_function
885     case SAVE_FUNCTION:
886       if (HAVE_save_stack_function)
887         {
888           fcn = gen_save_stack_function;
889           mode = insn_operand_mode[CODE_FOR_save_stack_function][0];
890         }
891       break;
892 #endif
893 #ifdef HAVE_save_stack_nonlocal
894     case SAVE_NONLOCAL:
895       if (HAVE_save_stack_nonlocal)
896         {
897           fcn = gen_save_stack_nonlocal;
898           mode = insn_operand_mode[(int) CODE_FOR_save_stack_nonlocal][0];
899         }
900       break;
901 #endif
902     default:
903       break;
904     }
905
906   /* If there is no save area and we have to allocate one, do so.  Otherwise
907      verify the save area is the proper mode.  */
908
909   if (sa == 0)
910     {
911       if (mode != VOIDmode)
912         {
913           if (save_level == SAVE_NONLOCAL)
914             *psave = sa = assign_stack_local (mode, GET_MODE_SIZE (mode), 0);
915           else
916             *psave = sa = gen_reg_rtx (mode);
917         }
918     }
919   else
920     {
921       if (mode == VOIDmode || GET_MODE (sa) != mode)
922         abort ();
923     }
924
925   if (after)
926     {
927       rtx seq;
928
929       start_sequence ();
930       /* We must validize inside the sequence, to ensure that any instructions
931          created by the validize call also get moved to the right place.  */
932       if (sa != 0)
933         sa = validize_mem (sa);
934       emit_insn (fcn (sa, stack_pointer_rtx));
935       seq = gen_sequence ();
936       end_sequence ();
937       emit_insn_after (seq, after);
938     }
939   else
940     {
941       if (sa != 0)
942         sa = validize_mem (sa);
943       emit_insn (fcn (sa, stack_pointer_rtx));
944     }
945 }
946
947 /* Restore the stack pointer for the purpose in SAVE_LEVEL.  SA is the save
948    area made by emit_stack_save.  If it is zero, we have nothing to do. 
949
950    Put any emitted insns after insn AFTER, if nonzero, otherwise at 
951    current position.  */
952
953 void
954 emit_stack_restore (save_level, sa, after)
955      enum save_level save_level;
956      rtx after;
957      rtx sa;
958 {
959   /* The default is that we use a move insn.  */
960   rtx (*fcn) () = gen_move_insn;
961
962   /* See if this machine has anything special to do for this kind of save.  */
963   switch (save_level)
964     {
965 #ifdef HAVE_restore_stack_block
966     case SAVE_BLOCK:
967       if (HAVE_restore_stack_block)
968         fcn = gen_restore_stack_block;
969       break;
970 #endif
971 #ifdef HAVE_restore_stack_function
972     case SAVE_FUNCTION:
973       if (HAVE_restore_stack_function)
974         fcn = gen_restore_stack_function;
975       break;
976 #endif
977 #ifdef HAVE_restore_stack_nonlocal
978
979     case SAVE_NONLOCAL:
980       if (HAVE_restore_stack_nonlocal)
981         fcn = gen_restore_stack_nonlocal;
982       break;
983 #endif
984     default:
985       break;
986     }
987
988   if (sa != 0)
989     sa = validize_mem (sa);
990
991   if (after)
992     {
993       rtx seq;
994
995       start_sequence ();
996       emit_insn (fcn (stack_pointer_rtx, sa));
997       seq = gen_sequence ();
998       end_sequence ();
999       emit_insn_after (seq, after);
1000     }
1001   else
1002     emit_insn (fcn (stack_pointer_rtx, sa));
1003 }
1004 \f
1005 #ifdef SETJMP_VIA_SAVE_AREA
1006 /* Optimize RTL generated by allocate_dynamic_stack_space for targets
1007    where SETJMP_VIA_SAVE_AREA is true.  The problem is that on these
1008    platforms, the dynamic stack space used can corrupt the original
1009    frame, thus causing a crash if a longjmp unwinds to it.  */
1010
1011 void
1012 optimize_save_area_alloca (insns)
1013      rtx insns;
1014 {
1015   rtx insn;
1016
1017   for (insn = insns; insn; insn = NEXT_INSN(insn))
1018     {
1019       rtx note;
1020
1021       if (GET_CODE (insn) != INSN)
1022         continue;
1023
1024       for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1025         {
1026           if (REG_NOTE_KIND (note) != REG_SAVE_AREA)
1027             continue;
1028
1029           if (!current_function_calls_setjmp)
1030             {
1031               rtx pat = PATTERN (insn);
1032
1033               /* If we do not see the note in a pattern matching
1034                  these precise characteristics, we did something
1035                  entirely wrong in allocate_dynamic_stack_space. 
1036
1037                  Note, one way this could happen is if SETJMP_VIA_SAVE_AREA
1038                  was defined on a machine where stacks grow towards higher
1039                  addresses.
1040
1041                  Right now only supported port with stack that grow upward
1042                  is the HPPA and it does not define SETJMP_VIA_SAVE_AREA.  */
1043               if (GET_CODE (pat) != SET
1044                   || SET_DEST (pat) != stack_pointer_rtx
1045                   || GET_CODE (SET_SRC (pat)) != MINUS
1046                   || XEXP (SET_SRC (pat), 0) != stack_pointer_rtx)
1047                 abort ();
1048
1049               /* This will now be transformed into a (set REG REG)
1050                  so we can just blow away all the other notes.  */
1051               XEXP (SET_SRC (pat), 1) = XEXP (note, 0);
1052               REG_NOTES (insn) = NULL_RTX;
1053             }
1054           else
1055             {
1056               /* setjmp was called, we must remove the REG_SAVE_AREA
1057                  note so that later passes do not get confused by its
1058                  presence.  */
1059               if (note == REG_NOTES (insn))
1060                 {
1061                   REG_NOTES (insn) = XEXP (note, 1);
1062                 }
1063               else
1064                 {
1065                   rtx srch;
1066
1067                   for (srch = REG_NOTES (insn); srch; srch = XEXP (srch, 1))
1068                     if (XEXP (srch, 1) == note)
1069                       break;
1070
1071                   if (srch == NULL_RTX)
1072                     abort();
1073
1074                   XEXP (srch, 1) = XEXP (note, 1);
1075                 }
1076             }
1077           /* Once we've seen the note of interest, we need not look at
1078              the rest of them.  */
1079           break;
1080         }
1081     }
1082 }
1083 #endif /* SETJMP_VIA_SAVE_AREA */
1084
1085 /* Return an rtx representing the address of an area of memory dynamically
1086    pushed on the stack.  This region of memory is always aligned to
1087    a multiple of BIGGEST_ALIGNMENT.
1088
1089    Any required stack pointer alignment is preserved.
1090
1091    SIZE is an rtx representing the size of the area.
1092    TARGET is a place in which the address can be placed.
1093
1094    KNOWN_ALIGN is the alignment (in bits) that we know SIZE has.  */
1095
1096 rtx
1097 allocate_dynamic_stack_space (size, target, known_align)
1098      rtx size;
1099      rtx target;
1100      int known_align;
1101 {
1102 #ifdef SETJMP_VIA_SAVE_AREA
1103   rtx setjmpless_size = NULL_RTX;
1104 #endif
1105
1106   /* If we're asking for zero bytes, it doesn't matter what we point
1107      to since we can't dereference it.  But return a reasonable
1108      address anyway.  */
1109   if (size == const0_rtx)
1110     return virtual_stack_dynamic_rtx;
1111
1112   /* Otherwise, show we're calling alloca or equivalent.  */
1113   current_function_calls_alloca = 1;
1114
1115   /* Ensure the size is in the proper mode.  */
1116   if (GET_MODE (size) != VOIDmode && GET_MODE (size) != Pmode)
1117     size = convert_to_mode (Pmode, size, 1);
1118
1119   /* We will need to ensure that the address we return is aligned to
1120      BIGGEST_ALIGNMENT.  If STACK_DYNAMIC_OFFSET is defined, we don't
1121      always know its final value at this point in the compilation (it 
1122      might depend on the size of the outgoing parameter lists, for
1123      example), so we must align the value to be returned in that case.
1124      (Note that STACK_DYNAMIC_OFFSET will have a default non-zero value if
1125      STACK_POINTER_OFFSET or ACCUMULATE_OUTGOING_ARGS are defined).
1126      We must also do an alignment operation on the returned value if
1127      the stack pointer alignment is less strict that BIGGEST_ALIGNMENT.
1128
1129      If we have to align, we must leave space in SIZE for the hole
1130      that might result from the alignment operation.  */
1131
1132 #if defined (STACK_DYNAMIC_OFFSET) || defined (STACK_POINTER_OFFSET) || ! defined (STACK_BOUNDARY)
1133 #define MUST_ALIGN 1
1134 #else
1135 #define MUST_ALIGN (STACK_BOUNDARY < BIGGEST_ALIGNMENT)
1136 #endif
1137
1138   if (MUST_ALIGN)
1139     {
1140       if (GET_CODE (size) == CONST_INT)
1141         size = GEN_INT (INTVAL (size)
1142                         + (BIGGEST_ALIGNMENT / BITS_PER_UNIT - 1));
1143       else
1144         size = expand_binop (Pmode, add_optab, size,
1145                              GEN_INT (BIGGEST_ALIGNMENT / BITS_PER_UNIT - 1),
1146                              NULL_RTX, 1, OPTAB_LIB_WIDEN);
1147     }
1148
1149 #ifdef SETJMP_VIA_SAVE_AREA
1150   /* If setjmp restores regs from a save area in the stack frame,
1151      avoid clobbering the reg save area.  Note that the offset of
1152      virtual_incoming_args_rtx includes the preallocated stack args space.
1153      It would be no problem to clobber that, but it's on the wrong side
1154      of the old save area.  */
1155   {
1156     rtx dynamic_offset
1157       = expand_binop (Pmode, sub_optab, virtual_stack_dynamic_rtx,
1158                       stack_pointer_rtx, NULL_RTX, 1, OPTAB_LIB_WIDEN);
1159
1160     if (!current_function_calls_setjmp)
1161       {
1162         int align = STACK_BOUNDARY / BITS_PER_UNIT;
1163
1164         /* See optimize_save_area_alloca to understand what is being
1165            set up here.  */
1166
1167 #if !defined(STACK_BOUNDARY) || !defined(MUST_ALIGN) || (STACK_BOUNDARY != BIGGEST_ALIGNMENT)
1168         /* If anyone creates a target with these characteristics, let them
1169            know that our optimization cannot work correctly in such a case.  */
1170         abort();
1171 #endif
1172
1173         if (GET_CODE (size) == CONST_INT)
1174           {
1175             int new = INTVAL (size) / align * align;
1176
1177             if (INTVAL (size) != new)
1178               setjmpless_size = GEN_INT (new);
1179             else
1180               setjmpless_size = size;
1181           }
1182         else
1183           {
1184             /* Since we know overflow is not possible, we avoid using
1185                CEIL_DIV_EXPR and use TRUNC_DIV_EXPR instead.  */
1186             setjmpless_size = expand_divmod (0, TRUNC_DIV_EXPR, Pmode, size,
1187                                              GEN_INT (align), NULL_RTX, 1);
1188             setjmpless_size = expand_mult (Pmode, setjmpless_size,
1189                                            GEN_INT (align), NULL_RTX, 1);
1190           }
1191         /* Our optimization works based upon being able to perform a simple
1192            transformation of this RTL into a (set REG REG) so make sure things
1193            did in fact end up in a REG.  */
1194         if (!arith_operand (setjmpless_size, Pmode))
1195           setjmpless_size = force_reg (Pmode, setjmpless_size);
1196       }
1197
1198     size = expand_binop (Pmode, add_optab, size, dynamic_offset,
1199                          NULL_RTX, 1, OPTAB_LIB_WIDEN);
1200   }
1201 #endif /* SETJMP_VIA_SAVE_AREA */
1202
1203   /* Round the size to a multiple of the required stack alignment.
1204      Since the stack if presumed to be rounded before this allocation,
1205      this will maintain the required alignment.
1206
1207      If the stack grows downward, we could save an insn by subtracting
1208      SIZE from the stack pointer and then aligning the stack pointer.
1209      The problem with this is that the stack pointer may be unaligned
1210      between the execution of the subtraction and alignment insns and
1211      some machines do not allow this.  Even on those that do, some
1212      signal handlers malfunction if a signal should occur between those
1213      insns.  Since this is an extremely rare event, we have no reliable
1214      way of knowing which systems have this problem.  So we avoid even
1215      momentarily mis-aligning the stack.  */
1216
1217 #ifdef STACK_BOUNDARY
1218   /* If we added a variable amount to SIZE,
1219      we can no longer assume it is aligned.  */
1220 #if !defined (SETJMP_VIA_SAVE_AREA)
1221   if (MUST_ALIGN || known_align % STACK_BOUNDARY != 0)
1222 #endif
1223     size = round_push (size);
1224 #endif
1225
1226   do_pending_stack_adjust ();
1227
1228   /* If needed, check that we have the required amount of stack.  Take into
1229      account what has already been checked.  */
1230   if (flag_stack_check && ! STACK_CHECK_BUILTIN)
1231     probe_stack_range (STACK_CHECK_MAX_FRAME_SIZE + STACK_CHECK_PROTECT, size);
1232
1233   /* Don't use a TARGET that isn't a pseudo.  */
1234   if (target == 0 || GET_CODE (target) != REG
1235       || REGNO (target) < FIRST_PSEUDO_REGISTER)
1236     target = gen_reg_rtx (Pmode);
1237
1238   mark_reg_pointer (target, known_align / BITS_PER_UNIT);
1239
1240   /* Perform the required allocation from the stack.  Some systems do
1241      this differently than simply incrementing/decrementing from the
1242      stack pointer, such as acquiring the space by calling malloc().  */
1243 #ifdef HAVE_allocate_stack
1244   if (HAVE_allocate_stack)
1245     {
1246       enum machine_mode mode;
1247
1248       if (insn_operand_predicate[(int) CODE_FOR_allocate_stack][0]
1249           && ! ((*insn_operand_predicate[(int) CODE_FOR_allocate_stack][0])
1250                 (target, Pmode)))
1251         target = copy_to_mode_reg (Pmode, target);
1252       mode = insn_operand_mode[(int) CODE_FOR_allocate_stack][1];
1253       size = convert_modes (mode, ptr_mode, size, 1);
1254       if (insn_operand_predicate[(int) CODE_FOR_allocate_stack][1]
1255           && ! ((*insn_operand_predicate[(int) CODE_FOR_allocate_stack][1])
1256                 (size, mode)))
1257         size = copy_to_mode_reg (mode, size);
1258
1259       emit_insn (gen_allocate_stack (target, size));
1260     }
1261   else
1262 #endif
1263     {
1264 #ifndef STACK_GROWS_DOWNWARD
1265       emit_move_insn (target, virtual_stack_dynamic_rtx);
1266 #endif
1267       size = convert_modes (Pmode, ptr_mode, size, 1);
1268       anti_adjust_stack (size);
1269 #ifdef SETJMP_VIA_SAVE_AREA
1270       if (setjmpless_size != NULL_RTX)
1271         {
1272           rtx note_target = get_last_insn ();
1273
1274           REG_NOTES (note_target) = gen_rtx (EXPR_LIST, REG_SAVE_AREA,
1275                                              setjmpless_size,
1276                                              REG_NOTES (note_target));
1277         }
1278 #endif /* SETJMP_VIA_SAVE_AREA */
1279 #ifdef STACK_GROWS_DOWNWARD
1280   emit_move_insn (target, virtual_stack_dynamic_rtx);
1281 #endif
1282     }
1283
1284   if (MUST_ALIGN)
1285     {
1286       /* CEIL_DIV_EXPR needs to worry about the addition overflowing,
1287          but we know it can't.  So add ourselves and then do
1288          TRUNC_DIV_EXPR.  */
1289       target = expand_binop (Pmode, add_optab, target,
1290                              GEN_INT (BIGGEST_ALIGNMENT / BITS_PER_UNIT - 1),
1291                              NULL_RTX, 1, OPTAB_LIB_WIDEN);
1292       target = expand_divmod (0, TRUNC_DIV_EXPR, Pmode, target,
1293                               GEN_INT (BIGGEST_ALIGNMENT / BITS_PER_UNIT),
1294                               NULL_RTX, 1);
1295       target = expand_mult (Pmode, target,
1296                             GEN_INT (BIGGEST_ALIGNMENT / BITS_PER_UNIT),
1297                             NULL_RTX, 1);
1298     }
1299   
1300   /* Some systems require a particular insn to refer to the stack
1301      to make the pages exist.  */
1302 #ifdef HAVE_probe
1303   if (HAVE_probe)
1304     emit_insn (gen_probe ());
1305 #endif
1306
1307   /* Record the new stack level for nonlocal gotos.  */
1308   if (nonlocal_goto_handler_slot != 0)
1309     emit_stack_save (SAVE_NONLOCAL, &nonlocal_goto_stack_level, NULL_RTX);
1310
1311   return target;
1312 }
1313 \f
1314 /* Emit one stack probe at ADDRESS, an address within the stack.  */
1315
1316 static void
1317 emit_stack_probe (address)
1318      rtx address;
1319 {
1320   rtx memref = gen_rtx_MEM (word_mode, address);
1321
1322   MEM_VOLATILE_P (memref) = 1;
1323
1324   if (STACK_CHECK_PROBE_LOAD)
1325     emit_move_insn (gen_reg_rtx (word_mode), memref);
1326   else
1327     emit_move_insn (memref, const0_rtx);
1328 }
1329
1330 /* Probe a range of stack addresses from FIRST to FIRST+SIZE, inclusive. 
1331    FIRST is a constant and size is a Pmode RTX.  These are offsets from the
1332    current stack pointer.  STACK_GROWS_DOWNWARD says whether to add or
1333    subtract from the stack.  If SIZE is constant, this is done
1334    with a fixed number of probes.  Otherwise, we must make a loop.  */
1335
1336 #ifdef STACK_GROWS_DOWNWARD
1337 #define STACK_GROW_OP MINUS
1338 #else
1339 #define STACK_GROW_OP PLUS
1340 #endif
1341
1342 void
1343 probe_stack_range (first, size)
1344      HOST_WIDE_INT first;
1345      rtx size;
1346 {
1347   /* First see if we have an insn to check the stack.  Use it if so.  */
1348 #ifdef HAVE_check_stack
1349   if (HAVE_check_stack)
1350     {
1351       rtx last_addr
1352         = force_operand (gen_rtx_STACK_GROW_OP (Pmode,
1353                                                 stack_pointer_rtx,
1354                                                 plus_constant (size, first)),
1355                          NULL_RTX);
1356
1357       if (insn_operand_predicate[(int) CODE_FOR_check_stack][0]
1358           && ! ((*insn_operand_predicate[(int) CODE_FOR_check_stack][0])
1359                 (last_address, Pmode)))
1360         last_address = copy_to_mode_reg (Pmode, last_address);
1361
1362       emit_insn (gen_check_stack (last_address));
1363       return;
1364     }
1365 #endif
1366
1367   /* If we have to generate explicit probes, see if we have a constant
1368      small number of them to generate.  If so, that's the easy case.  */
1369   if (GET_CODE (size) == CONST_INT
1370       && INTVAL (size) < 10 * STACK_CHECK_PROBE_INTERVAL)
1371     {
1372       HOST_WIDE_INT offset;
1373
1374       /* Start probing at FIRST + N * STACK_CHECK_PROBE_INTERVAL
1375          for values of N from 1 until it exceeds LAST.  If only one
1376          probe is needed, this will not generate any code.  Then probe
1377          at LAST.  */
1378       for (offset = first + STACK_CHECK_PROBE_INTERVAL;
1379            offset < INTVAL (size);
1380            offset = offset + STACK_CHECK_PROBE_INTERVAL)
1381         emit_stack_probe (gen_rtx_fmt_ee (STACK_GROW_OP, Pmode,
1382                                           stack_pointer_rtx,
1383                                           GEN_INT (offset)));
1384
1385       emit_stack_probe (gen_rtx_fmt_ee (STACK_GROW_OP, Pmode,
1386                                         stack_pointer_rtx,
1387                                         plus_constant (size, first)));
1388     }
1389
1390   /* In the variable case, do the same as above, but in a loop.  We emit loop
1391      notes so that loop optimization can be done.  */
1392   else
1393     {
1394       rtx test_addr
1395         = force_operand (gen_rtx_fmt_ee (STACK_GROW_OP, Pmode,
1396                                          stack_pointer_rtx,
1397                                          GEN_INT (first + STACK_CHECK_PROBE_INTERVAL)),
1398                          NULL_RTX);
1399       rtx last_addr
1400         = force_operand (gen_rtx_fmt_ee (STACK_GROW_OP, Pmode,
1401                                          stack_pointer_rtx,
1402                                          plus_constant (size, first)),
1403                          NULL_RTX);
1404       rtx incr = GEN_INT (STACK_CHECK_PROBE_INTERVAL);
1405       rtx loop_lab = gen_label_rtx ();
1406       rtx test_lab = gen_label_rtx ();
1407       rtx end_lab = gen_label_rtx ();
1408       rtx temp;
1409
1410       if (GET_CODE (test_addr) != REG
1411           || REGNO (test_addr) < FIRST_PSEUDO_REGISTER)
1412         test_addr = force_reg (Pmode, test_addr);
1413
1414       emit_note (NULL_PTR, NOTE_INSN_LOOP_BEG);
1415       emit_jump (test_lab);
1416
1417       emit_label (loop_lab);
1418       emit_stack_probe (test_addr);
1419
1420       emit_note (NULL_PTR, NOTE_INSN_LOOP_CONT);
1421
1422 #ifdef STACK_GROWS_DOWNWARD
1423 #define CMP_OPCODE GTU
1424       temp = expand_binop (Pmode, sub_optab, test_addr, incr, test_addr,
1425                            1, OPTAB_WIDEN);
1426 #else
1427 #define CMP_OPCODE LTU
1428       temp = expand_binop (Pmode, add_optab, test_addr, incr, test_addr,
1429                            1, OPTAB_WIDEN);
1430 #endif
1431
1432       if (temp != test_addr)
1433         abort ();
1434
1435       emit_label (test_lab);
1436       emit_cmp_insn (test_addr, last_addr, CMP_OPCODE, NULL_RTX, Pmode, 1, 0);
1437       emit_jump_insn ((*bcc_gen_fctn[(int) CMP_OPCODE]) (loop_lab));
1438       emit_jump (end_lab);
1439       emit_note (NULL_PTR, NOTE_INSN_LOOP_END);
1440       emit_label (end_lab);
1441
1442       /* If will be doing stupid optimization, show test_addr is still live. */
1443       if (obey_regdecls)
1444         emit_insn (gen_rtx_USE (VOIDmode, test_addr));
1445
1446       emit_stack_probe (last_addr);
1447     }
1448 }
1449 \f
1450 /* Return an rtx representing the register or memory location
1451    in which a scalar value of data type VALTYPE
1452    was returned by a function call to function FUNC.
1453    FUNC is a FUNCTION_DECL node if the precise function is known,
1454    otherwise 0.  */
1455
1456 rtx
1457 hard_function_value (valtype, func)
1458      tree valtype;
1459      tree func;
1460 {
1461   rtx val = FUNCTION_VALUE (valtype, func);
1462   if (GET_CODE (val) == REG
1463       && GET_MODE (val) == BLKmode)
1464     {
1465       int bytes = int_size_in_bytes (valtype);
1466       enum machine_mode tmpmode;
1467       for (tmpmode = GET_CLASS_NARROWEST_MODE (MODE_INT);
1468            tmpmode != MAX_MACHINE_MODE;
1469            tmpmode = GET_MODE_WIDER_MODE (tmpmode))
1470         {
1471           /* Have we found a large enough mode?  */
1472           if (GET_MODE_SIZE (tmpmode) >= bytes)
1473             break;
1474         }
1475
1476       /* No suitable mode found.  */
1477       if (tmpmode == MAX_MACHINE_MODE)
1478         abort ();
1479
1480       PUT_MODE (val, tmpmode);
1481     }      
1482   return val;
1483 }
1484
1485 /* Return an rtx representing the register or memory location
1486    in which a scalar value of mode MODE was returned by a library call.  */
1487
1488 rtx
1489 hard_libcall_value (mode)
1490      enum machine_mode mode;
1491 {
1492   return LIBCALL_VALUE (mode);
1493 }
1494
1495 /* Look up the tree code for a given rtx code
1496    to provide the arithmetic operation for REAL_ARITHMETIC.
1497    The function returns an int because the caller may not know
1498    what `enum tree_code' means.  */
1499
1500 int
1501 rtx_to_tree_code (code)
1502      enum rtx_code code;
1503 {
1504   enum tree_code tcode;
1505
1506   switch (code)
1507     {
1508     case PLUS:
1509       tcode = PLUS_EXPR;
1510       break;
1511     case MINUS:
1512       tcode = MINUS_EXPR;
1513       break;
1514     case MULT:
1515       tcode = MULT_EXPR;
1516       break;
1517     case DIV:
1518       tcode = RDIV_EXPR;
1519       break;
1520     case SMIN:
1521       tcode = MIN_EXPR;
1522       break;
1523     case SMAX:
1524       tcode = MAX_EXPR;
1525       break;
1526     default:
1527       tcode = LAST_AND_UNUSED_TREE_CODE;
1528       break;
1529     }
1530   return ((int) tcode);
1531 }