OSDN Git Service

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