OSDN Git Service

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