OSDN Git Service

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