OSDN Git Service

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