OSDN Git Service

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