OSDN Git Service

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