OSDN Git Service

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