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