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