OSDN Git Service

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