OSDN Git Service

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