OSDN Git Service

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