OSDN Git Service

PR c/38416, make pragma_kind 8 bits
[pf3gnuchains/gcc-fork.git] / gcc / emit-rtl.c
1 /* Emit RTL for the GCC expander.
2    Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3    1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
4    Free Software Foundation, Inc.
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
11 version.
12
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3.  If not see
20 <http://www.gnu.org/licenses/>.  */
21
22
23 /* Middle-to-low level generation of rtx code and insns.
24
25    This file contains support functions for creating rtl expressions
26    and manipulating them in the doubly-linked chain of insns.
27
28    The patterns of the insns are created by machine-dependent
29    routines in insn-emit.c, which is generated automatically from
30    the machine description.  These routines make the individual rtx's
31    of the pattern with `gen_rtx_fmt_ee' and others in genrtl.[ch],
32    which are automatically generated from rtl.def; what is machine
33    dependent is the kind of rtx's they make and what arguments they
34    use.  */
35
36 #include "config.h"
37 #include "system.h"
38 #include "coretypes.h"
39 #include "tm.h"
40 #include "toplev.h"
41 #include "rtl.h"
42 #include "tree.h"
43 #include "tm_p.h"
44 #include "flags.h"
45 #include "function.h"
46 #include "expr.h"
47 #include "regs.h"
48 #include "hard-reg-set.h"
49 #include "hashtab.h"
50 #include "insn-config.h"
51 #include "recog.h"
52 #include "real.h"
53 #include "fixed-value.h"
54 #include "bitmap.h"
55 #include "basic-block.h"
56 #include "ggc.h"
57 #include "debug.h"
58 #include "langhooks.h"
59 #include "tree-pass.h"
60 #include "df.h"
61
62 /* Commonly used modes.  */
63
64 enum machine_mode byte_mode;    /* Mode whose width is BITS_PER_UNIT.  */
65 enum machine_mode word_mode;    /* Mode whose width is BITS_PER_WORD.  */
66 enum machine_mode double_mode;  /* Mode whose width is DOUBLE_TYPE_SIZE.  */
67 enum machine_mode ptr_mode;     /* Mode whose width is POINTER_SIZE.  */
68
69 /* Datastructures maintained for currently processed function in RTL form.  */
70
71 struct rtl_data x_rtl;
72
73 /* Indexed by pseudo register number, gives the rtx for that pseudo.
74    Allocated in parallel with regno_pointer_align.  
75    FIXME: We could put it into emit_status struct, but gengtype is not able to deal
76    with length attribute nested in top level structures.  */
77
78 rtx * regno_reg_rtx;
79
80 /* This is *not* reset after each function.  It gives each CODE_LABEL
81    in the entire compilation a unique label number.  */
82
83 static GTY(()) int label_num = 1;
84
85 /* Nonzero means do not generate NOTEs for source line numbers.  */
86
87 static int no_line_numbers;
88
89 /* Commonly used rtx's, so that we only need space for one copy.
90    These are initialized once for the entire compilation.
91    All of these are unique; no other rtx-object will be equal to any
92    of these.  */
93
94 rtx global_rtl[GR_MAX];
95
96 /* Commonly used RTL for hard registers.  These objects are not necessarily
97    unique, so we allocate them separately from global_rtl.  They are
98    initialized once per compilation unit, then copied into regno_reg_rtx
99    at the beginning of each function.  */
100 static GTY(()) rtx static_regno_reg_rtx[FIRST_PSEUDO_REGISTER];
101
102 /* We record floating-point CONST_DOUBLEs in each floating-point mode for
103    the values of 0, 1, and 2.  For the integer entries and VOIDmode, we
104    record a copy of const[012]_rtx.  */
105
106 rtx const_tiny_rtx[3][(int) MAX_MACHINE_MODE];
107
108 rtx const_true_rtx;
109
110 REAL_VALUE_TYPE dconst0;
111 REAL_VALUE_TYPE dconst1;
112 REAL_VALUE_TYPE dconst2;
113 REAL_VALUE_TYPE dconstm1;
114 REAL_VALUE_TYPE dconsthalf;
115
116 /* Record fixed-point constant 0 and 1.  */
117 FIXED_VALUE_TYPE fconst0[MAX_FCONST0];
118 FIXED_VALUE_TYPE fconst1[MAX_FCONST1];
119
120 /* All references to the following fixed hard registers go through
121    these unique rtl objects.  On machines where the frame-pointer and
122    arg-pointer are the same register, they use the same unique object.
123
124    After register allocation, other rtl objects which used to be pseudo-regs
125    may be clobbered to refer to the frame-pointer register.
126    But references that were originally to the frame-pointer can be
127    distinguished from the others because they contain frame_pointer_rtx.
128
129    When to use frame_pointer_rtx and hard_frame_pointer_rtx is a little
130    tricky: until register elimination has taken place hard_frame_pointer_rtx
131    should be used if it is being set, and frame_pointer_rtx otherwise.  After
132    register elimination hard_frame_pointer_rtx should always be used.
133    On machines where the two registers are same (most) then these are the
134    same.
135
136    In an inline procedure, the stack and frame pointer rtxs may not be
137    used for anything else.  */
138 rtx static_chain_rtx;           /* (REG:Pmode STATIC_CHAIN_REGNUM) */
139 rtx static_chain_incoming_rtx;  /* (REG:Pmode STATIC_CHAIN_INCOMING_REGNUM) */
140 rtx pic_offset_table_rtx;       /* (REG:Pmode PIC_OFFSET_TABLE_REGNUM) */
141
142 /* This is used to implement __builtin_return_address for some machines.
143    See for instance the MIPS port.  */
144 rtx return_address_pointer_rtx; /* (REG:Pmode RETURN_ADDRESS_POINTER_REGNUM) */
145
146 /* We make one copy of (const_int C) where C is in
147    [- MAX_SAVED_CONST_INT, MAX_SAVED_CONST_INT]
148    to save space during the compilation and simplify comparisons of
149    integers.  */
150
151 rtx const_int_rtx[MAX_SAVED_CONST_INT * 2 + 1];
152
153 /* A hash table storing CONST_INTs whose absolute value is greater
154    than MAX_SAVED_CONST_INT.  */
155
156 static GTY ((if_marked ("ggc_marked_p"), param_is (struct rtx_def)))
157      htab_t const_int_htab;
158
159 /* A hash table storing memory attribute structures.  */
160 static GTY ((if_marked ("ggc_marked_p"), param_is (struct mem_attrs)))
161      htab_t mem_attrs_htab;
162
163 /* A hash table storing register attribute structures.  */
164 static GTY ((if_marked ("ggc_marked_p"), param_is (struct reg_attrs)))
165      htab_t reg_attrs_htab;
166
167 /* A hash table storing all CONST_DOUBLEs.  */
168 static GTY ((if_marked ("ggc_marked_p"), param_is (struct rtx_def)))
169      htab_t const_double_htab;
170
171 /* A hash table storing all CONST_FIXEDs.  */
172 static GTY ((if_marked ("ggc_marked_p"), param_is (struct rtx_def)))
173      htab_t const_fixed_htab;
174
175 #define first_insn (crtl->emit.x_first_insn)
176 #define last_insn (crtl->emit.x_last_insn)
177 #define cur_insn_uid (crtl->emit.x_cur_insn_uid)
178 #define last_location (crtl->emit.x_last_location)
179 #define first_label_num (crtl->emit.x_first_label_num)
180
181 static rtx make_call_insn_raw (rtx);
182 static rtx change_address_1 (rtx, enum machine_mode, rtx, int);
183 static void set_used_decls (tree);
184 static void mark_label_nuses (rtx);
185 static hashval_t const_int_htab_hash (const void *);
186 static int const_int_htab_eq (const void *, const void *);
187 static hashval_t const_double_htab_hash (const void *);
188 static int const_double_htab_eq (const void *, const void *);
189 static rtx lookup_const_double (rtx);
190 static hashval_t const_fixed_htab_hash (const void *);
191 static int const_fixed_htab_eq (const void *, const void *);
192 static rtx lookup_const_fixed (rtx);
193 static hashval_t mem_attrs_htab_hash (const void *);
194 static int mem_attrs_htab_eq (const void *, const void *);
195 static mem_attrs *get_mem_attrs (alias_set_type, tree, rtx, rtx, unsigned int,
196                                  enum machine_mode);
197 static hashval_t reg_attrs_htab_hash (const void *);
198 static int reg_attrs_htab_eq (const void *, const void *);
199 static reg_attrs *get_reg_attrs (tree, int);
200 static tree component_ref_for_mem_expr (tree);
201 static rtx gen_const_vector (enum machine_mode, int);
202 static void copy_rtx_if_shared_1 (rtx *orig);
203
204 /* Probability of the conditional branch currently proceeded by try_split.
205    Set to -1 otherwise.  */
206 int split_branch_probability = -1;
207 \f
208 /* Returns a hash code for X (which is a really a CONST_INT).  */
209
210 static hashval_t
211 const_int_htab_hash (const void *x)
212 {
213   return (hashval_t) INTVAL ((const_rtx) x);
214 }
215
216 /* Returns nonzero if the value represented by X (which is really a
217    CONST_INT) is the same as that given by Y (which is really a
218    HOST_WIDE_INT *).  */
219
220 static int
221 const_int_htab_eq (const void *x, const void *y)
222 {
223   return (INTVAL ((const_rtx) x) == *((const HOST_WIDE_INT *) y));
224 }
225
226 /* Returns a hash code for X (which is really a CONST_DOUBLE).  */
227 static hashval_t
228 const_double_htab_hash (const void *x)
229 {
230   const_rtx const value = (const_rtx) x;
231   hashval_t h;
232
233   if (GET_MODE (value) == VOIDmode)
234     h = CONST_DOUBLE_LOW (value) ^ CONST_DOUBLE_HIGH (value);
235   else
236     {
237       h = real_hash (CONST_DOUBLE_REAL_VALUE (value));
238       /* MODE is used in the comparison, so it should be in the hash.  */
239       h ^= GET_MODE (value);
240     }
241   return h;
242 }
243
244 /* Returns nonzero if the value represented by X (really a ...)
245    is the same as that represented by Y (really a ...) */
246 static int
247 const_double_htab_eq (const void *x, const void *y)
248 {
249   const_rtx const a = (const_rtx)x, b = (const_rtx)y;
250
251   if (GET_MODE (a) != GET_MODE (b))
252     return 0;
253   if (GET_MODE (a) == VOIDmode)
254     return (CONST_DOUBLE_LOW (a) == CONST_DOUBLE_LOW (b)
255             && CONST_DOUBLE_HIGH (a) == CONST_DOUBLE_HIGH (b));
256   else
257     return real_identical (CONST_DOUBLE_REAL_VALUE (a),
258                            CONST_DOUBLE_REAL_VALUE (b));
259 }
260
261 /* Returns a hash code for X (which is really a CONST_FIXED).  */
262
263 static hashval_t
264 const_fixed_htab_hash (const void *x)
265 {
266   const_rtx const value = (const_rtx) x;
267   hashval_t h;
268
269   h = fixed_hash (CONST_FIXED_VALUE (value));
270   /* MODE is used in the comparison, so it should be in the hash.  */
271   h ^= GET_MODE (value);
272   return h;
273 }
274
275 /* Returns nonzero if the value represented by X (really a ...)
276    is the same as that represented by Y (really a ...).  */
277
278 static int
279 const_fixed_htab_eq (const void *x, const void *y)
280 {
281   const_rtx const a = (const_rtx) x, b = (const_rtx) y;
282
283   if (GET_MODE (a) != GET_MODE (b))
284     return 0;
285   return fixed_identical (CONST_FIXED_VALUE (a), CONST_FIXED_VALUE (b));
286 }
287
288 /* Returns a hash code for X (which is a really a mem_attrs *).  */
289
290 static hashval_t
291 mem_attrs_htab_hash (const void *x)
292 {
293   const mem_attrs *const p = (const mem_attrs *) x;
294
295   return (p->alias ^ (p->align * 1000)
296           ^ ((p->offset ? INTVAL (p->offset) : 0) * 50000)
297           ^ ((p->size ? INTVAL (p->size) : 0) * 2500000)
298           ^ (size_t) iterative_hash_expr (p->expr, 0));
299 }
300
301 /* Returns nonzero if the value represented by X (which is really a
302    mem_attrs *) is the same as that given by Y (which is also really a
303    mem_attrs *).  */
304
305 static int
306 mem_attrs_htab_eq (const void *x, const void *y)
307 {
308   const mem_attrs *const p = (const mem_attrs *) x;
309   const mem_attrs *const q = (const mem_attrs *) y;
310
311   return (p->alias == q->alias && p->offset == q->offset
312           && p->size == q->size && p->align == q->align
313           && (p->expr == q->expr
314               || (p->expr != NULL_TREE && q->expr != NULL_TREE
315                   && operand_equal_p (p->expr, q->expr, 0))));
316 }
317
318 /* Allocate a new mem_attrs structure and insert it into the hash table if
319    one identical to it is not already in the table.  We are doing this for
320    MEM of mode MODE.  */
321
322 static mem_attrs *
323 get_mem_attrs (alias_set_type alias, tree expr, rtx offset, rtx size,
324                unsigned int align, enum machine_mode mode)
325 {
326   mem_attrs attrs;
327   void **slot;
328
329   /* If everything is the default, we can just return zero.
330      This must match what the corresponding MEM_* macros return when the
331      field is not present.  */
332   if (alias == 0 && expr == 0 && offset == 0
333       && (size == 0
334           || (mode != BLKmode && GET_MODE_SIZE (mode) == INTVAL (size)))
335       && (STRICT_ALIGNMENT && mode != BLKmode
336           ? align == GET_MODE_ALIGNMENT (mode) : align == BITS_PER_UNIT))
337     return 0;
338
339   attrs.alias = alias;
340   attrs.expr = expr;
341   attrs.offset = offset;
342   attrs.size = size;
343   attrs.align = align;
344
345   slot = htab_find_slot (mem_attrs_htab, &attrs, INSERT);
346   if (*slot == 0)
347     {
348       *slot = ggc_alloc (sizeof (mem_attrs));
349       memcpy (*slot, &attrs, sizeof (mem_attrs));
350     }
351
352   return (mem_attrs *) *slot;
353 }
354
355 /* Returns a hash code for X (which is a really a reg_attrs *).  */
356
357 static hashval_t
358 reg_attrs_htab_hash (const void *x)
359 {
360   const reg_attrs *const p = (const reg_attrs *) x;
361
362   return ((p->offset * 1000) ^ (long) p->decl);
363 }
364
365 /* Returns nonzero if the value represented by X (which is really a
366    reg_attrs *) is the same as that given by Y (which is also really a
367    reg_attrs *).  */
368
369 static int
370 reg_attrs_htab_eq (const void *x, const void *y)
371 {
372   const reg_attrs *const p = (const reg_attrs *) x;
373   const reg_attrs *const q = (const reg_attrs *) y;
374
375   return (p->decl == q->decl && p->offset == q->offset);
376 }
377 /* Allocate a new reg_attrs structure and insert it into the hash table if
378    one identical to it is not already in the table.  We are doing this for
379    MEM of mode MODE.  */
380
381 static reg_attrs *
382 get_reg_attrs (tree decl, int offset)
383 {
384   reg_attrs attrs;
385   void **slot;
386
387   /* If everything is the default, we can just return zero.  */
388   if (decl == 0 && offset == 0)
389     return 0;
390
391   attrs.decl = decl;
392   attrs.offset = offset;
393
394   slot = htab_find_slot (reg_attrs_htab, &attrs, INSERT);
395   if (*slot == 0)
396     {
397       *slot = ggc_alloc (sizeof (reg_attrs));
398       memcpy (*slot, &attrs, sizeof (reg_attrs));
399     }
400
401   return (reg_attrs *) *slot;
402 }
403
404
405 #if !HAVE_blockage
406 /* Generate an empty ASM_INPUT, which is used to block attempts to schedule
407    across this insn. */
408
409 rtx
410 gen_blockage (void)
411 {
412   rtx x = gen_rtx_ASM_INPUT (VOIDmode, "");
413   MEM_VOLATILE_P (x) = true;
414   return x;
415 }
416 #endif
417
418
419 /* Generate a new REG rtx.  Make sure ORIGINAL_REGNO is set properly, and
420    don't attempt to share with the various global pieces of rtl (such as
421    frame_pointer_rtx).  */
422
423 rtx
424 gen_raw_REG (enum machine_mode mode, int regno)
425 {
426   rtx x = gen_rtx_raw_REG (mode, regno);
427   ORIGINAL_REGNO (x) = regno;
428   return x;
429 }
430
431 /* There are some RTL codes that require special attention; the generation
432    functions do the raw handling.  If you add to this list, modify
433    special_rtx in gengenrtl.c as well.  */
434
435 rtx
436 gen_rtx_CONST_INT (enum machine_mode mode ATTRIBUTE_UNUSED, HOST_WIDE_INT arg)
437 {
438   void **slot;
439
440   if (arg >= - MAX_SAVED_CONST_INT && arg <= MAX_SAVED_CONST_INT)
441     return const_int_rtx[arg + MAX_SAVED_CONST_INT];
442
443 #if STORE_FLAG_VALUE != 1 && STORE_FLAG_VALUE != -1
444   if (const_true_rtx && arg == STORE_FLAG_VALUE)
445     return const_true_rtx;
446 #endif
447
448   /* Look up the CONST_INT in the hash table.  */
449   slot = htab_find_slot_with_hash (const_int_htab, &arg,
450                                    (hashval_t) arg, INSERT);
451   if (*slot == 0)
452     *slot = gen_rtx_raw_CONST_INT (VOIDmode, arg);
453
454   return (rtx) *slot;
455 }
456
457 rtx
458 gen_int_mode (HOST_WIDE_INT c, enum machine_mode mode)
459 {
460   return GEN_INT (trunc_int_for_mode (c, mode));
461 }
462
463 /* CONST_DOUBLEs might be created from pairs of integers, or from
464    REAL_VALUE_TYPEs.  Also, their length is known only at run time,
465    so we cannot use gen_rtx_raw_CONST_DOUBLE.  */
466
467 /* Determine whether REAL, a CONST_DOUBLE, already exists in the
468    hash table.  If so, return its counterpart; otherwise add it
469    to the hash table and return it.  */
470 static rtx
471 lookup_const_double (rtx real)
472 {
473   void **slot = htab_find_slot (const_double_htab, real, INSERT);
474   if (*slot == 0)
475     *slot = real;
476
477   return (rtx) *slot;
478 }
479
480 /* Return a CONST_DOUBLE rtx for a floating-point value specified by
481    VALUE in mode MODE.  */
482 rtx
483 const_double_from_real_value (REAL_VALUE_TYPE value, enum machine_mode mode)
484 {
485   rtx real = rtx_alloc (CONST_DOUBLE);
486   PUT_MODE (real, mode);
487
488   real->u.rv = value;
489
490   return lookup_const_double (real);
491 }
492
493 /* Determine whether FIXED, a CONST_FIXED, already exists in the
494    hash table.  If so, return its counterpart; otherwise add it
495    to the hash table and return it.  */
496
497 static rtx
498 lookup_const_fixed (rtx fixed)
499 {
500   void **slot = htab_find_slot (const_fixed_htab, fixed, INSERT);
501   if (*slot == 0)
502     *slot = fixed;
503
504   return (rtx) *slot;
505 }
506
507 /* Return a CONST_FIXED rtx for a fixed-point value specified by
508    VALUE in mode MODE.  */
509
510 rtx
511 const_fixed_from_fixed_value (FIXED_VALUE_TYPE value, enum machine_mode mode)
512 {
513   rtx fixed = rtx_alloc (CONST_FIXED);
514   PUT_MODE (fixed, mode);
515
516   fixed->u.fv = value;
517
518   return lookup_const_fixed (fixed);
519 }
520
521 /* Return a CONST_DOUBLE or CONST_INT for a value specified as a pair
522    of ints: I0 is the low-order word and I1 is the high-order word.
523    Do not use this routine for non-integer modes; convert to
524    REAL_VALUE_TYPE and use CONST_DOUBLE_FROM_REAL_VALUE.  */
525
526 rtx
527 immed_double_const (HOST_WIDE_INT i0, HOST_WIDE_INT i1, enum machine_mode mode)
528 {
529   rtx value;
530   unsigned int i;
531
532   /* There are the following cases (note that there are no modes with
533      HOST_BITS_PER_WIDE_INT < GET_MODE_BITSIZE (mode) < 2 * HOST_BITS_PER_WIDE_INT):
534
535      1) If GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT, then we use
536         gen_int_mode.
537      2) GET_MODE_BITSIZE (mode) == 2 * HOST_BITS_PER_WIDE_INT, but the value of
538         the integer fits into HOST_WIDE_INT anyway (i.e., i1 consists only
539         from copies of the sign bit, and sign of i0 and i1 are the same),  then 
540         we return a CONST_INT for i0.
541      3) Otherwise, we create a CONST_DOUBLE for i0 and i1.  */
542   if (mode != VOIDmode)
543     {
544       gcc_assert (GET_MODE_CLASS (mode) == MODE_INT
545                   || GET_MODE_CLASS (mode) == MODE_PARTIAL_INT
546                   /* We can get a 0 for an error mark.  */
547                   || GET_MODE_CLASS (mode) == MODE_VECTOR_INT
548                   || GET_MODE_CLASS (mode) == MODE_VECTOR_FLOAT);
549
550       if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
551         return gen_int_mode (i0, mode);
552
553       gcc_assert (GET_MODE_BITSIZE (mode) == 2 * HOST_BITS_PER_WIDE_INT);
554     }
555
556   /* If this integer fits in one word, return a CONST_INT.  */
557   if ((i1 == 0 && i0 >= 0) || (i1 == ~0 && i0 < 0))
558     return GEN_INT (i0);
559
560   /* We use VOIDmode for integers.  */
561   value = rtx_alloc (CONST_DOUBLE);
562   PUT_MODE (value, VOIDmode);
563
564   CONST_DOUBLE_LOW (value) = i0;
565   CONST_DOUBLE_HIGH (value) = i1;
566
567   for (i = 2; i < (sizeof CONST_DOUBLE_FORMAT - 1); i++)
568     XWINT (value, i) = 0;
569
570   return lookup_const_double (value);
571 }
572
573 rtx
574 gen_rtx_REG (enum machine_mode mode, unsigned int regno)
575 {
576   /* In case the MD file explicitly references the frame pointer, have
577      all such references point to the same frame pointer.  This is
578      used during frame pointer elimination to distinguish the explicit
579      references to these registers from pseudos that happened to be
580      assigned to them.
581
582      If we have eliminated the frame pointer or arg pointer, we will
583      be using it as a normal register, for example as a spill
584      register.  In such cases, we might be accessing it in a mode that
585      is not Pmode and therefore cannot use the pre-allocated rtx.
586
587      Also don't do this when we are making new REGs in reload, since
588      we don't want to get confused with the real pointers.  */
589
590   if (mode == Pmode && !reload_in_progress)
591     {
592       if (regno == FRAME_POINTER_REGNUM
593           && (!reload_completed || frame_pointer_needed))
594         return frame_pointer_rtx;
595 #if FRAME_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM
596       if (regno == HARD_FRAME_POINTER_REGNUM
597           && (!reload_completed || frame_pointer_needed))
598         return hard_frame_pointer_rtx;
599 #endif
600 #if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM && HARD_FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
601       if (regno == ARG_POINTER_REGNUM)
602         return arg_pointer_rtx;
603 #endif
604 #ifdef RETURN_ADDRESS_POINTER_REGNUM
605       if (regno == RETURN_ADDRESS_POINTER_REGNUM)
606         return return_address_pointer_rtx;
607 #endif
608       if (regno == (unsigned) PIC_OFFSET_TABLE_REGNUM
609           && fixed_regs[PIC_OFFSET_TABLE_REGNUM])
610         return pic_offset_table_rtx;
611       if (regno == STACK_POINTER_REGNUM)
612         return stack_pointer_rtx;
613     }
614
615 #if 0
616   /* If the per-function register table has been set up, try to re-use
617      an existing entry in that table to avoid useless generation of RTL.
618
619      This code is disabled for now until we can fix the various backends
620      which depend on having non-shared hard registers in some cases.   Long
621      term we want to re-enable this code as it can significantly cut down
622      on the amount of useless RTL that gets generated.
623
624      We'll also need to fix some code that runs after reload that wants to
625      set ORIGINAL_REGNO.  */
626
627   if (cfun
628       && cfun->emit
629       && regno_reg_rtx
630       && regno < FIRST_PSEUDO_REGISTER
631       && reg_raw_mode[regno] == mode)
632     return regno_reg_rtx[regno];
633 #endif
634
635   return gen_raw_REG (mode, regno);
636 }
637
638 rtx
639 gen_rtx_MEM (enum machine_mode mode, rtx addr)
640 {
641   rtx rt = gen_rtx_raw_MEM (mode, addr);
642
643   /* This field is not cleared by the mere allocation of the rtx, so
644      we clear it here.  */
645   MEM_ATTRS (rt) = 0;
646
647   return rt;
648 }
649
650 /* Generate a memory referring to non-trapping constant memory.  */
651
652 rtx
653 gen_const_mem (enum machine_mode mode, rtx addr)
654 {
655   rtx mem = gen_rtx_MEM (mode, addr);
656   MEM_READONLY_P (mem) = 1;
657   MEM_NOTRAP_P (mem) = 1;
658   return mem;
659 }
660
661 /* Generate a MEM referring to fixed portions of the frame, e.g., register
662    save areas.  */
663
664 rtx
665 gen_frame_mem (enum machine_mode mode, rtx addr)
666 {
667   rtx mem = gen_rtx_MEM (mode, addr);
668   MEM_NOTRAP_P (mem) = 1;
669   set_mem_alias_set (mem, get_frame_alias_set ());
670   return mem;
671 }
672
673 /* Generate a MEM referring to a temporary use of the stack, not part
674     of the fixed stack frame.  For example, something which is pushed
675     by a target splitter.  */
676 rtx
677 gen_tmp_stack_mem (enum machine_mode mode, rtx addr)
678 {
679   rtx mem = gen_rtx_MEM (mode, addr);
680   MEM_NOTRAP_P (mem) = 1;
681   if (!cfun->calls_alloca)
682     set_mem_alias_set (mem, get_frame_alias_set ());
683   return mem;
684 }
685
686 /* We want to create (subreg:OMODE (obj:IMODE) OFFSET).  Return true if
687    this construct would be valid, and false otherwise.  */
688
689 bool
690 validate_subreg (enum machine_mode omode, enum machine_mode imode,
691                  const_rtx reg, unsigned int offset)
692 {
693   unsigned int isize = GET_MODE_SIZE (imode);
694   unsigned int osize = GET_MODE_SIZE (omode);
695
696   /* All subregs must be aligned.  */
697   if (offset % osize != 0)
698     return false;
699
700   /* The subreg offset cannot be outside the inner object.  */
701   if (offset >= isize)
702     return false;
703
704   /* ??? This should not be here.  Temporarily continue to allow word_mode
705      subregs of anything.  The most common offender is (subreg:SI (reg:DF)).
706      Generally, backends are doing something sketchy but it'll take time to
707      fix them all.  */
708   if (omode == word_mode)
709     ;
710   /* ??? Similarly, e.g. with (subreg:DF (reg:TI)).  Though store_bit_field
711      is the culprit here, and not the backends.  */
712   else if (osize >= UNITS_PER_WORD && isize >= osize)
713     ;
714   /* Allow component subregs of complex and vector.  Though given the below
715      extraction rules, it's not always clear what that means.  */
716   else if ((COMPLEX_MODE_P (imode) || VECTOR_MODE_P (imode))
717            && GET_MODE_INNER (imode) == omode)
718     ;
719   /* ??? x86 sse code makes heavy use of *paradoxical* vector subregs,
720      i.e. (subreg:V4SF (reg:SF) 0).  This surely isn't the cleanest way to
721      represent this.  It's questionable if this ought to be represented at
722      all -- why can't this all be hidden in post-reload splitters that make
723      arbitrarily mode changes to the registers themselves.  */
724   else if (VECTOR_MODE_P (omode) && GET_MODE_INNER (omode) == imode)
725     ;
726   /* Subregs involving floating point modes are not allowed to
727      change size.  Therefore (subreg:DI (reg:DF) 0) is fine, but
728      (subreg:SI (reg:DF) 0) isn't.  */
729   else if (FLOAT_MODE_P (imode) || FLOAT_MODE_P (omode))
730     {
731       if (isize != osize)
732         return false;
733     }
734
735   /* Paradoxical subregs must have offset zero.  */
736   if (osize > isize)
737     return offset == 0;
738
739   /* This is a normal subreg.  Verify that the offset is representable.  */
740
741   /* For hard registers, we already have most of these rules collected in
742      subreg_offset_representable_p.  */
743   if (reg && REG_P (reg) && HARD_REGISTER_P (reg))
744     {
745       unsigned int regno = REGNO (reg);
746
747 #ifdef CANNOT_CHANGE_MODE_CLASS
748       if ((COMPLEX_MODE_P (imode) || VECTOR_MODE_P (imode))
749           && GET_MODE_INNER (imode) == omode)
750         ;
751       else if (REG_CANNOT_CHANGE_MODE_P (regno, imode, omode))
752         return false;
753 #endif
754
755       return subreg_offset_representable_p (regno, imode, offset, omode);
756     }
757
758   /* For pseudo registers, we want most of the same checks.  Namely:
759      If the register no larger than a word, the subreg must be lowpart.
760      If the register is larger than a word, the subreg must be the lowpart
761      of a subword.  A subreg does *not* perform arbitrary bit extraction.
762      Given that we've already checked mode/offset alignment, we only have
763      to check subword subregs here.  */
764   if (osize < UNITS_PER_WORD)
765     {
766       enum machine_mode wmode = isize > UNITS_PER_WORD ? word_mode : imode;
767       unsigned int low_off = subreg_lowpart_offset (omode, wmode);
768       if (offset % UNITS_PER_WORD != low_off)
769         return false;
770     }
771   return true;
772 }
773
774 rtx
775 gen_rtx_SUBREG (enum machine_mode mode, rtx reg, int offset)
776 {
777   gcc_assert (validate_subreg (mode, GET_MODE (reg), reg, offset));
778   return gen_rtx_raw_SUBREG (mode, reg, offset);
779 }
780
781 /* Generate a SUBREG representing the least-significant part of REG if MODE
782    is smaller than mode of REG, otherwise paradoxical SUBREG.  */
783
784 rtx
785 gen_lowpart_SUBREG (enum machine_mode mode, rtx reg)
786 {
787   enum machine_mode inmode;
788
789   inmode = GET_MODE (reg);
790   if (inmode == VOIDmode)
791     inmode = mode;
792   return gen_rtx_SUBREG (mode, reg,
793                          subreg_lowpart_offset (mode, inmode));
794 }
795 \f
796
797 /* Create an rtvec and stores within it the RTXen passed in the arguments.  */
798
799 rtvec
800 gen_rtvec (int n, ...)
801 {
802   int i;
803   rtvec rt_val;
804   va_list p;
805
806   va_start (p, n);
807
808   /* Don't allocate an empty rtvec...  */
809   if (n == 0)
810     return NULL_RTVEC;
811
812   rt_val = rtvec_alloc (n);
813
814   for (i = 0; i < n; i++)
815     rt_val->elem[i] = va_arg (p, rtx);
816
817   va_end (p);
818   return rt_val;
819 }
820
821 rtvec
822 gen_rtvec_v (int n, rtx *argp)
823 {
824   int i;
825   rtvec rt_val;
826
827   /* Don't allocate an empty rtvec...  */
828   if (n == 0)
829     return NULL_RTVEC;
830
831   rt_val = rtvec_alloc (n);
832
833   for (i = 0; i < n; i++)
834     rt_val->elem[i] = *argp++;
835
836   return rt_val;
837 }
838 \f
839 /* Return the number of bytes between the start of an OUTER_MODE
840    in-memory value and the start of an INNER_MODE in-memory value,
841    given that the former is a lowpart of the latter.  It may be a
842    paradoxical lowpart, in which case the offset will be negative
843    on big-endian targets.  */
844
845 int
846 byte_lowpart_offset (enum machine_mode outer_mode,
847                      enum machine_mode inner_mode)
848 {
849   if (GET_MODE_SIZE (outer_mode) < GET_MODE_SIZE (inner_mode))
850     return subreg_lowpart_offset (outer_mode, inner_mode);
851   else
852     return -subreg_lowpart_offset (inner_mode, outer_mode);
853 }
854 \f
855 /* Generate a REG rtx for a new pseudo register of mode MODE.
856    This pseudo is assigned the next sequential register number.  */
857
858 rtx
859 gen_reg_rtx (enum machine_mode mode)
860 {
861   rtx val;
862   unsigned int align = GET_MODE_ALIGNMENT (mode);
863
864   gcc_assert (can_create_pseudo_p ());
865
866   /* If a virtual register with bigger mode alignment is generated,
867      increase stack alignment estimation because it might be spilled
868      to stack later.  */
869   if (SUPPORTS_STACK_ALIGNMENT 
870       && crtl->stack_alignment_estimated < align
871       && !crtl->stack_realign_processed)
872     crtl->stack_alignment_estimated = align;
873
874   if (generating_concat_p
875       && (GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT
876           || GET_MODE_CLASS (mode) == MODE_COMPLEX_INT))
877     {
878       /* For complex modes, don't make a single pseudo.
879          Instead, make a CONCAT of two pseudos.
880          This allows noncontiguous allocation of the real and imaginary parts,
881          which makes much better code.  Besides, allocating DCmode
882          pseudos overstrains reload on some machines like the 386.  */
883       rtx realpart, imagpart;
884       enum machine_mode partmode = GET_MODE_INNER (mode);
885
886       realpart = gen_reg_rtx (partmode);
887       imagpart = gen_reg_rtx (partmode);
888       return gen_rtx_CONCAT (mode, realpart, imagpart);
889     }
890
891   /* Make sure regno_pointer_align, and regno_reg_rtx are large
892      enough to have an element for this pseudo reg number.  */
893
894   if (reg_rtx_no == crtl->emit.regno_pointer_align_length)
895     {
896       int old_size = crtl->emit.regno_pointer_align_length;
897       char *tmp;
898       rtx *new1;
899
900       tmp = XRESIZEVEC (char, crtl->emit.regno_pointer_align, old_size * 2);
901       memset (tmp + old_size, 0, old_size);
902       crtl->emit.regno_pointer_align = (unsigned char *) tmp;
903
904       new1 = GGC_RESIZEVEC (rtx, regno_reg_rtx, old_size * 2);
905       memset (new1 + old_size, 0, old_size * sizeof (rtx));
906       regno_reg_rtx = new1;
907
908       crtl->emit.regno_pointer_align_length = old_size * 2;
909     }
910
911   val = gen_raw_REG (mode, reg_rtx_no);
912   regno_reg_rtx[reg_rtx_no++] = val;
913   return val;
914 }
915
916 /* Update NEW with the same attributes as REG, but with OFFSET added
917    to the REG_OFFSET.  */
918
919 static void
920 update_reg_offset (rtx new_rtx, rtx reg, int offset)
921 {
922   REG_ATTRS (new_rtx) = get_reg_attrs (REG_EXPR (reg),
923                                    REG_OFFSET (reg) + offset);
924 }
925
926 /* Generate a register with same attributes as REG, but with OFFSET
927    added to the REG_OFFSET.  */
928
929 rtx
930 gen_rtx_REG_offset (rtx reg, enum machine_mode mode, unsigned int regno,
931                     int offset)
932 {
933   rtx new_rtx = gen_rtx_REG (mode, regno);
934
935   update_reg_offset (new_rtx, reg, offset);
936   return new_rtx;
937 }
938
939 /* Generate a new pseudo-register with the same attributes as REG, but
940    with OFFSET added to the REG_OFFSET.  */
941
942 rtx
943 gen_reg_rtx_offset (rtx reg, enum machine_mode mode, int offset)
944 {
945   rtx new_rtx = gen_reg_rtx (mode);
946
947   update_reg_offset (new_rtx, reg, offset);
948   return new_rtx;
949 }
950
951 /* Adjust REG in-place so that it has mode MODE.  It is assumed that the
952    new register is a (possibly paradoxical) lowpart of the old one.  */
953
954 void
955 adjust_reg_mode (rtx reg, enum machine_mode mode)
956 {
957   update_reg_offset (reg, reg, byte_lowpart_offset (mode, GET_MODE (reg)));
958   PUT_MODE (reg, mode);
959 }
960
961 /* Copy REG's attributes from X, if X has any attributes.  If REG and X
962    have different modes, REG is a (possibly paradoxical) lowpart of X.  */
963
964 void
965 set_reg_attrs_from_value (rtx reg, rtx x)
966 {
967   int offset;
968
969   /* Hard registers can be reused for multiple purposes within the same
970      function, so setting REG_ATTRS, REG_POINTER and REG_POINTER_ALIGN
971      on them is wrong.  */
972   if (HARD_REGISTER_P (reg))
973     return;
974
975   offset = byte_lowpart_offset (GET_MODE (reg), GET_MODE (x));
976   if (MEM_P (x))
977     {
978       if (MEM_OFFSET (x) && GET_CODE (MEM_OFFSET (x)) == CONST_INT)
979         REG_ATTRS (reg)
980           = get_reg_attrs (MEM_EXPR (x), INTVAL (MEM_OFFSET (x)) + offset);
981       if (MEM_POINTER (x))
982         mark_reg_pointer (reg, 0);
983     }
984   else if (REG_P (x))
985     {
986       if (REG_ATTRS (x))
987         update_reg_offset (reg, x, offset);
988       if (REG_POINTER (x))
989         mark_reg_pointer (reg, REGNO_POINTER_ALIGN (REGNO (x)));
990     }
991 }
992
993 /* Generate a REG rtx for a new pseudo register, copying the mode
994    and attributes from X.  */
995
996 rtx
997 gen_reg_rtx_and_attrs (rtx x)
998 {
999   rtx reg = gen_reg_rtx (GET_MODE (x));
1000   set_reg_attrs_from_value (reg, x);
1001   return reg;
1002 }
1003
1004 /* Set the register attributes for registers contained in PARM_RTX.
1005    Use needed values from memory attributes of MEM.  */
1006
1007 void
1008 set_reg_attrs_for_parm (rtx parm_rtx, rtx mem)
1009 {
1010   if (REG_P (parm_rtx))
1011     set_reg_attrs_from_value (parm_rtx, mem);
1012   else if (GET_CODE (parm_rtx) == PARALLEL)
1013     {
1014       /* Check for a NULL entry in the first slot, used to indicate that the
1015          parameter goes both on the stack and in registers.  */
1016       int i = XEXP (XVECEXP (parm_rtx, 0, 0), 0) ? 0 : 1;
1017       for (; i < XVECLEN (parm_rtx, 0); i++)
1018         {
1019           rtx x = XVECEXP (parm_rtx, 0, i);
1020           if (REG_P (XEXP (x, 0)))
1021             REG_ATTRS (XEXP (x, 0))
1022               = get_reg_attrs (MEM_EXPR (mem),
1023                                INTVAL (XEXP (x, 1)));
1024         }
1025     }
1026 }
1027
1028 /* Set the REG_ATTRS for registers in value X, given that X represents
1029    decl T.  */
1030
1031 static void
1032 set_reg_attrs_for_decl_rtl (tree t, rtx x)
1033 {
1034   if (GET_CODE (x) == SUBREG)
1035     {
1036       gcc_assert (subreg_lowpart_p (x));
1037       x = SUBREG_REG (x);
1038     }
1039   if (REG_P (x))
1040     REG_ATTRS (x)
1041       = get_reg_attrs (t, byte_lowpart_offset (GET_MODE (x),
1042                                                DECL_MODE (t)));
1043   if (GET_CODE (x) == CONCAT)
1044     {
1045       if (REG_P (XEXP (x, 0)))
1046         REG_ATTRS (XEXP (x, 0)) = get_reg_attrs (t, 0);
1047       if (REG_P (XEXP (x, 1)))
1048         REG_ATTRS (XEXP (x, 1))
1049           = get_reg_attrs (t, GET_MODE_UNIT_SIZE (GET_MODE (XEXP (x, 0))));
1050     }
1051   if (GET_CODE (x) == PARALLEL)
1052     {
1053       int i, start;
1054
1055       /* Check for a NULL entry, used to indicate that the parameter goes
1056          both on the stack and in registers.  */
1057       if (XEXP (XVECEXP (x, 0, 0), 0))
1058         start = 0;
1059       else
1060         start = 1;
1061
1062       for (i = start; i < XVECLEN (x, 0); i++)
1063         {
1064           rtx y = XVECEXP (x, 0, i);
1065           if (REG_P (XEXP (y, 0)))
1066             REG_ATTRS (XEXP (y, 0)) = get_reg_attrs (t, INTVAL (XEXP (y, 1)));
1067         }
1068     }
1069 }
1070
1071 /* Assign the RTX X to declaration T.  */
1072
1073 void
1074 set_decl_rtl (tree t, rtx x)
1075 {
1076   DECL_WRTL_CHECK (t)->decl_with_rtl.rtl = x;
1077   if (x)
1078     set_reg_attrs_for_decl_rtl (t, x);
1079 }
1080
1081 /* Assign the RTX X to parameter declaration T.  BY_REFERENCE_P is true
1082    if the ABI requires the parameter to be passed by reference.  */
1083
1084 void
1085 set_decl_incoming_rtl (tree t, rtx x, bool by_reference_p)
1086 {
1087   DECL_INCOMING_RTL (t) = x;
1088   if (x && !by_reference_p)
1089     set_reg_attrs_for_decl_rtl (t, x);
1090 }
1091
1092 /* Identify REG (which may be a CONCAT) as a user register.  */
1093
1094 void
1095 mark_user_reg (rtx reg)
1096 {
1097   if (GET_CODE (reg) == CONCAT)
1098     {
1099       REG_USERVAR_P (XEXP (reg, 0)) = 1;
1100       REG_USERVAR_P (XEXP (reg, 1)) = 1;
1101     }
1102   else
1103     {
1104       gcc_assert (REG_P (reg));
1105       REG_USERVAR_P (reg) = 1;
1106     }
1107 }
1108
1109 /* Identify REG as a probable pointer register and show its alignment
1110    as ALIGN, if nonzero.  */
1111
1112 void
1113 mark_reg_pointer (rtx reg, int align)
1114 {
1115   if (! REG_POINTER (reg))
1116     {
1117       REG_POINTER (reg) = 1;
1118
1119       if (align)
1120         REGNO_POINTER_ALIGN (REGNO (reg)) = align;
1121     }
1122   else if (align && align < REGNO_POINTER_ALIGN (REGNO (reg)))
1123     /* We can no-longer be sure just how aligned this pointer is.  */
1124     REGNO_POINTER_ALIGN (REGNO (reg)) = align;
1125 }
1126
1127 /* Return 1 plus largest pseudo reg number used in the current function.  */
1128
1129 int
1130 max_reg_num (void)
1131 {
1132   return reg_rtx_no;
1133 }
1134
1135 /* Return 1 + the largest label number used so far in the current function.  */
1136
1137 int
1138 max_label_num (void)
1139 {
1140   return label_num;
1141 }
1142
1143 /* Return first label number used in this function (if any were used).  */
1144
1145 int
1146 get_first_label_num (void)
1147 {
1148   return first_label_num;
1149 }
1150
1151 /* If the rtx for label was created during the expansion of a nested
1152    function, then first_label_num won't include this label number.
1153    Fix this now so that array indices work later.  */
1154
1155 void
1156 maybe_set_first_label_num (rtx x)
1157 {
1158   if (CODE_LABEL_NUMBER (x) < first_label_num)
1159     first_label_num = CODE_LABEL_NUMBER (x);
1160 }
1161 \f
1162 /* Return a value representing some low-order bits of X, where the number
1163    of low-order bits is given by MODE.  Note that no conversion is done
1164    between floating-point and fixed-point values, rather, the bit
1165    representation is returned.
1166
1167    This function handles the cases in common between gen_lowpart, below,
1168    and two variants in cse.c and combine.c.  These are the cases that can
1169    be safely handled at all points in the compilation.
1170
1171    If this is not a case we can handle, return 0.  */
1172
1173 rtx
1174 gen_lowpart_common (enum machine_mode mode, rtx x)
1175 {
1176   int msize = GET_MODE_SIZE (mode);
1177   int xsize;
1178   int offset = 0;
1179   enum machine_mode innermode;
1180
1181   /* Unfortunately, this routine doesn't take a parameter for the mode of X,
1182      so we have to make one up.  Yuk.  */
1183   innermode = GET_MODE (x);
1184   if (GET_CODE (x) == CONST_INT
1185       && msize * BITS_PER_UNIT <= HOST_BITS_PER_WIDE_INT)
1186     innermode = mode_for_size (HOST_BITS_PER_WIDE_INT, MODE_INT, 0);
1187   else if (innermode == VOIDmode)
1188     innermode = mode_for_size (HOST_BITS_PER_WIDE_INT * 2, MODE_INT, 0);
1189   
1190   xsize = GET_MODE_SIZE (innermode);
1191
1192   gcc_assert (innermode != VOIDmode && innermode != BLKmode);
1193
1194   if (innermode == mode)
1195     return x;
1196
1197   /* MODE must occupy no more words than the mode of X.  */
1198   if ((msize + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD
1199       > ((xsize + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD))
1200     return 0;
1201
1202   /* Don't allow generating paradoxical FLOAT_MODE subregs.  */
1203   if (SCALAR_FLOAT_MODE_P (mode) && msize > xsize)
1204     return 0;
1205
1206   offset = subreg_lowpart_offset (mode, innermode);
1207
1208   if ((GET_CODE (x) == ZERO_EXTEND || GET_CODE (x) == SIGN_EXTEND)
1209       && (GET_MODE_CLASS (mode) == MODE_INT
1210           || GET_MODE_CLASS (mode) == MODE_PARTIAL_INT))
1211     {
1212       /* If we are getting the low-order part of something that has been
1213          sign- or zero-extended, we can either just use the object being
1214          extended or make a narrower extension.  If we want an even smaller
1215          piece than the size of the object being extended, call ourselves
1216          recursively.
1217
1218          This case is used mostly by combine and cse.  */
1219
1220       if (GET_MODE (XEXP (x, 0)) == mode)
1221         return XEXP (x, 0);
1222       else if (msize < GET_MODE_SIZE (GET_MODE (XEXP (x, 0))))
1223         return gen_lowpart_common (mode, XEXP (x, 0));
1224       else if (msize < xsize)
1225         return gen_rtx_fmt_e (GET_CODE (x), mode, XEXP (x, 0));
1226     }
1227   else if (GET_CODE (x) == SUBREG || REG_P (x)
1228            || GET_CODE (x) == CONCAT || GET_CODE (x) == CONST_VECTOR
1229            || GET_CODE (x) == CONST_DOUBLE || GET_CODE (x) == CONST_INT)
1230     return simplify_gen_subreg (mode, x, innermode, offset);
1231
1232   /* Otherwise, we can't do this.  */
1233   return 0;
1234 }
1235 \f
1236 rtx
1237 gen_highpart (enum machine_mode mode, rtx x)
1238 {
1239   unsigned int msize = GET_MODE_SIZE (mode);
1240   rtx result;
1241
1242   /* This case loses if X is a subreg.  To catch bugs early,
1243      complain if an invalid MODE is used even in other cases.  */
1244   gcc_assert (msize <= UNITS_PER_WORD
1245               || msize == (unsigned int) GET_MODE_UNIT_SIZE (GET_MODE (x)));
1246
1247   result = simplify_gen_subreg (mode, x, GET_MODE (x),
1248                                 subreg_highpart_offset (mode, GET_MODE (x)));
1249   gcc_assert (result);
1250   
1251   /* simplify_gen_subreg is not guaranteed to return a valid operand for
1252      the target if we have a MEM.  gen_highpart must return a valid operand,
1253      emitting code if necessary to do so.  */
1254   if (MEM_P (result))
1255     {
1256       result = validize_mem (result);
1257       gcc_assert (result);
1258     }
1259   
1260   return result;
1261 }
1262
1263 /* Like gen_highpart, but accept mode of EXP operand in case EXP can
1264    be VOIDmode constant.  */
1265 rtx
1266 gen_highpart_mode (enum machine_mode outermode, enum machine_mode innermode, rtx exp)
1267 {
1268   if (GET_MODE (exp) != VOIDmode)
1269     {
1270       gcc_assert (GET_MODE (exp) == innermode);
1271       return gen_highpart (outermode, exp);
1272     }
1273   return simplify_gen_subreg (outermode, exp, innermode,
1274                               subreg_highpart_offset (outermode, innermode));
1275 }
1276
1277 /* Return the SUBREG_BYTE for an OUTERMODE lowpart of an INNERMODE value.  */
1278
1279 unsigned int
1280 subreg_lowpart_offset (enum machine_mode outermode, enum machine_mode innermode)
1281 {
1282   unsigned int offset = 0;
1283   int difference = (GET_MODE_SIZE (innermode) - GET_MODE_SIZE (outermode));
1284
1285   if (difference > 0)
1286     {
1287       if (WORDS_BIG_ENDIAN)
1288         offset += (difference / UNITS_PER_WORD) * UNITS_PER_WORD;
1289       if (BYTES_BIG_ENDIAN)
1290         offset += difference % UNITS_PER_WORD;
1291     }
1292
1293   return offset;
1294 }
1295
1296 /* Return offset in bytes to get OUTERMODE high part
1297    of the value in mode INNERMODE stored in memory in target format.  */
1298 unsigned int
1299 subreg_highpart_offset (enum machine_mode outermode, enum machine_mode innermode)
1300 {
1301   unsigned int offset = 0;
1302   int difference = (GET_MODE_SIZE (innermode) - GET_MODE_SIZE (outermode));
1303
1304   gcc_assert (GET_MODE_SIZE (innermode) >= GET_MODE_SIZE (outermode));
1305
1306   if (difference > 0)
1307     {
1308       if (! WORDS_BIG_ENDIAN)
1309         offset += (difference / UNITS_PER_WORD) * UNITS_PER_WORD;
1310       if (! BYTES_BIG_ENDIAN)
1311         offset += difference % UNITS_PER_WORD;
1312     }
1313
1314   return offset;
1315 }
1316
1317 /* Return 1 iff X, assumed to be a SUBREG,
1318    refers to the least significant part of its containing reg.
1319    If X is not a SUBREG, always return 1 (it is its own low part!).  */
1320
1321 int
1322 subreg_lowpart_p (const_rtx x)
1323 {
1324   if (GET_CODE (x) != SUBREG)
1325     return 1;
1326   else if (GET_MODE (SUBREG_REG (x)) == VOIDmode)
1327     return 0;
1328
1329   return (subreg_lowpart_offset (GET_MODE (x), GET_MODE (SUBREG_REG (x)))
1330           == SUBREG_BYTE (x));
1331 }
1332 \f
1333 /* Return subword OFFSET of operand OP.
1334    The word number, OFFSET, is interpreted as the word number starting
1335    at the low-order address.  OFFSET 0 is the low-order word if not
1336    WORDS_BIG_ENDIAN, otherwise it is the high-order word.
1337
1338    If we cannot extract the required word, we return zero.  Otherwise,
1339    an rtx corresponding to the requested word will be returned.
1340
1341    VALIDATE_ADDRESS is nonzero if the address should be validated.  Before
1342    reload has completed, a valid address will always be returned.  After
1343    reload, if a valid address cannot be returned, we return zero.
1344
1345    If VALIDATE_ADDRESS is zero, we simply form the required address; validating
1346    it is the responsibility of the caller.
1347
1348    MODE is the mode of OP in case it is a CONST_INT.
1349
1350    ??? This is still rather broken for some cases.  The problem for the
1351    moment is that all callers of this thing provide no 'goal mode' to
1352    tell us to work with.  This exists because all callers were written
1353    in a word based SUBREG world.
1354    Now use of this function can be deprecated by simplify_subreg in most
1355    cases.
1356  */
1357
1358 rtx
1359 operand_subword (rtx op, unsigned int offset, int validate_address, enum machine_mode mode)
1360 {
1361   if (mode == VOIDmode)
1362     mode = GET_MODE (op);
1363
1364   gcc_assert (mode != VOIDmode);
1365
1366   /* If OP is narrower than a word, fail.  */
1367   if (mode != BLKmode
1368       && (GET_MODE_SIZE (mode) < UNITS_PER_WORD))
1369     return 0;
1370
1371   /* If we want a word outside OP, return zero.  */
1372   if (mode != BLKmode
1373       && (offset + 1) * UNITS_PER_WORD > GET_MODE_SIZE (mode))
1374     return const0_rtx;
1375
1376   /* Form a new MEM at the requested address.  */
1377   if (MEM_P (op))
1378     {
1379       rtx new_rtx = adjust_address_nv (op, word_mode, offset * UNITS_PER_WORD);
1380
1381       if (! validate_address)
1382         return new_rtx;
1383
1384       else if (reload_completed)
1385         {
1386           if (! strict_memory_address_p (word_mode, XEXP (new_rtx, 0)))
1387             return 0;
1388         }
1389       else
1390         return replace_equiv_address (new_rtx, XEXP (new_rtx, 0));
1391     }
1392
1393   /* Rest can be handled by simplify_subreg.  */
1394   return simplify_gen_subreg (word_mode, op, mode, (offset * UNITS_PER_WORD));
1395 }
1396
1397 /* Similar to `operand_subword', but never return 0.  If we can't
1398    extract the required subword, put OP into a register and try again.
1399    The second attempt must succeed.  We always validate the address in
1400    this case.
1401
1402    MODE is the mode of OP, in case it is CONST_INT.  */
1403
1404 rtx
1405 operand_subword_force (rtx op, unsigned int offset, enum machine_mode mode)
1406 {
1407   rtx result = operand_subword (op, offset, 1, mode);
1408
1409   if (result)
1410     return result;
1411
1412   if (mode != BLKmode && mode != VOIDmode)
1413     {
1414       /* If this is a register which can not be accessed by words, copy it
1415          to a pseudo register.  */
1416       if (REG_P (op))
1417         op = copy_to_reg (op);
1418       else
1419         op = force_reg (mode, op);
1420     }
1421
1422   result = operand_subword (op, offset, 1, mode);
1423   gcc_assert (result);
1424
1425   return result;
1426 }
1427 \f
1428 /* Within a MEM_EXPR, we care about either (1) a component ref of a decl,
1429    or (2) a component ref of something variable.  Represent the later with
1430    a NULL expression.  */
1431
1432 static tree
1433 component_ref_for_mem_expr (tree ref)
1434 {
1435   tree inner = TREE_OPERAND (ref, 0);
1436
1437   if (TREE_CODE (inner) == COMPONENT_REF)
1438     inner = component_ref_for_mem_expr (inner);
1439   else
1440     {
1441       /* Now remove any conversions: they don't change what the underlying
1442          object is.  Likewise for SAVE_EXPR.  */
1443       while (CONVERT_EXPR_P (inner)
1444              || TREE_CODE (inner) == VIEW_CONVERT_EXPR
1445              || TREE_CODE (inner) == SAVE_EXPR)
1446         inner = TREE_OPERAND (inner, 0);
1447
1448       if (! DECL_P (inner))
1449         inner = NULL_TREE;
1450     }
1451
1452   if (inner == TREE_OPERAND (ref, 0))
1453     return ref;
1454   else
1455     return build3 (COMPONENT_REF, TREE_TYPE (ref), inner,
1456                    TREE_OPERAND (ref, 1), NULL_TREE);
1457 }
1458
1459 /* Returns 1 if both MEM_EXPR can be considered equal
1460    and 0 otherwise.  */
1461
1462 int
1463 mem_expr_equal_p (const_tree expr1, const_tree expr2)
1464 {
1465   if (expr1 == expr2)
1466     return 1;
1467
1468   if (! expr1 || ! expr2)
1469     return 0;
1470
1471   if (TREE_CODE (expr1) != TREE_CODE (expr2))
1472     return 0;
1473
1474   if (TREE_CODE (expr1) == COMPONENT_REF)
1475     return 
1476       mem_expr_equal_p (TREE_OPERAND (expr1, 0),
1477                         TREE_OPERAND (expr2, 0))
1478       && mem_expr_equal_p (TREE_OPERAND (expr1, 1), /* field decl */
1479                            TREE_OPERAND (expr2, 1));
1480   
1481   if (INDIRECT_REF_P (expr1))
1482     return mem_expr_equal_p (TREE_OPERAND (expr1, 0),
1483                              TREE_OPERAND (expr2, 0));
1484
1485   /* ARRAY_REFs, ARRAY_RANGE_REFs and BIT_FIELD_REFs should already
1486               have been resolved here.  */
1487   gcc_assert (DECL_P (expr1));
1488   
1489   /* Decls with different pointers can't be equal.  */
1490   return 0;
1491 }
1492
1493 /* Given REF (a MEM) and T, either the type of X or the expression
1494    corresponding to REF, set the memory attributes.  OBJECTP is nonzero
1495    if we are making a new object of this type.  BITPOS is nonzero if
1496    there is an offset outstanding on T that will be applied later.  */
1497
1498 void
1499 set_mem_attributes_minus_bitpos (rtx ref, tree t, int objectp,
1500                                  HOST_WIDE_INT bitpos)
1501 {
1502   alias_set_type alias = MEM_ALIAS_SET (ref);
1503   tree expr = MEM_EXPR (ref);
1504   rtx offset = MEM_OFFSET (ref);
1505   rtx size = MEM_SIZE (ref);
1506   unsigned int align = MEM_ALIGN (ref);
1507   HOST_WIDE_INT apply_bitpos = 0;
1508   tree type;
1509
1510   /* It can happen that type_for_mode was given a mode for which there
1511      is no language-level type.  In which case it returns NULL, which
1512      we can see here.  */
1513   if (t == NULL_TREE)
1514     return;
1515
1516   type = TYPE_P (t) ? t : TREE_TYPE (t);
1517   if (type == error_mark_node)
1518     return;
1519
1520   /* If we have already set DECL_RTL = ref, get_alias_set will get the
1521      wrong answer, as it assumes that DECL_RTL already has the right alias
1522      info.  Callers should not set DECL_RTL until after the call to
1523      set_mem_attributes.  */
1524   gcc_assert (!DECL_P (t) || ref != DECL_RTL_IF_SET (t));
1525
1526   /* Get the alias set from the expression or type (perhaps using a
1527      front-end routine) and use it.  */
1528   alias = get_alias_set (t);
1529
1530   MEM_VOLATILE_P (ref) |= TYPE_VOLATILE (type);
1531   MEM_IN_STRUCT_P (ref)
1532     = AGGREGATE_TYPE_P (type) || TREE_CODE (type) == COMPLEX_TYPE;
1533   MEM_POINTER (ref) = POINTER_TYPE_P (type);
1534
1535   /* If we are making an object of this type, or if this is a DECL, we know
1536      that it is a scalar if the type is not an aggregate.  */
1537   if ((objectp || DECL_P (t))
1538       && ! AGGREGATE_TYPE_P (type)
1539       && TREE_CODE (type) != COMPLEX_TYPE)
1540     MEM_SCALAR_P (ref) = 1;
1541
1542   /* We can set the alignment from the type if we are making an object,
1543      this is an INDIRECT_REF, or if TYPE_ALIGN_OK.  */
1544   if (objectp || TREE_CODE (t) == INDIRECT_REF 
1545       || TREE_CODE (t) == ALIGN_INDIRECT_REF 
1546       || TYPE_ALIGN_OK (type))
1547     align = MAX (align, TYPE_ALIGN (type));
1548   else 
1549     if (TREE_CODE (t) == MISALIGNED_INDIRECT_REF)
1550       {
1551         if (integer_zerop (TREE_OPERAND (t, 1)))
1552           /* We don't know anything about the alignment.  */
1553           align = BITS_PER_UNIT;
1554         else
1555           align = tree_low_cst (TREE_OPERAND (t, 1), 1);
1556       }
1557
1558   /* If the size is known, we can set that.  */
1559   if (TYPE_SIZE_UNIT (type) && host_integerp (TYPE_SIZE_UNIT (type), 1))
1560     size = GEN_INT (tree_low_cst (TYPE_SIZE_UNIT (type), 1));
1561
1562   /* If T is not a type, we may be able to deduce some more information about
1563      the expression.  */
1564   if (! TYPE_P (t))
1565     {
1566       tree base;
1567       bool align_computed = false;
1568
1569       if (TREE_THIS_VOLATILE (t))
1570         MEM_VOLATILE_P (ref) = 1;
1571
1572       /* Now remove any conversions: they don't change what the underlying
1573          object is.  Likewise for SAVE_EXPR.  */
1574       while (CONVERT_EXPR_P (t)
1575              || TREE_CODE (t) == VIEW_CONVERT_EXPR
1576              || TREE_CODE (t) == SAVE_EXPR)
1577         t = TREE_OPERAND (t, 0);
1578
1579       /* We may look through structure-like accesses for the purposes of
1580          examining TREE_THIS_NOTRAP, but not array-like accesses.  */
1581       base = t;
1582       while (TREE_CODE (base) == COMPONENT_REF
1583              || TREE_CODE (base) == REALPART_EXPR
1584              || TREE_CODE (base) == IMAGPART_EXPR
1585              || TREE_CODE (base) == BIT_FIELD_REF)
1586         base = TREE_OPERAND (base, 0);
1587
1588       if (DECL_P (base))
1589         {
1590           if (CODE_CONTAINS_STRUCT (TREE_CODE (base), TS_DECL_WITH_VIS))
1591             MEM_NOTRAP_P (ref) = !DECL_WEAK (base);
1592           else
1593             MEM_NOTRAP_P (ref) = 1;
1594         }
1595       else
1596         MEM_NOTRAP_P (ref) = TREE_THIS_NOTRAP (base);
1597
1598       base = get_base_address (base);
1599       if (base && DECL_P (base)
1600           && TREE_READONLY (base)
1601           && (TREE_STATIC (base) || DECL_EXTERNAL (base)))
1602         {
1603           tree base_type = TREE_TYPE (base);
1604           gcc_assert (!(base_type && TYPE_NEEDS_CONSTRUCTING (base_type))
1605                       || DECL_ARTIFICIAL (base));
1606           MEM_READONLY_P (ref) = 1;
1607         }
1608
1609       /* If this expression uses it's parent's alias set, mark it such
1610          that we won't change it.  */
1611       if (component_uses_parent_alias_set (t))
1612         MEM_KEEP_ALIAS_SET_P (ref) = 1;
1613
1614       /* If this is a decl, set the attributes of the MEM from it.  */
1615       if (DECL_P (t))
1616         {
1617           expr = t;
1618           offset = const0_rtx;
1619           apply_bitpos = bitpos;
1620           size = (DECL_SIZE_UNIT (t)
1621                   && host_integerp (DECL_SIZE_UNIT (t), 1)
1622                   ? GEN_INT (tree_low_cst (DECL_SIZE_UNIT (t), 1)) : 0);
1623           align = DECL_ALIGN (t);
1624           align_computed = true;
1625         }
1626
1627       /* If this is a constant, we know the alignment.  */
1628       else if (CONSTANT_CLASS_P (t))
1629         {
1630           align = TYPE_ALIGN (type);
1631 #ifdef CONSTANT_ALIGNMENT
1632           align = CONSTANT_ALIGNMENT (t, align);
1633 #endif
1634           align_computed = true;
1635         }
1636
1637       /* If this is a field reference and not a bit-field, record it.  */
1638       /* ??? There is some information that can be gleaned from bit-fields,
1639          such as the word offset in the structure that might be modified.
1640          But skip it for now.  */
1641       else if (TREE_CODE (t) == COMPONENT_REF
1642                && ! DECL_BIT_FIELD (TREE_OPERAND (t, 1)))
1643         {
1644           expr = component_ref_for_mem_expr (t);
1645           offset = const0_rtx;
1646           apply_bitpos = bitpos;
1647           /* ??? Any reason the field size would be different than
1648              the size we got from the type?  */
1649         }
1650
1651       /* If this is an array reference, look for an outer field reference.  */
1652       else if (TREE_CODE (t) == ARRAY_REF)
1653         {
1654           tree off_tree = size_zero_node;
1655           /* We can't modify t, because we use it at the end of the
1656              function.  */
1657           tree t2 = t;
1658
1659           do
1660             {
1661               tree index = TREE_OPERAND (t2, 1);
1662               tree low_bound = array_ref_low_bound (t2);
1663               tree unit_size = array_ref_element_size (t2);
1664
1665               /* We assume all arrays have sizes that are a multiple of a byte.
1666                  First subtract the lower bound, if any, in the type of the
1667                  index, then convert to sizetype and multiply by the size of
1668                  the array element.  */
1669               if (! integer_zerop (low_bound))
1670                 index = fold_build2 (MINUS_EXPR, TREE_TYPE (index),
1671                                      index, low_bound);
1672
1673               off_tree = size_binop (PLUS_EXPR,
1674                                      size_binop (MULT_EXPR,
1675                                                  fold_convert (sizetype,
1676                                                                index),
1677                                                  unit_size),
1678                                      off_tree);
1679               t2 = TREE_OPERAND (t2, 0);
1680             }
1681           while (TREE_CODE (t2) == ARRAY_REF);
1682
1683           if (DECL_P (t2))
1684             {
1685               expr = t2;
1686               offset = NULL;
1687               if (host_integerp (off_tree, 1))
1688                 {
1689                   HOST_WIDE_INT ioff = tree_low_cst (off_tree, 1);
1690                   HOST_WIDE_INT aoff = (ioff & -ioff) * BITS_PER_UNIT;
1691                   align = DECL_ALIGN (t2);
1692                   if (aoff && (unsigned HOST_WIDE_INT) aoff < align)
1693                     align = aoff;
1694                   align_computed = true;
1695                   offset = GEN_INT (ioff);
1696                   apply_bitpos = bitpos;
1697                 }
1698             }
1699           else if (TREE_CODE (t2) == COMPONENT_REF)
1700             {
1701               expr = component_ref_for_mem_expr (t2);
1702               if (host_integerp (off_tree, 1))
1703                 {
1704                   offset = GEN_INT (tree_low_cst (off_tree, 1));
1705                   apply_bitpos = bitpos;
1706                 }
1707               /* ??? Any reason the field size would be different than
1708                  the size we got from the type?  */
1709             }
1710           else if (flag_argument_noalias > 1
1711                    && (INDIRECT_REF_P (t2))
1712                    && TREE_CODE (TREE_OPERAND (t2, 0)) == PARM_DECL)
1713             {
1714               expr = t2;
1715               offset = NULL;
1716             }
1717         }
1718
1719       /* If this is a Fortran indirect argument reference, record the
1720          parameter decl.  */
1721       else if (flag_argument_noalias > 1
1722                && (INDIRECT_REF_P (t))
1723                && TREE_CODE (TREE_OPERAND (t, 0)) == PARM_DECL)
1724         {
1725           expr = t;
1726           offset = NULL;
1727         }
1728
1729       if (!align_computed && !INDIRECT_REF_P (t))
1730         {
1731           unsigned int obj_align
1732             = get_object_alignment (t, align, BIGGEST_ALIGNMENT);
1733           align = MAX (align, obj_align);
1734         }
1735     }
1736
1737   /* If we modified OFFSET based on T, then subtract the outstanding
1738      bit position offset.  Similarly, increase the size of the accessed
1739      object to contain the negative offset.  */
1740   if (apply_bitpos)
1741     {
1742       offset = plus_constant (offset, -(apply_bitpos / BITS_PER_UNIT));
1743       if (size)
1744         size = plus_constant (size, apply_bitpos / BITS_PER_UNIT);
1745     }
1746
1747   if (TREE_CODE (t) == ALIGN_INDIRECT_REF)
1748     {
1749       /* Force EXPR and OFFSET to NULL, since we don't know exactly what
1750          we're overlapping.  */
1751       offset = NULL;
1752       expr = NULL;
1753     }
1754
1755   /* Now set the attributes we computed above.  */
1756   MEM_ATTRS (ref)
1757     = get_mem_attrs (alias, expr, offset, size, align, GET_MODE (ref));
1758
1759   /* If this is already known to be a scalar or aggregate, we are done.  */
1760   if (MEM_IN_STRUCT_P (ref) || MEM_SCALAR_P (ref))
1761     return;
1762
1763   /* If it is a reference into an aggregate, this is part of an aggregate.
1764      Otherwise we don't know.  */
1765   else if (TREE_CODE (t) == COMPONENT_REF || TREE_CODE (t) == ARRAY_REF
1766            || TREE_CODE (t) == ARRAY_RANGE_REF
1767            || TREE_CODE (t) == BIT_FIELD_REF)
1768     MEM_IN_STRUCT_P (ref) = 1;
1769 }
1770
1771 void
1772 set_mem_attributes (rtx ref, tree t, int objectp)
1773 {
1774   set_mem_attributes_minus_bitpos (ref, t, objectp, 0);
1775 }
1776
1777 /* Set MEM to the decl that REG refers to.  */
1778
1779 void
1780 set_mem_attrs_from_reg (rtx mem, rtx reg)
1781 {
1782   MEM_ATTRS (mem)
1783     = get_mem_attrs (MEM_ALIAS_SET (mem), REG_EXPR (reg),
1784                      GEN_INT (REG_OFFSET (reg)),
1785                      MEM_SIZE (mem), MEM_ALIGN (mem), GET_MODE (mem));
1786 }
1787
1788 /* Set the alias set of MEM to SET.  */
1789
1790 void
1791 set_mem_alias_set (rtx mem, alias_set_type set)
1792 {
1793 #ifdef ENABLE_CHECKING
1794   /* If the new and old alias sets don't conflict, something is wrong.  */
1795   gcc_assert (alias_sets_conflict_p (set, MEM_ALIAS_SET (mem)));
1796 #endif
1797
1798   MEM_ATTRS (mem) = get_mem_attrs (set, MEM_EXPR (mem), MEM_OFFSET (mem),
1799                                    MEM_SIZE (mem), MEM_ALIGN (mem),
1800                                    GET_MODE (mem));
1801 }
1802
1803 /* Set the alignment of MEM to ALIGN bits.  */
1804
1805 void
1806 set_mem_align (rtx mem, unsigned int align)
1807 {
1808   MEM_ATTRS (mem) = get_mem_attrs (MEM_ALIAS_SET (mem), MEM_EXPR (mem),
1809                                    MEM_OFFSET (mem), MEM_SIZE (mem), align,
1810                                    GET_MODE (mem));
1811 }
1812
1813 /* Set the expr for MEM to EXPR.  */
1814
1815 void
1816 set_mem_expr (rtx mem, tree expr)
1817 {
1818   MEM_ATTRS (mem)
1819     = get_mem_attrs (MEM_ALIAS_SET (mem), expr, MEM_OFFSET (mem),
1820                      MEM_SIZE (mem), MEM_ALIGN (mem), GET_MODE (mem));
1821 }
1822
1823 /* Set the offset of MEM to OFFSET.  */
1824
1825 void
1826 set_mem_offset (rtx mem, rtx offset)
1827 {
1828   MEM_ATTRS (mem) = get_mem_attrs (MEM_ALIAS_SET (mem), MEM_EXPR (mem),
1829                                    offset, MEM_SIZE (mem), MEM_ALIGN (mem),
1830                                    GET_MODE (mem));
1831 }
1832
1833 /* Set the size of MEM to SIZE.  */
1834
1835 void
1836 set_mem_size (rtx mem, rtx size)
1837 {
1838   MEM_ATTRS (mem) = get_mem_attrs (MEM_ALIAS_SET (mem), MEM_EXPR (mem),
1839                                    MEM_OFFSET (mem), size, MEM_ALIGN (mem),
1840                                    GET_MODE (mem));
1841 }
1842 \f
1843 /* Return a memory reference like MEMREF, but with its mode changed to MODE
1844    and its address changed to ADDR.  (VOIDmode means don't change the mode.
1845    NULL for ADDR means don't change the address.)  VALIDATE is nonzero if the
1846    returned memory location is required to be valid.  The memory
1847    attributes are not changed.  */
1848
1849 static rtx
1850 change_address_1 (rtx memref, enum machine_mode mode, rtx addr, int validate)
1851 {
1852   rtx new_rtx;
1853
1854   gcc_assert (MEM_P (memref));
1855   if (mode == VOIDmode)
1856     mode = GET_MODE (memref);
1857   if (addr == 0)
1858     addr = XEXP (memref, 0);
1859   if (mode == GET_MODE (memref) && addr == XEXP (memref, 0)
1860       && (!validate || memory_address_p (mode, addr)))
1861     return memref;
1862
1863   if (validate)
1864     {
1865       if (reload_in_progress || reload_completed)
1866         gcc_assert (memory_address_p (mode, addr));
1867       else
1868         addr = memory_address (mode, addr);
1869     }
1870
1871   if (rtx_equal_p (addr, XEXP (memref, 0)) && mode == GET_MODE (memref))
1872     return memref;
1873
1874   new_rtx = gen_rtx_MEM (mode, addr);
1875   MEM_COPY_ATTRIBUTES (new_rtx, memref);
1876   return new_rtx;
1877 }
1878
1879 /* Like change_address_1 with VALIDATE nonzero, but we are not saying in what
1880    way we are changing MEMREF, so we only preserve the alias set.  */
1881
1882 rtx
1883 change_address (rtx memref, enum machine_mode mode, rtx addr)
1884 {
1885   rtx new_rtx = change_address_1 (memref, mode, addr, 1), size;
1886   enum machine_mode mmode = GET_MODE (new_rtx);
1887   unsigned int align;
1888
1889   size = mmode == BLKmode ? 0 : GEN_INT (GET_MODE_SIZE (mmode));
1890   align = mmode == BLKmode ? BITS_PER_UNIT : GET_MODE_ALIGNMENT (mmode);
1891
1892   /* If there are no changes, just return the original memory reference.  */
1893   if (new_rtx == memref)
1894     {
1895       if (MEM_ATTRS (memref) == 0
1896           || (MEM_EXPR (memref) == NULL
1897               && MEM_OFFSET (memref) == NULL
1898               && MEM_SIZE (memref) == size
1899               && MEM_ALIGN (memref) == align))
1900         return new_rtx;
1901
1902       new_rtx = gen_rtx_MEM (mmode, XEXP (memref, 0));
1903       MEM_COPY_ATTRIBUTES (new_rtx, memref);
1904     }
1905
1906   MEM_ATTRS (new_rtx)
1907     = get_mem_attrs (MEM_ALIAS_SET (memref), 0, 0, size, align, mmode);
1908
1909   return new_rtx;
1910 }
1911
1912 /* Return a memory reference like MEMREF, but with its mode changed
1913    to MODE and its address offset by OFFSET bytes.  If VALIDATE is
1914    nonzero, the memory address is forced to be valid.
1915    If ADJUST is zero, OFFSET is only used to update MEM_ATTRS
1916    and caller is responsible for adjusting MEMREF base register.  */
1917
1918 rtx
1919 adjust_address_1 (rtx memref, enum machine_mode mode, HOST_WIDE_INT offset,
1920                   int validate, int adjust)
1921 {
1922   rtx addr = XEXP (memref, 0);
1923   rtx new_rtx;
1924   rtx memoffset = MEM_OFFSET (memref);
1925   rtx size = 0;
1926   unsigned int memalign = MEM_ALIGN (memref);
1927
1928   /* If there are no changes, just return the original memory reference.  */
1929   if (mode == GET_MODE (memref) && !offset
1930       && (!validate || memory_address_p (mode, addr)))
1931     return memref;
1932
1933   /* ??? Prefer to create garbage instead of creating shared rtl.
1934      This may happen even if offset is nonzero -- consider
1935      (plus (plus reg reg) const_int) -- so do this always.  */
1936   addr = copy_rtx (addr);
1937
1938   if (adjust)
1939     {
1940       /* If MEMREF is a LO_SUM and the offset is within the alignment of the
1941          object, we can merge it into the LO_SUM.  */
1942       if (GET_MODE (memref) != BLKmode && GET_CODE (addr) == LO_SUM
1943           && offset >= 0
1944           && (unsigned HOST_WIDE_INT) offset
1945               < GET_MODE_ALIGNMENT (GET_MODE (memref)) / BITS_PER_UNIT)
1946         addr = gen_rtx_LO_SUM (Pmode, XEXP (addr, 0),
1947                                plus_constant (XEXP (addr, 1), offset));
1948       else
1949         addr = plus_constant (addr, offset);
1950     }
1951
1952   new_rtx = change_address_1 (memref, mode, addr, validate);
1953
1954   /* Compute the new values of the memory attributes due to this adjustment.
1955      We add the offsets and update the alignment.  */
1956   if (memoffset)
1957     memoffset = GEN_INT (offset + INTVAL (memoffset));
1958
1959   /* Compute the new alignment by taking the MIN of the alignment and the
1960      lowest-order set bit in OFFSET, but don't change the alignment if OFFSET
1961      if zero.  */
1962   if (offset != 0)
1963     memalign
1964       = MIN (memalign,
1965              (unsigned HOST_WIDE_INT) (offset & -offset) * BITS_PER_UNIT);
1966
1967   /* We can compute the size in a number of ways.  */
1968   if (GET_MODE (new_rtx) != BLKmode)
1969     size = GEN_INT (GET_MODE_SIZE (GET_MODE (new_rtx)));
1970   else if (MEM_SIZE (memref))
1971     size = plus_constant (MEM_SIZE (memref), -offset);
1972
1973   MEM_ATTRS (new_rtx) = get_mem_attrs (MEM_ALIAS_SET (memref), MEM_EXPR (memref),
1974                                    memoffset, size, memalign, GET_MODE (new_rtx));
1975
1976   /* At some point, we should validate that this offset is within the object,
1977      if all the appropriate values are known.  */
1978   return new_rtx;
1979 }
1980
1981 /* Return a memory reference like MEMREF, but with its mode changed
1982    to MODE and its address changed to ADDR, which is assumed to be
1983    MEMREF offset by OFFSET bytes.  If VALIDATE is
1984    nonzero, the memory address is forced to be valid.  */
1985
1986 rtx
1987 adjust_automodify_address_1 (rtx memref, enum machine_mode mode, rtx addr,
1988                              HOST_WIDE_INT offset, int validate)
1989 {
1990   memref = change_address_1 (memref, VOIDmode, addr, validate);
1991   return adjust_address_1 (memref, mode, offset, validate, 0);
1992 }
1993
1994 /* Return a memory reference like MEMREF, but whose address is changed by
1995    adding OFFSET, an RTX, to it.  POW2 is the highest power of two factor
1996    known to be in OFFSET (possibly 1).  */
1997
1998 rtx
1999 offset_address (rtx memref, rtx offset, unsigned HOST_WIDE_INT pow2)
2000 {
2001   rtx new_rtx, addr = XEXP (memref, 0);
2002
2003   new_rtx = simplify_gen_binary (PLUS, Pmode, addr, offset);
2004
2005   /* At this point we don't know _why_ the address is invalid.  It
2006      could have secondary memory references, multiplies or anything.
2007
2008      However, if we did go and rearrange things, we can wind up not
2009      being able to recognize the magic around pic_offset_table_rtx.
2010      This stuff is fragile, and is yet another example of why it is
2011      bad to expose PIC machinery too early.  */
2012   if (! memory_address_p (GET_MODE (memref), new_rtx)
2013       && GET_CODE (addr) == PLUS
2014       && XEXP (addr, 0) == pic_offset_table_rtx)
2015     {
2016       addr = force_reg (GET_MODE (addr), addr);
2017       new_rtx = simplify_gen_binary (PLUS, Pmode, addr, offset);
2018     }
2019
2020   update_temp_slot_address (XEXP (memref, 0), new_rtx);
2021   new_rtx = change_address_1 (memref, VOIDmode, new_rtx, 1);
2022
2023   /* If there are no changes, just return the original memory reference.  */
2024   if (new_rtx == memref)
2025     return new_rtx;
2026
2027   /* Update the alignment to reflect the offset.  Reset the offset, which
2028      we don't know.  */
2029   MEM_ATTRS (new_rtx)
2030     = get_mem_attrs (MEM_ALIAS_SET (memref), MEM_EXPR (memref), 0, 0,
2031                      MIN (MEM_ALIGN (memref), pow2 * BITS_PER_UNIT),
2032                      GET_MODE (new_rtx));
2033   return new_rtx;
2034 }
2035
2036 /* Return a memory reference like MEMREF, but with its address changed to
2037    ADDR.  The caller is asserting that the actual piece of memory pointed
2038    to is the same, just the form of the address is being changed, such as
2039    by putting something into a register.  */
2040
2041 rtx
2042 replace_equiv_address (rtx memref, rtx addr)
2043 {
2044   /* change_address_1 copies the memory attribute structure without change
2045      and that's exactly what we want here.  */
2046   update_temp_slot_address (XEXP (memref, 0), addr);
2047   return change_address_1 (memref, VOIDmode, addr, 1);
2048 }
2049
2050 /* Likewise, but the reference is not required to be valid.  */
2051
2052 rtx
2053 replace_equiv_address_nv (rtx memref, rtx addr)
2054 {
2055   return change_address_1 (memref, VOIDmode, addr, 0);
2056 }
2057
2058 /* Return a memory reference like MEMREF, but with its mode widened to
2059    MODE and offset by OFFSET.  This would be used by targets that e.g.
2060    cannot issue QImode memory operations and have to use SImode memory
2061    operations plus masking logic.  */
2062
2063 rtx
2064 widen_memory_access (rtx memref, enum machine_mode mode, HOST_WIDE_INT offset)
2065 {
2066   rtx new_rtx = adjust_address_1 (memref, mode, offset, 1, 1);
2067   tree expr = MEM_EXPR (new_rtx);
2068   rtx memoffset = MEM_OFFSET (new_rtx);
2069   unsigned int size = GET_MODE_SIZE (mode);
2070
2071   /* If there are no changes, just return the original memory reference.  */
2072   if (new_rtx == memref)
2073     return new_rtx;
2074
2075   /* If we don't know what offset we were at within the expression, then
2076      we can't know if we've overstepped the bounds.  */
2077   if (! memoffset)
2078     expr = NULL_TREE;
2079
2080   while (expr)
2081     {
2082       if (TREE_CODE (expr) == COMPONENT_REF)
2083         {
2084           tree field = TREE_OPERAND (expr, 1);
2085           tree offset = component_ref_field_offset (expr);
2086
2087           if (! DECL_SIZE_UNIT (field))
2088             {
2089               expr = NULL_TREE;
2090               break;
2091             }
2092
2093           /* Is the field at least as large as the access?  If so, ok,
2094              otherwise strip back to the containing structure.  */
2095           if (TREE_CODE (DECL_SIZE_UNIT (field)) == INTEGER_CST
2096               && compare_tree_int (DECL_SIZE_UNIT (field), size) >= 0
2097               && INTVAL (memoffset) >= 0)
2098             break;
2099
2100           if (! host_integerp (offset, 1))
2101             {
2102               expr = NULL_TREE;
2103               break;
2104             }
2105
2106           expr = TREE_OPERAND (expr, 0);
2107           memoffset
2108             = (GEN_INT (INTVAL (memoffset)
2109                         + tree_low_cst (offset, 1)
2110                         + (tree_low_cst (DECL_FIELD_BIT_OFFSET (field), 1)
2111                            / BITS_PER_UNIT)));
2112         }
2113       /* Similarly for the decl.  */
2114       else if (DECL_P (expr)
2115                && DECL_SIZE_UNIT (expr)
2116                && TREE_CODE (DECL_SIZE_UNIT (expr)) == INTEGER_CST
2117                && compare_tree_int (DECL_SIZE_UNIT (expr), size) >= 0
2118                && (! memoffset || INTVAL (memoffset) >= 0))
2119         break;
2120       else
2121         {
2122           /* The widened memory access overflows the expression, which means
2123              that it could alias another expression.  Zap it.  */
2124           expr = NULL_TREE;
2125           break;
2126         }
2127     }
2128
2129   if (! expr)
2130     memoffset = NULL_RTX;
2131
2132   /* The widened memory may alias other stuff, so zap the alias set.  */
2133   /* ??? Maybe use get_alias_set on any remaining expression.  */
2134
2135   MEM_ATTRS (new_rtx) = get_mem_attrs (0, expr, memoffset, GEN_INT (size),
2136                                    MEM_ALIGN (new_rtx), mode);
2137
2138   return new_rtx;
2139 }
2140 \f
2141 /* A fake decl that is used as the MEM_EXPR of spill slots.  */
2142 static GTY(()) tree spill_slot_decl;
2143
2144 tree
2145 get_spill_slot_decl (bool force_build_p)
2146 {
2147   tree d = spill_slot_decl;
2148   rtx rd;
2149
2150   if (d || !force_build_p)
2151     return d;
2152
2153   d = build_decl (VAR_DECL, get_identifier ("%sfp"), void_type_node);
2154   DECL_ARTIFICIAL (d) = 1;
2155   DECL_IGNORED_P (d) = 1;
2156   TREE_USED (d) = 1;
2157   TREE_THIS_NOTRAP (d) = 1;
2158   spill_slot_decl = d;
2159
2160   rd = gen_rtx_MEM (BLKmode, frame_pointer_rtx);
2161   MEM_NOTRAP_P (rd) = 1;
2162   MEM_ATTRS (rd) = get_mem_attrs (new_alias_set (), d, const0_rtx,
2163                                   NULL_RTX, 0, BLKmode);
2164   SET_DECL_RTL (d, rd);
2165
2166   return d;
2167 }
2168
2169 /* Given MEM, a result from assign_stack_local, fill in the memory
2170    attributes as appropriate for a register allocator spill slot.
2171    These slots are not aliasable by other memory.  We arrange for
2172    them all to use a single MEM_EXPR, so that the aliasing code can
2173    work properly in the case of shared spill slots.  */
2174
2175 void
2176 set_mem_attrs_for_spill (rtx mem)
2177 {
2178   alias_set_type alias;
2179   rtx addr, offset;
2180   tree expr;
2181
2182   expr = get_spill_slot_decl (true);
2183   alias = MEM_ALIAS_SET (DECL_RTL (expr));
2184
2185   /* We expect the incoming memory to be of the form:
2186         (mem:MODE (plus (reg sfp) (const_int offset)))
2187      with perhaps the plus missing for offset = 0.  */
2188   addr = XEXP (mem, 0);
2189   offset = const0_rtx;
2190   if (GET_CODE (addr) == PLUS
2191       && GET_CODE (XEXP (addr, 1)) == CONST_INT)
2192     offset = XEXP (addr, 1);
2193
2194   MEM_ATTRS (mem) = get_mem_attrs (alias, expr, offset,
2195                                    MEM_SIZE (mem), MEM_ALIGN (mem),
2196                                    GET_MODE (mem));
2197   MEM_NOTRAP_P (mem) = 1;
2198 }
2199 \f
2200 /* Return a newly created CODE_LABEL rtx with a unique label number.  */
2201
2202 rtx
2203 gen_label_rtx (void)
2204 {
2205   return gen_rtx_CODE_LABEL (VOIDmode, 0, NULL_RTX, NULL_RTX,
2206                              NULL, label_num++, NULL);
2207 }
2208 \f
2209 /* For procedure integration.  */
2210
2211 /* Install new pointers to the first and last insns in the chain.
2212    Also, set cur_insn_uid to one higher than the last in use.
2213    Used for an inline-procedure after copying the insn chain.  */
2214
2215 void
2216 set_new_first_and_last_insn (rtx first, rtx last)
2217 {
2218   rtx insn;
2219
2220   first_insn = first;
2221   last_insn = last;
2222   cur_insn_uid = 0;
2223
2224   for (insn = first; insn; insn = NEXT_INSN (insn))
2225     cur_insn_uid = MAX (cur_insn_uid, INSN_UID (insn));
2226
2227   cur_insn_uid++;
2228 }
2229 \f
2230 /* Go through all the RTL insn bodies and copy any invalid shared
2231    structure.  This routine should only be called once.  */
2232
2233 static void
2234 unshare_all_rtl_1 (rtx insn)
2235 {
2236   /* Unshare just about everything else.  */
2237   unshare_all_rtl_in_chain (insn);
2238
2239   /* Make sure the addresses of stack slots found outside the insn chain
2240      (such as, in DECL_RTL of a variable) are not shared
2241      with the insn chain.
2242
2243      This special care is necessary when the stack slot MEM does not
2244      actually appear in the insn chain.  If it does appear, its address
2245      is unshared from all else at that point.  */
2246   stack_slot_list = copy_rtx_if_shared (stack_slot_list);
2247 }
2248
2249 /* Go through all the RTL insn bodies and copy any invalid shared
2250    structure, again.  This is a fairly expensive thing to do so it
2251    should be done sparingly.  */
2252
2253 void
2254 unshare_all_rtl_again (rtx insn)
2255 {
2256   rtx p;
2257   tree decl;
2258
2259   for (p = insn; p; p = NEXT_INSN (p))
2260     if (INSN_P (p))
2261       {
2262         reset_used_flags (PATTERN (p));
2263         reset_used_flags (REG_NOTES (p));
2264       }
2265
2266   /* Make sure that virtual stack slots are not shared.  */
2267   set_used_decls (DECL_INITIAL (cfun->decl));
2268
2269   /* Make sure that virtual parameters are not shared.  */
2270   for (decl = DECL_ARGUMENTS (cfun->decl); decl; decl = TREE_CHAIN (decl))
2271     set_used_flags (DECL_RTL (decl));
2272
2273   reset_used_flags (stack_slot_list);
2274
2275   unshare_all_rtl_1 (insn);
2276 }
2277
2278 unsigned int
2279 unshare_all_rtl (void)
2280 {
2281   unshare_all_rtl_1 (get_insns ());
2282   return 0;
2283 }
2284
2285 struct rtl_opt_pass pass_unshare_all_rtl =
2286 {
2287  {
2288   RTL_PASS,
2289   "unshare",                            /* name */
2290   NULL,                                 /* gate */
2291   unshare_all_rtl,                      /* execute */
2292   NULL,                                 /* sub */
2293   NULL,                                 /* next */
2294   0,                                    /* static_pass_number */
2295   0,                                    /* tv_id */
2296   0,                                    /* properties_required */
2297   0,                                    /* properties_provided */
2298   0,                                    /* properties_destroyed */
2299   0,                                    /* todo_flags_start */
2300   TODO_dump_func | TODO_verify_rtl_sharing /* todo_flags_finish */
2301  }
2302 };
2303
2304
2305 /* Check that ORIG is not marked when it should not be and mark ORIG as in use,
2306    Recursively does the same for subexpressions.  */
2307
2308 static void
2309 verify_rtx_sharing (rtx orig, rtx insn)
2310 {
2311   rtx x = orig;
2312   int i;
2313   enum rtx_code code;
2314   const char *format_ptr;
2315
2316   if (x == 0)
2317     return;
2318
2319   code = GET_CODE (x);
2320
2321   /* These types may be freely shared.  */
2322
2323   switch (code)
2324     {
2325     case REG:
2326     case CONST_INT:
2327     case CONST_DOUBLE:
2328     case CONST_FIXED:
2329     case CONST_VECTOR:
2330     case SYMBOL_REF:
2331     case LABEL_REF:
2332     case CODE_LABEL:
2333     case PC:
2334     case CC0:
2335     case SCRATCH:
2336       return;
2337       /* SCRATCH must be shared because they represent distinct values.  */
2338     case CLOBBER:
2339       if (REG_P (XEXP (x, 0)) && REGNO (XEXP (x, 0)) < FIRST_PSEUDO_REGISTER)
2340         return;
2341       break;
2342
2343     case CONST:
2344       if (shared_const_p (orig))
2345         return;
2346       break;
2347
2348     case MEM:
2349       /* A MEM is allowed to be shared if its address is constant.  */
2350       if (CONSTANT_ADDRESS_P (XEXP (x, 0))
2351           || reload_completed || reload_in_progress)
2352         return;
2353
2354       break;
2355
2356     default:
2357       break;
2358     }
2359
2360   /* This rtx may not be shared.  If it has already been seen,
2361      replace it with a copy of itself.  */
2362 #ifdef ENABLE_CHECKING
2363   if (RTX_FLAG (x, used))
2364     {
2365       error ("invalid rtl sharing found in the insn");
2366       debug_rtx (insn);
2367       error ("shared rtx");
2368       debug_rtx (x);
2369       internal_error ("internal consistency failure");
2370     }
2371 #endif
2372   gcc_assert (!RTX_FLAG (x, used));
2373   
2374   RTX_FLAG (x, used) = 1;
2375
2376   /* Now scan the subexpressions recursively.  */
2377
2378   format_ptr = GET_RTX_FORMAT (code);
2379
2380   for (i = 0; i < GET_RTX_LENGTH (code); i++)
2381     {
2382       switch (*format_ptr++)
2383         {
2384         case 'e':
2385           verify_rtx_sharing (XEXP (x, i), insn);
2386           break;
2387
2388         case 'E':
2389           if (XVEC (x, i) != NULL)
2390             {
2391               int j;
2392               int len = XVECLEN (x, i);
2393
2394               for (j = 0; j < len; j++)
2395                 {
2396                   /* We allow sharing of ASM_OPERANDS inside single
2397                      instruction.  */
2398                   if (j && GET_CODE (XVECEXP (x, i, j)) == SET
2399                       && (GET_CODE (SET_SRC (XVECEXP (x, i, j)))
2400                           == ASM_OPERANDS))
2401                     verify_rtx_sharing (SET_DEST (XVECEXP (x, i, j)), insn);
2402                   else
2403                     verify_rtx_sharing (XVECEXP (x, i, j), insn);
2404                 }
2405             }
2406           break;
2407         }
2408     }
2409   return;
2410 }
2411
2412 /* Go through all the RTL insn bodies and check that there is no unexpected
2413    sharing in between the subexpressions.  */
2414
2415 void
2416 verify_rtl_sharing (void)
2417 {
2418   rtx p;
2419
2420   for (p = get_insns (); p; p = NEXT_INSN (p))
2421     if (INSN_P (p))
2422       {
2423         reset_used_flags (PATTERN (p));
2424         reset_used_flags (REG_NOTES (p));
2425         if (GET_CODE (PATTERN (p)) == SEQUENCE)
2426           {
2427             int i;
2428             rtx q, sequence = PATTERN (p);
2429
2430             for (i = 0; i < XVECLEN (sequence, 0); i++)
2431               {
2432                 q = XVECEXP (sequence, 0, i);
2433                 gcc_assert (INSN_P (q));
2434                 reset_used_flags (PATTERN (q));
2435                 reset_used_flags (REG_NOTES (q));
2436               }
2437           }
2438       }
2439
2440   for (p = get_insns (); p; p = NEXT_INSN (p))
2441     if (INSN_P (p))
2442       {
2443         verify_rtx_sharing (PATTERN (p), p);
2444         verify_rtx_sharing (REG_NOTES (p), p);
2445       }
2446 }
2447
2448 /* Go through all the RTL insn bodies and copy any invalid shared structure.
2449    Assumes the mark bits are cleared at entry.  */
2450
2451 void
2452 unshare_all_rtl_in_chain (rtx insn)
2453 {
2454   for (; insn; insn = NEXT_INSN (insn))
2455     if (INSN_P (insn))
2456       {
2457         PATTERN (insn) = copy_rtx_if_shared (PATTERN (insn));
2458         REG_NOTES (insn) = copy_rtx_if_shared (REG_NOTES (insn));
2459       }
2460 }
2461
2462 /* Go through all virtual stack slots of a function and mark them as
2463    shared.  We never replace the DECL_RTLs themselves with a copy,
2464    but expressions mentioned into a DECL_RTL cannot be shared with
2465    expressions in the instruction stream.
2466
2467    Note that reload may convert pseudo registers into memories in-place.
2468    Pseudo registers are always shared, but MEMs never are.  Thus if we
2469    reset the used flags on MEMs in the instruction stream, we must set
2470    them again on MEMs that appear in DECL_RTLs.  */
2471
2472 static void
2473 set_used_decls (tree blk)
2474 {
2475   tree t;
2476
2477   /* Mark decls.  */
2478   for (t = BLOCK_VARS (blk); t; t = TREE_CHAIN (t))
2479     if (DECL_RTL_SET_P (t))
2480       set_used_flags (DECL_RTL (t));
2481
2482   /* Now process sub-blocks.  */
2483   for (t = BLOCK_SUBBLOCKS (blk); t; t = BLOCK_CHAIN (t))
2484     set_used_decls (t);
2485 }
2486
2487 /* Mark ORIG as in use, and return a copy of it if it was already in use.
2488    Recursively does the same for subexpressions.  Uses
2489    copy_rtx_if_shared_1 to reduce stack space.  */
2490
2491 rtx
2492 copy_rtx_if_shared (rtx orig)
2493 {
2494   copy_rtx_if_shared_1 (&orig);
2495   return orig;
2496 }
2497
2498 /* Mark *ORIG1 as in use, and set it to a copy of it if it was already in
2499    use.  Recursively does the same for subexpressions.  */
2500
2501 static void
2502 copy_rtx_if_shared_1 (rtx *orig1)
2503 {
2504   rtx x;
2505   int i;
2506   enum rtx_code code;
2507   rtx *last_ptr;
2508   const char *format_ptr;
2509   int copied = 0;
2510   int length;
2511
2512   /* Repeat is used to turn tail-recursion into iteration.  */
2513 repeat:
2514   x = *orig1;
2515
2516   if (x == 0)
2517     return;
2518
2519   code = GET_CODE (x);
2520
2521   /* These types may be freely shared.  */
2522
2523   switch (code)
2524     {
2525     case REG:
2526     case CONST_INT:
2527     case CONST_DOUBLE:
2528     case CONST_FIXED:
2529     case CONST_VECTOR:
2530     case SYMBOL_REF:
2531     case LABEL_REF:
2532     case CODE_LABEL:
2533     case PC:
2534     case CC0:
2535     case SCRATCH:
2536       /* SCRATCH must be shared because they represent distinct values.  */
2537       return;
2538     case CLOBBER:
2539       if (REG_P (XEXP (x, 0)) && REGNO (XEXP (x, 0)) < FIRST_PSEUDO_REGISTER)
2540         return;
2541       break;
2542
2543     case CONST:
2544       if (shared_const_p (x))
2545         return;
2546       break;
2547
2548     case INSN:
2549     case JUMP_INSN:
2550     case CALL_INSN:
2551     case NOTE:
2552     case BARRIER:
2553       /* The chain of insns is not being copied.  */
2554       return;
2555
2556     default:
2557       break;
2558     }
2559
2560   /* This rtx may not be shared.  If it has already been seen,
2561      replace it with a copy of itself.  */
2562
2563   if (RTX_FLAG (x, used))
2564     {
2565       x = shallow_copy_rtx (x);
2566       copied = 1;
2567     }
2568   RTX_FLAG (x, used) = 1;
2569
2570   /* Now scan the subexpressions recursively.
2571      We can store any replaced subexpressions directly into X
2572      since we know X is not shared!  Any vectors in X
2573      must be copied if X was copied.  */
2574
2575   format_ptr = GET_RTX_FORMAT (code);
2576   length = GET_RTX_LENGTH (code);
2577   last_ptr = NULL;
2578   
2579   for (i = 0; i < length; i++)
2580     {
2581       switch (*format_ptr++)
2582         {
2583         case 'e':
2584           if (last_ptr)
2585             copy_rtx_if_shared_1 (last_ptr);
2586           last_ptr = &XEXP (x, i);
2587           break;
2588
2589         case 'E':
2590           if (XVEC (x, i) != NULL)
2591             {
2592               int j;
2593               int len = XVECLEN (x, i);
2594               
2595               /* Copy the vector iff I copied the rtx and the length
2596                  is nonzero.  */
2597               if (copied && len > 0)
2598                 XVEC (x, i) = gen_rtvec_v (len, XVEC (x, i)->elem);
2599               
2600               /* Call recursively on all inside the vector.  */
2601               for (j = 0; j < len; j++)
2602                 {
2603                   if (last_ptr)
2604                     copy_rtx_if_shared_1 (last_ptr);
2605                   last_ptr = &XVECEXP (x, i, j);
2606                 }
2607             }
2608           break;
2609         }
2610     }
2611   *orig1 = x;
2612   if (last_ptr)
2613     {
2614       orig1 = last_ptr;
2615       goto repeat;
2616     }
2617   return;
2618 }
2619
2620 /* Clear all the USED bits in X to allow copy_rtx_if_shared to be used
2621    to look for shared sub-parts.  */
2622
2623 void
2624 reset_used_flags (rtx x)
2625 {
2626   int i, j;
2627   enum rtx_code code;
2628   const char *format_ptr;
2629   int length;
2630
2631   /* Repeat is used to turn tail-recursion into iteration.  */
2632 repeat:
2633   if (x == 0)
2634     return;
2635
2636   code = GET_CODE (x);
2637
2638   /* These types may be freely shared so we needn't do any resetting
2639      for them.  */
2640
2641   switch (code)
2642     {
2643     case REG:
2644     case CONST_INT:
2645     case CONST_DOUBLE:
2646     case CONST_FIXED:
2647     case CONST_VECTOR:
2648     case SYMBOL_REF:
2649     case CODE_LABEL:
2650     case PC:
2651     case CC0:
2652       return;
2653
2654     case INSN:
2655     case JUMP_INSN:
2656     case CALL_INSN:
2657     case NOTE:
2658     case LABEL_REF:
2659     case BARRIER:
2660       /* The chain of insns is not being copied.  */
2661       return;
2662
2663     default:
2664       break;
2665     }
2666
2667   RTX_FLAG (x, used) = 0;
2668
2669   format_ptr = GET_RTX_FORMAT (code);
2670   length = GET_RTX_LENGTH (code);
2671   
2672   for (i = 0; i < length; i++)
2673     {
2674       switch (*format_ptr++)
2675         {
2676         case 'e':
2677           if (i == length-1)
2678             {
2679               x = XEXP (x, i);
2680               goto repeat;
2681             }
2682           reset_used_flags (XEXP (x, i));
2683           break;
2684
2685         case 'E':
2686           for (j = 0; j < XVECLEN (x, i); j++)
2687             reset_used_flags (XVECEXP (x, i, j));
2688           break;
2689         }
2690     }
2691 }
2692
2693 /* Set all the USED bits in X to allow copy_rtx_if_shared to be used
2694    to look for shared sub-parts.  */
2695
2696 void
2697 set_used_flags (rtx x)
2698 {
2699   int i, j;
2700   enum rtx_code code;
2701   const char *format_ptr;
2702
2703   if (x == 0)
2704     return;
2705
2706   code = GET_CODE (x);
2707
2708   /* These types may be freely shared so we needn't do any resetting
2709      for them.  */
2710
2711   switch (code)
2712     {
2713     case REG:
2714     case CONST_INT:
2715     case CONST_DOUBLE:
2716     case CONST_FIXED:
2717     case CONST_VECTOR:
2718     case SYMBOL_REF:
2719     case CODE_LABEL:
2720     case PC:
2721     case CC0:
2722       return;
2723
2724     case INSN:
2725     case JUMP_INSN:
2726     case CALL_INSN:
2727     case NOTE:
2728     case LABEL_REF:
2729     case BARRIER:
2730       /* The chain of insns is not being copied.  */
2731       return;
2732
2733     default:
2734       break;
2735     }
2736
2737   RTX_FLAG (x, used) = 1;
2738
2739   format_ptr = GET_RTX_FORMAT (code);
2740   for (i = 0; i < GET_RTX_LENGTH (code); i++)
2741     {
2742       switch (*format_ptr++)
2743         {
2744         case 'e':
2745           set_used_flags (XEXP (x, i));
2746           break;
2747
2748         case 'E':
2749           for (j = 0; j < XVECLEN (x, i); j++)
2750             set_used_flags (XVECEXP (x, i, j));
2751           break;
2752         }
2753     }
2754 }
2755 \f
2756 /* Copy X if necessary so that it won't be altered by changes in OTHER.
2757    Return X or the rtx for the pseudo reg the value of X was copied into.
2758    OTHER must be valid as a SET_DEST.  */
2759
2760 rtx
2761 make_safe_from (rtx x, rtx other)
2762 {
2763   while (1)
2764     switch (GET_CODE (other))
2765       {
2766       case SUBREG:
2767         other = SUBREG_REG (other);
2768         break;
2769       case STRICT_LOW_PART:
2770       case SIGN_EXTEND:
2771       case ZERO_EXTEND:
2772         other = XEXP (other, 0);
2773         break;
2774       default:
2775         goto done;
2776       }
2777  done:
2778   if ((MEM_P (other)
2779        && ! CONSTANT_P (x)
2780        && !REG_P (x)
2781        && GET_CODE (x) != SUBREG)
2782       || (REG_P (other)
2783           && (REGNO (other) < FIRST_PSEUDO_REGISTER
2784               || reg_mentioned_p (other, x))))
2785     {
2786       rtx temp = gen_reg_rtx (GET_MODE (x));
2787       emit_move_insn (temp, x);
2788       return temp;
2789     }
2790   return x;
2791 }
2792 \f
2793 /* Emission of insns (adding them to the doubly-linked list).  */
2794
2795 /* Return the first insn of the current sequence or current function.  */
2796
2797 rtx
2798 get_insns (void)
2799 {
2800   return first_insn;
2801 }
2802
2803 /* Specify a new insn as the first in the chain.  */
2804
2805 void
2806 set_first_insn (rtx insn)
2807 {
2808   gcc_assert (!PREV_INSN (insn));
2809   first_insn = insn;
2810 }
2811
2812 /* Return the last insn emitted in current sequence or current function.  */
2813
2814 rtx
2815 get_last_insn (void)
2816 {
2817   return last_insn;
2818 }
2819
2820 /* Specify a new insn as the last in the chain.  */
2821
2822 void
2823 set_last_insn (rtx insn)
2824 {
2825   gcc_assert (!NEXT_INSN (insn));
2826   last_insn = insn;
2827 }
2828
2829 /* Return the last insn emitted, even if it is in a sequence now pushed.  */
2830
2831 rtx
2832 get_last_insn_anywhere (void)
2833 {
2834   struct sequence_stack *stack;
2835   if (last_insn)
2836     return last_insn;
2837   for (stack = seq_stack; stack; stack = stack->next)
2838     if (stack->last != 0)
2839       return stack->last;
2840   return 0;
2841 }
2842
2843 /* Return the first nonnote insn emitted in current sequence or current
2844    function.  This routine looks inside SEQUENCEs.  */
2845
2846 rtx
2847 get_first_nonnote_insn (void)
2848 {
2849   rtx insn = first_insn;
2850
2851   if (insn)
2852     {
2853       if (NOTE_P (insn))
2854         for (insn = next_insn (insn);
2855              insn && NOTE_P (insn);
2856              insn = next_insn (insn))
2857           continue;
2858       else
2859         {
2860           if (NONJUMP_INSN_P (insn)
2861               && GET_CODE (PATTERN (insn)) == SEQUENCE)
2862             insn = XVECEXP (PATTERN (insn), 0, 0);
2863         }
2864     }
2865
2866   return insn;
2867 }
2868
2869 /* Return the last nonnote insn emitted in current sequence or current
2870    function.  This routine looks inside SEQUENCEs.  */
2871
2872 rtx
2873 get_last_nonnote_insn (void)
2874 {
2875   rtx insn = last_insn;
2876
2877   if (insn)
2878     {
2879       if (NOTE_P (insn))
2880         for (insn = previous_insn (insn);
2881              insn && NOTE_P (insn);
2882              insn = previous_insn (insn))
2883           continue;
2884       else
2885         {
2886           if (NONJUMP_INSN_P (insn)
2887               && GET_CODE (PATTERN (insn)) == SEQUENCE)
2888             insn = XVECEXP (PATTERN (insn), 0,
2889                             XVECLEN (PATTERN (insn), 0) - 1);
2890         }
2891     }
2892
2893   return insn;
2894 }
2895
2896 /* Return a number larger than any instruction's uid in this function.  */
2897
2898 int
2899 get_max_uid (void)
2900 {
2901   return cur_insn_uid;
2902 }
2903 \f
2904 /* Return the next insn.  If it is a SEQUENCE, return the first insn
2905    of the sequence.  */
2906
2907 rtx
2908 next_insn (rtx insn)
2909 {
2910   if (insn)
2911     {
2912       insn = NEXT_INSN (insn);
2913       if (insn && NONJUMP_INSN_P (insn)
2914           && GET_CODE (PATTERN (insn)) == SEQUENCE)
2915         insn = XVECEXP (PATTERN (insn), 0, 0);
2916     }
2917
2918   return insn;
2919 }
2920
2921 /* Return the previous insn.  If it is a SEQUENCE, return the last insn
2922    of the sequence.  */
2923
2924 rtx
2925 previous_insn (rtx insn)
2926 {
2927   if (insn)
2928     {
2929       insn = PREV_INSN (insn);
2930       if (insn && NONJUMP_INSN_P (insn)
2931           && GET_CODE (PATTERN (insn)) == SEQUENCE)
2932         insn = XVECEXP (PATTERN (insn), 0, XVECLEN (PATTERN (insn), 0) - 1);
2933     }
2934
2935   return insn;
2936 }
2937
2938 /* Return the next insn after INSN that is not a NOTE.  This routine does not
2939    look inside SEQUENCEs.  */
2940
2941 rtx
2942 next_nonnote_insn (rtx insn)
2943 {
2944   while (insn)
2945     {
2946       insn = NEXT_INSN (insn);
2947       if (insn == 0 || !NOTE_P (insn))
2948         break;
2949     }
2950
2951   return insn;
2952 }
2953
2954 /* Return the previous insn before INSN that is not a NOTE.  This routine does
2955    not look inside SEQUENCEs.  */
2956
2957 rtx
2958 prev_nonnote_insn (rtx insn)
2959 {
2960   while (insn)
2961     {
2962       insn = PREV_INSN (insn);
2963       if (insn == 0 || !NOTE_P (insn))
2964         break;
2965     }
2966
2967   return insn;
2968 }
2969
2970 /* Return the next INSN, CALL_INSN or JUMP_INSN after INSN;
2971    or 0, if there is none.  This routine does not look inside
2972    SEQUENCEs.  */
2973
2974 rtx
2975 next_real_insn (rtx insn)
2976 {
2977   while (insn)
2978     {
2979       insn = NEXT_INSN (insn);
2980       if (insn == 0 || INSN_P (insn))
2981         break;
2982     }
2983
2984   return insn;
2985 }
2986
2987 /* Return the last INSN, CALL_INSN or JUMP_INSN before INSN;
2988    or 0, if there is none.  This routine does not look inside
2989    SEQUENCEs.  */
2990
2991 rtx
2992 prev_real_insn (rtx insn)
2993 {
2994   while (insn)
2995     {
2996       insn = PREV_INSN (insn);
2997       if (insn == 0 || INSN_P (insn))
2998         break;
2999     }
3000
3001   return insn;
3002 }
3003
3004 /* Return the last CALL_INSN in the current list, or 0 if there is none.
3005    This routine does not look inside SEQUENCEs.  */
3006
3007 rtx
3008 last_call_insn (void)
3009 {
3010   rtx insn;
3011
3012   for (insn = get_last_insn ();
3013        insn && !CALL_P (insn);
3014        insn = PREV_INSN (insn))
3015     ;
3016
3017   return insn;
3018 }
3019
3020 /* Find the next insn after INSN that really does something.  This routine
3021    does not look inside SEQUENCEs.  Until reload has completed, this is the
3022    same as next_real_insn.  */
3023
3024 int
3025 active_insn_p (const_rtx insn)
3026 {
3027   return (CALL_P (insn) || JUMP_P (insn)
3028           || (NONJUMP_INSN_P (insn)
3029               && (! reload_completed
3030                   || (GET_CODE (PATTERN (insn)) != USE
3031                       && GET_CODE (PATTERN (insn)) != CLOBBER))));
3032 }
3033
3034 rtx
3035 next_active_insn (rtx insn)
3036 {
3037   while (insn)
3038     {
3039       insn = NEXT_INSN (insn);
3040       if (insn == 0 || active_insn_p (insn))
3041         break;
3042     }
3043
3044   return insn;
3045 }
3046
3047 /* Find the last insn before INSN that really does something.  This routine
3048    does not look inside SEQUENCEs.  Until reload has completed, this is the
3049    same as prev_real_insn.  */
3050
3051 rtx
3052 prev_active_insn (rtx insn)
3053 {
3054   while (insn)
3055     {
3056       insn = PREV_INSN (insn);
3057       if (insn == 0 || active_insn_p (insn))
3058         break;
3059     }
3060
3061   return insn;
3062 }
3063
3064 /* Return the next CODE_LABEL after the insn INSN, or 0 if there is none.  */
3065
3066 rtx
3067 next_label (rtx insn)
3068 {
3069   while (insn)
3070     {
3071       insn = NEXT_INSN (insn);
3072       if (insn == 0 || LABEL_P (insn))
3073         break;
3074     }
3075
3076   return insn;
3077 }
3078
3079 /* Return the last CODE_LABEL before the insn INSN, or 0 if there is none.  */
3080
3081 rtx
3082 prev_label (rtx insn)
3083 {
3084   while (insn)
3085     {
3086       insn = PREV_INSN (insn);
3087       if (insn == 0 || LABEL_P (insn))
3088         break;
3089     }
3090
3091   return insn;
3092 }
3093
3094 /* Return the last label to mark the same position as LABEL.  Return null
3095    if LABEL itself is null.  */
3096
3097 rtx
3098 skip_consecutive_labels (rtx label)
3099 {
3100   rtx insn;
3101
3102   for (insn = label; insn != 0 && !INSN_P (insn); insn = NEXT_INSN (insn))
3103     if (LABEL_P (insn))
3104       label = insn;
3105
3106   return label;
3107 }
3108 \f
3109 #ifdef HAVE_cc0
3110 /* INSN uses CC0 and is being moved into a delay slot.  Set up REG_CC_SETTER
3111    and REG_CC_USER notes so we can find it.  */
3112
3113 void
3114 link_cc0_insns (rtx insn)
3115 {
3116   rtx user = next_nonnote_insn (insn);
3117
3118   if (NONJUMP_INSN_P (user) && GET_CODE (PATTERN (user)) == SEQUENCE)
3119     user = XVECEXP (PATTERN (user), 0, 0);
3120
3121   add_reg_note (user, REG_CC_SETTER, insn);
3122   add_reg_note (insn, REG_CC_USER, user);
3123 }
3124
3125 /* Return the next insn that uses CC0 after INSN, which is assumed to
3126    set it.  This is the inverse of prev_cc0_setter (i.e., prev_cc0_setter
3127    applied to the result of this function should yield INSN).
3128
3129    Normally, this is simply the next insn.  However, if a REG_CC_USER note
3130    is present, it contains the insn that uses CC0.
3131
3132    Return 0 if we can't find the insn.  */
3133
3134 rtx
3135 next_cc0_user (rtx insn)
3136 {
3137   rtx note = find_reg_note (insn, REG_CC_USER, NULL_RTX);
3138
3139   if (note)
3140     return XEXP (note, 0);
3141
3142   insn = next_nonnote_insn (insn);
3143   if (insn && NONJUMP_INSN_P (insn) && GET_CODE (PATTERN (insn)) == SEQUENCE)
3144     insn = XVECEXP (PATTERN (insn), 0, 0);
3145
3146   if (insn && INSN_P (insn) && reg_mentioned_p (cc0_rtx, PATTERN (insn)))
3147     return insn;
3148
3149   return 0;
3150 }
3151
3152 /* Find the insn that set CC0 for INSN.  Unless INSN has a REG_CC_SETTER
3153    note, it is the previous insn.  */
3154
3155 rtx
3156 prev_cc0_setter (rtx insn)
3157 {
3158   rtx note = find_reg_note (insn, REG_CC_SETTER, NULL_RTX);
3159
3160   if (note)
3161     return XEXP (note, 0);
3162
3163   insn = prev_nonnote_insn (insn);
3164   gcc_assert (sets_cc0_p (PATTERN (insn)));
3165
3166   return insn;
3167 }
3168 #endif
3169
3170 #ifdef AUTO_INC_DEC
3171 /* Find a RTX_AUTOINC class rtx which matches DATA.  */
3172
3173 static int
3174 find_auto_inc (rtx *xp, void *data)
3175 {
3176   rtx x = *xp;
3177   rtx reg = (rtx) data;
3178
3179   if (GET_RTX_CLASS (GET_CODE (x)) != RTX_AUTOINC)
3180     return 0;
3181
3182   switch (GET_CODE (x))
3183     {
3184       case PRE_DEC:
3185       case PRE_INC:
3186       case POST_DEC:
3187       case POST_INC:
3188       case PRE_MODIFY:
3189       case POST_MODIFY:
3190         if (rtx_equal_p (reg, XEXP (x, 0)))
3191           return 1;
3192         break;
3193
3194       default:
3195         gcc_unreachable ();
3196     }
3197   return -1;
3198 }
3199 #endif
3200
3201 /* Increment the label uses for all labels present in rtx.  */
3202
3203 static void
3204 mark_label_nuses (rtx x)
3205 {
3206   enum rtx_code code;
3207   int i, j;
3208   const char *fmt;
3209
3210   code = GET_CODE (x);
3211   if (code == LABEL_REF && LABEL_P (XEXP (x, 0)))
3212     LABEL_NUSES (XEXP (x, 0))++;
3213
3214   fmt = GET_RTX_FORMAT (code);
3215   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
3216     {
3217       if (fmt[i] == 'e')
3218         mark_label_nuses (XEXP (x, i));
3219       else if (fmt[i] == 'E')
3220         for (j = XVECLEN (x, i) - 1; j >= 0; j--)
3221           mark_label_nuses (XVECEXP (x, i, j));
3222     }
3223 }
3224
3225 \f
3226 /* Try splitting insns that can be split for better scheduling.
3227    PAT is the pattern which might split.
3228    TRIAL is the insn providing PAT.
3229    LAST is nonzero if we should return the last insn of the sequence produced.
3230
3231    If this routine succeeds in splitting, it returns the first or last
3232    replacement insn depending on the value of LAST.  Otherwise, it
3233    returns TRIAL.  If the insn to be returned can be split, it will be.  */
3234
3235 rtx
3236 try_split (rtx pat, rtx trial, int last)
3237 {
3238   rtx before = PREV_INSN (trial);
3239   rtx after = NEXT_INSN (trial);
3240   int has_barrier = 0;
3241   rtx note, seq, tem;
3242   int probability;
3243   rtx insn_last, insn;
3244   int njumps = 0;
3245
3246   if (any_condjump_p (trial)
3247       && (note = find_reg_note (trial, REG_BR_PROB, 0)))
3248     split_branch_probability = INTVAL (XEXP (note, 0));
3249   probability = split_branch_probability;
3250
3251   seq = split_insns (pat, trial);
3252
3253   split_branch_probability = -1;
3254
3255   /* If we are splitting a JUMP_INSN, it might be followed by a BARRIER.
3256      We may need to handle this specially.  */
3257   if (after && BARRIER_P (after))
3258     {
3259       has_barrier = 1;
3260       after = NEXT_INSN (after);
3261     }
3262
3263   if (!seq)
3264     return trial;
3265
3266   /* Avoid infinite loop if any insn of the result matches
3267      the original pattern.  */
3268   insn_last = seq;
3269   while (1)
3270     {
3271       if (INSN_P (insn_last)
3272           && rtx_equal_p (PATTERN (insn_last), pat))
3273         return trial;
3274       if (!NEXT_INSN (insn_last))
3275         break;
3276       insn_last = NEXT_INSN (insn_last);
3277     }
3278
3279   /* We will be adding the new sequence to the function.  The splitters
3280      may have introduced invalid RTL sharing, so unshare the sequence now.  */
3281   unshare_all_rtl_in_chain (seq);
3282
3283   /* Mark labels.  */
3284   for (insn = insn_last; insn ; insn = PREV_INSN (insn))
3285     {
3286       if (JUMP_P (insn))
3287         {
3288           mark_jump_label (PATTERN (insn), insn, 0);
3289           njumps++;
3290           if (probability != -1
3291               && any_condjump_p (insn)
3292               && !find_reg_note (insn, REG_BR_PROB, 0))
3293             {
3294               /* We can preserve the REG_BR_PROB notes only if exactly
3295                  one jump is created, otherwise the machine description
3296                  is responsible for this step using
3297                  split_branch_probability variable.  */
3298               gcc_assert (njumps == 1);
3299               add_reg_note (insn, REG_BR_PROB, GEN_INT (probability));
3300             }
3301         }
3302     }
3303
3304   /* If we are splitting a CALL_INSN, look for the CALL_INSN
3305      in SEQ and copy our CALL_INSN_FUNCTION_USAGE to it.  */
3306   if (CALL_P (trial))
3307     {
3308       for (insn = insn_last; insn ; insn = PREV_INSN (insn))
3309         if (CALL_P (insn))
3310           {
3311             rtx *p = &CALL_INSN_FUNCTION_USAGE (insn);
3312             while (*p)
3313               p = &XEXP (*p, 1);
3314             *p = CALL_INSN_FUNCTION_USAGE (trial);
3315             SIBLING_CALL_P (insn) = SIBLING_CALL_P (trial);
3316           }
3317     }
3318
3319   /* Copy notes, particularly those related to the CFG.  */
3320   for (note = REG_NOTES (trial); note; note = XEXP (note, 1))
3321     {
3322       switch (REG_NOTE_KIND (note))
3323         {
3324         case REG_EH_REGION:
3325           for (insn = insn_last; insn != NULL_RTX; insn = PREV_INSN (insn))
3326             {
3327               if (CALL_P (insn)
3328                   || (flag_non_call_exceptions && INSN_P (insn)
3329                       && may_trap_p (PATTERN (insn))))
3330                 add_reg_note (insn, REG_EH_REGION, XEXP (note, 0));
3331             }
3332           break;
3333
3334         case REG_NORETURN:
3335         case REG_SETJMP:
3336           for (insn = insn_last; insn != NULL_RTX; insn = PREV_INSN (insn))
3337             {
3338               if (CALL_P (insn))
3339                 add_reg_note (insn, REG_NOTE_KIND (note), XEXP (note, 0));
3340             }
3341           break;
3342
3343         case REG_NON_LOCAL_GOTO:
3344           for (insn = insn_last; insn != NULL_RTX; insn = PREV_INSN (insn))
3345             {
3346               if (JUMP_P (insn))
3347                 add_reg_note (insn, REG_NOTE_KIND (note), XEXP (note, 0));
3348             }
3349           break;
3350
3351 #ifdef AUTO_INC_DEC
3352         case REG_INC:
3353           for (insn = insn_last; insn != NULL_RTX; insn = PREV_INSN (insn))
3354             {
3355               rtx reg = XEXP (note, 0);
3356               if (!FIND_REG_INC_NOTE (insn, reg)
3357                   && for_each_rtx (&PATTERN (insn), find_auto_inc, reg) > 0)
3358                 add_reg_note (insn, REG_INC, reg);
3359             }
3360           break;
3361 #endif
3362
3363         default:
3364           break;
3365         }
3366     }
3367
3368   /* If there are LABELS inside the split insns increment the
3369      usage count so we don't delete the label.  */
3370   if (INSN_P (trial))
3371     {
3372       insn = insn_last;
3373       while (insn != NULL_RTX)
3374         {
3375           /* JUMP_P insns have already been "marked" above.  */
3376           if (NONJUMP_INSN_P (insn))
3377             mark_label_nuses (PATTERN (insn));
3378
3379           insn = PREV_INSN (insn);
3380         }
3381     }
3382
3383   tem = emit_insn_after_setloc (seq, trial, INSN_LOCATOR (trial));
3384
3385   delete_insn (trial);
3386   if (has_barrier)
3387     emit_barrier_after (tem);
3388
3389   /* Recursively call try_split for each new insn created; by the
3390      time control returns here that insn will be fully split, so
3391      set LAST and continue from the insn after the one returned.
3392      We can't use next_active_insn here since AFTER may be a note.
3393      Ignore deleted insns, which can be occur if not optimizing.  */
3394   for (tem = NEXT_INSN (before); tem != after; tem = NEXT_INSN (tem))
3395     if (! INSN_DELETED_P (tem) && INSN_P (tem))
3396       tem = try_split (PATTERN (tem), tem, 1);
3397
3398   /* Return either the first or the last insn, depending on which was
3399      requested.  */
3400   return last
3401     ? (after ? PREV_INSN (after) : last_insn)
3402     : NEXT_INSN (before);
3403 }
3404 \f
3405 /* Make and return an INSN rtx, initializing all its slots.
3406    Store PATTERN in the pattern slots.  */
3407
3408 rtx
3409 make_insn_raw (rtx pattern)
3410 {
3411   rtx insn;
3412
3413   insn = rtx_alloc (INSN);
3414
3415   INSN_UID (insn) = cur_insn_uid++;
3416   PATTERN (insn) = pattern;
3417   INSN_CODE (insn) = -1;
3418   REG_NOTES (insn) = NULL;
3419   INSN_LOCATOR (insn) = curr_insn_locator ();
3420   BLOCK_FOR_INSN (insn) = NULL;
3421
3422 #ifdef ENABLE_RTL_CHECKING
3423   if (insn
3424       && INSN_P (insn)
3425       && (returnjump_p (insn)
3426           || (GET_CODE (insn) == SET
3427               && SET_DEST (insn) == pc_rtx)))
3428     {
3429       warning (0, "ICE: emit_insn used where emit_jump_insn needed:\n");
3430       debug_rtx (insn);
3431     }
3432 #endif
3433
3434   return insn;
3435 }
3436
3437 /* Like `make_insn_raw' but make a JUMP_INSN instead of an insn.  */
3438
3439 rtx
3440 make_jump_insn_raw (rtx pattern)
3441 {
3442   rtx insn;
3443
3444   insn = rtx_alloc (JUMP_INSN);
3445   INSN_UID (insn) = cur_insn_uid++;
3446
3447   PATTERN (insn) = pattern;
3448   INSN_CODE (insn) = -1;
3449   REG_NOTES (insn) = NULL;
3450   JUMP_LABEL (insn) = NULL;
3451   INSN_LOCATOR (insn) = curr_insn_locator ();
3452   BLOCK_FOR_INSN (insn) = NULL;
3453
3454   return insn;
3455 }
3456
3457 /* Like `make_insn_raw' but make a CALL_INSN instead of an insn.  */
3458
3459 static rtx
3460 make_call_insn_raw (rtx pattern)
3461 {
3462   rtx insn;
3463
3464   insn = rtx_alloc (CALL_INSN);
3465   INSN_UID (insn) = cur_insn_uid++;
3466
3467   PATTERN (insn) = pattern;
3468   INSN_CODE (insn) = -1;
3469   REG_NOTES (insn) = NULL;
3470   CALL_INSN_FUNCTION_USAGE (insn) = NULL;
3471   INSN_LOCATOR (insn) = curr_insn_locator ();
3472   BLOCK_FOR_INSN (insn) = NULL;
3473
3474   return insn;
3475 }
3476 \f
3477 /* Add INSN to the end of the doubly-linked list.
3478    INSN may be an INSN, JUMP_INSN, CALL_INSN, CODE_LABEL, BARRIER or NOTE.  */
3479
3480 void
3481 add_insn (rtx insn)
3482 {
3483   PREV_INSN (insn) = last_insn;
3484   NEXT_INSN (insn) = 0;
3485
3486   if (NULL != last_insn)
3487     NEXT_INSN (last_insn) = insn;
3488
3489   if (NULL == first_insn)
3490     first_insn = insn;
3491
3492   last_insn = insn;
3493 }
3494
3495 /* Add INSN into the doubly-linked list after insn AFTER.  This and
3496    the next should be the only functions called to insert an insn once
3497    delay slots have been filled since only they know how to update a
3498    SEQUENCE.  */
3499
3500 void
3501 add_insn_after (rtx insn, rtx after, basic_block bb)
3502 {
3503   rtx next = NEXT_INSN (after);
3504
3505   gcc_assert (!optimize || !INSN_DELETED_P (after));
3506
3507   NEXT_INSN (insn) = next;
3508   PREV_INSN (insn) = after;
3509
3510   if (next)
3511     {
3512       PREV_INSN (next) = insn;
3513       if (NONJUMP_INSN_P (next) && GET_CODE (PATTERN (next)) == SEQUENCE)
3514         PREV_INSN (XVECEXP (PATTERN (next), 0, 0)) = insn;
3515     }
3516   else if (last_insn == after)
3517     last_insn = insn;
3518   else
3519     {
3520       struct sequence_stack *stack = seq_stack;
3521       /* Scan all pending sequences too.  */
3522       for (; stack; stack = stack->next)
3523         if (after == stack->last)
3524           {
3525             stack->last = insn;
3526             break;
3527           }
3528
3529       gcc_assert (stack);
3530     }
3531
3532   if (!BARRIER_P (after)
3533       && !BARRIER_P (insn)
3534       && (bb = BLOCK_FOR_INSN (after)))
3535     {
3536       set_block_for_insn (insn, bb);
3537       if (INSN_P (insn))
3538         df_insn_rescan (insn);
3539       /* Should not happen as first in the BB is always
3540          either NOTE or LABEL.  */
3541       if (BB_END (bb) == after
3542           /* Avoid clobbering of structure when creating new BB.  */
3543           && !BARRIER_P (insn)
3544           && !NOTE_INSN_BASIC_BLOCK_P (insn))
3545         BB_END (bb) = insn;
3546     }
3547
3548   NEXT_INSN (after) = insn;
3549   if (NONJUMP_INSN_P (after) && GET_CODE (PATTERN (after)) == SEQUENCE)
3550     {
3551       rtx sequence = PATTERN (after);
3552       NEXT_INSN (XVECEXP (sequence, 0, XVECLEN (sequence, 0) - 1)) = insn;
3553     }
3554 }
3555
3556 /* Add INSN into the doubly-linked list before insn BEFORE.  This and
3557    the previous should be the only functions called to insert an insn
3558    once delay slots have been filled since only they know how to
3559    update a SEQUENCE.  If BB is NULL, an attempt is made to infer the
3560    bb from before.  */
3561
3562 void
3563 add_insn_before (rtx insn, rtx before, basic_block bb)
3564 {
3565   rtx prev = PREV_INSN (before);
3566
3567   gcc_assert (!optimize || !INSN_DELETED_P (before));
3568
3569   PREV_INSN (insn) = prev;
3570   NEXT_INSN (insn) = before;
3571
3572   if (prev)
3573     {
3574       NEXT_INSN (prev) = insn;
3575       if (NONJUMP_INSN_P (prev) && GET_CODE (PATTERN (prev)) == SEQUENCE)
3576         {
3577           rtx sequence = PATTERN (prev);
3578           NEXT_INSN (XVECEXP (sequence, 0, XVECLEN (sequence, 0) - 1)) = insn;
3579         }
3580     }
3581   else if (first_insn == before)
3582     first_insn = insn;
3583   else
3584     {
3585       struct sequence_stack *stack = seq_stack;
3586       /* Scan all pending sequences too.  */
3587       for (; stack; stack = stack->next)
3588         if (before == stack->first)
3589           {
3590             stack->first = insn;
3591             break;
3592           }
3593
3594       gcc_assert (stack);
3595     }
3596
3597   if (!bb 
3598       && !BARRIER_P (before)
3599       && !BARRIER_P (insn))
3600     bb = BLOCK_FOR_INSN (before);
3601
3602   if (bb)
3603     {
3604       set_block_for_insn (insn, bb);
3605       if (INSN_P (insn))
3606         df_insn_rescan (insn);
3607       /* Should not happen as first in the BB is always either NOTE or
3608          LABEL.  */
3609       gcc_assert (BB_HEAD (bb) != insn
3610                   /* Avoid clobbering of structure when creating new BB.  */
3611                   || BARRIER_P (insn)
3612                   || NOTE_INSN_BASIC_BLOCK_P (insn));
3613     }
3614
3615   PREV_INSN (before) = insn;
3616   if (NONJUMP_INSN_P (before) && GET_CODE (PATTERN (before)) == SEQUENCE)
3617     PREV_INSN (XVECEXP (PATTERN (before), 0, 0)) = insn;
3618 }
3619
3620
3621 /* Replace insn with an deleted instruction note.  */
3622
3623 void
3624 set_insn_deleted (rtx insn)
3625 {
3626   df_insn_delete (BLOCK_FOR_INSN (insn), INSN_UID (insn));
3627   PUT_CODE (insn, NOTE);
3628   NOTE_KIND (insn) = NOTE_INSN_DELETED;
3629 }
3630
3631
3632 /* Remove an insn from its doubly-linked list.  This function knows how
3633    to handle sequences.  */
3634 void
3635 remove_insn (rtx insn)
3636 {
3637   rtx next = NEXT_INSN (insn);
3638   rtx prev = PREV_INSN (insn);
3639   basic_block bb;
3640
3641   /* Later in the code, the block will be marked dirty.  */
3642   df_insn_delete (NULL, INSN_UID (insn));
3643
3644   if (prev)
3645     {
3646       NEXT_INSN (prev) = next;
3647       if (NONJUMP_INSN_P (prev) && GET_CODE (PATTERN (prev)) == SEQUENCE)
3648         {
3649           rtx sequence = PATTERN (prev);
3650           NEXT_INSN (XVECEXP (sequence, 0, XVECLEN (sequence, 0) - 1)) = next;
3651         }
3652     }
3653   else if (first_insn == insn)
3654     first_insn = next;
3655   else
3656     {
3657       struct sequence_stack *stack = seq_stack;
3658       /* Scan all pending sequences too.  */
3659       for (; stack; stack = stack->next)
3660         if (insn == stack->first)
3661           {
3662             stack->first = next;
3663             break;
3664           }
3665
3666       gcc_assert (stack);
3667     }
3668
3669   if (next)
3670     {
3671       PREV_INSN (next) = prev;
3672       if (NONJUMP_INSN_P (next) && GET_CODE (PATTERN (next)) == SEQUENCE)
3673         PREV_INSN (XVECEXP (PATTERN (next), 0, 0)) = prev;
3674     }
3675   else if (last_insn == insn)
3676     last_insn = prev;
3677   else
3678     {
3679       struct sequence_stack *stack = seq_stack;
3680       /* Scan all pending sequences too.  */
3681       for (; stack; stack = stack->next)
3682         if (insn == stack->last)
3683           {
3684             stack->last = prev;
3685             break;
3686           }
3687
3688       gcc_assert (stack);
3689     }
3690   if (!BARRIER_P (insn)
3691       && (bb = BLOCK_FOR_INSN (insn)))
3692     {
3693       if (INSN_P (insn))
3694         df_set_bb_dirty (bb);
3695       if (BB_HEAD (bb) == insn)
3696         {
3697           /* Never ever delete the basic block note without deleting whole
3698              basic block.  */
3699           gcc_assert (!NOTE_P (insn));
3700           BB_HEAD (bb) = next;
3701         }
3702       if (BB_END (bb) == insn)
3703         BB_END (bb) = prev;
3704     }
3705 }
3706
3707 /* Append CALL_FUSAGE to the CALL_INSN_FUNCTION_USAGE for CALL_INSN.  */
3708
3709 void
3710 add_function_usage_to (rtx call_insn, rtx call_fusage)
3711 {
3712   gcc_assert (call_insn && CALL_P (call_insn));
3713
3714   /* Put the register usage information on the CALL.  If there is already
3715      some usage information, put ours at the end.  */
3716   if (CALL_INSN_FUNCTION_USAGE (call_insn))
3717     {
3718       rtx link;
3719
3720       for (link = CALL_INSN_FUNCTION_USAGE (call_insn); XEXP (link, 1) != 0;
3721            link = XEXP (link, 1))
3722         ;
3723
3724       XEXP (link, 1) = call_fusage;
3725     }
3726   else
3727     CALL_INSN_FUNCTION_USAGE (call_insn) = call_fusage;
3728 }
3729
3730 /* Delete all insns made since FROM.
3731    FROM becomes the new last instruction.  */
3732
3733 void
3734 delete_insns_since (rtx from)
3735 {
3736   if (from == 0)
3737     first_insn = 0;
3738   else
3739     NEXT_INSN (from) = 0;
3740   last_insn = from;
3741 }
3742
3743 /* This function is deprecated, please use sequences instead.
3744
3745    Move a consecutive bunch of insns to a different place in the chain.
3746    The insns to be moved are those between FROM and TO.
3747    They are moved to a new position after the insn AFTER.
3748    AFTER must not be FROM or TO or any insn in between.
3749
3750    This function does not know about SEQUENCEs and hence should not be
3751    called after delay-slot filling has been done.  */
3752
3753 void
3754 reorder_insns_nobb (rtx from, rtx to, rtx after)
3755 {
3756   /* Splice this bunch out of where it is now.  */
3757   if (PREV_INSN (from))
3758     NEXT_INSN (PREV_INSN (from)) = NEXT_INSN (to);
3759   if (NEXT_INSN (to))
3760     PREV_INSN (NEXT_INSN (to)) = PREV_INSN (from);
3761   if (last_insn == to)
3762     last_insn = PREV_INSN (from);
3763   if (first_insn == from)
3764     first_insn = NEXT_INSN (to);
3765
3766   /* Make the new neighbors point to it and it to them.  */
3767   if (NEXT_INSN (after))
3768     PREV_INSN (NEXT_INSN (after)) = to;
3769
3770   NEXT_INSN (to) = NEXT_INSN (after);
3771   PREV_INSN (from) = after;
3772   NEXT_INSN (after) = from;
3773   if (after == last_insn)
3774     last_insn = to;
3775 }
3776
3777 /* Same as function above, but take care to update BB boundaries.  */
3778 void
3779 reorder_insns (rtx from, rtx to, rtx after)
3780 {
3781   rtx prev = PREV_INSN (from);
3782   basic_block bb, bb2;
3783
3784   reorder_insns_nobb (from, to, after);
3785
3786   if (!BARRIER_P (after)
3787       && (bb = BLOCK_FOR_INSN (after)))
3788     {
3789       rtx x;
3790       df_set_bb_dirty (bb);
3791
3792       if (!BARRIER_P (from)
3793           && (bb2 = BLOCK_FOR_INSN (from)))
3794         {
3795           if (BB_END (bb2) == to)
3796             BB_END (bb2) = prev;
3797           df_set_bb_dirty (bb2);
3798         }
3799
3800       if (BB_END (bb) == after)
3801         BB_END (bb) = to;
3802
3803       for (x = from; x != NEXT_INSN (to); x = NEXT_INSN (x))
3804         if (!BARRIER_P (x))
3805           df_insn_change_bb (x, bb);
3806     }
3807 }
3808
3809 \f
3810 /* Emit insn(s) of given code and pattern
3811    at a specified place within the doubly-linked list.
3812
3813    All of the emit_foo global entry points accept an object
3814    X which is either an insn list or a PATTERN of a single
3815    instruction.
3816
3817    There are thus a few canonical ways to generate code and
3818    emit it at a specific place in the instruction stream.  For
3819    example, consider the instruction named SPOT and the fact that
3820    we would like to emit some instructions before SPOT.  We might
3821    do it like this:
3822
3823         start_sequence ();
3824         ... emit the new instructions ...
3825         insns_head = get_insns ();
3826         end_sequence ();
3827
3828         emit_insn_before (insns_head, SPOT);
3829
3830    It used to be common to generate SEQUENCE rtl instead, but that
3831    is a relic of the past which no longer occurs.  The reason is that
3832    SEQUENCE rtl results in much fragmented RTL memory since the SEQUENCE
3833    generated would almost certainly die right after it was created.  */
3834
3835 /* Make X be output before the instruction BEFORE.  */
3836
3837 rtx
3838 emit_insn_before_noloc (rtx x, rtx before, basic_block bb)
3839 {
3840   rtx last = before;
3841   rtx insn;
3842
3843   gcc_assert (before);
3844
3845   if (x == NULL_RTX)
3846     return last;
3847
3848   switch (GET_CODE (x))
3849     {
3850     case INSN:
3851     case JUMP_INSN:
3852     case CALL_INSN:
3853     case CODE_LABEL:
3854     case BARRIER:
3855     case NOTE:
3856       insn = x;
3857       while (insn)
3858         {
3859           rtx next = NEXT_INSN (insn);
3860           add_insn_before (insn, before, bb);
3861           last = insn;
3862           insn = next;
3863         }
3864       break;
3865
3866 #ifdef ENABLE_RTL_CHECKING
3867     case SEQUENCE:
3868       gcc_unreachable ();
3869       break;
3870 #endif
3871
3872     default:
3873       last = make_insn_raw (x);
3874       add_insn_before (last, before, bb);
3875       break;
3876     }
3877
3878   return last;
3879 }
3880
3881 /* Make an instruction with body X and code JUMP_INSN
3882    and output it before the instruction BEFORE.  */
3883
3884 rtx
3885 emit_jump_insn_before_noloc (rtx x, rtx before)
3886 {
3887   rtx insn, last = NULL_RTX;
3888
3889   gcc_assert (before);
3890
3891   switch (GET_CODE (x))
3892     {
3893     case INSN:
3894     case JUMP_INSN:
3895     case CALL_INSN:
3896     case CODE_LABEL:
3897     case BARRIER:
3898     case NOTE:
3899       insn = x;
3900       while (insn)
3901         {
3902           rtx next = NEXT_INSN (insn);
3903           add_insn_before (insn, before, NULL);
3904           last = insn;
3905           insn = next;
3906         }
3907       break;
3908
3909 #ifdef ENABLE_RTL_CHECKING
3910     case SEQUENCE:
3911       gcc_unreachable ();
3912       break;
3913 #endif
3914
3915     default:
3916       last = make_jump_insn_raw (x);
3917       add_insn_before (last, before, NULL);
3918       break;
3919     }
3920
3921   return last;
3922 }
3923
3924 /* Make an instruction with body X and code CALL_INSN
3925    and output it before the instruction BEFORE.  */
3926
3927 rtx
3928 emit_call_insn_before_noloc (rtx x, rtx before)
3929 {
3930   rtx last = NULL_RTX, insn;
3931
3932   gcc_assert (before);
3933
3934   switch (GET_CODE (x))
3935     {
3936     case INSN:
3937     case JUMP_INSN:
3938     case CALL_INSN:
3939     case CODE_LABEL:
3940     case BARRIER:
3941     case NOTE:
3942       insn = x;
3943       while (insn)
3944         {
3945           rtx next = NEXT_INSN (insn);
3946           add_insn_before (insn, before, NULL);
3947           last = insn;
3948           insn = next;
3949         }
3950       break;
3951
3952 #ifdef ENABLE_RTL_CHECKING
3953     case SEQUENCE:
3954       gcc_unreachable ();
3955       break;
3956 #endif
3957
3958     default:
3959       last = make_call_insn_raw (x);
3960       add_insn_before (last, before, NULL);
3961       break;
3962     }
3963
3964   return last;
3965 }
3966
3967 /* Make an insn of code BARRIER
3968    and output it before the insn BEFORE.  */
3969
3970 rtx
3971 emit_barrier_before (rtx before)
3972 {
3973   rtx insn = rtx_alloc (BARRIER);
3974
3975   INSN_UID (insn) = cur_insn_uid++;
3976
3977   add_insn_before (insn, before, NULL);
3978   return insn;
3979 }
3980
3981 /* Emit the label LABEL before the insn BEFORE.  */
3982
3983 rtx
3984 emit_label_before (rtx label, rtx before)
3985 {
3986   /* This can be called twice for the same label as a result of the
3987      confusion that follows a syntax error!  So make it harmless.  */
3988   if (INSN_UID (label) == 0)
3989     {
3990       INSN_UID (label) = cur_insn_uid++;
3991       add_insn_before (label, before, NULL);
3992     }
3993
3994   return label;
3995 }
3996
3997 /* Emit a note of subtype SUBTYPE before the insn BEFORE.  */
3998
3999 rtx
4000 emit_note_before (enum insn_note subtype, rtx before)
4001 {
4002   rtx note = rtx_alloc (NOTE);
4003   INSN_UID (note) = cur_insn_uid++;
4004   NOTE_KIND (note) = subtype;
4005   BLOCK_FOR_INSN (note) = NULL;
4006   memset (&NOTE_DATA (note), 0, sizeof (NOTE_DATA (note)));
4007
4008   add_insn_before (note, before, NULL);
4009   return note;
4010 }
4011 \f
4012 /* Helper for emit_insn_after, handles lists of instructions
4013    efficiently.  */
4014
4015 static rtx
4016 emit_insn_after_1 (rtx first, rtx after, basic_block bb)
4017 {
4018   rtx last;
4019   rtx after_after;
4020   if (!bb && !BARRIER_P (after))
4021     bb = BLOCK_FOR_INSN (after);
4022
4023   if (bb)
4024     {
4025       df_set_bb_dirty (bb);
4026       for (last = first; NEXT_INSN (last); last = NEXT_INSN (last))
4027         if (!BARRIER_P (last))
4028           {
4029             set_block_for_insn (last, bb);
4030             df_insn_rescan (last);
4031           }
4032       if (!BARRIER_P (last))
4033         {
4034           set_block_for_insn (last, bb);
4035           df_insn_rescan (last);
4036         }
4037       if (BB_END (bb) == after)
4038         BB_END (bb) = last;
4039     }
4040   else
4041     for (last = first; NEXT_INSN (last); last = NEXT_INSN (last))
4042       continue;
4043
4044   after_after = NEXT_INSN (after);
4045
4046   NEXT_INSN (after) = first;
4047   PREV_INSN (first) = after;
4048   NEXT_INSN (last) = after_after;
4049   if (after_after)
4050     PREV_INSN (after_after) = last;
4051
4052   if (after == last_insn)
4053     last_insn = last;
4054
4055   return last;
4056 }
4057
4058 /* Make X be output after the insn AFTER and set the BB of insn.  If
4059    BB is NULL, an attempt is made to infer the BB from AFTER.  */
4060
4061 rtx
4062 emit_insn_after_noloc (rtx x, rtx after, basic_block bb)
4063 {
4064   rtx last = after;
4065
4066   gcc_assert (after);
4067
4068   if (x == NULL_RTX)
4069     return last;
4070
4071   switch (GET_CODE (x))
4072     {
4073     case INSN:
4074     case JUMP_INSN:
4075     case CALL_INSN:
4076     case CODE_LABEL:
4077     case BARRIER:
4078     case NOTE:
4079       last = emit_insn_after_1 (x, after, bb);
4080       break;
4081
4082 #ifdef ENABLE_RTL_CHECKING
4083     case SEQUENCE:
4084       gcc_unreachable ();
4085       break;
4086 #endif
4087
4088     default:
4089       last = make_insn_raw (x);
4090       add_insn_after (last, after, bb);
4091       break;
4092     }
4093
4094   return last;
4095 }
4096
4097
4098 /* Make an insn of code JUMP_INSN with body X
4099    and output it after the insn AFTER.  */
4100
4101 rtx
4102 emit_jump_insn_after_noloc (rtx x, rtx after)
4103 {
4104   rtx last;
4105
4106   gcc_assert (after);
4107
4108   switch (GET_CODE (x))
4109     {
4110     case INSN:
4111     case JUMP_INSN:
4112     case CALL_INSN:
4113     case CODE_LABEL:
4114     case BARRIER:
4115     case NOTE:
4116       last = emit_insn_after_1 (x, after, NULL);
4117       break;
4118
4119 #ifdef ENABLE_RTL_CHECKING
4120     case SEQUENCE:
4121       gcc_unreachable ();
4122       break;
4123 #endif
4124
4125     default:
4126       last = make_jump_insn_raw (x);
4127       add_insn_after (last, after, NULL);
4128       break;
4129     }
4130
4131   return last;
4132 }
4133
4134 /* Make an instruction with body X and code CALL_INSN
4135    and output it after the instruction AFTER.  */
4136
4137 rtx
4138 emit_call_insn_after_noloc (rtx x, rtx after)
4139 {
4140   rtx last;
4141
4142   gcc_assert (after);
4143
4144   switch (GET_CODE (x))
4145     {
4146     case INSN:
4147     case JUMP_INSN:
4148     case CALL_INSN:
4149     case CODE_LABEL:
4150     case BARRIER:
4151     case NOTE:
4152       last = emit_insn_after_1 (x, after, NULL);
4153       break;
4154
4155 #ifdef ENABLE_RTL_CHECKING
4156     case SEQUENCE:
4157       gcc_unreachable ();
4158       break;
4159 #endif
4160
4161     default:
4162       last = make_call_insn_raw (x);
4163       add_insn_after (last, after, NULL);
4164       break;
4165     }
4166
4167   return last;
4168 }
4169
4170 /* Make an insn of code BARRIER
4171    and output it after the insn AFTER.  */
4172
4173 rtx
4174 emit_barrier_after (rtx after)
4175 {
4176   rtx insn = rtx_alloc (BARRIER);
4177
4178   INSN_UID (insn) = cur_insn_uid++;
4179
4180   add_insn_after (insn, after, NULL);
4181   return insn;
4182 }
4183
4184 /* Emit the label LABEL after the insn AFTER.  */
4185
4186 rtx
4187 emit_label_after (rtx label, rtx after)
4188 {
4189   /* This can be called twice for the same label
4190      as a result of the confusion that follows a syntax error!
4191      So make it harmless.  */
4192   if (INSN_UID (label) == 0)
4193     {
4194       INSN_UID (label) = cur_insn_uid++;
4195       add_insn_after (label, after, NULL);
4196     }
4197
4198   return label;
4199 }
4200
4201 /* Emit a note of subtype SUBTYPE after the insn AFTER.  */
4202
4203 rtx
4204 emit_note_after (enum insn_note subtype, rtx after)
4205 {
4206   rtx note = rtx_alloc (NOTE);
4207   INSN_UID (note) = cur_insn_uid++;
4208   NOTE_KIND (note) = subtype;
4209   BLOCK_FOR_INSN (note) = NULL;
4210   memset (&NOTE_DATA (note), 0, sizeof (NOTE_DATA (note)));
4211   add_insn_after (note, after, NULL);
4212   return note;
4213 }
4214 \f
4215 /* Like emit_insn_after_noloc, but set INSN_LOCATOR according to SCOPE.  */
4216 rtx
4217 emit_insn_after_setloc (rtx pattern, rtx after, int loc)
4218 {
4219   rtx last = emit_insn_after_noloc (pattern, after, NULL);
4220
4221   if (pattern == NULL_RTX || !loc)
4222     return last;
4223
4224   after = NEXT_INSN (after);
4225   while (1)
4226     {
4227       if (active_insn_p (after) && !INSN_LOCATOR (after))
4228         INSN_LOCATOR (after) = loc;
4229       if (after == last)
4230         break;
4231       after = NEXT_INSN (after);
4232     }
4233   return last;
4234 }
4235
4236 /* Like emit_insn_after_noloc, but set INSN_LOCATOR according to AFTER.  */
4237 rtx
4238 emit_insn_after (rtx pattern, rtx after)
4239 {
4240   if (INSN_P (after))
4241     return emit_insn_after_setloc (pattern, after, INSN_LOCATOR (after));
4242   else
4243     return emit_insn_after_noloc (pattern, after, NULL);
4244 }
4245
4246 /* Like emit_jump_insn_after_noloc, but set INSN_LOCATOR according to SCOPE.  */
4247 rtx
4248 emit_jump_insn_after_setloc (rtx pattern, rtx after, int loc)
4249 {
4250   rtx last = emit_jump_insn_after_noloc (pattern, after);
4251
4252   if (pattern == NULL_RTX || !loc)
4253     return last;
4254
4255   after = NEXT_INSN (after);
4256   while (1)
4257     {
4258       if (active_insn_p (after) && !INSN_LOCATOR (after))
4259         INSN_LOCATOR (after) = loc;
4260       if (after == last)
4261         break;
4262       after = NEXT_INSN (after);
4263     }
4264   return last;
4265 }
4266
4267 /* Like emit_jump_insn_after_noloc, but set INSN_LOCATOR according to AFTER.  */
4268 rtx
4269 emit_jump_insn_after (rtx pattern, rtx after)
4270 {
4271   if (INSN_P (after))
4272     return emit_jump_insn_after_setloc (pattern, after, INSN_LOCATOR (after));
4273   else
4274     return emit_jump_insn_after_noloc (pattern, after);
4275 }
4276
4277 /* Like emit_call_insn_after_noloc, but set INSN_LOCATOR according to SCOPE.  */
4278 rtx
4279 emit_call_insn_after_setloc (rtx pattern, rtx after, int loc)
4280 {
4281   rtx last = emit_call_insn_after_noloc (pattern, after);
4282
4283   if (pattern == NULL_RTX || !loc)
4284     return last;
4285
4286   after = NEXT_INSN (after);
4287   while (1)
4288     {
4289       if (active_insn_p (after) && !INSN_LOCATOR (after))
4290         INSN_LOCATOR (after) = loc;
4291       if (after == last)
4292         break;
4293       after = NEXT_INSN (after);
4294     }
4295   return last;
4296 }
4297
4298 /* Like emit_call_insn_after_noloc, but set INSN_LOCATOR according to AFTER.  */
4299 rtx
4300 emit_call_insn_after (rtx pattern, rtx after)
4301 {
4302   if (INSN_P (after))
4303     return emit_call_insn_after_setloc (pattern, after, INSN_LOCATOR (after));
4304   else
4305     return emit_call_insn_after_noloc (pattern, after);
4306 }
4307
4308 /* Like emit_insn_before_noloc, but set INSN_LOCATOR according to SCOPE.  */
4309 rtx
4310 emit_insn_before_setloc (rtx pattern, rtx before, int loc)
4311 {
4312   rtx first = PREV_INSN (before);
4313   rtx last = emit_insn_before_noloc (pattern, before, NULL);
4314
4315   if (pattern == NULL_RTX || !loc)
4316     return last;
4317
4318   if (!first)
4319     first = get_insns ();
4320   else
4321     first = NEXT_INSN (first);
4322   while (1)
4323     {
4324       if (active_insn_p (first) && !INSN_LOCATOR (first))
4325         INSN_LOCATOR (first) = loc;
4326       if (first == last)
4327         break;
4328       first = NEXT_INSN (first);
4329     }
4330   return last;
4331 }
4332
4333 /* Like emit_insn_before_noloc, but set INSN_LOCATOR according to BEFORE.  */
4334 rtx
4335 emit_insn_before (rtx pattern, rtx before)
4336 {
4337   if (INSN_P (before))
4338     return emit_insn_before_setloc (pattern, before, INSN_LOCATOR (before));
4339   else
4340     return emit_insn_before_noloc (pattern, before, NULL);
4341 }
4342
4343 /* like emit_insn_before_noloc, but set insn_locator according to scope.  */
4344 rtx
4345 emit_jump_insn_before_setloc (rtx pattern, rtx before, int loc)
4346 {
4347   rtx first = PREV_INSN (before);
4348   rtx last = emit_jump_insn_before_noloc (pattern, before);
4349
4350   if (pattern == NULL_RTX)
4351     return last;
4352
4353   first = NEXT_INSN (first);
4354   while (1)
4355     {
4356       if (active_insn_p (first) && !INSN_LOCATOR (first))
4357         INSN_LOCATOR (first) = loc;
4358       if (first == last)
4359         break;
4360       first = NEXT_INSN (first);
4361     }
4362   return last;
4363 }
4364
4365 /* Like emit_jump_insn_before_noloc, but set INSN_LOCATOR according to BEFORE.  */
4366 rtx
4367 emit_jump_insn_before (rtx pattern, rtx before)
4368 {
4369   if (INSN_P (before))
4370     return emit_jump_insn_before_setloc (pattern, before, INSN_LOCATOR (before));
4371   else
4372     return emit_jump_insn_before_noloc (pattern, before);
4373 }
4374
4375 /* like emit_insn_before_noloc, but set insn_locator according to scope.  */
4376 rtx
4377 emit_call_insn_before_setloc (rtx pattern, rtx before, int loc)
4378 {
4379   rtx first = PREV_INSN (before);
4380   rtx last = emit_call_insn_before_noloc (pattern, before);
4381
4382   if (pattern == NULL_RTX)
4383     return last;
4384
4385   first = NEXT_INSN (first);
4386   while (1)
4387     {
4388       if (active_insn_p (first) && !INSN_LOCATOR (first))
4389         INSN_LOCATOR (first) = loc;
4390       if (first == last)
4391         break;
4392       first = NEXT_INSN (first);
4393     }
4394   return last;
4395 }
4396
4397 /* like emit_call_insn_before_noloc,
4398    but set insn_locator according to before.  */
4399 rtx
4400 emit_call_insn_before (rtx pattern, rtx before)
4401 {
4402   if (INSN_P (before))
4403     return emit_call_insn_before_setloc (pattern, before, INSN_LOCATOR (before));
4404   else
4405     return emit_call_insn_before_noloc (pattern, before);
4406 }
4407 \f
4408 /* Take X and emit it at the end of the doubly-linked
4409    INSN list.
4410
4411    Returns the last insn emitted.  */
4412
4413 rtx
4414 emit_insn (rtx x)
4415 {
4416   rtx last = last_insn;
4417   rtx insn;
4418
4419   if (x == NULL_RTX)
4420     return last;
4421
4422   switch (GET_CODE (x))
4423     {
4424     case INSN:
4425     case JUMP_INSN:
4426     case CALL_INSN:
4427     case CODE_LABEL:
4428     case BARRIER:
4429     case NOTE:
4430       insn = x;
4431       while (insn)
4432         {
4433           rtx next = NEXT_INSN (insn);
4434           add_insn (insn);
4435           last = insn;
4436           insn = next;
4437         }
4438       break;
4439
4440 #ifdef ENABLE_RTL_CHECKING
4441     case SEQUENCE:
4442       gcc_unreachable ();
4443       break;
4444 #endif
4445
4446     default:
4447       last = make_insn_raw (x);
4448       add_insn (last);
4449       break;
4450     }
4451
4452   return last;
4453 }
4454
4455 /* Make an insn of code JUMP_INSN with pattern X
4456    and add it to the end of the doubly-linked list.  */
4457
4458 rtx
4459 emit_jump_insn (rtx x)
4460 {
4461   rtx last = NULL_RTX, insn;
4462
4463   switch (GET_CODE (x))
4464     {
4465     case INSN:
4466     case JUMP_INSN:
4467     case CALL_INSN:
4468     case CODE_LABEL:
4469     case BARRIER:
4470     case NOTE:
4471       insn = x;
4472       while (insn)
4473         {
4474           rtx next = NEXT_INSN (insn);
4475           add_insn (insn);
4476           last = insn;
4477           insn = next;
4478         }
4479       break;
4480
4481 #ifdef ENABLE_RTL_CHECKING
4482     case SEQUENCE:
4483       gcc_unreachable ();
4484       break;
4485 #endif
4486
4487     default:
4488       last = make_jump_insn_raw (x);
4489       add_insn (last);
4490       break;
4491     }
4492
4493   return last;
4494 }
4495
4496 /* Make an insn of code CALL_INSN with pattern X
4497    and add it to the end of the doubly-linked list.  */
4498
4499 rtx
4500 emit_call_insn (rtx x)
4501 {
4502   rtx insn;
4503
4504   switch (GET_CODE (x))
4505     {
4506     case INSN:
4507     case JUMP_INSN:
4508     case CALL_INSN:
4509     case CODE_LABEL:
4510     case BARRIER:
4511     case NOTE:
4512       insn = emit_insn (x);
4513       break;
4514
4515 #ifdef ENABLE_RTL_CHECKING
4516     case SEQUENCE:
4517       gcc_unreachable ();
4518       break;
4519 #endif
4520
4521     default:
4522       insn = make_call_insn_raw (x);
4523       add_insn (insn);
4524       break;
4525     }
4526
4527   return insn;
4528 }
4529
4530 /* Add the label LABEL to the end of the doubly-linked list.  */
4531
4532 rtx
4533 emit_label (rtx label)
4534 {
4535   /* This can be called twice for the same label
4536      as a result of the confusion that follows a syntax error!
4537      So make it harmless.  */
4538   if (INSN_UID (label) == 0)
4539     {
4540       INSN_UID (label) = cur_insn_uid++;
4541       add_insn (label);
4542     }
4543   return label;
4544 }
4545
4546 /* Make an insn of code BARRIER
4547    and add it to the end of the doubly-linked list.  */
4548
4549 rtx
4550 emit_barrier (void)
4551 {
4552   rtx barrier = rtx_alloc (BARRIER);
4553   INSN_UID (barrier) = cur_insn_uid++;
4554   add_insn (barrier);
4555   return barrier;
4556 }
4557
4558 /* Emit a copy of note ORIG.  */
4559
4560 rtx
4561 emit_note_copy (rtx orig)
4562 {
4563   rtx note;
4564   
4565   note = rtx_alloc (NOTE);
4566   
4567   INSN_UID (note) = cur_insn_uid++;
4568   NOTE_DATA (note) = NOTE_DATA (orig);
4569   NOTE_KIND (note) = NOTE_KIND (orig);
4570   BLOCK_FOR_INSN (note) = NULL;
4571   add_insn (note);
4572   
4573   return note;
4574 }
4575
4576 /* Make an insn of code NOTE or type NOTE_NO
4577    and add it to the end of the doubly-linked list.  */
4578
4579 rtx
4580 emit_note (enum insn_note kind)
4581 {
4582   rtx note;
4583
4584   note = rtx_alloc (NOTE);
4585   INSN_UID (note) = cur_insn_uid++;
4586   NOTE_KIND (note) = kind;
4587   memset (&NOTE_DATA (note), 0, sizeof (NOTE_DATA (note)));
4588   BLOCK_FOR_INSN (note) = NULL;
4589   add_insn (note);
4590   return note;
4591 }
4592
4593 /* Emit a clobber of lvalue X.  */
4594
4595 rtx
4596 emit_clobber (rtx x)
4597 {
4598   /* CONCATs should not appear in the insn stream.  */
4599   if (GET_CODE (x) == CONCAT)
4600     {
4601       emit_clobber (XEXP (x, 0));
4602       return emit_clobber (XEXP (x, 1));
4603     }
4604   return emit_insn (gen_rtx_CLOBBER (VOIDmode, x));
4605 }
4606
4607 /* Return a sequence of insns to clobber lvalue X.  */
4608
4609 rtx
4610 gen_clobber (rtx x)
4611 {
4612   rtx seq;
4613
4614   start_sequence ();
4615   emit_clobber (x);
4616   seq = get_insns ();
4617   end_sequence ();
4618   return seq;
4619 }
4620
4621 /* Emit a use of rvalue X.  */
4622
4623 rtx
4624 emit_use (rtx x)
4625 {
4626   /* CONCATs should not appear in the insn stream.  */
4627   if (GET_CODE (x) == CONCAT)
4628     {
4629       emit_use (XEXP (x, 0));
4630       return emit_use (XEXP (x, 1));
4631     }
4632   return emit_insn (gen_rtx_USE (VOIDmode, x));
4633 }
4634
4635 /* Return a sequence of insns to use rvalue X.  */
4636
4637 rtx
4638 gen_use (rtx x)
4639 {
4640   rtx seq;
4641
4642   start_sequence ();
4643   emit_use (x);
4644   seq = get_insns ();
4645   end_sequence ();
4646   return seq;
4647 }
4648
4649 /* Cause next statement to emit a line note even if the line number
4650    has not changed.  */
4651
4652 void
4653 force_next_line_note (void)
4654 {
4655   last_location = -1;
4656 }
4657
4658 /* Place a note of KIND on insn INSN with DATUM as the datum. If a
4659    note of this type already exists, remove it first.  */
4660
4661 rtx
4662 set_unique_reg_note (rtx insn, enum reg_note kind, rtx datum)
4663 {
4664   rtx note = find_reg_note (insn, kind, NULL_RTX);
4665
4666   switch (kind)
4667     {
4668     case REG_EQUAL:
4669     case REG_EQUIV:
4670       /* Don't add REG_EQUAL/REG_EQUIV notes if the insn
4671          has multiple sets (some callers assume single_set
4672          means the insn only has one set, when in fact it
4673          means the insn only has one * useful * set).  */
4674       if (GET_CODE (PATTERN (insn)) == PARALLEL && multiple_sets (insn))
4675         {
4676           gcc_assert (!note);
4677           return NULL_RTX;
4678         }
4679
4680       /* Don't add ASM_OPERAND REG_EQUAL/REG_EQUIV notes.
4681          It serves no useful purpose and breaks eliminate_regs.  */
4682       if (GET_CODE (datum) == ASM_OPERANDS)
4683         return NULL_RTX;
4684
4685       if (note)
4686         {
4687           XEXP (note, 0) = datum;
4688           df_notes_rescan (insn);
4689           return note;
4690         }
4691       break;
4692
4693     default:
4694       if (note)
4695         {
4696           XEXP (note, 0) = datum;
4697           return note;
4698         }
4699       break;
4700     }
4701
4702   add_reg_note (insn, kind, datum);
4703
4704   switch (kind)
4705     {
4706     case REG_EQUAL:
4707     case REG_EQUIV:
4708       df_notes_rescan (insn);
4709       break;
4710     default:
4711       break;
4712     }
4713
4714   return REG_NOTES (insn);
4715 }
4716 \f
4717 /* Return an indication of which type of insn should have X as a body.
4718    The value is CODE_LABEL, INSN, CALL_INSN or JUMP_INSN.  */
4719
4720 static enum rtx_code
4721 classify_insn (rtx x)
4722 {
4723   if (LABEL_P (x))
4724     return CODE_LABEL;
4725   if (GET_CODE (x) == CALL)
4726     return CALL_INSN;
4727   if (GET_CODE (x) == RETURN)
4728     return JUMP_INSN;
4729   if (GET_CODE (x) == SET)
4730     {
4731       if (SET_DEST (x) == pc_rtx)
4732         return JUMP_INSN;
4733       else if (GET_CODE (SET_SRC (x)) == CALL)
4734         return CALL_INSN;
4735       else
4736         return INSN;
4737     }
4738   if (GET_CODE (x) == PARALLEL)
4739     {
4740       int j;
4741       for (j = XVECLEN (x, 0) - 1; j >= 0; j--)
4742         if (GET_CODE (XVECEXP (x, 0, j)) == CALL)
4743           return CALL_INSN;
4744         else if (GET_CODE (XVECEXP (x, 0, j)) == SET
4745                  && SET_DEST (XVECEXP (x, 0, j)) == pc_rtx)
4746           return JUMP_INSN;
4747         else if (GET_CODE (XVECEXP (x, 0, j)) == SET
4748                  && GET_CODE (SET_SRC (XVECEXP (x, 0, j))) == CALL)
4749           return CALL_INSN;
4750     }
4751   return INSN;
4752 }
4753
4754 /* Emit the rtl pattern X as an appropriate kind of insn.
4755    If X is a label, it is simply added into the insn chain.  */
4756
4757 rtx
4758 emit (rtx x)
4759 {
4760   enum rtx_code code = classify_insn (x);
4761
4762   switch (code)
4763     {
4764     case CODE_LABEL:
4765       return emit_label (x);
4766     case INSN:
4767       return emit_insn (x);
4768     case  JUMP_INSN:
4769       {
4770         rtx insn = emit_jump_insn (x);
4771         if (any_uncondjump_p (insn) || GET_CODE (x) == RETURN)
4772           return emit_barrier ();
4773         return insn;
4774       }
4775     case CALL_INSN:
4776       return emit_call_insn (x);
4777     default:
4778       gcc_unreachable ();
4779     }
4780 }
4781 \f
4782 /* Space for free sequence stack entries.  */
4783 static GTY ((deletable)) struct sequence_stack *free_sequence_stack;
4784
4785 /* Begin emitting insns to a sequence.  If this sequence will contain
4786    something that might cause the compiler to pop arguments to function
4787    calls (because those pops have previously been deferred; see
4788    INHIBIT_DEFER_POP for more details), use do_pending_stack_adjust
4789    before calling this function.  That will ensure that the deferred
4790    pops are not accidentally emitted in the middle of this sequence.  */
4791
4792 void
4793 start_sequence (void)
4794 {
4795   struct sequence_stack *tem;
4796
4797   if (free_sequence_stack != NULL)
4798     {
4799       tem = free_sequence_stack;
4800       free_sequence_stack = tem->next;
4801     }
4802   else
4803     tem = GGC_NEW (struct sequence_stack);
4804
4805   tem->next = seq_stack;
4806   tem->first = first_insn;
4807   tem->last = last_insn;
4808
4809   seq_stack = tem;
4810
4811   first_insn = 0;
4812   last_insn = 0;
4813 }
4814
4815 /* Set up the insn chain starting with FIRST as the current sequence,
4816    saving the previously current one.  See the documentation for
4817    start_sequence for more information about how to use this function.  */
4818
4819 void
4820 push_to_sequence (rtx first)
4821 {
4822   rtx last;
4823
4824   start_sequence ();
4825
4826   for (last = first; last && NEXT_INSN (last); last = NEXT_INSN (last));
4827
4828   first_insn = first;
4829   last_insn = last;
4830 }
4831
4832 /* Like push_to_sequence, but take the last insn as an argument to avoid
4833    looping through the list.  */
4834
4835 void
4836 push_to_sequence2 (rtx first, rtx last)
4837 {
4838   start_sequence ();
4839
4840   first_insn = first;
4841   last_insn = last;
4842 }
4843
4844 /* Set up the outer-level insn chain
4845    as the current sequence, saving the previously current one.  */
4846
4847 void
4848 push_topmost_sequence (void)
4849 {
4850   struct sequence_stack *stack, *top = NULL;
4851
4852   start_sequence ();
4853
4854   for (stack = seq_stack; stack; stack = stack->next)
4855     top = stack;
4856
4857   first_insn = top->first;
4858   last_insn = top->last;
4859 }
4860
4861 /* After emitting to the outer-level insn chain, update the outer-level
4862    insn chain, and restore the previous saved state.  */
4863
4864 void
4865 pop_topmost_sequence (void)
4866 {
4867   struct sequence_stack *stack, *top = NULL;
4868
4869   for (stack = seq_stack; stack; stack = stack->next)
4870     top = stack;
4871
4872   top->first = first_insn;
4873   top->last = last_insn;
4874
4875   end_sequence ();
4876 }
4877
4878 /* After emitting to a sequence, restore previous saved state.
4879
4880    To get the contents of the sequence just made, you must call
4881    `get_insns' *before* calling here.
4882
4883    If the compiler might have deferred popping arguments while
4884    generating this sequence, and this sequence will not be immediately
4885    inserted into the instruction stream, use do_pending_stack_adjust
4886    before calling get_insns.  That will ensure that the deferred
4887    pops are inserted into this sequence, and not into some random
4888    location in the instruction stream.  See INHIBIT_DEFER_POP for more
4889    information about deferred popping of arguments.  */
4890
4891 void
4892 end_sequence (void)
4893 {
4894   struct sequence_stack *tem = seq_stack;
4895
4896   first_insn = tem->first;
4897   last_insn = tem->last;
4898   seq_stack = tem->next;
4899
4900   memset (tem, 0, sizeof (*tem));
4901   tem->next = free_sequence_stack;
4902   free_sequence_stack = tem;
4903 }
4904
4905 /* Return 1 if currently emitting into a sequence.  */
4906
4907 int
4908 in_sequence_p (void)
4909 {
4910   return seq_stack != 0;
4911 }
4912 \f
4913 /* Put the various virtual registers into REGNO_REG_RTX.  */
4914
4915 static void
4916 init_virtual_regs (void)
4917 {
4918   regno_reg_rtx[VIRTUAL_INCOMING_ARGS_REGNUM] = virtual_incoming_args_rtx;
4919   regno_reg_rtx[VIRTUAL_STACK_VARS_REGNUM] = virtual_stack_vars_rtx;
4920   regno_reg_rtx[VIRTUAL_STACK_DYNAMIC_REGNUM] = virtual_stack_dynamic_rtx;
4921   regno_reg_rtx[VIRTUAL_OUTGOING_ARGS_REGNUM] = virtual_outgoing_args_rtx;
4922   regno_reg_rtx[VIRTUAL_CFA_REGNUM] = virtual_cfa_rtx;
4923 }
4924
4925 \f
4926 /* Used by copy_insn_1 to avoid copying SCRATCHes more than once.  */
4927 static rtx copy_insn_scratch_in[MAX_RECOG_OPERANDS];
4928 static rtx copy_insn_scratch_out[MAX_RECOG_OPERANDS];
4929 static int copy_insn_n_scratches;
4930
4931 /* When an insn is being copied by copy_insn_1, this is nonzero if we have
4932    copied an ASM_OPERANDS.
4933    In that case, it is the original input-operand vector.  */
4934 static rtvec orig_asm_operands_vector;
4935
4936 /* When an insn is being copied by copy_insn_1, this is nonzero if we have
4937    copied an ASM_OPERANDS.
4938    In that case, it is the copied input-operand vector.  */
4939 static rtvec copy_asm_operands_vector;
4940
4941 /* Likewise for the constraints vector.  */
4942 static rtvec orig_asm_constraints_vector;
4943 static rtvec copy_asm_constraints_vector;
4944
4945 /* Recursively create a new copy of an rtx for copy_insn.
4946    This function differs from copy_rtx in that it handles SCRATCHes and
4947    ASM_OPERANDs properly.
4948    Normally, this function is not used directly; use copy_insn as front end.
4949    However, you could first copy an insn pattern with copy_insn and then use
4950    this function afterwards to properly copy any REG_NOTEs containing
4951    SCRATCHes.  */
4952
4953 rtx
4954 copy_insn_1 (rtx orig)
4955 {
4956   rtx copy;
4957   int i, j;
4958   RTX_CODE code;
4959   const char *format_ptr;
4960
4961   code = GET_CODE (orig);
4962
4963   switch (code)
4964     {
4965     case REG:
4966     case CONST_INT:
4967     case CONST_DOUBLE:
4968     case CONST_FIXED:
4969     case CONST_VECTOR:
4970     case SYMBOL_REF:
4971     case CODE_LABEL:
4972     case PC:
4973     case CC0:
4974       return orig;
4975     case CLOBBER:
4976       if (REG_P (XEXP (orig, 0)) && REGNO (XEXP (orig, 0)) < FIRST_PSEUDO_REGISTER)
4977         return orig;
4978       break;
4979
4980     case SCRATCH:
4981       for (i = 0; i < copy_insn_n_scratches; i++)
4982         if (copy_insn_scratch_in[i] == orig)
4983           return copy_insn_scratch_out[i];
4984       break;
4985
4986     case CONST:
4987       if (shared_const_p (orig))
4988         return orig;
4989       break;
4990
4991       /* A MEM with a constant address is not sharable.  The problem is that
4992          the constant address may need to be reloaded.  If the mem is shared,
4993          then reloading one copy of this mem will cause all copies to appear
4994          to have been reloaded.  */
4995
4996     default:
4997       break;
4998     }
4999
5000   /* Copy the various flags, fields, and other information.  We assume
5001      that all fields need copying, and then clear the fields that should
5002      not be copied.  That is the sensible default behavior, and forces
5003      us to explicitly document why we are *not* copying a flag.  */
5004   copy = shallow_copy_rtx (orig);
5005
5006   /* We do not copy the USED flag, which is used as a mark bit during
5007      walks over the RTL.  */
5008   RTX_FLAG (copy, used) = 0;
5009
5010   /* We do not copy JUMP, CALL, or FRAME_RELATED for INSNs.  */
5011   if (INSN_P (orig))
5012     {
5013       RTX_FLAG (copy, jump) = 0;
5014       RTX_FLAG (copy, call) = 0;
5015       RTX_FLAG (copy, frame_related) = 0;
5016     }
5017
5018   format_ptr = GET_RTX_FORMAT (GET_CODE (copy));
5019
5020   for (i = 0; i < GET_RTX_LENGTH (GET_CODE (copy)); i++)
5021     switch (*format_ptr++)
5022       {
5023       case 'e':
5024         if (XEXP (orig, i) != NULL)
5025           XEXP (copy, i) = copy_insn_1 (XEXP (orig, i));
5026         break;
5027
5028       case 'E':
5029       case 'V':
5030         if (XVEC (orig, i) == orig_asm_constraints_vector)
5031           XVEC (copy, i) = copy_asm_constraints_vector;
5032         else if (XVEC (orig, i) == orig_asm_operands_vector)
5033           XVEC (copy, i) = copy_asm_operands_vector;
5034         else if (XVEC (orig, i) != NULL)
5035           {
5036             XVEC (copy, i) = rtvec_alloc (XVECLEN (orig, i));
5037             for (j = 0; j < XVECLEN (copy, i); j++)
5038               XVECEXP (copy, i, j) = copy_insn_1 (XVECEXP (orig, i, j));
5039           }
5040         break;
5041
5042       case 't':
5043       case 'w':
5044       case 'i':
5045       case 's':
5046       case 'S':
5047       case 'u':
5048       case '0':
5049         /* These are left unchanged.  */
5050         break;
5051
5052       default:
5053         gcc_unreachable ();
5054       }
5055
5056   if (code == SCRATCH)
5057     {
5058       i = copy_insn_n_scratches++;
5059       gcc_assert (i < MAX_RECOG_OPERANDS);
5060       copy_insn_scratch_in[i] = orig;
5061       copy_insn_scratch_out[i] = copy;
5062     }
5063   else if (code == ASM_OPERANDS)
5064     {
5065       orig_asm_operands_vector = ASM_OPERANDS_INPUT_VEC (orig);
5066       copy_asm_operands_vector = ASM_OPERANDS_INPUT_VEC (copy);
5067       orig_asm_constraints_vector = ASM_OPERANDS_INPUT_CONSTRAINT_VEC (orig);
5068       copy_asm_constraints_vector = ASM_OPERANDS_INPUT_CONSTRAINT_VEC (copy);
5069     }
5070
5071   return copy;
5072 }
5073
5074 /* Create a new copy of an rtx.
5075    This function differs from copy_rtx in that it handles SCRATCHes and
5076    ASM_OPERANDs properly.
5077    INSN doesn't really have to be a full INSN; it could be just the
5078    pattern.  */
5079 rtx
5080 copy_insn (rtx insn)
5081 {
5082   copy_insn_n_scratches = 0;
5083   orig_asm_operands_vector = 0;
5084   orig_asm_constraints_vector = 0;
5085   copy_asm_operands_vector = 0;
5086   copy_asm_constraints_vector = 0;
5087   return copy_insn_1 (insn);
5088 }
5089
5090 /* Initialize data structures and variables in this file
5091    before generating rtl for each function.  */
5092
5093 void
5094 init_emit (void)
5095 {
5096   first_insn = NULL;
5097   last_insn = NULL;
5098   cur_insn_uid = 1;
5099   reg_rtx_no = LAST_VIRTUAL_REGISTER + 1;
5100   last_location = UNKNOWN_LOCATION;
5101   first_label_num = label_num;
5102   seq_stack = NULL;
5103
5104   /* Init the tables that describe all the pseudo regs.  */
5105
5106   crtl->emit.regno_pointer_align_length = LAST_VIRTUAL_REGISTER + 101;
5107
5108   crtl->emit.regno_pointer_align
5109     = XCNEWVEC (unsigned char, crtl->emit.regno_pointer_align_length);
5110
5111   regno_reg_rtx
5112     = GGC_NEWVEC (rtx, crtl->emit.regno_pointer_align_length);
5113
5114   /* Put copies of all the hard registers into regno_reg_rtx.  */
5115   memcpy (regno_reg_rtx,
5116           static_regno_reg_rtx,
5117           FIRST_PSEUDO_REGISTER * sizeof (rtx));
5118
5119   /* Put copies of all the virtual register rtx into regno_reg_rtx.  */
5120   init_virtual_regs ();
5121
5122   /* Indicate that the virtual registers and stack locations are
5123      all pointers.  */
5124   REG_POINTER (stack_pointer_rtx) = 1;
5125   REG_POINTER (frame_pointer_rtx) = 1;
5126   REG_POINTER (hard_frame_pointer_rtx) = 1;
5127   REG_POINTER (arg_pointer_rtx) = 1;
5128
5129   REG_POINTER (virtual_incoming_args_rtx) = 1;
5130   REG_POINTER (virtual_stack_vars_rtx) = 1;
5131   REG_POINTER (virtual_stack_dynamic_rtx) = 1;
5132   REG_POINTER (virtual_outgoing_args_rtx) = 1;
5133   REG_POINTER (virtual_cfa_rtx) = 1;
5134
5135 #ifdef STACK_BOUNDARY
5136   REGNO_POINTER_ALIGN (STACK_POINTER_REGNUM) = STACK_BOUNDARY;
5137   REGNO_POINTER_ALIGN (FRAME_POINTER_REGNUM) = STACK_BOUNDARY;
5138   REGNO_POINTER_ALIGN (HARD_FRAME_POINTER_REGNUM) = STACK_BOUNDARY;
5139   REGNO_POINTER_ALIGN (ARG_POINTER_REGNUM) = STACK_BOUNDARY;
5140
5141   REGNO_POINTER_ALIGN (VIRTUAL_INCOMING_ARGS_REGNUM) = STACK_BOUNDARY;
5142   REGNO_POINTER_ALIGN (VIRTUAL_STACK_VARS_REGNUM) = STACK_BOUNDARY;
5143   REGNO_POINTER_ALIGN (VIRTUAL_STACK_DYNAMIC_REGNUM) = STACK_BOUNDARY;
5144   REGNO_POINTER_ALIGN (VIRTUAL_OUTGOING_ARGS_REGNUM) = STACK_BOUNDARY;
5145   REGNO_POINTER_ALIGN (VIRTUAL_CFA_REGNUM) = BITS_PER_WORD;
5146 #endif
5147
5148 #ifdef INIT_EXPANDERS
5149   INIT_EXPANDERS;
5150 #endif
5151 }
5152
5153 /* Generate a vector constant for mode MODE and constant value CONSTANT.  */
5154
5155 static rtx
5156 gen_const_vector (enum machine_mode mode, int constant)
5157 {
5158   rtx tem;
5159   rtvec v;
5160   int units, i;
5161   enum machine_mode inner;
5162
5163   units = GET_MODE_NUNITS (mode);
5164   inner = GET_MODE_INNER (mode);
5165
5166   gcc_assert (!DECIMAL_FLOAT_MODE_P (inner));
5167
5168   v = rtvec_alloc (units);
5169
5170   /* We need to call this function after we set the scalar const_tiny_rtx
5171      entries.  */
5172   gcc_assert (const_tiny_rtx[constant][(int) inner]);
5173
5174   for (i = 0; i < units; ++i)
5175     RTVEC_ELT (v, i) = const_tiny_rtx[constant][(int) inner];
5176
5177   tem = gen_rtx_raw_CONST_VECTOR (mode, v);
5178   return tem;
5179 }
5180
5181 /* Generate a vector like gen_rtx_raw_CONST_VEC, but use the zero vector when
5182    all elements are zero, and the one vector when all elements are one.  */
5183 rtx
5184 gen_rtx_CONST_VECTOR (enum machine_mode mode, rtvec v)
5185 {
5186   enum machine_mode inner = GET_MODE_INNER (mode);
5187   int nunits = GET_MODE_NUNITS (mode);
5188   rtx x;
5189   int i;
5190
5191   /* Check to see if all of the elements have the same value.  */
5192   x = RTVEC_ELT (v, nunits - 1);
5193   for (i = nunits - 2; i >= 0; i--)
5194     if (RTVEC_ELT (v, i) != x)
5195       break;
5196
5197   /* If the values are all the same, check to see if we can use one of the
5198      standard constant vectors.  */
5199   if (i == -1)
5200     {
5201       if (x == CONST0_RTX (inner))
5202         return CONST0_RTX (mode);
5203       else if (x == CONST1_RTX (inner))
5204         return CONST1_RTX (mode);
5205     }
5206
5207   return gen_rtx_raw_CONST_VECTOR (mode, v);
5208 }
5209
5210 /* Initialise global register information required by all functions.  */
5211
5212 void
5213 init_emit_regs (void)
5214 {
5215   int i;
5216
5217   /* Reset register attributes */
5218   htab_empty (reg_attrs_htab);
5219
5220   /* We need reg_raw_mode, so initialize the modes now.  */
5221   init_reg_modes_target ();
5222
5223   /* Assign register numbers to the globally defined register rtx.  */
5224   pc_rtx = gen_rtx_PC (VOIDmode);
5225   cc0_rtx = gen_rtx_CC0 (VOIDmode);
5226   stack_pointer_rtx = gen_raw_REG (Pmode, STACK_POINTER_REGNUM);
5227   frame_pointer_rtx = gen_raw_REG (Pmode, FRAME_POINTER_REGNUM);
5228   hard_frame_pointer_rtx = gen_raw_REG (Pmode, HARD_FRAME_POINTER_REGNUM);
5229   arg_pointer_rtx = gen_raw_REG (Pmode, ARG_POINTER_REGNUM);
5230   virtual_incoming_args_rtx =
5231     gen_raw_REG (Pmode, VIRTUAL_INCOMING_ARGS_REGNUM);
5232   virtual_stack_vars_rtx =
5233     gen_raw_REG (Pmode, VIRTUAL_STACK_VARS_REGNUM);
5234   virtual_stack_dynamic_rtx =
5235     gen_raw_REG (Pmode, VIRTUAL_STACK_DYNAMIC_REGNUM);
5236   virtual_outgoing_args_rtx =
5237     gen_raw_REG (Pmode, VIRTUAL_OUTGOING_ARGS_REGNUM);
5238   virtual_cfa_rtx = gen_raw_REG (Pmode, VIRTUAL_CFA_REGNUM);
5239
5240   /* Initialize RTL for commonly used hard registers.  These are
5241      copied into regno_reg_rtx as we begin to compile each function.  */
5242   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
5243     static_regno_reg_rtx[i] = gen_raw_REG (reg_raw_mode[i], i);
5244
5245 #ifdef RETURN_ADDRESS_POINTER_REGNUM
5246   return_address_pointer_rtx
5247     = gen_raw_REG (Pmode, RETURN_ADDRESS_POINTER_REGNUM);
5248 #endif
5249
5250 #ifdef STATIC_CHAIN_REGNUM
5251   static_chain_rtx = gen_rtx_REG (Pmode, STATIC_CHAIN_REGNUM);
5252
5253 #ifdef STATIC_CHAIN_INCOMING_REGNUM
5254   if (STATIC_CHAIN_INCOMING_REGNUM != STATIC_CHAIN_REGNUM)
5255     static_chain_incoming_rtx
5256       = gen_rtx_REG (Pmode, STATIC_CHAIN_INCOMING_REGNUM);
5257   else
5258 #endif
5259     static_chain_incoming_rtx = static_chain_rtx;
5260 #endif
5261
5262 #ifdef STATIC_CHAIN
5263   static_chain_rtx = STATIC_CHAIN;
5264
5265 #ifdef STATIC_CHAIN_INCOMING
5266   static_chain_incoming_rtx = STATIC_CHAIN_INCOMING;
5267 #else
5268   static_chain_incoming_rtx = static_chain_rtx;
5269 #endif
5270 #endif
5271
5272   if ((unsigned) PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM)
5273     pic_offset_table_rtx = gen_raw_REG (Pmode, PIC_OFFSET_TABLE_REGNUM);
5274   else
5275     pic_offset_table_rtx = NULL_RTX;
5276 }
5277
5278 /* Create some permanent unique rtl objects shared between all functions.
5279    LINE_NUMBERS is nonzero if line numbers are to be generated.  */
5280
5281 void
5282 init_emit_once (int line_numbers)
5283 {
5284   int i;
5285   enum machine_mode mode;
5286   enum machine_mode double_mode;
5287
5288   /* Initialize the CONST_INT, CONST_DOUBLE, CONST_FIXED, and memory attribute
5289      hash tables.  */
5290   const_int_htab = htab_create_ggc (37, const_int_htab_hash,
5291                                     const_int_htab_eq, NULL);
5292
5293   const_double_htab = htab_create_ggc (37, const_double_htab_hash,
5294                                        const_double_htab_eq, NULL);
5295
5296   const_fixed_htab = htab_create_ggc (37, const_fixed_htab_hash,
5297                                       const_fixed_htab_eq, NULL);
5298
5299   mem_attrs_htab = htab_create_ggc (37, mem_attrs_htab_hash,
5300                                     mem_attrs_htab_eq, NULL);
5301   reg_attrs_htab = htab_create_ggc (37, reg_attrs_htab_hash,
5302                                     reg_attrs_htab_eq, NULL);
5303
5304   no_line_numbers = ! line_numbers;
5305
5306   /* Compute the word and byte modes.  */
5307
5308   byte_mode = VOIDmode;
5309   word_mode = VOIDmode;
5310   double_mode = VOIDmode;
5311
5312   for (mode = GET_CLASS_NARROWEST_MODE (MODE_INT);
5313        mode != VOIDmode;
5314        mode = GET_MODE_WIDER_MODE (mode))
5315     {
5316       if (GET_MODE_BITSIZE (mode) == BITS_PER_UNIT
5317           && byte_mode == VOIDmode)
5318         byte_mode = mode;
5319
5320       if (GET_MODE_BITSIZE (mode) == BITS_PER_WORD
5321           && word_mode == VOIDmode)
5322         word_mode = mode;
5323     }
5324
5325   for (mode = GET_CLASS_NARROWEST_MODE (MODE_FLOAT);
5326        mode != VOIDmode;
5327        mode = GET_MODE_WIDER_MODE (mode))
5328     {
5329       if (GET_MODE_BITSIZE (mode) == DOUBLE_TYPE_SIZE
5330           && double_mode == VOIDmode)
5331         double_mode = mode;
5332     }
5333
5334   ptr_mode = mode_for_size (POINTER_SIZE, GET_MODE_CLASS (Pmode), 0);
5335
5336 #ifdef INIT_EXPANDERS
5337   /* This is to initialize {init|mark|free}_machine_status before the first
5338      call to push_function_context_to.  This is needed by the Chill front
5339      end which calls push_function_context_to before the first call to
5340      init_function_start.  */
5341   INIT_EXPANDERS;
5342 #endif
5343
5344   /* Create the unique rtx's for certain rtx codes and operand values.  */
5345
5346   /* Don't use gen_rtx_CONST_INT here since gen_rtx_CONST_INT in this case
5347      tries to use these variables.  */
5348   for (i = - MAX_SAVED_CONST_INT; i <= MAX_SAVED_CONST_INT; i++)
5349     const_int_rtx[i + MAX_SAVED_CONST_INT] =
5350       gen_rtx_raw_CONST_INT (VOIDmode, (HOST_WIDE_INT) i);
5351
5352   if (STORE_FLAG_VALUE >= - MAX_SAVED_CONST_INT
5353       && STORE_FLAG_VALUE <= MAX_SAVED_CONST_INT)
5354     const_true_rtx = const_int_rtx[STORE_FLAG_VALUE + MAX_SAVED_CONST_INT];
5355   else
5356     const_true_rtx = gen_rtx_CONST_INT (VOIDmode, STORE_FLAG_VALUE);
5357
5358   REAL_VALUE_FROM_INT (dconst0,   0,  0, double_mode);
5359   REAL_VALUE_FROM_INT (dconst1,   1,  0, double_mode);
5360   REAL_VALUE_FROM_INT (dconst2,   2,  0, double_mode);
5361
5362   dconstm1 = dconst1;
5363   dconstm1.sign = 1;
5364
5365   dconsthalf = dconst1;
5366   SET_REAL_EXP (&dconsthalf, REAL_EXP (&dconsthalf) - 1);
5367
5368   for (i = 0; i < (int) ARRAY_SIZE (const_tiny_rtx); i++)
5369     {
5370       const REAL_VALUE_TYPE *const r =
5371         (i == 0 ? &dconst0 : i == 1 ? &dconst1 : &dconst2);
5372
5373       for (mode = GET_CLASS_NARROWEST_MODE (MODE_FLOAT);
5374            mode != VOIDmode;
5375            mode = GET_MODE_WIDER_MODE (mode))
5376         const_tiny_rtx[i][(int) mode] =
5377           CONST_DOUBLE_FROM_REAL_VALUE (*r, mode);
5378
5379       for (mode = GET_CLASS_NARROWEST_MODE (MODE_DECIMAL_FLOAT);
5380            mode != VOIDmode;
5381            mode = GET_MODE_WIDER_MODE (mode))
5382         const_tiny_rtx[i][(int) mode] =
5383           CONST_DOUBLE_FROM_REAL_VALUE (*r, mode);
5384
5385       const_tiny_rtx[i][(int) VOIDmode] = GEN_INT (i);
5386
5387       for (mode = GET_CLASS_NARROWEST_MODE (MODE_INT);
5388            mode != VOIDmode;
5389            mode = GET_MODE_WIDER_MODE (mode))
5390         const_tiny_rtx[i][(int) mode] = GEN_INT (i);
5391
5392       for (mode = GET_CLASS_NARROWEST_MODE (MODE_PARTIAL_INT);
5393            mode != VOIDmode;
5394            mode = GET_MODE_WIDER_MODE (mode))
5395         const_tiny_rtx[i][(int) mode] = GEN_INT (i);
5396     }
5397
5398   for (mode = GET_CLASS_NARROWEST_MODE (MODE_COMPLEX_INT);
5399        mode != VOIDmode;
5400        mode = GET_MODE_WIDER_MODE (mode))
5401     {
5402       rtx inner = const_tiny_rtx[0][(int)GET_MODE_INNER (mode)];
5403       const_tiny_rtx[0][(int) mode] = gen_rtx_CONCAT (mode, inner, inner);
5404     }
5405
5406   for (mode = GET_CLASS_NARROWEST_MODE (MODE_COMPLEX_FLOAT);
5407        mode != VOIDmode;
5408        mode = GET_MODE_WIDER_MODE (mode))
5409     {
5410       rtx inner = const_tiny_rtx[0][(int)GET_MODE_INNER (mode)];
5411       const_tiny_rtx[0][(int) mode] = gen_rtx_CONCAT (mode, inner, inner);
5412     }
5413
5414   for (mode = GET_CLASS_NARROWEST_MODE (MODE_VECTOR_INT);
5415        mode != VOIDmode;
5416        mode = GET_MODE_WIDER_MODE (mode))
5417     {
5418       const_tiny_rtx[0][(int) mode] = gen_const_vector (mode, 0);
5419       const_tiny_rtx[1][(int) mode] = gen_const_vector (mode, 1);
5420     }
5421
5422   for (mode = GET_CLASS_NARROWEST_MODE (MODE_VECTOR_FLOAT);
5423        mode != VOIDmode;
5424        mode = GET_MODE_WIDER_MODE (mode))
5425     {
5426       const_tiny_rtx[0][(int) mode] = gen_const_vector (mode, 0);
5427       const_tiny_rtx[1][(int) mode] = gen_const_vector (mode, 1);
5428     }
5429
5430   for (mode = GET_CLASS_NARROWEST_MODE (MODE_FRACT);
5431        mode != VOIDmode;
5432        mode = GET_MODE_WIDER_MODE (mode))
5433     {
5434       FCONST0(mode).data.high = 0;
5435       FCONST0(mode).data.low = 0;
5436       FCONST0(mode).mode = mode;
5437       const_tiny_rtx[0][(int) mode] = CONST_FIXED_FROM_FIXED_VALUE (
5438                                       FCONST0 (mode), mode);
5439     }
5440
5441   for (mode = GET_CLASS_NARROWEST_MODE (MODE_UFRACT);
5442        mode != VOIDmode;
5443        mode = GET_MODE_WIDER_MODE (mode))
5444     {
5445       FCONST0(mode).data.high = 0;
5446       FCONST0(mode).data.low = 0;
5447       FCONST0(mode).mode = mode;
5448       const_tiny_rtx[0][(int) mode] = CONST_FIXED_FROM_FIXED_VALUE (
5449                                       FCONST0 (mode), mode);
5450     }
5451
5452   for (mode = GET_CLASS_NARROWEST_MODE (MODE_ACCUM);
5453        mode != VOIDmode;
5454        mode = GET_MODE_WIDER_MODE (mode))
5455     {
5456       FCONST0(mode).data.high = 0;
5457       FCONST0(mode).data.low = 0;
5458       FCONST0(mode).mode = mode;
5459       const_tiny_rtx[0][(int) mode] = CONST_FIXED_FROM_FIXED_VALUE (
5460                                       FCONST0 (mode), mode);
5461
5462       /* We store the value 1.  */
5463       FCONST1(mode).data.high = 0;
5464       FCONST1(mode).data.low = 0;
5465       FCONST1(mode).mode = mode;
5466       lshift_double (1, 0, GET_MODE_FBIT (mode),
5467                      2 * HOST_BITS_PER_WIDE_INT,
5468                      &FCONST1(mode).data.low,
5469                      &FCONST1(mode).data.high,
5470                      SIGNED_FIXED_POINT_MODE_P (mode));
5471       const_tiny_rtx[1][(int) mode] = CONST_FIXED_FROM_FIXED_VALUE (
5472                                       FCONST1 (mode), mode);
5473     }
5474
5475   for (mode = GET_CLASS_NARROWEST_MODE (MODE_UACCUM);
5476        mode != VOIDmode;
5477        mode = GET_MODE_WIDER_MODE (mode))
5478     {
5479       FCONST0(mode).data.high = 0;
5480       FCONST0(mode).data.low = 0;
5481       FCONST0(mode).mode = mode;
5482       const_tiny_rtx[0][(int) mode] = CONST_FIXED_FROM_FIXED_VALUE (
5483                                       FCONST0 (mode), mode);
5484
5485       /* We store the value 1.  */
5486       FCONST1(mode).data.high = 0;
5487       FCONST1(mode).data.low = 0;
5488       FCONST1(mode).mode = mode;
5489       lshift_double (1, 0, GET_MODE_FBIT (mode),
5490                      2 * HOST_BITS_PER_WIDE_INT,
5491                      &FCONST1(mode).data.low,
5492                      &FCONST1(mode).data.high,
5493                      SIGNED_FIXED_POINT_MODE_P (mode));
5494       const_tiny_rtx[1][(int) mode] = CONST_FIXED_FROM_FIXED_VALUE (
5495                                       FCONST1 (mode), mode);
5496     }
5497
5498   for (mode = GET_CLASS_NARROWEST_MODE (MODE_VECTOR_FRACT);
5499        mode != VOIDmode;
5500        mode = GET_MODE_WIDER_MODE (mode))
5501     {
5502       const_tiny_rtx[0][(int) mode] = gen_const_vector (mode, 0);
5503     }
5504
5505   for (mode = GET_CLASS_NARROWEST_MODE (MODE_VECTOR_UFRACT);
5506        mode != VOIDmode;
5507        mode = GET_MODE_WIDER_MODE (mode))
5508     {
5509       const_tiny_rtx[0][(int) mode] = gen_const_vector (mode, 0);
5510     }
5511
5512   for (mode = GET_CLASS_NARROWEST_MODE (MODE_VECTOR_ACCUM);
5513        mode != VOIDmode;
5514        mode = GET_MODE_WIDER_MODE (mode))
5515     {
5516       const_tiny_rtx[0][(int) mode] = gen_const_vector (mode, 0);
5517       const_tiny_rtx[1][(int) mode] = gen_const_vector (mode, 1);
5518     }
5519
5520   for (mode = GET_CLASS_NARROWEST_MODE (MODE_VECTOR_UACCUM);
5521        mode != VOIDmode;
5522        mode = GET_MODE_WIDER_MODE (mode))
5523     {
5524       const_tiny_rtx[0][(int) mode] = gen_const_vector (mode, 0);
5525       const_tiny_rtx[1][(int) mode] = gen_const_vector (mode, 1);
5526     }
5527
5528   for (i = (int) CCmode; i < (int) MAX_MACHINE_MODE; ++i)
5529     if (GET_MODE_CLASS ((enum machine_mode) i) == MODE_CC)
5530       const_tiny_rtx[0][i] = const0_rtx;
5531
5532   const_tiny_rtx[0][(int) BImode] = const0_rtx;
5533   if (STORE_FLAG_VALUE == 1)
5534     const_tiny_rtx[1][(int) BImode] = const1_rtx;
5535 }
5536 \f
5537 /* Produce exact duplicate of insn INSN after AFTER.
5538    Care updating of libcall regions if present.  */
5539
5540 rtx
5541 emit_copy_of_insn_after (rtx insn, rtx after)
5542 {
5543   rtx new_rtx, link;
5544
5545   switch (GET_CODE (insn))
5546     {
5547     case INSN:
5548       new_rtx = emit_insn_after (copy_insn (PATTERN (insn)), after);
5549       break;
5550
5551     case JUMP_INSN:
5552       new_rtx = emit_jump_insn_after (copy_insn (PATTERN (insn)), after);
5553       break;
5554
5555     case CALL_INSN:
5556       new_rtx = emit_call_insn_after (copy_insn (PATTERN (insn)), after);
5557       if (CALL_INSN_FUNCTION_USAGE (insn))
5558         CALL_INSN_FUNCTION_USAGE (new_rtx)
5559           = copy_insn (CALL_INSN_FUNCTION_USAGE (insn));
5560       SIBLING_CALL_P (new_rtx) = SIBLING_CALL_P (insn);
5561       RTL_CONST_CALL_P (new_rtx) = RTL_CONST_CALL_P (insn);
5562       RTL_PURE_CALL_P (new_rtx) = RTL_PURE_CALL_P (insn);
5563       RTL_LOOPING_CONST_OR_PURE_CALL_P (new_rtx) 
5564         = RTL_LOOPING_CONST_OR_PURE_CALL_P (insn);
5565       break;
5566
5567     default:
5568       gcc_unreachable ();
5569     }
5570
5571   /* Update LABEL_NUSES.  */
5572   mark_jump_label (PATTERN (new_rtx), new_rtx, 0);
5573
5574   INSN_LOCATOR (new_rtx) = INSN_LOCATOR (insn);
5575
5576   /* If the old insn is frame related, then so is the new one.  This is
5577      primarily needed for IA-64 unwind info which marks epilogue insns,
5578      which may be duplicated by the basic block reordering code.  */
5579   RTX_FRAME_RELATED_P (new_rtx) = RTX_FRAME_RELATED_P (insn);
5580
5581   /* Copy all REG_NOTES except REG_LABEL_OPERAND since mark_jump_label
5582      will make them.  REG_LABEL_TARGETs are created there too, but are
5583      supposed to be sticky, so we copy them.  */
5584   for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
5585     if (REG_NOTE_KIND (link) != REG_LABEL_OPERAND)
5586       {
5587         if (GET_CODE (link) == EXPR_LIST)
5588           add_reg_note (new_rtx, REG_NOTE_KIND (link),
5589                         copy_insn_1 (XEXP (link, 0)));
5590         else
5591           add_reg_note (new_rtx, REG_NOTE_KIND (link), XEXP (link, 0));
5592       }
5593
5594   INSN_CODE (new_rtx) = INSN_CODE (insn);
5595   return new_rtx;
5596 }
5597
5598 static GTY((deletable)) rtx hard_reg_clobbers [NUM_MACHINE_MODES][FIRST_PSEUDO_REGISTER];
5599 rtx
5600 gen_hard_reg_clobber (enum machine_mode mode, unsigned int regno)
5601 {
5602   if (hard_reg_clobbers[mode][regno])
5603     return hard_reg_clobbers[mode][regno];
5604   else
5605     return (hard_reg_clobbers[mode][regno] =
5606             gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (mode, regno)));
5607 }
5608
5609 #include "gt-emit-rtl.h"