OSDN Git Service

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