calls.c (expand_call): Pass bit alignment to mark_reg_pointer.
[platform/upstream/gcc.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       if (GET_CODE (temp) != REG)
648         temp = copy_to_reg (temp);
649       mem = gen_rtx_MEM (GET_MODE (x), temp);
650
651       /* Mark returned memref with in_struct if it's in an array or
652          structure.  Copy const and volatile from original memref.  */
653
654       RTX_UNCHANGING_P (mem) = RTX_UNCHANGING_P (x);
655       MEM_COPY_ATTRIBUTES (mem, x);
656       if (GET_CODE (addr) == PLUS)
657         MEM_SET_IN_STRUCT_P (mem, 1);
658
659       /* Since the new MEM is just like the old X, it can alias only
660          the things that X could.  */
661       MEM_ALIAS_SET (mem) = MEM_ALIAS_SET (x);
662
663       return mem;
664     }
665   return x;
666 }
667 \f
668 /* Copy the value or contents of X to a new temp reg and return that reg.  */
669
670 rtx
671 copy_to_reg (x)
672      rtx x;
673 {
674   register rtx temp = gen_reg_rtx (GET_MODE (x));
675  
676   /* If not an operand, must be an address with PLUS and MULT so
677      do the computation.  */ 
678   if (! general_operand (x, VOIDmode))
679     x = force_operand (x, temp);
680   
681   if (x != temp)
682     emit_move_insn (temp, x);
683
684   return temp;
685 }
686
687 /* Like copy_to_reg but always give the new register mode Pmode
688    in case X is a constant.  */
689
690 rtx
691 copy_addr_to_reg (x)
692      rtx x;
693 {
694   return copy_to_mode_reg (Pmode, x);
695 }
696
697 /* Like copy_to_reg but always give the new register mode MODE
698    in case X is a constant.  */
699
700 rtx
701 copy_to_mode_reg (mode, x)
702      enum machine_mode mode;
703      rtx x;
704 {
705   register rtx temp = gen_reg_rtx (mode);
706   
707   /* If not an operand, must be an address with PLUS and MULT so
708      do the computation.  */ 
709   if (! general_operand (x, VOIDmode))
710     x = force_operand (x, temp);
711
712   if (GET_MODE (x) != mode && GET_MODE (x) != VOIDmode)
713     abort ();
714   if (x != temp)
715     emit_move_insn (temp, x);
716   return temp;
717 }
718
719 /* Load X into a register if it is not already one.
720    Use mode MODE for the register.
721    X should be valid for mode MODE, but it may be a constant which
722    is valid for all integer modes; that's why caller must specify MODE.
723
724    The caller must not alter the value in the register we return,
725    since we mark it as a "constant" register.  */
726
727 rtx
728 force_reg (mode, x)
729      enum machine_mode mode;
730      rtx x;
731 {
732   register rtx temp, insn, set;
733
734   if (GET_CODE (x) == REG)
735     return x;
736   
737   temp = gen_reg_rtx (mode);
738   
739   if (! general_operand (x, mode))
740     x = force_operand (x, NULL_RTX);
741   
742   insn = emit_move_insn (temp, x);
743
744   /* Let optimizers know that TEMP's value never changes
745      and that X can be substituted for it.  Don't get confused
746      if INSN set something else (such as a SUBREG of TEMP).  */
747   if (CONSTANT_P (x)
748       && (set = single_set (insn)) != 0
749       && SET_DEST (set) == temp)
750     {
751       rtx note = find_reg_note (insn, REG_EQUAL, NULL_RTX);
752
753       if (note)
754         XEXP (note, 0) = x;
755       else
756         REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_EQUAL, x, REG_NOTES (insn));
757     }
758   return temp;
759 }
760
761 /* If X is a memory ref, copy its contents to a new temp reg and return
762    that reg.  Otherwise, return X.  */
763
764 rtx
765 force_not_mem (x)
766      rtx x;
767 {
768   register rtx temp;
769   if (GET_CODE (x) != MEM || GET_MODE (x) == BLKmode)
770     return x;
771   temp = gen_reg_rtx (GET_MODE (x));
772   emit_move_insn (temp, x);
773   return temp;
774 }
775
776 /* Copy X to TARGET (if it's nonzero and a reg)
777    or to a new temp reg and return that reg.
778    MODE is the mode to use for X in case it is a constant.  */
779
780 rtx
781 copy_to_suggested_reg (x, target, mode)
782      rtx x, target;
783      enum machine_mode mode;
784 {
785   register rtx temp;
786
787   if (target && GET_CODE (target) == REG)
788     temp = target;
789   else
790     temp = gen_reg_rtx (mode);
791
792   emit_move_insn (temp, x);
793   return temp;
794 }
795 \f
796 /* Return the mode to use to store a scalar of TYPE and MODE.
797    PUNSIGNEDP points to the signedness of the type and may be adjusted
798    to show what signedness to use on extension operations.
799
800    FOR_CALL is non-zero if this call is promoting args for a call.  */
801
802 enum machine_mode
803 promote_mode (type, mode, punsignedp, for_call)
804      tree type;
805      enum machine_mode mode;
806      int *punsignedp;
807      int for_call ATTRIBUTE_UNUSED;
808 {
809   enum tree_code code = TREE_CODE (type);
810   int unsignedp = *punsignedp;
811
812 #ifdef PROMOTE_FOR_CALL_ONLY
813   if (! for_call)
814     return mode;
815 #endif
816
817   switch (code)
818     {
819 #ifdef PROMOTE_MODE
820     case INTEGER_TYPE:   case ENUMERAL_TYPE:   case BOOLEAN_TYPE:
821     case CHAR_TYPE:      case REAL_TYPE:       case OFFSET_TYPE:
822       PROMOTE_MODE (mode, unsignedp, type);
823       break;
824 #endif
825
826 #ifdef POINTERS_EXTEND_UNSIGNED
827     case REFERENCE_TYPE:
828     case POINTER_TYPE:
829       mode = Pmode;
830       unsignedp = POINTERS_EXTEND_UNSIGNED;
831       break;
832 #endif
833       
834     default:
835       break;
836     }
837
838   *punsignedp = unsignedp;
839   return mode;
840 }
841 \f
842 /* Adjust the stack pointer by ADJUST (an rtx for a number of bytes).
843    This pops when ADJUST is positive.  ADJUST need not be constant.  */
844
845 void
846 adjust_stack (adjust)
847      rtx adjust;
848 {
849   rtx temp;
850   adjust = protect_from_queue (adjust, 0);
851
852   if (adjust == const0_rtx)
853     return;
854
855   temp = expand_binop (Pmode,
856 #ifdef STACK_GROWS_DOWNWARD
857                        add_optab,
858 #else
859                        sub_optab,
860 #endif
861                        stack_pointer_rtx, adjust, stack_pointer_rtx, 0,
862                        OPTAB_LIB_WIDEN);
863
864   if (temp != stack_pointer_rtx)
865     emit_move_insn (stack_pointer_rtx, temp);
866 }
867
868 /* Adjust the stack pointer by minus ADJUST (an rtx for a number of bytes).
869    This pushes when ADJUST is positive.  ADJUST need not be constant.  */
870
871 void
872 anti_adjust_stack (adjust)
873      rtx adjust;
874 {
875   rtx temp;
876   adjust = protect_from_queue (adjust, 0);
877
878   if (adjust == const0_rtx)
879     return;
880
881   temp = expand_binop (Pmode,
882 #ifdef STACK_GROWS_DOWNWARD
883                        sub_optab,
884 #else
885                        add_optab,
886 #endif
887                        stack_pointer_rtx, adjust, stack_pointer_rtx, 0,
888                        OPTAB_LIB_WIDEN);
889
890   if (temp != stack_pointer_rtx)
891     emit_move_insn (stack_pointer_rtx, temp);
892 }
893
894 /* Round the size of a block to be pushed up to the boundary required
895    by this machine.  SIZE is the desired size, which need not be constant.  */
896
897 rtx
898 round_push (size)
899      rtx size;
900 {
901 #ifdef PREFERRED_STACK_BOUNDARY
902   int align = PREFERRED_STACK_BOUNDARY / BITS_PER_UNIT;
903   if (align == 1)
904     return size;
905   if (GET_CODE (size) == CONST_INT)
906     {
907       int new = (INTVAL (size) + align - 1) / align * align;
908       if (INTVAL (size) != new)
909         size = GEN_INT (new);
910     }
911   else
912     {
913       /* CEIL_DIV_EXPR needs to worry about the addition overflowing,
914          but we know it can't.  So add ourselves and then do
915          TRUNC_DIV_EXPR.  */
916       size = expand_binop (Pmode, add_optab, size, GEN_INT (align - 1),
917                            NULL_RTX, 1, OPTAB_LIB_WIDEN);
918       size = expand_divmod (0, TRUNC_DIV_EXPR, Pmode, size, GEN_INT (align),
919                             NULL_RTX, 1);
920       size = expand_mult (Pmode, size, GEN_INT (align), NULL_RTX, 1);
921     }
922 #endif /* PREFERRED_STACK_BOUNDARY */
923   return size;
924 }
925 \f
926 /* Save the stack pointer for the purpose in SAVE_LEVEL.  PSAVE is a pointer
927    to a previously-created save area.  If no save area has been allocated,
928    this function will allocate one.  If a save area is specified, it
929    must be of the proper mode.
930
931    The insns are emitted after insn AFTER, if nonzero, otherwise the insns
932    are emitted at the current position.  */
933
934 void
935 emit_stack_save (save_level, psave, after)
936      enum save_level save_level;
937      rtx *psave;
938      rtx after;
939 {
940   rtx sa = *psave;
941   /* The default is that we use a move insn and save in a Pmode object.  */
942   rtx (*fcn) PARAMS ((rtx, rtx)) = gen_move_insn;
943   enum machine_mode mode = STACK_SAVEAREA_MODE (save_level);
944
945   /* See if this machine has anything special to do for this kind of save.  */
946   switch (save_level)
947     {
948 #ifdef HAVE_save_stack_block
949     case SAVE_BLOCK:
950       if (HAVE_save_stack_block)
951         fcn = gen_save_stack_block;
952       break;
953 #endif
954 #ifdef HAVE_save_stack_function
955     case SAVE_FUNCTION:
956       if (HAVE_save_stack_function)
957         fcn = gen_save_stack_function;
958       break;
959 #endif
960 #ifdef HAVE_save_stack_nonlocal
961     case SAVE_NONLOCAL:
962       if (HAVE_save_stack_nonlocal)
963         fcn = gen_save_stack_nonlocal;
964       break;
965 #endif
966     default:
967       break;
968     }
969
970   /* If there is no save area and we have to allocate one, do so.  Otherwise
971      verify the save area is the proper mode.  */
972
973   if (sa == 0)
974     {
975       if (mode != VOIDmode)
976         {
977           if (save_level == SAVE_NONLOCAL)
978             *psave = sa = assign_stack_local (mode, GET_MODE_SIZE (mode), 0);
979           else
980             *psave = sa = gen_reg_rtx (mode);
981         }
982     }
983   else
984     {
985       if (mode == VOIDmode || GET_MODE (sa) != mode)
986         abort ();
987     }
988
989   if (after)
990     {
991       rtx seq;
992
993       start_sequence ();
994       /* We must validize inside the sequence, to ensure that any instructions
995          created by the validize call also get moved to the right place.  */
996       if (sa != 0)
997         sa = validize_mem (sa);
998       emit_insn (fcn (sa, stack_pointer_rtx));
999       seq = gen_sequence ();
1000       end_sequence ();
1001       emit_insn_after (seq, after);
1002     }
1003   else
1004     {
1005       if (sa != 0)
1006         sa = validize_mem (sa);
1007       emit_insn (fcn (sa, stack_pointer_rtx));
1008     }
1009 }
1010
1011 /* Restore the stack pointer for the purpose in SAVE_LEVEL.  SA is the save
1012    area made by emit_stack_save.  If it is zero, we have nothing to do. 
1013
1014    Put any emitted insns after insn AFTER, if nonzero, otherwise at 
1015    current position.  */
1016
1017 void
1018 emit_stack_restore (save_level, sa, after)
1019      enum save_level save_level;
1020      rtx after;
1021      rtx sa;
1022 {
1023   /* The default is that we use a move insn.  */
1024   rtx (*fcn) PARAMS ((rtx, rtx)) = gen_move_insn;
1025
1026   /* See if this machine has anything special to do for this kind of save.  */
1027   switch (save_level)
1028     {
1029 #ifdef HAVE_restore_stack_block
1030     case SAVE_BLOCK:
1031       if (HAVE_restore_stack_block)
1032         fcn = gen_restore_stack_block;
1033       break;
1034 #endif
1035 #ifdef HAVE_restore_stack_function
1036     case SAVE_FUNCTION:
1037       if (HAVE_restore_stack_function)
1038         fcn = gen_restore_stack_function;
1039       break;
1040 #endif
1041 #ifdef HAVE_restore_stack_nonlocal
1042     case SAVE_NONLOCAL:
1043       if (HAVE_restore_stack_nonlocal)
1044         fcn = gen_restore_stack_nonlocal;
1045       break;
1046 #endif
1047     default:
1048       break;
1049     }
1050
1051   if (sa != 0)
1052     sa = validize_mem (sa);
1053
1054   if (after)
1055     {
1056       rtx seq;
1057
1058       start_sequence ();
1059       emit_insn (fcn (stack_pointer_rtx, sa));
1060       seq = gen_sequence ();
1061       end_sequence ();
1062       emit_insn_after (seq, after);
1063     }
1064   else
1065     emit_insn (fcn (stack_pointer_rtx, sa));
1066 }
1067 \f
1068 #ifdef SETJMP_VIA_SAVE_AREA
1069 /* Optimize RTL generated by allocate_dynamic_stack_space for targets
1070    where SETJMP_VIA_SAVE_AREA is true.  The problem is that on these
1071    platforms, the dynamic stack space used can corrupt the original
1072    frame, thus causing a crash if a longjmp unwinds to it.  */
1073
1074 void
1075 optimize_save_area_alloca (insns)
1076      rtx insns;
1077 {
1078   rtx insn;
1079
1080   for (insn = insns; insn; insn = NEXT_INSN(insn))
1081     {
1082       rtx note;
1083
1084       if (GET_CODE (insn) != INSN)
1085         continue;
1086
1087       for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1088         {
1089           if (REG_NOTE_KIND (note) != REG_SAVE_AREA)
1090             continue;
1091
1092           if (!current_function_calls_setjmp)
1093             {
1094               rtx pat = PATTERN (insn);
1095
1096               /* If we do not see the note in a pattern matching
1097                  these precise characteristics, we did something
1098                  entirely wrong in allocate_dynamic_stack_space. 
1099
1100                  Note, one way this could happen is if SETJMP_VIA_SAVE_AREA
1101                  was defined on a machine where stacks grow towards higher
1102                  addresses.
1103
1104                  Right now only supported port with stack that grow upward
1105                  is the HPPA and it does not define SETJMP_VIA_SAVE_AREA.  */
1106               if (GET_CODE (pat) != SET
1107                   || SET_DEST (pat) != stack_pointer_rtx
1108                   || GET_CODE (SET_SRC (pat)) != MINUS
1109                   || XEXP (SET_SRC (pat), 0) != stack_pointer_rtx)
1110                 abort ();
1111
1112               /* This will now be transformed into a (set REG REG)
1113                  so we can just blow away all the other notes.  */
1114               XEXP (SET_SRC (pat), 1) = XEXP (note, 0);
1115               REG_NOTES (insn) = NULL_RTX;
1116             }
1117           else
1118             {
1119               /* setjmp was called, we must remove the REG_SAVE_AREA
1120                  note so that later passes do not get confused by its
1121                  presence.  */
1122               if (note == REG_NOTES (insn))
1123                 {
1124                   REG_NOTES (insn) = XEXP (note, 1);
1125                 }
1126               else
1127                 {
1128                   rtx srch;
1129
1130                   for (srch = REG_NOTES (insn); srch; srch = XEXP (srch, 1))
1131                     if (XEXP (srch, 1) == note)
1132                       break;
1133
1134                   if (srch == NULL_RTX)
1135                     abort();
1136
1137                   XEXP (srch, 1) = XEXP (note, 1);
1138                 }
1139             }
1140           /* Once we've seen the note of interest, we need not look at
1141              the rest of them.  */
1142           break;
1143         }
1144     }
1145 }
1146 #endif /* SETJMP_VIA_SAVE_AREA */
1147
1148 /* Return an rtx representing the address of an area of memory dynamically
1149    pushed on the stack.  This region of memory is always aligned to
1150    a multiple of BIGGEST_ALIGNMENT.
1151
1152    Any required stack pointer alignment is preserved.
1153
1154    SIZE is an rtx representing the size of the area.
1155    TARGET is a place in which the address can be placed.
1156
1157    KNOWN_ALIGN is the alignment (in bits) that we know SIZE has.  */
1158
1159 rtx
1160 allocate_dynamic_stack_space (size, target, known_align)
1161      rtx size;
1162      rtx target;
1163      int known_align;
1164 {
1165 #ifdef SETJMP_VIA_SAVE_AREA
1166   rtx setjmpless_size = NULL_RTX;
1167 #endif
1168
1169   /* If we're asking for zero bytes, it doesn't matter what we point
1170      to since we can't dereference it.  But return a reasonable
1171      address anyway.  */
1172   if (size == const0_rtx)
1173     return virtual_stack_dynamic_rtx;
1174
1175   /* Otherwise, show we're calling alloca or equivalent.  */
1176   current_function_calls_alloca = 1;
1177
1178   /* Ensure the size is in the proper mode.  */
1179   if (GET_MODE (size) != VOIDmode && GET_MODE (size) != Pmode)
1180     size = convert_to_mode (Pmode, size, 1);
1181
1182   /* We can't attempt to minimize alignment necessary, because we don't
1183      know the final value of preferred_stack_boundary yet while executing
1184      this code.  */
1185 #ifdef PREFERRED_STACK_BOUNDARY
1186   cfun->preferred_stack_boundary = PREFERRED_STACK_BOUNDARY;
1187 #endif
1188
1189   /* We will need to ensure that the address we return is aligned to
1190      BIGGEST_ALIGNMENT.  If STACK_DYNAMIC_OFFSET is defined, we don't
1191      always know its final value at this point in the compilation (it 
1192      might depend on the size of the outgoing parameter lists, for
1193      example), so we must align the value to be returned in that case.
1194      (Note that STACK_DYNAMIC_OFFSET will have a default non-zero value if
1195      STACK_POINTER_OFFSET or ACCUMULATE_OUTGOING_ARGS are defined).
1196      We must also do an alignment operation on the returned value if
1197      the stack pointer alignment is less strict that BIGGEST_ALIGNMENT.
1198
1199      If we have to align, we must leave space in SIZE for the hole
1200      that might result from the alignment operation.  */
1201
1202 #if defined (STACK_DYNAMIC_OFFSET) || defined (STACK_POINTER_OFFSET) || ! defined (PREFERRED_STACK_BOUNDARY)
1203 #define MUST_ALIGN 1
1204 #else
1205 #define MUST_ALIGN (PREFERRED_STACK_BOUNDARY < BIGGEST_ALIGNMENT)
1206 #endif
1207
1208   if (MUST_ALIGN)
1209     {
1210       if (GET_CODE (size) == CONST_INT)
1211         size = GEN_INT (INTVAL (size)
1212                         + (BIGGEST_ALIGNMENT / BITS_PER_UNIT - 1));
1213       else
1214         size = expand_binop (Pmode, add_optab, size,
1215                              GEN_INT (BIGGEST_ALIGNMENT / BITS_PER_UNIT - 1),
1216                              NULL_RTX, 1, OPTAB_LIB_WIDEN);
1217     }
1218
1219 #ifdef SETJMP_VIA_SAVE_AREA
1220   /* If setjmp restores regs from a save area in the stack frame,
1221      avoid clobbering the reg save area.  Note that the offset of
1222      virtual_incoming_args_rtx includes the preallocated stack args space.
1223      It would be no problem to clobber that, but it's on the wrong side
1224      of the old save area.  */
1225   {
1226     rtx dynamic_offset
1227       = expand_binop (Pmode, sub_optab, virtual_stack_dynamic_rtx,
1228                       stack_pointer_rtx, NULL_RTX, 1, OPTAB_LIB_WIDEN);
1229
1230     if (!current_function_calls_setjmp)
1231       {
1232         int align = PREFERRED_STACK_BOUNDARY / BITS_PER_UNIT;
1233
1234         /* See optimize_save_area_alloca to understand what is being
1235            set up here.  */
1236
1237 #if !defined(PREFERRED_STACK_BOUNDARY) || !defined(MUST_ALIGN) || (PREFERRED_STACK_BOUNDARY != BIGGEST_ALIGNMENT)
1238         /* If anyone creates a target with these characteristics, let them
1239            know that our optimization cannot work correctly in such a case.  */
1240         abort();
1241 #endif
1242
1243         if (GET_CODE (size) == CONST_INT)
1244           {
1245             int new = INTVAL (size) / align * align;
1246
1247             if (INTVAL (size) != new)
1248               setjmpless_size = GEN_INT (new);
1249             else
1250               setjmpless_size = size;
1251           }
1252         else
1253           {
1254             /* Since we know overflow is not possible, we avoid using
1255                CEIL_DIV_EXPR and use TRUNC_DIV_EXPR instead.  */
1256             setjmpless_size = expand_divmod (0, TRUNC_DIV_EXPR, Pmode, size,
1257                                              GEN_INT (align), NULL_RTX, 1);
1258             setjmpless_size = expand_mult (Pmode, setjmpless_size,
1259                                            GEN_INT (align), NULL_RTX, 1);
1260           }
1261         /* Our optimization works based upon being able to perform a simple
1262            transformation of this RTL into a (set REG REG) so make sure things
1263            did in fact end up in a REG.  */
1264         if (!register_operand (setjmpless_size, Pmode))
1265           setjmpless_size = force_reg (Pmode, setjmpless_size);
1266       }
1267
1268     size = expand_binop (Pmode, add_optab, size, dynamic_offset,
1269                          NULL_RTX, 1, OPTAB_LIB_WIDEN);
1270   }
1271 #endif /* SETJMP_VIA_SAVE_AREA */
1272
1273   /* Round the size to a multiple of the required stack alignment.
1274      Since the stack if presumed to be rounded before this allocation,
1275      this will maintain the required alignment.
1276
1277      If the stack grows downward, we could save an insn by subtracting
1278      SIZE from the stack pointer and then aligning the stack pointer.
1279      The problem with this is that the stack pointer may be unaligned
1280      between the execution of the subtraction and alignment insns and
1281      some machines do not allow this.  Even on those that do, some
1282      signal handlers malfunction if a signal should occur between those
1283      insns.  Since this is an extremely rare event, we have no reliable
1284      way of knowing which systems have this problem.  So we avoid even
1285      momentarily mis-aligning the stack.  */
1286
1287 #ifdef PREFERRED_STACK_BOUNDARY
1288   /* If we added a variable amount to SIZE,
1289      we can no longer assume it is aligned.  */
1290 #if !defined (SETJMP_VIA_SAVE_AREA)
1291   if (MUST_ALIGN || known_align % PREFERRED_STACK_BOUNDARY != 0)
1292 #endif
1293     size = round_push (size);
1294 #endif
1295
1296   do_pending_stack_adjust ();
1297
1298   /* If needed, check that we have the required amount of stack.  Take into
1299      account what has already been checked.  */
1300   if (flag_stack_check && ! STACK_CHECK_BUILTIN)
1301     probe_stack_range (STACK_CHECK_MAX_FRAME_SIZE + STACK_CHECK_PROTECT, size);
1302
1303   /* Don't use a TARGET that isn't a pseudo.  */
1304   if (target == 0 || GET_CODE (target) != REG
1305       || REGNO (target) < FIRST_PSEUDO_REGISTER)
1306     target = gen_reg_rtx (Pmode);
1307
1308   mark_reg_pointer (target, known_align);
1309
1310   /* Perform the required allocation from the stack.  Some systems do
1311      this differently than simply incrementing/decrementing from the
1312      stack pointer, such as acquiring the space by calling malloc().  */
1313 #ifdef HAVE_allocate_stack
1314   if (HAVE_allocate_stack)
1315     {
1316       enum machine_mode mode = STACK_SIZE_MODE;
1317       insn_operand_predicate_fn pred;
1318
1319       pred = insn_data[(int) CODE_FOR_allocate_stack].operand[0].predicate;
1320       if (pred && ! ((*pred) (target, Pmode)))
1321 #ifdef POINTERS_EXTEND_UNSIGNED
1322         target = convert_memory_address (Pmode, target);
1323 #else
1324         target = copy_to_mode_reg (Pmode, target);
1325 #endif
1326
1327       if (mode == VOIDmode)
1328         mode = Pmode;
1329
1330       size = convert_modes (mode, ptr_mode, size, 1);
1331       pred = insn_data[(int) CODE_FOR_allocate_stack].operand[1].predicate;
1332       if (pred && ! ((*pred) (size, mode)))
1333         size = copy_to_mode_reg (mode, size);
1334
1335       emit_insn (gen_allocate_stack (target, size));
1336     }
1337   else
1338 #endif
1339     {
1340 #ifndef STACK_GROWS_DOWNWARD
1341       emit_move_insn (target, virtual_stack_dynamic_rtx);
1342 #endif
1343       size = convert_modes (Pmode, ptr_mode, size, 1);
1344
1345       /* Check stack bounds if necessary.  */
1346       if (current_function_limit_stack)
1347         {
1348           rtx available;
1349           rtx space_available = gen_label_rtx ();
1350 #ifdef STACK_GROWS_DOWNWARD
1351           available = expand_binop (Pmode, sub_optab, 
1352                                     stack_pointer_rtx, stack_limit_rtx,
1353                                     NULL_RTX, 1, OPTAB_WIDEN);
1354 #else
1355           available = expand_binop (Pmode, sub_optab, 
1356                                     stack_limit_rtx, stack_pointer_rtx,
1357                                     NULL_RTX, 1, OPTAB_WIDEN);
1358 #endif
1359           emit_cmp_and_jump_insns (available, size, GEU, NULL_RTX, Pmode, 1,
1360                                    0, space_available);
1361 #ifdef HAVE_trap
1362           if (HAVE_trap)
1363             emit_insn (gen_trap ());
1364           else
1365 #endif
1366             error ("stack limits not supported on this target");
1367           emit_barrier ();
1368           emit_label (space_available);
1369         }
1370
1371       anti_adjust_stack (size);
1372 #ifdef SETJMP_VIA_SAVE_AREA
1373       if (setjmpless_size != NULL_RTX)
1374         {
1375           rtx note_target = get_last_insn ();
1376
1377           REG_NOTES (note_target)
1378             = gen_rtx_EXPR_LIST (REG_SAVE_AREA, setjmpless_size,
1379                                  REG_NOTES (note_target));
1380         }
1381 #endif /* SETJMP_VIA_SAVE_AREA */
1382 #ifdef STACK_GROWS_DOWNWARD
1383   emit_move_insn (target, virtual_stack_dynamic_rtx);
1384 #endif
1385     }
1386
1387   if (MUST_ALIGN)
1388     {
1389       /* CEIL_DIV_EXPR needs to worry about the addition overflowing,
1390          but we know it can't.  So add ourselves and then do
1391          TRUNC_DIV_EXPR.  */
1392       target = expand_binop (Pmode, add_optab, target,
1393                              GEN_INT (BIGGEST_ALIGNMENT / BITS_PER_UNIT - 1),
1394                              NULL_RTX, 1, OPTAB_LIB_WIDEN);
1395       target = expand_divmod (0, TRUNC_DIV_EXPR, Pmode, target,
1396                               GEN_INT (BIGGEST_ALIGNMENT / BITS_PER_UNIT),
1397                               NULL_RTX, 1);
1398       target = expand_mult (Pmode, target,
1399                             GEN_INT (BIGGEST_ALIGNMENT / BITS_PER_UNIT),
1400                             NULL_RTX, 1);
1401     }
1402   
1403   /* Some systems require a particular insn to refer to the stack
1404      to make the pages exist.  */
1405 #ifdef HAVE_probe
1406   if (HAVE_probe)
1407     emit_insn (gen_probe ());
1408 #endif
1409
1410   /* Record the new stack level for nonlocal gotos.  */
1411   if (nonlocal_goto_handler_slots != 0)
1412     emit_stack_save (SAVE_NONLOCAL, &nonlocal_goto_stack_level, NULL_RTX);
1413
1414   return target;
1415 }
1416 \f
1417 /* A front end may want to override GCC's stack checking by providing a 
1418    run-time routine to call to check the stack, so provide a mechanism for
1419    calling that routine.  */
1420
1421 static rtx stack_check_libfunc;
1422
1423 void
1424 set_stack_check_libfunc (libfunc)
1425      rtx libfunc;
1426 {
1427   stack_check_libfunc = libfunc;
1428 }
1429 \f
1430 /* Emit one stack probe at ADDRESS, an address within the stack.  */
1431
1432 static void
1433 emit_stack_probe (address)
1434      rtx address;
1435 {
1436   rtx memref = gen_rtx_MEM (word_mode, address);
1437
1438   MEM_VOLATILE_P (memref) = 1;
1439
1440   if (STACK_CHECK_PROBE_LOAD)
1441     emit_move_insn (gen_reg_rtx (word_mode), memref);
1442   else
1443     emit_move_insn (memref, const0_rtx);
1444 }
1445
1446 /* Probe a range of stack addresses from FIRST to FIRST+SIZE, inclusive. 
1447    FIRST is a constant and size is a Pmode RTX.  These are offsets from the
1448    current stack pointer.  STACK_GROWS_DOWNWARD says whether to add or
1449    subtract from the stack.  If SIZE is constant, this is done
1450    with a fixed number of probes.  Otherwise, we must make a loop.  */
1451
1452 #ifdef STACK_GROWS_DOWNWARD
1453 #define STACK_GROW_OP MINUS
1454 #else
1455 #define STACK_GROW_OP PLUS
1456 #endif
1457
1458 void
1459 probe_stack_range (first, size)
1460      HOST_WIDE_INT first;
1461      rtx size;
1462 {
1463   /* First see if the front end has set up a function for us to call to
1464      check the stack.  */
1465   if (stack_check_libfunc != 0)
1466     emit_library_call (stack_check_libfunc, 0, VOIDmode, 1,
1467                        memory_address (QImode,
1468                                        gen_rtx (STACK_GROW_OP, Pmode,
1469                                                 stack_pointer_rtx,
1470                                                 plus_constant (size, first))),
1471                        ptr_mode);
1472
1473   /* Next see if we have an insn to check the stack.  Use it if so.  */
1474 #ifdef HAVE_check_stack
1475   else if (HAVE_check_stack)
1476     {
1477       insn_operand_predicate_fn pred;
1478       rtx last_addr
1479         = force_operand (gen_rtx_STACK_GROW_OP (Pmode,
1480                                                 stack_pointer_rtx,
1481                                                 plus_constant (size, first)),
1482                          NULL_RTX);
1483
1484       pred = insn_data[(int) CODE_FOR_check_stack].operand[0].predicate;
1485       if (pred && ! ((*pred) (last_addr, Pmode)))
1486         last_addr = copy_to_mode_reg (Pmode, last_addr);
1487
1488       emit_insn (gen_check_stack (last_addr));
1489     }
1490 #endif
1491
1492   /* If we have to generate explicit probes, see if we have a constant
1493      small number of them to generate.  If so, that's the easy case.  */
1494   else if (GET_CODE (size) == CONST_INT
1495            && INTVAL (size) < 10 * STACK_CHECK_PROBE_INTERVAL)
1496     {
1497       HOST_WIDE_INT offset;
1498
1499       /* Start probing at FIRST + N * STACK_CHECK_PROBE_INTERVAL
1500          for values of N from 1 until it exceeds LAST.  If only one
1501          probe is needed, this will not generate any code.  Then probe
1502          at LAST.  */
1503       for (offset = first + STACK_CHECK_PROBE_INTERVAL;
1504            offset < INTVAL (size);
1505            offset = offset + STACK_CHECK_PROBE_INTERVAL)
1506         emit_stack_probe (gen_rtx_fmt_ee (STACK_GROW_OP, Pmode,
1507                                           stack_pointer_rtx,
1508                                           GEN_INT (offset)));
1509
1510       emit_stack_probe (gen_rtx_fmt_ee (STACK_GROW_OP, Pmode,
1511                                         stack_pointer_rtx,
1512                                         plus_constant (size, first)));
1513     }
1514
1515   /* In the variable case, do the same as above, but in a loop.  We emit loop
1516      notes so that loop optimization can be done.  */
1517   else
1518     {
1519       rtx test_addr
1520         = force_operand (gen_rtx_fmt_ee (STACK_GROW_OP, Pmode,
1521                                          stack_pointer_rtx,
1522                                          GEN_INT (first + STACK_CHECK_PROBE_INTERVAL)),
1523                          NULL_RTX);
1524       rtx last_addr
1525         = force_operand (gen_rtx_fmt_ee (STACK_GROW_OP, Pmode,
1526                                          stack_pointer_rtx,
1527                                          plus_constant (size, first)),
1528                          NULL_RTX);
1529       rtx incr = GEN_INT (STACK_CHECK_PROBE_INTERVAL);
1530       rtx loop_lab = gen_label_rtx ();
1531       rtx test_lab = gen_label_rtx ();
1532       rtx end_lab = gen_label_rtx ();
1533       rtx temp;
1534
1535       if (GET_CODE (test_addr) != REG
1536           || REGNO (test_addr) < FIRST_PSEUDO_REGISTER)
1537         test_addr = force_reg (Pmode, test_addr);
1538
1539       emit_note (NULL_PTR, NOTE_INSN_LOOP_BEG);
1540       emit_jump (test_lab);
1541
1542       emit_label (loop_lab);
1543       emit_stack_probe (test_addr);
1544
1545       emit_note (NULL_PTR, NOTE_INSN_LOOP_CONT);
1546
1547 #ifdef STACK_GROWS_DOWNWARD
1548 #define CMP_OPCODE GTU
1549       temp = expand_binop (Pmode, sub_optab, test_addr, incr, test_addr,
1550                            1, OPTAB_WIDEN);
1551 #else
1552 #define CMP_OPCODE LTU
1553       temp = expand_binop (Pmode, add_optab, test_addr, incr, test_addr,
1554                            1, OPTAB_WIDEN);
1555 #endif
1556
1557       if (temp != test_addr)
1558         abort ();
1559
1560       emit_label (test_lab);
1561       emit_cmp_and_jump_insns (test_addr, last_addr, CMP_OPCODE,
1562                                NULL_RTX, Pmode, 1, 0, loop_lab);
1563       emit_jump (end_lab);
1564       emit_note (NULL_PTR, NOTE_INSN_LOOP_END);
1565       emit_label (end_lab);
1566
1567       emit_stack_probe (last_addr);
1568     }
1569 }
1570 \f
1571 /* Return an rtx representing the register or memory location
1572    in which a scalar value of data type VALTYPE
1573    was returned by a function call to function FUNC.
1574    FUNC is a FUNCTION_DECL node if the precise function is known,
1575    otherwise 0.
1576    OUTGOING is 1 if on a machine with register windows this function
1577    should return the register in which the function will put its result
1578    and 0 otherwise. */
1579
1580 rtx
1581 hard_function_value (valtype, func, outgoing)
1582      tree valtype;
1583      tree func ATTRIBUTE_UNUSED;
1584      int outgoing ATTRIBUTE_UNUSED;
1585 {
1586   rtx val;
1587
1588 #ifdef FUNCTION_OUTGOING_VALUE
1589   if (outgoing)
1590     val = FUNCTION_OUTGOING_VALUE (valtype, func);
1591   else
1592 #endif
1593     val = FUNCTION_VALUE (valtype, func);
1594
1595   if (GET_CODE (val) == REG
1596       && GET_MODE (val) == BLKmode)
1597     {
1598       unsigned HOST_WIDE_INT bytes = int_size_in_bytes (valtype);
1599       enum machine_mode tmpmode;
1600
1601       for (tmpmode = GET_CLASS_NARROWEST_MODE (MODE_INT);
1602            tmpmode != VOIDmode;
1603            tmpmode = GET_MODE_WIDER_MODE (tmpmode))
1604         {
1605           /* Have we found a large enough mode?  */
1606           if (GET_MODE_SIZE (tmpmode) >= bytes)
1607             break;
1608         }
1609
1610       /* No suitable mode found.  */
1611       if (tmpmode == VOIDmode)
1612         abort ();
1613
1614       PUT_MODE (val, tmpmode);
1615     }      
1616   return val;
1617 }
1618
1619 /* Return an rtx representing the register or memory location
1620    in which a scalar value of mode MODE was returned by a library call.  */
1621
1622 rtx
1623 hard_libcall_value (mode)
1624      enum machine_mode mode;
1625 {
1626   return LIBCALL_VALUE (mode);
1627 }
1628
1629 /* Look up the tree code for a given rtx code
1630    to provide the arithmetic operation for REAL_ARITHMETIC.
1631    The function returns an int because the caller may not know
1632    what `enum tree_code' means.  */
1633
1634 int
1635 rtx_to_tree_code (code)
1636      enum rtx_code code;
1637 {
1638   enum tree_code tcode;
1639
1640   switch (code)
1641     {
1642     case PLUS:
1643       tcode = PLUS_EXPR;
1644       break;
1645     case MINUS:
1646       tcode = MINUS_EXPR;
1647       break;
1648     case MULT:
1649       tcode = MULT_EXPR;
1650       break;
1651     case DIV:
1652       tcode = RDIV_EXPR;
1653       break;
1654     case SMIN:
1655       tcode = MIN_EXPR;
1656       break;
1657     case SMAX:
1658       tcode = MAX_EXPR;
1659       break;
1660     default:
1661       tcode = LAST_AND_UNUSED_TREE_CODE;
1662       break;
1663     }
1664   return ((int) tcode);
1665 }