OSDN Git Service

* emit-rtl.c (operand_subword): Properly handle CONST_INTs for
[pf3gnuchains/gcc-fork.git] / gcc / emit-rtl.c
1 /* Emit RTL for the GNU C-Compiler expander.
2    Copyright (C) 1987, 88, 92-97, 1998 Free Software Foundation, Inc.
3
4 This file is part of GNU CC.
5
6 GNU CC is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
9 any later version.
10
11 GNU CC is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GNU CC; see the file COPYING.  If not, write to
18 the Free Software Foundation, 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA.  */
20
21
22 /* Middle-to-low level generation of rtx code and insns.
23
24    This file contains the functions `gen_rtx', `gen_reg_rtx'
25    and `gen_label_rtx' that are the usual ways of creating rtl
26    expressions for most purposes.
27
28    It also has the functions for creating insns and linking
29    them in the doubly-linked chain.
30
31    The patterns of the insns are created by machine-dependent
32    routines in insn-emit.c, which is generated automatically from
33    the machine description.  These routines use `gen_rtx' to make
34    the individual rtx's of the pattern; what is machine dependent
35    is the kind of rtx's they make and what arguments they use.  */
36
37 #include "config.h"
38 #ifdef __STDC__
39 #include <stdarg.h>
40 #else
41 #include <varargs.h>
42 #endif
43 #include "system.h"
44 #include "rtl.h"
45 #include "tree.h"
46 #include "flags.h"
47 #include "except.h"
48 #include "function.h"
49 #include "expr.h"
50 #include "regs.h"
51 #include "hard-reg-set.h"
52 #include "insn-config.h"
53 #include "recog.h"
54 #include "real.h"
55 #include "obstack.h"
56
57 /* Commonly used modes.  */
58
59 enum machine_mode byte_mode;    /* Mode whose width is BITS_PER_UNIT.  */
60 enum machine_mode word_mode;    /* Mode whose width is BITS_PER_WORD.  */
61 enum machine_mode ptr_mode;     /* Mode whose width is POINTER_SIZE.  */
62
63 /* This is reset to LAST_VIRTUAL_REGISTER + 1 at the start of each function.
64    After rtl generation, it is 1 plus the largest register number used.  */
65
66 int reg_rtx_no = LAST_VIRTUAL_REGISTER + 1;
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 /* Lowest label number in current function.  */
74
75 static int first_label_num;
76
77 /* Highest label number in current function.
78    Zero means use the value of label_num instead.
79    This is nonzero only when belatedly compiling an inline function.  */
80
81 static int last_label_num;
82
83 /* Value label_num had when set_new_first_and_last_label_number was called.
84    If label_num has not changed since then, last_label_num is valid.  */
85
86 static int base_label_num;
87
88 /* Nonzero means do not generate NOTEs for source line numbers.  */
89
90 static int no_line_numbers;
91
92 /* Commonly used rtx's, so that we only need space for one copy.
93    These are initialized once for the entire compilation.
94    All of these except perhaps the floating-point CONST_DOUBLEs
95    are unique; no other rtx-object will be equal to any of these.  */
96
97 struct _global_rtl global_rtl =
98 {
99   {PC, VOIDmode},                       /* pc_rtx */
100   {CC0, VOIDmode},                      /* cc0_rtx */
101   {REG},                                /* stack_pointer_rtx */
102   {REG},                                /* frame_pointer_rtx */
103   {REG},                                /* hard_frame_pointer_rtx */
104   {REG},                                /* arg_pointer_rtx */
105   {REG},                                /* virtual_incoming_args_rtx */
106   {REG},                                /* virtual_stack_vars_rtx */
107   {REG},                                /* virtual_stack_dynamic_rtx */
108   {REG},                                /* virtual_outgoing_args_rtx */
109 };
110
111 /* We record floating-point CONST_DOUBLEs in each floating-point mode for
112    the values of 0, 1, and 2.  For the integer entries and VOIDmode, we
113    record a copy of const[012]_rtx.  */
114
115 rtx const_tiny_rtx[3][(int) MAX_MACHINE_MODE];
116
117 rtx const_true_rtx;
118
119 REAL_VALUE_TYPE dconst0;
120 REAL_VALUE_TYPE dconst1;
121 REAL_VALUE_TYPE dconst2;
122 REAL_VALUE_TYPE dconstm1;
123
124 /* All references to the following fixed hard registers go through
125    these unique rtl objects.  On machines where the frame-pointer and
126    arg-pointer are the same register, they use the same unique object.
127
128    After register allocation, other rtl objects which used to be pseudo-regs
129    may be clobbered to refer to the frame-pointer register.
130    But references that were originally to the frame-pointer can be
131    distinguished from the others because they contain frame_pointer_rtx.
132
133    When to use frame_pointer_rtx and hard_frame_pointer_rtx is a little
134    tricky: until register elimination has taken place hard_frame_pointer_rtx
135    should be used if it is being set, and frame_pointer_rtx otherwise.  After 
136    register elimination hard_frame_pointer_rtx should always be used.
137    On machines where the two registers are same (most) then these are the
138    same.
139
140    In an inline procedure, the stack and frame pointer rtxs may not be
141    used for anything else.  */
142 rtx struct_value_rtx;           /* (REG:Pmode STRUCT_VALUE_REGNUM) */
143 rtx struct_value_incoming_rtx;  /* (REG:Pmode STRUCT_VALUE_INCOMING_REGNUM) */
144 rtx static_chain_rtx;           /* (REG:Pmode STATIC_CHAIN_REGNUM) */
145 rtx static_chain_incoming_rtx;  /* (REG:Pmode STATIC_CHAIN_INCOMING_REGNUM) */
146 rtx pic_offset_table_rtx;       /* (REG:Pmode PIC_OFFSET_TABLE_REGNUM) */
147
148 /* This is used to implement __builtin_return_address for some machines.
149    See for instance the MIPS port.  */
150 rtx return_address_pointer_rtx; /* (REG:Pmode RETURN_ADDRESS_POINTER_REGNUM) */
151
152 /* We make one copy of (const_int C) where C is in
153    [- MAX_SAVED_CONST_INT, MAX_SAVED_CONST_INT]
154    to save space during the compilation and simplify comparisons of
155    integers.  */
156
157 struct rtx_def const_int_rtx[MAX_SAVED_CONST_INT * 2 + 1];
158
159 /* The ends of the doubly-linked chain of rtl for the current function.
160    Both are reset to null at the start of rtl generation for the function.
161    
162    start_sequence saves both of these on `sequence_stack' along with
163    `sequence_rtl_expr' and then starts a new, nested sequence of insns.  */
164
165 static rtx first_insn = NULL;
166 static rtx last_insn = NULL;
167
168 /* RTL_EXPR within which the current sequence will be placed.  Use to
169    prevent reuse of any temporaries within the sequence until after the
170    RTL_EXPR is emitted.  */
171
172 tree sequence_rtl_expr = NULL;
173
174 /* INSN_UID for next insn emitted.
175    Reset to 1 for each function compiled.  */
176
177 static int cur_insn_uid = 1;
178
179 /* Line number and source file of the last line-number NOTE emitted.
180    This is used to avoid generating duplicates.  */
181
182 static int last_linenum = 0;
183 static char *last_filename = 0;
184
185 /* A vector indexed by pseudo reg number.  The allocated length
186    of this vector is regno_pointer_flag_length.  Since this
187    vector is needed during the expansion phase when the total
188    number of registers in the function is not yet known,
189    it is copied and made bigger when necessary.  */
190
191 char *regno_pointer_flag;
192 int regno_pointer_flag_length;
193
194 /* Indexed by pseudo register number, if nonzero gives the known alignment
195    for that pseudo (if regno_pointer_flag is set).
196    Allocated in parallel with regno_pointer_flag.  */
197 char *regno_pointer_align;
198
199 /* Indexed by pseudo register number, gives the rtx for that pseudo.
200    Allocated in parallel with regno_pointer_flag.  */
201
202 rtx *regno_reg_rtx;
203
204 /* Stack of pending (incomplete) sequences saved by `start_sequence'.
205    Each element describes one pending sequence.
206    The main insn-chain is saved in the last element of the chain,
207    unless the chain is empty.  */
208
209 struct sequence_stack *sequence_stack;
210
211 /* start_sequence and gen_sequence can make a lot of rtx expressions which are
212    shortly thrown away.  We use two mechanisms to prevent this waste:
213
214    First, we keep a list of the expressions used to represent the sequence
215    stack in sequence_element_free_list.
216
217    Second, for sizes up to 5 elements, we keep a SEQUENCE and its associated
218    rtvec for use by gen_sequence.  One entry for each size is sufficient
219    because most cases are calls to gen_sequence followed by immediately
220    emitting the SEQUENCE.  Reuse is safe since emitting a sequence is
221    destructive on the insn in it anyway and hence can't be redone.
222
223    We do not bother to save this cached data over nested function calls.
224    Instead, we just reinitialize them.  */
225
226 #define SEQUENCE_RESULT_SIZE 5
227
228 static struct sequence_stack *sequence_element_free_list;
229 static rtx sequence_result[SEQUENCE_RESULT_SIZE];
230
231 /* During RTL generation, we also keep a list of free INSN rtl codes.  */
232 static rtx free_insn;
233
234 extern int rtx_equal_function_value_matters;
235
236 /* Filename and line number of last line-number note,
237    whether we actually emitted it or not.  */
238 extern char *emit_filename;
239 extern int emit_lineno;
240
241 static rtx make_jump_insn_raw           PROTO((rtx));
242 static rtx make_call_insn_raw           PROTO((rtx));
243 static rtx find_line_note               PROTO((rtx));
244 \f
245 rtx
246 gen_rtx_CONST_INT (mode, arg)
247      enum machine_mode mode;
248      HOST_WIDE_INT arg;
249 {
250   if (arg >= - MAX_SAVED_CONST_INT && arg <= MAX_SAVED_CONST_INT)
251     return &const_int_rtx[arg + MAX_SAVED_CONST_INT];
252
253 #if STORE_FLAG_VALUE != 1 && STORE_FLAG_VALUE != -1
254   if (const_true_rtx && arg == STORE_FLAG_VALUE)
255     return const_true_rtx;
256 #endif
257
258   return gen_rtx_raw_CONST_INT (mode, arg);
259 }
260
261 rtx
262 gen_rtx_REG (mode, regno)
263      enum machine_mode mode;
264      int regno;
265 {
266   /* In case the MD file explicitly references the frame pointer, have
267      all such references point to the same frame pointer.  This is
268      used during frame pointer elimination to distinguish the explicit
269      references to these registers from pseudos that happened to be
270      assigned to them.
271
272      If we have eliminated the frame pointer or arg pointer, we will
273      be using it as a normal register, for example as a spill
274      register.  In such cases, we might be accessing it in a mode that
275      is not Pmode and therefore cannot use the pre-allocated rtx.
276
277      Also don't do this when we are making new REGs in reload, since
278      we don't want to get confused with the real pointers.  */
279
280   if (mode == Pmode && !reload_in_progress)
281     {
282       if (regno == FRAME_POINTER_REGNUM)
283         return frame_pointer_rtx;
284 #if FRAME_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM
285       if (regno == HARD_FRAME_POINTER_REGNUM)
286         return hard_frame_pointer_rtx;
287 #endif
288 #if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM && HARD_FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
289       if (regno == ARG_POINTER_REGNUM)
290         return arg_pointer_rtx;
291 #endif
292 #ifdef RETURN_ADDRESS_POINTER_REGNUM
293       if (regno == RETURN_ADDRESS_POINTER_REGNUM)
294         return return_address_pointer_rtx;
295 #endif
296       if (regno == STACK_POINTER_REGNUM)
297         return stack_pointer_rtx;
298     }
299
300   return gen_rtx_raw_REG (mode, regno);
301 }
302
303 /* rtx gen_rtx (code, mode, [element1, ..., elementn])
304 **
305 **          This routine generates an RTX of the size specified by
306 **      <code>, which is an RTX code.   The RTX structure is initialized
307 **      from the arguments <element1> through <elementn>, which are
308 **      interpreted according to the specific RTX type's format.   The
309 **      special machine mode associated with the rtx (if any) is specified
310 **      in <mode>.
311 **
312 **          gen_rtx can be invoked in a way which resembles the lisp-like
313 **      rtx it will generate.   For example, the following rtx structure:
314 **
315 **            (plus:QI (mem:QI (reg:SI 1))
316 **                     (mem:QI (plusw:SI (reg:SI 2) (reg:SI 3))))
317 **
318 **              ...would be generated by the following C code:
319 **
320 **              gen_rtx (PLUS, QImode,
321 **                  gen_rtx (MEM, QImode,
322 **                      gen_rtx (REG, SImode, 1)),
323 **                  gen_rtx (MEM, QImode,
324 **                      gen_rtx (PLUS, SImode,
325 **                          gen_rtx (REG, SImode, 2),
326 **                          gen_rtx (REG, SImode, 3)))),
327 */
328
329 /*VARARGS2*/
330 rtx
331 gen_rtx VPROTO((enum rtx_code code, enum machine_mode mode, ...))
332 {
333 #ifndef __STDC__
334   enum rtx_code code;
335   enum machine_mode mode;
336 #endif
337   va_list p;
338   register int i;               /* Array indices...                     */
339   register char *fmt;           /* Current rtx's format...              */
340   register rtx rt_val;          /* RTX to return to caller...           */
341
342   VA_START (p, mode);
343
344 #ifndef __STDC__
345   code = va_arg (p, enum rtx_code);
346   mode = va_arg (p, enum machine_mode);
347 #endif
348
349   if (code == CONST_INT)
350     rt_val = gen_rtx_CONST_INT (mode, va_arg (p, HOST_WIDE_INT));
351   else if (code == REG)
352     rt_val = gen_rtx_REG (mode, va_arg (p, int));
353   else
354     {
355       rt_val = rtx_alloc (code);        /* Allocate the storage space.  */
356       rt_val->mode = mode;              /* Store the machine mode...  */
357
358       fmt = GET_RTX_FORMAT (code);      /* Find the right format...  */
359       for (i = 0; i < GET_RTX_LENGTH (code); i++)
360         {
361           switch (*fmt++)
362             {
363             case '0':           /* Unused field.  */
364               break;
365
366             case 'i':           /* An integer?  */
367               XINT (rt_val, i) = va_arg (p, int);
368               break;
369
370             case 'w':           /* A wide integer? */
371               XWINT (rt_val, i) = va_arg (p, HOST_WIDE_INT);
372               break;
373
374             case 's':           /* A string?  */
375               XSTR (rt_val, i) = va_arg (p, char *);
376               break;
377
378             case 'e':           /* An expression?  */
379             case 'u':           /* An insn?  Same except when printing.  */
380               XEXP (rt_val, i) = va_arg (p, rtx);
381               break;
382
383             case 'E':           /* An RTX vector?  */
384               XVEC (rt_val, i) = va_arg (p, rtvec);
385               break;
386
387             default:
388               abort ();
389             }
390         }
391     }
392   va_end (p);
393   return rt_val;                /* Return the new RTX...                */
394 }
395
396 /* gen_rtvec (n, [rt1, ..., rtn])
397 **
398 **          This routine creates an rtvec and stores within it the
399 **      pointers to rtx's which are its arguments.
400 */
401
402 /*VARARGS1*/
403 rtvec
404 gen_rtvec VPROTO((int n, ...))
405 {
406 #ifndef __STDC__
407   int n;
408 #endif
409   int i;
410   va_list p;
411   rtx *vector;
412
413   VA_START (p, n);
414
415 #ifndef __STDC__
416   n = va_arg (p, int);
417 #endif
418
419   if (n == 0)
420     return NULL_RTVEC;          /* Don't allocate an empty rtvec...     */
421
422   vector = (rtx *) alloca (n * sizeof (rtx));
423
424   for (i = 0; i < n; i++)
425     vector[i] = va_arg (p, rtx);
426   va_end (p);
427
428   return gen_rtvec_v (n, vector);
429 }
430
431 rtvec
432 gen_rtvec_v (n, argp)
433      int n;
434      rtx *argp;
435 {
436   register int i;
437   register rtvec rt_val;
438
439   if (n == 0)
440     return NULL_RTVEC;          /* Don't allocate an empty rtvec...     */
441
442   rt_val = rtvec_alloc (n);     /* Allocate an rtvec...                 */
443
444   for (i = 0; i < n; i++)
445     rt_val->elem[i].rtx = *argp++;
446
447   return rt_val;
448 }
449
450 rtvec
451 gen_rtvec_vv (n, argp)
452      int n;
453      rtunion *argp;
454 {
455   register int i;
456   register rtvec rt_val;
457
458   if (n == 0)
459     return NULL_RTVEC;          /* Don't allocate an empty rtvec...     */
460
461   rt_val = rtvec_alloc (n);     /* Allocate an rtvec...                 */
462
463   for (i = 0; i < n; i++)
464     rt_val->elem[i].rtx = (argp++)->rtx;
465
466   return rt_val;
467 }
468 \f
469 /* Generate a REG rtx for a new pseudo register of mode MODE.
470    This pseudo is assigned the next sequential register number.  */
471
472 rtx
473 gen_reg_rtx (mode)
474      enum machine_mode mode;
475 {
476   register rtx val;
477
478   /* Don't let anything called by or after reload create new registers
479      (actually, registers can't be created after flow, but this is a good
480      approximation).  */
481
482   if (reload_in_progress || reload_completed)
483     abort ();
484
485   if (GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT
486       || GET_MODE_CLASS (mode) == MODE_COMPLEX_INT)
487     {
488       /* For complex modes, don't make a single pseudo.
489          Instead, make a CONCAT of two pseudos.
490          This allows noncontiguous allocation of the real and imaginary parts,
491          which makes much better code.  Besides, allocating DCmode
492          pseudos overstrains reload on some machines like the 386.  */
493       rtx realpart, imagpart;
494       int size = GET_MODE_UNIT_SIZE (mode);
495       enum machine_mode partmode
496         = mode_for_size (size * BITS_PER_UNIT,
497                          (GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT
498                           ? MODE_FLOAT : MODE_INT),
499                          0);
500
501       realpart = gen_reg_rtx (partmode);
502       imagpart = gen_reg_rtx (partmode);
503       return gen_rtx_CONCAT (mode, realpart, imagpart);
504     }
505
506   /* Make sure regno_pointer_flag and regno_reg_rtx are large
507      enough to have an element for this pseudo reg number.  */
508
509   if (reg_rtx_no == regno_pointer_flag_length)
510     {
511       rtx *new1;
512       char *new =
513         (char *) savealloc (regno_pointer_flag_length * 2);
514       bcopy (regno_pointer_flag, new, regno_pointer_flag_length);
515       bzero (&new[regno_pointer_flag_length], regno_pointer_flag_length);
516       regno_pointer_flag = new;
517
518       new = (char *) savealloc (regno_pointer_flag_length * 2);
519       bcopy (regno_pointer_align, new, regno_pointer_flag_length);
520       bzero (&new[regno_pointer_flag_length], regno_pointer_flag_length);
521       regno_pointer_align = new;
522
523       new1 = (rtx *) savealloc (regno_pointer_flag_length * 2 * sizeof (rtx));
524       bcopy ((char *) regno_reg_rtx, (char *) new1,
525              regno_pointer_flag_length * sizeof (rtx));
526       bzero ((char *) &new1[regno_pointer_flag_length],
527              regno_pointer_flag_length * sizeof (rtx));
528       regno_reg_rtx = new1;
529
530       regno_pointer_flag_length *= 2;
531     }
532
533   val = gen_rtx_raw_REG (mode, reg_rtx_no);
534   regno_reg_rtx[reg_rtx_no++] = val;
535   return val;
536 }
537
538 /* Identify REG (which may be a CONCAT) as a user register.  */
539
540 void
541 mark_user_reg (reg)
542      rtx reg;
543 {
544   if (GET_CODE (reg) == CONCAT)
545     {
546       REG_USERVAR_P (XEXP (reg, 0)) = 1;
547       REG_USERVAR_P (XEXP (reg, 1)) = 1;
548     }
549   else if (GET_CODE (reg) == REG)
550     REG_USERVAR_P (reg) = 1;
551   else
552     abort ();
553 }
554
555 /* Identify REG as a probable pointer register and show its alignment
556    as ALIGN, if nonzero.  */
557
558 void
559 mark_reg_pointer (reg, align)
560      rtx reg;
561      int align;
562 {
563   REGNO_POINTER_FLAG (REGNO (reg)) = 1;
564
565   if (align)
566     REGNO_POINTER_ALIGN (REGNO (reg)) = align;
567 }
568
569 /* Return 1 plus largest pseudo reg number used in the current function.  */
570
571 int
572 max_reg_num ()
573 {
574   return reg_rtx_no;
575 }
576
577 /* Return 1 + the largest label number used so far in the current function.  */
578
579 int
580 max_label_num ()
581 {
582   if (last_label_num && label_num == base_label_num)
583     return last_label_num;
584   return label_num;
585 }
586
587 /* Return first label number used in this function (if any were used).  */
588
589 int
590 get_first_label_num ()
591 {
592   return first_label_num;
593 }
594 \f
595 /* Return a value representing some low-order bits of X, where the number
596    of low-order bits is given by MODE.  Note that no conversion is done
597    between floating-point and fixed-point values, rather, the bit 
598    representation is returned.
599
600    This function handles the cases in common between gen_lowpart, below,
601    and two variants in cse.c and combine.c.  These are the cases that can
602    be safely handled at all points in the compilation.
603
604    If this is not a case we can handle, return 0.  */
605
606 rtx
607 gen_lowpart_common (mode, x)
608      enum machine_mode mode;
609      register rtx x;
610 {
611   int word = 0;
612
613   if (GET_MODE (x) == mode)
614     return x;
615
616   /* MODE must occupy no more words than the mode of X.  */
617   if (GET_MODE (x) != VOIDmode
618       && ((GET_MODE_SIZE (mode) + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD
619           > ((GET_MODE_SIZE (GET_MODE (x)) + (UNITS_PER_WORD - 1))
620              / UNITS_PER_WORD)))
621     return 0;
622
623   if (WORDS_BIG_ENDIAN && GET_MODE_SIZE (GET_MODE (x)) > UNITS_PER_WORD)
624     word = ((GET_MODE_SIZE (GET_MODE (x))
625              - MAX (GET_MODE_SIZE (mode), UNITS_PER_WORD))
626             / UNITS_PER_WORD);
627
628   if ((GET_CODE (x) == ZERO_EXTEND || GET_CODE (x) == SIGN_EXTEND)
629       && (GET_MODE_CLASS (mode) == MODE_INT
630           || GET_MODE_CLASS (mode) == MODE_PARTIAL_INT))
631     {
632       /* If we are getting the low-order part of something that has been
633          sign- or zero-extended, we can either just use the object being
634          extended or make a narrower extension.  If we want an even smaller
635          piece than the size of the object being extended, call ourselves
636          recursively.
637
638          This case is used mostly by combine and cse.  */
639
640       if (GET_MODE (XEXP (x, 0)) == mode)
641         return XEXP (x, 0);
642       else if (GET_MODE_SIZE (mode) < GET_MODE_SIZE (GET_MODE (XEXP (x, 0))))
643         return gen_lowpart_common (mode, XEXP (x, 0));
644       else if (GET_MODE_SIZE (mode) < GET_MODE_SIZE (GET_MODE (x)))
645         return gen_rtx_fmt_e (GET_CODE (x), mode, XEXP (x, 0));
646     }
647   else if (GET_CODE (x) == SUBREG
648            && (GET_MODE_SIZE (mode) <= UNITS_PER_WORD
649                || GET_MODE_SIZE (mode) == GET_MODE_UNIT_SIZE (GET_MODE (x))))
650     return (GET_MODE (SUBREG_REG (x)) == mode && SUBREG_WORD (x) == 0
651             ? SUBREG_REG (x)
652             : gen_rtx_SUBREG (mode, SUBREG_REG (x), SUBREG_WORD (x) + word));
653   else if (GET_CODE (x) == REG)
654     {
655       /* Let the backend decide how many registers to skip.  This is needed
656          in particular for Sparc64 where fp regs are smaller than a word.  */
657       /* ??? Note that subregs are now ambiguous, in that those against
658          pseudos are sized by the Word Size, while those against hard
659          regs are sized by the underlying register size.  Better would be
660          to always interpret the subreg offset parameter as bytes or bits.  */
661
662       if (WORDS_BIG_ENDIAN && REGNO (x) < FIRST_PSEUDO_REGISTER)
663         word = (HARD_REGNO_NREGS (REGNO (x), GET_MODE (x))
664                 - HARD_REGNO_NREGS (REGNO (x), mode));
665
666       /* If the register is not valid for MODE, return 0.  If we don't
667          do this, there is no way to fix up the resulting REG later.  
668          But we do do this if the current REG is not valid for its
669          mode.  This latter is a kludge, but is required due to the
670          way that parameters are passed on some machines, most
671          notably Sparc.  */
672       if (REGNO (x) < FIRST_PSEUDO_REGISTER
673           && ! HARD_REGNO_MODE_OK (REGNO (x) + word, mode)
674           && HARD_REGNO_MODE_OK (REGNO (x), GET_MODE (x)))
675         return 0;
676       else if (REGNO (x) < FIRST_PSEUDO_REGISTER
677                /* integrate.c can't handle parts of a return value register. */
678                && (! REG_FUNCTION_VALUE_P (x)
679                    || ! rtx_equal_function_value_matters)
680 #ifdef CLASS_CANNOT_CHANGE_SIZE
681                && ! (GET_MODE_SIZE (mode) != GET_MODE_SIZE (GET_MODE (x))
682                      && GET_MODE_CLASS (GET_MODE (x)) != MODE_COMPLEX_INT
683                      && GET_MODE_CLASS (GET_MODE (x)) != MODE_COMPLEX_FLOAT
684                      && (TEST_HARD_REG_BIT
685                          (reg_class_contents[(int) CLASS_CANNOT_CHANGE_SIZE],
686                           REGNO (x))))
687 #endif
688                /* We want to keep the stack, frame, and arg pointers
689                   special.  */
690                && x != frame_pointer_rtx
691 #if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
692                && x != arg_pointer_rtx
693 #endif
694                && x != stack_pointer_rtx)
695         return gen_rtx_REG (mode, REGNO (x) + word);
696       else
697         return gen_rtx_SUBREG (mode, x, word);
698     }
699   /* If X is a CONST_INT or a CONST_DOUBLE, extract the appropriate bits
700      from the low-order part of the constant.  */
701   else if ((GET_MODE_CLASS (mode) == MODE_INT
702             || GET_MODE_CLASS (mode) == MODE_PARTIAL_INT)
703            && GET_MODE (x) == VOIDmode
704            && (GET_CODE (x) == CONST_INT || GET_CODE (x) == CONST_DOUBLE))
705     {
706       /* If MODE is twice the host word size, X is already the desired
707          representation.  Otherwise, if MODE is wider than a word, we can't
708          do this.  If MODE is exactly a word, return just one CONST_INT.
709          If MODE is smaller than a word, clear the bits that don't belong
710          in our mode, unless they and our sign bit are all one.  So we get
711          either a reasonable negative value or a reasonable unsigned value
712          for this mode.  */
713
714       if (GET_MODE_BITSIZE (mode) >= 2 * HOST_BITS_PER_WIDE_INT)
715         return x;
716       else if (GET_MODE_BITSIZE (mode) > HOST_BITS_PER_WIDE_INT)
717         return 0;
718       else if (GET_MODE_BITSIZE (mode) == HOST_BITS_PER_WIDE_INT)
719         return (GET_CODE (x) == CONST_INT ? x
720                 : GEN_INT (CONST_DOUBLE_LOW (x)));
721       else
722         {
723           /* MODE must be narrower than HOST_BITS_PER_INT.  */
724           int width = GET_MODE_BITSIZE (mode);
725           HOST_WIDE_INT val = (GET_CODE (x) == CONST_INT ? INTVAL (x)
726                                : CONST_DOUBLE_LOW (x));
727
728           if (((val & ((HOST_WIDE_INT) (-1) << (width - 1)))
729                != ((HOST_WIDE_INT) (-1) << (width - 1))))
730             val &= ((HOST_WIDE_INT) 1 << width) - 1;
731
732           return (GET_CODE (x) == CONST_INT && INTVAL (x) == val ? x
733                   : GEN_INT (val));
734         }
735     }
736
737   /* If X is an integral constant but we want it in floating-point, it
738      must be the case that we have a union of an integer and a floating-point
739      value.  If the machine-parameters allow it, simulate that union here
740      and return the result.  The two-word and single-word cases are 
741      different.  */
742
743   else if (((HOST_FLOAT_FORMAT == TARGET_FLOAT_FORMAT
744              && HOST_BITS_PER_WIDE_INT == BITS_PER_WORD)
745             || flag_pretend_float)
746            && GET_MODE_CLASS (mode) == MODE_FLOAT
747            && GET_MODE_SIZE (mode) == UNITS_PER_WORD
748            && GET_CODE (x) == CONST_INT
749            && sizeof (float) * HOST_BITS_PER_CHAR == HOST_BITS_PER_WIDE_INT)
750 #ifdef REAL_ARITHMETIC
751     {
752       REAL_VALUE_TYPE r;
753       HOST_WIDE_INT i;
754
755       i = INTVAL (x);
756       r = REAL_VALUE_FROM_TARGET_SINGLE (i);
757       return CONST_DOUBLE_FROM_REAL_VALUE (r, mode);
758     }
759 #else
760     {
761       union {HOST_WIDE_INT i; float d; } u;
762
763       u.i = INTVAL (x);
764       return CONST_DOUBLE_FROM_REAL_VALUE (u.d, mode);
765     }
766 #endif
767   else if (((HOST_FLOAT_FORMAT == TARGET_FLOAT_FORMAT
768              && HOST_BITS_PER_WIDE_INT == BITS_PER_WORD)
769             || flag_pretend_float)
770            && GET_MODE_CLASS (mode) == MODE_FLOAT
771            && GET_MODE_SIZE (mode) == 2 * UNITS_PER_WORD
772            && (GET_CODE (x) == CONST_INT || GET_CODE (x) == CONST_DOUBLE)
773            && GET_MODE (x) == VOIDmode
774            && (sizeof (double) * HOST_BITS_PER_CHAR
775                == 2 * HOST_BITS_PER_WIDE_INT))
776 #ifdef REAL_ARITHMETIC
777     {
778       REAL_VALUE_TYPE r;
779       HOST_WIDE_INT i[2];
780       HOST_WIDE_INT low, high;
781
782       if (GET_CODE (x) == CONST_INT)
783         low = INTVAL (x), high = low >> (HOST_BITS_PER_WIDE_INT -1);
784       else
785         low = CONST_DOUBLE_LOW (x), high = CONST_DOUBLE_HIGH (x);
786
787       /* REAL_VALUE_TARGET_DOUBLE takes the addressing order of the
788          target machine.  */
789       if (WORDS_BIG_ENDIAN)
790         i[0] = high, i[1] = low;
791       else
792         i[0] = low, i[1] = high;
793
794       r = REAL_VALUE_FROM_TARGET_DOUBLE (i);
795       return CONST_DOUBLE_FROM_REAL_VALUE (r, mode);
796     }
797 #else
798     {
799       union {HOST_WIDE_INT i[2]; double d; } u;
800       HOST_WIDE_INT low, high;
801
802       if (GET_CODE (x) == CONST_INT)
803         low = INTVAL (x), high = low >> (HOST_BITS_PER_WIDE_INT -1);
804       else
805         low = CONST_DOUBLE_LOW (x), high = CONST_DOUBLE_HIGH (x);
806
807 #ifdef HOST_WORDS_BIG_ENDIAN
808       u.i[0] = high, u.i[1] = low;
809 #else
810       u.i[0] = low, u.i[1] = high;
811 #endif
812
813       return CONST_DOUBLE_FROM_REAL_VALUE (u.d, mode);
814     }
815 #endif
816
817   /* We need an extra case for machines where HOST_BITS_PER_WIDE_INT is the
818      same as sizeof (double) or when sizeof (float) is larger than the
819      size of a word on the target machine.  */
820 #ifdef REAL_ARITHMETIC
821   else if (mode == SFmode && GET_CODE (x) == CONST_INT)
822     {
823       REAL_VALUE_TYPE r;
824       HOST_WIDE_INT i;
825
826       i = INTVAL (x);
827       r = REAL_VALUE_FROM_TARGET_SINGLE (i);
828       return CONST_DOUBLE_FROM_REAL_VALUE (r, mode);
829     }
830 #endif
831
832   /* Similarly, if this is converting a floating-point value into a
833      single-word integer.  Only do this is the host and target parameters are
834      compatible.  */
835
836   else if (((HOST_FLOAT_FORMAT == TARGET_FLOAT_FORMAT
837              && HOST_BITS_PER_WIDE_INT == BITS_PER_WORD)
838             || flag_pretend_float)
839            && (GET_MODE_CLASS (mode) == MODE_INT
840                || GET_MODE_CLASS (mode) == MODE_PARTIAL_INT)
841            && GET_CODE (x) == CONST_DOUBLE
842            && GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT
843            && GET_MODE_BITSIZE (mode) == BITS_PER_WORD)
844     return operand_subword (x, word, 0, GET_MODE (x));
845
846   /* Similarly, if this is converting a floating-point value into a
847      two-word integer, we can do this one word at a time and make an
848      integer.  Only do this is the host and target parameters are
849      compatible.  */
850
851   else if (((HOST_FLOAT_FORMAT == TARGET_FLOAT_FORMAT
852              && HOST_BITS_PER_WIDE_INT == BITS_PER_WORD)
853             || flag_pretend_float)
854            && (GET_MODE_CLASS (mode) == MODE_INT
855                || GET_MODE_CLASS (mode) == MODE_PARTIAL_INT)
856            && GET_CODE (x) == CONST_DOUBLE
857            && GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT
858            && GET_MODE_BITSIZE (mode) == 2 * BITS_PER_WORD)
859     {
860       rtx lowpart
861         = operand_subword (x, word + WORDS_BIG_ENDIAN, 0, GET_MODE (x));
862       rtx highpart
863         = operand_subword (x, word + ! WORDS_BIG_ENDIAN, 0, GET_MODE (x));
864
865       if (lowpart && GET_CODE (lowpart) == CONST_INT
866           && highpart && GET_CODE (highpart) == CONST_INT)
867         return immed_double_const (INTVAL (lowpart), INTVAL (highpart), mode);
868     }
869
870   /* Otherwise, we can't do this.  */
871   return 0;
872 }
873 \f
874 /* Return the real part (which has mode MODE) of a complex value X.
875    This always comes at the low address in memory.  */
876
877 rtx
878 gen_realpart (mode, x)
879      enum machine_mode mode;
880      register rtx x;
881 {
882   if (GET_CODE (x) == CONCAT && GET_MODE (XEXP (x, 0)) == mode)
883     return XEXP (x, 0);
884   else if (WORDS_BIG_ENDIAN)
885     return gen_highpart (mode, x);
886   else
887     return gen_lowpart (mode, x);
888 }
889
890 /* Return the imaginary part (which has mode MODE) of a complex value X.
891    This always comes at the high address in memory.  */
892
893 rtx
894 gen_imagpart (mode, x)
895      enum machine_mode mode;
896      register rtx x;
897 {
898   if (GET_CODE (x) == CONCAT && GET_MODE (XEXP (x, 0)) == mode)
899     return XEXP (x, 1);
900   else if (WORDS_BIG_ENDIAN)
901     return gen_lowpart (mode, x);
902   else
903     return gen_highpart (mode, x);
904 }
905
906 /* Return 1 iff X, assumed to be a SUBREG,
907    refers to the real part of the complex value in its containing reg.
908    Complex values are always stored with the real part in the first word,
909    regardless of WORDS_BIG_ENDIAN.  */
910
911 int
912 subreg_realpart_p (x)
913      rtx x;
914 {
915   if (GET_CODE (x) != SUBREG)
916     abort ();
917
918   return SUBREG_WORD (x) == 0;
919 }
920 \f
921 /* Assuming that X is an rtx (e.g., MEM, REG or SUBREG) for a value,
922    return an rtx (MEM, SUBREG, or CONST_INT) that refers to the
923    least-significant part of X.
924    MODE specifies how big a part of X to return;
925    it usually should not be larger than a word.
926    If X is a MEM whose address is a QUEUED, the value may be so also.  */
927
928 rtx
929 gen_lowpart (mode, x)
930      enum machine_mode mode;
931      register rtx x;
932 {
933   rtx result = gen_lowpart_common (mode, x);
934
935   if (result)
936     return result;
937   else if (GET_CODE (x) == REG)
938     {
939       /* Must be a hard reg that's not valid in MODE.  */
940       result = gen_lowpart_common (mode, copy_to_reg (x));
941       if (result == 0)
942         abort ();
943       return result;
944     }
945   else if (GET_CODE (x) == MEM)
946     {
947       /* The only additional case we can do is MEM.  */
948       register int offset = 0;
949       if (WORDS_BIG_ENDIAN)
950         offset = (MAX (GET_MODE_SIZE (GET_MODE (x)), UNITS_PER_WORD)
951                   - MAX (GET_MODE_SIZE (mode), UNITS_PER_WORD));
952
953       if (BYTES_BIG_ENDIAN)
954         /* Adjust the address so that the address-after-the-data
955            is unchanged.  */
956         offset -= (MIN (UNITS_PER_WORD, GET_MODE_SIZE (mode))
957                    - MIN (UNITS_PER_WORD, GET_MODE_SIZE (GET_MODE (x))));
958
959       return change_address (x, mode, plus_constant (XEXP (x, 0), offset));
960     }
961   else if (GET_CODE (x) == ADDRESSOF)
962     return gen_lowpart (mode, force_reg (GET_MODE (x), x));
963   else
964     abort ();
965 }
966
967 /* Like `gen_lowpart', but refer to the most significant part. 
968    This is used to access the imaginary part of a complex number.  */
969
970 rtx
971 gen_highpart (mode, x)
972      enum machine_mode mode;
973      register rtx x;
974 {
975   /* This case loses if X is a subreg.  To catch bugs early,
976      complain if an invalid MODE is used even in other cases.  */
977   if (GET_MODE_SIZE (mode) > UNITS_PER_WORD
978       && GET_MODE_SIZE (mode) != GET_MODE_UNIT_SIZE (GET_MODE (x)))
979     abort ();
980   if (GET_CODE (x) == CONST_DOUBLE
981 #if !(TARGET_FLOAT_FORMAT != HOST_FLOAT_FORMAT || defined (REAL_IS_NOT_DOUBLE))
982       && GET_MODE_CLASS (GET_MODE (x)) != MODE_FLOAT
983 #endif
984       )
985     return GEN_INT (CONST_DOUBLE_HIGH (x) & GET_MODE_MASK (mode));
986   else if (GET_CODE (x) == CONST_INT)
987     return const0_rtx;
988   else if (GET_CODE (x) == MEM)
989     {
990       register int offset = 0;
991       if (! WORDS_BIG_ENDIAN)
992         offset = (MAX (GET_MODE_SIZE (GET_MODE (x)), UNITS_PER_WORD)
993                   - MAX (GET_MODE_SIZE (mode), UNITS_PER_WORD));
994
995       if (! BYTES_BIG_ENDIAN
996           && GET_MODE_SIZE (mode) < UNITS_PER_WORD)
997         offset -= (GET_MODE_SIZE (mode)
998                    - MIN (UNITS_PER_WORD,
999                           GET_MODE_SIZE (GET_MODE (x))));
1000
1001       return change_address (x, mode, plus_constant (XEXP (x, 0), offset));
1002     }
1003   else if (GET_CODE (x) == SUBREG)
1004     {
1005       /* The only time this should occur is when we are looking at a
1006          multi-word item with a SUBREG whose mode is the same as that of the
1007          item.  It isn't clear what we would do if it wasn't.  */
1008       if (SUBREG_WORD (x) != 0)
1009         abort ();
1010       return gen_highpart (mode, SUBREG_REG (x));
1011     }
1012   else if (GET_CODE (x) == REG)
1013     {
1014       int word = 0;
1015
1016       /* Let the backend decide how many registers to skip.  This is needed
1017          in particular for sparc64 where fp regs are smaller than a word.  */
1018       /* ??? Note that subregs are now ambiguous, in that those against
1019          pseudos are sized by the Word Size, while those against hard
1020          regs are sized by the underlying register size.  Better would be
1021          to always interpret the subreg offset parameter as bytes or bits.  */
1022
1023       if (! WORDS_BIG_ENDIAN && REGNO (x) < FIRST_PSEUDO_REGISTER)
1024         word = (HARD_REGNO_NREGS (REGNO (x), GET_MODE (x))
1025                 - HARD_REGNO_NREGS (REGNO (x), mode));
1026
1027       if (REGNO (x) < FIRST_PSEUDO_REGISTER
1028           /* integrate.c can't handle parts of a return value register.  */
1029           && (! REG_FUNCTION_VALUE_P (x)
1030               || ! rtx_equal_function_value_matters)
1031           /* We want to keep the stack, frame, and arg pointers special.  */
1032           && x != frame_pointer_rtx
1033 #if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
1034           && x != arg_pointer_rtx
1035 #endif
1036           && x != stack_pointer_rtx)
1037         return gen_rtx_REG (mode, REGNO (x) + word);
1038       else
1039         return gen_rtx_SUBREG (mode, x, word);
1040     }
1041   else
1042     abort ();
1043 }
1044
1045 /* Return 1 iff X, assumed to be a SUBREG,
1046    refers to the least significant part of its containing reg.
1047    If X is not a SUBREG, always return 1 (it is its own low part!).  */
1048
1049 int
1050 subreg_lowpart_p (x)
1051      rtx x;
1052 {
1053   if (GET_CODE (x) != SUBREG)
1054     return 1;
1055   else if (GET_MODE (SUBREG_REG (x)) == VOIDmode)
1056     return 0;
1057
1058   if (WORDS_BIG_ENDIAN
1059       && GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))) > UNITS_PER_WORD)
1060     return (SUBREG_WORD (x)
1061             == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (x)))
1062                  - MAX (GET_MODE_SIZE (GET_MODE (x)), UNITS_PER_WORD))
1063                 / UNITS_PER_WORD));
1064
1065   return SUBREG_WORD (x) == 0;
1066 }
1067 \f
1068 /* Return subword I of operand OP.
1069    The word number, I, is interpreted as the word number starting at the
1070    low-order address.  Word 0 is the low-order word if not WORDS_BIG_ENDIAN,
1071    otherwise it is the high-order word.
1072
1073    If we cannot extract the required word, we return zero.  Otherwise, an
1074    rtx corresponding to the requested word will be returned.
1075
1076    VALIDATE_ADDRESS is nonzero if the address should be validated.  Before
1077    reload has completed, a valid address will always be returned.  After
1078    reload, if a valid address cannot be returned, we return zero.
1079
1080    If VALIDATE_ADDRESS is zero, we simply form the required address; validating
1081    it is the responsibility of the caller.
1082
1083    MODE is the mode of OP in case it is a CONST_INT.  */
1084
1085 rtx
1086 operand_subword (op, i, validate_address, mode)
1087      rtx op;
1088      int i;
1089      int validate_address;
1090      enum machine_mode mode;
1091 {
1092   HOST_WIDE_INT val;
1093   int size_ratio = HOST_BITS_PER_WIDE_INT / BITS_PER_WORD;
1094
1095   if (mode == VOIDmode)
1096     mode = GET_MODE (op);
1097
1098   if (mode == VOIDmode)
1099     abort ();
1100
1101   /* If OP is narrower than a word or if we want a word outside OP, fail.  */
1102   if (mode != BLKmode
1103       && (GET_MODE_SIZE (mode) < UNITS_PER_WORD
1104           || (i + 1) * UNITS_PER_WORD > GET_MODE_SIZE (mode)))
1105     return 0;
1106
1107   /* If OP is already an integer word, return it.  */
1108   if (GET_MODE_CLASS (mode) == MODE_INT
1109       && GET_MODE_SIZE (mode) == UNITS_PER_WORD)
1110     return op;
1111
1112   /* If OP is a REG or SUBREG, we can handle it very simply.  */
1113   if (GET_CODE (op) == REG)
1114     {
1115       /* If the register is not valid for MODE, return 0.  If we don't
1116          do this, there is no way to fix up the resulting REG later.  */
1117       if (REGNO (op) < FIRST_PSEUDO_REGISTER
1118           && ! HARD_REGNO_MODE_OK (REGNO (op) + i, word_mode))
1119         return 0;
1120       else if (REGNO (op) >= FIRST_PSEUDO_REGISTER
1121                || (REG_FUNCTION_VALUE_P (op)
1122                    && rtx_equal_function_value_matters)
1123                /* We want to keep the stack, frame, and arg pointers
1124                   special.  */
1125                || op == frame_pointer_rtx
1126 #if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
1127                || op == arg_pointer_rtx
1128 #endif
1129                || op == stack_pointer_rtx)
1130         return gen_rtx_SUBREG (word_mode, op, i);
1131       else
1132         return gen_rtx_REG (word_mode, REGNO (op) + i);
1133     }
1134   else if (GET_CODE (op) == SUBREG)
1135     return gen_rtx_SUBREG (word_mode, SUBREG_REG (op), i + SUBREG_WORD (op));
1136   else if (GET_CODE (op) == CONCAT)
1137     {
1138       int partwords = GET_MODE_UNIT_SIZE (GET_MODE (op)) / UNITS_PER_WORD;
1139       if (i < partwords)
1140         return operand_subword (XEXP (op, 0), i, validate_address, mode);
1141       return operand_subword (XEXP (op, 1), i - partwords,
1142                               validate_address, mode);
1143     }
1144
1145   /* Form a new MEM at the requested address.  */
1146   if (GET_CODE (op) == MEM)
1147     {
1148       rtx addr = plus_constant (XEXP (op, 0), i * UNITS_PER_WORD);
1149       rtx new;
1150
1151       if (validate_address)
1152         {
1153           if (reload_completed)
1154             {
1155               if (! strict_memory_address_p (word_mode, addr))
1156                 return 0;
1157             }
1158           else
1159             addr = memory_address (word_mode, addr);
1160         }
1161
1162       new = gen_rtx_MEM (word_mode, addr);
1163
1164       MEM_VOLATILE_P (new) = MEM_VOLATILE_P (op);
1165       MEM_IN_STRUCT_P (new) = MEM_IN_STRUCT_P (op);
1166       RTX_UNCHANGING_P (new) = RTX_UNCHANGING_P (op);
1167
1168       return new;
1169     }
1170
1171   /* The only remaining cases are when OP is a constant.  If the host and
1172      target floating formats are the same, handling two-word floating
1173      constants are easy.  Note that REAL_VALUE_TO_TARGET_{SINGLE,DOUBLE}
1174      are defined as returning one or two 32 bit values, respectively,
1175      and not values of BITS_PER_WORD bits.  */
1176 #ifdef REAL_ARITHMETIC
1177 /*  The output is some bits, the width of the target machine's word.
1178     A wider-word host can surely hold them in a CONST_INT. A narrower-word
1179     host can't.  */
1180   if (HOST_BITS_PER_WIDE_INT >= BITS_PER_WORD
1181       && GET_MODE_CLASS (mode) == MODE_FLOAT
1182       && GET_MODE_BITSIZE (mode) == 64
1183       && GET_CODE (op) == CONST_DOUBLE)
1184     {
1185       long k[2];
1186       REAL_VALUE_TYPE rv;
1187
1188       REAL_VALUE_FROM_CONST_DOUBLE (rv, op);
1189       REAL_VALUE_TO_TARGET_DOUBLE (rv, k);
1190
1191       /* We handle 32-bit and >= 64-bit words here.  Note that the order in
1192          which the words are written depends on the word endianness.
1193
1194          ??? This is a potential portability problem and should
1195          be fixed at some point.  */
1196       if (BITS_PER_WORD == 32)
1197         return GEN_INT ((HOST_WIDE_INT) k[i]);
1198 #if HOST_BITS_PER_WIDE_INT > 32
1199       else if (BITS_PER_WORD >= 64 && i == 0)
1200         return GEN_INT ((((HOST_WIDE_INT) k[! WORDS_BIG_ENDIAN]) << 32)
1201                         | (HOST_WIDE_INT) k[WORDS_BIG_ENDIAN]);
1202 #endif
1203       else if (BITS_PER_WORD == 16)
1204         {
1205           long value;
1206           value = k[i >> 1];
1207           if ((i & 0x1) == !WORDS_BIG_ENDIAN)
1208             value >>= 16;
1209           value &= 0xffff;
1210           return GEN_INT ((HOST_WIDE_INT) value);
1211         }
1212       else
1213         abort ();
1214     }
1215   else if (HOST_BITS_PER_WIDE_INT >= BITS_PER_WORD
1216            && GET_MODE_CLASS (mode) == MODE_FLOAT
1217            && GET_MODE_BITSIZE (mode) > 64
1218            && GET_CODE (op) == CONST_DOUBLE)
1219   {
1220     long k[4];
1221     REAL_VALUE_TYPE rv;
1222
1223     REAL_VALUE_FROM_CONST_DOUBLE (rv, op);
1224     REAL_VALUE_TO_TARGET_LONG_DOUBLE (rv, k);
1225
1226     if (BITS_PER_WORD == 32)
1227       return GEN_INT ((HOST_WIDE_INT) k[i]);
1228   }
1229 #else /* no REAL_ARITHMETIC */
1230   if (((HOST_FLOAT_FORMAT == TARGET_FLOAT_FORMAT
1231         && HOST_BITS_PER_WIDE_INT == BITS_PER_WORD)
1232        || flag_pretend_float)
1233       && GET_MODE_CLASS (mode) == MODE_FLOAT
1234       && GET_MODE_SIZE (mode) == 2 * UNITS_PER_WORD
1235       && GET_CODE (op) == CONST_DOUBLE)
1236     {
1237       /* The constant is stored in the host's word-ordering,
1238          but we want to access it in the target's word-ordering.  Some
1239          compilers don't like a conditional inside macro args, so we have two
1240          copies of the return.  */
1241 #ifdef HOST_WORDS_BIG_ENDIAN
1242       return GEN_INT (i == WORDS_BIG_ENDIAN
1243                       ? CONST_DOUBLE_HIGH (op) : CONST_DOUBLE_LOW (op));
1244 #else
1245       return GEN_INT (i != WORDS_BIG_ENDIAN
1246                       ? CONST_DOUBLE_HIGH (op) : CONST_DOUBLE_LOW (op));
1247 #endif
1248     }
1249 #endif /* no REAL_ARITHMETIC */
1250
1251   /* Single word float is a little harder, since single- and double-word
1252      values often do not have the same high-order bits.  We have already
1253      verified that we want the only defined word of the single-word value.  */
1254 #ifdef REAL_ARITHMETIC
1255   if (GET_MODE_CLASS (mode) == MODE_FLOAT
1256       && GET_MODE_BITSIZE (mode) == 32
1257       && GET_CODE (op) == CONST_DOUBLE)
1258     {
1259       long l;
1260       REAL_VALUE_TYPE rv;
1261
1262       REAL_VALUE_FROM_CONST_DOUBLE (rv, op);
1263       REAL_VALUE_TO_TARGET_SINGLE (rv, l);
1264
1265       if (BITS_PER_WORD == 16)
1266         {
1267           if ((i & 0x1) == !WORDS_BIG_ENDIAN)
1268             l >>= 16;
1269           l &= 0xffff;
1270         }
1271       return GEN_INT ((HOST_WIDE_INT) l);
1272     }
1273 #else
1274   if (((HOST_FLOAT_FORMAT == TARGET_FLOAT_FORMAT
1275         && HOST_BITS_PER_WIDE_INT == BITS_PER_WORD)
1276        || flag_pretend_float)
1277       && sizeof (float) * 8 == HOST_BITS_PER_WIDE_INT
1278       && GET_MODE_CLASS (mode) == MODE_FLOAT
1279       && GET_MODE_SIZE (mode) == UNITS_PER_WORD
1280       && GET_CODE (op) == CONST_DOUBLE)
1281     {
1282       double d;
1283       union {float f; HOST_WIDE_INT i; } u;
1284
1285       REAL_VALUE_FROM_CONST_DOUBLE (d, op);
1286
1287       u.f = d;
1288       return GEN_INT (u.i);
1289     }
1290   if (((HOST_FLOAT_FORMAT == TARGET_FLOAT_FORMAT
1291         && HOST_BITS_PER_WIDE_INT == BITS_PER_WORD)
1292        || flag_pretend_float)
1293       && sizeof (double) * 8 == HOST_BITS_PER_WIDE_INT
1294       && GET_MODE_CLASS (mode) == MODE_FLOAT
1295       && GET_MODE_SIZE (mode) == UNITS_PER_WORD
1296       && GET_CODE (op) == CONST_DOUBLE)
1297     {
1298       double d;
1299       union {double d; HOST_WIDE_INT i; } u;
1300
1301       REAL_VALUE_FROM_CONST_DOUBLE (d, op);
1302
1303       u.d = d;
1304       return GEN_INT (u.i);
1305     }
1306 #endif /* no REAL_ARITHMETIC */
1307       
1308   /* The only remaining cases that we can handle are integers.
1309      Convert to proper endianness now since these cases need it.
1310      At this point, i == 0 means the low-order word.  
1311
1312      We do not want to handle the case when BITS_PER_WORD <= HOST_BITS_PER_INT
1313      in general.  However, if OP is (const_int 0), we can just return
1314      it for any word.  */
1315
1316   if (op == const0_rtx)
1317     return op;
1318
1319   if (GET_MODE_CLASS (mode) != MODE_INT
1320       || (GET_CODE (op) != CONST_INT && GET_CODE (op) != CONST_DOUBLE)
1321       || BITS_PER_WORD > HOST_BITS_PER_WIDE_INT)
1322     return 0;
1323
1324   if (WORDS_BIG_ENDIAN)
1325     i = GET_MODE_SIZE (mode) / UNITS_PER_WORD - 1 - i;
1326
1327   /* Find out which word on the host machine this value is in and get
1328      it from the constant.  */
1329   val = (i / size_ratio == 0
1330          ? (GET_CODE (op) == CONST_INT ? INTVAL (op) : CONST_DOUBLE_LOW (op))
1331          : (GET_CODE (op) == CONST_INT
1332             ? (INTVAL (op) < 0 ? ~0 : 0) : CONST_DOUBLE_HIGH (op)));
1333
1334   /* Get the value we want into the low bits of val.  */
1335   if (BITS_PER_WORD < HOST_BITS_PER_WIDE_INT)
1336     val = ((val >> ((i % size_ratio) * BITS_PER_WORD)));
1337
1338   /* Clear the bits that don't belong in our mode, unless they and our sign
1339      bit are all one.  So we get either a reasonable negative value or a
1340      reasonable unsigned value for this mode.  */
1341   if (BITS_PER_WORD < HOST_BITS_PER_WIDE_INT
1342       && ((val & ((HOST_WIDE_INT) (-1) << (BITS_PER_WORD - 1)))
1343           != ((HOST_WIDE_INT) (-1) << (BITS_PER_WORD - 1))))
1344     val &= ((HOST_WIDE_INT) 1 << BITS_PER_WORD) - 1;
1345
1346   /* If this would be an entire word for the target, but is not for
1347      the host, then sign-extend on the host so that the number will look
1348      the same way on the host that it would on the target.
1349
1350      For example, when building a 64 bit alpha hosted 32 bit sparc
1351      targeted compiler, then we want the 32 bit unsigned value -1 to be
1352      represented as a 64 bit value -1, and not as 0x00000000ffffffff.
1353      The later confuses the sparc backend.  */
1354
1355   if (BITS_PER_WORD < HOST_BITS_PER_WIDE_INT
1356       && (val & ((HOST_WIDE_INT) 1 << (BITS_PER_WORD - 1))))
1357     val |= ((HOST_WIDE_INT) (-1) << BITS_PER_WORD);
1358
1359   return GEN_INT (val);
1360 }
1361
1362 /* Similar to `operand_subword', but never return 0.  If we can't extract
1363    the required subword, put OP into a register and try again.  If that fails,
1364    abort.  We always validate the address in this case.  It is not valid
1365    to call this function after reload; it is mostly meant for RTL
1366    generation. 
1367
1368    MODE is the mode of OP, in case it is CONST_INT.  */
1369
1370 rtx
1371 operand_subword_force (op, i, mode)
1372      rtx op;
1373      int i;
1374      enum machine_mode mode;
1375 {
1376   rtx result = operand_subword (op, i, 1, mode);
1377
1378   if (result)
1379     return result;
1380
1381   if (mode != BLKmode && mode != VOIDmode)
1382     op = force_reg (mode, op);
1383
1384   result = operand_subword (op, i, 1, mode);
1385   if (result == 0)
1386     abort ();
1387
1388   return result;
1389 }
1390 \f
1391 /* Given a compare instruction, swap the operands.
1392    A test instruction is changed into a compare of 0 against the operand.  */
1393
1394 void
1395 reverse_comparison (insn)
1396      rtx insn;
1397 {
1398   rtx body = PATTERN (insn);
1399   rtx comp;
1400
1401   if (GET_CODE (body) == SET)
1402     comp = SET_SRC (body);
1403   else
1404     comp = SET_SRC (XVECEXP (body, 0, 0));
1405
1406   if (GET_CODE (comp) == COMPARE)
1407     {
1408       rtx op0 = XEXP (comp, 0);
1409       rtx op1 = XEXP (comp, 1);
1410       XEXP (comp, 0) = op1;
1411       XEXP (comp, 1) = op0;
1412     }
1413   else
1414     {
1415       rtx new = gen_rtx_COMPARE (VOIDmode, CONST0_RTX (GET_MODE (comp)), comp);
1416       if (GET_CODE (body) == SET)
1417         SET_SRC (body) = new;
1418       else
1419         SET_SRC (XVECEXP (body, 0, 0)) = new;
1420     }
1421 }
1422 \f
1423 /* Return a memory reference like MEMREF, but with its mode changed
1424    to MODE and its address changed to ADDR.
1425    (VOIDmode means don't change the mode.
1426    NULL for ADDR means don't change the address.)  */
1427
1428 rtx
1429 change_address (memref, mode, addr)
1430      rtx memref;
1431      enum machine_mode mode;
1432      rtx addr;
1433 {
1434   rtx new;
1435
1436   if (GET_CODE (memref) != MEM)
1437     abort ();
1438   if (mode == VOIDmode)
1439     mode = GET_MODE (memref);
1440   if (addr == 0)
1441     addr = XEXP (memref, 0);
1442
1443   /* If reload is in progress or has completed, ADDR must be valid.
1444      Otherwise, we can call memory_address to make it valid.  */
1445   if (reload_completed || reload_in_progress)
1446     {
1447       if (! memory_address_p (mode, addr))
1448         abort ();
1449     }
1450   else
1451     addr = memory_address (mode, addr);
1452         
1453   if (rtx_equal_p (addr, XEXP (memref, 0)) && mode == GET_MODE (memref))
1454     return memref;
1455
1456   new = gen_rtx_MEM (mode, addr);
1457   MEM_VOLATILE_P (new) = MEM_VOLATILE_P (memref);
1458   RTX_UNCHANGING_P (new) = RTX_UNCHANGING_P (memref);
1459   MEM_IN_STRUCT_P (new) = MEM_IN_STRUCT_P (memref);
1460   return new;
1461 }
1462 \f
1463 /* Return a newly created CODE_LABEL rtx with a unique label number.  */
1464
1465 rtx
1466 gen_label_rtx ()
1467 {
1468   register rtx label;
1469
1470   label = gen_rtx_CODE_LABEL (VOIDmode, 0, NULL_RTX,
1471                               NULL_RTX, label_num++, NULL_PTR);
1472
1473   LABEL_NUSES (label) = 0;
1474   return label;
1475 }
1476 \f
1477 /* For procedure integration.  */
1478
1479 /* Return a newly created INLINE_HEADER rtx.  Should allocate this
1480    from a permanent obstack when the opportunity arises.  */
1481
1482 rtx
1483 gen_inline_header_rtx (first_insn, first_parm_insn, first_labelno,
1484                        last_labelno, max_parm_regnum, max_regnum, args_size,
1485                        pops_args, stack_slots, forced_labels, function_flags,
1486                        outgoing_args_size, original_arg_vector,
1487                        original_decl_initial, regno_rtx, regno_flag,
1488                        regno_align, parm_reg_stack_loc)
1489      rtx first_insn, first_parm_insn;
1490      int first_labelno, last_labelno, max_parm_regnum, max_regnum, args_size;
1491      int pops_args;
1492      rtx stack_slots;
1493      rtx forced_labels;
1494      int function_flags;
1495      int outgoing_args_size;
1496      rtvec original_arg_vector;
1497      rtx original_decl_initial;
1498      rtvec regno_rtx;
1499      char *regno_flag;
1500      char *regno_align;
1501      rtvec parm_reg_stack_loc;
1502 {
1503   rtx header = gen_rtx_INLINE_HEADER (VOIDmode,
1504                                       cur_insn_uid++, NULL_RTX,
1505                                       first_insn, first_parm_insn,
1506                                       first_labelno, last_labelno,
1507                                       max_parm_regnum, max_regnum, args_size,
1508                                       pops_args, stack_slots, forced_labels,
1509                                       function_flags, outgoing_args_size,
1510                                       original_arg_vector,
1511                                       original_decl_initial,
1512                                       regno_rtx, regno_flag, regno_align,
1513                                       parm_reg_stack_loc);
1514   return header;
1515 }
1516
1517 /* Install new pointers to the first and last insns in the chain.
1518    Also, set cur_insn_uid to one higher than the last in use.
1519    Used for an inline-procedure after copying the insn chain.  */
1520
1521 void
1522 set_new_first_and_last_insn (first, last)
1523      rtx first, last;
1524 {
1525   rtx insn;
1526
1527   first_insn = first;
1528   last_insn = last;
1529   cur_insn_uid = 0;
1530
1531   for (insn = first; insn; insn = NEXT_INSN (insn))
1532     cur_insn_uid = MAX (cur_insn_uid, INSN_UID (insn));
1533
1534   cur_insn_uid++;
1535 }
1536
1537 /* Set the range of label numbers found in the current function.
1538    This is used when belatedly compiling an inline function.  */
1539
1540 void
1541 set_new_first_and_last_label_num (first, last)
1542      int first, last;
1543 {
1544   base_label_num = label_num;
1545   first_label_num = first;
1546   last_label_num = last;
1547 }
1548 \f
1549 /* Save all variables describing the current status into the structure *P.
1550    This is used before starting a nested function.  */
1551
1552 void
1553 save_emit_status (p)
1554      struct function *p;
1555 {
1556   p->reg_rtx_no = reg_rtx_no;
1557   p->first_label_num = first_label_num;
1558   p->first_insn = first_insn;
1559   p->last_insn = last_insn;
1560   p->sequence_rtl_expr = sequence_rtl_expr;
1561   p->sequence_stack = sequence_stack;
1562   p->cur_insn_uid = cur_insn_uid;
1563   p->last_linenum = last_linenum;
1564   p->last_filename = last_filename;
1565   p->regno_pointer_flag = regno_pointer_flag;
1566   p->regno_pointer_align = regno_pointer_align;
1567   p->regno_pointer_flag_length = regno_pointer_flag_length;
1568   p->regno_reg_rtx = regno_reg_rtx;
1569 }
1570
1571 /* Restore all variables describing the current status from the structure *P.
1572    This is used after a nested function.  */
1573
1574 void
1575 restore_emit_status (p)
1576      struct function *p;
1577 {
1578   int i;
1579
1580   reg_rtx_no = p->reg_rtx_no;
1581   first_label_num = p->first_label_num;
1582   last_label_num = 0;
1583   first_insn = p->first_insn;
1584   last_insn = p->last_insn;
1585   sequence_rtl_expr = p->sequence_rtl_expr;
1586   sequence_stack = p->sequence_stack;
1587   cur_insn_uid = p->cur_insn_uid;
1588   last_linenum = p->last_linenum;
1589   last_filename = p->last_filename;
1590   regno_pointer_flag = p->regno_pointer_flag;
1591   regno_pointer_align = p->regno_pointer_align;
1592   regno_pointer_flag_length = p->regno_pointer_flag_length;
1593   regno_reg_rtx = p->regno_reg_rtx;
1594
1595   /* Clear our cache of rtx expressions for start_sequence and
1596      gen_sequence.  */
1597   sequence_element_free_list = 0;
1598   for (i = 0; i < SEQUENCE_RESULT_SIZE; i++)
1599     sequence_result[i] = 0;
1600
1601   free_insn = 0;
1602 }
1603 \f
1604 /* Go through all the RTL insn bodies and copy any invalid shared structure.
1605    It does not work to do this twice, because the mark bits set here
1606    are not cleared afterwards.  */
1607
1608 void
1609 unshare_all_rtl (insn)
1610      register rtx insn;
1611 {
1612   for (; insn; insn = NEXT_INSN (insn))
1613     if (GET_CODE (insn) == INSN || GET_CODE (insn) == JUMP_INSN
1614         || GET_CODE (insn) == CALL_INSN)
1615       {
1616         PATTERN (insn) = copy_rtx_if_shared (PATTERN (insn));
1617         REG_NOTES (insn) = copy_rtx_if_shared (REG_NOTES (insn));
1618         LOG_LINKS (insn) = copy_rtx_if_shared (LOG_LINKS (insn));
1619       }
1620
1621   /* Make sure the addresses of stack slots found outside the insn chain
1622      (such as, in DECL_RTL of a variable) are not shared
1623      with the insn chain.
1624
1625      This special care is necessary when the stack slot MEM does not
1626      actually appear in the insn chain.  If it does appear, its address
1627      is unshared from all else at that point.  */
1628
1629   copy_rtx_if_shared (stack_slot_list);
1630 }
1631
1632 /* Mark ORIG as in use, and return a copy of it if it was already in use.
1633    Recursively does the same for subexpressions.  */
1634
1635 rtx
1636 copy_rtx_if_shared (orig)
1637      rtx orig;
1638 {
1639   register rtx x = orig;
1640   register int i;
1641   register enum rtx_code code;
1642   register char *format_ptr;
1643   int copied = 0;
1644
1645   if (x == 0)
1646     return 0;
1647
1648   code = GET_CODE (x);
1649
1650   /* These types may be freely shared.  */
1651
1652   switch (code)
1653     {
1654     case REG:
1655     case QUEUED:
1656     case CONST_INT:
1657     case CONST_DOUBLE:
1658     case SYMBOL_REF:
1659     case CODE_LABEL:
1660     case PC:
1661     case CC0:
1662     case SCRATCH:
1663       /* SCRATCH must be shared because they represent distinct values.  */
1664       return x;
1665
1666     case CONST:
1667       /* CONST can be shared if it contains a SYMBOL_REF.  If it contains
1668          a LABEL_REF, it isn't sharable.  */
1669       if (GET_CODE (XEXP (x, 0)) == PLUS
1670           && GET_CODE (XEXP (XEXP (x, 0), 0)) == SYMBOL_REF
1671           && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT)
1672         return x;
1673       break;
1674
1675     case INSN:
1676     case JUMP_INSN:
1677     case CALL_INSN:
1678     case NOTE:
1679     case BARRIER:
1680       /* The chain of insns is not being copied.  */
1681       return x;
1682
1683     case MEM:
1684       /* A MEM is allowed to be shared if its address is constant
1685          or is a constant plus one of the special registers.  */
1686       if (CONSTANT_ADDRESS_P (XEXP (x, 0))
1687           || XEXP (x, 0) == virtual_stack_vars_rtx
1688           || XEXP (x, 0) == virtual_incoming_args_rtx)
1689         return x;
1690
1691       if (GET_CODE (XEXP (x, 0)) == PLUS
1692           && (XEXP (XEXP (x, 0), 0) == virtual_stack_vars_rtx
1693               || XEXP (XEXP (x, 0), 0) == virtual_incoming_args_rtx)
1694           && CONSTANT_ADDRESS_P (XEXP (XEXP (x, 0), 1)))
1695         {
1696           /* This MEM can appear in more than one place,
1697              but its address better not be shared with anything else.  */
1698           if (! x->used)
1699             XEXP (x, 0) = copy_rtx_if_shared (XEXP (x, 0));
1700           x->used = 1;
1701           return x;
1702         }
1703       break;
1704
1705     default:
1706       break;
1707     }
1708
1709   /* This rtx may not be shared.  If it has already been seen,
1710      replace it with a copy of itself.  */
1711
1712   if (x->used)
1713     {
1714       register rtx copy;
1715
1716       copy = rtx_alloc (code);
1717       bcopy ((char *) x, (char *) copy,
1718              (sizeof (*copy) - sizeof (copy->fld)
1719               + sizeof (copy->fld[0]) * GET_RTX_LENGTH (code)));
1720       x = copy;
1721       copied = 1;
1722     }
1723   x->used = 1;
1724
1725   /* Now scan the subexpressions recursively.
1726      We can store any replaced subexpressions directly into X
1727      since we know X is not shared!  Any vectors in X
1728      must be copied if X was copied.  */
1729
1730   format_ptr = GET_RTX_FORMAT (code);
1731
1732   for (i = 0; i < GET_RTX_LENGTH (code); i++)
1733     {
1734       switch (*format_ptr++)
1735         {
1736         case 'e':
1737           XEXP (x, i) = copy_rtx_if_shared (XEXP (x, i));
1738           break;
1739
1740         case 'E':
1741           if (XVEC (x, i) != NULL)
1742             {
1743               register int j;
1744               int len = XVECLEN (x, i);
1745
1746               if (copied && len > 0)
1747                 XVEC (x, i) = gen_rtvec_vv (len, XVEC (x, i)->elem);
1748               for (j = 0; j < len; j++)
1749                 XVECEXP (x, i, j) = copy_rtx_if_shared (XVECEXP (x, i, j));
1750             }
1751           break;
1752         }
1753     }
1754   return x;
1755 }
1756
1757 /* Clear all the USED bits in X to allow copy_rtx_if_shared to be used
1758    to look for shared sub-parts.  */
1759
1760 void
1761 reset_used_flags (x)
1762      rtx x;
1763 {
1764   register int i, j;
1765   register enum rtx_code code;
1766   register char *format_ptr;
1767
1768   if (x == 0)
1769     return;
1770
1771   code = GET_CODE (x);
1772
1773   /* These types may be freely shared so we needn't do any resetting
1774      for them.  */
1775
1776   switch (code)
1777     {
1778     case REG:
1779     case QUEUED:
1780     case CONST_INT:
1781     case CONST_DOUBLE:
1782     case SYMBOL_REF:
1783     case CODE_LABEL:
1784     case PC:
1785     case CC0:
1786       return;
1787
1788     case INSN:
1789     case JUMP_INSN:
1790     case CALL_INSN:
1791     case NOTE:
1792     case LABEL_REF:
1793     case BARRIER:
1794       /* The chain of insns is not being copied.  */
1795       return;
1796       
1797     default:
1798       break;
1799     }
1800
1801   x->used = 0;
1802
1803   format_ptr = GET_RTX_FORMAT (code);
1804   for (i = 0; i < GET_RTX_LENGTH (code); i++)
1805     {
1806       switch (*format_ptr++)
1807         {
1808         case 'e':
1809           reset_used_flags (XEXP (x, i));
1810           break;
1811
1812         case 'E':
1813           for (j = 0; j < XVECLEN (x, i); j++)
1814             reset_used_flags (XVECEXP (x, i, j));
1815           break;
1816         }
1817     }
1818 }
1819 \f
1820 /* Copy X if necessary so that it won't be altered by changes in OTHER.
1821    Return X or the rtx for the pseudo reg the value of X was copied into.
1822    OTHER must be valid as a SET_DEST.  */
1823
1824 rtx
1825 make_safe_from (x, other)
1826      rtx x, other;
1827 {
1828   while (1)
1829     switch (GET_CODE (other))
1830       {
1831       case SUBREG:
1832         other = SUBREG_REG (other);
1833         break;
1834       case STRICT_LOW_PART:
1835       case SIGN_EXTEND:
1836       case ZERO_EXTEND:
1837         other = XEXP (other, 0);
1838         break;
1839       default:
1840         goto done;
1841       }
1842  done:
1843   if ((GET_CODE (other) == MEM
1844        && ! CONSTANT_P (x)
1845        && GET_CODE (x) != REG
1846        && GET_CODE (x) != SUBREG)
1847       || (GET_CODE (other) == REG
1848           && (REGNO (other) < FIRST_PSEUDO_REGISTER
1849               || reg_mentioned_p (other, x))))
1850     {
1851       rtx temp = gen_reg_rtx (GET_MODE (x));
1852       emit_move_insn (temp, x);
1853       return temp;
1854     }
1855   return x;
1856 }
1857 \f
1858 /* Emission of insns (adding them to the doubly-linked list).  */
1859
1860 /* Return the first insn of the current sequence or current function.  */
1861
1862 rtx
1863 get_insns ()
1864 {
1865   return first_insn;
1866 }
1867
1868 /* Return the last insn emitted in current sequence or current function.  */
1869
1870 rtx
1871 get_last_insn ()
1872 {
1873   return last_insn;
1874 }
1875
1876 /* Specify a new insn as the last in the chain.  */
1877
1878 void
1879 set_last_insn (insn)
1880      rtx insn;
1881 {
1882   if (NEXT_INSN (insn) != 0)
1883     abort ();
1884   last_insn = insn;
1885 }
1886
1887 /* Return the last insn emitted, even if it is in a sequence now pushed.  */
1888
1889 rtx
1890 get_last_insn_anywhere ()
1891 {
1892   struct sequence_stack *stack;
1893   if (last_insn)
1894     return last_insn;
1895   for (stack = sequence_stack; stack; stack = stack->next)
1896     if (stack->last != 0)
1897       return stack->last;
1898   return 0;
1899 }
1900
1901 /* Return a number larger than any instruction's uid in this function.  */
1902
1903 int
1904 get_max_uid ()
1905 {
1906   return cur_insn_uid;
1907 }
1908 \f
1909 /* Return the next insn.  If it is a SEQUENCE, return the first insn
1910    of the sequence.  */
1911
1912 rtx
1913 next_insn (insn)
1914      rtx insn;
1915 {
1916   if (insn)
1917     {
1918       insn = NEXT_INSN (insn);
1919       if (insn && GET_CODE (insn) == INSN
1920           && GET_CODE (PATTERN (insn)) == SEQUENCE)
1921         insn = XVECEXP (PATTERN (insn), 0, 0);
1922     }
1923
1924   return insn;
1925 }
1926
1927 /* Return the previous insn.  If it is a SEQUENCE, return the last insn
1928    of the sequence.  */
1929
1930 rtx
1931 previous_insn (insn)
1932      rtx insn;
1933 {
1934   if (insn)
1935     {
1936       insn = PREV_INSN (insn);
1937       if (insn && GET_CODE (insn) == INSN
1938           && GET_CODE (PATTERN (insn)) == SEQUENCE)
1939         insn = XVECEXP (PATTERN (insn), 0, XVECLEN (PATTERN (insn), 0) - 1);
1940     }
1941
1942   return insn;
1943 }
1944
1945 /* Return the next insn after INSN that is not a NOTE.  This routine does not
1946    look inside SEQUENCEs.  */
1947
1948 rtx
1949 next_nonnote_insn (insn)
1950      rtx insn;
1951 {
1952   while (insn)
1953     {
1954       insn = NEXT_INSN (insn);
1955       if (insn == 0 || GET_CODE (insn) != NOTE)
1956         break;
1957     }
1958
1959   return insn;
1960 }
1961
1962 /* Return the previous insn before INSN that is not a NOTE.  This routine does
1963    not look inside SEQUENCEs.  */
1964
1965 rtx
1966 prev_nonnote_insn (insn)
1967      rtx insn;
1968 {
1969   while (insn)
1970     {
1971       insn = PREV_INSN (insn);
1972       if (insn == 0 || GET_CODE (insn) != NOTE)
1973         break;
1974     }
1975
1976   return insn;
1977 }
1978
1979 /* Return the next INSN, CALL_INSN or JUMP_INSN after INSN;
1980    or 0, if there is none.  This routine does not look inside
1981    SEQUENCEs.  */
1982
1983 rtx
1984 next_real_insn (insn)
1985      rtx insn;
1986 {
1987   while (insn)
1988     {
1989       insn = NEXT_INSN (insn);
1990       if (insn == 0 || GET_CODE (insn) == INSN
1991           || GET_CODE (insn) == CALL_INSN || GET_CODE (insn) == JUMP_INSN)
1992         break;
1993     }
1994
1995   return insn;
1996 }
1997
1998 /* Return the last INSN, CALL_INSN or JUMP_INSN before INSN;
1999    or 0, if there is none.  This routine does not look inside
2000    SEQUENCEs.  */
2001
2002 rtx
2003 prev_real_insn (insn)
2004      rtx insn;
2005 {
2006   while (insn)
2007     {
2008       insn = PREV_INSN (insn);
2009       if (insn == 0 || GET_CODE (insn) == INSN || GET_CODE (insn) == CALL_INSN
2010           || GET_CODE (insn) == JUMP_INSN)
2011         break;
2012     }
2013
2014   return insn;
2015 }
2016
2017 /* Find the next insn after INSN that really does something.  This routine
2018    does not look inside SEQUENCEs.  Until reload has completed, this is the
2019    same as next_real_insn.  */
2020
2021 rtx
2022 next_active_insn (insn)
2023      rtx insn;
2024 {
2025   while (insn)
2026     {
2027       insn = NEXT_INSN (insn);
2028       if (insn == 0
2029           || GET_CODE (insn) == CALL_INSN || GET_CODE (insn) == JUMP_INSN
2030           || (GET_CODE (insn) == INSN
2031               && (! reload_completed
2032                   || (GET_CODE (PATTERN (insn)) != USE
2033                       && GET_CODE (PATTERN (insn)) != CLOBBER))))
2034         break;
2035     }
2036
2037   return insn;
2038 }
2039
2040 /* Find the last insn before INSN that really does something.  This routine
2041    does not look inside SEQUENCEs.  Until reload has completed, this is the
2042    same as prev_real_insn.  */
2043
2044 rtx
2045 prev_active_insn (insn)
2046      rtx insn;
2047 {
2048   while (insn)
2049     {
2050       insn = PREV_INSN (insn);
2051       if (insn == 0
2052           || GET_CODE (insn) == CALL_INSN || GET_CODE (insn) == JUMP_INSN
2053           || (GET_CODE (insn) == INSN
2054               && (! reload_completed
2055                   || (GET_CODE (PATTERN (insn)) != USE
2056                       && GET_CODE (PATTERN (insn)) != CLOBBER))))
2057         break;
2058     }
2059
2060   return insn;
2061 }
2062
2063 /* Return the next CODE_LABEL after the insn INSN, or 0 if there is none.  */
2064
2065 rtx
2066 next_label (insn)
2067      rtx insn;
2068 {
2069   while (insn)
2070     {
2071       insn = NEXT_INSN (insn);
2072       if (insn == 0 || GET_CODE (insn) == CODE_LABEL)
2073         break;
2074     }
2075
2076   return insn;
2077 }
2078
2079 /* Return the last CODE_LABEL before the insn INSN, or 0 if there is none.  */
2080
2081 rtx
2082 prev_label (insn)
2083      rtx insn;
2084 {
2085   while (insn)
2086     {
2087       insn = PREV_INSN (insn);
2088       if (insn == 0 || GET_CODE (insn) == CODE_LABEL)
2089         break;
2090     }
2091
2092   return insn;
2093 }
2094 \f
2095 #ifdef HAVE_cc0
2096 /* INSN uses CC0 and is being moved into a delay slot.  Set up REG_CC_SETTER
2097    and REG_CC_USER notes so we can find it.  */
2098
2099 void
2100 link_cc0_insns (insn)
2101      rtx insn;
2102 {
2103   rtx user = next_nonnote_insn (insn);
2104
2105   if (GET_CODE (user) == INSN && GET_CODE (PATTERN (user)) == SEQUENCE)
2106     user = XVECEXP (PATTERN (user), 0, 0);
2107
2108   REG_NOTES (user) = gen_rtx_INSN_LIST (REG_CC_SETTER, insn, REG_NOTES (user));
2109   REG_NOTES (insn) = gen_rtx_INSN_LIST (REG_CC_USER, user, REG_NOTES (insn));
2110 }
2111
2112 /* Return the next insn that uses CC0 after INSN, which is assumed to
2113    set it.  This is the inverse of prev_cc0_setter (i.e., prev_cc0_setter
2114    applied to the result of this function should yield INSN).
2115
2116    Normally, this is simply the next insn.  However, if a REG_CC_USER note
2117    is present, it contains the insn that uses CC0.
2118
2119    Return 0 if we can't find the insn.  */
2120
2121 rtx
2122 next_cc0_user (insn)
2123      rtx insn;
2124 {
2125   rtx note = find_reg_note (insn, REG_CC_USER, NULL_RTX);
2126
2127   if (note)
2128     return XEXP (note, 0);
2129
2130   insn = next_nonnote_insn (insn);
2131   if (insn && GET_CODE (insn) == INSN && GET_CODE (PATTERN (insn)) == SEQUENCE)
2132     insn = XVECEXP (PATTERN (insn), 0, 0);
2133
2134   if (insn && GET_RTX_CLASS (GET_CODE (insn)) == 'i'
2135       && reg_mentioned_p (cc0_rtx, PATTERN (insn)))
2136     return insn;
2137
2138   return 0;
2139 }
2140
2141 /* Find the insn that set CC0 for INSN.  Unless INSN has a REG_CC_SETTER
2142    note, it is the previous insn.  */
2143
2144 rtx
2145 prev_cc0_setter (insn)
2146      rtx insn;
2147 {
2148   rtx note = find_reg_note (insn, REG_CC_SETTER, NULL_RTX);
2149
2150   if (note)
2151     return XEXP (note, 0);
2152
2153   insn = prev_nonnote_insn (insn);
2154   if (! sets_cc0_p (PATTERN (insn)))
2155     abort ();
2156
2157   return insn;
2158 }
2159 #endif
2160 \f
2161 /* Try splitting insns that can be split for better scheduling.
2162    PAT is the pattern which might split.
2163    TRIAL is the insn providing PAT.
2164    LAST is non-zero if we should return the last insn of the sequence produced.
2165
2166    If this routine succeeds in splitting, it returns the first or last
2167    replacement insn depending on the value of LAST.  Otherwise, it
2168    returns TRIAL.  If the insn to be returned can be split, it will be.  */
2169
2170 rtx
2171 try_split (pat, trial, last)
2172      rtx pat, trial;
2173      int last;
2174 {
2175   rtx before = PREV_INSN (trial);
2176   rtx after = NEXT_INSN (trial);
2177   rtx seq = split_insns (pat, trial);
2178   int has_barrier = 0;
2179   rtx tem;
2180
2181   /* If we are splitting a JUMP_INSN, it might be followed by a BARRIER.
2182      We may need to handle this specially.  */
2183   if (after && GET_CODE (after) == BARRIER)
2184     {
2185       has_barrier = 1;
2186       after = NEXT_INSN (after);
2187     }
2188
2189   if (seq)
2190     {
2191       /* SEQ can either be a SEQUENCE or the pattern of a single insn.
2192          The latter case will normally arise only when being done so that
2193          it, in turn, will be split (SFmode on the 29k is an example).  */
2194       if (GET_CODE (seq) == SEQUENCE)
2195         {
2196           /* If we are splitting a JUMP_INSN, look for the JUMP_INSN in
2197              SEQ and copy our JUMP_LABEL to it.  If JUMP_LABEL is non-zero,
2198              increment the usage count so we don't delete the label.  */
2199           int i;
2200
2201           if (GET_CODE (trial) == JUMP_INSN)
2202             for (i = XVECLEN (seq, 0) - 1; i >= 0; i--)
2203               if (GET_CODE (XVECEXP (seq, 0, i)) == JUMP_INSN)
2204                 {
2205                   JUMP_LABEL (XVECEXP (seq, 0, i)) = JUMP_LABEL (trial);
2206
2207                   if (JUMP_LABEL (trial))
2208                     LABEL_NUSES (JUMP_LABEL (trial))++;
2209                 }
2210
2211           tem = emit_insn_after (seq, before);
2212
2213           delete_insn (trial);
2214           if (has_barrier)
2215             emit_barrier_after (tem);
2216
2217           /* Recursively call try_split for each new insn created; by the
2218              time control returns here that insn will be fully split, so
2219              set LAST and continue from the insn after the one returned.
2220              We can't use next_active_insn here since AFTER may be a note.
2221              Ignore deleted insns, which can be occur if not optimizing.  */
2222           for (tem = NEXT_INSN (before); tem != after;
2223                tem = NEXT_INSN (tem))
2224             if (! INSN_DELETED_P (tem))
2225               tem = try_split (PATTERN (tem), tem, 1);
2226         }
2227       /* Avoid infinite loop if the result matches the original pattern.  */
2228       else if (rtx_equal_p (seq, pat))
2229         return trial;
2230       else
2231         {
2232           PATTERN (trial) = seq;
2233           INSN_CODE (trial) = -1;
2234           try_split (seq, trial, last);
2235         }
2236
2237       /* Return either the first or the last insn, depending on which was
2238          requested.  */
2239       return last ? prev_active_insn (after) : next_active_insn (before);
2240     }
2241
2242   return trial;
2243 }
2244 \f
2245 /* Make and return an INSN rtx, initializing all its slots.
2246    Store PATTERN in the pattern slots.  */
2247
2248 rtx
2249 make_insn_raw (pattern)
2250      rtx pattern;
2251 {
2252   register rtx insn;
2253
2254   /* If in RTL generation phase, see if FREE_INSN can be used.  */
2255   if (free_insn != 0 && rtx_equal_function_value_matters)
2256     {
2257       insn = free_insn;
2258       free_insn = NEXT_INSN (free_insn);
2259       PUT_CODE (insn, INSN);
2260     }
2261   else
2262     insn = rtx_alloc (INSN);
2263
2264   INSN_UID (insn) = cur_insn_uid++;
2265   PATTERN (insn) = pattern;
2266   INSN_CODE (insn) = -1;
2267   LOG_LINKS (insn) = NULL;
2268   REG_NOTES (insn) = NULL;
2269
2270   return insn;
2271 }
2272
2273 /* Like `make_insn' but make a JUMP_INSN instead of an insn.  */
2274
2275 static rtx
2276 make_jump_insn_raw (pattern)
2277      rtx pattern;
2278 {
2279   register rtx insn;
2280
2281   insn = rtx_alloc (JUMP_INSN);
2282   INSN_UID (insn) = cur_insn_uid++;
2283
2284   PATTERN (insn) = pattern;
2285   INSN_CODE (insn) = -1;
2286   LOG_LINKS (insn) = NULL;
2287   REG_NOTES (insn) = NULL;
2288   JUMP_LABEL (insn) = NULL;
2289
2290   return insn;
2291 }
2292
2293 /* Like `make_insn' but make a CALL_INSN instead of an insn.  */
2294
2295 static rtx
2296 make_call_insn_raw (pattern)
2297      rtx pattern;
2298 {
2299   register rtx insn;
2300
2301   insn = rtx_alloc (CALL_INSN);
2302   INSN_UID (insn) = cur_insn_uid++;
2303
2304   PATTERN (insn) = pattern;
2305   INSN_CODE (insn) = -1;
2306   LOG_LINKS (insn) = NULL;
2307   REG_NOTES (insn) = NULL;
2308   CALL_INSN_FUNCTION_USAGE (insn) = NULL;
2309
2310   return insn;
2311 }
2312 \f
2313 /* Add INSN to the end of the doubly-linked list.
2314    INSN may be an INSN, JUMP_INSN, CALL_INSN, CODE_LABEL, BARRIER or NOTE.  */
2315
2316 void
2317 add_insn (insn)
2318      register rtx insn;
2319 {
2320   PREV_INSN (insn) = last_insn;
2321   NEXT_INSN (insn) = 0;
2322
2323   if (NULL != last_insn)
2324     NEXT_INSN (last_insn) = insn;
2325
2326   if (NULL == first_insn)
2327     first_insn = insn;
2328
2329   last_insn = insn;
2330 }
2331
2332 /* Add INSN into the doubly-linked list after insn AFTER.  This and
2333    the next should be the only functions called to insert an insn once
2334    delay slots have been filled since only they know how to update a
2335    SEQUENCE.  */
2336
2337 void
2338 add_insn_after (insn, after)
2339      rtx insn, after;
2340 {
2341   rtx next = NEXT_INSN (after);
2342
2343   if (optimize && INSN_DELETED_P (after))
2344     abort ();
2345
2346   NEXT_INSN (insn) = next;
2347   PREV_INSN (insn) = after;
2348
2349   if (next)
2350     {
2351       PREV_INSN (next) = insn;
2352       if (GET_CODE (next) == INSN && GET_CODE (PATTERN (next)) == SEQUENCE)
2353         PREV_INSN (XVECEXP (PATTERN (next), 0, 0)) = insn;
2354     }
2355   else if (last_insn == after)
2356     last_insn = insn;
2357   else
2358     {
2359       struct sequence_stack *stack = sequence_stack;
2360       /* Scan all pending sequences too.  */
2361       for (; stack; stack = stack->next)
2362         if (after == stack->last)
2363           {
2364             stack->last = insn;
2365             break;
2366           }
2367
2368       if (stack == 0)
2369         abort ();
2370     }
2371
2372   NEXT_INSN (after) = insn;
2373   if (GET_CODE (after) == INSN && GET_CODE (PATTERN (after)) == SEQUENCE)
2374     {
2375       rtx sequence = PATTERN (after);
2376       NEXT_INSN (XVECEXP (sequence, 0, XVECLEN (sequence, 0) - 1)) = insn;
2377     }
2378 }
2379
2380 /* Add INSN into the doubly-linked list before insn BEFORE.  This and
2381    the previous should be the only functions called to insert an insn once
2382    delay slots have been filled since only they know how to update a
2383    SEQUENCE.  */
2384
2385 void
2386 add_insn_before (insn, before)
2387      rtx insn, before;
2388 {
2389   rtx prev = PREV_INSN (before);
2390
2391   if (optimize && INSN_DELETED_P (before))
2392     abort ();
2393
2394   PREV_INSN (insn) = prev;
2395   NEXT_INSN (insn) = before;
2396
2397   if (prev)
2398     {
2399       NEXT_INSN (prev) = insn;
2400       if (GET_CODE (prev) == INSN && GET_CODE (PATTERN (prev)) == SEQUENCE)
2401         {
2402           rtx sequence = PATTERN (prev);
2403           NEXT_INSN (XVECEXP (sequence, 0, XVECLEN (sequence, 0) - 1)) = insn;
2404         }
2405     }
2406   else if (first_insn == before)
2407     first_insn = insn;
2408   else
2409     {
2410       struct sequence_stack *stack = sequence_stack;
2411       /* Scan all pending sequences too.  */
2412       for (; stack; stack = stack->next)
2413         if (before == stack->first)
2414           {
2415             stack->first = insn;
2416             break;
2417           }
2418
2419       if (stack == 0)
2420         abort ();
2421     }
2422
2423   PREV_INSN (before) = insn;
2424   if (GET_CODE (before) == INSN && GET_CODE (PATTERN (before)) == SEQUENCE)
2425     PREV_INSN (XVECEXP (PATTERN (before), 0, 0)) = insn;
2426 }
2427
2428 /* Delete all insns made since FROM.
2429    FROM becomes the new last instruction.  */
2430
2431 void
2432 delete_insns_since (from)
2433      rtx from;
2434 {
2435   if (from == 0)
2436     first_insn = 0;
2437   else
2438     NEXT_INSN (from) = 0;
2439   last_insn = from;
2440 }
2441
2442 /* This function is deprecated, please use sequences instead.
2443
2444    Move a consecutive bunch of insns to a different place in the chain.
2445    The insns to be moved are those between FROM and TO.
2446    They are moved to a new position after the insn AFTER.
2447    AFTER must not be FROM or TO or any insn in between.
2448
2449    This function does not know about SEQUENCEs and hence should not be
2450    called after delay-slot filling has been done.  */
2451
2452 void
2453 reorder_insns (from, to, after)
2454      rtx from, to, after;
2455 {
2456   /* Splice this bunch out of where it is now.  */
2457   if (PREV_INSN (from))
2458     NEXT_INSN (PREV_INSN (from)) = NEXT_INSN (to);
2459   if (NEXT_INSN (to))
2460     PREV_INSN (NEXT_INSN (to)) = PREV_INSN (from);
2461   if (last_insn == to)
2462     last_insn = PREV_INSN (from);
2463   if (first_insn == from)
2464     first_insn = NEXT_INSN (to);
2465
2466   /* Make the new neighbors point to it and it to them.  */
2467   if (NEXT_INSN (after))
2468     PREV_INSN (NEXT_INSN (after)) = to;
2469
2470   NEXT_INSN (to) = NEXT_INSN (after);
2471   PREV_INSN (from) = after;
2472   NEXT_INSN (after) = from;
2473   if (after == last_insn)
2474     last_insn = to;
2475 }
2476
2477 /* Return the line note insn preceding INSN.  */
2478
2479 static rtx
2480 find_line_note (insn)
2481      rtx insn;
2482 {
2483   if (no_line_numbers)
2484     return 0;
2485
2486   for (; insn; insn = PREV_INSN (insn))
2487     if (GET_CODE (insn) == NOTE
2488         && NOTE_LINE_NUMBER (insn) >= 0)
2489       break;
2490
2491   return insn;
2492 }
2493
2494 /* Like reorder_insns, but inserts line notes to preserve the line numbers
2495    of the moved insns when debugging.  This may insert a note between AFTER
2496    and FROM, and another one after TO.  */
2497
2498 void
2499 reorder_insns_with_line_notes (from, to, after)
2500      rtx from, to, after;
2501 {
2502   rtx from_line = find_line_note (from);
2503   rtx after_line = find_line_note (after);
2504
2505   reorder_insns (from, to, after);
2506
2507   if (from_line == after_line)
2508     return;
2509
2510   if (from_line)
2511     emit_line_note_after (NOTE_SOURCE_FILE (from_line),
2512                           NOTE_LINE_NUMBER (from_line),
2513                           after);
2514   if (after_line)
2515     emit_line_note_after (NOTE_SOURCE_FILE (after_line),
2516                           NOTE_LINE_NUMBER (after_line),
2517                           to);
2518 }
2519 \f
2520 /* Emit an insn of given code and pattern
2521    at a specified place within the doubly-linked list.  */
2522
2523 /* Make an instruction with body PATTERN
2524    and output it before the instruction BEFORE.  */
2525
2526 rtx
2527 emit_insn_before (pattern, before)
2528      register rtx pattern, before;
2529 {
2530   register rtx insn = before;
2531
2532   if (GET_CODE (pattern) == SEQUENCE)
2533     {
2534       register int i;
2535
2536       for (i = 0; i < XVECLEN (pattern, 0); i++)
2537         {
2538           insn = XVECEXP (pattern, 0, i);
2539           add_insn_before (insn, before);
2540         }
2541       if (XVECLEN (pattern, 0) < SEQUENCE_RESULT_SIZE)
2542         sequence_result[XVECLEN (pattern, 0)] = pattern;
2543     }
2544   else
2545     {
2546       insn = make_insn_raw (pattern);
2547       add_insn_before (insn, before);
2548     }
2549
2550   return insn;
2551 }
2552
2553 /* Make an instruction with body PATTERN and code JUMP_INSN
2554    and output it before the instruction BEFORE.  */
2555
2556 rtx
2557 emit_jump_insn_before (pattern, before)
2558      register rtx pattern, before;
2559 {
2560   register rtx insn;
2561
2562   if (GET_CODE (pattern) == SEQUENCE)
2563     insn = emit_insn_before (pattern, before);
2564   else
2565     {
2566       insn = make_jump_insn_raw (pattern);
2567       add_insn_before (insn, before);
2568     }
2569
2570   return insn;
2571 }
2572
2573 /* Make an instruction with body PATTERN and code CALL_INSN
2574    and output it before the instruction BEFORE.  */
2575
2576 rtx
2577 emit_call_insn_before (pattern, before)
2578      register rtx pattern, before;
2579 {
2580   register rtx insn;
2581
2582   if (GET_CODE (pattern) == SEQUENCE)
2583     insn = emit_insn_before (pattern, before);
2584   else
2585     {
2586       insn = make_call_insn_raw (pattern);
2587       add_insn_before (insn, before);
2588       PUT_CODE (insn, CALL_INSN);
2589     }
2590
2591   return insn;
2592 }
2593
2594 /* Make an insn of code BARRIER
2595    and output it before the insn AFTER.  */
2596
2597 rtx
2598 emit_barrier_before (before)
2599      register rtx before;
2600 {
2601   register rtx insn = rtx_alloc (BARRIER);
2602
2603   INSN_UID (insn) = cur_insn_uid++;
2604
2605   add_insn_before (insn, before);
2606   return insn;
2607 }
2608
2609 /* Emit a note of subtype SUBTYPE before the insn BEFORE.  */
2610
2611 rtx
2612 emit_note_before (subtype, before)
2613      int subtype;
2614      rtx before;
2615 {
2616   register rtx note = rtx_alloc (NOTE);
2617   INSN_UID (note) = cur_insn_uid++;
2618   NOTE_SOURCE_FILE (note) = 0;
2619   NOTE_LINE_NUMBER (note) = subtype;
2620
2621   add_insn_before (note, before);
2622   return note;
2623 }
2624 \f
2625 /* Make an insn of code INSN with body PATTERN
2626    and output it after the insn AFTER.  */
2627
2628 rtx
2629 emit_insn_after (pattern, after)
2630      register rtx pattern, after;
2631 {
2632   register rtx insn = after;
2633
2634   if (GET_CODE (pattern) == SEQUENCE)
2635     {
2636       register int i;
2637
2638       for (i = 0; i < XVECLEN (pattern, 0); i++)
2639         {
2640           insn = XVECEXP (pattern, 0, i);
2641           add_insn_after (insn, after);
2642           after = insn;
2643         }
2644       if (XVECLEN (pattern, 0) < SEQUENCE_RESULT_SIZE)
2645         sequence_result[XVECLEN (pattern, 0)] = pattern;
2646     }
2647   else
2648     {
2649       insn = make_insn_raw (pattern);
2650       add_insn_after (insn, after);
2651     }
2652
2653   return insn;
2654 }
2655
2656 /* Similar to emit_insn_after, except that line notes are to be inserted so
2657    as to act as if this insn were at FROM.  */
2658
2659 void
2660 emit_insn_after_with_line_notes (pattern, after, from)
2661      rtx pattern, after, from;
2662 {
2663   rtx from_line = find_line_note (from);
2664   rtx after_line = find_line_note (after);
2665   rtx insn = emit_insn_after (pattern, after);
2666
2667   if (from_line)
2668     emit_line_note_after (NOTE_SOURCE_FILE (from_line),
2669                           NOTE_LINE_NUMBER (from_line),
2670                           after);
2671
2672   if (after_line)
2673     emit_line_note_after (NOTE_SOURCE_FILE (after_line),
2674                           NOTE_LINE_NUMBER (after_line),
2675                           insn);
2676 }
2677
2678 /* Make an insn of code JUMP_INSN with body PATTERN
2679    and output it after the insn AFTER.  */
2680
2681 rtx
2682 emit_jump_insn_after (pattern, after)
2683      register rtx pattern, after;
2684 {
2685   register rtx insn;
2686
2687   if (GET_CODE (pattern) == SEQUENCE)
2688     insn = emit_insn_after (pattern, after);
2689   else
2690     {
2691       insn = make_jump_insn_raw (pattern);
2692       add_insn_after (insn, after);
2693     }
2694
2695   return insn;
2696 }
2697
2698 /* Make an insn of code BARRIER
2699    and output it after the insn AFTER.  */
2700
2701 rtx
2702 emit_barrier_after (after)
2703      register rtx after;
2704 {
2705   register rtx insn = rtx_alloc (BARRIER);
2706
2707   INSN_UID (insn) = cur_insn_uid++;
2708
2709   add_insn_after (insn, after);
2710   return insn;
2711 }
2712
2713 /* Emit the label LABEL after the insn AFTER.  */
2714
2715 rtx
2716 emit_label_after (label, after)
2717      rtx label, after;
2718 {
2719   /* This can be called twice for the same label
2720      as a result of the confusion that follows a syntax error!
2721      So make it harmless.  */
2722   if (INSN_UID (label) == 0)
2723     {
2724       INSN_UID (label) = cur_insn_uid++;
2725       add_insn_after (label, after);
2726     }
2727
2728   return label;
2729 }
2730
2731 /* Emit a note of subtype SUBTYPE after the insn AFTER.  */
2732
2733 rtx
2734 emit_note_after (subtype, after)
2735      int subtype;
2736      rtx after;
2737 {
2738   register rtx note = rtx_alloc (NOTE);
2739   INSN_UID (note) = cur_insn_uid++;
2740   NOTE_SOURCE_FILE (note) = 0;
2741   NOTE_LINE_NUMBER (note) = subtype;
2742   add_insn_after (note, after);
2743   return note;
2744 }
2745
2746 /* Emit a line note for FILE and LINE after the insn AFTER.  */
2747
2748 rtx
2749 emit_line_note_after (file, line, after)
2750      char *file;
2751      int line;
2752      rtx after;
2753 {
2754   register rtx note;
2755
2756   if (no_line_numbers && line > 0)
2757     {
2758       cur_insn_uid++;
2759       return 0;
2760     }
2761
2762   note  = rtx_alloc (NOTE);
2763   INSN_UID (note) = cur_insn_uid++;
2764   NOTE_SOURCE_FILE (note) = file;
2765   NOTE_LINE_NUMBER (note) = line;
2766   add_insn_after (note, after);
2767   return note;
2768 }
2769 \f
2770 /* Make an insn of code INSN with pattern PATTERN
2771    and add it to the end of the doubly-linked list.
2772    If PATTERN is a SEQUENCE, take the elements of it
2773    and emit an insn for each element.
2774
2775    Returns the last insn emitted.  */
2776
2777 rtx
2778 emit_insn (pattern)
2779      rtx pattern;
2780 {
2781   rtx insn = last_insn;
2782
2783   if (GET_CODE (pattern) == SEQUENCE)
2784     {
2785       register int i;
2786
2787       for (i = 0; i < XVECLEN (pattern, 0); i++)
2788         {
2789           insn = XVECEXP (pattern, 0, i);
2790           add_insn (insn);
2791         }
2792       if (XVECLEN (pattern, 0) < SEQUENCE_RESULT_SIZE)
2793         sequence_result[XVECLEN (pattern, 0)] = pattern;
2794     }
2795   else
2796     {
2797       insn = make_insn_raw (pattern);
2798       add_insn (insn);
2799     }
2800
2801   return insn;
2802 }
2803
2804 /* Emit the insns in a chain starting with INSN.
2805    Return the last insn emitted.  */
2806
2807 rtx
2808 emit_insns (insn)
2809      rtx insn;
2810 {
2811   rtx last = 0;
2812
2813   while (insn)
2814     {
2815       rtx next = NEXT_INSN (insn);
2816       add_insn (insn);
2817       last = insn;
2818       insn = next;
2819     }
2820
2821   return last;
2822 }
2823
2824 /* Emit the insns in a chain starting with INSN and place them in front of
2825    the insn BEFORE.  Return the last insn emitted.  */
2826
2827 rtx
2828 emit_insns_before (insn, before)
2829      rtx insn;
2830      rtx before;
2831 {
2832   rtx last = 0;
2833
2834   while (insn)
2835     {
2836       rtx next = NEXT_INSN (insn);
2837       add_insn_before (insn, before);
2838       last = insn;
2839       insn = next;
2840     }
2841
2842   return last;
2843 }
2844
2845 /* Emit the insns in a chain starting with FIRST and place them in back of
2846    the insn AFTER.  Return the last insn emitted.  */
2847
2848 rtx
2849 emit_insns_after (first, after)
2850      register rtx first;
2851      register rtx after;
2852 {
2853   register rtx last;
2854   register rtx after_after;
2855
2856   if (!after)
2857     abort ();
2858
2859   if (!first)
2860     return first;
2861
2862   for (last = first; NEXT_INSN (last); last = NEXT_INSN (last))
2863     continue;
2864
2865   after_after = NEXT_INSN (after);
2866
2867   NEXT_INSN (after) = first;
2868   PREV_INSN (first) = after;
2869   NEXT_INSN (last) = after_after;
2870   if (after_after)
2871     PREV_INSN (after_after) = last;
2872
2873   if (after == last_insn)
2874     last_insn = last;
2875   return last;
2876 }
2877
2878 /* Make an insn of code JUMP_INSN with pattern PATTERN
2879    and add it to the end of the doubly-linked list.  */
2880
2881 rtx
2882 emit_jump_insn (pattern)
2883      rtx pattern;
2884 {
2885   if (GET_CODE (pattern) == SEQUENCE)
2886     return emit_insn (pattern);
2887   else
2888     {
2889       register rtx insn = make_jump_insn_raw (pattern);
2890       add_insn (insn);
2891       return insn;
2892     }
2893 }
2894
2895 /* Make an insn of code CALL_INSN with pattern PATTERN
2896    and add it to the end of the doubly-linked list.  */
2897
2898 rtx
2899 emit_call_insn (pattern)
2900      rtx pattern;
2901 {
2902   if (GET_CODE (pattern) == SEQUENCE)
2903     return emit_insn (pattern);
2904   else
2905     {
2906       register rtx insn = make_call_insn_raw (pattern);
2907       add_insn (insn);
2908       PUT_CODE (insn, CALL_INSN);
2909       return insn;
2910     }
2911 }
2912
2913 /* Add the label LABEL to the end of the doubly-linked list.  */
2914
2915 rtx
2916 emit_label (label)
2917      rtx label;
2918 {
2919   /* This can be called twice for the same label
2920      as a result of the confusion that follows a syntax error!
2921      So make it harmless.  */
2922   if (INSN_UID (label) == 0)
2923     {
2924       INSN_UID (label) = cur_insn_uid++;
2925       add_insn (label);
2926     }
2927   return label;
2928 }
2929
2930 /* Make an insn of code BARRIER
2931    and add it to the end of the doubly-linked list.  */
2932
2933 rtx
2934 emit_barrier ()
2935 {
2936   register rtx barrier = rtx_alloc (BARRIER);
2937   INSN_UID (barrier) = cur_insn_uid++;
2938   add_insn (barrier);
2939   return barrier;
2940 }
2941
2942 /* Make an insn of code NOTE
2943    with data-fields specified by FILE and LINE
2944    and add it to the end of the doubly-linked list,
2945    but only if line-numbers are desired for debugging info.  */
2946
2947 rtx
2948 emit_line_note (file, line)
2949      char *file;
2950      int line;
2951 {
2952   emit_filename = file;
2953   emit_lineno = line;
2954
2955 #if 0
2956   if (no_line_numbers)
2957     return 0;
2958 #endif
2959
2960   return emit_note (file, line);
2961 }
2962
2963 /* Make an insn of code NOTE
2964    with data-fields specified by FILE and LINE
2965    and add it to the end of the doubly-linked list.
2966    If it is a line-number NOTE, omit it if it matches the previous one.  */
2967
2968 rtx
2969 emit_note (file, line)
2970      char *file;
2971      int line;
2972 {
2973   register rtx note;
2974
2975   if (line > 0)
2976     {
2977       if (file && last_filename && !strcmp (file, last_filename)
2978           && line == last_linenum)
2979         return 0;
2980       last_filename = file;
2981       last_linenum = line;
2982     }
2983
2984   if (no_line_numbers && line > 0)
2985     {
2986       cur_insn_uid++;
2987       return 0;
2988     }
2989
2990   note = rtx_alloc (NOTE);
2991   INSN_UID (note) = cur_insn_uid++;
2992   NOTE_SOURCE_FILE (note) = file;
2993   NOTE_LINE_NUMBER (note) = line;
2994   add_insn (note);
2995   return note;
2996 }
2997
2998 /* Emit a NOTE, and don't omit it even if LINE it the previous note.  */
2999
3000 rtx
3001 emit_line_note_force (file, line)
3002      char *file;
3003      int line;
3004 {
3005   last_linenum = -1;
3006   return emit_line_note (file, line);
3007 }
3008
3009 /* Cause next statement to emit a line note even if the line number
3010    has not changed.  This is used at the beginning of a function.  */
3011
3012 void
3013 force_next_line_note ()
3014 {
3015   last_linenum = -1;
3016 }
3017 \f
3018 /* Return an indication of which type of insn should have X as a body.
3019    The value is CODE_LABEL, INSN, CALL_INSN or JUMP_INSN.  */
3020
3021 enum rtx_code
3022 classify_insn (x)
3023      rtx x;
3024 {
3025   if (GET_CODE (x) == CODE_LABEL)
3026     return CODE_LABEL;
3027   if (GET_CODE (x) == CALL)
3028     return CALL_INSN;
3029   if (GET_CODE (x) == RETURN)
3030     return JUMP_INSN;
3031   if (GET_CODE (x) == SET)
3032     {
3033       if (SET_DEST (x) == pc_rtx)
3034         return JUMP_INSN;
3035       else if (GET_CODE (SET_SRC (x)) == CALL)
3036         return CALL_INSN;
3037       else
3038         return INSN;
3039     }
3040   if (GET_CODE (x) == PARALLEL)
3041     {
3042       register int j;
3043       for (j = XVECLEN (x, 0) - 1; j >= 0; j--)
3044         if (GET_CODE (XVECEXP (x, 0, j)) == CALL)
3045           return CALL_INSN;
3046         else if (GET_CODE (XVECEXP (x, 0, j)) == SET
3047                  && SET_DEST (XVECEXP (x, 0, j)) == pc_rtx)
3048           return JUMP_INSN;
3049         else if (GET_CODE (XVECEXP (x, 0, j)) == SET
3050                  && GET_CODE (SET_SRC (XVECEXP (x, 0, j))) == CALL)
3051           return CALL_INSN;
3052     }
3053   return INSN;
3054 }
3055
3056 /* Emit the rtl pattern X as an appropriate kind of insn.
3057    If X is a label, it is simply added into the insn chain.  */
3058
3059 rtx
3060 emit (x)
3061      rtx x;
3062 {
3063   enum rtx_code code = classify_insn (x);
3064
3065   if (code == CODE_LABEL)
3066     return emit_label (x);
3067   else if (code == INSN)
3068     return emit_insn (x);
3069   else if (code == JUMP_INSN)
3070     {
3071       register rtx insn = emit_jump_insn (x);
3072       if (simplejump_p (insn) || GET_CODE (x) == RETURN)
3073         return emit_barrier ();
3074       return insn;
3075     }
3076   else if (code == CALL_INSN)
3077     return emit_call_insn (x);
3078   else
3079     abort ();
3080 }
3081 \f
3082 /* Begin emitting insns to a sequence which can be packaged in an RTL_EXPR.  */
3083
3084 void
3085 start_sequence ()
3086 {
3087   struct sequence_stack *tem;
3088
3089   if (sequence_element_free_list)
3090     {
3091       /* Reuse a previously-saved struct sequence_stack.  */
3092       tem = sequence_element_free_list;
3093       sequence_element_free_list = tem->next;
3094     }
3095   else
3096     tem = (struct sequence_stack *) permalloc (sizeof (struct sequence_stack));
3097
3098   tem->next = sequence_stack;
3099   tem->first = first_insn;
3100   tem->last = last_insn;
3101   tem->sequence_rtl_expr = sequence_rtl_expr;
3102
3103   sequence_stack = tem;
3104
3105   first_insn = 0;
3106   last_insn = 0;
3107 }
3108
3109 /* Similarly, but indicate that this sequence will be placed in 
3110    T, an RTL_EXPR.  */
3111
3112 void
3113 start_sequence_for_rtl_expr (t)
3114      tree t;
3115 {
3116   start_sequence ();
3117
3118   sequence_rtl_expr = t;
3119 }
3120
3121 /* Set up the insn chain starting with FIRST
3122    as the current sequence, saving the previously current one.  */
3123
3124 void
3125 push_to_sequence (first)
3126      rtx first;
3127 {
3128   rtx last;
3129
3130   start_sequence ();
3131
3132   for (last = first; last && NEXT_INSN (last); last = NEXT_INSN (last));
3133
3134   first_insn = first;
3135   last_insn = last;
3136 }
3137
3138 /* Set up the outer-level insn chain
3139    as the current sequence, saving the previously current one.  */
3140
3141 void
3142 push_topmost_sequence ()
3143 {
3144   struct sequence_stack *stack, *top = NULL;
3145
3146   start_sequence ();
3147
3148   for (stack = sequence_stack; stack; stack = stack->next)
3149     top = stack;
3150
3151   first_insn = top->first;
3152   last_insn = top->last;
3153   sequence_rtl_expr = top->sequence_rtl_expr;
3154 }
3155
3156 /* After emitting to the outer-level insn chain, update the outer-level
3157    insn chain, and restore the previous saved state.  */
3158
3159 void
3160 pop_topmost_sequence ()
3161 {
3162   struct sequence_stack *stack, *top = NULL;
3163
3164   for (stack = sequence_stack; stack; stack = stack->next)
3165     top = stack;
3166
3167   top->first = first_insn;
3168   top->last = last_insn;
3169   /* ??? Why don't we save sequence_rtl_expr here?  */
3170
3171   end_sequence ();
3172 }
3173
3174 /* After emitting to a sequence, restore previous saved state.
3175
3176    To get the contents of the sequence just made,
3177    you must call `gen_sequence' *before* calling here.  */
3178
3179 void
3180 end_sequence ()
3181 {
3182   struct sequence_stack *tem = sequence_stack;
3183
3184   first_insn = tem->first;
3185   last_insn = tem->last;
3186   sequence_rtl_expr = tem->sequence_rtl_expr;
3187   sequence_stack = tem->next;
3188
3189   tem->next = sequence_element_free_list;
3190   sequence_element_free_list = tem;
3191 }
3192
3193 /* Return 1 if currently emitting into a sequence.  */
3194
3195 int
3196 in_sequence_p ()
3197 {
3198   return sequence_stack != 0;
3199 }
3200
3201 /* Generate a SEQUENCE rtx containing the insns already emitted
3202    to the current sequence.
3203
3204    This is how the gen_... function from a DEFINE_EXPAND
3205    constructs the SEQUENCE that it returns.  */
3206
3207 rtx
3208 gen_sequence ()
3209 {
3210   rtx result;
3211   rtx tem;
3212   int i;
3213   int len;
3214
3215   /* Count the insns in the chain.  */
3216   len = 0;
3217   for (tem = first_insn; tem; tem = NEXT_INSN (tem))
3218     len++;
3219
3220   /* If only one insn, return its pattern rather than a SEQUENCE.
3221      (Now that we cache SEQUENCE expressions, it isn't worth special-casing
3222      the case of an empty list.)  */
3223   if (len == 1
3224       && ! RTX_FRAME_RELATED_P (first_insn)
3225       && (GET_CODE (first_insn) == INSN
3226           || GET_CODE (first_insn) == JUMP_INSN
3227           /* Don't discard the call usage field.  */
3228           || (GET_CODE (first_insn) == CALL_INSN
3229               && CALL_INSN_FUNCTION_USAGE (first_insn) == NULL_RTX)))
3230     {
3231       NEXT_INSN (first_insn) = free_insn;
3232       free_insn = first_insn;
3233       return PATTERN (first_insn);
3234     }
3235
3236   /* Put them in a vector.  See if we already have a SEQUENCE of the
3237      appropriate length around.  */
3238   if (len < SEQUENCE_RESULT_SIZE && (result = sequence_result[len]) != 0)
3239     sequence_result[len] = 0;
3240   else
3241     {
3242       /* Ensure that this rtl goes in saveable_obstack, since we may
3243          cache it.  */
3244       push_obstacks_nochange ();
3245       rtl_in_saveable_obstack ();
3246       result = gen_rtx_SEQUENCE (VOIDmode, rtvec_alloc (len));
3247       pop_obstacks ();
3248     }
3249
3250   for (i = 0, tem = first_insn; tem; tem = NEXT_INSN (tem), i++)
3251     XVECEXP (result, 0, i) = tem;
3252
3253   return result;
3254 }
3255 \f
3256 /* Initialize data structures and variables in this file
3257    before generating rtl for each function.  */
3258
3259 void
3260 init_emit ()
3261 {
3262   int i;
3263
3264   first_insn = NULL;
3265   last_insn = NULL;
3266   sequence_rtl_expr = NULL;
3267   cur_insn_uid = 1;
3268   reg_rtx_no = LAST_VIRTUAL_REGISTER + 1;
3269   last_linenum = 0;
3270   last_filename = 0;
3271   first_label_num = label_num;
3272   last_label_num = 0;
3273   sequence_stack = NULL;
3274
3275   /* Clear the start_sequence/gen_sequence cache.  */
3276   sequence_element_free_list = 0;
3277   for (i = 0; i < SEQUENCE_RESULT_SIZE; i++)
3278     sequence_result[i] = 0;
3279   free_insn = 0;
3280
3281   /* Init the tables that describe all the pseudo regs.  */
3282
3283   regno_pointer_flag_length = LAST_VIRTUAL_REGISTER + 101;
3284
3285   regno_pointer_flag 
3286     = (char *) savealloc (regno_pointer_flag_length);
3287   bzero (regno_pointer_flag, regno_pointer_flag_length);
3288
3289   regno_pointer_align
3290     = (char *) savealloc (regno_pointer_flag_length);
3291   bzero (regno_pointer_align, regno_pointer_flag_length);
3292
3293   regno_reg_rtx 
3294     = (rtx *) savealloc (regno_pointer_flag_length * sizeof (rtx));
3295   bzero ((char *) regno_reg_rtx, regno_pointer_flag_length * sizeof (rtx));
3296
3297   /* Put copies of all the virtual register rtx into regno_reg_rtx.  */
3298   regno_reg_rtx[VIRTUAL_INCOMING_ARGS_REGNUM] = virtual_incoming_args_rtx;
3299   regno_reg_rtx[VIRTUAL_STACK_VARS_REGNUM] = virtual_stack_vars_rtx;
3300   regno_reg_rtx[VIRTUAL_STACK_DYNAMIC_REGNUM] = virtual_stack_dynamic_rtx;
3301   regno_reg_rtx[VIRTUAL_OUTGOING_ARGS_REGNUM] = virtual_outgoing_args_rtx;
3302
3303   /* Indicate that the virtual registers and stack locations are
3304      all pointers.  */
3305   REGNO_POINTER_FLAG (STACK_POINTER_REGNUM) = 1;
3306   REGNO_POINTER_FLAG (FRAME_POINTER_REGNUM) = 1;
3307   REGNO_POINTER_FLAG (HARD_FRAME_POINTER_REGNUM) = 1;
3308   REGNO_POINTER_FLAG (ARG_POINTER_REGNUM) = 1;
3309
3310   REGNO_POINTER_FLAG (VIRTUAL_INCOMING_ARGS_REGNUM) = 1;
3311   REGNO_POINTER_FLAG (VIRTUAL_STACK_VARS_REGNUM) = 1;
3312   REGNO_POINTER_FLAG (VIRTUAL_STACK_DYNAMIC_REGNUM) = 1;
3313   REGNO_POINTER_FLAG (VIRTUAL_OUTGOING_ARGS_REGNUM) = 1;
3314
3315 #ifdef STACK_BOUNDARY
3316   REGNO_POINTER_ALIGN (STACK_POINTER_REGNUM) = STACK_BOUNDARY / BITS_PER_UNIT;
3317   REGNO_POINTER_ALIGN (FRAME_POINTER_REGNUM) = STACK_BOUNDARY / BITS_PER_UNIT;
3318   REGNO_POINTER_ALIGN (HARD_FRAME_POINTER_REGNUM)
3319     = STACK_BOUNDARY / BITS_PER_UNIT;
3320   REGNO_POINTER_ALIGN (ARG_POINTER_REGNUM) = STACK_BOUNDARY / BITS_PER_UNIT;
3321
3322   REGNO_POINTER_ALIGN (VIRTUAL_INCOMING_ARGS_REGNUM)
3323     = STACK_BOUNDARY / BITS_PER_UNIT;
3324   REGNO_POINTER_ALIGN (VIRTUAL_STACK_VARS_REGNUM)
3325     = STACK_BOUNDARY / BITS_PER_UNIT;
3326   REGNO_POINTER_ALIGN (VIRTUAL_STACK_DYNAMIC_REGNUM)
3327     = STACK_BOUNDARY / BITS_PER_UNIT;
3328   REGNO_POINTER_ALIGN (VIRTUAL_OUTGOING_ARGS_REGNUM)
3329     = STACK_BOUNDARY / BITS_PER_UNIT;
3330 #endif
3331
3332 #ifdef INIT_EXPANDERS
3333   INIT_EXPANDERS;
3334 #endif
3335 }
3336
3337 /* Create some permanent unique rtl objects shared between all functions.
3338    LINE_NUMBERS is nonzero if line numbers are to be generated.  */
3339
3340 void
3341 init_emit_once (line_numbers)
3342      int line_numbers;
3343 {
3344   int i;
3345   enum machine_mode mode;
3346
3347   no_line_numbers = ! line_numbers;
3348
3349   sequence_stack = NULL;
3350
3351   /* Compute the word and byte modes.  */
3352
3353   byte_mode = VOIDmode;
3354   word_mode = VOIDmode;
3355
3356   for (mode = GET_CLASS_NARROWEST_MODE (MODE_INT); mode != VOIDmode;
3357        mode = GET_MODE_WIDER_MODE (mode))
3358     {
3359       if (GET_MODE_BITSIZE (mode) == BITS_PER_UNIT
3360           && byte_mode == VOIDmode)
3361         byte_mode = mode;
3362
3363       if (GET_MODE_BITSIZE (mode) == BITS_PER_WORD
3364           && word_mode == VOIDmode)
3365         word_mode = mode;
3366     }
3367
3368   ptr_mode = mode_for_size (POINTER_SIZE, GET_MODE_CLASS (Pmode), 0);
3369
3370   /* Create the unique rtx's for certain rtx codes and operand values.  */
3371
3372   for (i = - MAX_SAVED_CONST_INT; i <= MAX_SAVED_CONST_INT; i++)
3373     {
3374       PUT_CODE (&const_int_rtx[i + MAX_SAVED_CONST_INT], CONST_INT);
3375       PUT_MODE (&const_int_rtx[i + MAX_SAVED_CONST_INT], VOIDmode);
3376       INTVAL (&const_int_rtx[i + MAX_SAVED_CONST_INT]) = i;
3377     }
3378
3379   if (STORE_FLAG_VALUE >= - MAX_SAVED_CONST_INT
3380       && STORE_FLAG_VALUE <= MAX_SAVED_CONST_INT)
3381     const_true_rtx = &const_int_rtx[STORE_FLAG_VALUE + MAX_SAVED_CONST_INT];
3382   else
3383     const_true_rtx = gen_rtx_CONST_INT (VOIDmode, STORE_FLAG_VALUE);
3384
3385   dconst0 = REAL_VALUE_ATOF ("0", DFmode);
3386   dconst1 = REAL_VALUE_ATOF ("1", DFmode);
3387   dconst2 = REAL_VALUE_ATOF ("2", DFmode);
3388   dconstm1 = REAL_VALUE_ATOF ("-1", DFmode);
3389
3390   for (i = 0; i <= 2; i++)
3391     {
3392       for (mode = GET_CLASS_NARROWEST_MODE (MODE_FLOAT); mode != VOIDmode;
3393            mode = GET_MODE_WIDER_MODE (mode))
3394         {
3395           rtx tem = rtx_alloc (CONST_DOUBLE);
3396           union real_extract u;
3397
3398           bzero ((char *) &u, sizeof u);  /* Zero any holes in a structure.  */
3399           u.d = i == 0 ? dconst0 : i == 1 ? dconst1 : dconst2;
3400
3401           bcopy ((char *) &u, (char *) &CONST_DOUBLE_LOW (tem), sizeof u);
3402           CONST_DOUBLE_MEM (tem) = cc0_rtx;
3403           PUT_MODE (tem, mode);
3404
3405           const_tiny_rtx[i][(int) mode] = tem;
3406         }
3407
3408       const_tiny_rtx[i][(int) VOIDmode] = GEN_INT (i);
3409
3410       for (mode = GET_CLASS_NARROWEST_MODE (MODE_INT); mode != VOIDmode;
3411            mode = GET_MODE_WIDER_MODE (mode))
3412         const_tiny_rtx[i][(int) mode] = GEN_INT (i);
3413
3414       for (mode = GET_CLASS_NARROWEST_MODE (MODE_PARTIAL_INT);
3415            mode != VOIDmode;
3416            mode = GET_MODE_WIDER_MODE (mode))
3417         const_tiny_rtx[i][(int) mode] = GEN_INT (i);
3418     }
3419
3420   for (mode = GET_CLASS_NARROWEST_MODE (MODE_CC); mode != VOIDmode;
3421        mode = GET_MODE_WIDER_MODE (mode))
3422     const_tiny_rtx[0][(int) mode] = const0_rtx;
3423
3424
3425   /* Assign register numbers to the globally defined register rtx.
3426      This must be done at runtime because the register number field
3427      is in a union and some compilers can't initialize unions.  */
3428
3429   REGNO (stack_pointer_rtx) = STACK_POINTER_REGNUM;
3430   PUT_MODE (stack_pointer_rtx, Pmode);
3431   REGNO (frame_pointer_rtx) = FRAME_POINTER_REGNUM;
3432   PUT_MODE (frame_pointer_rtx, Pmode);
3433 #if HARD_FRAME_POINTER_REGNUM != FRAME_POINTER_REGNUM
3434   REGNO (hard_frame_pointer_rtx) = HARD_FRAME_POINTER_REGNUM;
3435   PUT_MODE (hard_frame_pointer_rtx, Pmode);
3436 #endif
3437 #if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM && HARD_FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
3438   REGNO (arg_pointer_rtx) = ARG_POINTER_REGNUM;
3439   PUT_MODE (arg_pointer_rtx, Pmode);
3440 #endif
3441
3442   REGNO (virtual_incoming_args_rtx) = VIRTUAL_INCOMING_ARGS_REGNUM;
3443   PUT_MODE (virtual_incoming_args_rtx, Pmode);
3444   REGNO (virtual_stack_vars_rtx) = VIRTUAL_STACK_VARS_REGNUM;
3445   PUT_MODE (virtual_stack_vars_rtx, Pmode);
3446   REGNO (virtual_stack_dynamic_rtx) = VIRTUAL_STACK_DYNAMIC_REGNUM;
3447   PUT_MODE (virtual_stack_dynamic_rtx, Pmode);
3448   REGNO (virtual_outgoing_args_rtx) = VIRTUAL_OUTGOING_ARGS_REGNUM;
3449   PUT_MODE (virtual_outgoing_args_rtx, Pmode);
3450
3451 #ifdef RETURN_ADDRESS_POINTER_REGNUM
3452   return_address_pointer_rtx
3453     = gen_rtx_raw_REG (Pmode, RETURN_ADDRESS_POINTER_REGNUM);
3454 #endif
3455
3456 #ifdef STRUCT_VALUE
3457   struct_value_rtx = STRUCT_VALUE;
3458 #else
3459   struct_value_rtx = gen_rtx_REG (Pmode, STRUCT_VALUE_REGNUM);
3460 #endif
3461
3462 #ifdef STRUCT_VALUE_INCOMING
3463   struct_value_incoming_rtx = STRUCT_VALUE_INCOMING;
3464 #else
3465 #ifdef STRUCT_VALUE_INCOMING_REGNUM
3466   struct_value_incoming_rtx
3467     = gen_rtx_REG (Pmode, STRUCT_VALUE_INCOMING_REGNUM);
3468 #else
3469   struct_value_incoming_rtx = struct_value_rtx;
3470 #endif
3471 #endif
3472
3473 #ifdef STATIC_CHAIN_REGNUM
3474   static_chain_rtx = gen_rtx_REG (Pmode, STATIC_CHAIN_REGNUM);
3475
3476 #ifdef STATIC_CHAIN_INCOMING_REGNUM
3477   if (STATIC_CHAIN_INCOMING_REGNUM != STATIC_CHAIN_REGNUM)
3478     static_chain_incoming_rtx = gen_rtx_REG (Pmode, STATIC_CHAIN_INCOMING_REGNUM);
3479   else
3480 #endif
3481     static_chain_incoming_rtx = static_chain_rtx;
3482 #endif
3483
3484 #ifdef STATIC_CHAIN
3485   static_chain_rtx = STATIC_CHAIN;
3486
3487 #ifdef STATIC_CHAIN_INCOMING
3488   static_chain_incoming_rtx = STATIC_CHAIN_INCOMING;
3489 #else
3490   static_chain_incoming_rtx = static_chain_rtx;
3491 #endif
3492 #endif
3493
3494 #ifdef PIC_OFFSET_TABLE_REGNUM
3495   pic_offset_table_rtx = gen_rtx_REG (Pmode, PIC_OFFSET_TABLE_REGNUM);
3496 #endif
3497 }
3498 \f
3499 /* Query and clear/ restore no_line_numbers.  This is used by the
3500    switch / case handling in stmt.c to give proper line numbers in
3501    warnings about unreachable code.  */
3502
3503 int
3504 force_line_numbers ()
3505 {
3506   int old = no_line_numbers;
3507
3508   no_line_numbers = 0;
3509   if (old)
3510     force_next_line_note ();
3511   return old;
3512 }
3513
3514 void
3515 restore_line_number_status (old_value)
3516      int old_value;
3517 {
3518   no_line_numbers = old_value;
3519 }