OSDN Git Service

* emit-rtl.c (adjust_address, adjust_address_nv): Handle an
[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 /* Return offset in bytes to get OUTERMODE low part
1150    of the value in mode INNERMODE stored in memory in target format.  */
1151
1152 unsigned int
1153 subreg_lowpart_offset (outermode, innermode)
1154      enum machine_mode outermode, innermode;
1155 {
1156   unsigned int offset = 0;
1157   int difference = (GET_MODE_SIZE (innermode) - GET_MODE_SIZE (outermode));
1158
1159   if (difference > 0)
1160     {
1161       if (WORDS_BIG_ENDIAN)
1162         offset += (difference / UNITS_PER_WORD) * UNITS_PER_WORD;
1163       if (BYTES_BIG_ENDIAN)
1164         offset += difference % UNITS_PER_WORD;
1165     }
1166
1167   return offset;
1168 }
1169
1170 /* Return offset in bytes to get OUTERMODE high part
1171    of the value in mode INNERMODE stored in memory in target format.  */
1172 unsigned int
1173 subreg_highpart_offset (outermode, innermode)
1174      enum machine_mode outermode, innermode;
1175 {
1176   unsigned int offset = 0;
1177   int difference = (GET_MODE_SIZE (innermode) - GET_MODE_SIZE (outermode));
1178
1179   if (GET_MODE_SIZE (innermode) < GET_MODE_SIZE (outermode))
1180      abort ();
1181
1182   if (difference > 0)
1183     {
1184       if (! WORDS_BIG_ENDIAN)
1185         offset += (difference / UNITS_PER_WORD) * UNITS_PER_WORD;
1186       if (! BYTES_BIG_ENDIAN)
1187         offset += difference % UNITS_PER_WORD;
1188     }
1189
1190   return offset;
1191 }
1192
1193 /* Return 1 iff X, assumed to be a SUBREG,
1194    refers to the least significant part of its containing reg.
1195    If X is not a SUBREG, always return 1 (it is its own low part!).  */
1196
1197 int
1198 subreg_lowpart_p (x)
1199      rtx x;
1200 {
1201   if (GET_CODE (x) != SUBREG)
1202     return 1;
1203   else if (GET_MODE (SUBREG_REG (x)) == VOIDmode)
1204     return 0;
1205
1206   return (subreg_lowpart_offset (GET_MODE (x), GET_MODE (SUBREG_REG (x)))
1207           == SUBREG_BYTE (x));
1208 }
1209 \f
1210
1211 /* Helper routine for all the constant cases of operand_subword.
1212    Some places invoke this directly.  */
1213
1214 rtx
1215 constant_subword (op, offset, mode)
1216      rtx op;
1217      int offset;
1218      enum machine_mode mode;
1219 {
1220   int size_ratio = HOST_BITS_PER_WIDE_INT / BITS_PER_WORD;
1221   HOST_WIDE_INT val;
1222
1223   /* If OP is already an integer word, return it.  */
1224   if (GET_MODE_CLASS (mode) == MODE_INT
1225       && GET_MODE_SIZE (mode) == UNITS_PER_WORD)
1226     return op;
1227
1228 #ifdef REAL_ARITHMETIC
1229   /* The output is some bits, the width of the target machine's word.
1230      A wider-word host can surely hold them in a CONST_INT. A narrower-word
1231      host can't.  */
1232   if (HOST_BITS_PER_WIDE_INT >= BITS_PER_WORD
1233       && GET_MODE_CLASS (mode) == MODE_FLOAT
1234       && GET_MODE_BITSIZE (mode) == 64
1235       && GET_CODE (op) == CONST_DOUBLE)
1236     {
1237       long k[2];
1238       REAL_VALUE_TYPE rv;
1239
1240       REAL_VALUE_FROM_CONST_DOUBLE (rv, op);
1241       REAL_VALUE_TO_TARGET_DOUBLE (rv, k);
1242
1243       /* We handle 32-bit and >= 64-bit words here.  Note that the order in
1244          which the words are written depends on the word endianness.
1245          ??? This is a potential portability problem and should
1246          be fixed at some point.
1247
1248          We must excercise caution with the sign bit.  By definition there
1249          are 32 significant bits in K; there may be more in a HOST_WIDE_INT.
1250          Consider a host with a 32-bit long and a 64-bit HOST_WIDE_INT.
1251          So we explicitly mask and sign-extend as necessary.  */
1252       if (BITS_PER_WORD == 32)
1253         {
1254           val = k[offset];
1255           val = ((val & 0xffffffff) ^ 0x80000000) - 0x80000000;
1256           return GEN_INT (val);
1257         }
1258 #if HOST_BITS_PER_WIDE_INT >= 64
1259       else if (BITS_PER_WORD >= 64 && offset == 0)
1260         {
1261           val = k[! WORDS_BIG_ENDIAN];
1262           val = (((val & 0xffffffff) ^ 0x80000000) - 0x80000000) << 32;
1263           val |= (HOST_WIDE_INT) k[WORDS_BIG_ENDIAN] & 0xffffffff;
1264           return GEN_INT (val);
1265         }
1266 #endif
1267       else if (BITS_PER_WORD == 16)
1268         {
1269           val = k[offset >> 1];
1270           if ((offset & 1) == ! WORDS_BIG_ENDIAN)
1271             val >>= 16;
1272           val = ((val & 0xffff) ^ 0x8000) - 0x8000;
1273           return GEN_INT (val);
1274         }
1275       else
1276         abort ();
1277     }
1278   else if (HOST_BITS_PER_WIDE_INT >= BITS_PER_WORD
1279            && GET_MODE_CLASS (mode) == MODE_FLOAT
1280            && GET_MODE_BITSIZE (mode) > 64
1281            && GET_CODE (op) == CONST_DOUBLE)
1282     {
1283       long k[4];
1284       REAL_VALUE_TYPE rv;
1285
1286       REAL_VALUE_FROM_CONST_DOUBLE (rv, op);
1287       REAL_VALUE_TO_TARGET_LONG_DOUBLE (rv, k);
1288
1289       if (BITS_PER_WORD == 32)
1290         {
1291           val = k[offset];
1292           val = ((val & 0xffffffff) ^ 0x80000000) - 0x80000000;
1293           return GEN_INT (val);
1294         }
1295 #if HOST_BITS_PER_WIDE_INT >= 64
1296       else if (BITS_PER_WORD >= 64 && offset <= 1)
1297         {
1298           val = k[offset * 2 + ! WORDS_BIG_ENDIAN];
1299           val = (((val & 0xffffffff) ^ 0x80000000) - 0x80000000) << 32;
1300           val |= (HOST_WIDE_INT) k[offset * 2 + WORDS_BIG_ENDIAN] & 0xffffffff;
1301           return GEN_INT (val);
1302         }
1303 #endif
1304       else
1305         abort ();
1306     }
1307 #else /* no REAL_ARITHMETIC */
1308   if (((HOST_FLOAT_FORMAT == TARGET_FLOAT_FORMAT
1309         && HOST_BITS_PER_WIDE_INT == BITS_PER_WORD)
1310        || flag_pretend_float)
1311       && GET_MODE_CLASS (mode) == MODE_FLOAT
1312       && GET_MODE_SIZE (mode) == 2 * UNITS_PER_WORD
1313       && GET_CODE (op) == CONST_DOUBLE)
1314     {
1315       /* The constant is stored in the host's word-ordering,
1316          but we want to access it in the target's word-ordering.  Some
1317          compilers don't like a conditional inside macro args, so we have two
1318          copies of the return.  */
1319 #ifdef HOST_WORDS_BIG_ENDIAN
1320       return GEN_INT (offset == WORDS_BIG_ENDIAN
1321                       ? CONST_DOUBLE_HIGH (op) : CONST_DOUBLE_LOW (op));
1322 #else
1323       return GEN_INT (offset != WORDS_BIG_ENDIAN
1324                       ? CONST_DOUBLE_HIGH (op) : CONST_DOUBLE_LOW (op));
1325 #endif
1326     }
1327 #endif /* no REAL_ARITHMETIC */
1328
1329   /* Single word float is a little harder, since single- and double-word
1330      values often do not have the same high-order bits.  We have already
1331      verified that we want the only defined word of the single-word value.  */
1332 #ifdef REAL_ARITHMETIC
1333   if (GET_MODE_CLASS (mode) == MODE_FLOAT
1334       && GET_MODE_BITSIZE (mode) == 32
1335       && GET_CODE (op) == CONST_DOUBLE)
1336     {
1337       long l;
1338       REAL_VALUE_TYPE rv;
1339
1340       REAL_VALUE_FROM_CONST_DOUBLE (rv, op);
1341       REAL_VALUE_TO_TARGET_SINGLE (rv, l);
1342
1343       /* Sign extend from known 32-bit value to HOST_WIDE_INT.  */
1344       val = l;
1345       val = ((val & 0xffffffff) ^ 0x80000000) - 0x80000000;
1346
1347       if (BITS_PER_WORD == 16)
1348         {
1349           if ((offset & 1) == ! WORDS_BIG_ENDIAN)
1350             val >>= 16;
1351           val = ((val & 0xffff) ^ 0x8000) - 0x8000;
1352         }
1353
1354       return GEN_INT (val);
1355     }
1356 #else
1357   if (((HOST_FLOAT_FORMAT == TARGET_FLOAT_FORMAT
1358         && HOST_BITS_PER_WIDE_INT == BITS_PER_WORD)
1359        || flag_pretend_float)
1360       && sizeof (float) * 8 == HOST_BITS_PER_WIDE_INT
1361       && GET_MODE_CLASS (mode) == MODE_FLOAT
1362       && GET_MODE_SIZE (mode) == UNITS_PER_WORD
1363       && GET_CODE (op) == CONST_DOUBLE)
1364     {
1365       double d;
1366       union {float f; HOST_WIDE_INT i; } u;
1367
1368       REAL_VALUE_FROM_CONST_DOUBLE (d, op);
1369
1370       u.f = d;
1371       return GEN_INT (u.i);
1372     }
1373   if (((HOST_FLOAT_FORMAT == TARGET_FLOAT_FORMAT
1374         && HOST_BITS_PER_WIDE_INT == BITS_PER_WORD)
1375        || flag_pretend_float)
1376       && sizeof (double) * 8 == HOST_BITS_PER_WIDE_INT
1377       && GET_MODE_CLASS (mode) == MODE_FLOAT
1378       && GET_MODE_SIZE (mode) == UNITS_PER_WORD
1379       && GET_CODE (op) == CONST_DOUBLE)
1380     {
1381       double d;
1382       union {double d; HOST_WIDE_INT i; } u;
1383
1384       REAL_VALUE_FROM_CONST_DOUBLE (d, op);
1385
1386       u.d = d;
1387       return GEN_INT (u.i);
1388     }
1389 #endif /* no REAL_ARITHMETIC */
1390
1391   /* The only remaining cases that we can handle are integers.
1392      Convert to proper endianness now since these cases need it.
1393      At this point, offset == 0 means the low-order word.
1394
1395      We do not want to handle the case when BITS_PER_WORD <= HOST_BITS_PER_INT
1396      in general.  However, if OP is (const_int 0), we can just return
1397      it for any word.  */
1398
1399   if (op == const0_rtx)
1400     return op;
1401
1402   if (GET_MODE_CLASS (mode) != MODE_INT
1403       || (GET_CODE (op) != CONST_INT && GET_CODE (op) != CONST_DOUBLE)
1404       || BITS_PER_WORD > HOST_BITS_PER_WIDE_INT)
1405     return 0;
1406
1407   if (WORDS_BIG_ENDIAN)
1408     offset = GET_MODE_SIZE (mode) / UNITS_PER_WORD - 1 - offset;
1409
1410   /* Find out which word on the host machine this value is in and get
1411      it from the constant.  */
1412   val = (offset / size_ratio == 0
1413          ? (GET_CODE (op) == CONST_INT ? INTVAL (op) : CONST_DOUBLE_LOW (op))
1414          : (GET_CODE (op) == CONST_INT
1415             ? (INTVAL (op) < 0 ? ~0 : 0) : CONST_DOUBLE_HIGH (op)));
1416
1417   /* Get the value we want into the low bits of val.  */
1418   if (BITS_PER_WORD < HOST_BITS_PER_WIDE_INT)
1419     val = ((val >> ((offset % size_ratio) * BITS_PER_WORD)));
1420
1421   val = trunc_int_for_mode (val, word_mode);
1422
1423   return GEN_INT (val);
1424 }
1425
1426 /* Return subword OFFSET of operand OP.
1427    The word number, OFFSET, is interpreted as the word number starting
1428    at the low-order address.  OFFSET 0 is the low-order word if not
1429    WORDS_BIG_ENDIAN, otherwise it is the high-order word.
1430
1431    If we cannot extract the required word, we return zero.  Otherwise,
1432    an rtx corresponding to the requested word will be returned.
1433
1434    VALIDATE_ADDRESS is nonzero if the address should be validated.  Before
1435    reload has completed, a valid address will always be returned.  After
1436    reload, if a valid address cannot be returned, we return zero.
1437
1438    If VALIDATE_ADDRESS is zero, we simply form the required address; validating
1439    it is the responsibility of the caller.
1440
1441    MODE is the mode of OP in case it is a CONST_INT.
1442
1443    ??? This is still rather broken for some cases.  The problem for the
1444    moment is that all callers of this thing provide no 'goal mode' to
1445    tell us to work with.  This exists because all callers were written
1446    in a word based SUBREG world.
1447    Now use of this function can be deprecated by simplify_subreg in most
1448    cases.
1449  */
1450
1451 rtx
1452 operand_subword (op, offset, validate_address, mode)
1453      rtx op;
1454      unsigned int offset;
1455      int validate_address;
1456      enum machine_mode mode;
1457 {
1458   if (mode == VOIDmode)
1459     mode = GET_MODE (op);
1460
1461   if (mode == VOIDmode)
1462     abort ();
1463
1464   /* If OP is narrower than a word, fail. */
1465   if (mode != BLKmode
1466       && (GET_MODE_SIZE (mode) < UNITS_PER_WORD))
1467     return 0;
1468
1469   /* If we want a word outside OP, return zero. */
1470   if (mode != BLKmode
1471       && (offset + 1) * UNITS_PER_WORD > GET_MODE_SIZE (mode))
1472     return const0_rtx;
1473
1474   /* Form a new MEM at the requested address.  */
1475   if (GET_CODE (op) == MEM)
1476     {
1477       rtx new = adjust_address_nv (op, word_mode, offset * UNITS_PER_WORD);
1478
1479       if (! validate_address)
1480         return new;
1481
1482       else if (reload_completed)
1483         {
1484           if (! strict_memory_address_p (word_mode, XEXP (new, 0)))
1485             return 0;
1486         }
1487       else
1488         return replace_equiv_address (new, XEXP (new, 0));
1489     }
1490
1491   /* Rest can be handled by simplify_subreg.  */
1492   return simplify_gen_subreg (word_mode, op, mode, (offset * UNITS_PER_WORD));
1493 }
1494
1495 /* Similar to `operand_subword', but never return 0.  If we can't extract
1496    the required subword, put OP into a register and try again.  If that fails,
1497    abort.  We always validate the address in this case.
1498
1499    MODE is the mode of OP, in case it is CONST_INT.  */
1500
1501 rtx
1502 operand_subword_force (op, offset, mode)
1503      rtx op;
1504      unsigned int offset;
1505      enum machine_mode mode;
1506 {
1507   rtx result = operand_subword (op, offset, 1, mode);
1508
1509   if (result)
1510     return result;
1511
1512   if (mode != BLKmode && mode != VOIDmode)
1513     {
1514       /* If this is a register which can not be accessed by words, copy it
1515          to a pseudo register.  */
1516       if (GET_CODE (op) == REG)
1517         op = copy_to_reg (op);
1518       else
1519         op = force_reg (mode, op);
1520     }
1521
1522   result = operand_subword (op, offset, 1, mode);
1523   if (result == 0)
1524     abort ();
1525
1526   return result;
1527 }
1528 \f
1529 /* Given a compare instruction, swap the operands.
1530    A test instruction is changed into a compare of 0 against the operand.  */
1531
1532 void
1533 reverse_comparison (insn)
1534      rtx insn;
1535 {
1536   rtx body = PATTERN (insn);
1537   rtx comp;
1538
1539   if (GET_CODE (body) == SET)
1540     comp = SET_SRC (body);
1541   else
1542     comp = SET_SRC (XVECEXP (body, 0, 0));
1543
1544   if (GET_CODE (comp) == COMPARE)
1545     {
1546       rtx op0 = XEXP (comp, 0);
1547       rtx op1 = XEXP (comp, 1);
1548       XEXP (comp, 0) = op1;
1549       XEXP (comp, 1) = op0;
1550     }
1551   else
1552     {
1553       rtx new = gen_rtx_COMPARE (VOIDmode,
1554                                  CONST0_RTX (GET_MODE (comp)), comp);
1555       if (GET_CODE (body) == SET)
1556         SET_SRC (body) = new;
1557       else
1558         SET_SRC (XVECEXP (body, 0, 0)) = new;
1559     }
1560 }
1561 \f
1562 /* Return a memory reference like MEMREF, but with its mode changed
1563    to MODE and its address changed to ADDR.
1564    (VOIDmode means don't change the mode.
1565    NULL for ADDR means don't change the address.)
1566    VALIDATE is nonzero if the returned memory location is required to be
1567    valid.  */
1568
1569 rtx
1570 change_address_1 (memref, mode, addr, validate)
1571      rtx memref;
1572      enum machine_mode mode;
1573      rtx addr;
1574      int validate;
1575 {
1576   rtx new;
1577
1578   if (GET_CODE (memref) != MEM)
1579     abort ();
1580   if (mode == VOIDmode)
1581     mode = GET_MODE (memref);
1582   if (addr == 0)
1583     addr = XEXP (memref, 0);
1584
1585   if (validate)
1586     {
1587       if (reload_in_progress || reload_completed)
1588         {
1589           if (! memory_address_p (mode, addr))
1590             abort ();
1591         }
1592       else
1593         addr = memory_address (mode, addr);
1594     }
1595
1596   if (rtx_equal_p (addr, XEXP (memref, 0)) && mode == GET_MODE (memref))
1597     return memref;
1598
1599   new = gen_rtx_MEM (mode, addr);
1600   MEM_COPY_ATTRIBUTES (new, memref);
1601   return new;
1602 }
1603
1604 /* Return a memory reference like MEMREF, but with its mode changed
1605    to MODE and its address offset by OFFSET bytes.  */
1606
1607 rtx
1608 adjust_address (memref, mode, offset)
1609      rtx memref;
1610      enum machine_mode mode;
1611      HOST_WIDE_INT offset;
1612 {
1613   /* For now, this is just a wrapper for change_address, but eventually
1614      will do memref tracking.  */
1615   rtx addr = XEXP (memref, 0);
1616
1617   /* If MEMREF is a LO_SUM and the offset is within the size of the
1618      object, we can merge it into the LO_SUM.  */
1619   if (GET_MODE (memref) != BLKmode && GET_CODE (addr) == LO_SUM
1620       && offset >= 0 && offset < GET_MODE_SIZE (GET_MODE (memref)))
1621     addr = gen_rtx_LO_SUM (mode, XEXP (addr, 0),
1622                            plus_constant (XEXP (addr, 1), offset));
1623   else
1624     addr = plus_constant (addr, offset);
1625
1626   return change_address (memref, mode, addr);
1627 }
1628
1629 /* Likewise, but the reference is not required to be valid.  */
1630
1631 rtx
1632 adjust_address_nv (memref, mode, offset)
1633      rtx memref;
1634      enum machine_mode mode;
1635      HOST_WIDE_INT offset;
1636 {
1637   /* For now, this is just a wrapper for change_address, but eventually
1638      will do memref tracking.  */
1639   rtx addr = XEXP (memref, 0);
1640
1641   /* If MEMREF is a LO_SUM and the offset is within the size of the
1642      object, we can merge it into the LO_SUM.  */
1643   if (GET_MODE (memref) != BLKmode && GET_CODE (addr) == LO_SUM
1644       && offset >= 0 && offset < GET_MODE_SIZE (GET_MODE (memref)))
1645     addr = gen_rtx_LO_SUM (mode, XEXP (addr, 0),
1646                            plus_constant (XEXP (addr, 1), offset));
1647   else
1648     addr = plus_constant (addr, offset);
1649
1650   return change_address_1 (memref, mode, addr, 0);
1651 }
1652
1653 /* Return a memory reference like MEMREF, but with its address changed to
1654    ADDR.  The caller is asserting that the actual piece of memory pointed
1655    to is the same, just the form of the address is being changed, such as
1656    by putting something into a register.  */
1657
1658 rtx
1659 replace_equiv_address (memref, addr)
1660      rtx memref;
1661      rtx addr;
1662 {
1663   /* For now, this is just a wrapper for change_address, but eventually
1664      will do memref tracking.  */
1665   return change_address (memref, VOIDmode, addr);
1666 }
1667 /* Likewise, but the reference is not required to be valid.  */
1668
1669 rtx
1670 replace_equiv_address_nv (memref, addr)
1671      rtx memref;
1672      rtx addr;
1673 {
1674   /* For now, this is just a wrapper for change_address, but eventually
1675      will do memref tracking.  */
1676   return change_address_1 (memref, VOIDmode, addr, 0);
1677 }
1678 \f
1679 /* Return a newly created CODE_LABEL rtx with a unique label number.  */
1680
1681 rtx
1682 gen_label_rtx ()
1683 {
1684   register rtx label;
1685
1686   label = gen_rtx_CODE_LABEL (VOIDmode, 0, NULL_RTX,
1687                               NULL_RTX, label_num++, NULL, NULL);
1688
1689   LABEL_NUSES (label) = 0;
1690   LABEL_ALTERNATE_NAME (label) = NULL;
1691   return label;
1692 }
1693 \f
1694 /* For procedure integration.  */
1695
1696 /* Install new pointers to the first and last insns in the chain.
1697    Also, set cur_insn_uid to one higher than the last in use.
1698    Used for an inline-procedure after copying the insn chain.  */
1699
1700 void
1701 set_new_first_and_last_insn (first, last)
1702      rtx first, last;
1703 {
1704   rtx insn;
1705
1706   first_insn = first;
1707   last_insn = last;
1708   cur_insn_uid = 0;
1709
1710   for (insn = first; insn; insn = NEXT_INSN (insn))
1711     cur_insn_uid = MAX (cur_insn_uid, INSN_UID (insn));
1712
1713   cur_insn_uid++;
1714 }
1715
1716 /* Set the range of label numbers found in the current function.
1717    This is used when belatedly compiling an inline function.  */
1718
1719 void
1720 set_new_first_and_last_label_num (first, last)
1721      int first, last;
1722 {
1723   base_label_num = label_num;
1724   first_label_num = first;
1725   last_label_num = last;
1726 }
1727
1728 /* Set the last label number found in the current function.
1729    This is used when belatedly compiling an inline function.  */
1730
1731 void
1732 set_new_last_label_num (last)
1733      int last;
1734 {
1735   base_label_num = label_num;
1736   last_label_num = last;
1737 }
1738 \f
1739 /* Restore all variables describing the current status from the structure *P.
1740    This is used after a nested function.  */
1741
1742 void
1743 restore_emit_status (p)
1744      struct function *p ATTRIBUTE_UNUSED;
1745 {
1746   last_label_num = 0;
1747   clear_emit_caches ();
1748 }
1749
1750 /* Clear out all parts of the state in F that can safely be discarded
1751    after the function has been compiled, to let garbage collection
1752    reclaim the memory.  */
1753
1754 void
1755 free_emit_status (f)
1756      struct function *f;
1757 {
1758   free (f->emit->x_regno_reg_rtx);
1759   free (f->emit->regno_pointer_align);
1760   free (f->emit);
1761   f->emit = NULL;
1762 }
1763 \f
1764 /* Go through all the RTL insn bodies and copy any invalid shared
1765    structure.  This routine should only be called once.  */
1766
1767 void
1768 unshare_all_rtl (fndecl, insn)
1769      tree fndecl;
1770      rtx insn;
1771 {
1772   tree decl;
1773
1774   /* Make sure that virtual parameters are not shared.  */
1775   for (decl = DECL_ARGUMENTS (fndecl); decl; decl = TREE_CHAIN (decl))
1776     SET_DECL_RTL (decl, copy_rtx_if_shared (DECL_RTL (decl)));
1777
1778   /* Make sure that virtual stack slots are not shared.  */
1779   unshare_all_decls (DECL_INITIAL (fndecl));
1780
1781   /* Unshare just about everything else.  */
1782   unshare_all_rtl_1 (insn);
1783
1784   /* Make sure the addresses of stack slots found outside the insn chain
1785      (such as, in DECL_RTL of a variable) are not shared
1786      with the insn chain.
1787
1788      This special care is necessary when the stack slot MEM does not
1789      actually appear in the insn chain.  If it does appear, its address
1790      is unshared from all else at that point.  */
1791   stack_slot_list = copy_rtx_if_shared (stack_slot_list);
1792 }
1793
1794 /* Go through all the RTL insn bodies and copy any invalid shared
1795    structure, again.  This is a fairly expensive thing to do so it
1796    should be done sparingly.  */
1797
1798 void
1799 unshare_all_rtl_again (insn)
1800      rtx insn;
1801 {
1802   rtx p;
1803   tree decl;
1804
1805   for (p = insn; p; p = NEXT_INSN (p))
1806     if (INSN_P (p))
1807       {
1808         reset_used_flags (PATTERN (p));
1809         reset_used_flags (REG_NOTES (p));
1810         reset_used_flags (LOG_LINKS (p));
1811       }
1812
1813   /* Make sure that virtual stack slots are not shared.  */
1814   reset_used_decls (DECL_INITIAL (cfun->decl));
1815
1816   /* Make sure that virtual parameters are not shared.  */
1817   for (decl = DECL_ARGUMENTS (cfun->decl); decl; decl = TREE_CHAIN (decl))
1818     reset_used_flags (DECL_RTL (decl));
1819
1820   reset_used_flags (stack_slot_list);
1821
1822   unshare_all_rtl (cfun->decl, insn);
1823 }
1824
1825 /* Go through all the RTL insn bodies and copy any invalid shared structure.
1826    Assumes the mark bits are cleared at entry.  */
1827
1828 static void
1829 unshare_all_rtl_1 (insn)
1830      rtx insn;
1831 {
1832   for (; insn; insn = NEXT_INSN (insn))
1833     if (INSN_P (insn))
1834       {
1835         PATTERN (insn) = copy_rtx_if_shared (PATTERN (insn));
1836         REG_NOTES (insn) = copy_rtx_if_shared (REG_NOTES (insn));
1837         LOG_LINKS (insn) = copy_rtx_if_shared (LOG_LINKS (insn));
1838       }
1839 }
1840
1841 /* Go through all virtual stack slots of a function and copy any
1842    shared structure.  */
1843 static void
1844 unshare_all_decls (blk)
1845      tree blk;
1846 {
1847   tree t;
1848
1849   /* Copy shared decls.  */
1850   for (t = BLOCK_VARS (blk); t; t = TREE_CHAIN (t))
1851     if (DECL_RTL_SET_P (t))
1852       SET_DECL_RTL (t, copy_rtx_if_shared (DECL_RTL (t)));
1853
1854   /* Now process sub-blocks.  */
1855   for (t = BLOCK_SUBBLOCKS (blk); t; t = TREE_CHAIN (t))
1856     unshare_all_decls (t);
1857 }
1858
1859 /* Go through all virtual stack slots of a function and mark them as
1860    not shared. */
1861 static void
1862 reset_used_decls (blk)
1863      tree blk;
1864 {
1865   tree t;
1866
1867   /* Mark decls.  */
1868   for (t = BLOCK_VARS (blk); t; t = TREE_CHAIN (t))
1869     if (DECL_RTL_SET_P (t))
1870       reset_used_flags (DECL_RTL (t));
1871
1872   /* Now process sub-blocks.  */
1873   for (t = BLOCK_SUBBLOCKS (blk); t; t = TREE_CHAIN (t))
1874     reset_used_decls (t);
1875 }
1876
1877 /* Mark ORIG as in use, and return a copy of it if it was already in use.
1878    Recursively does the same for subexpressions.  */
1879
1880 rtx
1881 copy_rtx_if_shared (orig)
1882      rtx orig;
1883 {
1884   register rtx x = orig;
1885   register int i;
1886   register enum rtx_code code;
1887   register const char *format_ptr;
1888   int copied = 0;
1889
1890   if (x == 0)
1891     return 0;
1892
1893   code = GET_CODE (x);
1894
1895   /* These types may be freely shared.  */
1896
1897   switch (code)
1898     {
1899     case REG:
1900     case QUEUED:
1901     case CONST_INT:
1902     case CONST_DOUBLE:
1903     case SYMBOL_REF:
1904     case CODE_LABEL:
1905     case PC:
1906     case CC0:
1907     case SCRATCH:
1908       /* SCRATCH must be shared because they represent distinct values.  */
1909       return x;
1910
1911     case CONST:
1912       /* CONST can be shared if it contains a SYMBOL_REF.  If it contains
1913          a LABEL_REF, it isn't sharable.  */
1914       if (GET_CODE (XEXP (x, 0)) == PLUS
1915           && GET_CODE (XEXP (XEXP (x, 0), 0)) == SYMBOL_REF
1916           && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT)
1917         return x;
1918       break;
1919
1920     case INSN:
1921     case JUMP_INSN:
1922     case CALL_INSN:
1923     case NOTE:
1924     case BARRIER:
1925       /* The chain of insns is not being copied.  */
1926       return x;
1927
1928     case MEM:
1929       /* A MEM is allowed to be shared if its address is constant.
1930
1931          We used to allow sharing of MEMs which referenced
1932          virtual_stack_vars_rtx or virtual_incoming_args_rtx, but
1933          that can lose.  instantiate_virtual_regs will not unshare
1934          the MEMs, and combine may change the structure of the address
1935          because it looks safe and profitable in one context, but
1936          in some other context it creates unrecognizable RTL.  */
1937       if (CONSTANT_ADDRESS_P (XEXP (x, 0)))
1938         return x;
1939
1940       break;
1941
1942     default:
1943       break;
1944     }
1945
1946   /* This rtx may not be shared.  If it has already been seen,
1947      replace it with a copy of itself.  */
1948
1949   if (x->used)
1950     {
1951       register rtx copy;
1952
1953       copy = rtx_alloc (code);
1954       memcpy (copy, x,
1955              (sizeof (*copy) - sizeof (copy->fld)
1956               + sizeof (copy->fld[0]) * GET_RTX_LENGTH (code)));
1957       x = copy;
1958       copied = 1;
1959     }
1960   x->used = 1;
1961
1962   /* Now scan the subexpressions recursively.
1963      We can store any replaced subexpressions directly into X
1964      since we know X is not shared!  Any vectors in X
1965      must be copied if X was copied.  */
1966
1967   format_ptr = GET_RTX_FORMAT (code);
1968
1969   for (i = 0; i < GET_RTX_LENGTH (code); i++)
1970     {
1971       switch (*format_ptr++)
1972         {
1973         case 'e':
1974           XEXP (x, i) = copy_rtx_if_shared (XEXP (x, i));
1975           break;
1976
1977         case 'E':
1978           if (XVEC (x, i) != NULL)
1979             {
1980               register int j;
1981               int len = XVECLEN (x, i);
1982
1983               if (copied && len > 0)
1984                 XVEC (x, i) = gen_rtvec_v (len, XVEC (x, i)->elem);
1985               for (j = 0; j < len; j++)
1986                 XVECEXP (x, i, j) = copy_rtx_if_shared (XVECEXP (x, i, j));
1987             }
1988           break;
1989         }
1990     }
1991   return x;
1992 }
1993
1994 /* Clear all the USED bits in X to allow copy_rtx_if_shared to be used
1995    to look for shared sub-parts.  */
1996
1997 void
1998 reset_used_flags (x)
1999      rtx x;
2000 {
2001   register int i, j;
2002   register enum rtx_code code;
2003   register const char *format_ptr;
2004
2005   if (x == 0)
2006     return;
2007
2008   code = GET_CODE (x);
2009
2010   /* These types may be freely shared so we needn't do any resetting
2011      for them.  */
2012
2013   switch (code)
2014     {
2015     case REG:
2016     case QUEUED:
2017     case CONST_INT:
2018     case CONST_DOUBLE:
2019     case SYMBOL_REF:
2020     case CODE_LABEL:
2021     case PC:
2022     case CC0:
2023       return;
2024
2025     case INSN:
2026     case JUMP_INSN:
2027     case CALL_INSN:
2028     case NOTE:
2029     case LABEL_REF:
2030     case BARRIER:
2031       /* The chain of insns is not being copied.  */
2032       return;
2033
2034     default:
2035       break;
2036     }
2037
2038   x->used = 0;
2039
2040   format_ptr = GET_RTX_FORMAT (code);
2041   for (i = 0; i < GET_RTX_LENGTH (code); i++)
2042     {
2043       switch (*format_ptr++)
2044         {
2045         case 'e':
2046           reset_used_flags (XEXP (x, i));
2047           break;
2048
2049         case 'E':
2050           for (j = 0; j < XVECLEN (x, i); j++)
2051             reset_used_flags (XVECEXP (x, i, j));
2052           break;
2053         }
2054     }
2055 }
2056 \f
2057 /* Copy X if necessary so that it won't be altered by changes in OTHER.
2058    Return X or the rtx for the pseudo reg the value of X was copied into.
2059    OTHER must be valid as a SET_DEST.  */
2060
2061 rtx
2062 make_safe_from (x, other)
2063      rtx x, other;
2064 {
2065   while (1)
2066     switch (GET_CODE (other))
2067       {
2068       case SUBREG:
2069         other = SUBREG_REG (other);
2070         break;
2071       case STRICT_LOW_PART:
2072       case SIGN_EXTEND:
2073       case ZERO_EXTEND:
2074         other = XEXP (other, 0);
2075         break;
2076       default:
2077         goto done;
2078       }
2079  done:
2080   if ((GET_CODE (other) == MEM
2081        && ! CONSTANT_P (x)
2082        && GET_CODE (x) != REG
2083        && GET_CODE (x) != SUBREG)
2084       || (GET_CODE (other) == REG
2085           && (REGNO (other) < FIRST_PSEUDO_REGISTER
2086               || reg_mentioned_p (other, x))))
2087     {
2088       rtx temp = gen_reg_rtx (GET_MODE (x));
2089       emit_move_insn (temp, x);
2090       return temp;
2091     }
2092   return x;
2093 }
2094 \f
2095 /* Emission of insns (adding them to the doubly-linked list).  */
2096
2097 /* Return the first insn of the current sequence or current function.  */
2098
2099 rtx
2100 get_insns ()
2101 {
2102   return first_insn;
2103 }
2104
2105 /* Return the last insn emitted in current sequence or current function.  */
2106
2107 rtx
2108 get_last_insn ()
2109 {
2110   return last_insn;
2111 }
2112
2113 /* Specify a new insn as the last in the chain.  */
2114
2115 void
2116 set_last_insn (insn)
2117      rtx insn;
2118 {
2119   if (NEXT_INSN (insn) != 0)
2120     abort ();
2121   last_insn = insn;
2122 }
2123
2124 /* Return the last insn emitted, even if it is in a sequence now pushed.  */
2125
2126 rtx
2127 get_last_insn_anywhere ()
2128 {
2129   struct sequence_stack *stack;
2130   if (last_insn)
2131     return last_insn;
2132   for (stack = seq_stack; stack; stack = stack->next)
2133     if (stack->last != 0)
2134       return stack->last;
2135   return 0;
2136 }
2137
2138 /* Return a number larger than any instruction's uid in this function.  */
2139
2140 int
2141 get_max_uid ()
2142 {
2143   return cur_insn_uid;
2144 }
2145
2146 /* Renumber instructions so that no instruction UIDs are wasted.  */
2147
2148 void
2149 renumber_insns (stream)
2150      FILE *stream;
2151 {
2152   rtx insn;
2153
2154   /* If we're not supposed to renumber instructions, don't.  */
2155   if (!flag_renumber_insns)
2156     return;
2157
2158   /* If there aren't that many instructions, then it's not really
2159      worth renumbering them.  */
2160   if (flag_renumber_insns == 1 && get_max_uid () < 25000)
2161     return;
2162
2163   cur_insn_uid = 1;
2164
2165   for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
2166     {
2167       if (stream)
2168         fprintf (stream, "Renumbering insn %d to %d\n",
2169                  INSN_UID (insn), cur_insn_uid);
2170       INSN_UID (insn) = cur_insn_uid++;
2171     }
2172 }
2173 \f
2174 /* Return the next insn.  If it is a SEQUENCE, return the first insn
2175    of the sequence.  */
2176
2177 rtx
2178 next_insn (insn)
2179      rtx insn;
2180 {
2181   if (insn)
2182     {
2183       insn = NEXT_INSN (insn);
2184       if (insn && GET_CODE (insn) == INSN
2185           && GET_CODE (PATTERN (insn)) == SEQUENCE)
2186         insn = XVECEXP (PATTERN (insn), 0, 0);
2187     }
2188
2189   return insn;
2190 }
2191
2192 /* Return the previous insn.  If it is a SEQUENCE, return the last insn
2193    of the sequence.  */
2194
2195 rtx
2196 previous_insn (insn)
2197      rtx insn;
2198 {
2199   if (insn)
2200     {
2201       insn = PREV_INSN (insn);
2202       if (insn && GET_CODE (insn) == INSN
2203           && GET_CODE (PATTERN (insn)) == SEQUENCE)
2204         insn = XVECEXP (PATTERN (insn), 0, XVECLEN (PATTERN (insn), 0) - 1);
2205     }
2206
2207   return insn;
2208 }
2209
2210 /* Return the next insn after INSN that is not a NOTE.  This routine does not
2211    look inside SEQUENCEs.  */
2212
2213 rtx
2214 next_nonnote_insn (insn)
2215      rtx insn;
2216 {
2217   while (insn)
2218     {
2219       insn = NEXT_INSN (insn);
2220       if (insn == 0 || GET_CODE (insn) != NOTE)
2221         break;
2222     }
2223
2224   return insn;
2225 }
2226
2227 /* Return the previous insn before INSN that is not a NOTE.  This routine does
2228    not look inside SEQUENCEs.  */
2229
2230 rtx
2231 prev_nonnote_insn (insn)
2232      rtx insn;
2233 {
2234   while (insn)
2235     {
2236       insn = PREV_INSN (insn);
2237       if (insn == 0 || GET_CODE (insn) != NOTE)
2238         break;
2239     }
2240
2241   return insn;
2242 }
2243
2244 /* Return the next INSN, CALL_INSN or JUMP_INSN after INSN;
2245    or 0, if there is none.  This routine does not look inside
2246    SEQUENCEs.  */
2247
2248 rtx
2249 next_real_insn (insn)
2250      rtx insn;
2251 {
2252   while (insn)
2253     {
2254       insn = NEXT_INSN (insn);
2255       if (insn == 0 || GET_CODE (insn) == INSN
2256           || GET_CODE (insn) == CALL_INSN || GET_CODE (insn) == JUMP_INSN)
2257         break;
2258     }
2259
2260   return insn;
2261 }
2262
2263 /* Return the last INSN, CALL_INSN or JUMP_INSN before INSN;
2264    or 0, if there is none.  This routine does not look inside
2265    SEQUENCEs.  */
2266
2267 rtx
2268 prev_real_insn (insn)
2269      rtx insn;
2270 {
2271   while (insn)
2272     {
2273       insn = PREV_INSN (insn);
2274       if (insn == 0 || GET_CODE (insn) == INSN || GET_CODE (insn) == CALL_INSN
2275           || GET_CODE (insn) == JUMP_INSN)
2276         break;
2277     }
2278
2279   return insn;
2280 }
2281
2282 /* Find the next insn after INSN that really does something.  This routine
2283    does not look inside SEQUENCEs.  Until reload has completed, this is the
2284    same as next_real_insn.  */
2285
2286 int
2287 active_insn_p (insn)
2288      rtx insn;
2289 {
2290   return (GET_CODE (insn) == CALL_INSN || GET_CODE (insn) == JUMP_INSN
2291           || (GET_CODE (insn) == INSN
2292               && (! reload_completed
2293                   || (GET_CODE (PATTERN (insn)) != USE
2294                       && GET_CODE (PATTERN (insn)) != CLOBBER))));
2295 }
2296
2297 rtx
2298 next_active_insn (insn)
2299      rtx insn;
2300 {
2301   while (insn)
2302     {
2303       insn = NEXT_INSN (insn);
2304       if (insn == 0 || active_insn_p (insn))
2305         break;
2306     }
2307
2308   return insn;
2309 }
2310
2311 /* Find the last insn before INSN that really does something.  This routine
2312    does not look inside SEQUENCEs.  Until reload has completed, this is the
2313    same as prev_real_insn.  */
2314
2315 rtx
2316 prev_active_insn (insn)
2317      rtx insn;
2318 {
2319   while (insn)
2320     {
2321       insn = PREV_INSN (insn);
2322       if (insn == 0 || active_insn_p (insn))
2323         break;
2324     }
2325
2326   return insn;
2327 }
2328
2329 /* Return the next CODE_LABEL after the insn INSN, or 0 if there is none.  */
2330
2331 rtx
2332 next_label (insn)
2333      rtx insn;
2334 {
2335   while (insn)
2336     {
2337       insn = NEXT_INSN (insn);
2338       if (insn == 0 || GET_CODE (insn) == CODE_LABEL)
2339         break;
2340     }
2341
2342   return insn;
2343 }
2344
2345 /* Return the last CODE_LABEL before the insn INSN, or 0 if there is none.  */
2346
2347 rtx
2348 prev_label (insn)
2349      rtx insn;
2350 {
2351   while (insn)
2352     {
2353       insn = PREV_INSN (insn);
2354       if (insn == 0 || GET_CODE (insn) == CODE_LABEL)
2355         break;
2356     }
2357
2358   return insn;
2359 }
2360 \f
2361 #ifdef HAVE_cc0
2362 /* INSN uses CC0 and is being moved into a delay slot.  Set up REG_CC_SETTER
2363    and REG_CC_USER notes so we can find it.  */
2364
2365 void
2366 link_cc0_insns (insn)
2367      rtx insn;
2368 {
2369   rtx user = next_nonnote_insn (insn);
2370
2371   if (GET_CODE (user) == INSN && GET_CODE (PATTERN (user)) == SEQUENCE)
2372     user = XVECEXP (PATTERN (user), 0, 0);
2373
2374   REG_NOTES (user) = gen_rtx_INSN_LIST (REG_CC_SETTER, insn,
2375                                         REG_NOTES (user));
2376   REG_NOTES (insn) = gen_rtx_INSN_LIST (REG_CC_USER, user, REG_NOTES (insn));
2377 }
2378
2379 /* Return the next insn that uses CC0 after INSN, which is assumed to
2380    set it.  This is the inverse of prev_cc0_setter (i.e., prev_cc0_setter
2381    applied to the result of this function should yield INSN).
2382
2383    Normally, this is simply the next insn.  However, if a REG_CC_USER note
2384    is present, it contains the insn that uses CC0.
2385
2386    Return 0 if we can't find the insn.  */
2387
2388 rtx
2389 next_cc0_user (insn)
2390      rtx insn;
2391 {
2392   rtx note = find_reg_note (insn, REG_CC_USER, NULL_RTX);
2393
2394   if (note)
2395     return XEXP (note, 0);
2396
2397   insn = next_nonnote_insn (insn);
2398   if (insn && GET_CODE (insn) == INSN && GET_CODE (PATTERN (insn)) == SEQUENCE)
2399     insn = XVECEXP (PATTERN (insn), 0, 0);
2400
2401   if (insn && INSN_P (insn) && reg_mentioned_p (cc0_rtx, PATTERN (insn)))
2402     return insn;
2403
2404   return 0;
2405 }
2406
2407 /* Find the insn that set CC0 for INSN.  Unless INSN has a REG_CC_SETTER
2408    note, it is the previous insn.  */
2409
2410 rtx
2411 prev_cc0_setter (insn)
2412      rtx insn;
2413 {
2414   rtx note = find_reg_note (insn, REG_CC_SETTER, NULL_RTX);
2415
2416   if (note)
2417     return XEXP (note, 0);
2418
2419   insn = prev_nonnote_insn (insn);
2420   if (! sets_cc0_p (PATTERN (insn)))
2421     abort ();
2422
2423   return insn;
2424 }
2425 #endif
2426
2427 /* Increment the label uses for all labels present in rtx.  */
2428
2429 static void
2430 mark_label_nuses(x)
2431     rtx x;
2432 {
2433   register enum rtx_code code;
2434   register int i, j;
2435   register const char *fmt;
2436
2437   code = GET_CODE (x);
2438   if (code == LABEL_REF)
2439     LABEL_NUSES (XEXP (x, 0))++;
2440
2441   fmt = GET_RTX_FORMAT (code);
2442   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2443     {
2444       if (fmt[i] == 'e')
2445         mark_label_nuses (XEXP (x, i));
2446       else if (fmt[i] == 'E')
2447         for (j = XVECLEN (x, i) - 1; j >= 0; j--)
2448           mark_label_nuses (XVECEXP (x, i, j));
2449     }
2450 }
2451
2452 \f
2453 /* Try splitting insns that can be split for better scheduling.
2454    PAT is the pattern which might split.
2455    TRIAL is the insn providing PAT.
2456    LAST is non-zero if we should return the last insn of the sequence produced.
2457
2458    If this routine succeeds in splitting, it returns the first or last
2459    replacement insn depending on the value of LAST.  Otherwise, it
2460    returns TRIAL.  If the insn to be returned can be split, it will be.  */
2461
2462 rtx
2463 try_split (pat, trial, last)
2464      rtx pat, trial;
2465      int last;
2466 {
2467   rtx before = PREV_INSN (trial);
2468   rtx after = NEXT_INSN (trial);
2469   rtx seq = split_insns (pat, trial);
2470   int has_barrier = 0;
2471   rtx tem;
2472
2473   /* If we are splitting a JUMP_INSN, it might be followed by a BARRIER.
2474      We may need to handle this specially.  */
2475   if (after && GET_CODE (after) == BARRIER)
2476     {
2477       has_barrier = 1;
2478       after = NEXT_INSN (after);
2479     }
2480
2481   if (seq)
2482     {
2483       /* SEQ can either be a SEQUENCE or the pattern of a single insn.
2484          The latter case will normally arise only when being done so that
2485          it, in turn, will be split (SFmode on the 29k is an example).  */
2486       if (GET_CODE (seq) == SEQUENCE)
2487         {
2488           int i;
2489           rtx eh_note;
2490
2491           /* Avoid infinite loop if any insn of the result matches
2492              the original pattern.  */
2493           for (i = 0; i < XVECLEN (seq, 0); i++)
2494             if (GET_CODE (XVECEXP (seq, 0, i)) == INSN
2495                 && rtx_equal_p (PATTERN (XVECEXP (seq, 0, i)), pat))
2496               return trial;
2497
2498           /* Mark labels.  */
2499           for (i = XVECLEN (seq, 0) - 1; i >= 0; i--)
2500             if (GET_CODE (XVECEXP (seq, 0, i)) == JUMP_INSN)
2501               mark_jump_label (PATTERN (XVECEXP (seq, 0, i)),
2502                                XVECEXP (seq, 0, i), 0, 0);
2503
2504           /* If we are splitting a CALL_INSN, look for the CALL_INSN
2505              in SEQ and copy our CALL_INSN_FUNCTION_USAGE to it.  */
2506           if (GET_CODE (trial) == CALL_INSN)
2507             for (i = XVECLEN (seq, 0) - 1; i >= 0; i--)
2508               if (GET_CODE (XVECEXP (seq, 0, i)) == CALL_INSN)
2509                 CALL_INSN_FUNCTION_USAGE (XVECEXP (seq, 0, i))
2510                   = CALL_INSN_FUNCTION_USAGE (trial);
2511
2512           /* Copy EH notes.  */
2513           if ((eh_note = find_reg_note (trial, REG_EH_REGION, NULL_RTX)))
2514             for (i = 0; i < XVECLEN (seq, 0); i++)
2515               {
2516                 rtx insn = XVECEXP (seq, 0, i);
2517                 if (GET_CODE (insn) == CALL_INSN
2518                     || (flag_non_call_exceptions
2519                         && may_trap_p (PATTERN (insn))))
2520                   REG_NOTES (insn)
2521                     = gen_rtx_EXPR_LIST (REG_EH_REGION, XEXP (eh_note, 0),
2522                                          REG_NOTES (insn));
2523               }
2524
2525           /* If there are LABELS inside the split insns increment the
2526              usage count so we don't delete the label.  */
2527           if (GET_CODE (trial) == INSN)
2528             for (i = XVECLEN (seq, 0) - 1; i >= 0; i--)
2529               if (GET_CODE (XVECEXP (seq, 0, i)) == INSN)
2530                 mark_label_nuses (PATTERN (XVECEXP (seq, 0, i)));
2531
2532           tem = emit_insn_after (seq, before);
2533
2534           delete_insn (trial);
2535           if (has_barrier)
2536             emit_barrier_after (tem);
2537
2538           /* Recursively call try_split for each new insn created; by the
2539              time control returns here that insn will be fully split, so
2540              set LAST and continue from the insn after the one returned.
2541              We can't use next_active_insn here since AFTER may be a note.
2542              Ignore deleted insns, which can be occur if not optimizing.  */
2543           for (tem = NEXT_INSN (before); tem != after; tem = NEXT_INSN (tem))
2544             if (! INSN_DELETED_P (tem) && INSN_P (tem))
2545               tem = try_split (PATTERN (tem), tem, 1);
2546         }
2547       /* Avoid infinite loop if the result matches the original pattern.  */
2548       else if (rtx_equal_p (seq, pat))
2549         return trial;
2550       else
2551         {
2552           PATTERN (trial) = seq;
2553           INSN_CODE (trial) = -1;
2554           try_split (seq, trial, last);
2555         }
2556
2557       /* Return either the first or the last insn, depending on which was
2558          requested.  */
2559       return last
2560                 ? (after ? prev_active_insn (after) : last_insn)
2561                 : next_active_insn (before);
2562     }
2563
2564   return trial;
2565 }
2566 \f
2567 /* Make and return an INSN rtx, initializing all its slots.
2568    Store PATTERN in the pattern slots.  */
2569
2570 rtx
2571 make_insn_raw (pattern)
2572      rtx pattern;
2573 {
2574   register rtx insn;
2575
2576   insn = rtx_alloc (INSN);
2577
2578   INSN_UID (insn) = cur_insn_uid++;
2579   PATTERN (insn) = pattern;
2580   INSN_CODE (insn) = -1;
2581   LOG_LINKS (insn) = NULL;
2582   REG_NOTES (insn) = NULL;
2583
2584 #ifdef ENABLE_RTL_CHECKING
2585   if (insn
2586       && INSN_P (insn)
2587       && (returnjump_p (insn)
2588           || (GET_CODE (insn) == SET
2589               && SET_DEST (insn) == pc_rtx)))
2590     {
2591       warning ("ICE: emit_insn used where emit_jump_insn needed:\n");
2592       debug_rtx (insn);
2593     }
2594 #endif
2595
2596   return insn;
2597 }
2598
2599 /* Like `make_insn' but make a JUMP_INSN instead of an insn.  */
2600
2601 static rtx
2602 make_jump_insn_raw (pattern)
2603      rtx pattern;
2604 {
2605   register rtx insn;
2606
2607   insn = rtx_alloc (JUMP_INSN);
2608   INSN_UID (insn) = cur_insn_uid++;
2609
2610   PATTERN (insn) = pattern;
2611   INSN_CODE (insn) = -1;
2612   LOG_LINKS (insn) = NULL;
2613   REG_NOTES (insn) = NULL;
2614   JUMP_LABEL (insn) = NULL;
2615
2616   return insn;
2617 }
2618
2619 /* Like `make_insn' but make a CALL_INSN instead of an insn.  */
2620
2621 static rtx
2622 make_call_insn_raw (pattern)
2623      rtx pattern;
2624 {
2625   register rtx insn;
2626
2627   insn = rtx_alloc (CALL_INSN);
2628   INSN_UID (insn) = cur_insn_uid++;
2629
2630   PATTERN (insn) = pattern;
2631   INSN_CODE (insn) = -1;
2632   LOG_LINKS (insn) = NULL;
2633   REG_NOTES (insn) = NULL;
2634   CALL_INSN_FUNCTION_USAGE (insn) = NULL;
2635
2636   return insn;
2637 }
2638 \f
2639 /* Add INSN to the end of the doubly-linked list.
2640    INSN may be an INSN, JUMP_INSN, CALL_INSN, CODE_LABEL, BARRIER or NOTE.  */
2641
2642 void
2643 add_insn (insn)
2644      register rtx insn;
2645 {
2646   PREV_INSN (insn) = last_insn;
2647   NEXT_INSN (insn) = 0;
2648
2649   if (NULL != last_insn)
2650     NEXT_INSN (last_insn) = insn;
2651
2652   if (NULL == first_insn)
2653     first_insn = insn;
2654
2655   last_insn = insn;
2656 }
2657
2658 /* Add INSN into the doubly-linked list after insn AFTER.  This and
2659    the next should be the only functions called to insert an insn once
2660    delay slots have been filled since only they know how to update a
2661    SEQUENCE.  */
2662
2663 void
2664 add_insn_after (insn, after)
2665      rtx insn, after;
2666 {
2667   rtx next = NEXT_INSN (after);
2668
2669   if (optimize && INSN_DELETED_P (after))
2670     abort ();
2671
2672   NEXT_INSN (insn) = next;
2673   PREV_INSN (insn) = after;
2674
2675   if (next)
2676     {
2677       PREV_INSN (next) = insn;
2678       if (GET_CODE (next) == INSN && GET_CODE (PATTERN (next)) == SEQUENCE)
2679         PREV_INSN (XVECEXP (PATTERN (next), 0, 0)) = insn;
2680     }
2681   else if (last_insn == after)
2682     last_insn = insn;
2683   else
2684     {
2685       struct sequence_stack *stack = seq_stack;
2686       /* Scan all pending sequences too.  */
2687       for (; stack; stack = stack->next)
2688         if (after == stack->last)
2689           {
2690             stack->last = insn;
2691             break;
2692           }
2693
2694       if (stack == 0)
2695         abort ();
2696     }
2697
2698   NEXT_INSN (after) = insn;
2699   if (GET_CODE (after) == INSN && GET_CODE (PATTERN (after)) == SEQUENCE)
2700     {
2701       rtx sequence = PATTERN (after);
2702       NEXT_INSN (XVECEXP (sequence, 0, XVECLEN (sequence, 0) - 1)) = insn;
2703     }
2704 }
2705
2706 /* Add INSN into the doubly-linked list before insn BEFORE.  This and
2707    the previous should be the only functions called to insert an insn once
2708    delay slots have been filled since only they know how to update a
2709    SEQUENCE.  */
2710
2711 void
2712 add_insn_before (insn, before)
2713      rtx insn, before;
2714 {
2715   rtx prev = PREV_INSN (before);
2716
2717   if (optimize && INSN_DELETED_P (before))
2718     abort ();
2719
2720   PREV_INSN (insn) = prev;
2721   NEXT_INSN (insn) = before;
2722
2723   if (prev)
2724     {
2725       NEXT_INSN (prev) = insn;
2726       if (GET_CODE (prev) == INSN && GET_CODE (PATTERN (prev)) == SEQUENCE)
2727         {
2728           rtx sequence = PATTERN (prev);
2729           NEXT_INSN (XVECEXP (sequence, 0, XVECLEN (sequence, 0) - 1)) = insn;
2730         }
2731     }
2732   else if (first_insn == before)
2733     first_insn = insn;
2734   else
2735     {
2736       struct sequence_stack *stack = seq_stack;
2737       /* Scan all pending sequences too.  */
2738       for (; stack; stack = stack->next)
2739         if (before == stack->first)
2740           {
2741             stack->first = insn;
2742             break;
2743           }
2744
2745       if (stack == 0)
2746         abort ();
2747     }
2748
2749   PREV_INSN (before) = insn;
2750   if (GET_CODE (before) == INSN && GET_CODE (PATTERN (before)) == SEQUENCE)
2751     PREV_INSN (XVECEXP (PATTERN (before), 0, 0)) = insn;
2752 }
2753
2754 /* Remove an insn from its doubly-linked list.  This function knows how
2755    to handle sequences.  */
2756 void
2757 remove_insn (insn)
2758      rtx insn;
2759 {
2760   rtx next = NEXT_INSN (insn);
2761   rtx prev = PREV_INSN (insn);
2762   if (prev)
2763     {
2764       NEXT_INSN (prev) = next;
2765       if (GET_CODE (prev) == INSN && GET_CODE (PATTERN (prev)) == SEQUENCE)
2766         {
2767           rtx sequence = PATTERN (prev);
2768           NEXT_INSN (XVECEXP (sequence, 0, XVECLEN (sequence, 0) - 1)) = next;
2769         }
2770     }
2771   else if (first_insn == insn)
2772     first_insn = next;
2773   else
2774     {
2775       struct sequence_stack *stack = seq_stack;
2776       /* Scan all pending sequences too.  */
2777       for (; stack; stack = stack->next)
2778         if (insn == stack->first)
2779           {
2780             stack->first = next;
2781             break;
2782           }
2783
2784       if (stack == 0)
2785         abort ();
2786     }
2787
2788   if (next)
2789     {
2790       PREV_INSN (next) = prev;
2791       if (GET_CODE (next) == INSN && GET_CODE (PATTERN (next)) == SEQUENCE)
2792         PREV_INSN (XVECEXP (PATTERN (next), 0, 0)) = prev;
2793     }
2794   else if (last_insn == insn)
2795     last_insn = prev;
2796   else
2797     {
2798       struct sequence_stack *stack = seq_stack;
2799       /* Scan all pending sequences too.  */
2800       for (; stack; stack = stack->next)
2801         if (insn == stack->last)
2802           {
2803             stack->last = prev;
2804             break;
2805           }
2806
2807       if (stack == 0)
2808         abort ();
2809     }
2810 }
2811
2812 /* Delete all insns made since FROM.
2813    FROM becomes the new last instruction.  */
2814
2815 void
2816 delete_insns_since (from)
2817      rtx from;
2818 {
2819   if (from == 0)
2820     first_insn = 0;
2821   else
2822     NEXT_INSN (from) = 0;
2823   last_insn = from;
2824 }
2825
2826 /* This function is deprecated, please use sequences instead.
2827
2828    Move a consecutive bunch of insns to a different place in the chain.
2829    The insns to be moved are those between FROM and TO.
2830    They are moved to a new position after the insn AFTER.
2831    AFTER must not be FROM or TO or any insn in between.
2832
2833    This function does not know about SEQUENCEs and hence should not be
2834    called after delay-slot filling has been done.  */
2835
2836 void
2837 reorder_insns (from, to, after)
2838      rtx from, to, after;
2839 {
2840   /* Splice this bunch out of where it is now.  */
2841   if (PREV_INSN (from))
2842     NEXT_INSN (PREV_INSN (from)) = NEXT_INSN (to);
2843   if (NEXT_INSN (to))
2844     PREV_INSN (NEXT_INSN (to)) = PREV_INSN (from);
2845   if (last_insn == to)
2846     last_insn = PREV_INSN (from);
2847   if (first_insn == from)
2848     first_insn = NEXT_INSN (to);
2849
2850   /* Make the new neighbors point to it and it to them.  */
2851   if (NEXT_INSN (after))
2852     PREV_INSN (NEXT_INSN (after)) = to;
2853
2854   NEXT_INSN (to) = NEXT_INSN (after);
2855   PREV_INSN (from) = after;
2856   NEXT_INSN (after) = from;
2857   if (after == last_insn)
2858     last_insn = to;
2859 }
2860
2861 /* Return the line note insn preceding INSN.  */
2862
2863 static rtx
2864 find_line_note (insn)
2865      rtx insn;
2866 {
2867   if (no_line_numbers)
2868     return 0;
2869
2870   for (; insn; insn = PREV_INSN (insn))
2871     if (GET_CODE (insn) == NOTE
2872         && NOTE_LINE_NUMBER (insn) >= 0)
2873       break;
2874
2875   return insn;
2876 }
2877
2878 /* Like reorder_insns, but inserts line notes to preserve the line numbers
2879    of the moved insns when debugging.  This may insert a note between AFTER
2880    and FROM, and another one after TO.  */
2881
2882 void
2883 reorder_insns_with_line_notes (from, to, after)
2884      rtx from, to, after;
2885 {
2886   rtx from_line = find_line_note (from);
2887   rtx after_line = find_line_note (after);
2888
2889   reorder_insns (from, to, after);
2890
2891   if (from_line == after_line)
2892     return;
2893
2894   if (from_line)
2895     emit_line_note_after (NOTE_SOURCE_FILE (from_line),
2896                           NOTE_LINE_NUMBER (from_line),
2897                           after);
2898   if (after_line)
2899     emit_line_note_after (NOTE_SOURCE_FILE (after_line),
2900                           NOTE_LINE_NUMBER (after_line),
2901                           to);
2902 }
2903
2904 /* Remove unnecessary notes from the instruction stream.  */
2905
2906 void
2907 remove_unnecessary_notes ()
2908 {
2909   rtx block_stack = NULL_RTX;
2910   rtx eh_stack = NULL_RTX;
2911   rtx insn;
2912   rtx next;
2913   rtx tmp;
2914
2915   /* We must not remove the first instruction in the function because
2916      the compiler depends on the first instruction being a note.  */
2917   for (insn = NEXT_INSN (get_insns ()); insn; insn = next)
2918     {
2919       /* Remember what's next.  */
2920       next = NEXT_INSN (insn);
2921
2922       /* We're only interested in notes.  */
2923       if (GET_CODE (insn) != NOTE)
2924         continue;
2925
2926       switch (NOTE_LINE_NUMBER (insn))
2927         {
2928         case NOTE_INSN_DELETED:
2929           remove_insn (insn);
2930           break;
2931
2932         case NOTE_INSN_EH_REGION_BEG:
2933           eh_stack = alloc_INSN_LIST (insn, eh_stack);
2934           break;
2935
2936         case NOTE_INSN_EH_REGION_END:
2937           /* Too many end notes.  */
2938           if (eh_stack == NULL_RTX)
2939             abort ();
2940           /* Mismatched nesting.  */
2941           if (NOTE_EH_HANDLER (XEXP (eh_stack, 0)) != NOTE_EH_HANDLER (insn))
2942             abort ();
2943           tmp = eh_stack;
2944           eh_stack = XEXP (eh_stack, 1);
2945           free_INSN_LIST_node (tmp);
2946           break;
2947
2948         case NOTE_INSN_BLOCK_BEG:
2949           /* By now, all notes indicating lexical blocks should have
2950              NOTE_BLOCK filled in.  */
2951           if (NOTE_BLOCK (insn) == NULL_TREE)
2952             abort ();
2953           block_stack = alloc_INSN_LIST (insn, block_stack);
2954           break;
2955
2956         case NOTE_INSN_BLOCK_END:
2957           /* Too many end notes.  */
2958           if (block_stack == NULL_RTX)
2959             abort ();
2960           /* Mismatched nesting.  */
2961           if (NOTE_BLOCK (XEXP (block_stack, 0)) != NOTE_BLOCK (insn))
2962             abort ();
2963           tmp = block_stack;
2964           block_stack = XEXP (block_stack, 1);
2965           free_INSN_LIST_node (tmp);
2966
2967           /* Scan back to see if there are any non-note instructions
2968              between INSN and the beginning of this block.  If not,
2969              then there is no PC range in the generated code that will
2970              actually be in this block, so there's no point in
2971              remembering the existence of the block.  */
2972           for (tmp = PREV_INSN (insn); tmp ; tmp = PREV_INSN (tmp))
2973             {
2974               /* This block contains a real instruction.  Note that we
2975                  don't include labels; if the only thing in the block
2976                  is a label, then there are still no PC values that
2977                  lie within the block.  */
2978               if (INSN_P (tmp))
2979                 break;
2980
2981               /* We're only interested in NOTEs.  */
2982               if (GET_CODE (tmp) != NOTE)
2983                 continue;
2984
2985               if (NOTE_LINE_NUMBER (tmp) == NOTE_INSN_BLOCK_BEG)
2986                 {
2987                   /* We just verified that this BLOCK matches us
2988                      with the block_stack check above.  */
2989                   if (debug_ignore_block (NOTE_BLOCK (insn)))
2990                     {
2991                       remove_insn (tmp);
2992                       remove_insn (insn);
2993                     }
2994                   break;
2995                 }
2996               else if (NOTE_LINE_NUMBER (tmp) == NOTE_INSN_BLOCK_END)
2997                 /* There's a nested block.  We need to leave the
2998                    current block in place since otherwise the debugger
2999                    wouldn't be able to show symbols from our block in
3000                    the nested block.  */
3001                 break;
3002             }
3003         }
3004     }
3005
3006   /* Too many begin notes.  */
3007   if (block_stack || eh_stack)
3008     abort ();
3009 }
3010
3011 \f
3012 /* Emit an insn of given code and pattern
3013    at a specified place within the doubly-linked list.  */
3014
3015 /* Make an instruction with body PATTERN
3016    and output it before the instruction BEFORE.  */
3017
3018 rtx
3019 emit_insn_before (pattern, before)
3020      register rtx pattern, before;
3021 {
3022   register rtx insn = before;
3023
3024   if (GET_CODE (pattern) == SEQUENCE)
3025     {
3026       register int i;
3027
3028       for (i = 0; i < XVECLEN (pattern, 0); i++)
3029         {
3030           insn = XVECEXP (pattern, 0, i);
3031           add_insn_before (insn, before);
3032         }
3033     }
3034   else
3035     {
3036       insn = make_insn_raw (pattern);
3037       add_insn_before (insn, before);
3038     }
3039
3040   return insn;
3041 }
3042
3043 /* Similar to emit_insn_before, but update basic block boundaries as well.  */
3044
3045 rtx
3046 emit_block_insn_before (pattern, before, block)
3047      rtx pattern, before;
3048      basic_block block;
3049 {
3050   rtx prev = PREV_INSN (before);
3051   rtx r = emit_insn_before (pattern, before);
3052   if (block && block->head == before)
3053     block->head = NEXT_INSN (prev);
3054   return r;
3055 }
3056
3057 /* Make an instruction with body PATTERN and code JUMP_INSN
3058    and output it before the instruction BEFORE.  */
3059
3060 rtx
3061 emit_jump_insn_before (pattern, before)
3062      register rtx pattern, before;
3063 {
3064   register rtx insn;
3065
3066   if (GET_CODE (pattern) == SEQUENCE)
3067     insn = emit_insn_before (pattern, before);
3068   else
3069     {
3070       insn = make_jump_insn_raw (pattern);
3071       add_insn_before (insn, before);
3072     }
3073
3074   return insn;
3075 }
3076
3077 /* Make an instruction with body PATTERN and code CALL_INSN
3078    and output it before the instruction BEFORE.  */
3079
3080 rtx
3081 emit_call_insn_before (pattern, before)
3082      register rtx pattern, before;
3083 {
3084   register rtx insn;
3085
3086   if (GET_CODE (pattern) == SEQUENCE)
3087     insn = emit_insn_before (pattern, before);
3088   else
3089     {
3090       insn = make_call_insn_raw (pattern);
3091       add_insn_before (insn, before);
3092       PUT_CODE (insn, CALL_INSN);
3093     }
3094
3095   return insn;
3096 }
3097
3098 /* Make an insn of code BARRIER
3099    and output it before the insn BEFORE.  */
3100
3101 rtx
3102 emit_barrier_before (before)
3103      register rtx before;
3104 {
3105   register rtx insn = rtx_alloc (BARRIER);
3106
3107   INSN_UID (insn) = cur_insn_uid++;
3108
3109   add_insn_before (insn, before);
3110   return insn;
3111 }
3112
3113 /* Emit the label LABEL before the insn BEFORE.  */
3114
3115 rtx
3116 emit_label_before (label, before)
3117      rtx label, before;
3118 {
3119   /* This can be called twice for the same label as a result of the
3120      confusion that follows a syntax error!  So make it harmless.  */
3121   if (INSN_UID (label) == 0)
3122     {
3123       INSN_UID (label) = cur_insn_uid++;
3124       add_insn_before (label, before);
3125     }
3126
3127   return label;
3128 }
3129
3130 /* Emit a note of subtype SUBTYPE before the insn BEFORE.  */
3131
3132 rtx
3133 emit_note_before (subtype, before)
3134      int subtype;
3135      rtx before;
3136 {
3137   register rtx note = rtx_alloc (NOTE);
3138   INSN_UID (note) = cur_insn_uid++;
3139   NOTE_SOURCE_FILE (note) = 0;
3140   NOTE_LINE_NUMBER (note) = subtype;
3141
3142   add_insn_before (note, before);
3143   return note;
3144 }
3145 \f
3146 /* Make an insn of code INSN with body PATTERN
3147    and output it after the insn AFTER.  */
3148
3149 rtx
3150 emit_insn_after (pattern, after)
3151      register rtx pattern, after;
3152 {
3153   register rtx insn = after;
3154
3155   if (GET_CODE (pattern) == SEQUENCE)
3156     {
3157       register int i;
3158
3159       for (i = 0; i < XVECLEN (pattern, 0); i++)
3160         {
3161           insn = XVECEXP (pattern, 0, i);
3162           add_insn_after (insn, after);
3163           after = insn;
3164         }
3165     }
3166   else
3167     {
3168       insn = make_insn_raw (pattern);
3169       add_insn_after (insn, after);
3170     }
3171
3172   return insn;
3173 }
3174
3175 /* Similar to emit_insn_after, except that line notes are to be inserted so
3176    as to act as if this insn were at FROM.  */
3177
3178 void
3179 emit_insn_after_with_line_notes (pattern, after, from)
3180      rtx pattern, after, from;
3181 {
3182   rtx from_line = find_line_note (from);
3183   rtx after_line = find_line_note (after);
3184   rtx insn = emit_insn_after (pattern, after);
3185
3186   if (from_line)
3187     emit_line_note_after (NOTE_SOURCE_FILE (from_line),
3188                           NOTE_LINE_NUMBER (from_line),
3189                           after);
3190
3191   if (after_line)
3192     emit_line_note_after (NOTE_SOURCE_FILE (after_line),
3193                           NOTE_LINE_NUMBER (after_line),
3194                           insn);
3195 }
3196
3197 /* Similar to emit_insn_after, but update basic block boundaries as well.  */
3198
3199 rtx
3200 emit_block_insn_after (pattern, after, block)
3201      rtx pattern, after;
3202      basic_block block;
3203 {
3204   rtx r = emit_insn_after (pattern, after);
3205   if (block && block->end == after)
3206     block->end = r;
3207   return r;
3208 }
3209
3210 /* Make an insn of code JUMP_INSN with body PATTERN
3211    and output it after the insn AFTER.  */
3212
3213 rtx
3214 emit_jump_insn_after (pattern, after)
3215      register rtx pattern, after;
3216 {
3217   register rtx insn;
3218
3219   if (GET_CODE (pattern) == SEQUENCE)
3220     insn = emit_insn_after (pattern, after);
3221   else
3222     {
3223       insn = make_jump_insn_raw (pattern);
3224       add_insn_after (insn, after);
3225     }
3226
3227   return insn;
3228 }
3229
3230 /* Make an insn of code BARRIER
3231    and output it after the insn AFTER.  */
3232
3233 rtx
3234 emit_barrier_after (after)
3235      register rtx after;
3236 {
3237   register rtx insn = rtx_alloc (BARRIER);
3238
3239   INSN_UID (insn) = cur_insn_uid++;
3240
3241   add_insn_after (insn, after);
3242   return insn;
3243 }
3244
3245 /* Emit the label LABEL after the insn AFTER.  */
3246
3247 rtx
3248 emit_label_after (label, after)
3249      rtx label, after;
3250 {
3251   /* This can be called twice for the same label
3252      as a result of the confusion that follows a syntax error!
3253      So make it harmless.  */
3254   if (INSN_UID (label) == 0)
3255     {
3256       INSN_UID (label) = cur_insn_uid++;
3257       add_insn_after (label, after);
3258     }
3259
3260   return label;
3261 }
3262
3263 /* Emit a note of subtype SUBTYPE after the insn AFTER.  */
3264
3265 rtx
3266 emit_note_after (subtype, after)
3267      int subtype;
3268      rtx after;
3269 {
3270   register rtx note = rtx_alloc (NOTE);
3271   INSN_UID (note) = cur_insn_uid++;
3272   NOTE_SOURCE_FILE (note) = 0;
3273   NOTE_LINE_NUMBER (note) = subtype;
3274   add_insn_after (note, after);
3275   return note;
3276 }
3277
3278 /* Emit a line note for FILE and LINE after the insn AFTER.  */
3279
3280 rtx
3281 emit_line_note_after (file, line, after)
3282      const char *file;
3283      int line;
3284      rtx after;
3285 {
3286   register rtx note;
3287
3288   if (no_line_numbers && line > 0)
3289     {
3290       cur_insn_uid++;
3291       return 0;
3292     }
3293
3294   note  = rtx_alloc (NOTE);
3295   INSN_UID (note) = cur_insn_uid++;
3296   NOTE_SOURCE_FILE (note) = file;
3297   NOTE_LINE_NUMBER (note) = line;
3298   add_insn_after (note, after);
3299   return note;
3300 }
3301 \f
3302 /* Make an insn of code INSN with pattern PATTERN
3303    and add it to the end of the doubly-linked list.
3304    If PATTERN is a SEQUENCE, take the elements of it
3305    and emit an insn for each element.
3306
3307    Returns the last insn emitted.  */
3308
3309 rtx
3310 emit_insn (pattern)
3311      rtx pattern;
3312 {
3313   rtx insn = last_insn;
3314
3315   if (GET_CODE (pattern) == SEQUENCE)
3316     {
3317       register int i;
3318
3319       for (i = 0; i < XVECLEN (pattern, 0); i++)
3320         {
3321           insn = XVECEXP (pattern, 0, i);
3322           add_insn (insn);
3323         }
3324     }
3325   else
3326     {
3327       insn = make_insn_raw (pattern);
3328       add_insn (insn);
3329     }
3330
3331   return insn;
3332 }
3333
3334 /* Emit the insns in a chain starting with INSN.
3335    Return the last insn emitted.  */
3336
3337 rtx
3338 emit_insns (insn)
3339      rtx insn;
3340 {
3341   rtx last = 0;
3342
3343   while (insn)
3344     {
3345       rtx next = NEXT_INSN (insn);
3346       add_insn (insn);
3347       last = insn;
3348       insn = next;
3349     }
3350
3351   return last;
3352 }
3353
3354 /* Emit the insns in a chain starting with INSN and place them in front of
3355    the insn BEFORE.  Return the last insn emitted.  */
3356
3357 rtx
3358 emit_insns_before (insn, before)
3359      rtx insn;
3360      rtx before;
3361 {
3362   rtx last = 0;
3363
3364   while (insn)
3365     {
3366       rtx next = NEXT_INSN (insn);
3367       add_insn_before (insn, before);
3368       last = insn;
3369       insn = next;
3370     }
3371
3372   return last;
3373 }
3374
3375 /* Emit the insns in a chain starting with FIRST and place them in back of
3376    the insn AFTER.  Return the last insn emitted.  */
3377
3378 rtx
3379 emit_insns_after (first, after)
3380      register rtx first;
3381      register rtx after;
3382 {
3383   register rtx last;
3384   register rtx after_after;
3385
3386   if (!after)
3387     abort ();
3388
3389   if (!first)
3390     return first;
3391
3392   for (last = first; NEXT_INSN (last); last = NEXT_INSN (last))
3393     continue;
3394
3395   after_after = NEXT_INSN (after);
3396
3397   NEXT_INSN (after) = first;
3398   PREV_INSN (first) = after;
3399   NEXT_INSN (last) = after_after;
3400   if (after_after)
3401     PREV_INSN (after_after) = last;
3402
3403   if (after == last_insn)
3404     last_insn = last;
3405   return last;
3406 }
3407
3408 /* Make an insn of code JUMP_INSN with pattern PATTERN
3409    and add it to the end of the doubly-linked list.  */
3410
3411 rtx
3412 emit_jump_insn (pattern)
3413      rtx pattern;
3414 {
3415   if (GET_CODE (pattern) == SEQUENCE)
3416     return emit_insn (pattern);
3417   else
3418     {
3419       register rtx insn = make_jump_insn_raw (pattern);
3420       add_insn (insn);
3421       return insn;
3422     }
3423 }
3424
3425 /* Make an insn of code CALL_INSN with pattern PATTERN
3426    and add it to the end of the doubly-linked list.  */
3427
3428 rtx
3429 emit_call_insn (pattern)
3430      rtx pattern;
3431 {
3432   if (GET_CODE (pattern) == SEQUENCE)
3433     return emit_insn (pattern);
3434   else
3435     {
3436       register rtx insn = make_call_insn_raw (pattern);
3437       add_insn (insn);
3438       PUT_CODE (insn, CALL_INSN);
3439       return insn;
3440     }
3441 }
3442
3443 /* Add the label LABEL to the end of the doubly-linked list.  */
3444
3445 rtx
3446 emit_label (label)
3447      rtx label;
3448 {
3449   /* This can be called twice for the same label
3450      as a result of the confusion that follows a syntax error!
3451      So make it harmless.  */
3452   if (INSN_UID (label) == 0)
3453     {
3454       INSN_UID (label) = cur_insn_uid++;
3455       add_insn (label);
3456     }
3457   return label;
3458 }
3459
3460 /* Make an insn of code BARRIER
3461    and add it to the end of the doubly-linked list.  */
3462
3463 rtx
3464 emit_barrier ()
3465 {
3466   register rtx barrier = rtx_alloc (BARRIER);
3467   INSN_UID (barrier) = cur_insn_uid++;
3468   add_insn (barrier);
3469   return barrier;
3470 }
3471
3472 /* Make an insn of code NOTE
3473    with data-fields specified by FILE and LINE
3474    and add it to the end of the doubly-linked list,
3475    but only if line-numbers are desired for debugging info.  */
3476
3477 rtx
3478 emit_line_note (file, line)
3479      const char *file;
3480      int line;
3481 {
3482   set_file_and_line_for_stmt (file, line);
3483
3484 #if 0
3485   if (no_line_numbers)
3486     return 0;
3487 #endif
3488
3489   return emit_note (file, line);
3490 }
3491
3492 /* Make an insn of code NOTE
3493    with data-fields specified by FILE and LINE
3494    and add it to the end of the doubly-linked list.
3495    If it is a line-number NOTE, omit it if it matches the previous one.  */
3496
3497 rtx
3498 emit_note (file, line)
3499      const char *file;
3500      int line;
3501 {
3502   register rtx note;
3503
3504   if (line > 0)
3505     {
3506       if (file && last_filename && !strcmp (file, last_filename)
3507           && line == last_linenum)
3508         return 0;
3509       last_filename = file;
3510       last_linenum = line;
3511     }
3512
3513   if (no_line_numbers && line > 0)
3514     {
3515       cur_insn_uid++;
3516       return 0;
3517     }
3518
3519   note = rtx_alloc (NOTE);
3520   INSN_UID (note) = cur_insn_uid++;
3521   NOTE_SOURCE_FILE (note) = file;
3522   NOTE_LINE_NUMBER (note) = line;
3523   add_insn (note);
3524   return note;
3525 }
3526
3527 /* Emit a NOTE, and don't omit it even if LINE is the previous note.  */
3528
3529 rtx
3530 emit_line_note_force (file, line)
3531      const char *file;
3532      int line;
3533 {
3534   last_linenum = -1;
3535   return emit_line_note (file, line);
3536 }
3537
3538 /* Cause next statement to emit a line note even if the line number
3539    has not changed.  This is used at the beginning of a function.  */
3540
3541 void
3542 force_next_line_note ()
3543 {
3544   last_linenum = -1;
3545 }
3546
3547 /* Place a note of KIND on insn INSN with DATUM as the datum. If a
3548    note of this type already exists, remove it first. */
3549
3550 void
3551 set_unique_reg_note (insn, kind, datum)
3552      rtx insn;
3553      enum reg_note kind;
3554      rtx datum;
3555 {
3556   rtx note = find_reg_note (insn, kind, NULL_RTX);
3557
3558   /* First remove the note if there already is one.  */
3559   if (note)
3560     remove_note (insn, note);
3561
3562   REG_NOTES (insn) = gen_rtx_EXPR_LIST (kind, datum, REG_NOTES (insn));
3563 }
3564 \f
3565 /* Return an indication of which type of insn should have X as a body.
3566    The value is CODE_LABEL, INSN, CALL_INSN or JUMP_INSN.  */
3567
3568 enum rtx_code
3569 classify_insn (x)
3570      rtx x;
3571 {
3572   if (GET_CODE (x) == CODE_LABEL)
3573     return CODE_LABEL;
3574   if (GET_CODE (x) == CALL)
3575     return CALL_INSN;
3576   if (GET_CODE (x) == RETURN)
3577     return JUMP_INSN;
3578   if (GET_CODE (x) == SET)
3579     {
3580       if (SET_DEST (x) == pc_rtx)
3581         return JUMP_INSN;
3582       else if (GET_CODE (SET_SRC (x)) == CALL)
3583         return CALL_INSN;
3584       else
3585         return INSN;
3586     }
3587   if (GET_CODE (x) == PARALLEL)
3588     {
3589       register int j;
3590       for (j = XVECLEN (x, 0) - 1; j >= 0; j--)
3591         if (GET_CODE (XVECEXP (x, 0, j)) == CALL)
3592           return CALL_INSN;
3593         else if (GET_CODE (XVECEXP (x, 0, j)) == SET
3594                  && SET_DEST (XVECEXP (x, 0, j)) == pc_rtx)
3595           return JUMP_INSN;
3596         else if (GET_CODE (XVECEXP (x, 0, j)) == SET
3597                  && GET_CODE (SET_SRC (XVECEXP (x, 0, j))) == CALL)
3598           return CALL_INSN;
3599     }
3600   return INSN;
3601 }
3602
3603 /* Emit the rtl pattern X as an appropriate kind of insn.
3604    If X is a label, it is simply added into the insn chain.  */
3605
3606 rtx
3607 emit (x)
3608      rtx x;
3609 {
3610   enum rtx_code code = classify_insn (x);
3611
3612   if (code == CODE_LABEL)
3613     return emit_label (x);
3614   else if (code == INSN)
3615     return emit_insn (x);
3616   else if (code == JUMP_INSN)
3617     {
3618       register rtx insn = emit_jump_insn (x);
3619       if (any_uncondjump_p (insn) || GET_CODE (x) == RETURN)
3620         return emit_barrier ();
3621       return insn;
3622     }
3623   else if (code == CALL_INSN)
3624     return emit_call_insn (x);
3625   else
3626     abort ();
3627 }
3628 \f
3629 /* Begin emitting insns to a sequence which can be packaged in an
3630    RTL_EXPR.  If this sequence will contain something that might cause
3631    the compiler to pop arguments to function calls (because those
3632    pops have previously been deferred; see INHIBIT_DEFER_POP for more
3633    details), use do_pending_stack_adjust before calling this function.
3634    That will ensure that the deferred pops are not accidentally
3635    emitted in the middle of this sequence.  */
3636
3637 void
3638 start_sequence ()
3639 {
3640   struct sequence_stack *tem;
3641
3642   tem = (struct sequence_stack *) xmalloc (sizeof (struct sequence_stack));
3643
3644   tem->next = seq_stack;
3645   tem->first = first_insn;
3646   tem->last = last_insn;
3647   tem->sequence_rtl_expr = seq_rtl_expr;
3648
3649   seq_stack = tem;
3650
3651   first_insn = 0;
3652   last_insn = 0;
3653 }
3654
3655 /* Similarly, but indicate that this sequence will be placed in T, an
3656    RTL_EXPR.  See the documentation for start_sequence for more
3657    information about how to use this function.  */
3658
3659 void
3660 start_sequence_for_rtl_expr (t)
3661      tree t;
3662 {
3663   start_sequence ();
3664
3665   seq_rtl_expr = t;
3666 }
3667
3668 /* Set up the insn chain starting with FIRST as the current sequence,
3669    saving the previously current one.  See the documentation for
3670    start_sequence for more information about how to use this function.  */
3671
3672 void
3673 push_to_sequence (first)
3674      rtx first;
3675 {
3676   rtx last;
3677
3678   start_sequence ();
3679
3680   for (last = first; last && NEXT_INSN (last); last = NEXT_INSN (last));
3681
3682   first_insn = first;
3683   last_insn = last;
3684 }
3685
3686 /* Set up the insn chain from a chain stort in FIRST to LAST.  */
3687
3688 void
3689 push_to_full_sequence (first, last)
3690      rtx first, last;
3691 {
3692   start_sequence ();
3693   first_insn = first;
3694   last_insn = last;
3695   /* We really should have the end of the insn chain here.  */
3696   if (last && NEXT_INSN (last))
3697     abort ();
3698 }
3699
3700 /* Set up the outer-level insn chain
3701    as the current sequence, saving the previously current one.  */
3702
3703 void
3704 push_topmost_sequence ()
3705 {
3706   struct sequence_stack *stack, *top = NULL;
3707
3708   start_sequence ();
3709
3710   for (stack = seq_stack; stack; stack = stack->next)
3711     top = stack;
3712
3713   first_insn = top->first;
3714   last_insn = top->last;
3715   seq_rtl_expr = top->sequence_rtl_expr;
3716 }
3717
3718 /* After emitting to the outer-level insn chain, update the outer-level
3719    insn chain, and restore the previous saved state.  */
3720
3721 void
3722 pop_topmost_sequence ()
3723 {
3724   struct sequence_stack *stack, *top = NULL;
3725
3726   for (stack = seq_stack; stack; stack = stack->next)
3727     top = stack;
3728
3729   top->first = first_insn;
3730   top->last = last_insn;
3731   /* ??? Why don't we save seq_rtl_expr here?  */
3732
3733   end_sequence ();
3734 }
3735
3736 /* After emitting to a sequence, restore previous saved state.
3737
3738    To get the contents of the sequence just made, you must call
3739    `gen_sequence' *before* calling here.
3740
3741    If the compiler might have deferred popping arguments while
3742    generating this sequence, and this sequence will not be immediately
3743    inserted into the instruction stream, use do_pending_stack_adjust
3744    before calling gen_sequence.  That will ensure that the deferred
3745    pops are inserted into this sequence, and not into some random
3746    location in the instruction stream.  See INHIBIT_DEFER_POP for more
3747    information about deferred popping of arguments.  */
3748
3749 void
3750 end_sequence ()
3751 {
3752   struct sequence_stack *tem = seq_stack;
3753
3754   first_insn = tem->first;
3755   last_insn = tem->last;
3756   seq_rtl_expr = tem->sequence_rtl_expr;
3757   seq_stack = tem->next;
3758
3759   free (tem);
3760 }
3761
3762 /* This works like end_sequence, but records the old sequence in FIRST
3763    and LAST.  */
3764
3765 void
3766 end_full_sequence (first, last)
3767      rtx *first, *last;
3768 {
3769   *first = first_insn;
3770   *last = last_insn;
3771   end_sequence();
3772 }
3773
3774 /* Return 1 if currently emitting into a sequence.  */
3775
3776 int
3777 in_sequence_p ()
3778 {
3779   return seq_stack != 0;
3780 }
3781
3782 /* Generate a SEQUENCE rtx containing the insns already emitted
3783    to the current sequence.
3784
3785    This is how the gen_... function from a DEFINE_EXPAND
3786    constructs the SEQUENCE that it returns.  */
3787
3788 rtx
3789 gen_sequence ()
3790 {
3791   rtx result;
3792   rtx tem;
3793   int i;
3794   int len;
3795
3796   /* Count the insns in the chain.  */
3797   len = 0;
3798   for (tem = first_insn; tem; tem = NEXT_INSN (tem))
3799     len++;
3800
3801   /* If only one insn, return it rather than a SEQUENCE.
3802      (Now that we cache SEQUENCE expressions, it isn't worth special-casing
3803      the case of an empty list.)
3804      We only return the pattern of an insn if its code is INSN and it
3805      has no notes.  This ensures that no information gets lost.  */
3806   if (len == 1
3807       && ! RTX_FRAME_RELATED_P (first_insn)
3808       && GET_CODE (first_insn) == INSN
3809       /* Don't throw away any reg notes. */
3810       && REG_NOTES (first_insn) == 0)
3811     return PATTERN (first_insn);
3812
3813   result = gen_rtx_SEQUENCE (VOIDmode, rtvec_alloc (len));
3814
3815   for (i = 0, tem = first_insn; tem; tem = NEXT_INSN (tem), i++)
3816     XVECEXP (result, 0, i) = tem;
3817
3818   return result;
3819 }
3820 \f
3821 /* Put the various virtual registers into REGNO_REG_RTX.  */
3822
3823 void
3824 init_virtual_regs (es)
3825      struct emit_status *es;
3826 {
3827   rtx *ptr = es->x_regno_reg_rtx;
3828   ptr[VIRTUAL_INCOMING_ARGS_REGNUM] = virtual_incoming_args_rtx;
3829   ptr[VIRTUAL_STACK_VARS_REGNUM] = virtual_stack_vars_rtx;
3830   ptr[VIRTUAL_STACK_DYNAMIC_REGNUM] = virtual_stack_dynamic_rtx;
3831   ptr[VIRTUAL_OUTGOING_ARGS_REGNUM] = virtual_outgoing_args_rtx;
3832   ptr[VIRTUAL_CFA_REGNUM] = virtual_cfa_rtx;
3833 }
3834
3835 void
3836 clear_emit_caches ()
3837 {
3838   int i;
3839
3840   /* Clear the start_sequence/gen_sequence cache.  */
3841   for (i = 0; i < SEQUENCE_RESULT_SIZE; i++)
3842     sequence_result[i] = 0;
3843   free_insn = 0;
3844 }
3845 \f
3846 /* Used by copy_insn_1 to avoid copying SCRATCHes more than once.  */
3847 static rtx copy_insn_scratch_in[MAX_RECOG_OPERANDS];
3848 static rtx copy_insn_scratch_out[MAX_RECOG_OPERANDS];
3849 static int copy_insn_n_scratches;
3850
3851 /* When an insn is being copied by copy_insn_1, this is nonzero if we have
3852    copied an ASM_OPERANDS.
3853    In that case, it is the original input-operand vector.  */
3854 static rtvec orig_asm_operands_vector;
3855
3856 /* When an insn is being copied by copy_insn_1, this is nonzero if we have
3857    copied an ASM_OPERANDS.
3858    In that case, it is the copied input-operand vector.  */
3859 static rtvec copy_asm_operands_vector;
3860
3861 /* Likewise for the constraints vector.  */
3862 static rtvec orig_asm_constraints_vector;
3863 static rtvec copy_asm_constraints_vector;
3864
3865 /* Recursively create a new copy of an rtx for copy_insn.
3866    This function differs from copy_rtx in that it handles SCRATCHes and
3867    ASM_OPERANDs properly.
3868    Normally, this function is not used directly; use copy_insn as front end.
3869    However, you could first copy an insn pattern with copy_insn and then use
3870    this function afterwards to properly copy any REG_NOTEs containing
3871    SCRATCHes.  */
3872
3873 rtx
3874 copy_insn_1 (orig)
3875      register rtx orig;
3876 {
3877   register rtx copy;
3878   register int i, j;
3879   register RTX_CODE code;
3880   register const char *format_ptr;
3881
3882   code = GET_CODE (orig);
3883
3884   switch (code)
3885     {
3886     case REG:
3887     case QUEUED:
3888     case CONST_INT:
3889     case CONST_DOUBLE:
3890     case SYMBOL_REF:
3891     case CODE_LABEL:
3892     case PC:
3893     case CC0:
3894     case ADDRESSOF:
3895       return orig;
3896
3897     case SCRATCH:
3898       for (i = 0; i < copy_insn_n_scratches; i++)
3899         if (copy_insn_scratch_in[i] == orig)
3900           return copy_insn_scratch_out[i];
3901       break;
3902
3903     case CONST:
3904       /* CONST can be shared if it contains a SYMBOL_REF.  If it contains
3905          a LABEL_REF, it isn't sharable.  */
3906       if (GET_CODE (XEXP (orig, 0)) == PLUS
3907           && GET_CODE (XEXP (XEXP (orig, 0), 0)) == SYMBOL_REF
3908           && GET_CODE (XEXP (XEXP (orig, 0), 1)) == CONST_INT)
3909         return orig;
3910       break;
3911
3912       /* A MEM with a constant address is not sharable.  The problem is that
3913          the constant address may need to be reloaded.  If the mem is shared,
3914          then reloading one copy of this mem will cause all copies to appear
3915          to have been reloaded.  */
3916
3917     default:
3918       break;
3919     }
3920
3921   copy = rtx_alloc (code);
3922
3923   /* Copy the various flags, and other information.  We assume that
3924      all fields need copying, and then clear the fields that should
3925      not be copied.  That is the sensible default behavior, and forces
3926      us to explicitly document why we are *not* copying a flag.  */
3927   memcpy (copy, orig, sizeof (struct rtx_def) - sizeof (rtunion));
3928
3929   /* We do not copy the USED flag, which is used as a mark bit during
3930      walks over the RTL.  */
3931   copy->used = 0;
3932
3933   /* We do not copy JUMP, CALL, or FRAME_RELATED for INSNs.  */
3934   if (GET_RTX_CLASS (code) == 'i')
3935     {
3936       copy->jump = 0;
3937       copy->call = 0;
3938       copy->frame_related = 0;
3939     }
3940
3941   format_ptr = GET_RTX_FORMAT (GET_CODE (copy));
3942
3943   for (i = 0; i < GET_RTX_LENGTH (GET_CODE (copy)); i++)
3944     {
3945       copy->fld[i] = orig->fld[i];
3946       switch (*format_ptr++)
3947         {
3948         case 'e':
3949           if (XEXP (orig, i) != NULL)
3950             XEXP (copy, i) = copy_insn_1 (XEXP (orig, i));
3951           break;
3952
3953         case 'E':
3954         case 'V':
3955           if (XVEC (orig, i) == orig_asm_constraints_vector)
3956             XVEC (copy, i) = copy_asm_constraints_vector;
3957           else if (XVEC (orig, i) == orig_asm_operands_vector)
3958             XVEC (copy, i) = copy_asm_operands_vector;
3959           else if (XVEC (orig, i) != NULL)
3960             {
3961               XVEC (copy, i) = rtvec_alloc (XVECLEN (orig, i));
3962               for (j = 0; j < XVECLEN (copy, i); j++)
3963                 XVECEXP (copy, i, j) = copy_insn_1 (XVECEXP (orig, i, j));
3964             }
3965           break;
3966
3967         case 't':
3968         case 'w':
3969         case 'i':
3970         case 's':
3971         case 'S':
3972         case 'u':
3973         case '0':
3974           /* These are left unchanged.  */
3975           break;
3976
3977         default:
3978           abort ();
3979         }
3980     }
3981
3982   if (code == SCRATCH)
3983     {
3984       i = copy_insn_n_scratches++;
3985       if (i >= MAX_RECOG_OPERANDS)
3986         abort ();
3987       copy_insn_scratch_in[i] = orig;
3988       copy_insn_scratch_out[i] = copy;
3989     }
3990   else if (code == ASM_OPERANDS)
3991     {
3992       orig_asm_operands_vector = ASM_OPERANDS_INPUT_VEC (orig);
3993       copy_asm_operands_vector = ASM_OPERANDS_INPUT_VEC (copy);
3994       orig_asm_constraints_vector = ASM_OPERANDS_INPUT_CONSTRAINT_VEC (orig);
3995       copy_asm_constraints_vector = ASM_OPERANDS_INPUT_CONSTRAINT_VEC (copy);
3996     }
3997
3998   return copy;
3999 }
4000
4001 /* Create a new copy of an rtx.
4002    This function differs from copy_rtx in that it handles SCRATCHes and
4003    ASM_OPERANDs properly.
4004    INSN doesn't really have to be a full INSN; it could be just the
4005    pattern.  */
4006 rtx
4007 copy_insn (insn)
4008      rtx insn;
4009 {
4010   copy_insn_n_scratches = 0;
4011   orig_asm_operands_vector = 0;
4012   orig_asm_constraints_vector = 0;
4013   copy_asm_operands_vector = 0;
4014   copy_asm_constraints_vector = 0;
4015   return copy_insn_1 (insn);
4016 }
4017
4018 /* Initialize data structures and variables in this file
4019    before generating rtl for each function.  */
4020
4021 void
4022 init_emit ()
4023 {
4024   struct function *f = cfun;
4025
4026   f->emit = (struct emit_status *) xmalloc (sizeof (struct emit_status));
4027   first_insn = NULL;
4028   last_insn = NULL;
4029   seq_rtl_expr = NULL;
4030   cur_insn_uid = 1;
4031   reg_rtx_no = LAST_VIRTUAL_REGISTER + 1;
4032   last_linenum = 0;
4033   last_filename = 0;
4034   first_label_num = label_num;
4035   last_label_num = 0;
4036   seq_stack = NULL;
4037
4038   clear_emit_caches ();
4039
4040   /* Init the tables that describe all the pseudo regs.  */
4041
4042   f->emit->regno_pointer_align_length = LAST_VIRTUAL_REGISTER + 101;
4043
4044   f->emit->regno_pointer_align
4045     = (unsigned char *) xcalloc (f->emit->regno_pointer_align_length,
4046                                  sizeof (unsigned char));
4047
4048   regno_reg_rtx
4049     = (rtx *) xcalloc (f->emit->regno_pointer_align_length * sizeof (rtx),
4050                        sizeof (rtx));
4051
4052   /* Put copies of all the virtual register rtx into regno_reg_rtx.  */
4053   init_virtual_regs (f->emit);
4054
4055   /* Indicate that the virtual registers and stack locations are
4056      all pointers.  */
4057   REG_POINTER (stack_pointer_rtx) = 1;
4058   REG_POINTER (frame_pointer_rtx) = 1;
4059   REG_POINTER (hard_frame_pointer_rtx) = 1;
4060   REG_POINTER (arg_pointer_rtx) = 1;
4061
4062   REG_POINTER (virtual_incoming_args_rtx) = 1;
4063   REG_POINTER (virtual_stack_vars_rtx) = 1;
4064   REG_POINTER (virtual_stack_dynamic_rtx) = 1;
4065   REG_POINTER (virtual_outgoing_args_rtx) = 1;
4066   REG_POINTER (virtual_cfa_rtx) = 1;
4067
4068 #ifdef STACK_BOUNDARY
4069   REGNO_POINTER_ALIGN (STACK_POINTER_REGNUM) = STACK_BOUNDARY;
4070   REGNO_POINTER_ALIGN (FRAME_POINTER_REGNUM) = STACK_BOUNDARY;
4071   REGNO_POINTER_ALIGN (HARD_FRAME_POINTER_REGNUM) = STACK_BOUNDARY;
4072   REGNO_POINTER_ALIGN (ARG_POINTER_REGNUM) = STACK_BOUNDARY;
4073
4074   REGNO_POINTER_ALIGN (VIRTUAL_INCOMING_ARGS_REGNUM) = STACK_BOUNDARY;
4075   REGNO_POINTER_ALIGN (VIRTUAL_STACK_VARS_REGNUM) = STACK_BOUNDARY;
4076   REGNO_POINTER_ALIGN (VIRTUAL_STACK_DYNAMIC_REGNUM) = STACK_BOUNDARY;
4077   REGNO_POINTER_ALIGN (VIRTUAL_OUTGOING_ARGS_REGNUM) = STACK_BOUNDARY;
4078   REGNO_POINTER_ALIGN (VIRTUAL_CFA_REGNUM) = BITS_PER_WORD;
4079 #endif
4080
4081 #ifdef INIT_EXPANDERS
4082   INIT_EXPANDERS;
4083 #endif
4084 }
4085
4086 /* Mark SS for GC.  */
4087
4088 static void
4089 mark_sequence_stack (ss)
4090      struct sequence_stack *ss;
4091 {
4092   while (ss)
4093     {
4094       ggc_mark_rtx (ss->first);
4095       ggc_mark_tree (ss->sequence_rtl_expr);
4096       ss = ss->next;
4097     }
4098 }
4099
4100 /* Mark ES for GC.  */
4101
4102 void
4103 mark_emit_status (es)
4104      struct emit_status *es;
4105 {
4106   rtx *r;
4107   int i;
4108
4109   if (es == 0)
4110     return;
4111
4112   for (i = es->regno_pointer_align_length, r = es->x_regno_reg_rtx;
4113        i > 0; --i, ++r)
4114     ggc_mark_rtx (*r);
4115
4116   mark_sequence_stack (es->sequence_stack);
4117   ggc_mark_tree (es->sequence_rtl_expr);
4118   ggc_mark_rtx (es->x_first_insn);
4119 }
4120
4121 /* Create some permanent unique rtl objects shared between all functions.
4122    LINE_NUMBERS is nonzero if line numbers are to be generated.  */
4123
4124 void
4125 init_emit_once (line_numbers)
4126      int line_numbers;
4127 {
4128   int i;
4129   enum machine_mode mode;
4130   enum machine_mode double_mode;
4131
4132   /* Initialize the CONST_INT hash table.  */
4133   const_int_htab = htab_create (37, const_int_htab_hash,
4134                                 const_int_htab_eq, NULL);
4135   ggc_add_root (&const_int_htab, 1, sizeof (const_int_htab),
4136                 rtx_htab_mark);
4137
4138   no_line_numbers = ! line_numbers;
4139
4140   /* Compute the word and byte modes.  */
4141
4142   byte_mode = VOIDmode;
4143   word_mode = VOIDmode;
4144   double_mode = VOIDmode;
4145
4146   for (mode = GET_CLASS_NARROWEST_MODE (MODE_INT); mode != VOIDmode;
4147        mode = GET_MODE_WIDER_MODE (mode))
4148     {
4149       if (GET_MODE_BITSIZE (mode) == BITS_PER_UNIT
4150           && byte_mode == VOIDmode)
4151         byte_mode = mode;
4152
4153       if (GET_MODE_BITSIZE (mode) == BITS_PER_WORD
4154           && word_mode == VOIDmode)
4155         word_mode = mode;
4156     }
4157
4158   for (mode = GET_CLASS_NARROWEST_MODE (MODE_FLOAT); mode != VOIDmode;
4159        mode = GET_MODE_WIDER_MODE (mode))
4160     {
4161       if (GET_MODE_BITSIZE (mode) == DOUBLE_TYPE_SIZE
4162           && double_mode == VOIDmode)
4163         double_mode = mode;
4164     }
4165
4166   ptr_mode = mode_for_size (POINTER_SIZE, GET_MODE_CLASS (Pmode), 0);
4167
4168   /* Assign register numbers to the globally defined register rtx.
4169      This must be done at runtime because the register number field
4170      is in a union and some compilers can't initialize unions.  */
4171
4172   pc_rtx = gen_rtx (PC, VOIDmode);
4173   cc0_rtx = gen_rtx (CC0, VOIDmode);
4174   stack_pointer_rtx = gen_raw_REG (Pmode, STACK_POINTER_REGNUM);
4175   frame_pointer_rtx = gen_raw_REG (Pmode, FRAME_POINTER_REGNUM);
4176   if (hard_frame_pointer_rtx == 0)
4177     hard_frame_pointer_rtx = gen_raw_REG (Pmode,
4178                                           HARD_FRAME_POINTER_REGNUM);
4179   if (arg_pointer_rtx == 0)
4180     arg_pointer_rtx = gen_raw_REG (Pmode, ARG_POINTER_REGNUM);
4181   virtual_incoming_args_rtx =
4182     gen_raw_REG (Pmode, VIRTUAL_INCOMING_ARGS_REGNUM);
4183   virtual_stack_vars_rtx =
4184     gen_raw_REG (Pmode, VIRTUAL_STACK_VARS_REGNUM);
4185   virtual_stack_dynamic_rtx =
4186     gen_raw_REG (Pmode, VIRTUAL_STACK_DYNAMIC_REGNUM);
4187   virtual_outgoing_args_rtx =
4188     gen_raw_REG (Pmode, VIRTUAL_OUTGOING_ARGS_REGNUM);
4189   virtual_cfa_rtx = gen_raw_REG (Pmode, VIRTUAL_CFA_REGNUM);
4190
4191   /* These rtx must be roots if GC is enabled.  */
4192   ggc_add_rtx_root (global_rtl, GR_MAX);
4193
4194 #ifdef INIT_EXPANDERS
4195   /* This is to initialize {init|mark|free}_machine_status before the first
4196      call to push_function_context_to.  This is needed by the Chill front
4197      end which calls push_function_context_to before the first cal to
4198      init_function_start.  */
4199   INIT_EXPANDERS;
4200 #endif
4201
4202   /* Create the unique rtx's for certain rtx codes and operand values.  */
4203
4204   /* Don't use gen_rtx here since gen_rtx in this case
4205      tries to use these variables.  */
4206   for (i = - MAX_SAVED_CONST_INT; i <= MAX_SAVED_CONST_INT; i++)
4207     const_int_rtx[i + MAX_SAVED_CONST_INT] =
4208       gen_rtx_raw_CONST_INT (VOIDmode, i);
4209   ggc_add_rtx_root (const_int_rtx, 2 * MAX_SAVED_CONST_INT + 1);
4210
4211   if (STORE_FLAG_VALUE >= - MAX_SAVED_CONST_INT
4212       && STORE_FLAG_VALUE <= MAX_SAVED_CONST_INT)
4213     const_true_rtx = const_int_rtx[STORE_FLAG_VALUE + MAX_SAVED_CONST_INT];
4214   else
4215     const_true_rtx = gen_rtx_CONST_INT (VOIDmode, STORE_FLAG_VALUE);
4216
4217   dconst0 = REAL_VALUE_ATOF ("0", double_mode);
4218   dconst1 = REAL_VALUE_ATOF ("1", double_mode);
4219   dconst2 = REAL_VALUE_ATOF ("2", double_mode);
4220   dconstm1 = REAL_VALUE_ATOF ("-1", double_mode);
4221
4222   for (i = 0; i <= 2; i++)
4223     {
4224       for (mode = GET_CLASS_NARROWEST_MODE (MODE_FLOAT); mode != VOIDmode;
4225            mode = GET_MODE_WIDER_MODE (mode))
4226         {
4227           rtx tem = rtx_alloc (CONST_DOUBLE);
4228           union real_extract u;
4229
4230           /* Zero any holes in a structure.  */
4231           memset ((char *) &u, 0, sizeof u);
4232           u.d = i == 0 ? dconst0 : i == 1 ? dconst1 : dconst2;
4233
4234           /* Avoid trailing garbage in the rtx.  */
4235           if (sizeof (u) < sizeof (HOST_WIDE_INT))
4236             CONST_DOUBLE_LOW (tem) = 0;
4237           if (sizeof (u) < 2 * sizeof (HOST_WIDE_INT))
4238             CONST_DOUBLE_HIGH (tem) = 0;
4239
4240           memcpy (&CONST_DOUBLE_LOW (tem), &u, sizeof u);
4241           CONST_DOUBLE_MEM (tem) = cc0_rtx;
4242           CONST_DOUBLE_CHAIN (tem) = NULL_RTX;
4243           PUT_MODE (tem, mode);
4244
4245           const_tiny_rtx[i][(int) mode] = tem;
4246         }
4247
4248       const_tiny_rtx[i][(int) VOIDmode] = GEN_INT (i);
4249
4250       for (mode = GET_CLASS_NARROWEST_MODE (MODE_INT); mode != VOIDmode;
4251            mode = GET_MODE_WIDER_MODE (mode))
4252         const_tiny_rtx[i][(int) mode] = GEN_INT (i);
4253
4254       for (mode = GET_CLASS_NARROWEST_MODE (MODE_PARTIAL_INT);
4255            mode != VOIDmode;
4256            mode = GET_MODE_WIDER_MODE (mode))
4257         const_tiny_rtx[i][(int) mode] = GEN_INT (i);
4258     }
4259
4260   for (i = (int) CCmode; i < (int) MAX_MACHINE_MODE; ++i)
4261     if (GET_MODE_CLASS ((enum machine_mode) i) == MODE_CC)
4262       const_tiny_rtx[0][i] = const0_rtx;
4263
4264   const_tiny_rtx[0][(int) BImode] = const0_rtx;
4265   if (STORE_FLAG_VALUE == 1)
4266     const_tiny_rtx[1][(int) BImode] = const1_rtx;
4267
4268   /* For bounded pointers, `&const_tiny_rtx[0][0]' is not the same as
4269      `(rtx *) const_tiny_rtx'.  The former has bounds that only cover
4270      `const_tiny_rtx[0]', whereas the latter has bounds that cover all.  */
4271   ggc_add_rtx_root ((rtx *) const_tiny_rtx, sizeof const_tiny_rtx / sizeof (rtx));
4272   ggc_add_rtx_root (&const_true_rtx, 1);
4273
4274 #ifdef RETURN_ADDRESS_POINTER_REGNUM
4275   return_address_pointer_rtx
4276     = gen_raw_REG (Pmode, RETURN_ADDRESS_POINTER_REGNUM);
4277 #endif
4278
4279 #ifdef STRUCT_VALUE
4280   struct_value_rtx = STRUCT_VALUE;
4281 #else
4282   struct_value_rtx = gen_rtx_REG (Pmode, STRUCT_VALUE_REGNUM);
4283 #endif
4284
4285 #ifdef STRUCT_VALUE_INCOMING
4286   struct_value_incoming_rtx = STRUCT_VALUE_INCOMING;
4287 #else
4288 #ifdef STRUCT_VALUE_INCOMING_REGNUM
4289   struct_value_incoming_rtx
4290     = gen_rtx_REG (Pmode, STRUCT_VALUE_INCOMING_REGNUM);
4291 #else
4292   struct_value_incoming_rtx = struct_value_rtx;
4293 #endif
4294 #endif
4295
4296 #ifdef STATIC_CHAIN_REGNUM
4297   static_chain_rtx = gen_rtx_REG (Pmode, STATIC_CHAIN_REGNUM);
4298
4299 #ifdef STATIC_CHAIN_INCOMING_REGNUM
4300   if (STATIC_CHAIN_INCOMING_REGNUM != STATIC_CHAIN_REGNUM)
4301     static_chain_incoming_rtx
4302       = gen_rtx_REG (Pmode, STATIC_CHAIN_INCOMING_REGNUM);
4303   else
4304 #endif
4305     static_chain_incoming_rtx = static_chain_rtx;
4306 #endif
4307
4308 #ifdef STATIC_CHAIN
4309   static_chain_rtx = STATIC_CHAIN;
4310
4311 #ifdef STATIC_CHAIN_INCOMING
4312   static_chain_incoming_rtx = STATIC_CHAIN_INCOMING;
4313 #else
4314   static_chain_incoming_rtx = static_chain_rtx;
4315 #endif
4316 #endif
4317
4318   if (PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM)
4319     pic_offset_table_rtx = gen_rtx_REG (Pmode, PIC_OFFSET_TABLE_REGNUM);
4320
4321   ggc_add_rtx_root (&pic_offset_table_rtx, 1);
4322   ggc_add_rtx_root (&struct_value_rtx, 1);
4323   ggc_add_rtx_root (&struct_value_incoming_rtx, 1);
4324   ggc_add_rtx_root (&static_chain_rtx, 1);
4325   ggc_add_rtx_root (&static_chain_incoming_rtx, 1);
4326   ggc_add_rtx_root (&return_address_pointer_rtx, 1);
4327 }
4328 \f
4329 /* Query and clear/ restore no_line_numbers.  This is used by the
4330    switch / case handling in stmt.c to give proper line numbers in
4331    warnings about unreachable code.  */
4332
4333 int
4334 force_line_numbers ()
4335 {
4336   int old = no_line_numbers;
4337
4338   no_line_numbers = 0;
4339   if (old)
4340     force_next_line_note ();
4341   return old;
4342 }
4343
4344 void
4345 restore_line_number_status (old_value)
4346      int old_value;
4347 {
4348   no_line_numbers = old_value;
4349 }