OSDN Git Service

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