OSDN Git Service

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