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