OSDN Git Service

* emit-rtl.c (component_ref_for_mem_expr): Try harder to find decl
[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   if (adjust == 0 || offset == 0)
1970     /* ??? Prefer to create garbage instead of creating shared rtl.  */
1971     addr = copy_rtx (addr);
1972   /* If MEMREF is a LO_SUM and the offset is within the alignment of the
1973      object, we can merge it into the LO_SUM.  */
1974   else if (GET_MODE (memref) != BLKmode && GET_CODE (addr) == LO_SUM
1975            && offset >= 0
1976            && (unsigned HOST_WIDE_INT) offset
1977               < GET_MODE_ALIGNMENT (GET_MODE (memref)) / BITS_PER_UNIT)
1978     addr = gen_rtx_LO_SUM (Pmode, XEXP (addr, 0),
1979                            plus_constant (XEXP (addr, 1), offset));
1980   else
1981     addr = plus_constant (addr, offset);
1982
1983   new = change_address_1 (memref, mode, addr, validate);
1984
1985   /* Compute the new values of the memory attributes due to this adjustment.
1986      We add the offsets and update the alignment.  */
1987   if (memoffset)
1988     memoffset = GEN_INT (offset + INTVAL (memoffset));
1989
1990   /* Compute the new alignment by taking the MIN of the alignment and the
1991      lowest-order set bit in OFFSET, but don't change the alignment if OFFSET
1992      if zero.  */
1993   if (offset != 0)
1994     memalign = MIN (memalign, (offset & -offset) * BITS_PER_UNIT);
1995
1996   /* We can compute the size in a number of ways.  */
1997   if (GET_MODE (new) != BLKmode)
1998     size = GEN_INT (GET_MODE_SIZE (GET_MODE (new)));
1999   else if (MEM_SIZE (memref))
2000     size = plus_constant (MEM_SIZE (memref), -offset);
2001
2002   MEM_ATTRS (new) = get_mem_attrs (MEM_ALIAS_SET (memref), MEM_EXPR (memref),
2003                                    memoffset, size, memalign, GET_MODE (new));
2004
2005   /* At some point, we should validate that this offset is within the object,
2006      if all the appropriate values are known.  */
2007   return new;
2008 }
2009
2010 /* Return a memory reference like MEMREF, but with its mode changed
2011    to MODE and its address changed to ADDR, which is assumed to be
2012    MEMREF offseted by OFFSET bytes.  If VALIDATE is
2013    nonzero, the memory address is forced to be valid.  */
2014
2015 rtx
2016 adjust_automodify_address_1 (memref, mode, addr, offset, validate)
2017      rtx memref;
2018      enum machine_mode mode;
2019      rtx addr;
2020      HOST_WIDE_INT offset;
2021      int validate;
2022 {
2023   memref = change_address_1 (memref, VOIDmode, addr, validate);
2024   return adjust_address_1 (memref, mode, offset, validate, 0);
2025 }
2026
2027 /* Return a memory reference like MEMREF, but whose address is changed by
2028    adding OFFSET, an RTX, to it.  POW2 is the highest power of two factor
2029    known to be in OFFSET (possibly 1).  */
2030
2031 rtx
2032 offset_address (memref, offset, pow2)
2033      rtx memref;
2034      rtx offset;
2035      HOST_WIDE_INT pow2;
2036 {
2037   rtx new = change_address_1 (memref, VOIDmode,
2038                               gen_rtx_PLUS (Pmode, XEXP (memref, 0),
2039                                             force_reg (Pmode, offset)), 1);
2040
2041   /* Update the alignment to reflect the offset.  Reset the offset, which
2042      we don't know.  */
2043   MEM_ATTRS (new) = get_mem_attrs (MEM_ALIAS_SET (memref), MEM_EXPR (memref),
2044                                    0, 0, MIN (MEM_ALIGN (memref),
2045                                               pow2 * BITS_PER_UNIT),
2046                                    GET_MODE (new));
2047   return new;
2048 }
2049   
2050 /* Return a memory reference like MEMREF, but with its address changed to
2051    ADDR.  The caller is asserting that the actual piece of memory pointed
2052    to is the same, just the form of the address is being changed, such as
2053    by putting something into a register.  */
2054
2055 rtx
2056 replace_equiv_address (memref, addr)
2057      rtx memref;
2058      rtx addr;
2059 {
2060   /* change_address_1 copies the memory attribute structure without change
2061      and that's exactly what we want here.  */
2062   update_temp_slot_address (XEXP (memref, 0), addr);
2063   return change_address_1 (memref, VOIDmode, addr, 1);
2064 }
2065
2066 /* Likewise, but the reference is not required to be valid.  */
2067
2068 rtx
2069 replace_equiv_address_nv (memref, addr)
2070      rtx memref;
2071      rtx addr;
2072 {
2073   return change_address_1 (memref, VOIDmode, addr, 0);
2074 }
2075 \f
2076 /* Return a newly created CODE_LABEL rtx with a unique label number.  */
2077
2078 rtx
2079 gen_label_rtx ()
2080 {
2081   rtx label;
2082
2083   label = gen_rtx_CODE_LABEL (VOIDmode, 0, NULL_RTX,
2084                               NULL_RTX, label_num++, NULL, NULL);
2085
2086   LABEL_NUSES (label) = 0;
2087   LABEL_ALTERNATE_NAME (label) = NULL;
2088   return label;
2089 }
2090 \f
2091 /* For procedure integration.  */
2092
2093 /* Install new pointers to the first and last insns in the chain.
2094    Also, set cur_insn_uid to one higher than the last in use.
2095    Used for an inline-procedure after copying the insn chain.  */
2096
2097 void
2098 set_new_first_and_last_insn (first, last)
2099      rtx first, last;
2100 {
2101   rtx insn;
2102
2103   first_insn = first;
2104   last_insn = last;
2105   cur_insn_uid = 0;
2106
2107   for (insn = first; insn; insn = NEXT_INSN (insn))
2108     cur_insn_uid = MAX (cur_insn_uid, INSN_UID (insn));
2109
2110   cur_insn_uid++;
2111 }
2112
2113 /* Set the range of label numbers found in the current function.
2114    This is used when belatedly compiling an inline function.  */
2115
2116 void
2117 set_new_first_and_last_label_num (first, last)
2118      int first, last;
2119 {
2120   base_label_num = label_num;
2121   first_label_num = first;
2122   last_label_num = last;
2123 }
2124
2125 /* Set the last label number found in the current function.
2126    This is used when belatedly compiling an inline function.  */
2127
2128 void
2129 set_new_last_label_num (last)
2130      int last;
2131 {
2132   base_label_num = label_num;
2133   last_label_num = last;
2134 }
2135 \f
2136 /* Restore all variables describing the current status from the structure *P.
2137    This is used after a nested function.  */
2138
2139 void
2140 restore_emit_status (p)
2141      struct function *p ATTRIBUTE_UNUSED;
2142 {
2143   last_label_num = 0;
2144   clear_emit_caches ();
2145 }
2146
2147 /* Clear out all parts of the state in F that can safely be discarded
2148    after the function has been compiled, to let garbage collection
2149    reclaim the memory.  */
2150
2151 void
2152 free_emit_status (f)
2153      struct function *f;
2154 {
2155   free (f->emit->x_regno_reg_rtx);
2156   free (f->emit->regno_pointer_align);
2157   free (f->emit->regno_decl);
2158   free (f->emit);
2159   f->emit = NULL;
2160 }
2161 \f
2162 /* Go through all the RTL insn bodies and copy any invalid shared
2163    structure.  This routine should only be called once.  */
2164
2165 void
2166 unshare_all_rtl (fndecl, insn)
2167      tree fndecl;
2168      rtx insn;
2169 {
2170   tree decl;
2171
2172   /* Make sure that virtual parameters are not shared.  */
2173   for (decl = DECL_ARGUMENTS (fndecl); decl; decl = TREE_CHAIN (decl))
2174     SET_DECL_RTL (decl, copy_rtx_if_shared (DECL_RTL (decl)));
2175
2176   /* Make sure that virtual stack slots are not shared.  */
2177   unshare_all_decls (DECL_INITIAL (fndecl));
2178
2179   /* Unshare just about everything else.  */
2180   unshare_all_rtl_1 (insn);
2181
2182   /* Make sure the addresses of stack slots found outside the insn chain
2183      (such as, in DECL_RTL of a variable) are not shared
2184      with the insn chain.
2185
2186      This special care is necessary when the stack slot MEM does not
2187      actually appear in the insn chain.  If it does appear, its address
2188      is unshared from all else at that point.  */
2189   stack_slot_list = copy_rtx_if_shared (stack_slot_list);
2190 }
2191
2192 /* Go through all the RTL insn bodies and copy any invalid shared
2193    structure, again.  This is a fairly expensive thing to do so it
2194    should be done sparingly.  */
2195
2196 void
2197 unshare_all_rtl_again (insn)
2198      rtx insn;
2199 {
2200   rtx p;
2201   tree decl;
2202
2203   for (p = insn; p; p = NEXT_INSN (p))
2204     if (INSN_P (p))
2205       {
2206         reset_used_flags (PATTERN (p));
2207         reset_used_flags (REG_NOTES (p));
2208         reset_used_flags (LOG_LINKS (p));
2209       }
2210
2211   /* Make sure that virtual stack slots are not shared.  */
2212   reset_used_decls (DECL_INITIAL (cfun->decl));
2213
2214   /* Make sure that virtual parameters are not shared.  */
2215   for (decl = DECL_ARGUMENTS (cfun->decl); decl; decl = TREE_CHAIN (decl))
2216     reset_used_flags (DECL_RTL (decl));
2217
2218   reset_used_flags (stack_slot_list);
2219
2220   unshare_all_rtl (cfun->decl, insn);
2221 }
2222
2223 /* Go through all the RTL insn bodies and copy any invalid shared structure.
2224    Assumes the mark bits are cleared at entry.  */
2225
2226 static void
2227 unshare_all_rtl_1 (insn)
2228      rtx insn;
2229 {
2230   for (; insn; insn = NEXT_INSN (insn))
2231     if (INSN_P (insn))
2232       {
2233         PATTERN (insn) = copy_rtx_if_shared (PATTERN (insn));
2234         REG_NOTES (insn) = copy_rtx_if_shared (REG_NOTES (insn));
2235         LOG_LINKS (insn) = copy_rtx_if_shared (LOG_LINKS (insn));
2236       }
2237 }
2238
2239 /* Go through all virtual stack slots of a function and copy any
2240    shared structure.  */
2241 static void
2242 unshare_all_decls (blk)
2243      tree blk;
2244 {
2245   tree t;
2246
2247   /* Copy shared decls.  */
2248   for (t = BLOCK_VARS (blk); t; t = TREE_CHAIN (t))
2249     if (DECL_RTL_SET_P (t))
2250       SET_DECL_RTL (t, copy_rtx_if_shared (DECL_RTL (t)));
2251
2252   /* Now process sub-blocks.  */
2253   for (t = BLOCK_SUBBLOCKS (blk); t; t = TREE_CHAIN (t))
2254     unshare_all_decls (t);
2255 }
2256
2257 /* Go through all virtual stack slots of a function and mark them as
2258    not shared.  */
2259 static void
2260 reset_used_decls (blk)
2261      tree blk;
2262 {
2263   tree t;
2264
2265   /* Mark decls.  */
2266   for (t = BLOCK_VARS (blk); t; t = TREE_CHAIN (t))
2267     if (DECL_RTL_SET_P (t))
2268       reset_used_flags (DECL_RTL (t));
2269
2270   /* Now process sub-blocks.  */
2271   for (t = BLOCK_SUBBLOCKS (blk); t; t = TREE_CHAIN (t))
2272     reset_used_decls (t);
2273 }
2274
2275 /* Mark ORIG as in use, and return a copy of it if it was already in use.
2276    Recursively does the same for subexpressions.  */
2277
2278 rtx
2279 copy_rtx_if_shared (orig)
2280      rtx orig;
2281 {
2282   rtx x = orig;
2283   int i;
2284   enum rtx_code code;
2285   const char *format_ptr;
2286   int copied = 0;
2287
2288   if (x == 0)
2289     return 0;
2290
2291   code = GET_CODE (x);
2292
2293   /* These types may be freely shared.  */
2294
2295   switch (code)
2296     {
2297     case REG:
2298     case QUEUED:
2299     case CONST_INT:
2300     case CONST_DOUBLE:
2301     case SYMBOL_REF:
2302     case CODE_LABEL:
2303     case PC:
2304     case CC0:
2305     case SCRATCH:
2306       /* SCRATCH must be shared because they represent distinct values.  */
2307       return x;
2308
2309     case CONST:
2310       /* CONST can be shared if it contains a SYMBOL_REF.  If it contains
2311          a LABEL_REF, it isn't sharable.  */
2312       if (GET_CODE (XEXP (x, 0)) == PLUS
2313           && GET_CODE (XEXP (XEXP (x, 0), 0)) == SYMBOL_REF
2314           && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT)
2315         return x;
2316       break;
2317
2318     case INSN:
2319     case JUMP_INSN:
2320     case CALL_INSN:
2321     case NOTE:
2322     case BARRIER:
2323       /* The chain of insns is not being copied.  */
2324       return x;
2325
2326     case MEM:
2327       /* A MEM is allowed to be shared if its address is constant.
2328
2329          We used to allow sharing of MEMs which referenced
2330          virtual_stack_vars_rtx or virtual_incoming_args_rtx, but
2331          that can lose.  instantiate_virtual_regs will not unshare
2332          the MEMs, and combine may change the structure of the address
2333          because it looks safe and profitable in one context, but
2334          in some other context it creates unrecognizable RTL.  */
2335       if (CONSTANT_ADDRESS_P (XEXP (x, 0)))
2336         return x;
2337
2338       break;
2339
2340     default:
2341       break;
2342     }
2343
2344   /* This rtx may not be shared.  If it has already been seen,
2345      replace it with a copy of itself.  */
2346
2347   if (x->used)
2348     {
2349       rtx copy;
2350
2351       copy = rtx_alloc (code);
2352       memcpy (copy, x,
2353              (sizeof (*copy) - sizeof (copy->fld)
2354               + sizeof (copy->fld[0]) * GET_RTX_LENGTH (code)));
2355       x = copy;
2356       copied = 1;
2357     }
2358   x->used = 1;
2359
2360   /* Now scan the subexpressions recursively.
2361      We can store any replaced subexpressions directly into X
2362      since we know X is not shared!  Any vectors in X
2363      must be copied if X was copied.  */
2364
2365   format_ptr = GET_RTX_FORMAT (code);
2366
2367   for (i = 0; i < GET_RTX_LENGTH (code); i++)
2368     {
2369       switch (*format_ptr++)
2370         {
2371         case 'e':
2372           XEXP (x, i) = copy_rtx_if_shared (XEXP (x, i));
2373           break;
2374
2375         case 'E':
2376           if (XVEC (x, i) != NULL)
2377             {
2378               int j;
2379               int len = XVECLEN (x, i);
2380
2381               if (copied && len > 0)
2382                 XVEC (x, i) = gen_rtvec_v (len, XVEC (x, i)->elem);
2383               for (j = 0; j < len; j++)
2384                 XVECEXP (x, i, j) = copy_rtx_if_shared (XVECEXP (x, i, j));
2385             }
2386           break;
2387         }
2388     }
2389   return x;
2390 }
2391
2392 /* Clear all the USED bits in X to allow copy_rtx_if_shared to be used
2393    to look for shared sub-parts.  */
2394
2395 void
2396 reset_used_flags (x)
2397      rtx x;
2398 {
2399   int i, j;
2400   enum rtx_code code;
2401   const char *format_ptr;
2402
2403   if (x == 0)
2404     return;
2405
2406   code = GET_CODE (x);
2407
2408   /* These types may be freely shared so we needn't do any resetting
2409      for them.  */
2410
2411   switch (code)
2412     {
2413     case REG:
2414     case QUEUED:
2415     case CONST_INT:
2416     case CONST_DOUBLE:
2417     case SYMBOL_REF:
2418     case CODE_LABEL:
2419     case PC:
2420     case CC0:
2421       return;
2422
2423     case INSN:
2424     case JUMP_INSN:
2425     case CALL_INSN:
2426     case NOTE:
2427     case LABEL_REF:
2428     case BARRIER:
2429       /* The chain of insns is not being copied.  */
2430       return;
2431
2432     default:
2433       break;
2434     }
2435
2436   x->used = 0;
2437
2438   format_ptr = GET_RTX_FORMAT (code);
2439   for (i = 0; i < GET_RTX_LENGTH (code); i++)
2440     {
2441       switch (*format_ptr++)
2442         {
2443         case 'e':
2444           reset_used_flags (XEXP (x, i));
2445           break;
2446
2447         case 'E':
2448           for (j = 0; j < XVECLEN (x, i); j++)
2449             reset_used_flags (XVECEXP (x, i, j));
2450           break;
2451         }
2452     }
2453 }
2454 \f
2455 /* Copy X if necessary so that it won't be altered by changes in OTHER.
2456    Return X or the rtx for the pseudo reg the value of X was copied into.
2457    OTHER must be valid as a SET_DEST.  */
2458
2459 rtx
2460 make_safe_from (x, other)
2461      rtx x, other;
2462 {
2463   while (1)
2464     switch (GET_CODE (other))
2465       {
2466       case SUBREG:
2467         other = SUBREG_REG (other);
2468         break;
2469       case STRICT_LOW_PART:
2470       case SIGN_EXTEND:
2471       case ZERO_EXTEND:
2472         other = XEXP (other, 0);
2473         break;
2474       default:
2475         goto done;
2476       }
2477  done:
2478   if ((GET_CODE (other) == MEM
2479        && ! CONSTANT_P (x)
2480        && GET_CODE (x) != REG
2481        && GET_CODE (x) != SUBREG)
2482       || (GET_CODE (other) == REG
2483           && (REGNO (other) < FIRST_PSEUDO_REGISTER
2484               || reg_mentioned_p (other, x))))
2485     {
2486       rtx temp = gen_reg_rtx (GET_MODE (x));
2487       emit_move_insn (temp, x);
2488       return temp;
2489     }
2490   return x;
2491 }
2492 \f
2493 /* Emission of insns (adding them to the doubly-linked list).  */
2494
2495 /* Return the first insn of the current sequence or current function.  */
2496
2497 rtx
2498 get_insns ()
2499 {
2500   return first_insn;
2501 }
2502
2503 /* Return the last insn emitted in current sequence or current function.  */
2504
2505 rtx
2506 get_last_insn ()
2507 {
2508   return last_insn;
2509 }
2510
2511 /* Specify a new insn as the last in the chain.  */
2512
2513 void
2514 set_last_insn (insn)
2515      rtx insn;
2516 {
2517   if (NEXT_INSN (insn) != 0)
2518     abort ();
2519   last_insn = insn;
2520 }
2521
2522 /* Return the last insn emitted, even if it is in a sequence now pushed.  */
2523
2524 rtx
2525 get_last_insn_anywhere ()
2526 {
2527   struct sequence_stack *stack;
2528   if (last_insn)
2529     return last_insn;
2530   for (stack = seq_stack; stack; stack = stack->next)
2531     if (stack->last != 0)
2532       return stack->last;
2533   return 0;
2534 }
2535
2536 /* Return a number larger than any instruction's uid in this function.  */
2537
2538 int
2539 get_max_uid ()
2540 {
2541   return cur_insn_uid;
2542 }
2543
2544 /* Renumber instructions so that no instruction UIDs are wasted.  */
2545
2546 void
2547 renumber_insns (stream)
2548      FILE *stream;
2549 {
2550   rtx insn;
2551
2552   /* If we're not supposed to renumber instructions, don't.  */
2553   if (!flag_renumber_insns)
2554     return;
2555
2556   /* If there aren't that many instructions, then it's not really
2557      worth renumbering them.  */
2558   if (flag_renumber_insns == 1 && get_max_uid () < 25000)
2559     return;
2560
2561   cur_insn_uid = 1;
2562
2563   for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
2564     {
2565       if (stream)
2566         fprintf (stream, "Renumbering insn %d to %d\n",
2567                  INSN_UID (insn), cur_insn_uid);
2568       INSN_UID (insn) = cur_insn_uid++;
2569     }
2570 }
2571 \f
2572 /* Return the next insn.  If it is a SEQUENCE, return the first insn
2573    of the sequence.  */
2574
2575 rtx
2576 next_insn (insn)
2577      rtx insn;
2578 {
2579   if (insn)
2580     {
2581       insn = NEXT_INSN (insn);
2582       if (insn && GET_CODE (insn) == INSN
2583           && GET_CODE (PATTERN (insn)) == SEQUENCE)
2584         insn = XVECEXP (PATTERN (insn), 0, 0);
2585     }
2586
2587   return insn;
2588 }
2589
2590 /* Return the previous insn.  If it is a SEQUENCE, return the last insn
2591    of the sequence.  */
2592
2593 rtx
2594 previous_insn (insn)
2595      rtx insn;
2596 {
2597   if (insn)
2598     {
2599       insn = PREV_INSN (insn);
2600       if (insn && GET_CODE (insn) == INSN
2601           && GET_CODE (PATTERN (insn)) == SEQUENCE)
2602         insn = XVECEXP (PATTERN (insn), 0, XVECLEN (PATTERN (insn), 0) - 1);
2603     }
2604
2605   return insn;
2606 }
2607
2608 /* Return the next insn after INSN that is not a NOTE.  This routine does not
2609    look inside SEQUENCEs.  */
2610
2611 rtx
2612 next_nonnote_insn (insn)
2613      rtx insn;
2614 {
2615   while (insn)
2616     {
2617       insn = NEXT_INSN (insn);
2618       if (insn == 0 || GET_CODE (insn) != NOTE)
2619         break;
2620     }
2621
2622   return insn;
2623 }
2624
2625 /* Return the previous insn before INSN that is not a NOTE.  This routine does
2626    not look inside SEQUENCEs.  */
2627
2628 rtx
2629 prev_nonnote_insn (insn)
2630      rtx insn;
2631 {
2632   while (insn)
2633     {
2634       insn = PREV_INSN (insn);
2635       if (insn == 0 || GET_CODE (insn) != NOTE)
2636         break;
2637     }
2638
2639   return insn;
2640 }
2641
2642 /* Return the next INSN, CALL_INSN or JUMP_INSN after INSN;
2643    or 0, if there is none.  This routine does not look inside
2644    SEQUENCEs.  */
2645
2646 rtx
2647 next_real_insn (insn)
2648      rtx insn;
2649 {
2650   while (insn)
2651     {
2652       insn = NEXT_INSN (insn);
2653       if (insn == 0 || GET_CODE (insn) == INSN
2654           || GET_CODE (insn) == CALL_INSN || GET_CODE (insn) == JUMP_INSN)
2655         break;
2656     }
2657
2658   return insn;
2659 }
2660
2661 /* Return the last INSN, CALL_INSN or JUMP_INSN before INSN;
2662    or 0, if there is none.  This routine does not look inside
2663    SEQUENCEs.  */
2664
2665 rtx
2666 prev_real_insn (insn)
2667      rtx insn;
2668 {
2669   while (insn)
2670     {
2671       insn = PREV_INSN (insn);
2672       if (insn == 0 || GET_CODE (insn) == INSN || GET_CODE (insn) == CALL_INSN
2673           || GET_CODE (insn) == JUMP_INSN)
2674         break;
2675     }
2676
2677   return insn;
2678 }
2679
2680 /* Find the next insn after INSN that really does something.  This routine
2681    does not look inside SEQUENCEs.  Until reload has completed, this is the
2682    same as next_real_insn.  */
2683
2684 int
2685 active_insn_p (insn)
2686      rtx insn;
2687 {
2688   return (GET_CODE (insn) == CALL_INSN || GET_CODE (insn) == JUMP_INSN
2689           || (GET_CODE (insn) == INSN
2690               && (! reload_completed
2691                   || (GET_CODE (PATTERN (insn)) != USE
2692                       && GET_CODE (PATTERN (insn)) != CLOBBER))));
2693 }
2694
2695 rtx
2696 next_active_insn (insn)
2697      rtx insn;
2698 {
2699   while (insn)
2700     {
2701       insn = NEXT_INSN (insn);
2702       if (insn == 0 || active_insn_p (insn))
2703         break;
2704     }
2705
2706   return insn;
2707 }
2708
2709 /* Find the last insn before INSN that really does something.  This routine
2710    does not look inside SEQUENCEs.  Until reload has completed, this is the
2711    same as prev_real_insn.  */
2712
2713 rtx
2714 prev_active_insn (insn)
2715      rtx insn;
2716 {
2717   while (insn)
2718     {
2719       insn = PREV_INSN (insn);
2720       if (insn == 0 || active_insn_p (insn))
2721         break;
2722     }
2723
2724   return insn;
2725 }
2726
2727 /* Return the next CODE_LABEL after the insn INSN, or 0 if there is none.  */
2728
2729 rtx
2730 next_label (insn)
2731      rtx insn;
2732 {
2733   while (insn)
2734     {
2735       insn = NEXT_INSN (insn);
2736       if (insn == 0 || GET_CODE (insn) == CODE_LABEL)
2737         break;
2738     }
2739
2740   return insn;
2741 }
2742
2743 /* Return the last CODE_LABEL before the insn INSN, or 0 if there is none.  */
2744
2745 rtx
2746 prev_label (insn)
2747      rtx insn;
2748 {
2749   while (insn)
2750     {
2751       insn = PREV_INSN (insn);
2752       if (insn == 0 || GET_CODE (insn) == CODE_LABEL)
2753         break;
2754     }
2755
2756   return insn;
2757 }
2758 \f
2759 #ifdef HAVE_cc0
2760 /* INSN uses CC0 and is being moved into a delay slot.  Set up REG_CC_SETTER
2761    and REG_CC_USER notes so we can find it.  */
2762
2763 void
2764 link_cc0_insns (insn)
2765      rtx insn;
2766 {
2767   rtx user = next_nonnote_insn (insn);
2768
2769   if (GET_CODE (user) == INSN && GET_CODE (PATTERN (user)) == SEQUENCE)
2770     user = XVECEXP (PATTERN (user), 0, 0);
2771
2772   REG_NOTES (user) = gen_rtx_INSN_LIST (REG_CC_SETTER, insn,
2773                                         REG_NOTES (user));
2774   REG_NOTES (insn) = gen_rtx_INSN_LIST (REG_CC_USER, user, REG_NOTES (insn));
2775 }
2776
2777 /* Return the next insn that uses CC0 after INSN, which is assumed to
2778    set it.  This is the inverse of prev_cc0_setter (i.e., prev_cc0_setter
2779    applied to the result of this function should yield INSN).
2780
2781    Normally, this is simply the next insn.  However, if a REG_CC_USER note
2782    is present, it contains the insn that uses CC0.
2783
2784    Return 0 if we can't find the insn.  */
2785
2786 rtx
2787 next_cc0_user (insn)
2788      rtx insn;
2789 {
2790   rtx note = find_reg_note (insn, REG_CC_USER, NULL_RTX);
2791
2792   if (note)
2793     return XEXP (note, 0);
2794
2795   insn = next_nonnote_insn (insn);
2796   if (insn && GET_CODE (insn) == INSN && GET_CODE (PATTERN (insn)) == SEQUENCE)
2797     insn = XVECEXP (PATTERN (insn), 0, 0);
2798
2799   if (insn && INSN_P (insn) && reg_mentioned_p (cc0_rtx, PATTERN (insn)))
2800     return insn;
2801
2802   return 0;
2803 }
2804
2805 /* Find the insn that set CC0 for INSN.  Unless INSN has a REG_CC_SETTER
2806    note, it is the previous insn.  */
2807
2808 rtx
2809 prev_cc0_setter (insn)
2810      rtx insn;
2811 {
2812   rtx note = find_reg_note (insn, REG_CC_SETTER, NULL_RTX);
2813
2814   if (note)
2815     return XEXP (note, 0);
2816
2817   insn = prev_nonnote_insn (insn);
2818   if (! sets_cc0_p (PATTERN (insn)))
2819     abort ();
2820
2821   return insn;
2822 }
2823 #endif
2824
2825 /* Increment the label uses for all labels present in rtx.  */
2826
2827 static void
2828 mark_label_nuses(x)
2829     rtx x;
2830 {
2831   enum rtx_code code;
2832   int i, j;
2833   const char *fmt;
2834
2835   code = GET_CODE (x);
2836   if (code == LABEL_REF)
2837     LABEL_NUSES (XEXP (x, 0))++;
2838
2839   fmt = GET_RTX_FORMAT (code);
2840   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2841     {
2842       if (fmt[i] == 'e')
2843         mark_label_nuses (XEXP (x, i));
2844       else if (fmt[i] == 'E')
2845         for (j = XVECLEN (x, i) - 1; j >= 0; j--)
2846           mark_label_nuses (XVECEXP (x, i, j));
2847     }
2848 }
2849
2850 \f
2851 /* Try splitting insns that can be split for better scheduling.
2852    PAT is the pattern which might split.
2853    TRIAL is the insn providing PAT.
2854    LAST is non-zero if we should return the last insn of the sequence produced.
2855
2856    If this routine succeeds in splitting, it returns the first or last
2857    replacement insn depending on the value of LAST.  Otherwise, it
2858    returns TRIAL.  If the insn to be returned can be split, it will be.  */
2859
2860 rtx
2861 try_split (pat, trial, last)
2862      rtx pat, trial;
2863      int last;
2864 {
2865   rtx before = PREV_INSN (trial);
2866   rtx after = NEXT_INSN (trial);
2867   int has_barrier = 0;
2868   rtx tem;
2869   rtx note, seq;
2870   int probability;
2871
2872   if (any_condjump_p (trial)
2873       && (note = find_reg_note (trial, REG_BR_PROB, 0)))
2874     split_branch_probability = INTVAL (XEXP (note, 0));
2875   probability = split_branch_probability;
2876
2877   seq = split_insns (pat, trial);
2878
2879   split_branch_probability = -1;
2880
2881   /* If we are splitting a JUMP_INSN, it might be followed by a BARRIER.
2882      We may need to handle this specially.  */
2883   if (after && GET_CODE (after) == BARRIER)
2884     {
2885       has_barrier = 1;
2886       after = NEXT_INSN (after);
2887     }
2888
2889   if (seq)
2890     {
2891       /* SEQ can either be a SEQUENCE or the pattern of a single insn.
2892          The latter case will normally arise only when being done so that
2893          it, in turn, will be split (SFmode on the 29k is an example).  */
2894       if (GET_CODE (seq) == SEQUENCE)
2895         {
2896           int i, njumps = 0;
2897
2898           /* Avoid infinite loop if any insn of the result matches
2899              the original pattern.  */
2900           for (i = 0; i < XVECLEN (seq, 0); i++)
2901             if (GET_CODE (XVECEXP (seq, 0, i)) == INSN
2902                 && rtx_equal_p (PATTERN (XVECEXP (seq, 0, i)), pat))
2903               return trial;
2904
2905           /* Mark labels.  */
2906           for (i = XVECLEN (seq, 0) - 1; i >= 0; i--)
2907             if (GET_CODE (XVECEXP (seq, 0, i)) == JUMP_INSN)
2908               {
2909                 rtx insn = XVECEXP (seq, 0, i);
2910                 mark_jump_label (PATTERN (insn),
2911                                  XVECEXP (seq, 0, i), 0);
2912                 njumps++;
2913                 if (probability != -1
2914                     && any_condjump_p (insn)
2915                     && !find_reg_note (insn, REG_BR_PROB, 0))
2916                   {
2917                     /* We can preserve the REG_BR_PROB notes only if exactly
2918                        one jump is created, otherwise the machine description
2919                        is responsible for this step using
2920                        split_branch_probability variable.  */
2921                     if (njumps != 1)
2922                       abort ();
2923                     REG_NOTES (insn)
2924                       = gen_rtx_EXPR_LIST (REG_BR_PROB,
2925                                            GEN_INT (probability),
2926                                            REG_NOTES (insn));
2927                   }
2928               }
2929
2930           /* If we are splitting a CALL_INSN, look for the CALL_INSN
2931              in SEQ and copy our CALL_INSN_FUNCTION_USAGE to it.  */
2932           if (GET_CODE (trial) == CALL_INSN)
2933             for (i = XVECLEN (seq, 0) - 1; i >= 0; i--)
2934               if (GET_CODE (XVECEXP (seq, 0, i)) == CALL_INSN)
2935                 CALL_INSN_FUNCTION_USAGE (XVECEXP (seq, 0, i))
2936                   = CALL_INSN_FUNCTION_USAGE (trial);
2937
2938           /* Copy notes, particularly those related to the CFG.  */
2939           for (note = REG_NOTES (trial); note ; note = XEXP (note, 1))
2940             {
2941               switch (REG_NOTE_KIND (note))
2942                 {
2943                 case REG_EH_REGION:
2944                   for (i = XVECLEN (seq, 0) - 1; i >= 0; i--)
2945                     {
2946                       rtx insn = XVECEXP (seq, 0, i);
2947                       if (GET_CODE (insn) == CALL_INSN
2948                           || (flag_non_call_exceptions
2949                               && may_trap_p (PATTERN (insn))))
2950                         REG_NOTES (insn)
2951                           = gen_rtx_EXPR_LIST (REG_EH_REGION,
2952                                                XEXP (note, 0),
2953                                                REG_NOTES (insn));
2954                     }
2955                   break;
2956
2957                 case REG_NORETURN:
2958                 case REG_SETJMP:
2959                 case REG_ALWAYS_RETURN:
2960                   for (i = XVECLEN (seq, 0) - 1; i >= 0; i--)
2961                     {
2962                       rtx insn = XVECEXP (seq, 0, i);
2963                       if (GET_CODE (insn) == CALL_INSN)
2964                         REG_NOTES (insn)
2965                           = gen_rtx_EXPR_LIST (REG_NOTE_KIND (note),
2966                                                XEXP (note, 0),
2967                                                REG_NOTES (insn));
2968                     }
2969                   break;
2970
2971                 case REG_NON_LOCAL_GOTO:
2972                   for (i = XVECLEN (seq, 0) - 1; i >= 0; i--)
2973                     {
2974                       rtx insn = XVECEXP (seq, 0, i);
2975                       if (GET_CODE (insn) == JUMP_INSN)
2976                         REG_NOTES (insn)
2977                           = gen_rtx_EXPR_LIST (REG_NOTE_KIND (note),
2978                                                XEXP (note, 0),
2979                                                REG_NOTES (insn));
2980                     }
2981                   break;
2982
2983                 default:
2984                   break;
2985                 }
2986             }
2987
2988           /* If there are LABELS inside the split insns increment the
2989              usage count so we don't delete the label.  */
2990           if (GET_CODE (trial) == INSN)
2991             for (i = XVECLEN (seq, 0) - 1; i >= 0; i--)
2992               if (GET_CODE (XVECEXP (seq, 0, i)) == INSN)
2993                 mark_label_nuses (PATTERN (XVECEXP (seq, 0, i)));
2994
2995           tem = emit_insn_after (seq, trial);
2996
2997           delete_related_insns (trial);
2998           if (has_barrier)
2999             emit_barrier_after (tem);
3000
3001           /* Recursively call try_split for each new insn created; by the
3002              time control returns here that insn will be fully split, so
3003              set LAST and continue from the insn after the one returned.
3004              We can't use next_active_insn here since AFTER may be a note.
3005              Ignore deleted insns, which can be occur if not optimizing.  */
3006           for (tem = NEXT_INSN (before); tem != after; tem = NEXT_INSN (tem))
3007             if (! INSN_DELETED_P (tem) && INSN_P (tem))
3008               tem = try_split (PATTERN (tem), tem, 1);
3009         }
3010       /* Avoid infinite loop if the result matches the original pattern.  */
3011       else if (rtx_equal_p (seq, pat))
3012         return trial;
3013       else
3014         {
3015           PATTERN (trial) = seq;
3016           INSN_CODE (trial) = -1;
3017           try_split (seq, trial, last);
3018         }
3019
3020       /* Return either the first or the last insn, depending on which was
3021          requested.  */
3022       return last
3023                 ? (after ? PREV_INSN (after) : last_insn)
3024                 : NEXT_INSN (before);
3025     }
3026
3027   return trial;
3028 }
3029 \f
3030 /* Make and return an INSN rtx, initializing all its slots.
3031    Store PATTERN in the pattern slots.  */
3032
3033 rtx
3034 make_insn_raw (pattern)
3035      rtx pattern;
3036 {
3037   rtx insn;
3038
3039   insn = rtx_alloc (INSN);
3040
3041   INSN_UID (insn) = cur_insn_uid++;
3042   PATTERN (insn) = pattern;
3043   INSN_CODE (insn) = -1;
3044   LOG_LINKS (insn) = NULL;
3045   REG_NOTES (insn) = NULL;
3046
3047 #ifdef ENABLE_RTL_CHECKING
3048   if (insn
3049       && INSN_P (insn)
3050       && (returnjump_p (insn)
3051           || (GET_CODE (insn) == SET
3052               && SET_DEST (insn) == pc_rtx)))
3053     {
3054       warning ("ICE: emit_insn used where emit_jump_insn needed:\n");
3055       debug_rtx (insn);
3056     }
3057 #endif
3058
3059   return insn;
3060 }
3061
3062 /* Like `make_insn' but make a JUMP_INSN instead of an insn.  */
3063
3064 static rtx
3065 make_jump_insn_raw (pattern)
3066      rtx pattern;
3067 {
3068   rtx insn;
3069
3070   insn = rtx_alloc (JUMP_INSN);
3071   INSN_UID (insn) = cur_insn_uid++;
3072
3073   PATTERN (insn) = pattern;
3074   INSN_CODE (insn) = -1;
3075   LOG_LINKS (insn) = NULL;
3076   REG_NOTES (insn) = NULL;
3077   JUMP_LABEL (insn) = NULL;
3078
3079   return insn;
3080 }
3081
3082 /* Like `make_insn' but make a CALL_INSN instead of an insn.  */
3083
3084 static rtx
3085 make_call_insn_raw (pattern)
3086      rtx pattern;
3087 {
3088   rtx insn;
3089
3090   insn = rtx_alloc (CALL_INSN);
3091   INSN_UID (insn) = cur_insn_uid++;
3092
3093   PATTERN (insn) = pattern;
3094   INSN_CODE (insn) = -1;
3095   LOG_LINKS (insn) = NULL;
3096   REG_NOTES (insn) = NULL;
3097   CALL_INSN_FUNCTION_USAGE (insn) = NULL;
3098
3099   return insn;
3100 }
3101 \f
3102 /* Add INSN to the end of the doubly-linked list.
3103    INSN may be an INSN, JUMP_INSN, CALL_INSN, CODE_LABEL, BARRIER or NOTE.  */
3104
3105 void
3106 add_insn (insn)
3107      rtx insn;
3108 {
3109   PREV_INSN (insn) = last_insn;
3110   NEXT_INSN (insn) = 0;
3111
3112   if (NULL != last_insn)
3113     NEXT_INSN (last_insn) = insn;
3114
3115   if (NULL == first_insn)
3116     first_insn = insn;
3117
3118   last_insn = insn;
3119 }
3120
3121 /* Add INSN into the doubly-linked list after insn AFTER.  This and
3122    the next should be the only functions called to insert an insn once
3123    delay slots have been filled since only they know how to update a
3124    SEQUENCE.  */
3125
3126 void
3127 add_insn_after (insn, after)
3128      rtx insn, after;
3129 {
3130   rtx next = NEXT_INSN (after);
3131   basic_block bb;
3132
3133   if (optimize && INSN_DELETED_P (after))
3134     abort ();
3135
3136   NEXT_INSN (insn) = next;
3137   PREV_INSN (insn) = after;
3138
3139   if (next)
3140     {
3141       PREV_INSN (next) = insn;
3142       if (GET_CODE (next) == INSN && GET_CODE (PATTERN (next)) == SEQUENCE)
3143         PREV_INSN (XVECEXP (PATTERN (next), 0, 0)) = insn;
3144     }
3145   else if (last_insn == after)
3146     last_insn = insn;
3147   else
3148     {
3149       struct sequence_stack *stack = seq_stack;
3150       /* Scan all pending sequences too.  */
3151       for (; stack; stack = stack->next)
3152         if (after == stack->last)
3153           {
3154             stack->last = insn;
3155             break;
3156           }
3157
3158       if (stack == 0)
3159         abort ();
3160     }
3161
3162   if (basic_block_for_insn
3163       && (unsigned int)INSN_UID (after) < basic_block_for_insn->num_elements
3164       && (bb = BLOCK_FOR_INSN (after)))
3165     {
3166       set_block_for_insn (insn, bb);
3167       /* Should not happen as first in the BB is always
3168          either NOTE or LABEL.  */
3169       if (bb->end == after
3170           /* Avoid clobbering of structure when creating new BB.  */
3171           && GET_CODE (insn) != BARRIER
3172           && (GET_CODE (insn) != NOTE
3173               || NOTE_LINE_NUMBER (insn) != NOTE_INSN_BASIC_BLOCK))
3174         bb->end = insn;
3175     }
3176
3177   NEXT_INSN (after) = insn;
3178   if (GET_CODE (after) == INSN && GET_CODE (PATTERN (after)) == SEQUENCE)
3179     {
3180       rtx sequence = PATTERN (after);
3181       NEXT_INSN (XVECEXP (sequence, 0, XVECLEN (sequence, 0) - 1)) = insn;
3182     }
3183 }
3184
3185 /* Add INSN into the doubly-linked list before insn BEFORE.  This and
3186    the previous should be the only functions called to insert an insn once
3187    delay slots have been filled since only they know how to update a
3188    SEQUENCE.  */
3189
3190 void
3191 add_insn_before (insn, before)
3192      rtx insn, before;
3193 {
3194   rtx prev = PREV_INSN (before);
3195   basic_block bb;
3196
3197   if (optimize && INSN_DELETED_P (before))
3198     abort ();
3199
3200   PREV_INSN (insn) = prev;
3201   NEXT_INSN (insn) = before;
3202
3203   if (prev)
3204     {
3205       NEXT_INSN (prev) = insn;
3206       if (GET_CODE (prev) == INSN && GET_CODE (PATTERN (prev)) == SEQUENCE)
3207         {
3208           rtx sequence = PATTERN (prev);
3209           NEXT_INSN (XVECEXP (sequence, 0, XVECLEN (sequence, 0) - 1)) = insn;
3210         }
3211     }
3212   else if (first_insn == before)
3213     first_insn = insn;
3214   else
3215     {
3216       struct sequence_stack *stack = seq_stack;
3217       /* Scan all pending sequences too.  */
3218       for (; stack; stack = stack->next)
3219         if (before == stack->first)
3220           {
3221             stack->first = insn;
3222             break;
3223           }
3224
3225       if (stack == 0)
3226         abort ();
3227     }
3228
3229   if (basic_block_for_insn
3230       && (unsigned int)INSN_UID (before) < basic_block_for_insn->num_elements
3231       && (bb = BLOCK_FOR_INSN (before)))
3232     {
3233       set_block_for_insn (insn, bb);
3234       /* Should not happen as first in the BB is always
3235          either NOTE or LABEl.  */
3236       if (bb->head == insn
3237           /* Avoid clobbering of structure when creating new BB.  */
3238           && GET_CODE (insn) != BARRIER
3239           && (GET_CODE (insn) != NOTE
3240               || NOTE_LINE_NUMBER (insn) != NOTE_INSN_BASIC_BLOCK))
3241         abort ();
3242     }
3243
3244   PREV_INSN (before) = insn;
3245   if (GET_CODE (before) == INSN && GET_CODE (PATTERN (before)) == SEQUENCE)
3246     PREV_INSN (XVECEXP (PATTERN (before), 0, 0)) = insn;
3247 }
3248
3249 /* Remove an insn from its doubly-linked list.  This function knows how
3250    to handle sequences.  */
3251 void
3252 remove_insn (insn)
3253      rtx insn;
3254 {
3255   rtx next = NEXT_INSN (insn);
3256   rtx prev = PREV_INSN (insn);
3257   basic_block bb;
3258
3259   if (prev)
3260     {
3261       NEXT_INSN (prev) = next;
3262       if (GET_CODE (prev) == INSN && GET_CODE (PATTERN (prev)) == SEQUENCE)
3263         {
3264           rtx sequence = PATTERN (prev);
3265           NEXT_INSN (XVECEXP (sequence, 0, XVECLEN (sequence, 0) - 1)) = next;
3266         }
3267     }
3268   else if (first_insn == insn)
3269     first_insn = next;
3270   else
3271     {
3272       struct sequence_stack *stack = seq_stack;
3273       /* Scan all pending sequences too.  */
3274       for (; stack; stack = stack->next)
3275         if (insn == stack->first)
3276           {
3277             stack->first = next;
3278             break;
3279           }
3280
3281       if (stack == 0)
3282         abort ();
3283     }
3284
3285   if (next)
3286     {
3287       PREV_INSN (next) = prev;
3288       if (GET_CODE (next) == INSN && GET_CODE (PATTERN (next)) == SEQUENCE)
3289         PREV_INSN (XVECEXP (PATTERN (next), 0, 0)) = prev;
3290     }
3291   else if (last_insn == insn)
3292     last_insn = prev;
3293   else
3294     {
3295       struct sequence_stack *stack = seq_stack;
3296       /* Scan all pending sequences too.  */
3297       for (; stack; stack = stack->next)
3298         if (insn == stack->last)
3299           {
3300             stack->last = prev;
3301             break;
3302           }
3303
3304       if (stack == 0)
3305         abort ();
3306     }
3307   if (basic_block_for_insn
3308       && (unsigned int)INSN_UID (insn) < basic_block_for_insn->num_elements
3309       && (bb = BLOCK_FOR_INSN (insn)))
3310     {
3311       if (bb->head == insn)
3312         {
3313           /* Never ever delete the basic block note without deleting whole basic
3314              block.  */
3315           if (GET_CODE (insn) == NOTE)
3316             abort ();
3317           bb->head = next;
3318         }
3319       if (bb->end == insn)
3320         bb->end = prev;
3321     }
3322 }
3323
3324 /* Delete all insns made since FROM.
3325    FROM becomes the new last instruction.  */
3326
3327 void
3328 delete_insns_since (from)
3329      rtx from;
3330 {
3331   if (from == 0)
3332     first_insn = 0;
3333   else
3334     NEXT_INSN (from) = 0;
3335   last_insn = from;
3336 }
3337
3338 /* This function is deprecated, please use sequences instead.
3339
3340    Move a consecutive bunch of insns to a different place in the chain.
3341    The insns to be moved are those between FROM and TO.
3342    They are moved to a new position after the insn AFTER.
3343    AFTER must not be FROM or TO or any insn in between.
3344
3345    This function does not know about SEQUENCEs and hence should not be
3346    called after delay-slot filling has been done.  */
3347
3348 void
3349 reorder_insns_nobb (from, to, after)
3350      rtx from, to, after;
3351 {
3352   /* Splice this bunch out of where it is now.  */
3353   if (PREV_INSN (from))
3354     NEXT_INSN (PREV_INSN (from)) = NEXT_INSN (to);
3355   if (NEXT_INSN (to))
3356     PREV_INSN (NEXT_INSN (to)) = PREV_INSN (from);
3357   if (last_insn == to)
3358     last_insn = PREV_INSN (from);
3359   if (first_insn == from)
3360     first_insn = NEXT_INSN (to);
3361
3362   /* Make the new neighbors point to it and it to them.  */
3363   if (NEXT_INSN (after))
3364     PREV_INSN (NEXT_INSN (after)) = to;
3365
3366   NEXT_INSN (to) = NEXT_INSN (after);
3367   PREV_INSN (from) = after;
3368   NEXT_INSN (after) = from;
3369   if (after == last_insn)
3370     last_insn = to;
3371 }
3372
3373 /* Same as function above, but take care to update BB boundaries.  */
3374 void
3375 reorder_insns (from, to, after)
3376      rtx from, to, after;
3377 {
3378   rtx prev = PREV_INSN (from);
3379   basic_block bb, bb2;
3380
3381   reorder_insns_nobb (from, to, after);
3382
3383   if (basic_block_for_insn
3384       && (unsigned int)INSN_UID (after) < basic_block_for_insn->num_elements
3385       && (bb = BLOCK_FOR_INSN (after)))
3386     {
3387       rtx x;
3388  
3389       if (basic_block_for_insn
3390           && (unsigned int)INSN_UID (from) < basic_block_for_insn->num_elements
3391           && (bb2 = BLOCK_FOR_INSN (from)))
3392         {
3393           if (bb2->end == to)
3394             bb2->end = prev;
3395         }
3396
3397       if (bb->end == after)
3398         bb->end = to;
3399
3400       for (x = from; x != NEXT_INSN (to); x = NEXT_INSN (x))
3401         set_block_for_insn (x, bb);
3402     }
3403 }
3404
3405 /* Return the line note insn preceding INSN.  */
3406
3407 static rtx
3408 find_line_note (insn)
3409      rtx insn;
3410 {
3411   if (no_line_numbers)
3412     return 0;
3413
3414   for (; insn; insn = PREV_INSN (insn))
3415     if (GET_CODE (insn) == NOTE
3416         && NOTE_LINE_NUMBER (insn) >= 0)
3417       break;
3418
3419   return insn;
3420 }
3421
3422 /* Like reorder_insns, but inserts line notes to preserve the line numbers
3423    of the moved insns when debugging.  This may insert a note between AFTER
3424    and FROM, and another one after TO.  */
3425
3426 void
3427 reorder_insns_with_line_notes (from, to, after)
3428      rtx from, to, after;
3429 {
3430   rtx from_line = find_line_note (from);
3431   rtx after_line = find_line_note (after);
3432
3433   reorder_insns (from, to, after);
3434
3435   if (from_line == after_line)
3436     return;
3437
3438   if (from_line)
3439     emit_line_note_after (NOTE_SOURCE_FILE (from_line),
3440                           NOTE_LINE_NUMBER (from_line),
3441                           after);
3442   if (after_line)
3443     emit_line_note_after (NOTE_SOURCE_FILE (after_line),
3444                           NOTE_LINE_NUMBER (after_line),
3445                           to);
3446 }
3447
3448 /* Remove unnecessary notes from the instruction stream.  */
3449
3450 void
3451 remove_unnecessary_notes ()
3452 {
3453   rtx block_stack = NULL_RTX;
3454   rtx eh_stack = NULL_RTX;
3455   rtx insn;
3456   rtx next;
3457   rtx tmp;
3458
3459   /* We must not remove the first instruction in the function because
3460      the compiler depends on the first instruction being a note.  */
3461   for (insn = NEXT_INSN (get_insns ()); insn; insn = next)
3462     {
3463       /* Remember what's next.  */
3464       next = NEXT_INSN (insn);
3465
3466       /* We're only interested in notes.  */
3467       if (GET_CODE (insn) != NOTE)
3468         continue;
3469
3470       switch (NOTE_LINE_NUMBER (insn))
3471         {
3472         case NOTE_INSN_DELETED:
3473           remove_insn (insn);
3474           break;
3475
3476         case NOTE_INSN_EH_REGION_BEG:
3477           eh_stack = alloc_INSN_LIST (insn, eh_stack);
3478           break;
3479
3480         case NOTE_INSN_EH_REGION_END:
3481           /* Too many end notes.  */
3482           if (eh_stack == NULL_RTX)
3483             abort ();
3484           /* Mismatched nesting.  */
3485           if (NOTE_EH_HANDLER (XEXP (eh_stack, 0)) != NOTE_EH_HANDLER (insn))
3486             abort ();
3487           tmp = eh_stack;
3488           eh_stack = XEXP (eh_stack, 1);
3489           free_INSN_LIST_node (tmp);
3490           break;
3491
3492         case NOTE_INSN_BLOCK_BEG:
3493           /* By now, all notes indicating lexical blocks should have
3494              NOTE_BLOCK filled in.  */
3495           if (NOTE_BLOCK (insn) == NULL_TREE)
3496             abort ();
3497           block_stack = alloc_INSN_LIST (insn, block_stack);
3498           break;
3499
3500         case NOTE_INSN_BLOCK_END:
3501           /* Too many end notes.  */
3502           if (block_stack == NULL_RTX)
3503             abort ();
3504           /* Mismatched nesting.  */
3505           if (NOTE_BLOCK (XEXP (block_stack, 0)) != NOTE_BLOCK (insn))
3506             abort ();
3507           tmp = block_stack;
3508           block_stack = XEXP (block_stack, 1);
3509           free_INSN_LIST_node (tmp);
3510
3511           /* Scan back to see if there are any non-note instructions
3512              between INSN and the beginning of this block.  If not,
3513              then there is no PC range in the generated code that will
3514              actually be in this block, so there's no point in
3515              remembering the existence of the block.  */
3516           for (tmp = PREV_INSN (insn); tmp ; tmp = PREV_INSN (tmp))
3517             {
3518               /* This block contains a real instruction.  Note that we
3519                  don't include labels; if the only thing in the block
3520                  is a label, then there are still no PC values that
3521                  lie within the block.  */
3522               if (INSN_P (tmp))
3523                 break;
3524
3525               /* We're only interested in NOTEs.  */
3526               if (GET_CODE (tmp) != NOTE)
3527                 continue;
3528
3529               if (NOTE_LINE_NUMBER (tmp) == NOTE_INSN_BLOCK_BEG)
3530                 {
3531                   /* We just verified that this BLOCK matches us with
3532                      the block_stack check above.  Never delete the
3533                      BLOCK for the outermost scope of the function; we
3534                      can refer to names from that scope even if the
3535                      block notes are messed up.  */
3536                   if (! is_body_block (NOTE_BLOCK (insn))
3537                       && (*debug_hooks->ignore_block) (NOTE_BLOCK (insn)))
3538                     {
3539                       remove_insn (tmp);
3540                       remove_insn (insn);
3541                     }
3542                   break;
3543                 }
3544               else if (NOTE_LINE_NUMBER (tmp) == NOTE_INSN_BLOCK_END)
3545                 /* There's a nested block.  We need to leave the
3546                    current block in place since otherwise the debugger
3547                    wouldn't be able to show symbols from our block in
3548                    the nested block.  */
3549                 break;
3550             }
3551         }
3552     }
3553
3554   /* Too many begin notes.  */
3555   if (block_stack || eh_stack)
3556     abort ();
3557 }
3558
3559 \f
3560 /* Emit an insn of given code and pattern
3561    at a specified place within the doubly-linked list.  */
3562
3563 /* Make an instruction with body PATTERN
3564    and output it before the instruction BEFORE.  */
3565
3566 rtx
3567 emit_insn_before (pattern, before)
3568      rtx pattern, before;
3569 {
3570   rtx insn = before;
3571
3572   if (GET_CODE (pattern) == SEQUENCE)
3573     {
3574       int i;
3575
3576       for (i = 0; i < XVECLEN (pattern, 0); i++)
3577         {
3578           insn = XVECEXP (pattern, 0, i);
3579           add_insn_before (insn, before);
3580         }
3581     }
3582   else
3583     {
3584       insn = make_insn_raw (pattern);
3585       add_insn_before (insn, before);
3586     }
3587
3588   return insn;
3589 }
3590
3591 /* Make an instruction with body PATTERN and code JUMP_INSN
3592    and output it before the instruction BEFORE.  */
3593
3594 rtx
3595 emit_jump_insn_before (pattern, before)
3596      rtx pattern, before;
3597 {
3598   rtx insn;
3599
3600   if (GET_CODE (pattern) == SEQUENCE)
3601     insn = emit_insn_before (pattern, before);
3602   else
3603     {
3604       insn = make_jump_insn_raw (pattern);
3605       add_insn_before (insn, before);
3606     }
3607
3608   return insn;
3609 }
3610
3611 /* Make an instruction with body PATTERN and code CALL_INSN
3612    and output it before the instruction BEFORE.  */
3613
3614 rtx
3615 emit_call_insn_before (pattern, before)
3616      rtx pattern, before;
3617 {
3618   rtx insn;
3619
3620   if (GET_CODE (pattern) == SEQUENCE)
3621     insn = emit_insn_before (pattern, before);
3622   else
3623     {
3624       insn = make_call_insn_raw (pattern);
3625       add_insn_before (insn, before);
3626       PUT_CODE (insn, CALL_INSN);
3627     }
3628
3629   return insn;
3630 }
3631
3632 /* Make an insn of code BARRIER
3633    and output it before the insn BEFORE.  */
3634
3635 rtx
3636 emit_barrier_before (before)
3637      rtx before;
3638 {
3639   rtx insn = rtx_alloc (BARRIER);
3640
3641   INSN_UID (insn) = cur_insn_uid++;
3642
3643   add_insn_before (insn, before);
3644   return insn;
3645 }
3646
3647 /* Emit the label LABEL before the insn BEFORE.  */
3648
3649 rtx
3650 emit_label_before (label, before)
3651      rtx label, before;
3652 {
3653   /* This can be called twice for the same label as a result of the
3654      confusion that follows a syntax error!  So make it harmless.  */
3655   if (INSN_UID (label) == 0)
3656     {
3657       INSN_UID (label) = cur_insn_uid++;
3658       add_insn_before (label, before);
3659     }
3660
3661   return label;
3662 }
3663
3664 /* Emit a note of subtype SUBTYPE before the insn BEFORE.  */
3665
3666 rtx
3667 emit_note_before (subtype, before)
3668      int subtype;
3669      rtx before;
3670 {
3671   rtx note = rtx_alloc (NOTE);
3672   INSN_UID (note) = cur_insn_uid++;
3673   NOTE_SOURCE_FILE (note) = 0;
3674   NOTE_LINE_NUMBER (note) = subtype;
3675
3676   add_insn_before (note, before);
3677   return note;
3678 }
3679 \f
3680 /* Make an insn of code INSN with body PATTERN
3681    and output it after the insn AFTER.  */
3682
3683 rtx
3684 emit_insn_after (pattern, after)
3685      rtx pattern, after;
3686 {
3687   rtx insn = after;
3688
3689   if (GET_CODE (pattern) == SEQUENCE)
3690     {
3691       int i;
3692
3693       for (i = 0; i < XVECLEN (pattern, 0); i++)
3694         {
3695           insn = XVECEXP (pattern, 0, i);
3696           add_insn_after (insn, after);
3697           after = insn;
3698         }
3699     }
3700   else
3701     {
3702       insn = make_insn_raw (pattern);
3703       add_insn_after (insn, after);
3704     }
3705
3706   return insn;
3707 }
3708
3709 /* Similar to emit_insn_after, except that line notes are to be inserted so
3710    as to act as if this insn were at FROM.  */
3711
3712 void
3713 emit_insn_after_with_line_notes (pattern, after, from)
3714      rtx pattern, after, from;
3715 {
3716   rtx from_line = find_line_note (from);
3717   rtx after_line = find_line_note (after);
3718   rtx insn = emit_insn_after (pattern, after);
3719
3720   if (from_line)
3721     emit_line_note_after (NOTE_SOURCE_FILE (from_line),
3722                           NOTE_LINE_NUMBER (from_line),
3723                           after);
3724
3725   if (after_line)
3726     emit_line_note_after (NOTE_SOURCE_FILE (after_line),
3727                           NOTE_LINE_NUMBER (after_line),
3728                           insn);
3729 }
3730
3731 /* Make an insn of code JUMP_INSN with body PATTERN
3732    and output it after the insn AFTER.  */
3733
3734 rtx
3735 emit_jump_insn_after (pattern, after)
3736      rtx pattern, after;
3737 {
3738   rtx insn;
3739
3740   if (GET_CODE (pattern) == SEQUENCE)
3741     insn = emit_insn_after (pattern, after);
3742   else
3743     {
3744       insn = make_jump_insn_raw (pattern);
3745       add_insn_after (insn, after);
3746     }
3747
3748   return insn;
3749 }
3750
3751 /* Make an insn of code BARRIER
3752    and output it after the insn AFTER.  */
3753
3754 rtx
3755 emit_barrier_after (after)
3756      rtx after;
3757 {
3758   rtx insn = rtx_alloc (BARRIER);
3759
3760   INSN_UID (insn) = cur_insn_uid++;
3761
3762   add_insn_after (insn, after);
3763   return insn;
3764 }
3765
3766 /* Emit the label LABEL after the insn AFTER.  */
3767
3768 rtx
3769 emit_label_after (label, after)
3770      rtx label, after;
3771 {
3772   /* This can be called twice for the same label
3773      as a result of the confusion that follows a syntax error!
3774      So make it harmless.  */
3775   if (INSN_UID (label) == 0)
3776     {
3777       INSN_UID (label) = cur_insn_uid++;
3778       add_insn_after (label, after);
3779     }
3780
3781   return label;
3782 }
3783
3784 /* Emit a note of subtype SUBTYPE after the insn AFTER.  */
3785
3786 rtx
3787 emit_note_after (subtype, after)
3788      int subtype;
3789      rtx after;
3790 {
3791   rtx note = rtx_alloc (NOTE);
3792   INSN_UID (note) = cur_insn_uid++;
3793   NOTE_SOURCE_FILE (note) = 0;
3794   NOTE_LINE_NUMBER (note) = subtype;
3795   add_insn_after (note, after);
3796   return note;
3797 }
3798
3799 /* Emit a line note for FILE and LINE after the insn AFTER.  */
3800
3801 rtx
3802 emit_line_note_after (file, line, after)
3803      const char *file;
3804      int line;
3805      rtx after;
3806 {
3807   rtx note;
3808
3809   if (no_line_numbers && line > 0)
3810     {
3811       cur_insn_uid++;
3812       return 0;
3813     }
3814
3815   note  = rtx_alloc (NOTE);
3816   INSN_UID (note) = cur_insn_uid++;
3817   NOTE_SOURCE_FILE (note) = file;
3818   NOTE_LINE_NUMBER (note) = line;
3819   add_insn_after (note, after);
3820   return note;
3821 }
3822 \f
3823 /* Make an insn of code INSN with pattern PATTERN
3824    and add it to the end of the doubly-linked list.
3825    If PATTERN is a SEQUENCE, take the elements of it
3826    and emit an insn for each element.
3827
3828    Returns the last insn emitted.  */
3829
3830 rtx
3831 emit_insn (pattern)
3832      rtx pattern;
3833 {
3834   rtx insn = last_insn;
3835
3836   if (GET_CODE (pattern) == SEQUENCE)
3837     {
3838       int i;
3839
3840       for (i = 0; i < XVECLEN (pattern, 0); i++)
3841         {
3842           insn = XVECEXP (pattern, 0, i);
3843           add_insn (insn);
3844         }
3845     }
3846   else
3847     {
3848       insn = make_insn_raw (pattern);
3849       add_insn (insn);
3850     }
3851
3852   return insn;
3853 }
3854
3855 /* Emit the insns in a chain starting with INSN.
3856    Return the last insn emitted.  */
3857
3858 rtx
3859 emit_insns (insn)
3860      rtx insn;
3861 {
3862   rtx last = 0;
3863
3864   while (insn)
3865     {
3866       rtx next = NEXT_INSN (insn);
3867       add_insn (insn);
3868       last = insn;
3869       insn = next;
3870     }
3871
3872   return last;
3873 }
3874
3875 /* Emit the insns in a chain starting with INSN and place them in front of
3876    the insn BEFORE.  Return the last insn emitted.  */
3877
3878 rtx
3879 emit_insns_before (insn, before)
3880      rtx insn;
3881      rtx before;
3882 {
3883   rtx last = 0;
3884
3885   while (insn)
3886     {
3887       rtx next = NEXT_INSN (insn);
3888       add_insn_before (insn, before);
3889       last = insn;
3890       insn = next;
3891     }
3892
3893   return last;
3894 }
3895
3896 /* Emit the insns in a chain starting with FIRST and place them in back of
3897    the insn AFTER.  Return the last insn emitted.  */
3898
3899 rtx
3900 emit_insns_after (first, after)
3901      rtx first;
3902      rtx after;
3903 {
3904   rtx last;
3905   rtx after_after;
3906   basic_block bb;
3907
3908   if (!after)
3909     abort ();
3910
3911   if (!first)
3912     return after;
3913
3914   if (basic_block_for_insn
3915       && (unsigned int)INSN_UID (after) < basic_block_for_insn->num_elements
3916       && (bb = BLOCK_FOR_INSN (after)))
3917     {
3918       for (last = first; NEXT_INSN (last); last = NEXT_INSN (last))
3919         set_block_for_insn (last, bb);
3920       set_block_for_insn (last, bb);
3921       if (bb->end == after)
3922         bb->end = last;
3923     }
3924   else
3925     for (last = first; NEXT_INSN (last); last = NEXT_INSN (last))
3926       continue;
3927
3928   after_after = NEXT_INSN (after);
3929
3930   NEXT_INSN (after) = first;
3931   PREV_INSN (first) = after;
3932   NEXT_INSN (last) = after_after;
3933   if (after_after)
3934     PREV_INSN (after_after) = last;
3935
3936   if (after == last_insn)
3937     last_insn = last;
3938   return last;
3939 }
3940
3941 /* Make an insn of code JUMP_INSN with pattern PATTERN
3942    and add it to the end of the doubly-linked list.  */
3943
3944 rtx
3945 emit_jump_insn (pattern)
3946      rtx pattern;
3947 {
3948   if (GET_CODE (pattern) == SEQUENCE)
3949     return emit_insn (pattern);
3950   else
3951     {
3952       rtx insn = make_jump_insn_raw (pattern);
3953       add_insn (insn);
3954       return insn;
3955     }
3956 }
3957
3958 /* Make an insn of code CALL_INSN with pattern PATTERN
3959    and add it to the end of the doubly-linked list.  */
3960
3961 rtx
3962 emit_call_insn (pattern)
3963      rtx pattern;
3964 {
3965   if (GET_CODE (pattern) == SEQUENCE)
3966     return emit_insn (pattern);
3967   else
3968     {
3969       rtx insn = make_call_insn_raw (pattern);
3970       add_insn (insn);
3971       PUT_CODE (insn, CALL_INSN);
3972       return insn;
3973     }
3974 }
3975
3976 /* Add the label LABEL to the end of the doubly-linked list.  */
3977
3978 rtx
3979 emit_label (label)
3980      rtx label;
3981 {
3982   /* This can be called twice for the same label
3983      as a result of the confusion that follows a syntax error!
3984      So make it harmless.  */
3985   if (INSN_UID (label) == 0)
3986     {
3987       INSN_UID (label) = cur_insn_uid++;
3988       add_insn (label);
3989     }
3990   return label;
3991 }
3992
3993 /* Make an insn of code BARRIER
3994    and add it to the end of the doubly-linked list.  */
3995
3996 rtx
3997 emit_barrier ()
3998 {
3999   rtx barrier = rtx_alloc (BARRIER);
4000   INSN_UID (barrier) = cur_insn_uid++;
4001   add_insn (barrier);
4002   return barrier;
4003 }
4004
4005 /* Make an insn of code NOTE
4006    with data-fields specified by FILE and LINE
4007    and add it to the end of the doubly-linked list,
4008    but only if line-numbers are desired for debugging info.  */
4009
4010 rtx
4011 emit_line_note (file, line)
4012      const char *file;
4013      int line;
4014 {
4015   set_file_and_line_for_stmt (file, line);
4016
4017 #if 0
4018   if (no_line_numbers)
4019     return 0;
4020 #endif
4021
4022   return emit_note (file, line);
4023 }
4024
4025 /* Make an insn of code NOTE
4026    with data-fields specified by FILE and LINE
4027    and add it to the end of the doubly-linked list.
4028    If it is a line-number NOTE, omit it if it matches the previous one.  */
4029
4030 rtx
4031 emit_note (file, line)
4032      const char *file;
4033      int line;
4034 {
4035   rtx note;
4036
4037   if (line > 0)
4038     {
4039       if (file && last_filename && !strcmp (file, last_filename)
4040           && line == last_linenum)
4041         return 0;
4042       last_filename = file;
4043       last_linenum = line;
4044     }
4045
4046   if (no_line_numbers && line > 0)
4047     {
4048       cur_insn_uid++;
4049       return 0;
4050     }
4051
4052   note = rtx_alloc (NOTE);
4053   INSN_UID (note) = cur_insn_uid++;
4054   NOTE_SOURCE_FILE (note) = file;
4055   NOTE_LINE_NUMBER (note) = line;
4056   add_insn (note);
4057   return note;
4058 }
4059
4060 /* Emit a NOTE, and don't omit it even if LINE is the previous note.  */
4061
4062 rtx
4063 emit_line_note_force (file, line)
4064      const char *file;
4065      int line;
4066 {
4067   last_linenum = -1;
4068   return emit_line_note (file, line);
4069 }
4070
4071 /* Cause next statement to emit a line note even if the line number
4072    has not changed.  This is used at the beginning of a function.  */
4073
4074 void
4075 force_next_line_note ()
4076 {
4077   last_linenum = -1;
4078 }
4079
4080 /* Place a note of KIND on insn INSN with DATUM as the datum. If a
4081    note of this type already exists, remove it first.  */
4082
4083 rtx
4084 set_unique_reg_note (insn, kind, datum)
4085      rtx insn;
4086      enum reg_note kind;
4087      rtx datum;
4088 {
4089   rtx note = find_reg_note (insn, kind, NULL_RTX);
4090
4091   switch (kind)
4092     {
4093     case REG_EQUAL:
4094     case REG_EQUIV:
4095       /* Don't add REG_EQUAL/REG_EQUIV notes if the insn
4096          has multiple sets (some callers assume single_set
4097          means the insn only has one set, when in fact it
4098          means the insn only has one * useful * set).  */
4099       if (GET_CODE (PATTERN (insn)) == PARALLEL && multiple_sets (insn))
4100         {
4101           if (note)
4102             abort ();
4103           return NULL_RTX;
4104         }
4105
4106       /* Don't add ASM_OPERAND REG_EQUAL/REG_EQUIV notes.
4107          It serves no useful purpose and breaks eliminate_regs.  */
4108       if (GET_CODE (datum) == ASM_OPERANDS)
4109         return NULL_RTX;
4110       break;
4111
4112     default:
4113       break;
4114     }
4115
4116   if (note)
4117     {
4118       XEXP (note, 0) = datum;
4119       return note;
4120     }
4121
4122   REG_NOTES (insn) = gen_rtx_EXPR_LIST (kind, datum, REG_NOTES (insn));
4123   return REG_NOTES (insn);
4124 }
4125 \f
4126 /* Return an indication of which type of insn should have X as a body.
4127    The value is CODE_LABEL, INSN, CALL_INSN or JUMP_INSN.  */
4128
4129 enum rtx_code
4130 classify_insn (x)
4131      rtx x;
4132 {
4133   if (GET_CODE (x) == CODE_LABEL)
4134     return CODE_LABEL;
4135   if (GET_CODE (x) == CALL)
4136     return CALL_INSN;
4137   if (GET_CODE (x) == RETURN)
4138     return JUMP_INSN;
4139   if (GET_CODE (x) == SET)
4140     {
4141       if (SET_DEST (x) == pc_rtx)
4142         return JUMP_INSN;
4143       else if (GET_CODE (SET_SRC (x)) == CALL)
4144         return CALL_INSN;
4145       else
4146         return INSN;
4147     }
4148   if (GET_CODE (x) == PARALLEL)
4149     {
4150       int j;
4151       for (j = XVECLEN (x, 0) - 1; j >= 0; j--)
4152         if (GET_CODE (XVECEXP (x, 0, j)) == CALL)
4153           return CALL_INSN;
4154         else if (GET_CODE (XVECEXP (x, 0, j)) == SET
4155                  && SET_DEST (XVECEXP (x, 0, j)) == pc_rtx)
4156           return JUMP_INSN;
4157         else if (GET_CODE (XVECEXP (x, 0, j)) == SET
4158                  && GET_CODE (SET_SRC (XVECEXP (x, 0, j))) == CALL)
4159           return CALL_INSN;
4160     }
4161   return INSN;
4162 }
4163
4164 /* Emit the rtl pattern X as an appropriate kind of insn.
4165    If X is a label, it is simply added into the insn chain.  */
4166
4167 rtx
4168 emit (x)
4169      rtx x;
4170 {
4171   enum rtx_code code = classify_insn (x);
4172
4173   if (code == CODE_LABEL)
4174     return emit_label (x);
4175   else if (code == INSN)
4176     return emit_insn (x);
4177   else if (code == JUMP_INSN)
4178     {
4179       rtx insn = emit_jump_insn (x);
4180       if (any_uncondjump_p (insn) || GET_CODE (x) == RETURN)
4181         return emit_barrier ();
4182       return insn;
4183     }
4184   else if (code == CALL_INSN)
4185     return emit_call_insn (x);
4186   else
4187     abort ();
4188 }
4189 \f
4190 /* Begin emitting insns to a sequence which can be packaged in an
4191    RTL_EXPR.  If this sequence will contain something that might cause
4192    the compiler to pop arguments to function calls (because those
4193    pops have previously been deferred; see INHIBIT_DEFER_POP for more
4194    details), use do_pending_stack_adjust before calling this function.
4195    That will ensure that the deferred pops are not accidentally
4196    emitted in the middle of this sequence.  */
4197
4198 void
4199 start_sequence ()
4200 {
4201   struct sequence_stack *tem;
4202
4203   tem = (struct sequence_stack *) xmalloc (sizeof (struct sequence_stack));
4204
4205   tem->next = seq_stack;
4206   tem->first = first_insn;
4207   tem->last = last_insn;
4208   tem->sequence_rtl_expr = seq_rtl_expr;
4209
4210   seq_stack = tem;
4211
4212   first_insn = 0;
4213   last_insn = 0;
4214 }
4215
4216 /* Similarly, but indicate that this sequence will be placed in T, an
4217    RTL_EXPR.  See the documentation for start_sequence for more
4218    information about how to use this function.  */
4219
4220 void
4221 start_sequence_for_rtl_expr (t)
4222      tree t;
4223 {
4224   start_sequence ();
4225
4226   seq_rtl_expr = t;
4227 }
4228
4229 /* Set up the insn chain starting with FIRST as the current sequence,
4230    saving the previously current one.  See the documentation for
4231    start_sequence for more information about how to use this function.  */
4232
4233 void
4234 push_to_sequence (first)
4235      rtx first;
4236 {
4237   rtx last;
4238
4239   start_sequence ();
4240
4241   for (last = first; last && NEXT_INSN (last); last = NEXT_INSN (last));
4242
4243   first_insn = first;
4244   last_insn = last;
4245 }
4246
4247 /* Set up the insn chain from a chain stort in FIRST to LAST.  */
4248
4249 void
4250 push_to_full_sequence (first, last)
4251      rtx first, last;
4252 {
4253   start_sequence ();
4254   first_insn = first;
4255   last_insn = last;
4256   /* We really should have the end of the insn chain here.  */
4257   if (last && NEXT_INSN (last))
4258     abort ();
4259 }
4260
4261 /* Set up the outer-level insn chain
4262    as the current sequence, saving the previously current one.  */
4263
4264 void
4265 push_topmost_sequence ()
4266 {
4267   struct sequence_stack *stack, *top = NULL;
4268
4269   start_sequence ();
4270
4271   for (stack = seq_stack; stack; stack = stack->next)
4272     top = stack;
4273
4274   first_insn = top->first;
4275   last_insn = top->last;
4276   seq_rtl_expr = top->sequence_rtl_expr;
4277 }
4278
4279 /* After emitting to the outer-level insn chain, update the outer-level
4280    insn chain, and restore the previous saved state.  */
4281
4282 void
4283 pop_topmost_sequence ()
4284 {
4285   struct sequence_stack *stack, *top = NULL;
4286
4287   for (stack = seq_stack; stack; stack = stack->next)
4288     top = stack;
4289
4290   top->first = first_insn;
4291   top->last = last_insn;
4292   /* ??? Why don't we save seq_rtl_expr here?  */
4293
4294   end_sequence ();
4295 }
4296
4297 /* After emitting to a sequence, restore previous saved state.
4298
4299    To get the contents of the sequence just made, you must call
4300    `gen_sequence' *before* calling here.
4301
4302    If the compiler might have deferred popping arguments while
4303    generating this sequence, and this sequence will not be immediately
4304    inserted into the instruction stream, use do_pending_stack_adjust
4305    before calling gen_sequence.  That will ensure that the deferred
4306    pops are inserted into this sequence, and not into some random
4307    location in the instruction stream.  See INHIBIT_DEFER_POP for more
4308    information about deferred popping of arguments.  */
4309
4310 void
4311 end_sequence ()
4312 {
4313   struct sequence_stack *tem = seq_stack;
4314
4315   first_insn = tem->first;
4316   last_insn = tem->last;
4317   seq_rtl_expr = tem->sequence_rtl_expr;
4318   seq_stack = tem->next;
4319
4320   free (tem);
4321 }
4322
4323 /* This works like end_sequence, but records the old sequence in FIRST
4324    and LAST.  */
4325
4326 void
4327 end_full_sequence (first, last)
4328      rtx *first, *last;
4329 {
4330   *first = first_insn;
4331   *last = last_insn;
4332   end_sequence();
4333 }
4334
4335 /* Return 1 if currently emitting into a sequence.  */
4336
4337 int
4338 in_sequence_p ()
4339 {
4340   return seq_stack != 0;
4341 }
4342
4343 /* Generate a SEQUENCE rtx containing the insns already emitted
4344    to the current sequence.
4345
4346    This is how the gen_... function from a DEFINE_EXPAND
4347    constructs the SEQUENCE that it returns.  */
4348
4349 rtx
4350 gen_sequence ()
4351 {
4352   rtx result;
4353   rtx tem;
4354   int i;
4355   int len;
4356
4357   /* Count the insns in the chain.  */
4358   len = 0;
4359   for (tem = first_insn; tem; tem = NEXT_INSN (tem))
4360     len++;
4361
4362   /* If only one insn, return it rather than a SEQUENCE.
4363      (Now that we cache SEQUENCE expressions, it isn't worth special-casing
4364      the case of an empty list.)
4365      We only return the pattern of an insn if its code is INSN and it
4366      has no notes.  This ensures that no information gets lost.  */
4367   if (len == 1
4368       && ! RTX_FRAME_RELATED_P (first_insn)
4369       && GET_CODE (first_insn) == INSN
4370       /* Don't throw away any reg notes.  */
4371       && REG_NOTES (first_insn) == 0)
4372     return PATTERN (first_insn);
4373
4374   result = gen_rtx_SEQUENCE (VOIDmode, rtvec_alloc (len));
4375
4376   for (i = 0, tem = first_insn; tem; tem = NEXT_INSN (tem), i++)
4377     XVECEXP (result, 0, i) = tem;
4378
4379   return result;
4380 }
4381 \f
4382 /* Put the various virtual registers into REGNO_REG_RTX.  */
4383
4384 void
4385 init_virtual_regs (es)
4386      struct emit_status *es;
4387 {
4388   rtx *ptr = es->x_regno_reg_rtx;
4389   ptr[VIRTUAL_INCOMING_ARGS_REGNUM] = virtual_incoming_args_rtx;
4390   ptr[VIRTUAL_STACK_VARS_REGNUM] = virtual_stack_vars_rtx;
4391   ptr[VIRTUAL_STACK_DYNAMIC_REGNUM] = virtual_stack_dynamic_rtx;
4392   ptr[VIRTUAL_OUTGOING_ARGS_REGNUM] = virtual_outgoing_args_rtx;
4393   ptr[VIRTUAL_CFA_REGNUM] = virtual_cfa_rtx;
4394 }
4395
4396 void
4397 clear_emit_caches ()
4398 {
4399   int i;
4400
4401   /* Clear the start_sequence/gen_sequence cache.  */
4402   for (i = 0; i < SEQUENCE_RESULT_SIZE; i++)
4403     sequence_result[i] = 0;
4404   free_insn = 0;
4405 }
4406 \f
4407 /* Used by copy_insn_1 to avoid copying SCRATCHes more than once.  */
4408 static rtx copy_insn_scratch_in[MAX_RECOG_OPERANDS];
4409 static rtx copy_insn_scratch_out[MAX_RECOG_OPERANDS];
4410 static int copy_insn_n_scratches;
4411
4412 /* When an insn is being copied by copy_insn_1, this is nonzero if we have
4413    copied an ASM_OPERANDS.
4414    In that case, it is the original input-operand vector.  */
4415 static rtvec orig_asm_operands_vector;
4416
4417 /* When an insn is being copied by copy_insn_1, this is nonzero if we have
4418    copied an ASM_OPERANDS.
4419    In that case, it is the copied input-operand vector.  */
4420 static rtvec copy_asm_operands_vector;
4421
4422 /* Likewise for the constraints vector.  */
4423 static rtvec orig_asm_constraints_vector;
4424 static rtvec copy_asm_constraints_vector;
4425
4426 /* Recursively create a new copy of an rtx for copy_insn.
4427    This function differs from copy_rtx in that it handles SCRATCHes and
4428    ASM_OPERANDs properly.
4429    Normally, this function is not used directly; use copy_insn as front end.
4430    However, you could first copy an insn pattern with copy_insn and then use
4431    this function afterwards to properly copy any REG_NOTEs containing
4432    SCRATCHes.  */
4433
4434 rtx
4435 copy_insn_1 (orig)
4436      rtx orig;
4437 {
4438   rtx copy;
4439   int i, j;
4440   RTX_CODE code;
4441   const char *format_ptr;
4442
4443   code = GET_CODE (orig);
4444
4445   switch (code)
4446     {
4447     case REG:
4448     case QUEUED:
4449     case CONST_INT:
4450     case CONST_DOUBLE:
4451     case SYMBOL_REF:
4452     case CODE_LABEL:
4453     case PC:
4454     case CC0:
4455     case ADDRESSOF:
4456       return orig;
4457
4458     case SCRATCH:
4459       for (i = 0; i < copy_insn_n_scratches; i++)
4460         if (copy_insn_scratch_in[i] == orig)
4461           return copy_insn_scratch_out[i];
4462       break;
4463
4464     case CONST:
4465       /* CONST can be shared if it contains a SYMBOL_REF.  If it contains
4466          a LABEL_REF, it isn't sharable.  */
4467       if (GET_CODE (XEXP (orig, 0)) == PLUS
4468           && GET_CODE (XEXP (XEXP (orig, 0), 0)) == SYMBOL_REF
4469           && GET_CODE (XEXP (XEXP (orig, 0), 1)) == CONST_INT)
4470         return orig;
4471       break;
4472
4473       /* A MEM with a constant address is not sharable.  The problem is that
4474          the constant address may need to be reloaded.  If the mem is shared,
4475          then reloading one copy of this mem will cause all copies to appear
4476          to have been reloaded.  */
4477
4478     default:
4479       break;
4480     }
4481
4482   copy = rtx_alloc (code);
4483
4484   /* Copy the various flags, and other information.  We assume that
4485      all fields need copying, and then clear the fields that should
4486      not be copied.  That is the sensible default behavior, and forces
4487      us to explicitly document why we are *not* copying a flag.  */
4488   memcpy (copy, orig, sizeof (struct rtx_def) - sizeof (rtunion));
4489
4490   /* We do not copy the USED flag, which is used as a mark bit during
4491      walks over the RTL.  */
4492   copy->used = 0;
4493
4494   /* We do not copy JUMP, CALL, or FRAME_RELATED for INSNs.  */
4495   if (GET_RTX_CLASS (code) == 'i')
4496     {
4497       copy->jump = 0;
4498       copy->call = 0;
4499       copy->frame_related = 0;
4500     }
4501
4502   format_ptr = GET_RTX_FORMAT (GET_CODE (copy));
4503
4504   for (i = 0; i < GET_RTX_LENGTH (GET_CODE (copy)); i++)
4505     {
4506       copy->fld[i] = orig->fld[i];
4507       switch (*format_ptr++)
4508         {
4509         case 'e':
4510           if (XEXP (orig, i) != NULL)
4511             XEXP (copy, i) = copy_insn_1 (XEXP (orig, i));
4512           break;
4513
4514         case 'E':
4515         case 'V':
4516           if (XVEC (orig, i) == orig_asm_constraints_vector)
4517             XVEC (copy, i) = copy_asm_constraints_vector;
4518           else if (XVEC (orig, i) == orig_asm_operands_vector)
4519             XVEC (copy, i) = copy_asm_operands_vector;
4520           else if (XVEC (orig, i) != NULL)
4521             {
4522               XVEC (copy, i) = rtvec_alloc (XVECLEN (orig, i));
4523               for (j = 0; j < XVECLEN (copy, i); j++)
4524                 XVECEXP (copy, i, j) = copy_insn_1 (XVECEXP (orig, i, j));
4525             }
4526           break;
4527
4528         case 't':
4529         case 'w':
4530         case 'i':
4531         case 's':
4532         case 'S':
4533         case 'u':
4534         case '0':
4535           /* These are left unchanged.  */
4536           break;
4537
4538         default:
4539           abort ();
4540         }
4541     }
4542
4543   if (code == SCRATCH)
4544     {
4545       i = copy_insn_n_scratches++;
4546       if (i >= MAX_RECOG_OPERANDS)
4547         abort ();
4548       copy_insn_scratch_in[i] = orig;
4549       copy_insn_scratch_out[i] = copy;
4550     }
4551   else if (code == ASM_OPERANDS)
4552     {
4553       orig_asm_operands_vector = ASM_OPERANDS_INPUT_VEC (orig);
4554       copy_asm_operands_vector = ASM_OPERANDS_INPUT_VEC (copy);
4555       orig_asm_constraints_vector = ASM_OPERANDS_INPUT_CONSTRAINT_VEC (orig);
4556       copy_asm_constraints_vector = ASM_OPERANDS_INPUT_CONSTRAINT_VEC (copy);
4557     }
4558
4559   return copy;
4560 }
4561
4562 /* Create a new copy of an rtx.
4563    This function differs from copy_rtx in that it handles SCRATCHes and
4564    ASM_OPERANDs properly.
4565    INSN doesn't really have to be a full INSN; it could be just the
4566    pattern.  */
4567 rtx
4568 copy_insn (insn)
4569      rtx insn;
4570 {
4571   copy_insn_n_scratches = 0;
4572   orig_asm_operands_vector = 0;
4573   orig_asm_constraints_vector = 0;
4574   copy_asm_operands_vector = 0;
4575   copy_asm_constraints_vector = 0;
4576   return copy_insn_1 (insn);
4577 }
4578
4579 /* Initialize data structures and variables in this file
4580    before generating rtl for each function.  */
4581
4582 void
4583 init_emit ()
4584 {
4585   struct function *f = cfun;
4586
4587   f->emit = (struct emit_status *) xmalloc (sizeof (struct emit_status));
4588   first_insn = NULL;
4589   last_insn = NULL;
4590   seq_rtl_expr = NULL;
4591   cur_insn_uid = 1;
4592   reg_rtx_no = LAST_VIRTUAL_REGISTER + 1;
4593   last_linenum = 0;
4594   last_filename = 0;
4595   first_label_num = label_num;
4596   last_label_num = 0;
4597   seq_stack = NULL;
4598
4599   clear_emit_caches ();
4600
4601   /* Init the tables that describe all the pseudo regs.  */
4602
4603   f->emit->regno_pointer_align_length = LAST_VIRTUAL_REGISTER + 101;
4604
4605   f->emit->regno_pointer_align
4606     = (unsigned char *) xcalloc (f->emit->regno_pointer_align_length,
4607                                  sizeof (unsigned char));
4608
4609   regno_reg_rtx
4610     = (rtx *) xcalloc (f->emit->regno_pointer_align_length, sizeof (rtx));
4611
4612   f->emit->regno_decl
4613     = (tree *) xcalloc (f->emit->regno_pointer_align_length, sizeof (tree));
4614
4615   /* Put copies of all the virtual register rtx into regno_reg_rtx.  */
4616   init_virtual_regs (f->emit);
4617
4618   /* Indicate that the virtual registers and stack locations are
4619      all pointers.  */
4620   REG_POINTER (stack_pointer_rtx) = 1;
4621   REG_POINTER (frame_pointer_rtx) = 1;
4622   REG_POINTER (hard_frame_pointer_rtx) = 1;
4623   REG_POINTER (arg_pointer_rtx) = 1;
4624
4625   REG_POINTER (virtual_incoming_args_rtx) = 1;
4626   REG_POINTER (virtual_stack_vars_rtx) = 1;
4627   REG_POINTER (virtual_stack_dynamic_rtx) = 1;
4628   REG_POINTER (virtual_outgoing_args_rtx) = 1;
4629   REG_POINTER (virtual_cfa_rtx) = 1;
4630
4631 #ifdef STACK_BOUNDARY
4632   REGNO_POINTER_ALIGN (STACK_POINTER_REGNUM) = STACK_BOUNDARY;
4633   REGNO_POINTER_ALIGN (FRAME_POINTER_REGNUM) = STACK_BOUNDARY;
4634   REGNO_POINTER_ALIGN (HARD_FRAME_POINTER_REGNUM) = STACK_BOUNDARY;
4635   REGNO_POINTER_ALIGN (ARG_POINTER_REGNUM) = STACK_BOUNDARY;
4636
4637   REGNO_POINTER_ALIGN (VIRTUAL_INCOMING_ARGS_REGNUM) = STACK_BOUNDARY;
4638   REGNO_POINTER_ALIGN (VIRTUAL_STACK_VARS_REGNUM) = STACK_BOUNDARY;
4639   REGNO_POINTER_ALIGN (VIRTUAL_STACK_DYNAMIC_REGNUM) = STACK_BOUNDARY;
4640   REGNO_POINTER_ALIGN (VIRTUAL_OUTGOING_ARGS_REGNUM) = STACK_BOUNDARY;
4641   REGNO_POINTER_ALIGN (VIRTUAL_CFA_REGNUM) = BITS_PER_WORD;
4642 #endif
4643
4644 #ifdef INIT_EXPANDERS
4645   INIT_EXPANDERS;
4646 #endif
4647 }
4648
4649 /* Mark SS for GC.  */
4650
4651 static void
4652 mark_sequence_stack (ss)
4653      struct sequence_stack *ss;
4654 {
4655   while (ss)
4656     {
4657       ggc_mark_rtx (ss->first);
4658       ggc_mark_tree (ss->sequence_rtl_expr);
4659       ss = ss->next;
4660     }
4661 }
4662
4663 /* Mark ES for GC.  */
4664
4665 void
4666 mark_emit_status (es)
4667      struct emit_status *es;
4668 {
4669   rtx *r;
4670   tree *t;
4671   int i;
4672
4673   if (es == 0)
4674     return;
4675
4676   for (i = es->regno_pointer_align_length, r = es->x_regno_reg_rtx,
4677        t = es->regno_decl;
4678        i > 0; --i, ++r, ++t)
4679     {
4680       ggc_mark_rtx (*r);
4681       ggc_mark_tree (*t);
4682     }
4683
4684   mark_sequence_stack (es->sequence_stack);
4685   ggc_mark_tree (es->sequence_rtl_expr);
4686   ggc_mark_rtx (es->x_first_insn);
4687 }
4688
4689 /* Create some permanent unique rtl objects shared between all functions.
4690    LINE_NUMBERS is nonzero if line numbers are to be generated.  */
4691
4692 void
4693 init_emit_once (line_numbers)
4694      int line_numbers;
4695 {
4696   int i;
4697   enum machine_mode mode;
4698   enum machine_mode double_mode;
4699
4700   /* Initialize the CONST_INT and memory attribute hash tables.  */
4701   const_int_htab = htab_create (37, const_int_htab_hash,
4702                                 const_int_htab_eq, NULL);
4703   ggc_add_deletable_htab (const_int_htab, 0, 0);
4704
4705   mem_attrs_htab = htab_create (37, mem_attrs_htab_hash,
4706                                 mem_attrs_htab_eq, NULL);
4707   ggc_add_deletable_htab (mem_attrs_htab, 0, mem_attrs_mark);
4708
4709   no_line_numbers = ! line_numbers;
4710
4711   /* Compute the word and byte modes.  */
4712
4713   byte_mode = VOIDmode;
4714   word_mode = VOIDmode;
4715   double_mode = VOIDmode;
4716
4717   for (mode = GET_CLASS_NARROWEST_MODE (MODE_INT); mode != VOIDmode;
4718        mode = GET_MODE_WIDER_MODE (mode))
4719     {
4720       if (GET_MODE_BITSIZE (mode) == BITS_PER_UNIT
4721           && byte_mode == VOIDmode)
4722         byte_mode = mode;
4723
4724       if (GET_MODE_BITSIZE (mode) == BITS_PER_WORD
4725           && word_mode == VOIDmode)
4726         word_mode = mode;
4727     }
4728
4729   for (mode = GET_CLASS_NARROWEST_MODE (MODE_FLOAT); mode != VOIDmode;
4730        mode = GET_MODE_WIDER_MODE (mode))
4731     {
4732       if (GET_MODE_BITSIZE (mode) == DOUBLE_TYPE_SIZE
4733           && double_mode == VOIDmode)
4734         double_mode = mode;
4735     }
4736
4737   ptr_mode = mode_for_size (POINTER_SIZE, GET_MODE_CLASS (Pmode), 0);
4738
4739   /* Assign register numbers to the globally defined register rtx.
4740      This must be done at runtime because the register number field
4741      is in a union and some compilers can't initialize unions.  */
4742
4743   pc_rtx = gen_rtx (PC, VOIDmode);
4744   cc0_rtx = gen_rtx (CC0, VOIDmode);
4745   stack_pointer_rtx = gen_raw_REG (Pmode, STACK_POINTER_REGNUM);
4746   frame_pointer_rtx = gen_raw_REG (Pmode, FRAME_POINTER_REGNUM);
4747   if (hard_frame_pointer_rtx == 0)
4748     hard_frame_pointer_rtx = gen_raw_REG (Pmode,
4749                                           HARD_FRAME_POINTER_REGNUM);
4750   if (arg_pointer_rtx == 0)
4751     arg_pointer_rtx = gen_raw_REG (Pmode, ARG_POINTER_REGNUM);
4752   virtual_incoming_args_rtx =
4753     gen_raw_REG (Pmode, VIRTUAL_INCOMING_ARGS_REGNUM);
4754   virtual_stack_vars_rtx =
4755     gen_raw_REG (Pmode, VIRTUAL_STACK_VARS_REGNUM);
4756   virtual_stack_dynamic_rtx =
4757     gen_raw_REG (Pmode, VIRTUAL_STACK_DYNAMIC_REGNUM);
4758   virtual_outgoing_args_rtx =
4759     gen_raw_REG (Pmode, VIRTUAL_OUTGOING_ARGS_REGNUM);
4760   virtual_cfa_rtx = gen_raw_REG (Pmode, VIRTUAL_CFA_REGNUM);
4761
4762   /* These rtx must be roots if GC is enabled.  */
4763   ggc_add_rtx_root (global_rtl, GR_MAX);
4764
4765 #ifdef INIT_EXPANDERS
4766   /* This is to initialize {init|mark|free}_machine_status before the first
4767      call to push_function_context_to.  This is needed by the Chill front
4768      end which calls push_function_context_to before the first call to
4769      init_function_start.  */
4770   INIT_EXPANDERS;
4771 #endif
4772
4773   /* Create the unique rtx's for certain rtx codes and operand values.  */
4774
4775   /* Don't use gen_rtx here since gen_rtx in this case
4776      tries to use these variables.  */
4777   for (i = - MAX_SAVED_CONST_INT; i <= MAX_SAVED_CONST_INT; i++)
4778     const_int_rtx[i + MAX_SAVED_CONST_INT] =
4779       gen_rtx_raw_CONST_INT (VOIDmode, i);
4780   ggc_add_rtx_root (const_int_rtx, 2 * MAX_SAVED_CONST_INT + 1);
4781
4782   if (STORE_FLAG_VALUE >= - MAX_SAVED_CONST_INT
4783       && STORE_FLAG_VALUE <= MAX_SAVED_CONST_INT)
4784     const_true_rtx = const_int_rtx[STORE_FLAG_VALUE + MAX_SAVED_CONST_INT];
4785   else
4786     const_true_rtx = gen_rtx_CONST_INT (VOIDmode, STORE_FLAG_VALUE);
4787
4788   dconst0 = REAL_VALUE_ATOF ("0", double_mode);
4789   dconst1 = REAL_VALUE_ATOF ("1", double_mode);
4790   dconst2 = REAL_VALUE_ATOF ("2", double_mode);
4791   dconstm1 = REAL_VALUE_ATOF ("-1", double_mode);
4792
4793   for (i = 0; i <= 2; i++)
4794     {
4795       for (mode = GET_CLASS_NARROWEST_MODE (MODE_FLOAT); mode != VOIDmode;
4796            mode = GET_MODE_WIDER_MODE (mode))
4797         {
4798           rtx tem = rtx_alloc (CONST_DOUBLE);
4799           union real_extract u;
4800
4801           /* Zero any holes in a structure.  */
4802           memset ((char *) &u, 0, sizeof u);
4803           u.d = i == 0 ? dconst0 : i == 1 ? dconst1 : dconst2;
4804
4805           /* Avoid trailing garbage in the rtx.  */
4806           if (sizeof (u) < sizeof (HOST_WIDE_INT))
4807             CONST_DOUBLE_LOW (tem) = 0;
4808           if (sizeof (u) < 2 * sizeof (HOST_WIDE_INT))
4809             CONST_DOUBLE_HIGH (tem) = 0;
4810
4811           memcpy (&CONST_DOUBLE_LOW (tem), &u, sizeof u);
4812           CONST_DOUBLE_CHAIN (tem) = NULL_RTX;
4813           PUT_MODE (tem, mode);
4814
4815           const_tiny_rtx[i][(int) mode] = tem;
4816         }
4817
4818       const_tiny_rtx[i][(int) VOIDmode] = GEN_INT (i);
4819
4820       for (mode = GET_CLASS_NARROWEST_MODE (MODE_INT); mode != VOIDmode;
4821            mode = GET_MODE_WIDER_MODE (mode))
4822         const_tiny_rtx[i][(int) mode] = GEN_INT (i);
4823
4824       for (mode = GET_CLASS_NARROWEST_MODE (MODE_PARTIAL_INT);
4825            mode != VOIDmode;
4826            mode = GET_MODE_WIDER_MODE (mode))
4827         const_tiny_rtx[i][(int) mode] = GEN_INT (i);
4828     }
4829
4830   for (i = (int) CCmode; i < (int) MAX_MACHINE_MODE; ++i)
4831     if (GET_MODE_CLASS ((enum machine_mode) i) == MODE_CC)
4832       const_tiny_rtx[0][i] = const0_rtx;
4833
4834   const_tiny_rtx[0][(int) BImode] = const0_rtx;
4835   if (STORE_FLAG_VALUE == 1)
4836     const_tiny_rtx[1][(int) BImode] = const1_rtx;
4837
4838   /* For bounded pointers, `&const_tiny_rtx[0][0]' is not the same as
4839      `(rtx *) const_tiny_rtx'.  The former has bounds that only cover
4840      `const_tiny_rtx[0]', whereas the latter has bounds that cover all.  */
4841   ggc_add_rtx_root ((rtx *) const_tiny_rtx, sizeof const_tiny_rtx / sizeof (rtx));
4842   ggc_add_rtx_root (&const_true_rtx, 1);
4843
4844 #ifdef RETURN_ADDRESS_POINTER_REGNUM
4845   return_address_pointer_rtx
4846     = gen_raw_REG (Pmode, RETURN_ADDRESS_POINTER_REGNUM);
4847 #endif
4848
4849 #ifdef STRUCT_VALUE
4850   struct_value_rtx = STRUCT_VALUE;
4851 #else
4852   struct_value_rtx = gen_rtx_REG (Pmode, STRUCT_VALUE_REGNUM);
4853 #endif
4854
4855 #ifdef STRUCT_VALUE_INCOMING
4856   struct_value_incoming_rtx = STRUCT_VALUE_INCOMING;
4857 #else
4858 #ifdef STRUCT_VALUE_INCOMING_REGNUM
4859   struct_value_incoming_rtx
4860     = gen_rtx_REG (Pmode, STRUCT_VALUE_INCOMING_REGNUM);
4861 #else
4862   struct_value_incoming_rtx = struct_value_rtx;
4863 #endif
4864 #endif
4865
4866 #ifdef STATIC_CHAIN_REGNUM
4867   static_chain_rtx = gen_rtx_REG (Pmode, STATIC_CHAIN_REGNUM);
4868
4869 #ifdef STATIC_CHAIN_INCOMING_REGNUM
4870   if (STATIC_CHAIN_INCOMING_REGNUM != STATIC_CHAIN_REGNUM)
4871     static_chain_incoming_rtx
4872       = gen_rtx_REG (Pmode, STATIC_CHAIN_INCOMING_REGNUM);
4873   else
4874 #endif
4875     static_chain_incoming_rtx = static_chain_rtx;
4876 #endif
4877
4878 #ifdef STATIC_CHAIN
4879   static_chain_rtx = STATIC_CHAIN;
4880
4881 #ifdef STATIC_CHAIN_INCOMING
4882   static_chain_incoming_rtx = STATIC_CHAIN_INCOMING;
4883 #else
4884   static_chain_incoming_rtx = static_chain_rtx;
4885 #endif
4886 #endif
4887
4888   if (PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM)
4889     pic_offset_table_rtx = gen_rtx_REG (Pmode, PIC_OFFSET_TABLE_REGNUM);
4890
4891   ggc_add_rtx_root (&pic_offset_table_rtx, 1);
4892   ggc_add_rtx_root (&struct_value_rtx, 1);
4893   ggc_add_rtx_root (&struct_value_incoming_rtx, 1);
4894   ggc_add_rtx_root (&static_chain_rtx, 1);
4895   ggc_add_rtx_root (&static_chain_incoming_rtx, 1);
4896   ggc_add_rtx_root (&return_address_pointer_rtx, 1);
4897 }
4898 \f
4899 /* Query and clear/ restore no_line_numbers.  This is used by the
4900    switch / case handling in stmt.c to give proper line numbers in
4901    warnings about unreachable code.  */
4902
4903 int
4904 force_line_numbers ()
4905 {
4906   int old = no_line_numbers;
4907
4908   no_line_numbers = 0;
4909   if (old)
4910     force_next_line_note ();
4911   return old;
4912 }
4913
4914 void
4915 restore_line_number_status (old_value)
4916      int old_value;
4917 {
4918   no_line_numbers = old_value;
4919 }