OSDN Git Service

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