1 /* Emit RTL for the GNU C-Compiler expander.
2 Copyright (C) 1987, 88, 92, 93, 94, 95, 1996 Free Software Foundation, Inc.
4 This file is part of GNU CC.
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)
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.
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. */
22 /* Middle-to-low level generation of rtx code and insns.
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.
28 It also has the functions for creating insns and linking
29 them in the doubly-linked chain.
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. */
49 #include "insn-config.h"
55 #include "bc-opcode.h"
56 #include "bc-typecd.h"
64 #ifdef BCDEBUG_PRINT_CODE
67 #include "bc-opname.h"
74 /* Commonly used modes. */
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. */
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. */
83 int reg_rtx_no = LAST_VIRTUAL_REGISTER + 1;
85 /* This is *not* reset after each function. It gives each CODE_LABEL
86 in the entire compilation a unique label number. */
88 static int label_num = 1;
90 /* Lowest label number in current function. */
92 static int first_label_num;
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. */
98 static int last_label_num;
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. */
103 static int base_label_num;
105 /* Nonzero means do not generate NOTEs for source line numbers. */
107 static int no_line_numbers;
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. */
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) */
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. */
127 rtx const_tiny_rtx[3][(int) MAX_MACHINE_MODE];
129 REAL_VALUE_TYPE dconst0;
130 REAL_VALUE_TYPE dconst1;
131 REAL_VALUE_TYPE dconst2;
132 REAL_VALUE_TYPE dconstm1;
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.
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.
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
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) */
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) */
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) */
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
176 #define MAX_SAVED_CONST_INT 64
178 static rtx const_int_rtx[MAX_SAVED_CONST_INT * 2 + 1];
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.
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. */
186 static rtx first_insn = NULL;
187 static rtx last_insn = NULL;
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. */
193 tree sequence_rtl_expr = NULL;
195 /* INSN_UID for next insn emitted.
196 Reset to 1 for each function compiled. */
198 static int cur_insn_uid = 1;
200 /* Line number and source file of the last line-number NOTE emitted.
201 This is used to avoid generating duplicates. */
203 static int last_linenum = 0;
204 static char *last_filename = 0;
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. */
212 char *regno_pointer_flag;
213 int regno_pointer_flag_length;
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;
220 /* Indexed by pseudo register number, gives the rtx for that pseudo.
221 Allocated in parallel with regno_pointer_flag. */
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. */
230 struct sequence_stack *sequence_stack;
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:
235 First, we keep a list of the expressions used to represent the sequence
236 stack in sequence_element_free_list.
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.
244 We do not bother to save this cached data over nested function calls.
245 Instead, we just reinitialize them. */
247 #define SEQUENCE_RESULT_SIZE 5
249 static struct sequence_stack *sequence_element_free_list;
250 static rtx sequence_result[SEQUENCE_RESULT_SIZE];
252 extern int rtx_equal_function_value_matters;
254 /* Filename and line number of last line-number note,
255 whether we actually emitted it or not. */
256 extern char *emit_filename;
257 extern int emit_lineno;
259 rtx change_address ();
262 extern struct obstack *rtl_obstack;
264 extern int stack_depth;
265 extern int max_stack_depth;
267 /* rtx gen_rtx (code, mode, [element1, ..., elementn])
269 ** This routine generates an RTX of the size specified by
270 ** <code>, which is an RTX code. The RTX structure is initialized
271 ** from the arguments <element1> through <elementn>, which are
272 ** interpreted according to the specific RTX type's format. The
273 ** special machine mode associated with the rtx (if any) is specified
276 ** gen_rtx can be invoked in a way which resembles the lisp-like
277 ** rtx it will generate. For example, the following rtx structure:
279 ** (plus:QI (mem:QI (reg:SI 1))
280 ** (mem:QI (plusw:SI (reg:SI 2) (reg:SI 3))))
282 ** ...would be generated by the following C code:
284 ** gen_rtx (PLUS, QImode,
285 ** gen_rtx (MEM, QImode,
286 ** gen_rtx (REG, SImode, 1)),
287 ** gen_rtx (MEM, QImode,
288 ** gen_rtx (PLUS, SImode,
289 ** gen_rtx (REG, SImode, 2),
290 ** gen_rtx (REG, SImode, 3)))),
295 gen_rtx VPROTO((enum rtx_code code, enum machine_mode mode, ...))
299 enum machine_mode mode;
302 register int i; /* Array indices... */
303 register char *fmt; /* Current rtx's format... */
304 register rtx rt_val; /* RTX to return to caller... */
309 code = va_arg (p, enum rtx_code);
310 mode = va_arg (p, enum machine_mode);
313 if (code == CONST_INT)
315 HOST_WIDE_INT arg = va_arg (p, HOST_WIDE_INT);
317 if (arg >= - MAX_SAVED_CONST_INT && arg <= MAX_SAVED_CONST_INT)
318 return const_int_rtx[arg + MAX_SAVED_CONST_INT];
320 if (const_true_rtx && arg == STORE_FLAG_VALUE)
321 return const_true_rtx;
323 rt_val = rtx_alloc (code);
324 INTVAL (rt_val) = arg;
326 else if (code == REG)
328 int regno = va_arg (p, int);
330 /* In case the MD file explicitly references the frame pointer, have
331 all such references point to the same frame pointer. This is used
332 during frame pointer elimination to distinguish the explicit
333 references to these registers from pseudos that happened to be
336 If we have eliminated the frame pointer or arg pointer, we will
337 be using it as a normal register, for example as a spill register.
338 In such cases, we might be accessing it in a mode that is not
339 Pmode and therefore cannot use the pre-allocated rtx.
341 Also don't do this when we are making new REGs in reload,
342 since we don't want to get confused with the real pointers. */
344 if (frame_pointer_rtx && regno == FRAME_POINTER_REGNUM && mode == Pmode
345 && ! reload_in_progress)
346 return frame_pointer_rtx;
347 #if FRAME_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM
348 if (hard_frame_pointer_rtx && regno == HARD_FRAME_POINTER_REGNUM
349 && mode == Pmode && ! reload_in_progress)
350 return hard_frame_pointer_rtx;
352 #if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM && HARD_FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
353 if (arg_pointer_rtx && regno == ARG_POINTER_REGNUM && mode == Pmode
354 && ! reload_in_progress)
355 return arg_pointer_rtx;
357 #ifdef RETURN_ADDRESS_POINTER_REGNUM
358 if (return_address_pointer_rtx && regno == RETURN_ADDRESS_POINTER_REGNUM
359 && mode == Pmode && ! reload_in_progress)
360 return return_address_pointer_rtx;
362 if (stack_pointer_rtx && regno == STACK_POINTER_REGNUM && mode == Pmode
363 && ! reload_in_progress)
364 return stack_pointer_rtx;
367 rt_val = rtx_alloc (code);
369 REGNO (rt_val) = regno;
375 rt_val = rtx_alloc (code); /* Allocate the storage space. */
376 rt_val->mode = mode; /* Store the machine mode... */
378 fmt = GET_RTX_FORMAT (code); /* Find the right format... */
379 for (i = 0; i < GET_RTX_LENGTH (code); i++)
383 case '0': /* Unused field. */
386 case 'i': /* An integer? */
387 XINT (rt_val, i) = va_arg (p, int);
390 case 'w': /* A wide integer? */
391 XWINT (rt_val, i) = va_arg (p, HOST_WIDE_INT);
394 case 's': /* A string? */
395 XSTR (rt_val, i) = va_arg (p, char *);
398 case 'e': /* An expression? */
399 case 'u': /* An insn? Same except when printing. */
400 XEXP (rt_val, i) = va_arg (p, rtx);
403 case 'E': /* An RTX vector? */
404 XVEC (rt_val, i) = va_arg (p, rtvec);
413 return rt_val; /* Return the new RTX... */
416 /* gen_rtvec (n, [rt1, ..., rtn])
418 ** This routine creates an rtvec and stores within it the
419 ** pointers to rtx's which are its arguments.
424 gen_rtvec VPROTO((int n, ...))
440 return NULL_RTVEC; /* Don't allocate an empty rtvec... */
442 vector = (rtx *) alloca (n * sizeof (rtx));
444 for (i = 0; i < n; i++)
445 vector[i] = va_arg (p, rtx);
448 return gen_rtvec_v (n, vector);
452 gen_rtvec_v (n, argp)
457 register rtvec rt_val;
460 return NULL_RTVEC; /* Don't allocate an empty rtvec... */
462 rt_val = rtvec_alloc (n); /* Allocate an rtvec... */
464 for (i = 0; i < n; i++)
465 rt_val->elem[i].rtx = *argp++;
470 /* Generate a REG rtx for a new pseudo register of mode MODE.
471 This pseudo is assigned the next sequential register number. */
475 enum machine_mode mode;
479 /* Don't let anything called by or after reload create new registers
480 (actually, registers can't be created after flow, but this is a good
483 if (reload_in_progress || reload_completed)
486 if (GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT
487 || GET_MODE_CLASS (mode) == MODE_COMPLEX_INT)
489 /* For complex modes, don't make a single pseudo.
490 Instead, make a CONCAT of two pseudos.
491 This allows noncontiguous allocation of the real and imaginary parts,
492 which makes much better code. Besides, allocating DCmode
493 pseudos overstrains reload on some machines like the 386. */
494 rtx realpart, imagpart;
495 int size = GET_MODE_UNIT_SIZE (mode);
496 enum machine_mode partmode
497 = mode_for_size (size * BITS_PER_UNIT,
498 (GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT
499 ? MODE_FLOAT : MODE_INT),
502 realpart = gen_reg_rtx (partmode);
503 imagpart = gen_reg_rtx (partmode);
504 return gen_rtx (CONCAT, mode, realpart, imagpart);
507 /* Make sure regno_pointer_flag and regno_reg_rtx are large
508 enough to have an element for this pseudo reg number. */
510 if (reg_rtx_no == regno_pointer_flag_length)
514 (char *) savealloc (regno_pointer_flag_length * 2);
515 bcopy (regno_pointer_flag, new, regno_pointer_flag_length);
516 bzero (&new[regno_pointer_flag_length], regno_pointer_flag_length);
517 regno_pointer_flag = new;
519 new = (char *) savealloc (regno_pointer_flag_length * 2);
520 bcopy (regno_pointer_align, new, regno_pointer_flag_length);
521 bzero (&new[regno_pointer_flag_length], regno_pointer_flag_length);
522 regno_pointer_align = new;
524 new1 = (rtx *) savealloc (regno_pointer_flag_length * 2 * sizeof (rtx));
525 bcopy ((char *) regno_reg_rtx, (char *) new1,
526 regno_pointer_flag_length * sizeof (rtx));
527 bzero ((char *) &new1[regno_pointer_flag_length],
528 regno_pointer_flag_length * sizeof (rtx));
529 regno_reg_rtx = new1;
531 regno_pointer_flag_length *= 2;
534 val = gen_rtx (REG, mode, reg_rtx_no);
535 regno_reg_rtx[reg_rtx_no++] = val;
539 /* Identify REG as a probable pointer register and show its alignment
540 as ALIGN, if nonzero. */
543 mark_reg_pointer (reg, align)
547 REGNO_POINTER_FLAG (REGNO (reg)) = 1;
550 REGNO_POINTER_ALIGN (REGNO (reg)) = align;
553 /* Return 1 plus largest pseudo reg number used in the current function. */
561 /* Return 1 + the largest label number used so far in the current function. */
566 if (last_label_num && label_num == base_label_num)
567 return last_label_num;
571 /* Return first label number used in this function (if any were used). */
574 get_first_label_num ()
576 return first_label_num;
579 /* Return a value representing some low-order bits of X, where the number
580 of low-order bits is given by MODE. Note that no conversion is done
581 between floating-point and fixed-point values, rather, the bit
582 representation is returned.
584 This function handles the cases in common between gen_lowpart, below,
585 and two variants in cse.c and combine.c. These are the cases that can
586 be safely handled at all points in the compilation.
588 If this is not a case we can handle, return 0. */
591 gen_lowpart_common (mode, x)
592 enum machine_mode mode;
597 if (GET_MODE (x) == mode)
600 /* MODE must occupy no more words than the mode of X. */
601 if (GET_MODE (x) != VOIDmode
602 && ((GET_MODE_SIZE (mode) + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD
603 > ((GET_MODE_SIZE (GET_MODE (x)) + (UNITS_PER_WORD - 1))
607 if (WORDS_BIG_ENDIAN && GET_MODE_SIZE (GET_MODE (x)) > UNITS_PER_WORD)
608 word = ((GET_MODE_SIZE (GET_MODE (x))
609 - MAX (GET_MODE_SIZE (mode), UNITS_PER_WORD))
612 if ((GET_CODE (x) == ZERO_EXTEND || GET_CODE (x) == SIGN_EXTEND)
613 && (GET_MODE_CLASS (mode) == MODE_INT
614 || GET_MODE_CLASS (mode) == MODE_PARTIAL_INT))
616 /* If we are getting the low-order part of something that has been
617 sign- or zero-extended, we can either just use the object being
618 extended or make a narrower extension. If we want an even smaller
619 piece than the size of the object being extended, call ourselves
622 This case is used mostly by combine and cse. */
624 if (GET_MODE (XEXP (x, 0)) == mode)
626 else if (GET_MODE_SIZE (mode) < GET_MODE_SIZE (GET_MODE (XEXP (x, 0))))
627 return gen_lowpart_common (mode, XEXP (x, 0));
628 else if (GET_MODE_SIZE (mode) < GET_MODE_SIZE (GET_MODE (x)))
629 return gen_rtx (GET_CODE (x), mode, XEXP (x, 0));
631 else if (GET_CODE (x) == SUBREG
632 && (GET_MODE_SIZE (mode) <= UNITS_PER_WORD
633 || GET_MODE_SIZE (mode) == GET_MODE_UNIT_SIZE (GET_MODE (x))))
634 return (GET_MODE (SUBREG_REG (x)) == mode && SUBREG_WORD (x) == 0
636 : gen_rtx (SUBREG, mode, SUBREG_REG (x), SUBREG_WORD (x)));
637 else if (GET_CODE (x) == REG)
639 /* If the register is not valid for MODE, return 0. If we don't
640 do this, there is no way to fix up the resulting REG later.
641 But we do do this if the current REG is not valid for its
642 mode. This latter is a kludge, but is required due to the
643 way that parameters are passed on some machines, most
645 if (REGNO (x) < FIRST_PSEUDO_REGISTER
646 && ! HARD_REGNO_MODE_OK (REGNO (x) + word, mode)
647 && HARD_REGNO_MODE_OK (REGNO (x), GET_MODE (x)))
649 else if (REGNO (x) < FIRST_PSEUDO_REGISTER
650 /* integrate.c can't handle parts of a return value register. */
651 && (! REG_FUNCTION_VALUE_P (x)
652 || ! rtx_equal_function_value_matters)
653 /* We want to keep the stack, frame, and arg pointers
655 && x != frame_pointer_rtx
656 #if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
657 && x != arg_pointer_rtx
659 && x != stack_pointer_rtx)
660 return gen_rtx (REG, mode, REGNO (x) + word);
662 return gen_rtx (SUBREG, mode, x, word);
664 /* If X is a CONST_INT or a CONST_DOUBLE, extract the appropriate bits
665 from the low-order part of the constant. */
666 else if ((GET_MODE_CLASS (mode) == MODE_INT
667 || GET_MODE_CLASS (mode) == MODE_PARTIAL_INT)
668 && GET_MODE (x) == VOIDmode
669 && (GET_CODE (x) == CONST_INT || GET_CODE (x) == CONST_DOUBLE))
671 /* If MODE is twice the host word size, X is already the desired
672 representation. Otherwise, if MODE is wider than a word, we can't
673 do this. If MODE is exactly a word, return just one CONST_INT.
674 If MODE is smaller than a word, clear the bits that don't belong
675 in our mode, unless they and our sign bit are all one. So we get
676 either a reasonable negative value or a reasonable unsigned value
679 if (GET_MODE_BITSIZE (mode) >= 2 * HOST_BITS_PER_WIDE_INT)
681 else if (GET_MODE_BITSIZE (mode) > HOST_BITS_PER_WIDE_INT)
683 else if (GET_MODE_BITSIZE (mode) == HOST_BITS_PER_WIDE_INT)
684 return (GET_CODE (x) == CONST_INT ? x
685 : GEN_INT (CONST_DOUBLE_LOW (x)));
688 /* MODE must be narrower than HOST_BITS_PER_INT. */
689 int width = GET_MODE_BITSIZE (mode);
690 HOST_WIDE_INT val = (GET_CODE (x) == CONST_INT ? INTVAL (x)
691 : CONST_DOUBLE_LOW (x));
693 if (((val & ((HOST_WIDE_INT) (-1) << (width - 1)))
694 != ((HOST_WIDE_INT) (-1) << (width - 1))))
695 val &= ((HOST_WIDE_INT) 1 << width) - 1;
697 return (GET_CODE (x) == CONST_INT && INTVAL (x) == val ? x
702 /* If X is an integral constant but we want it in floating-point, it
703 must be the case that we have a union of an integer and a floating-point
704 value. If the machine-parameters allow it, simulate that union here
705 and return the result. The two-word and single-word cases are
708 else if (((HOST_FLOAT_FORMAT == TARGET_FLOAT_FORMAT
709 && HOST_BITS_PER_WIDE_INT == BITS_PER_WORD)
710 || flag_pretend_float)
711 && GET_MODE_CLASS (mode) == MODE_FLOAT
712 && GET_MODE_SIZE (mode) == UNITS_PER_WORD
713 && GET_CODE (x) == CONST_INT
714 && sizeof (float) * HOST_BITS_PER_CHAR == HOST_BITS_PER_WIDE_INT)
715 #ifdef REAL_ARITHMETIC
721 r = REAL_VALUE_FROM_TARGET_SINGLE (i);
722 return CONST_DOUBLE_FROM_REAL_VALUE (r, mode);
726 union {HOST_WIDE_INT i; float d; } u;
729 return CONST_DOUBLE_FROM_REAL_VALUE (u.d, mode);
732 else if (((HOST_FLOAT_FORMAT == TARGET_FLOAT_FORMAT
733 && HOST_BITS_PER_WIDE_INT == BITS_PER_WORD)
734 || flag_pretend_float)
735 && GET_MODE_CLASS (mode) == MODE_FLOAT
736 && GET_MODE_SIZE (mode) == 2 * UNITS_PER_WORD
737 && (GET_CODE (x) == CONST_INT || GET_CODE (x) == CONST_DOUBLE)
738 && GET_MODE (x) == VOIDmode
739 && (sizeof (double) * HOST_BITS_PER_CHAR
740 == 2 * HOST_BITS_PER_WIDE_INT))
741 #ifdef REAL_ARITHMETIC
745 HOST_WIDE_INT low, high;
747 if (GET_CODE (x) == CONST_INT)
748 low = INTVAL (x), high = low >> (HOST_BITS_PER_WIDE_INT -1);
750 low = CONST_DOUBLE_LOW (x), high = CONST_DOUBLE_HIGH (x);
752 /* REAL_VALUE_TARGET_DOUBLE takes the addressing order of the
754 if (WORDS_BIG_ENDIAN)
755 i[0] = high, i[1] = low;
757 i[0] = low, i[1] = high;
759 r = REAL_VALUE_FROM_TARGET_DOUBLE (i);
760 return CONST_DOUBLE_FROM_REAL_VALUE (r, mode);
764 union {HOST_WIDE_INT i[2]; double d; } u;
765 HOST_WIDE_INT low, high;
767 if (GET_CODE (x) == CONST_INT)
768 low = INTVAL (x), high = low >> (HOST_BITS_PER_WIDE_INT -1);
770 low = CONST_DOUBLE_LOW (x), high = CONST_DOUBLE_HIGH (x);
772 #ifdef HOST_WORDS_BIG_ENDIAN
773 u.i[0] = high, u.i[1] = low;
775 u.i[0] = low, u.i[1] = high;
778 return CONST_DOUBLE_FROM_REAL_VALUE (u.d, mode);
781 /* Similarly, if this is converting a floating-point value into a
782 single-word integer. Only do this is the host and target parameters are
785 else if (((HOST_FLOAT_FORMAT == TARGET_FLOAT_FORMAT
786 && HOST_BITS_PER_WIDE_INT == BITS_PER_WORD)
787 || flag_pretend_float)
788 && (GET_MODE_CLASS (mode) == MODE_INT
789 || GET_MODE_CLASS (mode) == MODE_PARTIAL_INT)
790 && GET_CODE (x) == CONST_DOUBLE
791 && GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT
792 && GET_MODE_BITSIZE (mode) == BITS_PER_WORD)
793 return operand_subword (x, 0, 0, GET_MODE (x));
795 /* Similarly, if this is converting a floating-point value into a
796 two-word integer, we can do this one word at a time and make an
797 integer. Only do this is the host and target parameters are
800 else if (((HOST_FLOAT_FORMAT == TARGET_FLOAT_FORMAT
801 && HOST_BITS_PER_WIDE_INT == BITS_PER_WORD)
802 || flag_pretend_float)
803 && (GET_MODE_CLASS (mode) == MODE_INT
804 || GET_MODE_CLASS (mode) == MODE_PARTIAL_INT)
805 && GET_CODE (x) == CONST_DOUBLE
806 && GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT
807 && GET_MODE_BITSIZE (mode) == 2 * BITS_PER_WORD)
809 rtx lowpart = operand_subword (x, WORDS_BIG_ENDIAN, 0, GET_MODE (x));
810 rtx highpart = operand_subword (x, ! WORDS_BIG_ENDIAN, 0, GET_MODE (x));
812 if (lowpart && GET_CODE (lowpart) == CONST_INT
813 && highpart && GET_CODE (highpart) == CONST_INT)
814 return immed_double_const (INTVAL (lowpart), INTVAL (highpart), mode);
817 /* Otherwise, we can't do this. */
821 /* Return the real part (which has mode MODE) of a complex value X.
822 This always comes at the low address in memory. */
825 gen_realpart (mode, x)
826 enum machine_mode mode;
829 if (GET_CODE (x) == CONCAT && GET_MODE (XEXP (x, 0)) == mode)
831 else if (WORDS_BIG_ENDIAN)
832 return gen_highpart (mode, x);
834 return gen_lowpart (mode, x);
837 /* Return the imaginary part (which has mode MODE) of a complex value X.
838 This always comes at the high address in memory. */
841 gen_imagpart (mode, x)
842 enum machine_mode mode;
845 if (GET_CODE (x) == CONCAT && GET_MODE (XEXP (x, 0)) == mode)
847 else if (WORDS_BIG_ENDIAN)
848 return gen_lowpart (mode, x);
850 return gen_highpart (mode, x);
853 /* Return 1 iff X, assumed to be a SUBREG,
854 refers to the real part of the complex value in its containing reg.
855 Complex values are always stored with the real part in the first word,
856 regardless of WORDS_BIG_ENDIAN. */
859 subreg_realpart_p (x)
862 if (GET_CODE (x) != SUBREG)
865 return SUBREG_WORD (x) == 0;
868 /* Assuming that X is an rtx (e.g., MEM, REG or SUBREG) for a value,
869 return an rtx (MEM, SUBREG, or CONST_INT) that refers to the
870 least-significant part of X.
871 MODE specifies how big a part of X to return;
872 it usually should not be larger than a word.
873 If X is a MEM whose address is a QUEUED, the value may be so also. */
876 gen_lowpart (mode, x)
877 enum machine_mode mode;
880 rtx result = gen_lowpart_common (mode, x);
884 else if (GET_CODE (x) == REG)
886 /* Must be a hard reg that's not valid in MODE. */
887 result = gen_lowpart_common (mode, copy_to_reg (x));
892 else if (GET_CODE (x) == MEM)
894 /* The only additional case we can do is MEM. */
895 register int offset = 0;
896 if (WORDS_BIG_ENDIAN)
897 offset = (MAX (GET_MODE_SIZE (GET_MODE (x)), UNITS_PER_WORD)
898 - MAX (GET_MODE_SIZE (mode), UNITS_PER_WORD));
900 if (BYTES_BIG_ENDIAN)
901 /* Adjust the address so that the address-after-the-data
903 offset -= (MIN (UNITS_PER_WORD, GET_MODE_SIZE (mode))
904 - MIN (UNITS_PER_WORD, GET_MODE_SIZE (GET_MODE (x))));
906 return change_address (x, mode, plus_constant (XEXP (x, 0), offset));
912 /* Like `gen_lowpart', but refer to the most significant part.
913 This is used to access the imaginary part of a complex number. */
916 gen_highpart (mode, x)
917 enum machine_mode mode;
920 /* This case loses if X is a subreg. To catch bugs early,
921 complain if an invalid MODE is used even in other cases. */
922 if (GET_MODE_SIZE (mode) > UNITS_PER_WORD
923 && GET_MODE_SIZE (mode) != GET_MODE_UNIT_SIZE (GET_MODE (x)))
925 if (GET_CODE (x) == CONST_DOUBLE
926 #if !(TARGET_FLOAT_FORMAT != HOST_FLOAT_FORMAT || defined (REAL_IS_NOT_DOUBLE))
927 && GET_MODE_CLASS (GET_MODE (x)) != MODE_FLOAT
930 return gen_rtx (CONST_INT, VOIDmode,
931 CONST_DOUBLE_HIGH (x) & GET_MODE_MASK (mode));
932 else if (GET_CODE (x) == CONST_INT)
934 else if (GET_CODE (x) == MEM)
936 register int offset = 0;
937 if (! WORDS_BIG_ENDIAN)
938 offset = (MAX (GET_MODE_SIZE (GET_MODE (x)), UNITS_PER_WORD)
939 - MAX (GET_MODE_SIZE (mode), UNITS_PER_WORD));
941 if (! BYTES_BIG_ENDIAN
942 && GET_MODE_SIZE (mode) < UNITS_PER_WORD)
943 offset -= (GET_MODE_SIZE (mode)
944 - MIN (UNITS_PER_WORD,
945 GET_MODE_SIZE (GET_MODE (x))));
947 return change_address (x, mode, plus_constant (XEXP (x, 0), offset));
949 else if (GET_CODE (x) == SUBREG)
951 /* The only time this should occur is when we are looking at a
952 multi-word item with a SUBREG whose mode is the same as that of the
953 item. It isn't clear what we would do if it wasn't. */
954 if (SUBREG_WORD (x) != 0)
956 return gen_highpart (mode, SUBREG_REG (x));
958 else if (GET_CODE (x) == REG)
962 if (! WORDS_BIG_ENDIAN
963 && GET_MODE_SIZE (GET_MODE (x)) > UNITS_PER_WORD)
964 word = ((GET_MODE_SIZE (GET_MODE (x))
965 - MAX (GET_MODE_SIZE (mode), UNITS_PER_WORD))
969 * ??? This fails miserably for complex values being passed in registers
970 * where the sizeof the real and imaginary part are not equal to the
971 * sizeof SImode. FIXME
974 if (REGNO (x) < FIRST_PSEUDO_REGISTER
975 /* integrate.c can't handle parts of a return value register. */
976 && (! REG_FUNCTION_VALUE_P (x)
977 || ! rtx_equal_function_value_matters)
978 /* We want to keep the stack, frame, and arg pointers special. */
979 && x != frame_pointer_rtx
980 #if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
981 && x != arg_pointer_rtx
983 && x != stack_pointer_rtx)
984 return gen_rtx (REG, mode, REGNO (x) + word);
986 return gen_rtx (SUBREG, mode, x, word);
992 /* Return 1 iff X, assumed to be a SUBREG,
993 refers to the least significant part of its containing reg.
994 If X is not a SUBREG, always return 1 (it is its own low part!). */
1000 if (GET_CODE (x) != SUBREG)
1003 if (WORDS_BIG_ENDIAN
1004 && GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))) > UNITS_PER_WORD)
1005 return (SUBREG_WORD (x)
1006 == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (x)))
1007 - MAX (GET_MODE_SIZE (GET_MODE (x)), UNITS_PER_WORD))
1010 return SUBREG_WORD (x) == 0;
1013 /* Return subword I of operand OP.
1014 The word number, I, is interpreted as the word number starting at the
1015 low-order address. Word 0 is the low-order word if not WORDS_BIG_ENDIAN,
1016 otherwise it is the high-order word.
1018 If we cannot extract the required word, we return zero. Otherwise, an
1019 rtx corresponding to the requested word will be returned.
1021 VALIDATE_ADDRESS is nonzero if the address should be validated. Before
1022 reload has completed, a valid address will always be returned. After
1023 reload, if a valid address cannot be returned, we return zero.
1025 If VALIDATE_ADDRESS is zero, we simply form the required address; validating
1026 it is the responsibility of the caller.
1028 MODE is the mode of OP in case it is a CONST_INT. */
1031 operand_subword (op, i, validate_address, mode)
1034 int validate_address;
1035 enum machine_mode mode;
1038 int size_ratio = HOST_BITS_PER_WIDE_INT / BITS_PER_WORD;
1040 if (mode == VOIDmode)
1041 mode = GET_MODE (op);
1043 if (mode == VOIDmode)
1046 /* If OP is narrower than a word or if we want a word outside OP, fail. */
1048 && (GET_MODE_SIZE (mode) < UNITS_PER_WORD
1049 || (i + 1) * UNITS_PER_WORD > GET_MODE_SIZE (mode)))
1052 /* If OP is already an integer word, return it. */
1053 if (GET_MODE_CLASS (mode) == MODE_INT
1054 && GET_MODE_SIZE (mode) == UNITS_PER_WORD)
1057 /* If OP is a REG or SUBREG, we can handle it very simply. */
1058 if (GET_CODE (op) == REG)
1060 /* If the register is not valid for MODE, return 0. If we don't
1061 do this, there is no way to fix up the resulting REG later. */
1062 if (REGNO (op) < FIRST_PSEUDO_REGISTER
1063 && ! HARD_REGNO_MODE_OK (REGNO (op) + i, word_mode))
1065 else if (REGNO (op) >= FIRST_PSEUDO_REGISTER
1066 || (REG_FUNCTION_VALUE_P (op)
1067 && rtx_equal_function_value_matters)
1068 /* We want to keep the stack, frame, and arg pointers
1070 || op == frame_pointer_rtx
1071 #if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
1072 || op == arg_pointer_rtx
1074 || op == stack_pointer_rtx)
1075 return gen_rtx (SUBREG, word_mode, op, i);
1077 return gen_rtx (REG, word_mode, REGNO (op) + i);
1079 else if (GET_CODE (op) == SUBREG)
1080 return gen_rtx (SUBREG, word_mode, SUBREG_REG (op), i + SUBREG_WORD (op));
1081 else if (GET_CODE (op) == CONCAT)
1083 int partwords = GET_MODE_UNIT_SIZE (GET_MODE (op)) / UNITS_PER_WORD;
1085 return operand_subword (XEXP (op, 0), i, validate_address, mode);
1086 return operand_subword (XEXP (op, 1), i - partwords,
1087 validate_address, mode);
1090 /* Form a new MEM at the requested address. */
1091 if (GET_CODE (op) == MEM)
1093 rtx addr = plus_constant (XEXP (op, 0), i * UNITS_PER_WORD);
1096 if (validate_address)
1098 if (reload_completed)
1100 if (! strict_memory_address_p (word_mode, addr))
1104 addr = memory_address (word_mode, addr);
1107 new = gen_rtx (MEM, word_mode, addr);
1109 MEM_VOLATILE_P (new) = MEM_VOLATILE_P (op);
1110 MEM_IN_STRUCT_P (new) = MEM_IN_STRUCT_P (op);
1111 RTX_UNCHANGING_P (new) = RTX_UNCHANGING_P (op);
1116 /* The only remaining cases are when OP is a constant. If the host and
1117 target floating formats are the same, handling two-word floating
1118 constants are easy. Note that REAL_VALUE_TO_TARGET_{SINGLE,DOUBLE}
1119 are defined as returning one or two 32 bit values, respectively,
1120 and not values of BITS_PER_WORD bits. */
1121 #ifdef REAL_ARITHMETIC
1122 /* The output is some bits, the width of the target machine's word.
1123 A wider-word host can surely hold them in a CONST_INT. A narrower-word
1125 if (HOST_BITS_PER_WIDE_INT >= BITS_PER_WORD
1126 && GET_MODE_CLASS (mode) == MODE_FLOAT
1127 && GET_MODE_BITSIZE (mode) == 64
1128 && GET_CODE (op) == CONST_DOUBLE)
1133 REAL_VALUE_FROM_CONST_DOUBLE (rv, op);
1134 REAL_VALUE_TO_TARGET_DOUBLE (rv, k);
1136 /* We handle 32-bit and >= 64-bit words here. Note that the order in
1137 which the words are written depends on the word endianness.
1139 ??? This is a potential portability problem and should
1140 be fixed at some point. */
1141 if (BITS_PER_WORD == 32)
1142 return GEN_INT ((HOST_WIDE_INT) k[i]);
1143 #if HOST_BITS_PER_WIDE_INT > 32
1144 else if (BITS_PER_WORD >= 64 && i == 0)
1145 return GEN_INT ((((HOST_WIDE_INT) k[! WORDS_BIG_ENDIAN]) << 32)
1146 | (HOST_WIDE_INT) k[WORDS_BIG_ENDIAN]);
1148 else if (BITS_PER_WORD == 16)
1155 return GEN_INT ((HOST_WIDE_INT) value);
1160 else if (HOST_BITS_PER_WIDE_INT >= BITS_PER_WORD
1161 && GET_MODE_CLASS (mode) == MODE_FLOAT
1162 && GET_MODE_BITSIZE (mode) > 64
1163 && GET_CODE (op) == CONST_DOUBLE)
1168 REAL_VALUE_FROM_CONST_DOUBLE (rv, op);
1169 REAL_VALUE_TO_TARGET_LONG_DOUBLE (rv, k);
1171 if (BITS_PER_WORD == 32)
1172 return GEN_INT ((HOST_WIDE_INT) k[i]);
1174 #else /* no REAL_ARITHMETIC */
1175 if (((HOST_FLOAT_FORMAT == TARGET_FLOAT_FORMAT
1176 && HOST_BITS_PER_WIDE_INT == BITS_PER_WORD)
1177 || flag_pretend_float)
1178 && GET_MODE_CLASS (mode) == MODE_FLOAT
1179 && GET_MODE_SIZE (mode) == 2 * UNITS_PER_WORD
1180 && GET_CODE (op) == CONST_DOUBLE)
1182 /* The constant is stored in the host's word-ordering,
1183 but we want to access it in the target's word-ordering. Some
1184 compilers don't like a conditional inside macro args, so we have two
1185 copies of the return. */
1186 #ifdef HOST_WORDS_BIG_ENDIAN
1187 return GEN_INT (i == WORDS_BIG_ENDIAN
1188 ? CONST_DOUBLE_HIGH (op) : CONST_DOUBLE_LOW (op));
1190 return GEN_INT (i != WORDS_BIG_ENDIAN
1191 ? CONST_DOUBLE_HIGH (op) : CONST_DOUBLE_LOW (op));
1194 #endif /* no REAL_ARITHMETIC */
1196 /* Single word float is a little harder, since single- and double-word
1197 values often do not have the same high-order bits. We have already
1198 verified that we want the only defined word of the single-word value. */
1199 #ifdef REAL_ARITHMETIC
1200 if (GET_MODE_CLASS (mode) == MODE_FLOAT
1201 && GET_MODE_BITSIZE (mode) == 32
1202 && GET_CODE (op) == CONST_DOUBLE)
1207 REAL_VALUE_FROM_CONST_DOUBLE (rv, op);
1208 REAL_VALUE_TO_TARGET_SINGLE (rv, l);
1209 return GEN_INT ((HOST_WIDE_INT) l);
1212 if (((HOST_FLOAT_FORMAT == TARGET_FLOAT_FORMAT
1213 && HOST_BITS_PER_WIDE_INT == BITS_PER_WORD)
1214 || flag_pretend_float)
1215 && GET_MODE_CLASS (mode) == MODE_FLOAT
1216 && GET_MODE_SIZE (mode) == UNITS_PER_WORD
1217 && GET_CODE (op) == CONST_DOUBLE)
1220 union {float f; HOST_WIDE_INT i; } u;
1222 REAL_VALUE_FROM_CONST_DOUBLE (d, op);
1225 return GEN_INT (u.i);
1227 #endif /* no REAL_ARITHMETIC */
1229 /* The only remaining cases that we can handle are integers.
1230 Convert to proper endianness now since these cases need it.
1231 At this point, i == 0 means the low-order word.
1233 We do not want to handle the case when BITS_PER_WORD <= HOST_BITS_PER_INT
1234 in general. However, if OP is (const_int 0), we can just return
1237 if (op == const0_rtx)
1240 if (GET_MODE_CLASS (mode) != MODE_INT
1241 || (GET_CODE (op) != CONST_INT && GET_CODE (op) != CONST_DOUBLE)
1242 || BITS_PER_WORD > HOST_BITS_PER_WIDE_INT)
1245 if (WORDS_BIG_ENDIAN)
1246 i = GET_MODE_SIZE (mode) / UNITS_PER_WORD - 1 - i;
1248 /* Find out which word on the host machine this value is in and get
1249 it from the constant. */
1250 val = (i / size_ratio == 0
1251 ? (GET_CODE (op) == CONST_INT ? INTVAL (op) : CONST_DOUBLE_LOW (op))
1252 : (GET_CODE (op) == CONST_INT
1253 ? (INTVAL (op) < 0 ? ~0 : 0) : CONST_DOUBLE_HIGH (op)));
1255 /* If BITS_PER_WORD is smaller than an int, get the appropriate bits. */
1256 if (BITS_PER_WORD < HOST_BITS_PER_WIDE_INT)
1257 val = ((val >> ((i % size_ratio) * BITS_PER_WORD))
1258 & (((HOST_WIDE_INT) 1
1259 << (BITS_PER_WORD % HOST_BITS_PER_WIDE_INT)) - 1));
1261 return GEN_INT (val);
1264 /* Similar to `operand_subword', but never return 0. If we can't extract
1265 the required subword, put OP into a register and try again. If that fails,
1266 abort. We always validate the address in this case. It is not valid
1267 to call this function after reload; it is mostly meant for RTL
1270 MODE is the mode of OP, in case it is CONST_INT. */
1273 operand_subword_force (op, i, mode)
1276 enum machine_mode mode;
1278 rtx result = operand_subword (op, i, 1, mode);
1283 if (mode != BLKmode && mode != VOIDmode)
1284 op = force_reg (mode, op);
1286 result = operand_subword (op, i, 1, mode);
1293 /* Given a compare instruction, swap the operands.
1294 A test instruction is changed into a compare of 0 against the operand. */
1297 reverse_comparison (insn)
1300 rtx body = PATTERN (insn);
1303 if (GET_CODE (body) == SET)
1304 comp = SET_SRC (body);
1306 comp = SET_SRC (XVECEXP (body, 0, 0));
1308 if (GET_CODE (comp) == COMPARE)
1310 rtx op0 = XEXP (comp, 0);
1311 rtx op1 = XEXP (comp, 1);
1312 XEXP (comp, 0) = op1;
1313 XEXP (comp, 1) = op0;
1317 rtx new = gen_rtx (COMPARE, VOIDmode,
1318 CONST0_RTX (GET_MODE (comp)), comp);
1319 if (GET_CODE (body) == SET)
1320 SET_SRC (body) = new;
1322 SET_SRC (XVECEXP (body, 0, 0)) = new;
1326 /* Return a memory reference like MEMREF, but with its mode changed
1327 to MODE and its address changed to ADDR.
1328 (VOIDmode means don't change the mode.
1329 NULL for ADDR means don't change the address.) */
1332 change_address (memref, mode, addr)
1334 enum machine_mode mode;
1339 if (GET_CODE (memref) != MEM)
1341 if (mode == VOIDmode)
1342 mode = GET_MODE (memref);
1344 addr = XEXP (memref, 0);
1346 /* If reload is in progress or has completed, ADDR must be valid.
1347 Otherwise, we can call memory_address to make it valid. */
1348 if (reload_completed || reload_in_progress)
1350 if (! memory_address_p (mode, addr))
1354 addr = memory_address (mode, addr);
1356 new = gen_rtx (MEM, mode, addr);
1357 MEM_VOLATILE_P (new) = MEM_VOLATILE_P (memref);
1358 RTX_UNCHANGING_P (new) = RTX_UNCHANGING_P (memref);
1359 MEM_IN_STRUCT_P (new) = MEM_IN_STRUCT_P (memref);
1363 /* Return a newly created CODE_LABEL rtx with a unique label number. */
1370 label = (output_bytecode
1371 ? gen_rtx (CODE_LABEL, VOIDmode, NULL, bc_get_bytecode_label ())
1372 : gen_rtx (CODE_LABEL, VOIDmode, 0, 0, 0, label_num++, NULL_PTR));
1374 LABEL_NUSES (label) = 0;
1378 /* For procedure integration. */
1380 /* Return a newly created INLINE_HEADER rtx. Should allocate this
1381 from a permanent obstack when the opportunity arises. */
1384 gen_inline_header_rtx (first_insn, first_parm_insn, first_labelno,
1385 last_labelno, max_parm_regnum, max_regnum, args_size,
1386 pops_args, stack_slots, forced_labels, function_flags,
1387 outgoing_args_size, original_arg_vector,
1388 original_decl_initial, regno_rtx, regno_flag,
1390 rtx first_insn, first_parm_insn;
1391 int first_labelno, last_labelno, max_parm_regnum, max_regnum, args_size;
1396 int outgoing_args_size;
1397 rtvec original_arg_vector;
1398 rtx original_decl_initial;
1403 rtx header = gen_rtx (INLINE_HEADER, VOIDmode,
1404 cur_insn_uid++, NULL_RTX,
1405 first_insn, first_parm_insn,
1406 first_labelno, last_labelno,
1407 max_parm_regnum, max_regnum, args_size, pops_args,
1408 stack_slots, forced_labels, function_flags,
1409 outgoing_args_size, original_arg_vector,
1410 original_decl_initial,
1411 regno_rtx, regno_flag, regno_align);
1415 /* Install new pointers to the first and last insns in the chain.
1416 Also, set cur_insn_uid to one higher than the last in use.
1417 Used for an inline-procedure after copying the insn chain. */
1420 set_new_first_and_last_insn (first, last)
1429 for (insn = first; insn; insn = NEXT_INSN (insn))
1430 cur_insn_uid = MAX (cur_insn_uid, INSN_UID (insn));
1435 /* Set the range of label numbers found in the current function.
1436 This is used when belatedly compiling an inline function. */
1439 set_new_first_and_last_label_num (first, last)
1442 base_label_num = label_num;
1443 first_label_num = first;
1444 last_label_num = last;
1447 /* Save all variables describing the current status into the structure *P.
1448 This is used before starting a nested function. */
1451 save_emit_status (p)
1454 p->reg_rtx_no = reg_rtx_no;
1455 p->first_label_num = first_label_num;
1456 p->first_insn = first_insn;
1457 p->last_insn = last_insn;
1458 p->sequence_rtl_expr = sequence_rtl_expr;
1459 p->sequence_stack = sequence_stack;
1460 p->cur_insn_uid = cur_insn_uid;
1461 p->last_linenum = last_linenum;
1462 p->last_filename = last_filename;
1463 p->regno_pointer_flag = regno_pointer_flag;
1464 p->regno_pointer_align = regno_pointer_align;
1465 p->regno_pointer_flag_length = regno_pointer_flag_length;
1466 p->regno_reg_rtx = regno_reg_rtx;
1469 /* Restore all variables describing the current status from the structure *P.
1470 This is used after a nested function. */
1473 restore_emit_status (p)
1478 reg_rtx_no = p->reg_rtx_no;
1479 first_label_num = p->first_label_num;
1481 first_insn = p->first_insn;
1482 last_insn = p->last_insn;
1483 sequence_rtl_expr = p->sequence_rtl_expr;
1484 sequence_stack = p->sequence_stack;
1485 cur_insn_uid = p->cur_insn_uid;
1486 last_linenum = p->last_linenum;
1487 last_filename = p->last_filename;
1488 regno_pointer_flag = p->regno_pointer_flag;
1489 regno_pointer_align = p->regno_pointer_align;
1490 regno_pointer_flag_length = p->regno_pointer_flag_length;
1491 regno_reg_rtx = p->regno_reg_rtx;
1493 /* Clear our cache of rtx expressions for start_sequence and gen_sequence. */
1494 sequence_element_free_list = 0;
1495 for (i = 0; i < SEQUENCE_RESULT_SIZE; i++)
1496 sequence_result[i] = 0;
1499 /* Go through all the RTL insn bodies and copy any invalid shared structure.
1500 It does not work to do this twice, because the mark bits set here
1501 are not cleared afterwards. */
1504 unshare_all_rtl (insn)
1507 for (; insn; insn = NEXT_INSN (insn))
1508 if (GET_CODE (insn) == INSN || GET_CODE (insn) == JUMP_INSN
1509 || GET_CODE (insn) == CALL_INSN)
1511 PATTERN (insn) = copy_rtx_if_shared (PATTERN (insn));
1512 REG_NOTES (insn) = copy_rtx_if_shared (REG_NOTES (insn));
1513 LOG_LINKS (insn) = copy_rtx_if_shared (LOG_LINKS (insn));
1516 /* Make sure the addresses of stack slots found outside the insn chain
1517 (such as, in DECL_RTL of a variable) are not shared
1518 with the insn chain.
1520 This special care is necessary when the stack slot MEM does not
1521 actually appear in the insn chain. If it does appear, its address
1522 is unshared from all else at that point. */
1524 copy_rtx_if_shared (stack_slot_list);
1527 /* Mark ORIG as in use, and return a copy of it if it was already in use.
1528 Recursively does the same for subexpressions. */
1531 copy_rtx_if_shared (orig)
1534 register rtx x = orig;
1536 register enum rtx_code code;
1537 register char *format_ptr;
1543 code = GET_CODE (x);
1545 /* These types may be freely shared. */
1558 /* SCRATCH must be shared because they represent distinct values. */
1562 /* CONST can be shared if it contains a SYMBOL_REF. If it contains
1563 a LABEL_REF, it isn't sharable. */
1564 if (GET_CODE (XEXP (x, 0)) == PLUS
1565 && GET_CODE (XEXP (XEXP (x, 0), 0)) == SYMBOL_REF
1566 && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT)
1575 /* The chain of insns is not being copied. */
1579 /* A MEM is allowed to be shared if its address is constant
1580 or is a constant plus one of the special registers. */
1581 if (CONSTANT_ADDRESS_P (XEXP (x, 0))
1582 || XEXP (x, 0) == virtual_stack_vars_rtx
1583 || XEXP (x, 0) == virtual_incoming_args_rtx)
1586 if (GET_CODE (XEXP (x, 0)) == PLUS
1587 && (XEXP (XEXP (x, 0), 0) == virtual_stack_vars_rtx
1588 || XEXP (XEXP (x, 0), 0) == virtual_incoming_args_rtx)
1589 && CONSTANT_ADDRESS_P (XEXP (XEXP (x, 0), 1)))
1591 /* This MEM can appear in more than one place,
1592 but its address better not be shared with anything else. */
1594 XEXP (x, 0) = copy_rtx_if_shared (XEXP (x, 0));
1600 /* This rtx may not be shared. If it has already been seen,
1601 replace it with a copy of itself. */
1607 copy = rtx_alloc (code);
1608 bcopy ((char *) x, (char *) copy,
1609 (sizeof (*copy) - sizeof (copy->fld)
1610 + sizeof (copy->fld[0]) * GET_RTX_LENGTH (code)));
1616 /* Now scan the subexpressions recursively.
1617 We can store any replaced subexpressions directly into X
1618 since we know X is not shared! Any vectors in X
1619 must be copied if X was copied. */
1621 format_ptr = GET_RTX_FORMAT (code);
1623 for (i = 0; i < GET_RTX_LENGTH (code); i++)
1625 switch (*format_ptr++)
1628 XEXP (x, i) = copy_rtx_if_shared (XEXP (x, i));
1632 if (XVEC (x, i) != NULL)
1635 int len = XVECLEN (x, i);
1637 if (copied && len > 0)
1638 XVEC (x, i) = gen_rtvec_v (len, &XVECEXP (x, i, 0));
1639 for (j = 0; j < len; j++)
1640 XVECEXP (x, i, j) = copy_rtx_if_shared (XVECEXP (x, i, j));
1648 /* Clear all the USED bits in X to allow copy_rtx_if_shared to be used
1649 to look for shared sub-parts. */
1652 reset_used_flags (x)
1656 register enum rtx_code code;
1657 register char *format_ptr;
1662 code = GET_CODE (x);
1664 /* These types may be freely shared so we needn't do any resetting
1685 /* The chain of insns is not being copied. */
1691 format_ptr = GET_RTX_FORMAT (code);
1692 for (i = 0; i < GET_RTX_LENGTH (code); i++)
1694 switch (*format_ptr++)
1697 reset_used_flags (XEXP (x, i));
1701 for (j = 0; j < XVECLEN (x, i); j++)
1702 reset_used_flags (XVECEXP (x, i, j));
1708 /* Copy X if necessary so that it won't be altered by changes in OTHER.
1709 Return X or the rtx for the pseudo reg the value of X was copied into.
1710 OTHER must be valid as a SET_DEST. */
1713 make_safe_from (x, other)
1717 switch (GET_CODE (other))
1720 other = SUBREG_REG (other);
1722 case STRICT_LOW_PART:
1725 other = XEXP (other, 0);
1731 if ((GET_CODE (other) == MEM
1733 && GET_CODE (x) != REG
1734 && GET_CODE (x) != SUBREG)
1735 || (GET_CODE (other) == REG
1736 && (REGNO (other) < FIRST_PSEUDO_REGISTER
1737 || reg_mentioned_p (other, x))))
1739 rtx temp = gen_reg_rtx (GET_MODE (x));
1740 emit_move_insn (temp, x);
1746 /* Emission of insns (adding them to the doubly-linked list). */
1748 /* Return the first insn of the current sequence or current function. */
1756 /* Return the last insn emitted in current sequence or current function. */
1764 /* Specify a new insn as the last in the chain. */
1767 set_last_insn (insn)
1770 if (NEXT_INSN (insn) != 0)
1775 /* Return the last insn emitted, even if it is in a sequence now pushed. */
1778 get_last_insn_anywhere ()
1780 struct sequence_stack *stack;
1783 for (stack = sequence_stack; stack; stack = stack->next)
1784 if (stack->last != 0)
1789 /* Return a number larger than any instruction's uid in this function. */
1794 return cur_insn_uid;
1797 /* Return the next insn. If it is a SEQUENCE, return the first insn
1806 insn = NEXT_INSN (insn);
1807 if (insn && GET_CODE (insn) == INSN
1808 && GET_CODE (PATTERN (insn)) == SEQUENCE)
1809 insn = XVECEXP (PATTERN (insn), 0, 0);
1815 /* Return the previous insn. If it is a SEQUENCE, return the last insn
1819 previous_insn (insn)
1824 insn = PREV_INSN (insn);
1825 if (insn && GET_CODE (insn) == INSN
1826 && GET_CODE (PATTERN (insn)) == SEQUENCE)
1827 insn = XVECEXP (PATTERN (insn), 0, XVECLEN (PATTERN (insn), 0) - 1);
1833 /* Return the next insn after INSN that is not a NOTE. This routine does not
1834 look inside SEQUENCEs. */
1837 next_nonnote_insn (insn)
1842 insn = NEXT_INSN (insn);
1843 if (insn == 0 || GET_CODE (insn) != NOTE)
1850 /* Return the previous insn before INSN that is not a NOTE. This routine does
1851 not look inside SEQUENCEs. */
1854 prev_nonnote_insn (insn)
1859 insn = PREV_INSN (insn);
1860 if (insn == 0 || GET_CODE (insn) != NOTE)
1867 /* Return the next INSN, CALL_INSN or JUMP_INSN after INSN;
1868 or 0, if there is none. This routine does not look inside
1872 next_real_insn (insn)
1877 insn = NEXT_INSN (insn);
1878 if (insn == 0 || GET_CODE (insn) == INSN
1879 || GET_CODE (insn) == CALL_INSN || GET_CODE (insn) == JUMP_INSN)
1886 /* Return the last INSN, CALL_INSN or JUMP_INSN before INSN;
1887 or 0, if there is none. This routine does not look inside
1891 prev_real_insn (insn)
1896 insn = PREV_INSN (insn);
1897 if (insn == 0 || GET_CODE (insn) == INSN || GET_CODE (insn) == CALL_INSN
1898 || GET_CODE (insn) == JUMP_INSN)
1905 /* Find the next insn after INSN that really does something. This routine
1906 does not look inside SEQUENCEs. Until reload has completed, this is the
1907 same as next_real_insn. */
1910 next_active_insn (insn)
1915 insn = NEXT_INSN (insn);
1917 || GET_CODE (insn) == CALL_INSN || GET_CODE (insn) == JUMP_INSN
1918 || (GET_CODE (insn) == INSN
1919 && (! reload_completed
1920 || (GET_CODE (PATTERN (insn)) != USE
1921 && GET_CODE (PATTERN (insn)) != CLOBBER))))
1928 /* Find the last insn before INSN that really does something. This routine
1929 does not look inside SEQUENCEs. Until reload has completed, this is the
1930 same as prev_real_insn. */
1933 prev_active_insn (insn)
1938 insn = PREV_INSN (insn);
1940 || GET_CODE (insn) == CALL_INSN || GET_CODE (insn) == JUMP_INSN
1941 || (GET_CODE (insn) == INSN
1942 && (! reload_completed
1943 || (GET_CODE (PATTERN (insn)) != USE
1944 && GET_CODE (PATTERN (insn)) != CLOBBER))))
1951 /* Return the next CODE_LABEL after the insn INSN, or 0 if there is none. */
1959 insn = NEXT_INSN (insn);
1960 if (insn == 0 || GET_CODE (insn) == CODE_LABEL)
1967 /* Return the last CODE_LABEL before the insn INSN, or 0 if there is none. */
1975 insn = PREV_INSN (insn);
1976 if (insn == 0 || GET_CODE (insn) == CODE_LABEL)
1984 /* INSN uses CC0 and is being moved into a delay slot. Set up REG_CC_SETTER
1985 and REG_CC_USER notes so we can find it. */
1988 link_cc0_insns (insn)
1991 rtx user = next_nonnote_insn (insn);
1993 if (GET_CODE (user) == INSN && GET_CODE (PATTERN (user)) == SEQUENCE)
1994 user = XVECEXP (PATTERN (user), 0, 0);
1996 REG_NOTES (user) = gen_rtx (INSN_LIST, REG_CC_SETTER, insn,
1998 REG_NOTES (insn) = gen_rtx (INSN_LIST, REG_CC_USER, user, REG_NOTES (insn));
2001 /* Return the next insn that uses CC0 after INSN, which is assumed to
2002 set it. This is the inverse of prev_cc0_setter (i.e., prev_cc0_setter
2003 applied to the result of this function should yield INSN).
2005 Normally, this is simply the next insn. However, if a REG_CC_USER note
2006 is present, it contains the insn that uses CC0.
2008 Return 0 if we can't find the insn. */
2011 next_cc0_user (insn)
2014 rtx note = find_reg_note (insn, REG_CC_USER, NULL_RTX);
2017 return XEXP (note, 0);
2019 insn = next_nonnote_insn (insn);
2020 if (insn && GET_CODE (insn) == INSN && GET_CODE (PATTERN (insn)) == SEQUENCE)
2021 insn = XVECEXP (PATTERN (insn), 0, 0);
2023 if (insn && GET_RTX_CLASS (GET_CODE (insn)) == 'i'
2024 && reg_mentioned_p (cc0_rtx, PATTERN (insn)))
2030 /* Find the insn that set CC0 for INSN. Unless INSN has a REG_CC_SETTER
2031 note, it is the previous insn. */
2034 prev_cc0_setter (insn)
2037 rtx note = find_reg_note (insn, REG_CC_SETTER, NULL_RTX);
2041 return XEXP (note, 0);
2043 insn = prev_nonnote_insn (insn);
2044 if (! sets_cc0_p (PATTERN (insn)))
2051 /* Try splitting insns that can be split for better scheduling.
2052 PAT is the pattern which might split.
2053 TRIAL is the insn providing PAT.
2054 LAST is non-zero if we should return the last insn of the sequence produced.
2056 If this routine succeeds in splitting, it returns the first or last
2057 replacement insn depending on the value of LAST. Otherwise, it
2058 returns TRIAL. If the insn to be returned can be split, it will be. */
2061 try_split (pat, trial, last)
2065 rtx before = PREV_INSN (trial);
2066 rtx after = NEXT_INSN (trial);
2067 rtx seq = split_insns (pat, trial);
2068 int has_barrier = 0;
2071 /* If we are splitting a JUMP_INSN, it might be followed by a BARRIER.
2072 We may need to handle this specially. */
2073 if (after && GET_CODE (after) == BARRIER)
2076 after = NEXT_INSN (after);
2081 /* SEQ can either be a SEQUENCE or the pattern of a single insn.
2082 The latter case will normally arise only when being done so that
2083 it, in turn, will be split (SFmode on the 29k is an example). */
2084 if (GET_CODE (seq) == SEQUENCE)
2086 /* If we are splitting a JUMP_INSN, look for the JUMP_INSN in
2087 SEQ and copy our JUMP_LABEL to it. If JUMP_LABEL is non-zero,
2088 increment the usage count so we don't delete the label. */
2091 if (GET_CODE (trial) == JUMP_INSN)
2092 for (i = XVECLEN (seq, 0) - 1; i >= 0; i--)
2093 if (GET_CODE (XVECEXP (seq, 0, i)) == JUMP_INSN)
2095 JUMP_LABEL (XVECEXP (seq, 0, i)) = JUMP_LABEL (trial);
2097 if (JUMP_LABEL (trial))
2098 LABEL_NUSES (JUMP_LABEL (trial))++;
2101 tem = emit_insn_after (seq, before);
2103 delete_insn (trial);
2105 emit_barrier_after (tem);
2107 /* Recursively call try_split for each new insn created; by the
2108 time control returns here that insn will be fully split, so
2109 set LAST and continue from the insn after the one returned.
2110 We can't use next_active_insn here since AFTER may be a note.
2111 Ignore deleted insns, which can be occur if not optimizing. */
2112 for (tem = NEXT_INSN (before); tem != after;
2113 tem = NEXT_INSN (tem))
2114 if (! INSN_DELETED_P (tem))
2115 tem = try_split (PATTERN (tem), tem, 1);
2117 /* Avoid infinite loop if the result matches the original pattern. */
2118 else if (rtx_equal_p (seq, pat))
2122 PATTERN (trial) = seq;
2123 INSN_CODE (trial) = -1;
2124 try_split (seq, trial, last);
2127 /* Return either the first or the last insn, depending on which was
2129 return last ? prev_active_insn (after) : next_active_insn (before);
2135 /* Make and return an INSN rtx, initializing all its slots.
2136 Store PATTERN in the pattern slots. */
2139 make_insn_raw (pattern)
2144 insn = rtx_alloc (INSN);
2145 INSN_UID (insn) = cur_insn_uid++;
2147 PATTERN (insn) = pattern;
2148 INSN_CODE (insn) = -1;
2149 LOG_LINKS (insn) = NULL;
2150 REG_NOTES (insn) = NULL;
2155 /* Like `make_insn' but make a JUMP_INSN instead of an insn. */
2158 make_jump_insn_raw (pattern)
2163 insn = rtx_alloc (JUMP_INSN);
2164 INSN_UID (insn) = cur_insn_uid++;
2166 PATTERN (insn) = pattern;
2167 INSN_CODE (insn) = -1;
2168 LOG_LINKS (insn) = NULL;
2169 REG_NOTES (insn) = NULL;
2170 JUMP_LABEL (insn) = NULL;
2175 /* Like `make_insn' but make a CALL_INSN instead of an insn. */
2178 make_call_insn_raw (pattern)
2183 insn = rtx_alloc (CALL_INSN);
2184 INSN_UID (insn) = cur_insn_uid++;
2186 PATTERN (insn) = pattern;
2187 INSN_CODE (insn) = -1;
2188 LOG_LINKS (insn) = NULL;
2189 REG_NOTES (insn) = NULL;
2190 CALL_INSN_FUNCTION_USAGE (insn) = NULL;
2195 /* Add INSN to the end of the doubly-linked list.
2196 INSN may be an INSN, JUMP_INSN, CALL_INSN, CODE_LABEL, BARRIER or NOTE. */
2202 PREV_INSN (insn) = last_insn;
2203 NEXT_INSN (insn) = 0;
2205 if (NULL != last_insn)
2206 NEXT_INSN (last_insn) = insn;
2208 if (NULL == first_insn)
2214 /* Add INSN into the doubly-linked list after insn AFTER. This and
2215 the next should be the only functions called to insert an insn once
2216 delay slots have been filled since only they know how to update a
2220 add_insn_after (insn, after)
2223 rtx next = NEXT_INSN (after);
2225 if (optimize && INSN_DELETED_P (after))
2228 NEXT_INSN (insn) = next;
2229 PREV_INSN (insn) = after;
2233 PREV_INSN (next) = insn;
2234 if (GET_CODE (next) == INSN && GET_CODE (PATTERN (next)) == SEQUENCE)
2235 PREV_INSN (XVECEXP (PATTERN (next), 0, 0)) = insn;
2237 else if (last_insn == after)
2241 struct sequence_stack *stack = sequence_stack;
2242 /* Scan all pending sequences too. */
2243 for (; stack; stack = stack->next)
2244 if (after == stack->last)
2254 NEXT_INSN (after) = insn;
2255 if (GET_CODE (after) == INSN && GET_CODE (PATTERN (after)) == SEQUENCE)
2257 rtx sequence = PATTERN (after);
2258 NEXT_INSN (XVECEXP (sequence, 0, XVECLEN (sequence, 0) - 1)) = insn;
2262 /* Add INSN into the doubly-linked list before insn BEFORE. This and
2263 the previous should be the only functions called to insert an insn once
2264 delay slots have been filled since only they know how to update a
2268 add_insn_before (insn, before)
2271 rtx prev = PREV_INSN (before);
2273 if (optimize && INSN_DELETED_P (before))
2276 PREV_INSN (insn) = prev;
2277 NEXT_INSN (insn) = before;
2281 NEXT_INSN (prev) = insn;
2282 if (GET_CODE (prev) == INSN && GET_CODE (PATTERN (prev)) == SEQUENCE)
2284 rtx sequence = PATTERN (prev);
2285 NEXT_INSN (XVECEXP (sequence, 0, XVECLEN (sequence, 0) - 1)) = insn;
2288 else if (first_insn == before)
2292 struct sequence_stack *stack = sequence_stack;
2293 /* Scan all pending sequences too. */
2294 for (; stack; stack = stack->next)
2295 if (before == stack->first)
2297 stack->first = insn;
2305 PREV_INSN (before) = insn;
2306 if (GET_CODE (before) == INSN && GET_CODE (PATTERN (before)) == SEQUENCE)
2307 PREV_INSN (XVECEXP (PATTERN (before), 0, 0)) = insn;
2310 /* Delete all insns made since FROM.
2311 FROM becomes the new last instruction. */
2314 delete_insns_since (from)
2320 NEXT_INSN (from) = 0;
2324 /* This function is deprecated, please use sequences instead.
2326 Move a consecutive bunch of insns to a different place in the chain.
2327 The insns to be moved are those between FROM and TO.
2328 They are moved to a new position after the insn AFTER.
2329 AFTER must not be FROM or TO or any insn in between.
2331 This function does not know about SEQUENCEs and hence should not be
2332 called after delay-slot filling has been done. */
2335 reorder_insns (from, to, after)
2336 rtx from, to, after;
2338 /* Splice this bunch out of where it is now. */
2339 if (PREV_INSN (from))
2340 NEXT_INSN (PREV_INSN (from)) = NEXT_INSN (to);
2342 PREV_INSN (NEXT_INSN (to)) = PREV_INSN (from);
2343 if (last_insn == to)
2344 last_insn = PREV_INSN (from);
2345 if (first_insn == from)
2346 first_insn = NEXT_INSN (to);
2348 /* Make the new neighbors point to it and it to them. */
2349 if (NEXT_INSN (after))
2350 PREV_INSN (NEXT_INSN (after)) = to;
2352 NEXT_INSN (to) = NEXT_INSN (after);
2353 PREV_INSN (from) = after;
2354 NEXT_INSN (after) = from;
2355 if (after == last_insn)
2359 /* Return the line note insn preceding INSN. */
2362 find_line_note (insn)
2365 if (no_line_numbers)
2368 for (; insn; insn = PREV_INSN (insn))
2369 if (GET_CODE (insn) == NOTE
2370 && NOTE_LINE_NUMBER (insn) >= 0)
2376 /* Like reorder_insns, but inserts line notes to preserve the line numbers
2377 of the moved insns when debugging. This may insert a note between AFTER
2378 and FROM, and another one after TO. */
2381 reorder_insns_with_line_notes (from, to, after)
2382 rtx from, to, after;
2384 rtx from_line = find_line_note (from);
2385 rtx after_line = find_line_note (after);
2387 reorder_insns (from, to, after);
2389 if (from_line == after_line)
2393 emit_line_note_after (NOTE_SOURCE_FILE (from_line),
2394 NOTE_LINE_NUMBER (from_line),
2397 emit_line_note_after (NOTE_SOURCE_FILE (after_line),
2398 NOTE_LINE_NUMBER (after_line),
2402 /* Emit an insn of given code and pattern
2403 at a specified place within the doubly-linked list. */
2405 /* Make an instruction with body PATTERN
2406 and output it before the instruction BEFORE. */
2409 emit_insn_before (pattern, before)
2410 register rtx pattern, before;
2412 register rtx insn = before;
2414 if (GET_CODE (pattern) == SEQUENCE)
2418 for (i = 0; i < XVECLEN (pattern, 0); i++)
2420 insn = XVECEXP (pattern, 0, i);
2421 add_insn_before (insn, before);
2423 if (XVECLEN (pattern, 0) < SEQUENCE_RESULT_SIZE)
2424 sequence_result[XVECLEN (pattern, 0)] = pattern;
2428 insn = make_insn_raw (pattern);
2429 add_insn_before (insn, before);
2435 /* Make an instruction with body PATTERN and code JUMP_INSN
2436 and output it before the instruction BEFORE. */
2439 emit_jump_insn_before (pattern, before)
2440 register rtx pattern, before;
2444 if (GET_CODE (pattern) == SEQUENCE)
2445 insn = emit_insn_before (pattern, before);
2448 insn = make_jump_insn_raw (pattern);
2449 add_insn_before (insn, before);
2455 /* Make an instruction with body PATTERN and code CALL_INSN
2456 and output it before the instruction BEFORE. */
2459 emit_call_insn_before (pattern, before)
2460 register rtx pattern, before;
2464 if (GET_CODE (pattern) == SEQUENCE)
2465 insn = emit_insn_before (pattern, before);
2468 insn = make_call_insn_raw (pattern);
2469 add_insn_before (insn, before);
2470 PUT_CODE (insn, CALL_INSN);
2476 /* Make an insn of code BARRIER
2477 and output it before the insn AFTER. */
2480 emit_barrier_before (before)
2481 register rtx before;
2483 register rtx insn = rtx_alloc (BARRIER);
2485 INSN_UID (insn) = cur_insn_uid++;
2487 add_insn_before (insn, before);
2491 /* Emit a note of subtype SUBTYPE before the insn BEFORE. */
2494 emit_note_before (subtype, before)
2498 register rtx note = rtx_alloc (NOTE);
2499 INSN_UID (note) = cur_insn_uid++;
2500 NOTE_SOURCE_FILE (note) = 0;
2501 NOTE_LINE_NUMBER (note) = subtype;
2503 add_insn_before (note, before);
2507 /* Make an insn of code INSN with body PATTERN
2508 and output it after the insn AFTER. */
2511 emit_insn_after (pattern, after)
2512 register rtx pattern, after;
2514 register rtx insn = after;
2516 if (GET_CODE (pattern) == SEQUENCE)
2520 for (i = 0; i < XVECLEN (pattern, 0); i++)
2522 insn = XVECEXP (pattern, 0, i);
2523 add_insn_after (insn, after);
2526 if (XVECLEN (pattern, 0) < SEQUENCE_RESULT_SIZE)
2527 sequence_result[XVECLEN (pattern, 0)] = pattern;
2531 insn = make_insn_raw (pattern);
2532 add_insn_after (insn, after);
2538 /* Similar to emit_insn_after, except that line notes are to be inserted so
2539 as to act as if this insn were at FROM. */
2542 emit_insn_after_with_line_notes (pattern, after, from)
2543 rtx pattern, after, from;
2545 rtx from_line = find_line_note (from);
2546 rtx after_line = find_line_note (after);
2547 rtx insn = emit_insn_after (pattern, after);
2550 emit_line_note_after (NOTE_SOURCE_FILE (from_line),
2551 NOTE_LINE_NUMBER (from_line),
2555 emit_line_note_after (NOTE_SOURCE_FILE (after_line),
2556 NOTE_LINE_NUMBER (after_line),
2560 /* Make an insn of code JUMP_INSN with body PATTERN
2561 and output it after the insn AFTER. */
2564 emit_jump_insn_after (pattern, after)
2565 register rtx pattern, after;
2569 if (GET_CODE (pattern) == SEQUENCE)
2570 insn = emit_insn_after (pattern, after);
2573 insn = make_jump_insn_raw (pattern);
2574 add_insn_after (insn, after);
2580 /* Make an insn of code BARRIER
2581 and output it after the insn AFTER. */
2584 emit_barrier_after (after)
2587 register rtx insn = rtx_alloc (BARRIER);
2589 INSN_UID (insn) = cur_insn_uid++;
2591 add_insn_after (insn, after);
2595 /* Emit the label LABEL after the insn AFTER. */
2598 emit_label_after (label, after)
2601 /* This can be called twice for the same label
2602 as a result of the confusion that follows a syntax error!
2603 So make it harmless. */
2604 if (INSN_UID (label) == 0)
2606 INSN_UID (label) = cur_insn_uid++;
2607 add_insn_after (label, after);
2613 /* Emit a note of subtype SUBTYPE after the insn AFTER. */
2616 emit_note_after (subtype, after)
2620 register rtx note = rtx_alloc (NOTE);
2621 INSN_UID (note) = cur_insn_uid++;
2622 NOTE_SOURCE_FILE (note) = 0;
2623 NOTE_LINE_NUMBER (note) = subtype;
2624 add_insn_after (note, after);
2628 /* Emit a line note for FILE and LINE after the insn AFTER. */
2631 emit_line_note_after (file, line, after)
2638 if (no_line_numbers && line > 0)
2644 note = rtx_alloc (NOTE);
2645 INSN_UID (note) = cur_insn_uid++;
2646 NOTE_SOURCE_FILE (note) = file;
2647 NOTE_LINE_NUMBER (note) = line;
2648 add_insn_after (note, after);
2652 /* Make an insn of code INSN with pattern PATTERN
2653 and add it to the end of the doubly-linked list.
2654 If PATTERN is a SEQUENCE, take the elements of it
2655 and emit an insn for each element.
2657 Returns the last insn emitted. */
2663 rtx insn = last_insn;
2665 if (GET_CODE (pattern) == SEQUENCE)
2669 for (i = 0; i < XVECLEN (pattern, 0); i++)
2671 insn = XVECEXP (pattern, 0, i);
2674 if (XVECLEN (pattern, 0) < SEQUENCE_RESULT_SIZE)
2675 sequence_result[XVECLEN (pattern, 0)] = pattern;
2679 insn = make_insn_raw (pattern);
2686 /* Emit the insns in a chain starting with INSN.
2687 Return the last insn emitted. */
2697 rtx next = NEXT_INSN (insn);
2706 /* Emit the insns in a chain starting with INSN and place them in front of
2707 the insn BEFORE. Return the last insn emitted. */
2710 emit_insns_before (insn, before)
2718 rtx next = NEXT_INSN (insn);
2719 add_insn_before (insn, before);
2727 /* Emit the insns in a chain starting with FIRST and place them in back of
2728 the insn AFTER. Return the last insn emitted. */
2731 emit_insns_after (first, after)
2736 register rtx after_after;
2744 for (last = first; NEXT_INSN (last); last = NEXT_INSN (last))
2747 after_after = NEXT_INSN (after);
2749 NEXT_INSN (after) = first;
2750 PREV_INSN (first) = after;
2751 NEXT_INSN (last) = after_after;
2753 PREV_INSN (after_after) = last;
2755 if (after == last_insn)
2760 /* Make an insn of code JUMP_INSN with pattern PATTERN
2761 and add it to the end of the doubly-linked list. */
2764 emit_jump_insn (pattern)
2767 if (GET_CODE (pattern) == SEQUENCE)
2768 return emit_insn (pattern);
2771 register rtx insn = make_jump_insn_raw (pattern);
2777 /* Make an insn of code CALL_INSN with pattern PATTERN
2778 and add it to the end of the doubly-linked list. */
2781 emit_call_insn (pattern)
2784 if (GET_CODE (pattern) == SEQUENCE)
2785 return emit_insn (pattern);
2788 register rtx insn = make_call_insn_raw (pattern);
2790 PUT_CODE (insn, CALL_INSN);
2795 /* Add the label LABEL to the end of the doubly-linked list. */
2801 /* This can be called twice for the same label
2802 as a result of the confusion that follows a syntax error!
2803 So make it harmless. */
2804 if (INSN_UID (label) == 0)
2806 INSN_UID (label) = cur_insn_uid++;
2812 /* Make an insn of code BARRIER
2813 and add it to the end of the doubly-linked list. */
2818 register rtx barrier = rtx_alloc (BARRIER);
2819 INSN_UID (barrier) = cur_insn_uid++;
2824 /* Make an insn of code NOTE
2825 with data-fields specified by FILE and LINE
2826 and add it to the end of the doubly-linked list,
2827 but only if line-numbers are desired for debugging info. */
2830 emit_line_note (file, line)
2834 if (output_bytecode)
2836 /* FIXME: for now we do nothing, but eventually we will have to deal with
2837 debugging information. */
2841 emit_filename = file;
2845 if (no_line_numbers)
2849 return emit_note (file, line);
2852 /* Make an insn of code NOTE
2853 with data-fields specified by FILE and LINE
2854 and add it to the end of the doubly-linked list.
2855 If it is a line-number NOTE, omit it if it matches the previous one. */
2858 emit_note (file, line)
2866 if (file && last_filename && !strcmp (file, last_filename)
2867 && line == last_linenum)
2869 last_filename = file;
2870 last_linenum = line;
2873 if (no_line_numbers && line > 0)
2879 note = rtx_alloc (NOTE);
2880 INSN_UID (note) = cur_insn_uid++;
2881 NOTE_SOURCE_FILE (note) = file;
2882 NOTE_LINE_NUMBER (note) = line;
2887 /* Emit a NOTE, and don't omit it even if LINE it the previous note. */
2890 emit_line_note_force (file, line)
2895 return emit_line_note (file, line);
2898 /* Cause next statement to emit a line note even if the line number
2899 has not changed. This is used at the beginning of a function. */
2902 force_next_line_note ()
2907 /* Return an indication of which type of insn should have X as a body.
2908 The value is CODE_LABEL, INSN, CALL_INSN or JUMP_INSN. */
2914 if (GET_CODE (x) == CODE_LABEL)
2916 if (GET_CODE (x) == CALL)
2918 if (GET_CODE (x) == RETURN)
2920 if (GET_CODE (x) == SET)
2922 if (SET_DEST (x) == pc_rtx)
2924 else if (GET_CODE (SET_SRC (x)) == CALL)
2929 if (GET_CODE (x) == PARALLEL)
2932 for (j = XVECLEN (x, 0) - 1; j >= 0; j--)
2933 if (GET_CODE (XVECEXP (x, 0, j)) == CALL)
2935 else if (GET_CODE (XVECEXP (x, 0, j)) == SET
2936 && SET_DEST (XVECEXP (x, 0, j)) == pc_rtx)
2938 else if (GET_CODE (XVECEXP (x, 0, j)) == SET
2939 && GET_CODE (SET_SRC (XVECEXP (x, 0, j))) == CALL)
2945 /* Emit the rtl pattern X as an appropriate kind of insn.
2946 If X is a label, it is simply added into the insn chain. */
2952 enum rtx_code code = classify_insn (x);
2954 if (code == CODE_LABEL)
2955 return emit_label (x);
2956 else if (code == INSN)
2957 return emit_insn (x);
2958 else if (code == JUMP_INSN)
2960 register rtx insn = emit_jump_insn (x);
2961 if (simplejump_p (insn) || GET_CODE (x) == RETURN)
2962 return emit_barrier ();
2965 else if (code == CALL_INSN)
2966 return emit_call_insn (x);
2971 /* Begin emitting insns to a sequence which can be packaged in an RTL_EXPR. */
2976 struct sequence_stack *tem;
2978 if (sequence_element_free_list)
2980 /* Reuse a previously-saved struct sequence_stack. */
2981 tem = sequence_element_free_list;
2982 sequence_element_free_list = tem->next;
2985 tem = (struct sequence_stack *) permalloc (sizeof (struct sequence_stack));
2987 tem->next = sequence_stack;
2988 tem->first = first_insn;
2989 tem->last = last_insn;
2990 tem->sequence_rtl_expr = sequence_rtl_expr;
2992 sequence_stack = tem;
2998 /* Similarly, but indicate that this sequence will be placed in
3002 start_sequence_for_rtl_expr (t)
3007 sequence_rtl_expr = t;
3010 /* Set up the insn chain starting with FIRST
3011 as the current sequence, saving the previously current one. */
3014 push_to_sequence (first)
3021 for (last = first; last && NEXT_INSN (last); last = NEXT_INSN (last));
3027 /* Set up the outer-level insn chain
3028 as the current sequence, saving the previously current one. */
3031 push_topmost_sequence ()
3033 struct sequence_stack *stack, *top;
3037 for (stack = sequence_stack; stack; stack = stack->next)
3040 first_insn = top->first;
3041 last_insn = top->last;
3042 sequence_rtl_expr = top->sequence_rtl_expr;
3045 /* After emitting to the outer-level insn chain, update the outer-level
3046 insn chain, and restore the previous saved state. */
3049 pop_topmost_sequence ()
3051 struct sequence_stack *stack, *top;
3053 for (stack = sequence_stack; stack; stack = stack->next)
3056 top->first = first_insn;
3057 top->last = last_insn;
3058 /* ??? Why don't we save sequence_rtl_expr here? */
3063 /* After emitting to a sequence, restore previous saved state.
3065 To get the contents of the sequence just made,
3066 you must call `gen_sequence' *before* calling here. */
3071 struct sequence_stack *tem = sequence_stack;
3073 first_insn = tem->first;
3074 last_insn = tem->last;
3075 sequence_rtl_expr = tem->sequence_rtl_expr;
3076 sequence_stack = tem->next;
3078 tem->next = sequence_element_free_list;
3079 sequence_element_free_list = tem;
3082 /* Return 1 if currently emitting into a sequence. */
3087 return sequence_stack != 0;
3090 /* Generate a SEQUENCE rtx containing the insns already emitted
3091 to the current sequence.
3093 This is how the gen_... function from a DEFINE_EXPAND
3094 constructs the SEQUENCE that it returns. */
3104 /* Count the insns in the chain. */
3106 for (tem = first_insn; tem; tem = NEXT_INSN (tem))
3109 /* If only one insn, return its pattern rather than a SEQUENCE.
3110 (Now that we cache SEQUENCE expressions, it isn't worth special-casing
3111 the case of an empty list.) */
3113 && (GET_CODE (first_insn) == INSN
3114 || GET_CODE (first_insn) == JUMP_INSN
3115 /* Don't discard the call usage field. */
3116 || (GET_CODE (first_insn) == CALL_INSN
3117 && CALL_INSN_FUNCTION_USAGE (first_insn) == NULL_RTX)))
3118 return PATTERN (first_insn);
3120 /* Put them in a vector. See if we already have a SEQUENCE of the
3121 appropriate length around. */
3122 if (len < SEQUENCE_RESULT_SIZE && (result = sequence_result[len]) != 0)
3123 sequence_result[len] = 0;
3126 /* Ensure that this rtl goes in saveable_obstack, since we may
3128 push_obstacks_nochange ();
3129 rtl_in_saveable_obstack ();
3130 result = gen_rtx (SEQUENCE, VOIDmode, rtvec_alloc (len));
3134 for (i = 0, tem = first_insn; tem; tem = NEXT_INSN (tem), i++)
3135 XVECEXP (result, 0, i) = tem;
3140 /* Initialize data structures and variables in this file
3141 before generating rtl for each function. */
3150 sequence_rtl_expr = NULL;
3152 reg_rtx_no = LAST_VIRTUAL_REGISTER + 1;
3155 first_label_num = label_num;
3157 sequence_stack = NULL;
3159 /* Clear the start_sequence/gen_sequence cache. */
3160 sequence_element_free_list = 0;
3161 for (i = 0; i < SEQUENCE_RESULT_SIZE; i++)
3162 sequence_result[i] = 0;
3164 /* Init the tables that describe all the pseudo regs. */
3166 regno_pointer_flag_length = LAST_VIRTUAL_REGISTER + 101;
3169 = (char *) savealloc (regno_pointer_flag_length);
3170 bzero (regno_pointer_flag, regno_pointer_flag_length);
3173 = (char *) savealloc (regno_pointer_flag_length);
3174 bzero (regno_pointer_align, regno_pointer_flag_length);
3177 = (rtx *) savealloc (regno_pointer_flag_length * sizeof (rtx));
3178 bzero ((char *) regno_reg_rtx, regno_pointer_flag_length * sizeof (rtx));
3180 /* Put copies of all the virtual register rtx into regno_reg_rtx. */
3181 regno_reg_rtx[VIRTUAL_INCOMING_ARGS_REGNUM] = virtual_incoming_args_rtx;
3182 regno_reg_rtx[VIRTUAL_STACK_VARS_REGNUM] = virtual_stack_vars_rtx;
3183 regno_reg_rtx[VIRTUAL_STACK_DYNAMIC_REGNUM] = virtual_stack_dynamic_rtx;
3184 regno_reg_rtx[VIRTUAL_OUTGOING_ARGS_REGNUM] = virtual_outgoing_args_rtx;
3186 /* Indicate that the virtual registers and stack locations are
3188 REGNO_POINTER_FLAG (STACK_POINTER_REGNUM) = 1;
3189 REGNO_POINTER_FLAG (FRAME_POINTER_REGNUM) = 1;
3190 REGNO_POINTER_FLAG (HARD_FRAME_POINTER_REGNUM) = 1;
3191 REGNO_POINTER_FLAG (ARG_POINTER_REGNUM) = 1;
3193 REGNO_POINTER_FLAG (VIRTUAL_INCOMING_ARGS_REGNUM) = 1;
3194 REGNO_POINTER_FLAG (VIRTUAL_STACK_VARS_REGNUM) = 1;
3195 REGNO_POINTER_FLAG (VIRTUAL_STACK_DYNAMIC_REGNUM) = 1;
3196 REGNO_POINTER_FLAG (VIRTUAL_OUTGOING_ARGS_REGNUM) = 1;
3198 #ifdef STACK_BOUNDARY
3199 REGNO_POINTER_ALIGN (STACK_POINTER_REGNUM) = STACK_BOUNDARY / BITS_PER_UNIT;
3200 REGNO_POINTER_ALIGN (FRAME_POINTER_REGNUM) = STACK_BOUNDARY / BITS_PER_UNIT;
3201 REGNO_POINTER_ALIGN (HARD_FRAME_POINTER_REGNUM)
3202 = STACK_BOUNDARY / BITS_PER_UNIT;
3203 REGNO_POINTER_ALIGN (ARG_POINTER_REGNUM) = STACK_BOUNDARY / BITS_PER_UNIT;
3205 REGNO_POINTER_ALIGN (VIRTUAL_INCOMING_ARGS_REGNUM)
3206 = STACK_BOUNDARY / BITS_PER_UNIT;
3207 REGNO_POINTER_ALIGN (VIRTUAL_STACK_VARS_REGNUM)
3208 = STACK_BOUNDARY / BITS_PER_UNIT;
3209 REGNO_POINTER_ALIGN (VIRTUAL_STACK_DYNAMIC_REGNUM)
3210 = STACK_BOUNDARY / BITS_PER_UNIT;
3211 REGNO_POINTER_ALIGN (VIRTUAL_OUTGOING_ARGS_REGNUM)
3212 = STACK_BOUNDARY / BITS_PER_UNIT;
3215 #ifdef INIT_EXPANDERS
3220 /* Create some permanent unique rtl objects shared between all functions.
3221 LINE_NUMBERS is nonzero if line numbers are to be generated. */
3224 init_emit_once (line_numbers)
3228 enum machine_mode mode;
3230 no_line_numbers = ! line_numbers;
3232 sequence_stack = NULL;
3234 /* Compute the word and byte modes. */
3236 byte_mode = VOIDmode;
3237 word_mode = VOIDmode;
3239 for (mode = GET_CLASS_NARROWEST_MODE (MODE_INT); mode != VOIDmode;
3240 mode = GET_MODE_WIDER_MODE (mode))
3242 if (GET_MODE_BITSIZE (mode) == BITS_PER_UNIT
3243 && byte_mode == VOIDmode)
3246 if (GET_MODE_BITSIZE (mode) == BITS_PER_WORD
3247 && word_mode == VOIDmode)
3251 ptr_mode = mode_for_size (POINTER_SIZE, GET_MODE_CLASS (Pmode), 0);
3253 /* Create the unique rtx's for certain rtx codes and operand values. */
3255 pc_rtx = gen_rtx (PC, VOIDmode);
3256 cc0_rtx = gen_rtx (CC0, VOIDmode);
3258 /* Don't use gen_rtx here since gen_rtx in this case
3259 tries to use these variables. */
3260 for (i = - MAX_SAVED_CONST_INT; i <= MAX_SAVED_CONST_INT; i++)
3262 const_int_rtx[i + MAX_SAVED_CONST_INT] = rtx_alloc (CONST_INT);
3263 PUT_MODE (const_int_rtx[i + MAX_SAVED_CONST_INT], VOIDmode);
3264 INTVAL (const_int_rtx[i + MAX_SAVED_CONST_INT]) = i;
3267 /* These four calls obtain some of the rtx expressions made above. */
3268 const0_rtx = GEN_INT (0);
3269 const1_rtx = GEN_INT (1);
3270 const2_rtx = GEN_INT (2);
3271 constm1_rtx = GEN_INT (-1);
3273 /* This will usually be one of the above constants, but may be a new rtx. */
3274 const_true_rtx = GEN_INT (STORE_FLAG_VALUE);
3276 dconst0 = REAL_VALUE_ATOF ("0", DFmode);
3277 dconst1 = REAL_VALUE_ATOF ("1", DFmode);
3278 dconst2 = REAL_VALUE_ATOF ("2", DFmode);
3279 dconstm1 = REAL_VALUE_ATOF ("-1", DFmode);
3281 for (i = 0; i <= 2; i++)
3283 for (mode = GET_CLASS_NARROWEST_MODE (MODE_FLOAT); mode != VOIDmode;
3284 mode = GET_MODE_WIDER_MODE (mode))
3286 rtx tem = rtx_alloc (CONST_DOUBLE);
3287 union real_extract u;
3289 bzero ((char *) &u, sizeof u); /* Zero any holes in a structure. */
3290 u.d = i == 0 ? dconst0 : i == 1 ? dconst1 : dconst2;
3292 bcopy ((char *) &u, (char *) &CONST_DOUBLE_LOW (tem), sizeof u);
3293 CONST_DOUBLE_MEM (tem) = cc0_rtx;
3294 PUT_MODE (tem, mode);
3296 const_tiny_rtx[i][(int) mode] = tem;
3299 const_tiny_rtx[i][(int) VOIDmode] = GEN_INT (i);
3301 for (mode = GET_CLASS_NARROWEST_MODE (MODE_INT); mode != VOIDmode;
3302 mode = GET_MODE_WIDER_MODE (mode))
3303 const_tiny_rtx[i][(int) mode] = GEN_INT (i);
3305 for (mode = GET_CLASS_NARROWEST_MODE (MODE_PARTIAL_INT);
3307 mode = GET_MODE_WIDER_MODE (mode))
3308 const_tiny_rtx[i][(int) mode] = GEN_INT (i);
3311 for (mode = GET_CLASS_NARROWEST_MODE (MODE_CC); mode != VOIDmode;
3312 mode = GET_MODE_WIDER_MODE (mode))
3313 const_tiny_rtx[0][(int) mode] = const0_rtx;
3315 stack_pointer_rtx = gen_rtx (REG, Pmode, STACK_POINTER_REGNUM);
3316 frame_pointer_rtx = gen_rtx (REG, Pmode, FRAME_POINTER_REGNUM);
3318 if (HARD_FRAME_POINTER_REGNUM == FRAME_POINTER_REGNUM)
3319 hard_frame_pointer_rtx = frame_pointer_rtx;
3321 hard_frame_pointer_rtx = gen_rtx (REG, Pmode, HARD_FRAME_POINTER_REGNUM);
3323 if (FRAME_POINTER_REGNUM == ARG_POINTER_REGNUM)
3324 arg_pointer_rtx = frame_pointer_rtx;
3325 else if (HARD_FRAME_POINTER_REGNUM == ARG_POINTER_REGNUM)
3326 arg_pointer_rtx = hard_frame_pointer_rtx;
3327 else if (STACK_POINTER_REGNUM == ARG_POINTER_REGNUM)
3328 arg_pointer_rtx = stack_pointer_rtx;
3330 arg_pointer_rtx = gen_rtx (REG, Pmode, ARG_POINTER_REGNUM);
3332 #ifdef RETURN_ADDRESS_POINTER_REGNUM
3333 return_address_pointer_rtx = gen_rtx (REG, Pmode,
3334 RETURN_ADDRESS_POINTER_REGNUM);
3337 /* Create the virtual registers. Do so here since the following objects
3338 might reference them. */
3340 virtual_incoming_args_rtx = gen_rtx (REG, Pmode,
3341 VIRTUAL_INCOMING_ARGS_REGNUM);
3342 virtual_stack_vars_rtx = gen_rtx (REG, Pmode,
3343 VIRTUAL_STACK_VARS_REGNUM);
3344 virtual_stack_dynamic_rtx = gen_rtx (REG, Pmode,
3345 VIRTUAL_STACK_DYNAMIC_REGNUM);
3346 virtual_outgoing_args_rtx = gen_rtx (REG, Pmode,
3347 VIRTUAL_OUTGOING_ARGS_REGNUM);
3350 struct_value_rtx = STRUCT_VALUE;
3352 struct_value_rtx = gen_rtx (REG, Pmode, STRUCT_VALUE_REGNUM);
3355 #ifdef STRUCT_VALUE_INCOMING
3356 struct_value_incoming_rtx = STRUCT_VALUE_INCOMING;
3358 #ifdef STRUCT_VALUE_INCOMING_REGNUM
3359 struct_value_incoming_rtx
3360 = gen_rtx (REG, Pmode, STRUCT_VALUE_INCOMING_REGNUM);
3362 struct_value_incoming_rtx = struct_value_rtx;
3366 #ifdef STATIC_CHAIN_REGNUM
3367 static_chain_rtx = gen_rtx (REG, Pmode, STATIC_CHAIN_REGNUM);
3369 #ifdef STATIC_CHAIN_INCOMING_REGNUM
3370 if (STATIC_CHAIN_INCOMING_REGNUM != STATIC_CHAIN_REGNUM)
3371 static_chain_incoming_rtx = gen_rtx (REG, Pmode, STATIC_CHAIN_INCOMING_REGNUM);
3374 static_chain_incoming_rtx = static_chain_rtx;
3378 static_chain_rtx = STATIC_CHAIN;
3380 #ifdef STATIC_CHAIN_INCOMING
3381 static_chain_incoming_rtx = STATIC_CHAIN_INCOMING;
3383 static_chain_incoming_rtx = static_chain_rtx;
3387 #ifdef PIC_OFFSET_TABLE_REGNUM
3388 pic_offset_table_rtx = gen_rtx (REG, Pmode, PIC_OFFSET_TABLE_REGNUM);