OSDN Git Service

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