OSDN Git Service

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