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