OSDN Git Service

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