OSDN Git Service

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