OSDN Git Service

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