OSDN Git Service

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