rtl.h revision 50397
118334Speter/* Register Transfer Language (RTL) definitions for GNU C-Compiler
250397Sobrien   Copyright (C) 1987, 91-97, 1998 Free Software Foundation, Inc.
318334Speter
418334SpeterThis file is part of GNU CC.
518334Speter
618334SpeterGNU CC is free software; you can redistribute it and/or modify
718334Speterit under the terms of the GNU General Public License as published by
818334Speterthe Free Software Foundation; either version 2, or (at your option)
918334Speterany later version.
1018334Speter
1118334SpeterGNU CC is distributed in the hope that it will be useful,
1218334Speterbut WITHOUT ANY WARRANTY; without even the implied warranty of
1318334SpeterMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1418334SpeterGNU General Public License for more details.
1518334Speter
1618334SpeterYou should have received a copy of the GNU General Public License
1718334Speteralong with GNU CC; see the file COPYING.  If not, write to
1818334Speterthe Free Software Foundation, 59 Temple Place - Suite 330,
1918334SpeterBoston, MA 02111-1307, USA.  */
2018334Speter
2150397Sobrien#ifndef _RTL_H
2250397Sobrien#define _RTL_H
2318334Speter
2418334Speter#include "machmode.h"
2518334Speter
2618334Speter#undef FFS  /* Some systems predefine this symbol; don't let it interfere.  */
2718334Speter#undef FLOAT /* Likewise.  */
2818334Speter#undef ABS /* Likewise.  */
2918334Speter#undef PC /* Likewise.  */
3018334Speter
3118334Speter#ifndef TREE_CODE
3218334Speterunion tree_node;
3318334Speter#endif
3418334Speter
3518334Speter/* Register Transfer Language EXPRESSIONS CODES */
3618334Speter
3718334Speter#define RTX_CODE	enum rtx_code
3818334Speterenum rtx_code  {
3918334Speter
4018334Speter#define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS)   ENUM ,
4118334Speter#include "rtl.def"		/* rtl expressions are documented here */
4218334Speter#undef DEF_RTL_EXPR
4318334Speter
4418334Speter  LAST_AND_UNUSED_RTX_CODE};	/* A convenient way to get a value for
4518334Speter				   NUM_RTX_CODE.
4618334Speter				   Assumes default enum value assignment.  */
4718334Speter
4818334Speter#define NUM_RTX_CODE ((int)LAST_AND_UNUSED_RTX_CODE)
4918334Speter				/* The cast here, saves many elsewhere.  */
5018334Speter
5118334Speterextern int rtx_length[];
5250397Sobrien#define GET_RTX_LENGTH(CODE)		(rtx_length[(int) (CODE)])
5318334Speter
5418334Speterextern char *rtx_name[];
5550397Sobrien#define GET_RTX_NAME(CODE)		(rtx_name[(int) (CODE)])
5618334Speter
5718334Speterextern char *rtx_format[];
5850397Sobrien#define GET_RTX_FORMAT(CODE)		(rtx_format[(int) (CODE)])
5918334Speter
6018334Speterextern char rtx_class[];
6150397Sobrien#define GET_RTX_CLASS(CODE)		(rtx_class[(int) (CODE)])
6218334Speter
6350397Sobrien/* The flags and bitfields of an ADDR_DIFF_VEC.  BASE is the base label
6450397Sobrien   relative to which the offsets are calculated, as explained in rtl.def.  */
6550397Sobrientypedef struct
6650397Sobrien{
6750397Sobrien  /* Set at the start of shorten_branches - ONLY WHEN OPTIMIZING - : */
6850397Sobrien  unsigned min_align: 8;
6950397Sobrien  /* Flags: */
7050397Sobrien  unsigned base_after_vec: 1; /* BASE is after the ADDR_DIFF_VEC.  */
7150397Sobrien  unsigned min_after_vec: 1;  /* minimum address target label is after the ADDR_DIFF_VEC.  */
7250397Sobrien  unsigned max_after_vec: 1;  /* maximum address target label is after the ADDR_DIFF_VEC.  */
7350397Sobrien  unsigned min_after_base: 1; /* minimum address target label is after BASE.  */
7450397Sobrien  unsigned max_after_base: 1; /* maximum address target label is after BASE.  */
7550397Sobrien  /* Set by the actual branch shortening process - ONLY WHEN OPTIMIZING - : */
7650397Sobrien  unsigned offset_unsigned: 1; /* offsets have to be treated as unsigned.  */
7750397Sobrien  unsigned : 2;
7850397Sobrien  unsigned scale : 8;
7950397Sobrien} addr_diff_vec_flags;
8050397Sobrien
8118334Speter/* Common union for an element of an rtx.  */
8218334Speter
8318334Spetertypedef union rtunion_def
8418334Speter{
8518334Speter  HOST_WIDE_INT rtwint;
8618334Speter  int rtint;
8718334Speter  char *rtstr;
8818334Speter  struct rtx_def *rtx;
8918334Speter  struct rtvec_def *rtvec;
9018334Speter  enum machine_mode rttype;
9150397Sobrien  addr_diff_vec_flags rt_addr_diff_vec_flags;
9250397Sobrien  struct bitmap_head_def *rtbit;
9350397Sobrien  union tree_node *rttree;
9418334Speter} rtunion;
9518334Speter
9618334Speter/* RTL expression ("rtx").  */
9718334Speter
9818334Spetertypedef struct rtx_def
9918334Speter{
10018334Speter#ifdef ONLY_INT_FIELDS
10118334Speter#ifdef CODE_FIELD_BUG
10218334Speter  unsigned int code : 16;
10318334Speter#else
10418334Speter  unsigned short code;
10518334Speter#endif
10618334Speter#else
10718334Speter  /* The kind of expression this is.  */
10818334Speter  enum rtx_code code : 16;
10918334Speter#endif
11018334Speter  /* The kind of value the expression has.  */
11118334Speter#ifdef ONLY_INT_FIELDS
11218334Speter  int mode : 8;
11318334Speter#else
11418334Speter  enum machine_mode mode : 8;
11518334Speter#endif
11618334Speter  /* 1 in an INSN if it can alter flow of control
11718334Speter     within this function.  Not yet used!  */
11818334Speter  unsigned int jump : 1;
11918334Speter  /* 1 in an INSN if it can call another function.  Not yet used!  */
12018334Speter  unsigned int call : 1;
12118334Speter  /* 1 in a MEM or REG if value of this expression will never change
12218334Speter     during the current function, even though it is not
12318334Speter     manifestly constant.
12418334Speter     1 in a SUBREG if it is from a promoted variable that is unsigned.
12518334Speter     1 in a SYMBOL_REF if it addresses something in the per-function
12618334Speter     constants pool.
12718334Speter     1 in a CALL_INSN if it is a const call.
12818334Speter     1 in a JUMP_INSN if it is a branch that should be annulled.  Valid from
12918334Speter     reorg until end of compilation; cleared before used.  */
13018334Speter  unsigned int unchanging : 1;
13118334Speter  /* 1 in a MEM expression if contents of memory are volatile.
13218334Speter     1 in an INSN, CALL_INSN, JUMP_INSN, CODE_LABEL or BARRIER
13318334Speter     if it is deleted.
13418334Speter     1 in a REG expression if corresponds to a variable declared by the user.
13518334Speter     0 for an internally generated temporary.
13618334Speter     In a SYMBOL_REF, this flag is used for machine-specific purposes.
13718334Speter     In a LABEL_REF or in a REG_LABEL note, this is LABEL_REF_NONLOCAL_P.  */
13818334Speter  unsigned int volatil : 1;
13950397Sobrien  /* 1 in a MEM referring to a field of an aggregate.
14018334Speter     0 if the MEM was a variable or the result of a * operator in C;
14118334Speter     1 if it was the result of a . or -> operator (on a struct) in C.
14218334Speter     1 in a REG if the register is used only in exit code a loop.
14318334Speter     1 in a SUBREG expression if was generated from a variable with a
14418334Speter     promoted mode.
14518334Speter     1 in a CODE_LABEL if the label is used for nonlocal gotos
14618334Speter     and must not be deleted even if its count is zero.
14718334Speter     1 in a LABEL_REF if this is a reference to a label outside the
14818334Speter     current loop.
14918334Speter     1 in an INSN, JUMP_INSN, or CALL_INSN if this insn must be scheduled
15018334Speter     together with the preceding insn.  Valid only within sched.
15118334Speter     1 in an INSN, JUMP_INSN, or CALL_INSN if insn is in a delay slot and
15218334Speter     from the target of a branch.  Valid from reorg until end of compilation;
15318334Speter     cleared before used.  */
15418334Speter  unsigned int in_struct : 1;
15518334Speter  /* 1 if this rtx is used.  This is used for copying shared structure.
15618334Speter     See `unshare_all_rtl'.
15718334Speter     In a REG, this is not needed for that purpose, and used instead
15818334Speter     in `leaf_renumber_regs_insn'.
15918334Speter     In a SYMBOL_REF, means that emit_library_call
16018334Speter     has used it as the function.  */
16118334Speter  unsigned int used : 1;
16218334Speter  /* Nonzero if this rtx came from procedure integration.
16318334Speter     In a REG, nonzero means this reg refers to the return value
16418334Speter     of the current function.  */
16518334Speter  unsigned integrated : 1;
16650397Sobrien  /* Nonzero if this rtx is related to the call frame, either changing how
16750397Sobrien     we compute the frame address or saving and restoring registers in
16850397Sobrien     the prologue and epilogue.  */
16950397Sobrien  unsigned frame_related : 1;
17018334Speter  /* The first element of the operands of this rtx.
17118334Speter     The number of operands and their types are controlled
17218334Speter     by the `code' field, according to rtl.def.  */
17318334Speter  rtunion fld[1];
17418334Speter} *rtx;
17518334Speter
17650397Sobrien#include "gansidecl.h"
17718334Speter
17818334Speter#define NULL_RTX (rtx) 0
17918334Speter
18018334Speter/* Define macros to access the `code' field of the rtx.  */
18118334Speter
18218334Speter#ifdef SHORT_ENUM_BUG
18318334Speter#define GET_CODE(RTX)		((enum rtx_code) ((RTX)->code))
18418334Speter#define PUT_CODE(RTX, CODE)	((RTX)->code = ((short) (CODE)))
18518334Speter#else
18618334Speter#define GET_CODE(RTX)		((RTX)->code)
18718334Speter#define PUT_CODE(RTX, CODE)	((RTX)->code = (CODE))
18818334Speter#endif
18918334Speter
19018334Speter#define GET_MODE(RTX)		((RTX)->mode)
19118334Speter#define PUT_MODE(RTX, MODE)	((RTX)->mode = (MODE))
19218334Speter
19318334Speter#define RTX_INTEGRATED_P(RTX) ((RTX)->integrated)
19418334Speter#define RTX_UNCHANGING_P(RTX) ((RTX)->unchanging)
19550397Sobrien#define RTX_FRAME_RELATED_P(RTX) ((RTX)->frame_related)
19618334Speter
19718334Speter/* RTL vector.  These appear inside RTX's when there is a need
19818334Speter   for a variable number of things.  The principle use is inside
19918334Speter   PARALLEL expressions.  */
20018334Speter
20118334Spetertypedef struct rtvec_def{
20250397Sobrien  int num_elem;		/* number of elements */
20318334Speter  rtunion elem[1];
20418334Speter} *rtvec;
20518334Speter
20618334Speter#define NULL_RTVEC (rtvec) 0
20718334Speter
20818334Speter#define GET_NUM_ELEM(RTVEC)		((RTVEC)->num_elem)
20950397Sobrien#define PUT_NUM_ELEM(RTVEC, NUM)	((RTVEC)->num_elem = (NUM))
21018334Speter
21118334Speter#define RTVEC_ELT(RTVEC, I)  ((RTVEC)->elem[(I)].rtx)
21218334Speter
21318334Speter/* 1 if X is a REG.  */
21418334Speter
21518334Speter#define REG_P(X) (GET_CODE (X) == REG)
21618334Speter
21718334Speter/* 1 if X is a constant value that is an integer.  */
21818334Speter
21918334Speter#define CONSTANT_P(X)   \
22018334Speter  (GET_CODE (X) == LABEL_REF || GET_CODE (X) == SYMBOL_REF		\
22118334Speter   || GET_CODE (X) == CONST_INT || GET_CODE (X) == CONST_DOUBLE		\
22250397Sobrien   || GET_CODE (X) == CONST || GET_CODE (X) == HIGH			\
22350397Sobrien   || GET_CODE (X) == CONSTANT_P_RTX)
22418334Speter
22518334Speter/* General accessor macros for accessing the fields of an rtx.  */
22618334Speter
22718334Speter#define XEXP(RTX, N)	((RTX)->fld[N].rtx)
22818334Speter#define XINT(RTX, N)	((RTX)->fld[N].rtint)
22918334Speter#define XWINT(RTX, N)	((RTX)->fld[N].rtwint)
23018334Speter#define XSTR(RTX, N)	((RTX)->fld[N].rtstr)
23118334Speter#define XVEC(RTX, N)	((RTX)->fld[N].rtvec)
23218334Speter#define XVECLEN(RTX, N)	((RTX)->fld[N].rtvec->num_elem)
23318334Speter#define XVECEXP(RTX,N,M)((RTX)->fld[N].rtvec->elem[M].rtx)
23450397Sobrien#define XBITMAP(RTX, N) ((RTX)->fld[N].rtbit)
23550397Sobrien#define XTREE(RTX, N)   ((RTX)->fld[N].rttree)
23650397Sobrien
23718334Speter
23818334Speter/* ACCESS MACROS for particular fields of insns.  */
23918334Speter
24018334Speter/* Holds a unique number for each insn.
24118334Speter   These are not necessarily sequentially increasing.  */
24218334Speter#define INSN_UID(INSN)	((INSN)->fld[0].rtint)
24318334Speter
24418334Speter/* Chain insns together in sequence.  */
24518334Speter#define PREV_INSN(INSN)	((INSN)->fld[1].rtx)
24618334Speter#define NEXT_INSN(INSN)	((INSN)->fld[2].rtx)
24718334Speter
24818334Speter/* The body of an insn.  */
24918334Speter#define PATTERN(INSN)	((INSN)->fld[3].rtx)
25018334Speter
25118334Speter/* Code number of instruction, from when it was recognized.
25218334Speter   -1 means this instruction has not been recognized yet.  */
25318334Speter#define INSN_CODE(INSN) ((INSN)->fld[4].rtint)
25418334Speter
25518334Speter/* Set up in flow.c; empty before then.
25618334Speter   Holds a chain of INSN_LIST rtx's whose first operands point at
25718334Speter   previous insns with direct data-flow connections to this one.
25818334Speter   That means that those insns set variables whose next use is in this insn.
25918334Speter   They are always in the same basic block as this insn.  */
26018334Speter#define LOG_LINKS(INSN)		((INSN)->fld[5].rtx)
26118334Speter
26218334Speter/* 1 if insn has been deleted.  */
26318334Speter#define INSN_DELETED_P(INSN) ((INSN)->volatil)
26418334Speter
26518334Speter/* 1 if insn is a call to a const function.  */
26618334Speter#define CONST_CALL_P(INSN) ((INSN)->unchanging)
26718334Speter
26818334Speter/* 1 if insn is a branch that should not unconditionally execute its
26918334Speter   delay slots, i.e., it is an annulled branch.   */
27018334Speter#define INSN_ANNULLED_BRANCH_P(INSN) ((INSN)->unchanging)
27118334Speter
27218334Speter/* 1 if insn is in a delay slot and is from the target of the branch.  If
27318334Speter   the branch insn has INSN_ANNULLED_BRANCH_P set, this insn should only be
27418334Speter   executed if the branch is taken.  For annulled branches with this bit
27518334Speter   clear, the insn should be executed only if the branch is not taken.  */
27618334Speter#define INSN_FROM_TARGET_P(INSN) ((INSN)->in_struct)
27718334Speter
27818334Speter/* Holds a list of notes on what this insn does to various REGs.
27918334Speter   It is a chain of EXPR_LIST rtx's, where the second operand
28018334Speter   is the chain pointer and the first operand is the REG being described.
28118334Speter   The mode field of the EXPR_LIST contains not a real machine mode
28218334Speter   but a value that says what this note says about the REG:
28318334Speter     REG_DEAD means that the value in REG dies in this insn (i.e., it is
28418334Speter   not needed past this insn).  If REG is set in this insn, the REG_DEAD
28518334Speter   note may, but need not, be omitted.
28618334Speter     REG_INC means that the REG is autoincremented or autodecremented.
28750397Sobrien     REG_EQUIV describes the insn as a whole; it says that the insn
28850397Sobrien   sets a register to a constant value or to be equivalent to a memory
28950397Sobrien   address.  If the register is spilled to the stack then the constant
29050397Sobrien   value should be substituted for it.  The contents of the REG_EQUIV
29118334Speter   is the constant value or memory address, which may be different
29250397Sobrien   from the source of the SET although it has the same value.  A
29350397Sobrien   REG_EQUIV note may also appear on an insn which copies a register
29450397Sobrien   parameter to a pseudo-register, if there is a memory address which
29550397Sobrien   could be used to hold that pseudo-register throughout the function.
29618334Speter     REG_EQUAL is like REG_EQUIV except that the destination
29718334Speter   is only momentarily equal to the specified rtx.  Therefore, it
29818334Speter   cannot be used for substitution; but it can be used for cse.
29918334Speter     REG_RETVAL means that this insn copies the return-value of
30018334Speter   a library call out of the hard reg for return values.  This note
30118334Speter   is actually an INSN_LIST and it points to the first insn involved
30218334Speter   in setting up arguments for the call.  flow.c uses this to delete
30318334Speter   the entire library call when its result is dead.
30418334Speter     REG_LIBCALL is the inverse of REG_RETVAL: it goes on the first insn
30518334Speter   of the library call and points at the one that has the REG_RETVAL.
30618334Speter     REG_WAS_0 says that the register set in this insn held 0 before the insn.
30718334Speter   The contents of the note is the insn that stored the 0.
30818334Speter   If that insn is deleted or patched to a NOTE, the REG_WAS_0 is inoperative.
30918334Speter   The REG_WAS_0 note is actually an INSN_LIST, not an EXPR_LIST.
31018334Speter     REG_NONNEG means that the register is always nonnegative during
31118334Speter   the containing loop.  This is used in branches so that decrement and
31218334Speter   branch instructions terminating on zero can be matched.  There must be
31318334Speter   an insn pattern in the md file named `decrement_and_branch_until_zero'
31418334Speter   or else this will never be added to any instructions.
31518334Speter     REG_NO_CONFLICT means there is no conflict *after this insn*
31618334Speter   between the register in the note and the destination of this insn.
31718334Speter     REG_UNUSED identifies a register set in this insn and never used.
31818334Speter     REG_CC_SETTER and REG_CC_USER link a pair of insns that set and use
31918334Speter   CC0, respectively.  Normally, these are required to be consecutive insns,
32018334Speter   but we permit putting a cc0-setting insn in the delay slot of a branch
32118334Speter   as long as only one copy of the insn exists.  In that case, these notes
32218334Speter   point from one to the other to allow code generation to determine what
32318334Speter   any require information and to properly update CC_STATUS.
32418334Speter     REG_LABEL points to a CODE_LABEL.  Used by non-JUMP_INSNs to
32518334Speter   say that the CODE_LABEL contained in the REG_LABEL note is used
32618334Speter   by the insn.
32718334Speter     REG_DEP_ANTI is used in LOG_LINKS which represent anti (write after read)
32818334Speter   dependencies.  REG_DEP_OUTPUT is used in LOG_LINKS which represent output
32918334Speter   (write after write) dependencies.  Data dependencies, which are the only
33018334Speter   type of LOG_LINK created by flow, are represented by a 0 reg note kind.  */
33150397Sobrien/*   REG_BR_PROB is attached to JUMP_INSNs and CALL_INSNs when the flag
33250397Sobrien   -fbranch-probabilities is given.  It has an integer value.  For jumps,
33350397Sobrien   it is the probability that this is a taken branch.  For calls, it is the
33450397Sobrien   probability that this call won't return.
33550397Sobrien     REG_EXEC_COUNT is attached to the first insn of each basic block, and
33650397Sobrien   the first insn after each CALL_INSN.  It indicates how many times this
33750397Sobrien   block was executed.
33850397Sobrien     REG_SAVE_AREA is used to optimize rtl generated by dynamic stack
33950397Sobrien   allocations for targets where SETJMP_VIA_SAVE_AREA is true.
34050397Sobrien     REG_BR_PRED is attached to JUMP_INSNs only, it holds the branch prediction
34150397Sobrien   flags computed by get_jump_flags() after dbr scheduling is complete.  */
34218334Speter
34350397Sobrien
34418334Speter#define REG_NOTES(INSN)	((INSN)->fld[6].rtx)
34518334Speter
34650397Sobrien#define ADDR_DIFF_VEC_FLAGS(RTX) ((RTX)->fld[4].rt_addr_diff_vec_flags)
34750397Sobrien
34818334Speter/* Don't forget to change reg_note_name in rtl.c.  */
34918334Speterenum reg_note { REG_DEAD = 1, REG_INC = 2, REG_EQUIV = 3, REG_WAS_0 = 4,
35018334Speter		REG_EQUAL = 5, REG_RETVAL = 6, REG_LIBCALL = 7,
35118334Speter		REG_NONNEG = 8, REG_NO_CONFLICT = 9, REG_UNUSED = 10,
35218334Speter		REG_CC_SETTER = 11, REG_CC_USER = 12, REG_LABEL = 13,
35350397Sobrien		REG_DEP_ANTI = 14, REG_DEP_OUTPUT = 15, REG_BR_PROB = 16,
35450397Sobrien		REG_EXEC_COUNT = 17, REG_NOALIAS = 18, REG_SAVE_AREA = 19,
35550397Sobrien		REG_BR_PRED = 20, REG_EH_CONTEXT = 21 };
35650397Sobrien/* The base value for branch probability notes.  */
35750397Sobrien#define REG_BR_PROB_BASE  10000
35818334Speter
35918334Speter/* Define macros to extract and insert the reg-note kind in an EXPR_LIST.  */
36018334Speter#define REG_NOTE_KIND(LINK) ((enum reg_note) GET_MODE (LINK))
36118334Speter#define PUT_REG_NOTE_KIND(LINK,KIND) PUT_MODE(LINK, (enum machine_mode) (KIND))
36218334Speter
36318334Speter/* Names for REG_NOTE's in EXPR_LIST insn's.  */
36418334Speter
36518334Speterextern char *reg_note_name[];
36650397Sobrien#define GET_REG_NOTE_NAME(MODE) (reg_note_name[(int) (MODE)])
36718334Speter
36818334Speter/* This field is only present on CALL_INSNs.  It holds a chain of EXPR_LIST of
36918334Speter   USE and CLOBBER expressions.
37018334Speter     USE expressions list the registers filled with arguments that
37118334Speter   are passed to the function.
37218334Speter     CLOBBER expressions document the registers explicitly clobbered
37318334Speter   by this CALL_INSN.
37418334Speter     Pseudo registers can not be mentioned in this list.  */
37518334Speter#define CALL_INSN_FUNCTION_USAGE(INSN)	((INSN)->fld[7].rtx)
37618334Speter
37718334Speter/* The label-number of a code-label.  The assembler label
37818334Speter   is made from `L' and the label-number printed in decimal.
37918334Speter   Label numbers are unique in a compilation.  */
38018334Speter#define CODE_LABEL_NUMBER(INSN)	((INSN)->fld[3].rtint)
38118334Speter
38218334Speter#define LINE_NUMBER NOTE
38318334Speter
38450397Sobrien/* In a NOTE that is a line number, this is a string for the file name that the
38550397Sobrien   line is in.  We use the same field to record block numbers temporarily in
38650397Sobrien   NOTE_INSN_BLOCK_BEG and NOTE_INSN_BLOCK_END notes.  (We avoid lots of casts
38750397Sobrien   between ints and pointers if we use a different macro for the block number.)
38850397Sobrien   The NOTE_INSN_RANGE_{START,END} and NOTE_INSN_LIVE notes record their
38950397Sobrien   information as a rtx in the field.  */
39018334Speter
39118334Speter#define NOTE_SOURCE_FILE(INSN)  ((INSN)->fld[3].rtstr)
39218334Speter#define NOTE_BLOCK_NUMBER(INSN) ((INSN)->fld[3].rtint)
39350397Sobrien#define NOTE_RANGE_INFO(INSN)   ((INSN)->fld[3].rtx)
39450397Sobrien#define NOTE_LIVE_INFO(INSN)    ((INSN)->fld[3].rtx)
39518334Speter
39650397Sobrien/* If the NOTE_BLOCK_NUMBER field gets a -1, it means create a new
39750397Sobrien   block node for a live range block.  */
39850397Sobrien#define NOTE_BLOCK_LIVE_RANGE_BLOCK -1
39950397Sobrien
40018334Speter/* In a NOTE that is a line number, this is the line number.
40118334Speter   Other kinds of NOTEs are identified by negative numbers here.  */
40218334Speter#define NOTE_LINE_NUMBER(INSN) ((INSN)->fld[4].rtint)
40318334Speter
40418334Speter/* Codes that appear in the NOTE_LINE_NUMBER field
40518334Speter   for kinds of notes that are not line numbers.
40618334Speter
40718334Speter   Notice that we do not try to use zero here for any of
40818334Speter   the special note codes because sometimes the source line
40918334Speter   actually can be zero!  This happens (for example) when we
41018334Speter   are generating code for the per-translation-unit constructor
41118334Speter   and destructor routines for some C++ translation unit.
41218334Speter
41318334Speter   If you should change any of the following values, or if you
41418334Speter   should add a new value here, don't forget to change the
41518334Speter   note_insn_name array in rtl.c.  */
41618334Speter
41718334Speter/* This note is used to get rid of an insn
41818334Speter   when it isn't safe to patch the insn out of the chain.  */
41918334Speter#define NOTE_INSN_DELETED -1
42018334Speter#define NOTE_INSN_BLOCK_BEG -2
42118334Speter#define NOTE_INSN_BLOCK_END -3
42218334Speter#define NOTE_INSN_LOOP_BEG -4
42318334Speter#define NOTE_INSN_LOOP_END -5
42418334Speter/* This kind of note is generated at the end of the function body,
42518334Speter   just before the return insn or return label.
42618334Speter   In an optimizing compilation it is deleted by the first jump optimization,
42718334Speter   after enabling that optimizer to determine whether control can fall
42818334Speter   off the end of the function body without a return statement.  */
42918334Speter#define NOTE_INSN_FUNCTION_END -6
43018334Speter/* This kind of note is generated just after each call to `setjmp', et al.  */
43118334Speter#define NOTE_INSN_SETJMP -7
43218334Speter/* Generated at the place in a loop that `continue' jumps to.  */
43318334Speter#define NOTE_INSN_LOOP_CONT -8
43418334Speter/* Generated at the start of a duplicated exit test.  */
43518334Speter#define NOTE_INSN_LOOP_VTOP -9
43618334Speter/* This marks the point immediately after the last prologue insn.  */
43718334Speter#define NOTE_INSN_PROLOGUE_END -10
43818334Speter/* This marks the point immediately prior to the first epilogue insn.  */
43918334Speter#define NOTE_INSN_EPILOGUE_BEG -11
44018334Speter/* Generated in place of user-declared labels when they are deleted.  */
44118334Speter#define NOTE_INSN_DELETED_LABEL -12
44218334Speter/* This note indicates the start of the real body of the function,
44318334Speter   i.e. the point just after all of the parms have been moved into
44418334Speter   their homes, etc.  */
44518334Speter#define NOTE_INSN_FUNCTION_BEG -13
44650397Sobrien/* These note where exception handling regions begin and end.  */
44750397Sobrien#define NOTE_INSN_EH_REGION_BEG -14
44850397Sobrien#define NOTE_INSN_EH_REGION_END -15
44950397Sobrien/* Generated whenever a duplicate line number note is output.  For example,
45050397Sobrien   one is output after the end of an inline function, in order to prevent
45150397Sobrien   the line containing the inline call from being counted twice in gcov. */
45250397Sobrien#define NOTE_REPEATED_LINE_NUMBER -16
45318334Speter
45450397Sobrien/* Start/end of a live range region, where pseudos allocated on the stack can
45550397Sobrien   be allocated to temporary registers.  */
45650397Sobrien#define NOTE_INSN_RANGE_START -17
45750397Sobrien#define NOTE_INSN_RANGE_END -18
45850397Sobrien/* Record which registers are currently live.  */
45950397Sobrien#define NOTE_INSN_LIVE -19
46018334Speter
46118334Speter#if 0 /* These are not used, and I don't know what they were for. --rms.  */
46218334Speter#define NOTE_DECL_NAME(INSN) ((INSN)->fld[3].rtstr)
46318334Speter#define NOTE_DECL_CODE(INSN) ((INSN)->fld[4].rtint)
46418334Speter#define NOTE_DECL_RTL(INSN) ((INSN)->fld[5].rtx)
46518334Speter#define NOTE_DECL_IDENTIFIER(INSN) ((INSN)->fld[6].rtint)
46618334Speter#define NOTE_DECL_TYPE(INSN) ((INSN)->fld[7].rtint)
46718334Speter#endif /* 0 */
46818334Speter
46918334Speter/* Names for NOTE insn's other than line numbers.  */
47018334Speter
47118334Speterextern char *note_insn_name[];
47218334Speter#define GET_NOTE_INSN_NAME(NOTE_CODE) (note_insn_name[-(NOTE_CODE)])
47318334Speter
47418334Speter/* The name of a label, in case it corresponds to an explicit label
47518334Speter   in the input source code.  */
47618334Speter#define LABEL_NAME(LABEL) ((LABEL)->fld[4].rtstr)
47718334Speter
47818334Speter/* In jump.c, each label contains a count of the number
47918334Speter   of LABEL_REFs that point at it, so unused labels can be deleted.  */
48018334Speter#define LABEL_NUSES(LABEL) ((LABEL)->fld[5].rtint)
48118334Speter
48250397Sobrien/* The original regno this ADDRESSOF was built for.  */
48350397Sobrien#define ADDRESSOF_REGNO(RTX) ((RTX)->fld[1].rtint)
48418334Speter
48550397Sobrien/* The variable in the register we took the address of.  */
48650397Sobrien#define ADDRESSOF_DECL(X) ((tree) XEXP ((X), 2))
48750397Sobrien#define SET_ADDRESSOF_DECL(X, T) (XEXP ((X), 2) = (rtx) (T))
48818334Speter
48918334Speter/* In jump.c, each JUMP_INSN can point to a label that it can jump to,
49018334Speter   so that if the JUMP_INSN is deleted, the label's LABEL_NUSES can
49118334Speter   be decremented and possibly the label can be deleted.  */
49218334Speter#define JUMP_LABEL(INSN)   ((INSN)->fld[7].rtx)
49318334Speter
49418334Speter/* Once basic blocks are found in flow.c,
49518334Speter   each CODE_LABEL starts a chain that goes through
49618334Speter   all the LABEL_REFs that jump to that label.
49718334Speter   The chain eventually winds up at the CODE_LABEL; it is circular.  */
49850397Sobrien#define LABEL_REFS(LABEL) ((LABEL)->fld[6].rtx)
49918334Speter
50018334Speter/* This is the field in the LABEL_REF through which the circular chain
50118334Speter   of references to a particular label is linked.
50218334Speter   This chain is set up in flow.c.  */
50318334Speter
50418334Speter#define LABEL_NEXTREF(REF) ((REF)->fld[1].rtx)
50518334Speter
50618334Speter/* Once basic blocks are found in flow.c,
50718334Speter   Each LABEL_REF points to its containing instruction with this field.  */
50818334Speter
50918334Speter#define CONTAINING_INSN(RTX) ((RTX)->fld[2].rtx)
51018334Speter
51118334Speter/* For a REG rtx, REGNO extracts the register number.  */
51218334Speter
51318334Speter#define REGNO(RTX) ((RTX)->fld[0].rtint)
51418334Speter
51518334Speter/* For a REG rtx, REG_FUNCTION_VALUE_P is nonzero if the reg
51618334Speter   is the current function's return value.  */
51718334Speter
51818334Speter#define REG_FUNCTION_VALUE_P(RTX) ((RTX)->integrated)
51918334Speter
52018334Speter/* 1 in a REG rtx if it corresponds to a variable declared by the user.  */
52118334Speter#define REG_USERVAR_P(RTX) ((RTX)->volatil)
52218334Speter
52318334Speter/* For a CONST_INT rtx, INTVAL extracts the integer.  */
52418334Speter
52518334Speter#define INTVAL(RTX) ((RTX)->fld[0].rtwint)
52618334Speter
52718334Speter/* For a SUBREG rtx, SUBREG_REG extracts the value we want a subreg of.
52818334Speter   SUBREG_WORD extracts the word-number.  */
52918334Speter
53018334Speter#define SUBREG_REG(RTX) ((RTX)->fld[0].rtx)
53118334Speter#define SUBREG_WORD(RTX) ((RTX)->fld[1].rtint)
53218334Speter
53318334Speter/* 1 if the REG contained in SUBREG_REG is already known to be
53418334Speter   sign- or zero-extended from the mode of the SUBREG to the mode of
53518334Speter   the reg.  SUBREG_PROMOTED_UNSIGNED_P gives the signedness of the
53618334Speter   extension.
53718334Speter
53818334Speter   When used as a LHS, is means that this extension must be done
53918334Speter   when assigning to SUBREG_REG.  */
54018334Speter
54118334Speter#define SUBREG_PROMOTED_VAR_P(RTX) ((RTX)->in_struct)
54218334Speter#define SUBREG_PROMOTED_UNSIGNED_P(RTX) ((RTX)->unchanging)
54318334Speter
54418334Speter/* Access various components of an ASM_OPERANDS rtx.  */
54518334Speter
54618334Speter#define ASM_OPERANDS_TEMPLATE(RTX) XSTR ((RTX), 0)
54718334Speter#define ASM_OPERANDS_OUTPUT_CONSTRAINT(RTX) XSTR ((RTX), 1)
54818334Speter#define ASM_OPERANDS_OUTPUT_IDX(RTX) XINT ((RTX), 2)
54918334Speter#define ASM_OPERANDS_INPUT_VEC(RTX) XVEC ((RTX), 3)
55018334Speter#define ASM_OPERANDS_INPUT_CONSTRAINT_VEC(RTX) XVEC ((RTX), 4)
55118334Speter#define ASM_OPERANDS_INPUT(RTX, N) XVECEXP ((RTX), 3, (N))
55218334Speter#define ASM_OPERANDS_INPUT_LENGTH(RTX) XVECLEN ((RTX), 3)
55318334Speter#define ASM_OPERANDS_INPUT_CONSTRAINT(RTX, N) XSTR (XVECEXP ((RTX), 4, (N)), 0)
55418334Speter#define ASM_OPERANDS_INPUT_MODE(RTX, N) GET_MODE (XVECEXP ((RTX), 4, (N)))
55518334Speter#define ASM_OPERANDS_SOURCE_FILE(RTX) XSTR ((RTX), 5)
55618334Speter#define ASM_OPERANDS_SOURCE_LINE(RTX) XINT ((RTX), 6)
55718334Speter
55818334Speter/* For a MEM rtx, 1 if it's a volatile reference.
55918334Speter   Also in an ASM_OPERANDS rtx.  */
56018334Speter#define MEM_VOLATILE_P(RTX) ((RTX)->volatil)
56118334Speter
56250397Sobrien/* For a MEM rtx, 1 if it refers to a field of an aggregate.  */
56318334Speter#define MEM_IN_STRUCT_P(RTX) ((RTX)->in_struct)
56418334Speter
56550397Sobrien/* For a MEM rtx, the alias set.  If 0, this MEM is not in any alias
56650397Sobrien   set, and may alias anything.  Otherwise, the MEM can only alias
56750397Sobrien   MEMs in the same alias set.  This value is set in a
56850397Sobrien   language-dependent manner in the front-end, and should not be
56950397Sobrien   altered in the back-end.  These set numbers are tested for zero,
57050397Sobrien   and compared for equality; they have no other significance.  In
57150397Sobrien   some front-ends, these numbers may correspond in some way to types,
57250397Sobrien   or other language-level entities, but they need not, and the
57350397Sobrien   back-end makes no such assumptions.  */
57450397Sobrien#define MEM_ALIAS_SET(RTX) (XINT (RTX, 1))
57550397Sobrien
57618334Speter/* For a LABEL_REF, 1 means that this reference is to a label outside the
57718334Speter   loop containing the reference.  */
57818334Speter#define LABEL_OUTSIDE_LOOP_P(RTX) ((RTX)->in_struct)
57918334Speter
58018334Speter/* For a LABEL_REF, 1 means it is for a nonlocal label.  */
58118334Speter/* Likewise in an EXPR_LIST for a REG_LABEL note.  */
58218334Speter#define LABEL_REF_NONLOCAL_P(RTX) ((RTX)->volatil)
58318334Speter
58418334Speter/* For a CODE_LABEL, 1 means always consider this label to be needed.  */
58518334Speter#define LABEL_PRESERVE_P(RTX) ((RTX)->in_struct)
58618334Speter
58718334Speter/* For a REG, 1 means the register is used only in an exit test of a loop.  */
58818334Speter#define REG_LOOP_TEST_P(RTX) ((RTX)->in_struct)
58918334Speter
59018334Speter/* During sched, for an insn, 1 means that the insn must be scheduled together
59118334Speter   with the preceding insn.  */
59218334Speter#define SCHED_GROUP_P(INSN) ((INSN)->in_struct)
59318334Speter
59418334Speter/* During sched, for the LOG_LINKS of an insn, these cache the adjusted
59518334Speter   cost of the dependence link.  The cost of executing an instruction
59618334Speter   may vary based on how the results are used.  LINK_COST_ZERO is 1 when
59718334Speter   the cost through the link varies and is unchanged (i.e., the link has
59818334Speter   zero additional cost).  LINK_COST_FREE is 1 when the cost through the
59918334Speter   link is zero (i.e., the link makes the cost free).  In other cases,
60018334Speter   the adjustment to the cost is recomputed each time it is needed.  */
60118334Speter#define LINK_COST_ZERO(X) ((X)->jump)
60218334Speter#define LINK_COST_FREE(X) ((X)->call)
60318334Speter
60418334Speter/* For a SET rtx, SET_DEST is the place that is set
60518334Speter   and SET_SRC is the value it is set to.  */
60618334Speter#define SET_DEST(RTX) ((RTX)->fld[0].rtx)
60718334Speter#define SET_SRC(RTX) ((RTX)->fld[1].rtx)
60818334Speter
60918334Speter/* For a TRAP_IF rtx, TRAP_CONDITION is an expression.  */
61018334Speter#define TRAP_CONDITION(RTX) ((RTX)->fld[0].rtx)
61150397Sobrien#define TRAP_CODE(RTX) (RTX)->fld[1].rtx
61218334Speter
61318334Speter/* 1 in a SYMBOL_REF if it addresses this function's constants pool.  */
61418334Speter#define CONSTANT_POOL_ADDRESS_P(RTX) ((RTX)->unchanging)
61518334Speter
61618334Speter/* Flag in a SYMBOL_REF for machine-specific purposes.  */
61718334Speter#define SYMBOL_REF_FLAG(RTX) ((RTX)->volatil)
61818334Speter
61918334Speter/* 1 means a SYMBOL_REF has been the library function in emit_library_call.  */
62018334Speter#define SYMBOL_REF_USED(RTX) ((RTX)->used)
62118334Speter
62218334Speter/* For an INLINE_HEADER rtx, FIRST_FUNCTION_INSN is the first insn
62318334Speter   of the function that is not involved in copying parameters to
62418334Speter   pseudo-registers.  FIRST_PARM_INSN is the very first insn of
62518334Speter   the function, including the parameter copying.
62618334Speter   We keep this around in case we must splice
62718334Speter   this function into the assembly code at the end of the file.
62818334Speter   FIRST_LABELNO is the first label number used by the function (inclusive).
62918334Speter   LAST_LABELNO is the last label used by the function (exclusive).
63018334Speter   MAX_REGNUM is the largest pseudo-register used by that function.
63118334Speter   FUNCTION_ARGS_SIZE is the size of the argument block in the stack.
63218334Speter   POPS_ARGS is the number of bytes of input arguments popped by the function
63318334Speter   STACK_SLOT_LIST is the list of stack slots.
63418334Speter   FORCED_LABELS is the list of labels whose address was taken.
63518334Speter   FUNCTION_FLAGS are where single-bit flags are saved.
63618334Speter   OUTGOING_ARGS_SIZE is the size of the largest outgoing stack parameter list.
63718334Speter   ORIGINAL_ARG_VECTOR is a vector of the original DECL_RTX values
63818334Speter    for the function arguments.
63918334Speter   ORIGINAL_DECL_INITIAL is a pointer to the original DECL_INITIAL for the
64018334Speter    function.
64150397Sobrien   INLINE_REGNO_REG_RTX, INLINE_REGNO_POINTER_FLAG, and
64250397Sobrien    INLINE_REGNO_POINTER_ALIGN are pointers to the corresponding arrays.
64318334Speter
64418334Speter   We want this to lay down like an INSN.  The PREV_INSN field
64518334Speter   is always NULL.  The NEXT_INSN field always points to the
64618334Speter   first function insn of the function being squirreled away.  */
64718334Speter
64818334Speter#define FIRST_FUNCTION_INSN(RTX) ((RTX)->fld[2].rtx)
64918334Speter#define FIRST_PARM_INSN(RTX) ((RTX)->fld[3].rtx)
65018334Speter#define FIRST_LABELNO(RTX) ((RTX)->fld[4].rtint)
65118334Speter#define LAST_LABELNO(RTX) ((RTX)->fld[5].rtint)
65218334Speter#define MAX_PARMREG(RTX) ((RTX)->fld[6].rtint)
65318334Speter#define MAX_REGNUM(RTX) ((RTX)->fld[7].rtint)
65418334Speter#define FUNCTION_ARGS_SIZE(RTX) ((RTX)->fld[8].rtint)
65518334Speter#define POPS_ARGS(RTX) ((RTX)->fld[9].rtint)
65618334Speter#define STACK_SLOT_LIST(RTX) ((RTX)->fld[10].rtx)
65718334Speter#define FORCED_LABELS(RTX) ((RTX)->fld[11].rtx)
65818334Speter#define FUNCTION_FLAGS(RTX) ((RTX)->fld[12].rtint)
65918334Speter#define OUTGOING_ARGS_SIZE(RTX) ((RTX)->fld[13].rtint)
66018334Speter#define ORIGINAL_ARG_VECTOR(RTX) ((RTX)->fld[14].rtvec)
66118334Speter#define ORIGINAL_DECL_INITIAL(RTX) ((RTX)->fld[15].rtx)
66250397Sobrien#define INLINE_REGNO_REG_RTX(RTX) ((RTX)->fld[16].rtvec)
66350397Sobrien#define INLINE_REGNO_POINTER_FLAG(RTX) ((RTX)->fld[17].rtstr)
66450397Sobrien#define INLINE_REGNO_POINTER_ALIGN(RTX) ((RTX)->fld[18].rtstr)
66550397Sobrien#define PARMREG_STACK_LOC(RTX) ((RTX)->fld[19].rtvec)
66618334Speter
66718334Speter/* In FUNCTION_FLAGS we save some variables computed when emitting the code
66818334Speter   for the function and which must be `or'ed into the current flag values when
66918334Speter   insns from that function are being inlined.  */
67018334Speter
67118334Speter/* These ought to be an enum, but non-ANSI compilers don't like that.  */
67218334Speter#define FUNCTION_FLAGS_CALLS_ALLOCA 01
67318334Speter#define FUNCTION_FLAGS_CALLS_SETJMP 02
67418334Speter#define FUNCTION_FLAGS_RETURNS_STRUCT 04
67518334Speter#define FUNCTION_FLAGS_RETURNS_PCC_STRUCT 010
67618334Speter#define FUNCTION_FLAGS_NEEDS_CONTEXT 020
67718334Speter#define FUNCTION_FLAGS_HAS_NONLOCAL_LABEL 040
67818334Speter#define FUNCTION_FLAGS_RETURNS_POINTER 0100
67918334Speter#define FUNCTION_FLAGS_USES_CONST_POOL 0200
68018334Speter#define FUNCTION_FLAGS_CALLS_LONGJMP 0400
68118334Speter#define FUNCTION_FLAGS_USES_PIC_OFFSET_TABLE 01000
68218334Speter
68318334Speter/* Define a macro to look for REG_INC notes,
68418334Speter   but save time on machines where they never exist.  */
68518334Speter
68618334Speter/* Don't continue this line--convex cc version 4.1 would lose.  */
68718334Speter#if (defined (HAVE_PRE_INCREMENT) || defined (HAVE_PRE_DECREMENT) || defined (HAVE_POST_INCREMENT) || defined (HAVE_POST_DECREMENT))
68818334Speter#define FIND_REG_INC_NOTE(insn, reg) (find_reg_note ((insn), REG_INC, (reg)))
68918334Speter#else
69018334Speter#define FIND_REG_INC_NOTE(insn, reg) 0
69118334Speter#endif
69218334Speter
69318334Speter/* Indicate whether the machine has any sort of auto increment addressing.
69418334Speter   If not, we can avoid checking for REG_INC notes.  */
69518334Speter
69618334Speter/* Don't continue this line--convex cc version 4.1 would lose.  */
69718334Speter#if (defined (HAVE_PRE_INCREMENT) || defined (HAVE_PRE_DECREMENT) || defined (HAVE_POST_INCREMENT) || defined (HAVE_POST_DECREMENT))
69818334Speter#define AUTO_INC_DEC
69918334Speter#endif
70050397Sobrien
70150397Sobrien/* Accessors for RANGE_INFO.  */
70250397Sobrien/* For RANGE_{START,END} notes return the RANGE_START note.  */
70350397Sobrien#define RANGE_INFO_NOTE_START(INSN) (XEXP (INSN, 0))
70450397Sobrien
70550397Sobrien/* For RANGE_{START,END} notes return the RANGE_START note.  */
70650397Sobrien#define RANGE_INFO_NOTE_END(INSN) (XEXP (INSN, 1))
70750397Sobrien
70850397Sobrien/* For RANGE_{START,END} notes, return the vector containing the registers used
70950397Sobrien   in the range.  */
71050397Sobrien#define RANGE_INFO_REGS(INSN) (XVEC (INSN, 2))
71150397Sobrien#define RANGE_INFO_REGS_REG(INSN, N) (XVECEXP (INSN, 2, N))
71250397Sobrien#define RANGE_INFO_NUM_REGS(INSN) (XVECLEN (INSN, 2))
71350397Sobrien
71450397Sobrien/* For RANGE_{START,END} notes, the number of calls within the range.  */
71550397Sobrien#define RANGE_INFO_NCALLS(INSN) (XINT (INSN, 3))
71650397Sobrien
71750397Sobrien/* For RANGE_{START,END} notes, the number of insns within the range.  */
71850397Sobrien#define RANGE_INFO_NINSNS(INSN) (XINT (INSN, 4))
71950397Sobrien
72050397Sobrien/* For RANGE_{START,END} notes, a unique # to identify this range.  */
72150397Sobrien#define RANGE_INFO_UNIQUE(INSN) (XINT (INSN, 5))
72250397Sobrien
72350397Sobrien/* For RANGE_{START,END} notes, the basic block # the range starts with. */
72450397Sobrien#define RANGE_INFO_BB_START(INSN) (XINT (INSN, 6))
72550397Sobrien
72650397Sobrien/* For RANGE_{START,END} notes, the basic block # the range ends with. */
72750397Sobrien#define RANGE_INFO_BB_END(INSN) (XINT (INSN, 7))
72850397Sobrien
72950397Sobrien/* For RANGE_{START,END} notes, the loop depth the range is in.  */
73050397Sobrien#define RANGE_INFO_LOOP_DEPTH(INSN) (XINT (INSN, 8))
73150397Sobrien
73250397Sobrien/* For RANGE_{START,END} notes, the bitmap of live registers at the start
73350397Sobrien   of the range.  */
73450397Sobrien#define RANGE_INFO_LIVE_START(INSN) (XBITMAP (INSN, 9))
73550397Sobrien
73650397Sobrien/* For RANGE_{START,END} notes, the bitmap of live registers at the end
73750397Sobrien   of the range.  */
73850397Sobrien#define RANGE_INFO_LIVE_END(INSN) (XBITMAP (INSN, 10))
73950397Sobrien
74050397Sobrien/* For RANGE_START notes, the marker # of the start of the range.  */
74150397Sobrien#define RANGE_INFO_MARKER_START(INSN) (XINT (INSN, 11))
74250397Sobrien
74350397Sobrien/* For RANGE_START notes, the marker # of the end of the range.  */
74450397Sobrien#define RANGE_INFO_MARKER_END(INSN) (XINT (INSN, 12))
74550397Sobrien
74650397Sobrien/* Original pseudo register # for a live range note.  */
74750397Sobrien#define RANGE_REG_PSEUDO(INSN,N) (XINT (XVECEXP (INSN, 2, N), 0))
74850397Sobrien
74950397Sobrien/* Pseudo register # original register is copied into or -1.  */
75050397Sobrien#define RANGE_REG_COPY(INSN,N) (XINT (XVECEXP (INSN, 2, N), 1))
75150397Sobrien
75250397Sobrien/* How many times a register in a live range note was referenced.  */
75350397Sobrien#define RANGE_REG_REFS(INSN,N) (XINT (XVECEXP (INSN, 2, N), 2))
75450397Sobrien
75550397Sobrien/* How many times a register in a live range note was set.  */
75650397Sobrien#define RANGE_REG_SETS(INSN,N) (XINT (XVECEXP (INSN, 2, N), 3))
75750397Sobrien
75850397Sobrien/* How many times a register in a live range note died.  */
75950397Sobrien#define RANGE_REG_DEATHS(INSN,N) (XINT (XVECEXP (INSN, 2, N), 4))
76050397Sobrien
76150397Sobrien/* Whether the original value is needed to be copied into the range register at
76250397Sobrien   the start of the range. */
76350397Sobrien#define RANGE_REG_COPY_FLAGS(INSN,N) (XINT (XVECEXP (INSN, 2, N), 5))
76450397Sobrien
76550397Sobrien/* # of insns the register copy is live over.  */
76650397Sobrien#define RANGE_REG_LIVE_LENGTH(INSN,N) (XINT (XVECEXP (INSN, 2, N), 6))
76750397Sobrien
76850397Sobrien/* # of calls the register copy is live over.  */
76950397Sobrien#define RANGE_REG_N_CALLS(INSN,N) (XINT (XVECEXP (INSN, 2, N), 7))
77050397Sobrien
77150397Sobrien/* DECL_NODE pointer of the declaration if the register is a user defined
77250397Sobrien   variable.  */
77350397Sobrien#define RANGE_REG_SYMBOL_NODE(INSN,N) (XTREE (XVECEXP (INSN, 2, N), 8))
77450397Sobrien
77550397Sobrien/* BLOCK_NODE pointer to the block the variable is declared in if the
77650397Sobrien   register is a user defined variable.  */
77750397Sobrien#define RANGE_REG_BLOCK_NODE(INSN,N) (XTREE (XVECEXP (INSN, 2, N), 9))
77850397Sobrien
77950397Sobrien/* EXPR_LIST of the distinct ranges a variable is in.  */
78050397Sobrien#define RANGE_VAR_LIST(INSN) (XEXP (INSN, 0))
78150397Sobrien
78250397Sobrien/* Block a variable is declared in.  */
78350397Sobrien#define RANGE_VAR_BLOCK(INSN) (XTREE (INSN, 1))
78450397Sobrien
78550397Sobrien/* # of distinct ranges a variable is in.  */
78650397Sobrien#define RANGE_VAR_NUM(INSN) (XINT (INSN, 2))
78750397Sobrien
78850397Sobrien/* For a NOTE_INSN_LIVE note, the registers which are currently live.  */
78950397Sobrien#define RANGE_LIVE_BITMAP(INSN) (XBITMAP (INSN, 0))
79050397Sobrien
79150397Sobrien/* For a NOTE_INSN_LIVE note, the original basic block number.  */
79250397Sobrien#define RANGE_LIVE_ORIG_BLOCK(INSN) (XINT (INSN, 1))
79318334Speter
79418334Speter/* Generally useful functions.  */
79518334Speter
79618334Speter/* The following functions accept a wide integer argument.  Rather than
79718334Speter   having to cast on every function call, we use a macro instead, that is
79818334Speter   defined here and in tree.h.  */
79918334Speter
80018334Speter#ifndef exact_log2
80150397Sobrien#define exact_log2(N) exact_log2_wide ((unsigned HOST_WIDE_INT) (N))
80250397Sobrien#define floor_log2(N) floor_log2_wide ((unsigned HOST_WIDE_INT) (N))
80318334Speter#endif
80450397Sobrienextern int exact_log2_wide		PROTO((unsigned HOST_WIDE_INT));
80550397Sobrienextern int floor_log2_wide		PROTO((unsigned HOST_WIDE_INT));
80618334Speter
80750397Sobrien/* In expmed.c */
80850397Sobrienextern int ceil_log2			PROTO((unsigned HOST_WIDE_INT));
80950397Sobrien
81018334Speter#define plus_constant(X,C) plus_constant_wide (X, (HOST_WIDE_INT) (C))
81118334Speter
81218334Speter#define plus_constant_for_output(X,C)  \
81318334Speter  plus_constant_for_output_wide (X, (HOST_WIDE_INT) (C))
81418334Speter
81550397Sobrien/* In explow.c */
81618334Speterextern rtx plus_constant_wide		 PROTO((rtx, HOST_WIDE_INT));
81718334Speterextern rtx plus_constant_for_output_wide PROTO((rtx, HOST_WIDE_INT));
81850397Sobrienextern void optimize_save_area_alloca	PROTO((rtx));
81918334Speter
82018334Speterextern rtx gen_rtx			PVPROTO((enum rtx_code,
82118334Speter						 enum machine_mode, ...));
82218334Speterextern rtvec gen_rtvec			PVPROTO((int, ...));
82318334Speter
82450397Sobrien#ifdef BUFSIZ
82550397Sobrienextern rtx read_rtx			PROTO((FILE *));
82650397Sobrien#endif
82718334Speter
82818334Speter#if 0
82918334Speter/* At present, don't prototype xrealloc, since all of the callers don't
83018334Speter   cast their pointers to char *, and all of the xrealloc's don't use
83118334Speter   void * yet.  */
83218334Speterextern char *xmalloc			PROTO((size_t));
83350397Sobrienextern char *xcalloc			PROTO((size_t, size_t));
83418334Speterextern char *xrealloc			PROTO((void *, size_t));
83518334Speter#else
83618334Speterextern char *xmalloc ();
83750397Sobrienextern char *xcalloc ();
83818334Speterextern char *xrealloc ();
83918334Speter#endif
84018334Speter
84118334Speterextern char *oballoc			PROTO((int));
84218334Speterextern char *permalloc			PROTO((int));
84318334Speterextern rtx rtx_alloc			PROTO((RTX_CODE));
84418334Speterextern rtvec rtvec_alloc		PROTO((int));
84518334Speterextern rtx copy_rtx			PROTO((rtx));
84618334Speterextern rtx copy_rtx_if_shared		PROTO((rtx));
84718334Speterextern rtx copy_most_rtx		PROTO((rtx, rtx));
84818334Speterextern rtvec gen_rtvec_v		PROTO((int, rtx *));
84950397Sobrienextern rtvec gen_rtvec_vv		PROTO((int, rtunion *));
85018334Speterextern rtx gen_reg_rtx			PROTO((enum machine_mode));
85118334Speterextern rtx gen_label_rtx		PROTO((void));
85218334Speterextern rtx gen_inline_header_rtx	PROTO((rtx, rtx, int, int, int, int,
85318334Speter					       int, int, rtx, rtx, int, int,
85450397Sobrien					       rtvec, rtx,
85550397Sobrien					       rtvec, char *, char *, rtvec));
85618334Speterextern rtx gen_lowpart_common		PROTO((enum machine_mode, rtx));
85718334Speterextern rtx gen_lowpart			PROTO((enum machine_mode, rtx));
85818334Speterextern rtx gen_lowpart_if_possible	PROTO((enum machine_mode, rtx));
85918334Speterextern rtx gen_highpart			PROTO((enum machine_mode, rtx));
86018334Speterextern rtx gen_realpart			PROTO((enum machine_mode, rtx));
86118334Speterextern rtx gen_imagpart			PROTO((enum machine_mode, rtx));
86218334Speterextern rtx operand_subword		PROTO((rtx, int, int, enum machine_mode));
86318334Speterextern rtx operand_subword_force	PROTO((rtx, int, enum machine_mode));
86418334Speterextern int subreg_lowpart_p		PROTO((rtx));
86518334Speterextern rtx make_safe_from		PROTO((rtx, rtx));
86618334Speterextern rtx convert_memory_address	PROTO((enum machine_mode, rtx));
86718334Speterextern rtx memory_address		PROTO((enum machine_mode, rtx));
86818334Speterextern rtx get_insns			PROTO((void));
86918334Speterextern rtx get_last_insn		PROTO((void));
87018334Speterextern rtx get_last_insn_anywhere	PROTO((void));
87118334Speterextern void start_sequence		PROTO((void));
87218334Speterextern void push_to_sequence		PROTO((rtx));
87318334Speterextern void end_sequence		PROTO((void));
87418334Speterextern rtx gen_sequence			PROTO((void));
87518334Speterextern rtx immed_double_const		PROTO((HOST_WIDE_INT, HOST_WIDE_INT, enum machine_mode));
87618334Speterextern rtx force_const_mem		PROTO((enum machine_mode, rtx));
87718334Speterextern rtx force_reg			PROTO((enum machine_mode, rtx));
87818334Speterextern rtx get_pool_constant		PROTO((rtx));
87918334Speterextern enum machine_mode get_pool_mode	PROTO((rtx));
88018334Speterextern int get_pool_offset		PROTO((rtx));
88118334Speterextern rtx simplify_subtraction		PROTO((rtx));
88250397Sobrienextern rtx assign_stack_local		PROTO((enum machine_mode,
88350397Sobrien					       HOST_WIDE_INT, int));
88450397Sobrienextern rtx assign_stack_temp		PROTO((enum machine_mode,
88550397Sobrien					       HOST_WIDE_INT, int));
88650397Sobrienextern rtx assign_temp			PROTO((union tree_node *,
88750397Sobrien					       int, int, int));
88818334Speterextern rtx protect_from_queue		PROTO((rtx, int));
88918334Speterextern void emit_queue			PROTO((void));
89018334Speterextern rtx emit_move_insn		PROTO((rtx, rtx));
89118334Speterextern rtx emit_insn_before		PROTO((rtx, rtx));
89218334Speterextern rtx emit_jump_insn_before	PROTO((rtx, rtx));
89318334Speterextern rtx emit_call_insn_before	PROTO((rtx, rtx));
89418334Speterextern rtx emit_barrier_before		PROTO((rtx));
89518334Speterextern rtx emit_note_before		PROTO((int, rtx));
89618334Speterextern rtx emit_insn_after		PROTO((rtx, rtx));
89718334Speterextern rtx emit_jump_insn_after		PROTO((rtx, rtx));
89818334Speterextern rtx emit_barrier_after		PROTO((rtx));
89918334Speterextern rtx emit_label_after		PROTO((rtx, rtx));
90018334Speterextern rtx emit_note_after		PROTO((int, rtx));
90118334Speterextern rtx emit_line_note_after		PROTO((char *, int, rtx));
90218334Speterextern rtx emit_insn			PROTO((rtx));
90318334Speterextern rtx emit_insns			PROTO((rtx));
90418334Speterextern rtx emit_insns_before		PROTO((rtx, rtx));
90518334Speterextern rtx emit_insns_after		PROTO((rtx, rtx));
90618334Speterextern rtx emit_jump_insn		PROTO((rtx));
90718334Speterextern rtx emit_call_insn		PROTO((rtx));
90818334Speterextern rtx emit_label			PROTO((rtx));
90918334Speterextern rtx emit_barrier			PROTO((void));
91018334Speterextern rtx emit_line_note		PROTO((char *, int));
91118334Speterextern rtx emit_note			PROTO((char *, int));
91218334Speterextern rtx emit_line_note_force		PROTO((char *, int));
91318334Speterextern rtx make_insn_raw		PROTO((rtx));
91418334Speterextern rtx previous_insn		PROTO((rtx));
91518334Speterextern rtx next_insn			PROTO((rtx));
91618334Speterextern rtx prev_nonnote_insn		PROTO((rtx));
91718334Speterextern rtx next_nonnote_insn		PROTO((rtx));
91818334Speterextern rtx prev_real_insn		PROTO((rtx));
91918334Speterextern rtx next_real_insn		PROTO((rtx));
92018334Speterextern rtx prev_active_insn		PROTO((rtx));
92118334Speterextern rtx next_active_insn		PROTO((rtx));
92218334Speterextern rtx prev_label			PROTO((rtx));
92318334Speterextern rtx next_label			PROTO((rtx));
92418334Speterextern rtx next_cc0_user		PROTO((rtx));
92518334Speterextern rtx prev_cc0_setter		PROTO((rtx));
92618334Speterextern rtx next_nondeleted_insn		PROTO((rtx));
92718334Speterextern enum rtx_code reverse_condition	PROTO((enum rtx_code));
92818334Speterextern enum rtx_code swap_condition	PROTO((enum rtx_code));
92918334Speterextern enum rtx_code unsigned_condition	PROTO((enum rtx_code));
93018334Speterextern enum rtx_code signed_condition	PROTO((enum rtx_code));
93118334Speterextern rtx find_equiv_reg		PROTO((rtx, rtx, enum reg_class, int, short *, int, enum machine_mode));
93218334Speterextern rtx squeeze_notes		PROTO((rtx, rtx));
93318334Speterextern rtx delete_insn			PROTO((rtx));
93418334Speterextern void delete_jump			PROTO((rtx));
93518334Speterextern rtx get_label_before		PROTO((rtx));
93618334Speterextern rtx get_label_after		PROTO((rtx));
93718334Speterextern rtx follow_jumps			PROTO((rtx));
93818334Speterextern rtx adj_offsettable_operand	PROTO((rtx, int));
93918334Speterextern rtx try_split			PROTO((rtx, rtx, int));
94018334Speterextern rtx split_insns			PROTO((rtx, rtx));
94118334Speterextern rtx simplify_unary_operation	PROTO((enum rtx_code, enum machine_mode, rtx, enum machine_mode));
94218334Speterextern rtx simplify_binary_operation	PROTO((enum rtx_code, enum machine_mode, rtx, rtx));
94318334Speterextern rtx simplify_ternary_operation	PROTO((enum rtx_code, enum machine_mode, enum machine_mode, rtx, rtx, rtx));
94418334Speterextern rtx simplify_relational_operation PROTO((enum rtx_code, enum machine_mode, rtx, rtx));
94518334Speterextern rtx nonlocal_label_rtx_list	PROTO((void));
94618334Speterextern rtx gen_move_insn		PROTO((rtx, rtx));
94718334Speterextern rtx gen_jump			PROTO((rtx));
94818334Speterextern rtx gen_beq			PROTO((rtx));
94918334Speterextern rtx gen_bge			PROTO((rtx));
95018334Speterextern rtx gen_ble			PROTO((rtx));
95150397Sobrienextern rtx gen_mem_addressof		PROTO((rtx, union tree_node *));
95218334Speterextern rtx eliminate_constant_term	PROTO((rtx, rtx *));
95318334Speterextern rtx expand_complex_abs		PROTO((enum machine_mode, rtx, rtx, int));
95418334Speterextern enum machine_mode choose_hard_reg_mode PROTO((int, int));
95550397Sobrienextern int rtx_varies_p		PROTO((rtx));
95650397Sobrienextern int may_trap_p		PROTO((rtx));
95750397Sobrienextern int side_effects_p	PROTO((rtx));
95850397Sobrienextern int volatile_refs_p	PROTO((rtx));
95950397Sobrienextern int volatile_insn_p	PROTO((rtx));
96050397Sobrienextern void remove_note		PROTO((rtx, rtx));
96150397Sobrienextern int refers_to_regno_p	PROTO((int, int, rtx, rtx *));
96250397Sobrienextern int reg_overlap_mentioned_p PROTO((rtx, rtx));
96318334Speter
96450397Sobrien/* Functions in rtlanal.c */
96550397Sobrien
96650397Sobrienextern int rtx_unstable_p		PROTO((rtx));
96750397Sobrienextern int rtx_varies_p			PROTO((rtx));
96850397Sobrienextern int rtx_addr_varies_p		PROTO((rtx));
96950397Sobrienextern HOST_WIDE_INT get_integer_term	PROTO((rtx));
97050397Sobrienextern rtx get_related_value		PROTO((rtx));
97150397Sobrienextern int reg_mentioned_p		PROTO((rtx, rtx));
97250397Sobrienextern int reg_referenced_p		PROTO((rtx, rtx));
97350397Sobrienextern int reg_used_between_p		PROTO((rtx, rtx, rtx));
97450397Sobrienextern int reg_referenced_between_p	PROTO((rtx, rtx, rtx));
97550397Sobrienextern int reg_set_between_p		PROTO((rtx, rtx, rtx));
97650397Sobrienextern int modified_between_p		PROTO((rtx, rtx, rtx));
97750397Sobrienextern int no_labels_between_p		PROTO((rtx, rtx));
97850397Sobrienextern int modified_in_p		PROTO((rtx, rtx));
97950397Sobrienextern int reg_set_p			PROTO((rtx, rtx));
98050397Sobrienextern rtx single_set			PROTO((rtx));
98150397Sobrienextern rtx find_last_value		PROTO((rtx, rtx *, rtx));
98250397Sobrienextern int refers_to_regno_p		PROTO((int, int, rtx, rtx *));
98350397Sobrienextern int reg_overlap_mentioned_p	PROTO((rtx, rtx));
98450397Sobrienextern rtx find_use_as_address		PROTO((rtx, rtx, HOST_WIDE_INT));
98550397Sobrienextern void note_stores			PROTO((rtx, void (*)()));
98650397Sobrienextern rtx reg_set_last			PROTO((rtx, rtx));
98750397Sobrienextern int rtx_equal_p			PROTO((rtx, rtx));
98850397Sobrienextern int dead_or_set_p		PROTO((rtx, rtx));
98950397Sobrienextern int dead_or_set_regno_p		PROTO((rtx, int));
99050397Sobrienextern rtx find_reg_note		PROTO((rtx, enum reg_note, rtx));
99150397Sobrienextern rtx find_regno_note		PROTO((rtx, enum reg_note, int));
99250397Sobrienextern int find_reg_fusage		PROTO((rtx, enum rtx_code, rtx));
99350397Sobrienextern int find_regno_fusage		PROTO((rtx, enum rtx_code, int));
99450397Sobrienextern void remove_note			PROTO((rtx, rtx));
99550397Sobrienextern int side_effects_p		PROTO((rtx));
99650397Sobrienextern int volatile_refs_p		PROTO((rtx));
99750397Sobrienextern int volatile_insn_p		PROTO((rtx));
99850397Sobrienextern int may_trap_p			PROTO((rtx));
99950397Sobrienextern int inequality_comparison_p	PROTO((rtx));
100050397Sobrienextern rtx replace_rtx			PROTO((rtx, rtx, rtx));
100150397Sobrienextern rtx replace_regs			PROTO((rtx, rtx *, int, int));
100250397Sobrienextern int computed_jump_p		PROTO((rtx));
100350397Sobrien
100418334Speter/* Maximum number of parallel sets and clobbers in any insn in this fn.
100518334Speter   Always at least 3, since the combiner could put that many togetherm
100618334Speter   and we want this to remain correct for all the remaining passes.  */
100718334Speter
100818334Speterextern int max_parallel;
100918334Speter
101018334Speterextern int asm_noperands		PROTO((rtx));
101118334Speterextern char *decode_asm_operands	PROTO((rtx, rtx *, rtx **, char **, enum machine_mode *));
101218334Speter
101318334Speterextern enum reg_class reg_preferred_class PROTO((int));
101418334Speterextern enum reg_class reg_alternate_class PROTO((int));
101518334Speter
101618334Speterextern rtx get_first_nonparm_insn	PROTO((void));
101718334Speter
101818334Speter/* Standard pieces of rtx, to be substituted directly into things.  */
101950397Sobrien#define pc_rtx		(&global_rtl.pc_val)
102050397Sobrien#define cc0_rtx		(&global_rtl.cc0_val)
102150397Sobrien
102250397Sobrien#define MAX_SAVED_CONST_INT 64
102350397Sobrienextern struct rtx_def const_int_rtx[MAX_SAVED_CONST_INT * 2 + 1];
102450397Sobrien
102550397Sobrien#define const0_rtx	(&const_int_rtx[MAX_SAVED_CONST_INT])
102650397Sobrien#define const1_rtx	(&const_int_rtx[MAX_SAVED_CONST_INT+1])
102750397Sobrien#define const2_rtx	(&const_int_rtx[MAX_SAVED_CONST_INT+2])
102850397Sobrien#define constm1_rtx	(&const_int_rtx[MAX_SAVED_CONST_INT-1])
102918334Speterextern rtx const_true_rtx;
103018334Speter
103118334Speterextern rtx const_tiny_rtx[3][(int) MAX_MACHINE_MODE];
103218334Speter
103318334Speter/* Returns a constant 0 rtx in mode MODE.  Integer modes are treated the
103418334Speter   same as VOIDmode.  */
103518334Speter
103618334Speter#define CONST0_RTX(MODE) (const_tiny_rtx[0][(int) (MODE)])
103718334Speter
103818334Speter/* Likewise, for the constants 1 and 2.  */
103918334Speter
104018334Speter#define CONST1_RTX(MODE) (const_tiny_rtx[1][(int) (MODE)])
104118334Speter#define CONST2_RTX(MODE) (const_tiny_rtx[2][(int) (MODE)])
104218334Speter
104350397Sobrienextern struct _global_rtl
104450397Sobrien{
104550397Sobrien  struct rtx_def pc_val, cc0_val;
104650397Sobrien  struct rtx_def stack_pointer_val, frame_pointer_val;
104750397Sobrien  struct rtx_def hard_frame_pointer_val;
104850397Sobrien  struct rtx_def arg_pointer_val;
104950397Sobrien  struct rtx_def virtual_incoming_args_val;
105050397Sobrien  struct rtx_def virtual_stack_vars_val;
105150397Sobrien  struct rtx_def virtual_stack_dynamic_val;
105250397Sobrien  struct rtx_def virtual_outgoing_args_val;
105350397Sobrien} global_rtl;
105450397Sobrien
105518334Speter/* All references to certain hard regs, except those created
105618334Speter   by allocating pseudo regs into them (when that's possible),
105718334Speter   go through these unique rtx objects.  */
105850397Sobrien#define stack_pointer_rtx	(&global_rtl.stack_pointer_val)
105950397Sobrien#define frame_pointer_rtx	(&global_rtl.frame_pointer_val)
106050397Sobrien
106118334Speterextern rtx pic_offset_table_rtx;
106218334Speterextern rtx struct_value_rtx;
106318334Speterextern rtx struct_value_incoming_rtx;
106418334Speterextern rtx static_chain_rtx;
106518334Speterextern rtx static_chain_incoming_rtx;
106618334Speter
106750397Sobrien
106850397Sobrien/* Include the RTL generation functions.  */
106950397Sobrien
107050397Sobrien#ifndef NO_GENRTL_H
107150397Sobrien#include "genrtl.h"
107250397Sobrien#endif
107350397Sobrien
107450397Sobrien/* There are some RTL codes that require special attention; the
107550397Sobrien   generation functions included above do the raw handling.  If you
107650397Sobrien   add to this list, modify special_rtx in gengenrtl.c as well.  You
107750397Sobrien   should also modify gen_rtx to use the special function.  */
107850397Sobrien
107950397Sobrienextern rtx gen_rtx_CONST_INT PROTO((enum machine_mode, HOST_WIDE_INT));
108050397Sobrienextern rtx gen_rtx_REG PROTO((enum machine_mode, int));
108150397Sobrienextern rtx gen_rtx_MEM PROTO((enum machine_mode, rtx));
108250397Sobrien
108350397Sobrien/* We need the cast here to ensure that we get the same result both with
108450397Sobrien   and without prototypes.  */
108550397Sobrien#define GEN_INT(N)  gen_rtx_CONST_INT (VOIDmode, (HOST_WIDE_INT) (N))
108650397Sobrien
108750397Sobrien
108818334Speter/* If HARD_FRAME_POINTER_REGNUM is defined, then a special dummy reg
108918334Speter   is used to represent the frame pointer.  This is because the
109018334Speter   hard frame pointer and the automatic variables are separated by an amount
109118334Speter   that cannot be determined until after register allocation.  We can assume
109218334Speter   that in this case ELIMINABLE_REGS will be defined, one action of which
109318334Speter   will be to eliminate FRAME_POINTER_REGNUM into HARD_FRAME_POINTER_REGNUM. */
109418334Speter#ifndef HARD_FRAME_POINTER_REGNUM
109518334Speter#define HARD_FRAME_POINTER_REGNUM FRAME_POINTER_REGNUM
109618334Speter#endif
109718334Speter
109850397Sobrien/* For register elimination to work properly these hard_frame_pointer_rtx,
109950397Sobrien   frame_pointer_rtx, and arg_pointer_rtx must be the same if they refer to
110050397Sobrien   the same register.  */
110150397Sobrien#if HARD_FRAME_POINTER_REGNUM == FRAME_POINTER_REGNUM
110250397Sobrien#define hard_frame_pointer_rtx	(&global_rtl.frame_pointer_val)
110350397Sobrien#else
110450397Sobrien#define hard_frame_pointer_rtx	(&global_rtl.hard_frame_pointer_val)
110550397Sobrien#endif
110650397Sobrien
110750397Sobrien#if FRAME_POINTER_REGNUM == ARG_POINTER_REGNUM
110850397Sobrien#define arg_pointer_rtx		(&global_rtl.frame_pointer_val)
110950397Sobrien#else
111050397Sobrien#if HARD_FRAME_POINTER_REGNUM == ARG_POINTER_REGNUM
111150397Sobrien#define arg_pointer_rtx		(&global_rtl.hard_frame_pointer_val)
111250397Sobrien#else
111350397Sobrien#define arg_pointer_rtx		(&global_rtl.arg_pointer_val)
111450397Sobrien#endif
111550397Sobrien#endif
111650397Sobrien
111718334Speter/* Virtual registers are used during RTL generation to refer to locations into
111818334Speter   the stack frame when the actual location isn't known until RTL generation
111918334Speter   is complete.  The routine instantiate_virtual_regs replaces these with
112018334Speter   the proper value, which is normally {frame,arg,stack}_pointer_rtx plus
112118334Speter   a constant.  */
112218334Speter
112318334Speter#define FIRST_VIRTUAL_REGISTER	(FIRST_PSEUDO_REGISTER)
112418334Speter
112518334Speter/* This points to the first word of the incoming arguments passed on the stack,
112618334Speter   either by the caller or by the callee when pretending it was passed by the
112718334Speter   caller.  */
112818334Speter
112950397Sobrien#define virtual_incoming_args_rtx (&global_rtl.virtual_incoming_args_val)
113018334Speter
113118334Speter#define VIRTUAL_INCOMING_ARGS_REGNUM	(FIRST_VIRTUAL_REGISTER)
113218334Speter
113318334Speter/* If FRAME_GROWS_DOWNWARD, this points to immediately above the first
113418334Speter   variable on the stack.  Otherwise, it points to the first variable on
113518334Speter   the stack.  */
113618334Speter
113750397Sobrien#define virtual_stack_vars_rtx	(&global_rtl.virtual_stack_vars_val)
113818334Speter
113918334Speter#define VIRTUAL_STACK_VARS_REGNUM	((FIRST_VIRTUAL_REGISTER) + 1)
114018334Speter
114118334Speter/* This points to the location of dynamically-allocated memory on the stack
114218334Speter   immediately after the stack pointer has been adjusted by the amount
114318334Speter   desired.  */
114418334Speter
114550397Sobrien#define virtual_stack_dynamic_rtx	(&global_rtl.virtual_stack_dynamic_val)
114618334Speter
114718334Speter#define VIRTUAL_STACK_DYNAMIC_REGNUM	((FIRST_VIRTUAL_REGISTER) + 2)
114818334Speter
114918334Speter/* This points to the location in the stack at which outgoing arguments should
115018334Speter   be written when the stack is pre-pushed (arguments pushed using push
115118334Speter   insns always use sp).  */
115218334Speter
115350397Sobrien#define virtual_outgoing_args_rtx	(&global_rtl.virtual_outgoing_args_val)
115418334Speter
115518334Speter#define VIRTUAL_OUTGOING_ARGS_REGNUM	((FIRST_VIRTUAL_REGISTER) + 3)
115618334Speter
115718334Speter#define LAST_VIRTUAL_REGISTER	((FIRST_VIRTUAL_REGISTER) + 3)
115818334Speter
115918334Speterextern rtx find_next_ref		PROTO((rtx, rtx));
116018334Speterextern rtx *find_single_use		PROTO((rtx, rtx, rtx *));
116118334Speter
116218334Speterextern rtx output_constant_def		PROTO((union tree_node *));
116318334Speterextern rtx immed_real_const		PROTO((union tree_node *));
116418334Speterextern union tree_node *make_tree	PROTO((union tree_node *, rtx));
116518334Speter
116618334Speter/* Abort routines */
116718334Speterextern void fatal_insn_not_found	PROTO((rtx));
116818334Speterextern void fatal_insn			PROTO((char *, rtx));
116918334Speter
117018334Speter/* Define a default value for STORE_FLAG_VALUE.  */
117118334Speter
117218334Speter#ifndef STORE_FLAG_VALUE
117318334Speter#define STORE_FLAG_VALUE 1
117418334Speter#endif
117518334Speter
117618334Speter/* Nonzero after end of reload pass.
117718334Speter   Set to 1 or 0 by toplev.c.  */
117818334Speter
117918334Speterextern int reload_completed;
118018334Speter
118118334Speter/* Set to 1 while reload_as_needed is operating.
118218334Speter   Required by some machines to handle any generated moves differently.  */
118318334Speter
118418334Speterextern int reload_in_progress;
118518334Speter
118618334Speter/* If this is nonzero, we do not bother generating VOLATILE
118718334Speter   around volatile memory references, and we are willing to
118818334Speter   output indirect addresses.  If cse is to follow, we reject
118918334Speter   indirect addresses so a useful potential cse is generated;
119018334Speter   if it is used only once, instruction combination will produce
119118334Speter   the same indirect address eventually.  */
119218334Speterextern int cse_not_expected;
119318334Speter
119418334Speter/* Indexed by pseudo register number, gives the rtx for that pseudo.
119518334Speter   Allocated in parallel with regno_pointer_flag.  */
119618334Speterextern rtx *regno_reg_rtx;
119718334Speter
119850397Sobrien/* Vector indexed by regno; contain the alignment in bytes and type
119950397Sobrien   pointed to for a register that contains a pointer, if known.  */
120050397Sobrienextern char *regno_pointer_align;
120150397Sobrien#define REGNO_POINTER_ALIGN(REGNO) regno_pointer_align[REGNO]
120250397Sobrien
120318334Speter/* Translates rtx code to tree code, for those codes needed by
120418334Speter   REAL_ARITHMETIC.  The function returns an int because the caller may not
120518334Speter   know what `enum tree_code' means.  */
120618334Speter
120718334Speterextern int rtx_to_tree_code	PROTO((enum rtx_code));
120850397Sobrien
120950397Sobrien/* In rtlanal.c */
121050397Sobrienextern int reg_set_p			PROTO ((rtx, rtx));
121150397Sobrienextern int reg_mentioned_p		PROTO ((rtx, rtx));
121250397Sobrienextern int reg_referenced_p		PROTO ((rtx, rtx));
121350397Sobrienextern int reg_used_between_p		PROTO ((rtx, rtx, rtx));
121450397Sobrienextern int reg_set_p			PROTO ((rtx, rtx));
121550397Sobrienextern int reg_referenced_between_p	PROTO ((rtx, rtx, rtx));
121650397Sobrienextern int reg_set_between_p		PROTO ((rtx, rtx, rtx));
121750397Sobrienextern int rtx_unstable_p		PROTO ((rtx));
121850397Sobrienextern int rtx_addr_varies_p		PROTO ((rtx));
121950397Sobrienextern int rtx_equal_p			PROTO ((rtx, rtx));
122050397Sobrienextern int inequality_comparisons_p	PROTO ((rtx));
122150397Sobrienextern int dead_or_set_p		PROTO ((rtx, rtx));
122250397Sobrienextern int dead_or_set_regno_p		PROTO ((rtx, int));
122350397Sobrienextern int no_labels_between_p		PROTO ((rtx, rtx));
122450397Sobrienextern int modified_between_p		PROTO ((rtx, rtx, rtx));
122550397Sobrienextern int modified_in_p		PROTO ((rtx, rtx));
122650397Sobrien
122750397Sobrien/* In tree.c */
122850397Sobrienextern void obfree			PROTO ((char *));
122950397Sobrienstruct obstack;
123050397Sobrienextern void gcc_obstack_init		PROTO ((struct obstack *));
123150397Sobrienextern void pop_obstacks		PROTO ((void));
123250397Sobrienextern void push_obstacks		PROTO ((struct obstack *,
123350397Sobrien						struct obstack *));
123450397Sobrien#ifdef BUFSIZ
123550397Sobrienextern int read_skip_spaces		PROTO ((FILE *));
123650397Sobrien#endif
123750397Sobrien
123850397Sobrien/* In cse.c */
123950397Sobrienstruct cse_basic_block_data;
124050397Sobrienextern int rtx_cost			PROTO ((rtx, enum rtx_code));
124150397Sobrienextern void delete_trivially_dead_insns	PROTO ((rtx, int));
124250397Sobrien#ifdef BUFSIZ
124350397Sobrienextern int cse_main			PROTO ((rtx, int, int, FILE *));
124450397Sobrien#endif
124550397Sobrienextern void cse_end_of_basic_block	PROTO ((rtx,
124650397Sobrien						struct cse_basic_block_data *,
124750397Sobrien						int, int, int));
124850397Sobrien
124950397Sobrien/* In jump.c */
125050397Sobrienextern int comparison_dominates_p	PROTO ((enum rtx_code, enum rtx_code));
125150397Sobrienextern int condjump_p			PROTO ((rtx));
125250397Sobrienextern int simplejump_p			PROTO ((rtx));
125350397Sobrienextern int sets_cc0_p			PROTO ((rtx));
125450397Sobrienextern int invert_jump			PROTO ((rtx, rtx));
125550397Sobrienextern int rtx_renumbered_equal_p	PROTO ((rtx, rtx));
125650397Sobrienextern int true_regnum			PROTO ((rtx));
125750397Sobrienextern int redirect_jump		PROTO ((rtx, rtx));
125850397Sobrienextern void jump_optimize		PROTO ((rtx, int, int, int));
125950397Sobrienextern void thread_jumps		PROTO ((rtx, int, int));
126050397Sobrienextern int redirect_exp			PROTO ((rtx *, rtx, rtx, rtx));
126150397Sobrienextern int rtx_equal_for_thread_p	PROTO ((rtx, rtx, rtx));
126250397Sobrienextern int invert_exp			PROTO ((rtx, rtx));
126350397Sobrienextern int can_reverse_comparison_p	PROTO ((rtx, rtx));
126450397Sobrienextern void delete_for_peephole		PROTO ((rtx, rtx));
126550397Sobrienextern int condjump_in_parallel_p	PROTO ((rtx));
126650397Sobrien
126750397Sobrien/* Flags for jump_optimize() */
126850397Sobrien#define JUMP_CROSS_JUMP		1
126950397Sobrien#define JUMP_NOOP_MOVES		1
127050397Sobrien#define JUMP_AFTER_REGSCAN	1
127150397Sobrien
127250397Sobrien/* In emit-rtl.c. */
127350397Sobrienextern int max_reg_num				PROTO ((void));
127450397Sobrienextern int max_label_num			PROTO ((void));
127550397Sobrienextern int get_first_label_num			PROTO ((void));
127650397Sobrienextern void delete_insns_since			PROTO ((rtx));
127750397Sobrienextern void mark_reg_pointer			PROTO ((rtx, int));
127850397Sobrienextern void mark_user_reg			PROTO ((rtx));
127950397Sobrienextern void reset_used_flags			PROTO ((rtx));
128050397Sobrienextern void reorder_insns			PROTO ((rtx, rtx, rtx));
128150397Sobrienextern int get_max_uid				PROTO ((void));
128250397Sobrienextern int in_sequence_p			PROTO ((void));
128350397Sobrienextern void force_next_line_note		PROTO ((void));
128450397Sobrienextern void init_emit				PROTO ((void));
128550397Sobrienextern void init_emit_once			PROTO ((int));
128650397Sobrienextern void push_topmost_sequence		PROTO ((void));
128750397Sobrienextern void pop_topmost_sequence		PROTO ((void));
128850397Sobrienextern int subreg_realpart_p			PROTO ((rtx));
128950397Sobrienextern void reverse_comparison			PROTO ((rtx));
129050397Sobrienextern void set_new_first_and_last_insn		PROTO ((rtx, rtx));
129150397Sobrienextern void set_new_first_and_last_label_num	PROTO ((int, int));
129250397Sobrienextern void unshare_all_rtl			PROTO ((rtx));
129350397Sobrienextern void set_last_insn			PROTO ((rtx));
129450397Sobrienextern void link_cc0_insns			PROTO ((rtx));
129550397Sobrienextern void add_insn				PROTO ((rtx));
129650397Sobrienextern void add_insn_before			PROTO ((rtx, rtx));
129750397Sobrienextern void add_insn_after			PROTO ((rtx, rtx));
129850397Sobrienextern void reorder_insns_with_line_notes	PROTO ((rtx, rtx, rtx));
129950397Sobrienextern void emit_insn_after_with_line_notes	PROTO ((rtx, rtx, rtx));
130050397Sobrienextern enum rtx_code classify_insn		PROTO ((rtx));
130150397Sobrienextern rtx emit					PROTO ((rtx));
130250397Sobrien/* Query and clear/ restore no_line_numbers.  This is used by the
130350397Sobrien   switch / case handling in stmt.c to give proper line numbers in
130450397Sobrien   warnings about unreachable code.  */
130550397Sobrienint force_line_numbers PROTO((void));
130650397Sobrienvoid restore_line_number_status PROTO((int old_value));
130750397Sobrien
130850397Sobrien/* In insn-emit.c */
130950397Sobrienextern void add_clobbers		PROTO ((rtx, int));
131050397Sobrien
131150397Sobrien/* In combine.c */
131250397Sobrienextern void combine_instructions	PROTO ((rtx, int));
131350397Sobrienextern int extended_count		PROTO ((rtx, enum machine_mode, int));
131450397Sobrienextern rtx remove_death			PROTO ((int, rtx));
131550397Sobrien#ifdef BUFSIZ
131650397Sobrienextern void dump_combine_stats		PROTO ((FILE *));
131750397Sobrienextern void dump_combine_total_stats	PROTO ((FILE *));
131850397Sobrien#endif
131950397Sobrien
132050397Sobrien/* In sched.c. */
132150397Sobrien#ifdef BUFSIZ
132250397Sobrienextern void schedule_insns		PROTO ((FILE *));
132350397Sobrien#endif
132450397Sobrien#ifdef HAIFA
132550397Sobrienextern void fix_sched_param		PROTO ((char *, char *));
132650397Sobrien#endif
132750397Sobrien
132850397Sobrien/* In print-rtl.c */
132950397Sobrienextern void debug_rtx			PROTO ((rtx));
133050397Sobrienextern void debug_rtx_list		PROTO ((rtx, int));
133150397Sobrienextern rtx debug_rtx_find		PROTO ((rtx, int));
133250397Sobrien#ifdef BUFSIZ
133350397Sobrienextern void print_rtl			PROTO ((FILE *, rtx));
133450397Sobrienextern void print_rtl_single		PROTO ((FILE *, rtx));
133550397Sobrienextern void print_inline_rtx		PROTO ((FILE *, rtx, int));
133650397Sobrien#endif
133750397Sobrien
133850397Sobrien/* In loop.c */
133950397Sobrienextern void init_loop			PROTO ((void));
134050397Sobrien#ifdef BUFSIZ
134150397Sobrienextern void loop_optimize		PROTO ((rtx, FILE *, int));
134250397Sobrien#endif
134350397Sobrienextern void record_excess_regs		PROTO ((rtx, rtx, rtx *));
134450397Sobrien
134550397Sobrien/* In function.c */
134650397Sobrienextern void reposition_prologue_and_epilogue_notes	PROTO ((rtx));
134750397Sobrienextern void thread_prologue_and_epilogue_insns		PROTO ((rtx));
134850397Sobrienextern void use_variable				PROTO ((rtx));
134950397Sobrienextern HOST_WIDE_INT get_frame_size			PROTO ((void));
135050397Sobrienextern void preserve_rtl_expr_result			PROTO ((rtx));
135150397Sobrienextern void mark_temp_addr_taken			PROTO ((rtx));
135250397Sobrienextern void update_temp_slot_address			PROTO ((rtx, rtx));
135350397Sobrienextern void use_variable_after				PROTO ((rtx, rtx));
135450397Sobrienextern void purge_addressof				PROTO ((rtx));
135550397Sobrien
135650397Sobrien/* In reload.c */
135750397Sobrienextern int operands_match_p		PROTO ((rtx, rtx));
135850397Sobrienextern int safe_from_earlyclobber	PROTO ((rtx, rtx));
135950397Sobrienextern int strict_memory_address_p	PROTO ((enum machine_mode, rtx));
136050397Sobrien
136150397Sobrien/* In recog.c */
136250397Sobrienextern int memory_address_p		PROTO ((enum machine_mode, rtx));
136350397Sobrienextern int constrain_operands		PROTO ((int, int));
136450397Sobrienextern int mode_dependent_address_p	PROTO ((rtx));
136550397Sobrienextern void init_recog_no_volatile	PROTO ((void));
136650397Sobrienextern int offsettable_memref_p		PROTO ((rtx));
136750397Sobrienextern int offsettable_nonstrict_memref_p PROTO ((rtx));
136850397Sobrienextern int reg_fits_class_p		PROTO ((rtx, register enum reg_class,
136950397Sobrien						int, enum machine_mode));
137050397Sobrienextern int check_asm_operands		PROTO ((rtx));
137150397Sobrienextern int address_operand		PROTO ((rtx, enum machine_mode));
137250397Sobrienextern int const_int_operand		PROTO ((rtx, enum machine_mode));
137350397Sobrienextern int const_double_operand		PROTO ((rtx, enum machine_mode));
137450397Sobrienextern int general_operand		PROTO ((rtx, enum machine_mode));
137550397Sobrienextern int immediate_operand		PROTO ((rtx, enum machine_mode));
137650397Sobrienextern int nonimmediate_operand		PROTO ((rtx, enum machine_mode));
137750397Sobrienextern int memory_operand		PROTO ((rtx, enum machine_mode));
137850397Sobrienextern int nonmemory_operand		PROTO ((rtx, enum machine_mode));
137950397Sobrienextern int push_operand			PROTO ((rtx, enum machine_mode));
138050397Sobrienextern int register_operand		PROTO ((rtx, enum machine_mode));
138150397Sobrienextern int scratch_operand		PROTO ((rtx, enum machine_mode));
138250397Sobrienextern int indirect_operand		PROTO ((rtx, enum machine_mode));
138350397Sobrienextern int mode_independent_operand	PROTO ((rtx, enum machine_mode));
138450397Sobrienextern int comparison_operator		PROTO ((rtx, enum machine_mode));
138550397Sobrienextern void init_recog_no_volatile	PROTO ((void));
138650397Sobrienextern void init_recog			PROTO ((void));
138750397Sobrienextern int validate_replace_rtx		PROTO ((rtx, rtx, rtx));
138850397Sobrienextern int offsettable_address_p	PROTO ((int, enum machine_mode, rtx));
138950397Sobrienextern int next_insn_tests_no_inequality PROTO ((rtx));
139050397Sobrienextern int recog_memoized		PROTO ((rtx));
139150397Sobrienextern int validate_change		PROTO ((rtx, rtx *, rtx, int));
139250397Sobrienextern int apply_change_group		PROTO ((void));
139350397Sobrienextern void cancel_changes		PROTO ((int));
139450397Sobrienextern int num_validated_changes	PROTO ((void));
139550397Sobrien
139650397Sobrien/* In insn-recog.c */
139750397Sobrienextern int recog			PROTO ((rtx, rtx, int *));
139850397Sobrien
139950397Sobrien/* In stmt.c */
140050397Sobrienextern void expand_null_return		PROTO((void));
140150397Sobrienextern void emit_jump			PROTO ((rtx));
140250397Sobrienextern int preserve_subexpressions_p	PROTO ((void));
140350397Sobrien
140450397Sobrien/* In expr.c */
140550397Sobrienextern void init_expr_once		PROTO ((void));
140650397Sobrien
140750397Sobrien/* In stupid.c */
140850397Sobrien#ifdef BUFSIZ
140950397Sobrienextern void stupid_life_analysis	PROTO ((rtx, int, FILE *));
141050397Sobrien#endif
141150397Sobrien
141250397Sobrien/* In flow.c */
141350397Sobrienextern void allocate_for_life_analysis	PROTO ((void));
141450397Sobrienextern void recompute_reg_usage		PROTO ((rtx));
141550397Sobrien#ifdef BUFSIZ
141650397Sobrienextern void dump_flow_info		PROTO ((FILE *));
141750397Sobrien#endif
141850397Sobrien
141950397Sobrien/* In expmed.c */
142050397Sobrienextern void init_expmed			PROTO ((void));
142150397Sobrienextern void expand_inc			PROTO ((rtx, rtx));
142250397Sobrienextern void expand_dec			PROTO ((rtx, rtx));
142350397Sobrienextern rtx expand_mult_highpart		PROTO ((enum machine_mode, rtx,
142450397Sobrien						unsigned HOST_WIDE_INT, rtx,
142550397Sobrien						int, int));
142650397Sobrien
142750397Sobrien/* In gcse.c */
142850397Sobrien#ifdef BUFSIZ
142950397Sobrienextern void gcse_main			PROTO ((rtx, FILE *));
143050397Sobrien#endif
143150397Sobrien
143250397Sobrien/* In global.c */
143350397Sobrienextern void mark_elimination		PROTO ((int, int));
143450397Sobrien#ifdef BUFSIZ
143550397Sobrienextern int global_alloc			PROTO ((FILE *));
143650397Sobrienextern void dump_global_regs		PROTO ((FILE *));
143750397Sobrien#endif
143850397Sobrien#ifdef HARD_CONST
143950397Sobrienextern void retry_global_alloc		PROTO ((int, HARD_REG_SET));
144050397Sobrien#endif
144150397Sobrien
144250397Sobrien/* In regclass.c */
144350397Sobrienextern int reg_classes_intersect_p	PROTO ((enum reg_class, enum reg_class));
144450397Sobrienextern int reg_class_subset_p		PROTO ((enum reg_class, enum reg_class));
144550397Sobrienextern void globalize_reg		PROTO ((int));
144650397Sobrienextern void init_regs			PROTO ((void));
144750397Sobrienextern void init_reg_sets		PROTO ((void));
144850397Sobrienextern void regset_release_memory	PROTO ((void));
144950397Sobrienextern void regclass_init		PROTO ((void));
145050397Sobrienextern void regclass			PROTO ((rtx, int));
145150397Sobrienextern void reg_scan			PROTO ((rtx, int, int));
145250397Sobrienextern void reg_scan_update		PROTO ((rtx, rtx, int));
145350397Sobrienextern void fix_register		PROTO ((char *, int, int));
145450397Sobrien
145550397Sobrien/* In regmove.c */
145650397Sobrien#ifdef BUFSIZ
145750397Sobrienextern void regmove_optimize		PROTO ((rtx, int, FILE *));
145850397Sobrien#endif
145950397Sobrien
146050397Sobrien/* In reorg.c */
146150397Sobrien#ifdef BUFSIZ
146250397Sobrienextern void dbr_schedule		PROTO ((rtx, FILE *));
146350397Sobrien#endif
146450397Sobrien
146550397Sobrien/* In optabs.c */
146650397Sobrienextern void init_optabs			PROTO ((void));
146750397Sobrien
146850397Sobrien/* In local-alloc.c */
146950397Sobrien#ifdef BUFSIZ
147050397Sobrienextern void dump_local_alloc		PROTO ((FILE *));
147150397Sobrien#endif
147250397Sobrienextern void local_alloc			PROTO ((void));
147350397Sobrien
147450397Sobrien/* In reload1.c */
147550397Sobrienextern void reload_cse_regs		PROTO ((rtx));
147650397Sobrienextern void init_reload			PROTO ((void));
147750397Sobrienextern void mark_home_live		PROTO ((int));
147850397Sobrien#ifdef BUFSIZ
147950397Sobrienextern int reload			PROTO ((rtx, int, FILE *));
148050397Sobrien#endif
148150397Sobrien
148250397Sobrien/* In caller-save.c */
148350397Sobrienextern void init_caller_save		PROTO ((void));
148450397Sobrien
148550397Sobrien/* In profile.c */
148650397Sobrienextern void init_branch_prob		PROTO ((char *));
148750397Sobrien#ifdef BUFSIZ
148850397Sobrienextern void branch_prob			PROTO ((rtx, FILE *));
148950397Sobrienextern void end_branch_prob		PROTO ((FILE *));
149050397Sobrien#endif
149150397Sobrienextern void output_func_start_profiler	PROTO ((void));
149250397Sobrien
149350397Sobrien/* In reg-stack.c */
149450397Sobrien#ifdef BUFSIZ
149550397Sobrienextern void reg_to_stack		PROTO ((rtx, FILE *));
149650397Sobrien#endif
149750397Sobrienextern int stack_regs_mentioned_p	PROTO ((rtx));
149850397Sobrien
149950397Sobrien/* In fold-const.c */
150050397Sobrienextern int add_double		PROTO ((HOST_WIDE_INT, HOST_WIDE_INT,
150150397Sobrien					HOST_WIDE_INT, HOST_WIDE_INT,
150250397Sobrien					HOST_WIDE_INT *, HOST_WIDE_INT *));
150350397Sobrienextern int neg_double		PROTO ((HOST_WIDE_INT, HOST_WIDE_INT,
150450397Sobrien					HOST_WIDE_INT *, HOST_WIDE_INT *));
150550397Sobrienextern int mul_double		PROTO ((HOST_WIDE_INT, HOST_WIDE_INT,
150650397Sobrien					HOST_WIDE_INT, HOST_WIDE_INT,
150750397Sobrien					HOST_WIDE_INT *, HOST_WIDE_INT *));
150850397Sobrienextern void lshift_double	PROTO ((HOST_WIDE_INT, HOST_WIDE_INT,
150950397Sobrien					HOST_WIDE_INT, int, HOST_WIDE_INT *,
151050397Sobrien					HOST_WIDE_INT *, int));
151150397Sobrienextern void rshift_double	PROTO ((HOST_WIDE_INT, HOST_WIDE_INT,
151250397Sobrien					HOST_WIDE_INT, int,
151350397Sobrien					HOST_WIDE_INT *, HOST_WIDE_INT *, int));
151450397Sobrienextern void lrotate_double	PROTO ((HOST_WIDE_INT, HOST_WIDE_INT,
151550397Sobrien					HOST_WIDE_INT, int, HOST_WIDE_INT *,
151650397Sobrien					HOST_WIDE_INT *));
151750397Sobrienextern void rrotate_double	PROTO ((HOST_WIDE_INT, HOST_WIDE_INT,
151850397Sobrien					HOST_WIDE_INT, int, HOST_WIDE_INT *,
151950397Sobrien					HOST_WIDE_INT *));
152050397Sobrien
152150397Sobrien/* In calls.c */
152250397Sobrien/* Emit library call.  */
152350397Sobrienextern void emit_library_call		PVPROTO ((rtx, int, enum machine_mode,
152450397Sobrien						  int, ...));
152550397Sobrienextern rtx emit_library_call_value	PVPROTO((rtx, rtx, int,
152650397Sobrien						 enum machine_mode,
152750397Sobrien						 int, ...));
152850397Sobrien
152950397Sobrien/* In unroll.c */
153050397Sobrienextern int set_dominates_use		PROTO ((int, int, int, rtx, rtx));
153150397Sobrien
153250397Sobrien/* In varasm.c */
153350397Sobrienextern void bss_section			PROTO ((void));
153450397Sobrienextern int in_data_section		PROTO ((void));
153550397Sobrienextern int supports_one_only		PROTO ((void));
153650397Sobrien
153750397Sobrien/* In rtl.c */
153850397Sobrienextern void init_rtl			PROTO ((void));
153950397Sobrienextern void rtx_free			PROTO ((rtx));
154050397Sobrien
154150397Sobrien/* In alias.c */
154250397Sobrienextern int true_dependence		PROTO ((rtx, enum machine_mode, rtx,
154350397Sobrien						int (*)(rtx)));
154450397Sobrienextern int read_dependence		PROTO ((rtx, rtx));
154550397Sobrienextern int anti_dependence		PROTO ((rtx, rtx));
154650397Sobrienextern int output_dependence		PROTO ((rtx, rtx));
154750397Sobrienextern void init_alias_once		PROTO ((void));
154850397Sobrienextern void init_alias_analysis		PROTO ((void));
154950397Sobrienextern void end_alias_analysis		PROTO ((void));
155050397Sobrien
155150397Sobrienextern void record_base_value		PROTO ((int, rtx, int));
155250397Sobrien
155350397Sobrien#endif /* _RTL_H */
1554