#ifndef GCC_RTL_H
#define GCC_RTL_H
struct function;
#include "machmode.h"
#undef FFS
#undef FLOAT
#undef ABS
#undef PC
#define NOOP_MOVE_INSN_CODE INT_MAX
#define RTX_CODE enum rtx_code
enum rtx_code {
#define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) ENUM ,
#include "rtl.def"
#undef DEF_RTL_EXPR
LAST_AND_UNUSED_RTX_CODE};
#define NUM_RTX_CODE ((int) LAST_AND_UNUSED_RTX_CODE)
extern const unsigned char rtx_length[NUM_RTX_CODE];
#define GET_RTX_LENGTH(CODE) (rtx_length[(int) (CODE)])
extern const char * const rtx_name[NUM_RTX_CODE];
#define GET_RTX_NAME(CODE) (rtx_name[(int) (CODE)])
extern const char * const rtx_format[NUM_RTX_CODE];
#define GET_RTX_FORMAT(CODE) (rtx_format[(int) (CODE)])
extern const char rtx_class[NUM_RTX_CODE];
#define GET_RTX_CLASS(CODE) (rtx_class[(int) (CODE)])
typedef struct
{
unsigned min_align: 8;
unsigned base_after_vec: 1;
unsigned min_after_vec: 1;
unsigned max_after_vec: 1;
unsigned min_after_base: 1;
unsigned max_after_base: 1;
unsigned offset_unsigned: 1;
unsigned : 2;
unsigned scale : 8;
} addr_diff_vec_flags;
typedef struct
{
HOST_WIDE_INT alias;
tree expr;
rtx offset;
rtx size;
unsigned int align;
} mem_attrs;
typedef union rtunion_def
{
HOST_WIDE_INT rtwint;
int rtint;
unsigned int rtuint;
const char *rtstr;
rtx rtx;
rtvec rtvec;
enum machine_mode rttype;
addr_diff_vec_flags rt_addr_diff_vec_flags;
struct cselib_val_struct *rt_cselib;
struct bitmap_head_def *rtbit;
tree rttree;
struct basic_block_def *bb;
mem_attrs *rtmem;
} rtunion;
struct rtx_def
{
ENUM_BITFIELD(rtx_code) code: 16;
ENUM_BITFIELD(machine_mode) mode : 8;
unsigned int jump : 1;
unsigned int call : 1;
unsigned int unchanging : 1;
unsigned int volatil : 1;
unsigned int in_struct : 1;
unsigned int used : 1;
unsigned integrated : 1;
unsigned frame_related : 1;
rtunion fld[1];
};
#define NULL_RTX (rtx) 0
#define GET_CODE(RTX) ((enum rtx_code) (RTX)->code)
#define PUT_CODE(RTX, CODE) ((RTX)->code = (ENUM_BITFIELD(rtx_code)) (CODE))
#define GET_MODE(RTX) ((enum machine_mode) (RTX)->mode)
#define PUT_MODE(RTX, MODE) ((RTX)->mode = (ENUM_BITFIELD(machine_mode)) (MODE))
#define RTX_INTEGRATED_P(RTX) ((RTX)->integrated)
#define RTX_UNCHANGING_P(RTX) ((RTX)->unchanging)
#define RTX_FRAME_RELATED_P(RTX) ((RTX)->frame_related)
struct rtvec_def {
int num_elem;
rtx elem[1];
};
#define NULL_RTVEC (rtvec) 0
#define GET_NUM_ELEM(RTVEC) ((RTVEC)->num_elem)
#define PUT_NUM_ELEM(RTVEC, NUM) ((RTVEC)->num_elem = (NUM))
#define REG_P(X) (GET_CODE (X) == REG)
#define LABEL_P(X) (GET_CODE (X) == CODE_LABEL)
#define JUMP_P(X) (GET_CODE (X) == JUMP_INSN)
#define NOTE_P(X) (GET_CODE (X) == NOTE)
#define BARRIER_P(X) (GET_CODE (X) == BARRIER)
#define JUMP_TABLE_DATA_P(INSN) \
(JUMP_P (INSN) && (GET_CODE (PATTERN (INSN)) == ADDR_VEC || \
GET_CODE (PATTERN (INSN)) == ADDR_DIFF_VEC))
#define CONSTANT_P(X) \
(GET_CODE (X) == LABEL_REF || GET_CODE (X) == SYMBOL_REF \
|| GET_CODE (X) == CONST_INT || GET_CODE (X) == CONST_DOUBLE \
|| GET_CODE (X) == CONST || GET_CODE (X) == HIGH \
|| GET_CODE (X) == CONST_VECTOR \
|| GET_CODE (X) == CONSTANT_P_RTX)
#if defined ENABLE_RTL_CHECKING && (GCC_VERSION >= 2007)
#define RTL_CHECK1(RTX, N, C1) __extension__ \
(*({ rtx _rtx = (RTX); int _n = (N); \
enum rtx_code _code = GET_CODE (_rtx); \
if (_n < 0 || _n >= GET_RTX_LENGTH (_code)) \
rtl_check_failed_bounds (_rtx, _n, __FILE__, __LINE__, \
__FUNCTION__); \
if (GET_RTX_FORMAT(_code)[_n] != C1) \
rtl_check_failed_type1 (_rtx, _n, C1, __FILE__, __LINE__, \
__FUNCTION__); \
&_rtx->fld[_n]; }))
#define RTL_CHECK2(RTX, N, C1, C2) __extension__ \
(*({ rtx _rtx = (RTX); int _n = (N); \
enum rtx_code _code = GET_CODE (_rtx); \
if (_n < 0 || _n >= GET_RTX_LENGTH (_code)) \
rtl_check_failed_bounds (_rtx, _n, __FILE__, __LINE__, \
__FUNCTION__); \
if (GET_RTX_FORMAT(_code)[_n] != C1 \
&& GET_RTX_FORMAT(_code)[_n] != C2) \
rtl_check_failed_type2 (_rtx, _n, C1, C2, __FILE__, __LINE__, \
__FUNCTION__); \
&_rtx->fld[_n]; }))
#define RTL_CHECKC1(RTX, N, C) __extension__ \
(*({ rtx _rtx = (RTX); int _n = (N); \
if (GET_CODE (_rtx) != (C)) \
rtl_check_failed_code1 (_rtx, (C), __FILE__, __LINE__, \
__FUNCTION__); \
&_rtx->fld[_n]; }))
#define RTL_CHECKC2(RTX, N, C1, C2) __extension__ \
(*({ rtx _rtx = (RTX); int _n = (N); \
enum rtx_code _code = GET_CODE (_rtx); \
if (_code != (C1) && _code != (C2)) \
rtl_check_failed_code2 (_rtx, (C1), (C2), __FILE__, __LINE__, \
__FUNCTION__); \
&_rtx->fld[_n]; }))
#define RTVEC_ELT(RTVEC, I) __extension__ \
(*({ rtvec _rtvec = (RTVEC); int _i = (I); \
if (_i < 0 || _i >= GET_NUM_ELEM (_rtvec)) \
rtvec_check_failed_bounds (_rtvec, _i, __FILE__, __LINE__, \
__FUNCTION__); \
&_rtvec->elem[_i]; }))
extern void rtl_check_failed_bounds PARAMS ((rtx, int,
const char *, int, const char *))
ATTRIBUTE_NORETURN;
extern void rtl_check_failed_type1 PARAMS ((rtx, int, int,
const char *, int, const char *))
ATTRIBUTE_NORETURN;
extern void rtl_check_failed_type2 PARAMS ((rtx, int, int, int,
const char *, int, const char *))
ATTRIBUTE_NORETURN;
extern void rtl_check_failed_code1 PARAMS ((rtx, enum rtx_code,
const char *, int, const char *))
ATTRIBUTE_NORETURN;
extern void rtl_check_failed_code2 PARAMS ((rtx, enum rtx_code, enum rtx_code,
const char *, int, const char *))
ATTRIBUTE_NORETURN;
extern void rtvec_check_failed_bounds PARAMS ((rtvec, int,
const char *, int, const char *))
ATTRIBUTE_NORETURN;
#else
#define RTL_CHECK1(RTX, N, C1) ((RTX)->fld[N])
#define RTL_CHECK2(RTX, N, C1, C2) ((RTX)->fld[N])
#define RTL_CHECKC1(RTX, N, C) ((RTX)->fld[N])
#define RTL_CHECKC2(RTX, N, C1, C2) ((RTX)->fld[N])
#define RTVEC_ELT(RTVEC, I) ((RTVEC)->elem[I])
#endif
#define XWINT(RTX, N) (RTL_CHECK1 (RTX, N, 'w').rtwint)
#define XINT(RTX, N) (RTL_CHECK2 (RTX, N, 'i', 'n').rtint)
#define XSTR(RTX, N) (RTL_CHECK2 (RTX, N, 's', 'S').rtstr)
#define XEXP(RTX, N) (RTL_CHECK2 (RTX, N, 'e', 'u').rtx)
#define XVEC(RTX, N) (RTL_CHECK2 (RTX, N, 'E', 'V').rtvec)
#define XMODE(RTX, N) (RTL_CHECK1 (RTX, N, 'M').rttype)
#define XBITMAP(RTX, N) (RTL_CHECK1 (RTX, N, 'b').rtbit)
#define XTREE(RTX, N) (RTL_CHECK1 (RTX, N, 't').rttree)
#define XBBDEF(RTX, N) (RTL_CHECK1 (RTX, N, 'B').bb)
#define XTMPL(RTX, N) (RTL_CHECK1 (RTX, N, 'T').rtstr)
#define XVECEXP(RTX, N, M) RTVEC_ELT (XVEC (RTX, N), M)
#define XVECLEN(RTX, N) GET_NUM_ELEM (XVEC (RTX, N))
#define X0WINT(RTX, N) (RTL_CHECK1 (RTX, N, '0').rtwint)
#define X0INT(RTX, N) (RTL_CHECK1 (RTX, N, '0').rtint)
#define X0UINT(RTX, N) (RTL_CHECK1 (RTX, N, '0').rtuint)
#define X0STR(RTX, N) (RTL_CHECK1 (RTX, N, '0').rtstr)
#define X0EXP(RTX, N) (RTL_CHECK1 (RTX, N, '0').rtx)
#define X0VEC(RTX, N) (RTL_CHECK1 (RTX, N, '0').rtvec)
#define X0MODE(RTX, N) (RTL_CHECK1 (RTX, N, '0').rttype)
#define X0BITMAP(RTX, N) (RTL_CHECK1 (RTX, N, '0').rtbit)
#define X0TREE(RTX, N) (RTL_CHECK1 (RTX, N, '0').rttree)
#define X0BBDEF(RTX, N) (RTL_CHECK1 (RTX, N, '0').bb)
#define X0ADVFLAGS(RTX, N) (RTL_CHECK1 (RTX, N, '0').rt_addr_diff_vec_flags)
#define X0CSELIB(RTX, N) (RTL_CHECK1 (RTX, N, '0').rt_cselib)
#define X0MEMATTR(RTX, N) (RTL_CHECK1 (RTX, N, '0').rtmem)
#define XCWINT(RTX, N, C) (RTL_CHECKC1 (RTX, N, C).rtwint)
#define XCINT(RTX, N, C) (RTL_CHECKC1 (RTX, N, C).rtint)
#define XCUINT(RTX, N, C) (RTL_CHECKC1 (RTX, N, C).rtuint)
#define XCSTR(RTX, N, C) (RTL_CHECKC1 (RTX, N, C).rtstr)
#define XCEXP(RTX, N, C) (RTL_CHECKC1 (RTX, N, C).rtx)
#define XCVEC(RTX, N, C) (RTL_CHECKC1 (RTX, N, C).rtvec)
#define XCMODE(RTX, N, C) (RTL_CHECKC1 (RTX, N, C).rttype)
#define XCBITMAP(RTX, N, C) (RTL_CHECKC1 (RTX, N, C).rtbit)
#define XCTREE(RTX, N, C) (RTL_CHECKC1 (RTX, N, C).rttree)
#define XCBBDEF(RTX, N, C) (RTL_CHECKC1 (RTX, N, C).bb)
#define XCADVFLAGS(RTX, N, C) (RTL_CHECKC1 (RTX, N, C).rt_addr_diff_vec_flags)
#define XCCSELIB(RTX, N, C) (RTL_CHECKC1 (RTX, N, C).rt_cselib)
#define XCVECEXP(RTX, N, M, C) RTVEC_ELT (XCVEC (RTX, N, C), M)
#define XCVECLEN(RTX, N, C) GET_NUM_ELEM (XCVEC (RTX, N, C))
#define XC2EXP(RTX, N, C1, C2) (RTL_CHECKC2 (RTX, N, C1, C2).rtx)
#define INSN_P(X) (GET_RTX_CLASS (GET_CODE(X)) == 'i')
#define INSN_UID(INSN) XINT (INSN, 0)
#define PREV_INSN(INSN) XEXP (INSN, 1)
#define NEXT_INSN(INSN) XEXP (INSN, 2)
#define PATTERN(INSN) XEXP (INSN, 3)
#define INSN_CODE(INSN) XINT (INSN, 4)
#define LOG_LINKS(INSN) XEXP(INSN, 5)
#define INSN_DELETED_P(INSN) ((INSN)->volatil)
#define CONST_OR_PURE_CALL_P(INSN) ((INSN)->unchanging)
#define SIBLING_CALL_P(INSN) ((INSN)->jump)
#define INSN_ANNULLED_BRANCH_P(INSN) ((INSN)->unchanging)
#define INSN_DEAD_CODE_P(INSN) ((INSN)->in_struct)
#define INSN_FROM_TARGET_P(INSN) ((INSN)->in_struct)
#define ADDR_DIFF_VEC_FLAGS(RTX) X0ADVFLAGS(RTX, 4)
#define CSELIB_VAL_PTR(RTX) X0CSELIB(RTX, 0)
#define REG_NOTES(INSN) XEXP(INSN, 6)
enum reg_note
{
REG_DEAD = 1,
REG_INC,
REG_EQUIV,
REG_EQUAL,
REG_WAS_0,
REG_RETVAL,
REG_LIBCALL,
REG_NONNEG,
REG_NO_CONFLICT,
REG_UNUSED,
REG_CC_SETTER, REG_CC_USER,
REG_LABEL,
REG_DEP_ANTI, REG_DEP_OUTPUT,
REG_BR_PROB,
REG_EXEC_COUNT,
REG_NOALIAS,
REG_SAVE_AREA,
REG_BR_PRED,
REG_FRAME_RELATED_EXPR,
REG_EH_CONTEXT,
REG_EH_REGION,
REG_SAVE_NOTE,
REG_MAYBE_DEAD,
REG_NORETURN,
REG_NON_LOCAL_GOTO,
REG_SETJMP,
REG_ALWAYS_RETURN,
REG_VTABLE_REF
};
#define REG_BR_PROB_BASE 10000
#define REG_NOTE_KIND(LINK) ((enum reg_note) GET_MODE (LINK))
#define PUT_REG_NOTE_KIND(LINK, KIND) \
PUT_MODE (LINK, (enum machine_mode) (KIND))
extern const char * const reg_note_name[];
#define GET_REG_NOTE_NAME(MODE) (reg_note_name[(int) (MODE)])
#define CALL_INSN_FUNCTION_USAGE(INSN) XEXP(INSN, 7)
#define CODE_LABEL_NUMBER(INSN) XINT (INSN, 5)
#define LINE_NUMBER NOTE
#define NOTE_SOURCE_FILE(INSN) XCSTR (INSN, 3, NOTE)
#define NOTE_BLOCK(INSN) XCTREE (INSN, 3, NOTE)
#define NOTE_EH_HANDLER(INSN) XCINT (INSN, 3, NOTE)
#define NOTE_RANGE_INFO(INSN) XCEXP (INSN, 3, NOTE)
#define NOTE_LIVE_INFO(INSN) XCEXP (INSN, 3, NOTE)
#define NOTE_BASIC_BLOCK(INSN) XCBBDEF (INSN, 3, NOTE)
#define NOTE_EXPECTED_VALUE(INSN) XCEXP (INSN, 3, NOTE)
#define NOTE_LINE_NUMBER(INSN) XCINT (INSN, 4, NOTE)
#define NOTE_INSN_BASIC_BLOCK_P(INSN) \
(GET_CODE (INSN) == NOTE \
&& NOTE_LINE_NUMBER (INSN) == NOTE_INSN_BASIC_BLOCK)
enum insn_note
{
NOTE_INSN_BIAS = -100,
NOTE_INSN_DELETED,
NOTE_INSN_BLOCK_BEG,
NOTE_INSN_BLOCK_END,
NOTE_INSN_LOOP_BEG,
NOTE_INSN_LOOP_END,
NOTE_INSN_LOOP_CONT,
NOTE_INSN_LOOP_VTOP,
NOTE_INSN_LOOP_END_TOP_COND,
NOTE_INSN_FUNCTION_END,
NOTE_INSN_PROLOGUE_END,
NOTE_INSN_EPILOGUE_BEG,
NOTE_INSN_DELETED_LABEL,
NOTE_INSN_FUNCTION_BEG,
NOTE_INSN_EH_REGION_BEG,
NOTE_INSN_EH_REGION_END,
NOTE_INSN_REPEATED_LINE_NUMBER,
NOTE_INSN_RANGE_BEG,
NOTE_INSN_RANGE_END,
NOTE_INSN_LIVE,
NOTE_INSN_BASIC_BLOCK,
NOTE_INSN_EXPECTED_VALUE,
NOTE_INSN_MAX
};
extern const char * const note_insn_name[NOTE_INSN_MAX - NOTE_INSN_BIAS];
#define GET_NOTE_INSN_NAME(NOTE_CODE) \
(note_insn_name[(NOTE_CODE) - (int) NOTE_INSN_BIAS])
#define LABEL_NAME(RTX) XCSTR (RTX, 6, CODE_LABEL)
#define LABEL_NUSES(RTX) XCINT (RTX, 3, CODE_LABEL)
#define LABEL_ALTERNATE_NAME(RTX) XCSTR (RTX, 7, CODE_LABEL)
#define ADDRESSOF_REGNO(RTX) XCUINT (RTX, 1, ADDRESSOF)
#define ADDRESSOF_DECL(RTX) XCTREE (RTX, 2, ADDRESSOF)
#define JUMP_LABEL(INSN) XCEXP (INSN, 7, JUMP_INSN)
#define LABEL_REFS(LABEL) XCEXP (LABEL, 4, CODE_LABEL)
#define LABEL_NEXTREF(REF) XCEXP (REF, 1, LABEL_REF)
#define CONTAINING_INSN(RTX) XCEXP (RTX, 2, LABEL_REF)
#define REGNO(RTX) XCUINT (RTX, 0, REG)
#define ORIGINAL_REGNO(RTX) X0UINT (RTX, 1)
#define REG_FUNCTION_VALUE_P(RTX) ((RTX)->integrated)
#define REG_USERVAR_P(RTX) ((RTX)->volatil)
#define REG_POINTER(RTX) ((RTX)->frame_related)
#define HARD_REGISTER_P(REG) (HARD_REGISTER_NUM_P (REGNO (REG)))
#define HARD_REGISTER_NUM_P(REG_NO) ((REG_NO) < FIRST_PSEUDO_REGISTER)
#define INTVAL(RTX) XCWINT(RTX, 0, CONST_INT)
#define CONST_DOUBLE_LOW(r) XCWINT (r, 1, CONST_DOUBLE)
#define CONST_DOUBLE_HIGH(r) XCWINT (r, 2, CONST_DOUBLE)
#define CONST_DOUBLE_CHAIN(r) XCEXP (r, 0, CONST_DOUBLE)
#define CONST_VECTOR_ELT(RTX, N) XCVECEXP (RTX, 0, N, CONST_VECTOR)
#define CONST_VECTOR_NUNITS(RTX) XCVECLEN (RTX, 0, CONST_VECTOR)
#define CONST_VECTOR_CHAIN(RTX) XCEXP (RTX, 1, CONST_VECTOR)
#define SUBREG_REG(RTX) XCEXP (RTX, 0, SUBREG)
#define SUBREG_BYTE(RTX) XCUINT (RTX, 1, SUBREG)
extern unsigned int subreg_lsb PARAMS ((rtx));
extern unsigned int subreg_regno_offset PARAMS ((unsigned int,
enum machine_mode,
unsigned int,
enum machine_mode));
extern unsigned int subreg_regno PARAMS ((rtx));
#define SUBREG_PROMOTED_VAR_P(RTX) ((RTX)->in_struct)
#define SUBREG_PROMOTED_UNSIGNED_P(RTX) ((RTX)->unchanging)
#define ASM_OPERANDS_TEMPLATE(RTX) XCSTR (RTX, 0, ASM_OPERANDS)
#define ASM_OPERANDS_OUTPUT_CONSTRAINT(RTX) XCSTR (RTX, 1, ASM_OPERANDS)
#define ASM_OPERANDS_OUTPUT_IDX(RTX) XCINT (RTX, 2, ASM_OPERANDS)
#define ASM_OPERANDS_INPUT_VEC(RTX) XCVEC (RTX, 3, ASM_OPERANDS)
#define ASM_OPERANDS_INPUT_CONSTRAINT_VEC(RTX) XCVEC (RTX, 4, ASM_OPERANDS)
#define ASM_OPERANDS_INPUT(RTX, N) XCVECEXP (RTX, 3, N, ASM_OPERANDS)
#define ASM_OPERANDS_INPUT_LENGTH(RTX) XCVECLEN (RTX, 3, ASM_OPERANDS)
#define ASM_OPERANDS_INPUT_CONSTRAINT_EXP(RTX, N) \
XCVECEXP (RTX, 4, N, ASM_OPERANDS)
#define ASM_OPERANDS_INPUT_CONSTRAINT(RTX, N) \
XSTR (XCVECEXP (RTX, 4, N, ASM_OPERANDS), 0)
#define ASM_OPERANDS_INPUT_MODE(RTX, N) \
GET_MODE (XCVECEXP (RTX, 4, N, ASM_OPERANDS))
#define ASM_OPERANDS_SOURCE_FILE(RTX) XCSTR (RTX, 5, ASM_OPERANDS)
#define ASM_OPERANDS_SOURCE_LINE(RTX) XCINT (RTX, 6, ASM_OPERANDS)
#define MEM_KEEP_ALIAS_SET_P(RTX) ((RTX)->jump)
#define MEM_VOLATILE_P(RTX) ((RTX)->volatil)
#define MEM_IN_STRUCT_P(RTX) ((RTX)->in_struct)
#define MEM_SCALAR_P(RTX) ((RTX)->frame_related)
#define MEM_SET_IN_STRUCT_P(RTX, VAL) \
do { \
if (VAL) \
{ \
MEM_IN_STRUCT_P (RTX) = 1; \
MEM_SCALAR_P (RTX) = 0; \
} \
else \
{ \
MEM_IN_STRUCT_P (RTX) = 0; \
MEM_SCALAR_P (RTX) = 1; \
} \
} while (0)
#define MEM_ATTRS(RTX) X0MEMATTR (RTX, 1)
#define MEM_ALIAS_SET(RTX) (MEM_ATTRS (RTX) == 0 ? 0 : MEM_ATTRS (RTX)->alias)
#define MEM_EXPR(RTX) (MEM_ATTRS (RTX) == 0 ? 0 : MEM_ATTRS (RTX)->expr)
#define MEM_OFFSET(RTX) (MEM_ATTRS (RTX) == 0 ? 0 : MEM_ATTRS (RTX)->offset)
#define MEM_SIZE(RTX) \
(MEM_ATTRS (RTX) != 0 ? MEM_ATTRS (RTX)->size \
: GET_MODE (RTX) != BLKmode ? GEN_INT (GET_MODE_SIZE (GET_MODE (RTX))) \
: 0)
#define MEM_ALIGN(RTX) \
(MEM_ATTRS (RTX) != 0 ? MEM_ATTRS (RTX)->align \
: (STRICT_ALIGNMENT && GET_MODE (RTX) != BLKmode \
? GET_MODE_ALIGNMENT (GET_MODE (RTX)) : BITS_PER_UNIT))
#define MEM_COPY_ATTRIBUTES(LHS, RHS) \
(MEM_VOLATILE_P (LHS) = MEM_VOLATILE_P (RHS), \
MEM_IN_STRUCT_P (LHS) = MEM_IN_STRUCT_P (RHS), \
MEM_SCALAR_P (LHS) = MEM_SCALAR_P (RHS), \
RTX_UNCHANGING_P (LHS) = RTX_UNCHANGING_P (RHS), \
MEM_KEEP_ALIAS_SET_P (LHS) = MEM_KEEP_ALIAS_SET_P (RHS), \
MEM_ATTRS (LHS) = MEM_ATTRS (RHS))
#define LABEL_OUTSIDE_LOOP_P(RTX) ((RTX)->in_struct)
#define LABEL_REF_NONLOCAL_P(RTX) ((RTX)->volatil)
#define LABEL_PRESERVE_P(RTX) ((RTX)->in_struct)
#define REG_LOOP_TEST_P(RTX) ((RTX)->in_struct)
#define SCHED_GROUP_P(INSN) ((INSN)->in_struct)
#define LINK_COST_ZERO(X) ((X)->jump)
#define LINK_COST_FREE(X) ((X)->call)
#define SET_DEST(RTX) XC2EXP(RTX, 0, SET, CLOBBER)
#define SET_SRC(RTX) XCEXP(RTX, 1, SET)
#define SET_IS_RETURN_P(RTX) ((RTX)->jump)
#define TRAP_CONDITION(RTX) XCEXP (RTX, 0, TRAP_IF)
#define TRAP_CODE(RTX) XCEXP (RTX, 1, TRAP_IF)
#define COND_EXEC_TEST(RTX) XCEXP (RTX, 0, COND_EXEC)
#define COND_EXEC_CODE(RTX) XCEXP (RTX, 1, COND_EXEC)
#define CONSTANT_POOL_ADDRESS_P(RTX) ((RTX)->unchanging)
#define STRING_POOL_ADDRESS_P(RTX) ((RTX)->frame_related)
#define SYMBOL_REF_FLAG(RTX) ((RTX)->volatil)
#define SYMBOL_REF_USED(RTX) ((RTX)->used)
#define SYMBOL_REF_WEAK(RTX) ((RTX)->integrated)
#define SYMBOL_REF_WEAK_IMPORT(RTX) ((RTX)->jump)
#if (defined (HAVE_PRE_INCREMENT) || defined (HAVE_PRE_DECREMENT) || defined (HAVE_POST_INCREMENT) || defined (HAVE_POST_DECREMENT))
#define FIND_REG_INC_NOTE(INSN, REG) \
((REG) != NULL_RTX && REG_P ((REG)) \
? find_regno_note ((INSN), REG_INC, REGNO (REG)) \
: find_reg_note ((INSN), REG_INC, (REG)))
#else
#define FIND_REG_INC_NOTE(INSN, REG) 0
#endif
#if (defined (HAVE_PRE_INCREMENT) || defined (HAVE_PRE_DECREMENT) || defined (HAVE_POST_INCREMENT) || defined (HAVE_POST_DECREMENT))
#define AUTO_INC_DEC
#endif
#ifndef HAVE_PRE_INCREMENT
#define HAVE_PRE_INCREMENT 0
#endif
#ifndef HAVE_PRE_DECREMENT
#define HAVE_PRE_DECREMENT 0
#endif
#ifndef HAVE_POST_INCREMENT
#define HAVE_POST_INCREMENT 0
#endif
#ifndef HAVE_POST_DECREMENT
#define HAVE_POST_DECREMENT 0
#endif
#ifndef HAVE_POST_MODIFY_DISP
#define HAVE_POST_MODIFY_DISP 0
#endif
#ifndef HAVE_POST_MODIFY_REG
#define HAVE_POST_MODIFY_REG 0
#endif
#ifndef HAVE_PRE_MODIFY_DISP
#define HAVE_PRE_MODIFY_DISP 0
#endif
#ifndef HAVE_PRE_MODIFY_REG
#define HAVE_PRE_MODIFY_REG 0
#endif
#ifndef USE_LOAD_POST_INCREMENT
#define USE_LOAD_POST_INCREMENT(MODE) HAVE_POST_INCREMENT
#endif
#ifndef USE_LOAD_POST_DECREMENT
#define USE_LOAD_POST_DECREMENT(MODE) HAVE_POST_DECREMENT
#endif
#ifndef USE_LOAD_PRE_INCREMENT
#define USE_LOAD_PRE_INCREMENT(MODE) HAVE_PRE_INCREMENT
#endif
#ifndef USE_LOAD_PRE_DECREMENT
#define USE_LOAD_PRE_DECREMENT(MODE) HAVE_PRE_DECREMENT
#endif
#ifndef USE_STORE_POST_INCREMENT
#define USE_STORE_POST_INCREMENT(MODE) HAVE_POST_INCREMENT
#endif
#ifndef USE_STORE_POST_DECREMENT
#define USE_STORE_POST_DECREMENT(MODE) HAVE_POST_DECREMENT
#endif
#ifndef USE_STORE_PRE_INCREMENT
#define USE_STORE_PRE_INCREMENT(MODE) HAVE_PRE_INCREMENT
#endif
#ifndef USE_STORE_PRE_DECREMENT
#define USE_STORE_PRE_DECREMENT(MODE) HAVE_PRE_DECREMENT
#endif
#define RANGE_INFO_NOTE_START(INSN) XCEXP (INSN, 0, RANGE_INFO)
#define RANGE_INFO_NOTE_END(INSN) XCEXP (INSN, 1, RANGE_INFO)
#define RANGE_INFO_REGS(INSN) XCVEC (INSN, 2, RANGE_INFO)
#define RANGE_INFO_REGS_REG(INSN, N) XCVECEXP (INSN, 2, N, RANGE_INFO)
#define RANGE_INFO_NUM_REGS(INSN) XCVECLEN (INSN, 2, RANGE_INFO)
#define RANGE_INFO_NCALLS(INSN) XCINT (INSN, 3, RANGE_INFO)
#define RANGE_INFO_NINSNS(INSN) XCINT (INSN, 4, RANGE_INFO)
#define RANGE_INFO_UNIQUE(INSN) XCINT (INSN, 5, RANGE_INFO)
#define RANGE_INFO_BB_START(INSN) XCINT (INSN, 6, RANGE_INFO)
#define RANGE_INFO_BB_END(INSN) XCINT (INSN, 7, RANGE_INFO)
#define RANGE_INFO_LOOP_DEPTH(INSN) XCINT (INSN, 8, RANGE_INFO)
#define RANGE_INFO_LIVE_START(INSN) XCBITMAP (INSN, 9, RANGE_INFO)
#define RANGE_INFO_LIVE_END(INSN) XCBITMAP (INSN, 10, RANGE_INFO)
#define RANGE_INFO_MARKER_START(INSN) XCINT (INSN, 11, RANGE_INFO)
#define RANGE_INFO_MARKER_END(INSN) XCINT (INSN, 12, RANGE_INFO)
#define RANGE_REG_PSEUDO(INSN,N) XCINT (XCVECEXP (INSN, 2, N, RANGE_INFO), 0, REG)
#define RANGE_REG_COPY(INSN,N) XCINT (XCVECEXP (INSN, 2, N, RANGE_INFO), 1, REG)
#define RANGE_REG_REFS(INSN,N) XINT (XCVECEXP (INSN, 2, N, RANGE_INFO), 2)
#define RANGE_REG_SETS(INSN,N) XINT (XCVECEXP (INSN, 2, N, RANGE_INFO), 3)
#define RANGE_REG_DEATHS(INSN,N) XINT (XCVECEXP (INSN, 2, N, RANGE_INFO), 4)
#define RANGE_REG_COPY_FLAGS(INSN,N) XINT (XCVECEXP (INSN, 2, N, RANGE_INFO), 5)
#define RANGE_REG_LIVE_LENGTH(INSN,N) XINT (XCVECEXP (INSN, 2, N, RANGE_INFO), 6)
#define RANGE_REG_N_CALLS(INSN,N) XINT (XCVECEXP (INSN, 2, N, RANGE_INFO), 7)
#define RANGE_REG_SYMBOL_NODE(INSN,N) XTREE (XCVECEXP (INSN, 2, N, RANGE_INFO), 8)
#define RANGE_REG_BLOCK_NODE(INSN,N) XTREE (XCVECEXP (INSN, 2, N, RANGE_INFO), 9)
#define RANGE_VAR_LIST(INSN) (XEXP (INSN, 0))
#define RANGE_VAR_BLOCK(INSN) (XTREE (INSN, 1))
#define RANGE_VAR_NUM(INSN) (XINT (INSN, 2))
#define RANGE_LIVE_BITMAP(INSN) (XBITMAP (INSN, 0))
#define RANGE_LIVE_ORIG_BLOCK(INSN) (XINT (INSN, 1))
#define PHI_NODE_P(X) \
((X) && GET_CODE (X) == INSN \
&& GET_CODE (PATTERN (X)) == SET \
&& GET_CODE (SET_SRC (PATTERN (X))) == PHI)
extern int rtx_equal_function_value_matters;
extern int generating_concat_p;
extern int ceil_log2 PARAMS ((unsigned HOST_WIDE_INT));
#define plus_constant(X, C) plus_constant_wide ((X), (HOST_WIDE_INT) (C))
extern rtx expand_builtin_expect_jump PARAMS ((tree, rtx, rtx));
extern void set_stack_check_libfunc PARAMS ((rtx));
extern HOST_WIDE_INT trunc_int_for_mode PARAMS ((HOST_WIDE_INT,
enum machine_mode));
extern rtx plus_constant_wide PARAMS ((rtx, HOST_WIDE_INT));
extern rtx plus_constant_for_output_wide PARAMS ((rtx, HOST_WIDE_INT));
extern void optimize_save_area_alloca PARAMS ((rtx));
extern rtx gen_rtx PARAMS ((enum rtx_code,
enum machine_mode, ...));
extern rtvec gen_rtvec PARAMS ((int, ...));
extern rtx copy_insn_1 PARAMS ((rtx));
extern rtx copy_insn PARAMS ((rtx));
extern rtx rtx_alloc PARAMS ((RTX_CODE));
extern rtvec rtvec_alloc PARAMS ((int));
extern rtx copy_rtx PARAMS ((rtx));
extern rtx copy_rtx_if_shared PARAMS ((rtx));
extern rtx copy_most_rtx PARAMS ((rtx, rtx));
extern rtx shallow_copy_rtx PARAMS ((rtx));
extern int rtx_equal_p PARAMS ((rtx, rtx));
extern rtvec gen_rtvec_v PARAMS ((int, rtx *));
extern rtx gen_reg_rtx PARAMS ((enum machine_mode));
extern rtx gen_label_rtx PARAMS ((void));
extern int subreg_hard_regno PARAMS ((rtx, int));
extern rtx gen_lowpart_common PARAMS ((enum machine_mode, rtx));
extern rtx gen_lowpart PARAMS ((enum machine_mode, rtx));
extern rtx gen_lowpart_if_possible PARAMS ((enum machine_mode, rtx));
extern rtx gen_highpart PARAMS ((enum machine_mode, rtx));
extern rtx gen_highpart_mode PARAMS ((enum machine_mode,
enum machine_mode, rtx));
extern rtx gen_realpart PARAMS ((enum machine_mode, rtx));
extern rtx gen_imagpart PARAMS ((enum machine_mode, rtx));
extern rtx operand_subword PARAMS ((rtx, unsigned int, int,
enum machine_mode));
extern rtx constant_subword PARAMS ((rtx, int,
enum machine_mode));
extern rtx operand_subword_force PARAMS ((rtx, unsigned int,
enum machine_mode));
extern int subreg_lowpart_p PARAMS ((rtx));
extern unsigned int subreg_lowpart_offset PARAMS ((enum machine_mode,
enum machine_mode));
extern unsigned int subreg_highpart_offset PARAMS ((enum machine_mode,
enum machine_mode));
extern rtx make_safe_from PARAMS ((rtx, rtx));
extern rtx convert_memory_address PARAMS ((enum machine_mode, rtx));
extern rtx get_insns PARAMS ((void));
extern const char *get_insn_name PARAMS ((int));
extern rtx get_last_insn PARAMS ((void));
extern rtx get_last_insn_anywhere PARAMS ((void));
extern void start_sequence PARAMS ((void));
extern void push_to_sequence PARAMS ((rtx));
extern void end_sequence PARAMS ((void));
extern void push_to_full_sequence PARAMS ((rtx, rtx));
extern void end_full_sequence PARAMS ((rtx*, rtx*));
extern rtx gen_sequence PARAMS ((void));
extern rtx immed_double_const PARAMS ((HOST_WIDE_INT, HOST_WIDE_INT, enum machine_mode));
extern rtx mem_for_const_double PARAMS ((rtx));
extern rtx force_const_mem PARAMS ((enum machine_mode, rtx));
extern rtx get_pool_constant PARAMS ((rtx));
extern rtx get_pool_constant_mark PARAMS ((rtx, bool *));
extern enum machine_mode get_pool_mode PARAMS ((rtx));
extern rtx get_pool_constant_for_function PARAMS ((struct function *, rtx));
extern enum machine_mode get_pool_mode_for_function PARAMS ((struct function *, rtx));
extern int get_pool_offset PARAMS ((rtx));
extern rtx simplify_subtraction PARAMS ((rtx));
extern rtx assign_stack_local PARAMS ((enum machine_mode,
HOST_WIDE_INT, int));
extern rtx assign_stack_temp PARAMS ((enum machine_mode,
HOST_WIDE_INT, int));
extern rtx assign_stack_temp_for_type PARAMS ((enum machine_mode,
HOST_WIDE_INT, int, tree));
extern rtx assign_temp PARAMS ((tree, int, int, int));
extern rtx emit_insn_before PARAMS ((rtx, rtx));
extern rtx emit_jump_insn_before PARAMS ((rtx, rtx));
extern rtx emit_call_insn_before PARAMS ((rtx, rtx));
extern rtx emit_barrier_before PARAMS ((rtx));
extern rtx emit_label_before PARAMS ((rtx, rtx));
extern rtx emit_note_before PARAMS ((int, rtx));
extern rtx emit_insn_after PARAMS ((rtx, rtx));
extern rtx emit_jump_insn_after PARAMS ((rtx, rtx));
extern rtx emit_barrier_after PARAMS ((rtx));
extern rtx emit_label_after PARAMS ((rtx, rtx));
extern rtx emit_note_after PARAMS ((int, rtx));
extern rtx emit_line_note_after PARAMS ((const char *, int, rtx));
extern rtx emit_insn PARAMS ((rtx));
extern rtx emit_insns PARAMS ((rtx));
extern rtx emit_insns_before PARAMS ((rtx, rtx));
extern rtx emit_insns_after PARAMS ((rtx, rtx));
extern rtx emit_jump_insn PARAMS ((rtx));
extern rtx emit_call_insn PARAMS ((rtx));
extern rtx emit_label PARAMS ((rtx));
extern rtx emit_barrier PARAMS ((void));
extern rtx emit_line_note PARAMS ((const char *, int));
extern rtx emit_note PARAMS ((const char *, int));
extern rtx emit_line_note_force PARAMS ((const char *, int));
extern rtx make_insn_raw PARAMS ((rtx));
extern rtx previous_insn PARAMS ((rtx));
extern rtx next_insn PARAMS ((rtx));
extern rtx prev_nonnote_insn PARAMS ((rtx));
extern rtx next_nonnote_insn PARAMS ((rtx));
extern rtx prev_real_insn PARAMS ((rtx));
extern rtx next_real_insn PARAMS ((rtx));
extern rtx prev_active_insn PARAMS ((rtx));
extern rtx next_active_insn PARAMS ((rtx));
extern int active_insn_p PARAMS ((rtx));
extern rtx prev_label PARAMS ((rtx));
extern rtx next_label PARAMS ((rtx));
extern rtx next_cc0_user PARAMS ((rtx));
extern rtx prev_cc0_setter PARAMS ((rtx));
extern rtx next_nondeleted_insn PARAMS ((rtx));
extern enum rtx_code reverse_condition PARAMS ((enum rtx_code));
extern enum rtx_code reverse_condition_maybe_unordered PARAMS ((enum rtx_code));
extern enum rtx_code swap_condition PARAMS ((enum rtx_code));
extern enum rtx_code unsigned_condition PARAMS ((enum rtx_code));
extern enum rtx_code signed_condition PARAMS ((enum rtx_code));
extern void mark_jump_label PARAMS ((rtx, rtx, int));
extern void cleanup_barriers PARAMS ((void));
extern bool squeeze_notes PARAMS ((rtx *, rtx *));
extern rtx delete_related_insns PARAMS ((rtx));
extern void delete_jump PARAMS ((rtx));
extern void delete_barrier PARAMS ((rtx));
extern rtx get_label_before PARAMS ((rtx));
extern rtx get_label_after PARAMS ((rtx));
extern rtx follow_jumps PARAMS ((rtx));
extern rtx *find_constant_term_loc PARAMS ((rtx *));
extern rtx try_split PARAMS ((rtx, rtx, int));
extern int split_branch_probability;
extern rtx split_insns PARAMS ((rtx, rtx));
extern rtx simplify_unary_operation PARAMS ((enum rtx_code,
enum machine_mode, rtx,
enum machine_mode));
extern rtx simplify_binary_operation PARAMS ((enum rtx_code,
enum machine_mode, rtx,
rtx));
extern rtx simplify_ternary_operation PARAMS ((enum rtx_code,
enum machine_mode,
enum machine_mode, rtx, rtx,
rtx));
extern rtx simplify_relational_operation PARAMS ((enum rtx_code,
enum machine_mode, rtx,
rtx));
extern rtx simplify_gen_binary PARAMS ((enum rtx_code,
enum machine_mode,
rtx, rtx));
extern rtx simplify_gen_unary PARAMS ((enum rtx_code,
enum machine_mode, rtx,
enum machine_mode));
extern rtx simplify_gen_ternary PARAMS ((enum rtx_code,
enum machine_mode,
enum machine_mode,
rtx, rtx, rtx));
extern rtx simplify_gen_relational PARAMS ((enum rtx_code,
enum machine_mode,
enum machine_mode,
rtx, rtx));
extern rtx simplify_subreg PARAMS ((enum machine_mode,
rtx,
enum machine_mode,
unsigned int));
extern rtx simplify_gen_subreg PARAMS ((enum machine_mode,
rtx,
enum machine_mode,
unsigned int));
extern rtx simplify_replace_rtx PARAMS ((rtx, rtx, rtx));
extern rtx simplify_rtx PARAMS ((rtx));
extern rtx avoid_constant_pool_reference PARAMS ((rtx));
extern rtx gen_mem_addressof PARAMS ((rtx, tree));
extern enum machine_mode choose_hard_reg_mode PARAMS ((unsigned int,
unsigned int));
extern rtx set_unique_reg_note PARAMS ((rtx, enum reg_note, rtx));
#define single_set(I) (INSN_P (I) \
? (GET_CODE (PATTERN (I)) == SET \
? PATTERN (I) : single_set_1 (I)) \
: NULL_RTX)
#define single_set_1(I) single_set_2 (I, PATTERN (I))
extern int rtx_addr_can_trap_p PARAMS ((rtx));
extern int rtx_unstable_p PARAMS ((rtx));
extern int rtx_varies_p PARAMS ((rtx, int));
extern int rtx_addr_varies_p PARAMS ((rtx, int));
extern HOST_WIDE_INT get_integer_term PARAMS ((rtx));
extern rtx get_related_value PARAMS ((rtx));
extern rtx get_jump_table_offset PARAMS ((rtx, rtx *));
extern int reg_mentioned_p PARAMS ((rtx, rtx));
extern int count_occurrences PARAMS ((rtx, rtx, int));
extern int reg_referenced_p PARAMS ((rtx, rtx));
extern int reg_used_between_p PARAMS ((rtx, rtx, rtx));
extern int reg_referenced_between_p PARAMS ((rtx, rtx, rtx));
extern int reg_set_between_p PARAMS ((rtx, rtx, rtx));
extern int regs_set_between_p PARAMS ((rtx, rtx, rtx));
extern int commutative_operand_precedence PARAMS ((rtx));
extern int swap_commutative_operands_p PARAMS ((rtx, rtx));
extern int modified_between_p PARAMS ((rtx, rtx, rtx));
extern int no_labels_between_p PARAMS ((rtx, rtx));
extern int no_jumps_between_p PARAMS ((rtx, rtx));
extern int modified_in_p PARAMS ((rtx, rtx));
extern int insn_dependent_p PARAMS ((rtx, rtx));
extern int reg_set_p PARAMS ((rtx, rtx));
extern rtx single_set_2 PARAMS ((rtx, rtx));
extern int multiple_sets PARAMS ((rtx));
extern int set_noop_p PARAMS ((rtx));
extern int noop_move_p PARAMS ((rtx));
extern rtx find_last_value PARAMS ((rtx, rtx *, rtx, int));
extern int refers_to_regno_p PARAMS ((unsigned int, unsigned int,
rtx, rtx *));
extern int reg_overlap_mentioned_p PARAMS ((rtx, rtx));
extern rtx set_of PARAMS ((rtx, rtx));
extern void note_stores PARAMS ((rtx,
void (*) (rtx, rtx, void *),
void *));
extern void note_uses PARAMS ((rtx *,
void (*) (rtx *, void *),
void *));
extern rtx reg_set_last PARAMS ((rtx, rtx));
extern int dead_or_set_p PARAMS ((rtx, rtx));
extern int dead_or_set_regno_p PARAMS ((rtx, unsigned int));
extern rtx find_reg_note PARAMS ((rtx, enum reg_note, rtx));
extern rtx find_regno_note PARAMS ((rtx, enum reg_note,
unsigned int));
extern rtx find_reg_equal_equiv_note PARAMS ((rtx));
extern int find_reg_fusage PARAMS ((rtx, enum rtx_code, rtx));
extern int find_regno_fusage PARAMS ((rtx, enum rtx_code,
unsigned int));
extern int pure_call_p PARAMS ((rtx));
extern void remove_note PARAMS ((rtx, rtx));
extern int side_effects_p PARAMS ((rtx));
extern int volatile_refs_p PARAMS ((rtx));
extern int volatile_insn_p PARAMS ((rtx));
extern int may_trap_p PARAMS ((rtx));
extern int inequality_comparisons_p PARAMS ((rtx));
extern rtx replace_rtx PARAMS ((rtx, rtx, rtx));
extern rtx replace_regs PARAMS ((rtx, rtx *, unsigned int,
int));
extern int computed_jump_p PARAMS ((rtx));
typedef int (*rtx_function) PARAMS ((rtx *, void *));
extern int for_each_rtx PARAMS ((rtx *, rtx_function, void *));
extern rtx regno_use_in PARAMS ((unsigned int, rtx));
extern int auto_inc_p PARAMS ((rtx));
extern int in_expr_list_p PARAMS ((rtx, rtx));
extern void remove_node_from_expr_list PARAMS ((rtx, rtx *));
extern int insns_safe_to_move_p PARAMS ((rtx, rtx, rtx *));
extern int loc_mentioned_in_p PARAMS ((rtx *, rtx));
extern rtx find_first_parameter_load PARAMS ((rtx, rtx));
extern rtx find_use_as_address PARAMS ((rtx, rtx, HOST_WIDE_INT));
void init_EXPR_INSN_LIST_cache PARAMS ((void));
void free_EXPR_LIST_list PARAMS ((rtx *));
void free_INSN_LIST_list PARAMS ((rtx *));
void free_EXPR_LIST_node PARAMS ((rtx));
void free_INSN_LIST_node PARAMS ((rtx));
rtx alloc_INSN_LIST PARAMS ((rtx, rtx));
rtx alloc_EXPR_LIST PARAMS ((int, rtx, rtx));
extern int max_parallel;
extern void free_reg_info PARAMS ((void));
extern int asm_noperands PARAMS ((rtx));
extern const char *decode_asm_operands PARAMS ((rtx, rtx *, rtx **,
const char **,
enum machine_mode *));
extern enum reg_class reg_preferred_class PARAMS ((int));
extern enum reg_class reg_alternate_class PARAMS ((int));
extern rtx get_first_nonparm_insn PARAMS ((void));
extern void split_all_insns PARAMS ((int));
extern void split_all_insns_noflow PARAMS ((void));
#define MAX_SAVED_CONST_INT 64
extern rtx const_int_rtx[MAX_SAVED_CONST_INT * 2 + 1];
#define const0_rtx (const_int_rtx[MAX_SAVED_CONST_INT])
#define const1_rtx (const_int_rtx[MAX_SAVED_CONST_INT+1])
#define const2_rtx (const_int_rtx[MAX_SAVED_CONST_INT+2])
#define constm1_rtx (const_int_rtx[MAX_SAVED_CONST_INT-1])
extern rtx const_true_rtx;
extern rtx const_tiny_rtx[3][(int) MAX_MACHINE_MODE];
#define CONST0_RTX(MODE) (const_tiny_rtx[0][(int) (MODE)])
#define CONST1_RTX(MODE) (const_tiny_rtx[1][(int) (MODE)])
#define CONST2_RTX(MODE) (const_tiny_rtx[2][(int) (MODE)])
#ifndef HARD_FRAME_POINTER_REGNUM
#define HARD_FRAME_POINTER_REGNUM FRAME_POINTER_REGNUM
#endif
enum global_rtl_index
{
GR_PC,
GR_CC0,
GR_STACK_POINTER,
GR_FRAME_POINTER,
#if FRAME_POINTER_REGNUM == ARG_POINTER_REGNUM
GR_ARG_POINTER = GR_FRAME_POINTER,
#endif
#if HARD_FRAME_POINTER_REGNUM == FRAME_POINTER_REGNUM
GR_HARD_FRAME_POINTER = GR_FRAME_POINTER,
#else
GR_HARD_FRAME_POINTER,
#endif
#if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
#if HARD_FRAME_POINTER_REGNUM == ARG_POINTER_REGNUM
GR_ARG_POINTER = GR_HARD_FRAME_POINTER,
#else
GR_ARG_POINTER,
#endif
#endif
GR_VIRTUAL_INCOMING_ARGS,
GR_VIRTUAL_STACK_ARGS,
GR_VIRTUAL_STACK_DYNAMIC,
GR_VIRTUAL_OUTGOING_ARGS,
GR_VIRTUAL_CFA,
GR_MAX
};
extern rtx global_rtl[GR_MAX];
#define pc_rtx (global_rtl[GR_PC])
#define cc0_rtx (global_rtl[GR_CC0])
#define stack_pointer_rtx (global_rtl[GR_STACK_POINTER])
#define frame_pointer_rtx (global_rtl[GR_FRAME_POINTER])
#define hard_frame_pointer_rtx (global_rtl[GR_HARD_FRAME_POINTER])
#define arg_pointer_rtx (global_rtl[GR_ARG_POINTER])
extern rtx pic_offset_table_rtx;
extern rtx struct_value_rtx;
extern rtx struct_value_incoming_rtx;
extern rtx static_chain_rtx;
extern rtx static_chain_incoming_rtx;
extern rtx return_address_pointer_rtx;
#ifndef NO_GENRTL_H
#include "genrtl.h"
#endif
extern rtx gen_rtx_CONST_DOUBLE PARAMS ((enum machine_mode,
HOST_WIDE_INT, HOST_WIDE_INT));
extern rtx gen_rtx_CONST_INT PARAMS ((enum machine_mode, HOST_WIDE_INT));
extern rtx gen_raw_REG PARAMS ((enum machine_mode, int));
extern rtx gen_rtx_REG PARAMS ((enum machine_mode, int));
extern rtx gen_rtx_SUBREG PARAMS ((enum machine_mode, rtx, int));
extern rtx gen_rtx_MEM PARAMS ((enum machine_mode, rtx));
extern rtx gen_lowpart_SUBREG PARAMS ((enum machine_mode, rtx));
#define GEN_INT(N) gen_rtx_CONST_INT (VOIDmode, (HOST_WIDE_INT) (N))
#define FIRST_VIRTUAL_REGISTER (FIRST_PSEUDO_REGISTER)
#define virtual_incoming_args_rtx (global_rtl[GR_VIRTUAL_INCOMING_ARGS])
#define VIRTUAL_INCOMING_ARGS_REGNUM (FIRST_VIRTUAL_REGISTER)
#define virtual_stack_vars_rtx (global_rtl[GR_VIRTUAL_STACK_ARGS])
#define VIRTUAL_STACK_VARS_REGNUM ((FIRST_VIRTUAL_REGISTER) + 1)
#define virtual_stack_dynamic_rtx (global_rtl[GR_VIRTUAL_STACK_DYNAMIC])
#define VIRTUAL_STACK_DYNAMIC_REGNUM ((FIRST_VIRTUAL_REGISTER) + 2)
#define virtual_outgoing_args_rtx (global_rtl[GR_VIRTUAL_OUTGOING_ARGS])
#define VIRTUAL_OUTGOING_ARGS_REGNUM ((FIRST_VIRTUAL_REGISTER) + 3)
#define virtual_cfa_rtx (global_rtl[GR_VIRTUAL_CFA])
#define VIRTUAL_CFA_REGNUM ((FIRST_VIRTUAL_REGISTER) + 4)
#define LAST_VIRTUAL_REGISTER ((FIRST_VIRTUAL_REGISTER) + 4)
#define REGNO_PTR_FRAME_P(REGNUM) \
((REGNUM) == STACK_POINTER_REGNUM \
|| (REGNUM) == FRAME_POINTER_REGNUM \
|| (REGNUM) == HARD_FRAME_POINTER_REGNUM \
|| (REGNUM) == ARG_POINTER_REGNUM \
|| ((REGNUM) >= FIRST_VIRTUAL_REGISTER \
&& (REGNUM) <= LAST_VIRTUAL_REGISTER))
#define INVALID_REGNUM (~(unsigned int) 0)
extern rtx find_next_ref PARAMS ((rtx, rtx));
extern rtx output_constant_def PARAMS ((tree, int));
extern rtx immed_real_const PARAMS ((tree));
extern rtx immed_vector_const PARAMS ((union tree_node *));
#ifndef STORE_FLAG_VALUE
#define STORE_FLAG_VALUE 1
#endif
extern int flow2_completed;
extern int reload_completed;
extern int reload_in_progress;
extern int cse_not_expected;
extern int no_new_pseudos;
extern int rtx_to_tree_code PARAMS ((enum rtx_code));
struct obstack;
extern void gcc_obstack_init PARAMS ((struct obstack *));
struct cse_basic_block_data;
#define COSTS_N_INSNS(N) ((N) * 4)
#define MAX_COST INT_MAX
extern int rtx_cost PARAMS ((rtx, enum rtx_code));
extern int address_cost PARAMS ((rtx, enum machine_mode));
extern void delete_trivially_dead_insns PARAMS ((rtx, int, int));
#ifdef BUFSIZ
extern int cse_main PARAMS ((rtx, int, int, FILE *));
#endif
extern void cse_end_of_basic_block PARAMS ((rtx,
struct cse_basic_block_data *,
int, int, int));
extern int comparison_dominates_p PARAMS ((enum rtx_code, enum rtx_code));
extern int condjump_p PARAMS ((rtx));
extern int any_condjump_p PARAMS ((rtx));
extern int any_uncondjump_p PARAMS ((rtx));
extern int safe_to_remove_jump_p PARAMS ((rtx));
extern rtx pc_set PARAMS ((rtx));
extern rtx condjump_label PARAMS ((rtx));
extern int simplejump_p PARAMS ((rtx));
extern int returnjump_p PARAMS ((rtx));
extern int onlyjump_p PARAMS ((rtx));
extern int only_sets_cc0_p PARAMS ((rtx));
extern int sets_cc0_p PARAMS ((rtx));
extern int invert_jump_1 PARAMS ((rtx, rtx));
extern int invert_jump PARAMS ((rtx, rtx, int));
extern int rtx_renumbered_equal_p PARAMS ((rtx, rtx));
extern int true_regnum PARAMS ((rtx));
extern int redirect_jump_1 PARAMS ((rtx, rtx));
extern int redirect_jump PARAMS ((rtx, rtx, int));
extern void rebuild_jump_labels PARAMS ((rtx));
extern enum rtx_code reversed_comparison_code PARAMS ((rtx, rtx));
extern enum rtx_code reversed_comparison_code_parts PARAMS ((enum rtx_code,
rtx, rtx, rtx));
extern void delete_for_peephole PARAMS ((rtx, rtx));
extern int condjump_in_parallel_p PARAMS ((rtx));
extern void never_reached_warning PARAMS ((rtx, rtx));
extern void purge_line_number_notes PARAMS ((rtx));
extern void copy_loop_headers PARAMS ((rtx));
extern int max_reg_num PARAMS ((void));
extern int max_label_num PARAMS ((void));
extern int get_first_label_num PARAMS ((void));
extern void delete_insns_since PARAMS ((rtx));
extern void mark_reg_pointer PARAMS ((rtx, int));
extern void mark_user_reg PARAMS ((rtx));
extern void reset_used_flags PARAMS ((rtx));
extern void reorder_insns PARAMS ((rtx, rtx, rtx));
extern void reorder_insns_nobb PARAMS ((rtx, rtx, rtx));
extern int get_max_uid PARAMS ((void));
extern int in_sequence_p PARAMS ((void));
extern void force_next_line_note PARAMS ((void));
extern void clear_emit_caches PARAMS ((void));
extern void init_emit PARAMS ((void));
extern void init_emit_once PARAMS ((int));
extern void push_topmost_sequence PARAMS ((void));
extern void pop_topmost_sequence PARAMS ((void));
extern int subreg_realpart_p PARAMS ((rtx));
extern void reverse_comparison PARAMS ((rtx));
extern void set_new_first_and_last_insn PARAMS ((rtx, rtx));
extern void set_new_first_and_last_label_num PARAMS ((int, int));
extern void set_new_last_label_num PARAMS ((int));
extern void unshare_all_rtl_again PARAMS ((rtx));
extern void set_last_insn PARAMS ((rtx));
extern void link_cc0_insns PARAMS ((rtx));
extern void add_insn PARAMS ((rtx));
extern void add_insn_before PARAMS ((rtx, rtx));
extern void add_insn_after PARAMS ((rtx, rtx));
extern void remove_insn PARAMS ((rtx));
extern void reorder_insns_with_line_notes PARAMS ((rtx, rtx, rtx));
extern void emit_insn_after_with_line_notes PARAMS ((rtx, rtx, rtx));
extern enum rtx_code classify_insn PARAMS ((rtx));
extern rtx emit PARAMS ((rtx));
int force_line_numbers PARAMS ((void));
void restore_line_number_status PARAMS ((int old_value));
extern void renumber_insns PARAMS ((FILE *));
extern void remove_unnecessary_notes PARAMS ((void));
extern rtx delete_insn PARAMS ((rtx));
extern void delete_insn_chain PARAMS ((rtx, rtx));
extern int combine_instructions PARAMS ((rtx, unsigned int));
extern unsigned int extended_count PARAMS ((rtx, enum machine_mode, int));
extern rtx remove_death PARAMS ((unsigned int, rtx));
#ifdef BUFSIZ
extern void dump_combine_stats PARAMS ((FILE *));
extern void dump_combine_total_stats PARAMS ((FILE *));
#endif
#ifdef BUFSIZ
extern void schedule_insns PARAMS ((FILE *));
extern void schedule_ebbs PARAMS ((FILE *));
#endif
extern void fix_sched_param PARAMS ((const char *, const char *));
extern const char *print_rtx_head;
extern void debug_rtx PARAMS ((rtx));
extern void debug_rtx_list PARAMS ((rtx, int));
extern void debug_rtx_range PARAMS ((rtx, rtx));
extern rtx debug_rtx_find PARAMS ((rtx, int));
#ifdef BUFSIZ
extern void print_mem_expr PARAMS ((FILE *, tree));
extern void print_rtl PARAMS ((FILE *, rtx));
extern void print_simple_rtl PARAMS ((FILE *, rtx));
extern int print_rtl_single PARAMS ((FILE *, rtx));
extern void print_inline_rtx PARAMS ((FILE *, rtx, int));
#endif
extern void init_loop PARAMS ((void));
extern rtx libcall_other_reg PARAMS ((rtx, rtx));
#ifdef BUFSIZ
extern void loop_optimize PARAMS ((rtx, FILE *, int));
#endif
extern void record_excess_regs PARAMS ((rtx, rtx, rtx *));
extern void reposition_prologue_and_epilogue_notes PARAMS ((rtx));
extern void thread_prologue_and_epilogue_insns PARAMS ((rtx));
extern int prologue_epilogue_contains PARAMS ((rtx));
extern int sibcall_epilogue_contains PARAMS ((rtx));
extern void preserve_rtl_expr_result PARAMS ((rtx));
extern void mark_temp_addr_taken PARAMS ((rtx));
extern void update_temp_slot_address PARAMS ((rtx, rtx));
extern void purge_addressof PARAMS ((rtx));
extern void purge_hard_subreg_sets PARAMS ((rtx));
extern void set_file_and_line_for_stmt PARAMS ((const char *, int));
extern void expand_null_return PARAMS ((void));
extern void emit_jump PARAMS ((rtx));
extern int preserve_subexpressions_p PARAMS ((void));
extern void move_by_pieces PARAMS ((rtx, rtx,
unsigned HOST_WIDE_INT,
unsigned int));
extern void recompute_reg_usage PARAMS ((rtx, int));
extern int initialize_uninitialized_subregs PARAMS ((void));
#ifdef BUFSIZ
extern void print_rtl_with_bb PARAMS ((FILE *, rtx));
extern void dump_flow_info PARAMS ((FILE *));
#endif
extern void init_expmed PARAMS ((void));
extern void expand_inc PARAMS ((rtx, rtx));
extern void expand_dec PARAMS ((rtx, rtx));
extern rtx expand_mult_highpart PARAMS ((enum machine_mode, rtx,
unsigned HOST_WIDE_INT, rtx,
int, int));
#ifdef BUFSIZ
extern int gcse_main PARAMS ((rtx, FILE *));
#endif
extern void mark_elimination PARAMS ((int, int));
#ifdef BUFSIZ
extern int global_alloc PARAMS ((FILE *));
extern void dump_global_regs PARAMS ((FILE *));
#endif
#ifdef HARD_CONST
extern void retry_global_alloc PARAMS ((int, HARD_REG_SET));
#endif
extern void build_insn_chain PARAMS ((rtx));
extern int reg_classes_intersect_p PARAMS ((enum reg_class, enum reg_class));
extern int reg_class_subset_p PARAMS ((enum reg_class, enum reg_class));
extern void globalize_reg PARAMS ((int));
extern void init_regs PARAMS ((void));
extern void init_reg_sets PARAMS ((void));
extern void regset_release_memory PARAMS ((void));
extern void regclass_init PARAMS ((void));
extern void regclass PARAMS ((rtx, int, FILE *));
extern void reg_scan PARAMS ((rtx, unsigned int, int));
extern void reg_scan_update PARAMS ((rtx, rtx, unsigned int));
extern void fix_register PARAMS ((const char *, int, int));
extern void delete_null_pointer_checks PARAMS ((rtx));
#ifdef BUFSIZ
extern void regmove_optimize PARAMS ((rtx, int, FILE *));
#endif
extern void combine_stack_adjustments PARAMS ((void));
#ifdef BUFSIZ
extern void dbr_schedule PARAMS ((rtx, FILE *));
#endif
#ifdef BUFSIZ
extern void dump_local_alloc PARAMS ((FILE *));
#endif
extern int local_alloc PARAMS ((void));
extern int function_invariant_p PARAMS ((rtx));
extern void init_branch_prob PARAMS ((const char *));
extern void branch_prob PARAMS ((void));
extern void end_branch_prob PARAMS ((void));
extern void output_func_start_profiler PARAMS ((void));
#ifdef BUFSIZ
extern void reg_to_stack PARAMS ((rtx, FILE *));
#endif
extern int add_double PARAMS ((unsigned HOST_WIDE_INT, HOST_WIDE_INT,
unsigned HOST_WIDE_INT, HOST_WIDE_INT,
unsigned HOST_WIDE_INT *,
HOST_WIDE_INT *));
extern int neg_double PARAMS ((unsigned HOST_WIDE_INT, HOST_WIDE_INT,
unsigned HOST_WIDE_INT *,
HOST_WIDE_INT *));
extern int mul_double PARAMS ((unsigned HOST_WIDE_INT,
HOST_WIDE_INT,
unsigned HOST_WIDE_INT, HOST_WIDE_INT,
unsigned HOST_WIDE_INT *,
HOST_WIDE_INT *));
extern void lshift_double PARAMS ((unsigned HOST_WIDE_INT, HOST_WIDE_INT,
HOST_WIDE_INT, unsigned int,
unsigned HOST_WIDE_INT *,
HOST_WIDE_INT *, int));
extern void rshift_double PARAMS ((unsigned HOST_WIDE_INT, HOST_WIDE_INT,
HOST_WIDE_INT, unsigned int,
unsigned HOST_WIDE_INT *,
HOST_WIDE_INT *, int));
extern void lrotate_double PARAMS ((unsigned HOST_WIDE_INT, HOST_WIDE_INT,
HOST_WIDE_INT, unsigned int,
unsigned HOST_WIDE_INT *,
HOST_WIDE_INT *));
extern void rrotate_double PARAMS ((unsigned HOST_WIDE_INT, HOST_WIDE_INT,
HOST_WIDE_INT, unsigned int,
unsigned HOST_WIDE_INT *,
HOST_WIDE_INT *));
enum libcall_type
{
LCT_NORMAL = 0,
LCT_CONST = 1,
LCT_PURE = 2,
LCT_CONST_MAKE_BLOCK = 3,
LCT_PURE_MAKE_BLOCK = 4,
LCT_NORETURN = 5,
LCT_THROW = 6,
LCT_ALWAYS_RETURN = 7,
LCT_RETURNS_TWICE = 8
};
extern void emit_library_call PARAMS ((rtx, enum libcall_type,
enum machine_mode, int,
...));
extern rtx emit_library_call_value PARAMS ((rtx, rtx, enum libcall_type,
enum machine_mode, int,
...));
extern int set_dominates_use PARAMS ((int, int, int, rtx, rtx));
extern int in_data_section PARAMS ((void));
extern void init_varasm_once PARAMS ((void));
extern void init_rtl PARAMS ((void));
extern void traverse_md_constants PARAMS ((int (*) (void **, void *),
void *));
struct md_constant { char *name, *value; };
#ifdef BUFSIZ
extern int read_skip_spaces PARAMS ((FILE *));
extern rtx read_rtx PARAMS ((FILE *));
#endif
extern const char *read_rtx_filename;
extern int read_rtx_lineno;
extern void fancy_abort PARAMS ((const char *, int, const char *))
ATTRIBUTE_NORETURN;
#define abort() fancy_abort (__FILE__, __LINE__, __FUNCTION__)
extern void clear_reg_alias_info PARAMS ((rtx));
extern rtx canon_rtx PARAMS ((rtx));
extern int true_dependence PARAMS ((rtx, enum machine_mode, rtx,
int (*)(rtx, int)));
extern rtx get_addr PARAMS ((rtx));
extern int canon_true_dependence PARAMS ((rtx, enum machine_mode, rtx,
rtx, int (*)(rtx, int)));
extern int read_dependence PARAMS ((rtx, rtx));
extern int anti_dependence PARAMS ((rtx, rtx));
extern int output_dependence PARAMS ((rtx, rtx));
extern void mark_constant_function PARAMS ((void));
extern void init_alias_once PARAMS ((void));
extern void init_alias_analysis PARAMS ((void));
extern void end_alias_analysis PARAMS ((void));
extern rtx addr_side_effect_eval PARAMS ((rtx, int, int));
typedef enum {
sibcall_use_normal = 1,
sibcall_use_tail_recursion,
sibcall_use_sibcall
} sibcall_use_t;
extern void optimize_sibling_and_tail_recursive_calls PARAMS ((void));
extern void replace_call_placeholder PARAMS ((rtx, sibcall_use_t));
#ifdef STACK_REGS
extern int stack_regs_mentioned PARAMS ((rtx insn));
#endif
extern rtx stack_limit_rtx;
extern void regrename_optimize PARAMS ((void));
extern void copyprop_hardreg_forward PARAMS ((void));
extern void if_convert PARAMS ((int));
extern void invert_br_probabilities PARAMS ((rtx));
extern bool expensive_function_p PARAMS ((int));
#endif