OSDN Git Service

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