/* Register Transfer Language (RTL) definitions for GNU C-Compiler
Copyright (C) 1987, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
- 1999, 2000 Free Software Foundation, Inc.
+ 1999, 2000, 2001 Free Software Foundation, Inc.
-This file is part of GNU CC.
+This file is part of GCC.
-GNU CC is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
-any later version.
+GCC is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free
+Software Foundation; either version 2, or (at your option) any later
+version.
-GNU CC is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
+GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
You should have received a copy of the GNU General Public License
-along with GNU CC; see the file COPYING. If not, write to
-the Free Software Foundation, 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA. */
+along with GCC; see the file COPYING. If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+02111-1307, USA. */
-#ifndef _RTL_H
-#define _RTL_H
+#ifndef GCC_RTL_H
+#define GCC_RTL_H
struct function;
#undef ABS /* Likewise. */
#undef PC /* Likewise. */
-#ifndef TREE_CODE
-union tree_node;
-#endif
+/* Value used by some passes to "recognize" noop moves as valid instructions.
+ */
+#define NOOP_MOVE_INSN_CODE INT_MAX
/* Register Transfer Language EXPRESSIONS CODES */
int rtint;
unsigned int rtuint;
const char *rtstr;
- struct rtx_def *rtx;
- struct rtvec_def *rtvec;
+ 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;
- union tree_node *rttree;
+ tree rttree;
struct basic_block_def *bb;
} rtunion;
/* RTL expression ("rtx"). */
-typedef struct rtx_def
+struct rtx_def
{
/* The kind of expression this is. */
ENUM_BITFIELD(rtx_code) code: 16;
/* 1 in an INSN if it can call another function.
LINK_COST_FREE in an INSN_LIST. */
unsigned int call : 1;
- /* 1 in a MEM or REG if value of this expression will never change
- during the current function, even though it is not
- manifestly constant.
+ /* 1 in a REG if value of this expression will never change during
+ the current function, even though it is not manifestly constant.
+ 1 in a MEM if contents of memory are constant. This does not
+ necessarily mean that the value of this expression is constant.
1 in a SUBREG if it is from a promoted variable that is unsigned.
1 in a SYMBOL_REF if it addresses something in the per-function
constants pool.
together with the preceding insn. Valid only within sched.
1 in an INSN, JUMP_INSN, or CALL_INSN if insn is in a delay slot and
from the target of a branch. Valid from reorg until end of compilation;
- cleared before used. */
+ cleared before used.
+ 1 in an INSN if this insn is dead code. Valid only during
+ dead-code elimination phase; cleared before use. */
unsigned int in_struct : 1;
/* 1 if this rtx is used. This is used for copying shared structure.
See `unshare_all_rtl'.
unsigned int used : 1;
/* Nonzero if this rtx came from procedure integration.
In a REG, nonzero means this reg refers to the return value
- of the current function. */
+ of the current function.
+ 1 in a SYMBOL_REF if the symbol is weak. */
unsigned integrated : 1;
/* 1 in an INSN or a SET if this rtx is related to the call frame,
either changing how we compute the frame address or saving and
restoring registers in the prologue and epilogue.
1 in a MEM if the MEM refers to a scalar, rather than a member of
- an aggregate. */
+ an aggregate.
+ 1 in a REG if the register is a pointer.
+ 1 in a SYMBOL_REF if it addresses something in the per-function
+ constant string pool. */
unsigned frame_related : 1;
/* The first element of the operands of this rtx.
The number of operands and their types are controlled
by the `code' field, according to rtl.def. */
rtunion fld[1];
-} *rtx;
+};
#define NULL_RTX (rtx) 0
/* Define macros to access the `code' field of the rtx. */
-#define GET_CODE(RTX) ((RTX)->code)
-#define PUT_CODE(RTX, CODE) ((RTX)->code = (CODE))
+#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) ((RTX)->mode)
-#define PUT_MODE(RTX, MODE) ((RTX)->mode = (MODE))
+#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)
for a variable number of things. The principle use is inside
PARALLEL expressions. */
-typedef struct rtvec_def{
+struct rtvec_def {
int num_elem; /* number of elements */
- struct rtx_def *elem[1];
-} *rtvec;
+ 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))
-/* 1 if X is a REG. */
-
+/* Predicate yielding nonzero iff X is an rtl for a register. */
#define REG_P(X) (GET_CODE (X) == REG)
+/* Predicate yielding nonzero iff X is a label insn. */
+#define LABEL_P(X) (GET_CODE (X) == CODE_LABEL)
+
+/* Predicate yielding nonzero iff X is a jump insn. */
+#define JUMP_P(X) (GET_CODE (X) == JUMP_INSN)
+
+/* Predicate yielding nonzero iff X is a note insn. */
+#define NOTE_P(X) (GET_CODE (X) == NOTE)
+
+/* Predicate yielding nonzero iff X is a barrier insn. */
+#define BARRIER_P(X) (GET_CODE (X) == BARRIER)
+
+/* Predicate yielding nonzero iff X is a data for a jump table. */
+#define JUMP_TABLE_DATA_P(INSN) \
+ (JUMP_P (INSN) && (GET_CODE (PATTERN (INSN)) == ADDR_VEC || \
+ GET_CODE (PATTERN (INSN)) == ADDR_DIFF_VEC))
+
/* 1 if X is a constant value that is an integer. */
#define CONSTANT_P(X) \
#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)
/* 1 if insn has been deleted. */
#define INSN_DELETED_P(INSN) ((INSN)->volatil)
-/* 1 if insn is a call to a const function. */
-#define CONST_CALL_P(INSN) ((INSN)->unchanging)
+/* 1 if insn is a call to a const or pure function. */
+#define CONST_OR_PURE_CALL_P(INSN) ((INSN)->unchanging)
/* 1 if insn (assumed to be a CALL_INSN) is a sibling call. */
#define SIBLING_CALL_P(INSN) ((INSN)->jump)
delay slots, i.e., it is an annulled branch. */
#define INSN_ANNULLED_BRANCH_P(INSN) ((INSN)->unchanging)
+/* 1 if insn is a dead code. Valid only for dead-code elimination phase. */
+#define INSN_DEAD_CODE_P(INSN) ((INSN)->in_struct)
+
/* 1 if insn is in a delay slot and is from the target of the branch. If
the branch insn has INSN_ANNULLED_BRANCH_P set, this insn should only be
executed if the branch is taken. For annulled branches with this bit
flow, are represented by a 0 reg note kind. */
REG_DEP_ANTI, REG_DEP_OUTPUT,
- /* REG_BR_PROB is attached to JUMP_INSNs and CALL_INSNs when the flag
- -fbranch-probabilities is given. It has an integer value. For jumps,
- it is the probability that this is a taken branch. For calls, it is
- the probability that this call won't return. */
+ /* REG_BR_PROB is attached to JUMP_INSNs and CALL_INSNs.
+ It has an integer value. For jumps, it is the probability that this is a
+ taken branch. For calls, it is the probability that this call won't
+ return. */
REG_BR_PROB,
/* REG_EXEC_COUNT is attached to the first insn of each basic block, and
where SETJMP_VIA_SAVE_AREA is true. */
REG_SAVE_AREA,
- /* Attached to JUMP_INSNs only, it holds the branch prediction flags
- computed by get_jump_flags() after dbr scheduling is complete. */
+ /* REG_BR_PRED is attached to JUMP_INSNs and CALL_INSNSs. It contains
+ CONCAT of two integer value. First specifies the branch predictor
+ that added the note, second specifies the predicted hitrate of branch
+ in the same format as REG_BR_PROB note uses. */
REG_BR_PRED,
/* Attached to insns that are RTX_FRAME_RELATED_P, but are too complex
throw, nor will it execute a non-local goto. */
REG_EH_REGION,
- /* Indicates that a call is actually a call to rethrow, and specifies the
- rethrow symbol for the region the rethrow is targetting. This provides
- a way to generate the non standard flow edges required for a rethrow. */
- REG_EH_RETHROW,
-
/* Used by haifa-sched to save NOTE_INSN notes across scheduling. */
- REG_SAVE_NOTE
+ REG_SAVE_NOTE,
+
+ /* Indicates that this insn (which is part of the prologue) computes
+ a value which might not be used later, and if so it's OK to delete
+ the insn. Normally, deleting any insn in the prologue is an error.
+ At present the parameter is unused and set to (const_int 0). */
+ REG_MAYBE_DEAD,
+
+ /* Indicates that a call does not return. */
+ REG_NORETURN,
+
+ /* Indicates that an indirect jump is a non-local goto instead of a
+ computed goto. */
+ REG_NON_LOCAL_GOTO,
+
+ /* This kind of note is generated at each to `setjmp',
+ and similar functions that can return twice. */
+ REG_SETJMP,
+
+ /* Indicate calls that always returns. */
+ REG_ALWAYS_RETURN
};
/* The base value for branch probability notes. */
Other kinds of NOTEs are identified by negative numbers here. */
#define NOTE_LINE_NUMBER(INSN) XCINT(INSN, 4, NOTE)
+/* Nonzero if INSN is a note marking the beginning of a basic block. */
+#define NOTE_INSN_BASIC_BLOCK_P(INSN) \
+ (GET_CODE (INSN) == NOTE \
+ && NOTE_LINE_NUMBER (INSN) == NOTE_INSN_BASIC_BLOCK)
+
/* Codes that appear in the NOTE_LINE_NUMBER field
for kinds of notes that are not line numbers.
off the end of the function body without a return statement. */
NOTE_INSN_FUNCTION_END,
- /* This kind of note is generated just after each call to `setjmp',
- and similar functions that can return twice. */
- NOTE_INSN_SETJMP,
-
/* This marks the point immediately after the last prologue insn. */
NOTE_INSN_PROLOGUE_END,
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) - NOTE_INSN_BIAS])
+ (note_insn_name[(NOTE_CODE) - (int) NOTE_INSN_BIAS])
/* The name of a label, in case it corresponds to an explicit label
in the input source code. */
#define CONTAINING_INSN(RTX) XCEXP(RTX, 2, LABEL_REF)
-/* For a REG rtx, REGNO extracts the register number. */
+/* For a REG rtx, REGNO extracts the register number. ORIGINAL_REGNO holds
+ the number the register originally had; for a pseudo register turned into
+ a hard reg this will hold the old pseudo register number. */
#define REGNO(RTX) XCUINT(RTX, 0, REG)
+#define ORIGINAL_REGNO(RTX) X0UINT(RTX, 1)
/* For a REG rtx, REG_FUNCTION_VALUE_P is nonzero if the reg
is the current function's return value. */
/* 1 in a REG rtx if it corresponds to a variable declared by the user. */
#define REG_USERVAR_P(RTX) ((RTX)->volatil)
+/* 1 in a REG rtx if the register is a pointer. */
+#define REG_POINTER(RTX) ((RTX)->frame_related)
+
+/* 1 if the given register REG corresponds to a hard register. */
+#define HARD_REGISTER_P(REG) (HARD_REGISTER_NUM_P (REGNO (REG)))
+
+/* 1 if the given register number REG_NO corresponds to a hard register. */
+#define HARD_REGISTER_NUM_P(REG_NO) (REG_NO < FIRST_PSEUDO_REGISTER)
+
/* For a CONST_INT rtx, INTVAL extracts the integer. */
#define INTVAL(RTX) XCWINT(RTX, 0, CONST_INT)
+/* For a CONST_DOUBLE:
+ The usual two ints that hold the value.
+ For a DImode, that is all there are;
+ and CONST_DOUBLE_LOW is the low-order word and ..._HIGH the high-order.
+ For a float, the number of ints varies,
+ and CONST_DOUBLE_LOW is the one that should come first *in memory*.
+ So use &CONST_DOUBLE_LOW(r) as the address of an array of ints. */
+#define CONST_DOUBLE_LOW(r) XCWINT (r, 2, CONST_DOUBLE)
+#define CONST_DOUBLE_HIGH(r) XCWINT (r, 3, CONST_DOUBLE)
+
+/* Link for chain of all CONST_DOUBLEs in use in current function. */
+#define CONST_DOUBLE_CHAIN(r) XCEXP (r, 1, CONST_DOUBLE)
+/* The MEM which represents this CONST_DOUBLE's value in memory,
+ or const0_rtx if no MEM has been made for it yet,
+ or cc0_rtx if it is not on the chain. */
+#define CONST_DOUBLE_MEM(r) XCEXP (r, 0, CONST_DOUBLE)
+
/* For a SUBREG rtx, SUBREG_REG extracts the value we want a subreg of.
- SUBREG_WORD extracts the word-number. */
+ SUBREG_BYTE extracts the byte-number. */
#define SUBREG_REG(RTX) XCEXP(RTX, 0, SUBREG)
-#define SUBREG_WORD(RTX) XCUINT(RTX, 1, SUBREG)
+#define SUBREG_BYTE(RTX) XCUINT(RTX, 1, SUBREG)
+
+/* in rtlanal.c */
+extern unsigned int subreg_regno_offset PARAMS ((unsigned int,
+ enum machine_mode,
+ unsigned int,
+ enum machine_mode));
+extern unsigned int subreg_regno PARAMS ((rtx));
/* 1 if the REG contained in SUBREG_REG is already known to be
sign- or zero-extended from the mode of the SUBREG to the mode of
#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) \
/* For a MEM rtx, 1 if it refers to an aggregate, either to the
aggregate itself of to a field of the aggregate. If zero, RTX may
- or may not be such a refrence. */
+ or may not be such a reference. */
#define MEM_IN_STRUCT_P(RTX) ((RTX)->in_struct)
/* For a MEM rtx, 1 if it refers to a scalar. If zero, RTX may or may
/* 1 in a SYMBOL_REF if it addresses this function's constants pool. */
#define CONSTANT_POOL_ADDRESS_P(RTX) ((RTX)->unchanging)
+/* 1 in a SYMBOL_REF if it addresses this function's string constant pool. */
+#define STRING_POOL_ADDRESS_P(RTX) ((RTX)->frame_related)
+
/* Flag in a SYMBOL_REF for machine-specific purposes. */
#define SYMBOL_REF_FLAG(RTX) ((RTX)->volatil)
-/* 1 in a SYMBOL_REF if it represents a symbol which might have to change
- if its inlined or unrolled. */
-#define SYMBOL_REF_NEED_ADJUST(RTX) ((RTX)->in_struct)
-
/* 1 means a SYMBOL_REF has been the library function in emit_library_call. */
#define SYMBOL_REF_USED(RTX) ((RTX)->used)
+/* 1 means a SYMBOL_REF is weak. */
+#define SYMBOL_REF_WEAK(RTX) ((RTX)->integrated)
+
/* Define a macro to look for REG_INC notes,
but save time on machines where they never exist. */
#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
+
/* Some architectures do not have complete pre/post increment/decrement
instruction sets, or only move some modes efficiently. These macros
This is 1 until after the rtl generation pass. */
extern int rtx_equal_function_value_matters;
-/* Generally useful functions. */
-
-/* The following functions accept a wide integer argument. Rather than
- having to cast on every function call, we use a macro instead, that is
- defined here and in tree.h. */
+/* Nonzero when we are generating CONCATs. */
+extern int generating_concat_p;
-#ifndef exact_log2
-#define exact_log2(N) exact_log2_wide ((unsigned HOST_WIDE_INT) (N))
-#define floor_log2(N) floor_log2_wide ((unsigned HOST_WIDE_INT) (N))
-#endif
-extern int exact_log2_wide PARAMS ((unsigned HOST_WIDE_INT));
-extern int floor_log2_wide PARAMS ((unsigned HOST_WIDE_INT));
+/* Generally useful functions. */
/* In expmed.c */
extern int ceil_log2 PARAMS ((unsigned HOST_WIDE_INT));
#define plus_constant(X,C) plus_constant_wide (X, (HOST_WIDE_INT) (C))
-#define plus_constant_for_output(X,C) \
- plus_constant_for_output_wide (X, (HOST_WIDE_INT) (C))
+/* In builtins.c */
+extern rtx expand_builtin_expect_jump PARAMS ((tree, rtx, rtx));
/* In explow.c */
extern void set_stack_check_libfunc PARAMS ((rtx));
extern rtx plus_constant_for_output_wide PARAMS ((rtx, HOST_WIDE_INT));
extern void optimize_save_area_alloca PARAMS ((rtx));
+/* In emit-rtl.c */
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 char *oballoc PARAMS ((int));
-extern char *permalloc PARAMS ((int));
+/* In rtl.c */
extern rtx rtx_alloc PARAMS ((RTX_CODE));
extern rtvec rtvec_alloc PARAMS ((int));
-extern rtx copy_insn_1 PARAMS ((rtx));
-extern rtx copy_insn PARAMS ((rtx));
extern rtx copy_rtx PARAMS ((rtx));
+
+/* In emit-rtl.c */
extern rtx copy_rtx_if_shared PARAMS ((rtx));
+
+/* In rtl.c */
extern rtx copy_most_rtx PARAMS ((rtx, rtx));
extern rtx shallow_copy_rtx PARAMS ((rtx));
extern int rtx_equal_p PARAMS ((rtx, rtx));
+
+/* In emit-rtl.c */
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));
+
+/* In cse.c */
extern rtx gen_lowpart_if_possible PARAMS ((enum machine_mode, rtx));
+
+/* In emit-rtl.c */
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));
+
+/* In emit-rtl.c */
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 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 void push_to_full_sequence PARAMS ((rtx, rtx));
extern void end_full_sequence PARAMS ((rtx*, rtx*));
extern rtx gen_sequence PARAMS ((void));
+
+/* In varasm.c */
extern rtx immed_double_const PARAMS ((HOST_WIDE_INT, HOST_WIDE_INT, enum machine_mode));
extern rtx force_const_mem PARAMS ((enum machine_mode, rtx));
-extern rtx force_reg PARAMS ((enum machine_mode, rtx));
+
+/* In varasm.c */
extern rtx get_pool_constant PARAMS ((rtx));
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));
+
+/* In function.c */
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_temp PARAMS ((union tree_node *,
- int, int, int));
-extern rtx protect_from_queue PARAMS ((rtx, int));
-extern void emit_queue PARAMS ((void));
-extern rtx emit_move_insn PARAMS ((rtx, rtx));
+extern rtx assign_temp PARAMS ((tree, int, int, int));
+/* In emit-rtl.c */
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 next_label PARAMS ((rtx));
extern rtx next_cc0_user PARAMS ((rtx));
extern rtx prev_cc0_setter PARAMS ((rtx));
+
+/* In jump.c */
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 rtx find_equiv_reg PARAMS ((rtx, rtx, enum reg_class, int, short *, int, enum machine_mode));
-extern rtx squeeze_notes PARAMS ((rtx, rtx));
+extern void mark_jump_label PARAMS ((rtx, rtx, int));
+extern void cleanup_barriers PARAMS ((void));
+
+/* In jump.c */
+extern void squeeze_notes PARAMS ((rtx *, rtx *));
extern rtx delete_insn 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 adj_offsettable_operand PARAMS ((rtx, int));
+
+/* In recog.c */
+extern rtx *find_constant_term_loc PARAMS ((rtx *));
+
+/* In emit-rtl.c */
extern rtx try_split PARAMS ((rtx, rtx, int));
+extern int split_branch_probability;
+
+/* In unknown file */
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));
+
+/* In simplify-rtx.c */
+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 gen_move_insn PARAMS ((rtx, rtx));
-extern rtx gen_jump PARAMS ((rtx));
-extern rtx gen_beq PARAMS ((rtx));
-extern rtx gen_bge PARAMS ((rtx));
-extern rtx gen_ble PARAMS ((rtx));
-extern rtx gen_mem_addressof PARAMS ((rtx, union tree_node *));
-extern rtx eliminate_constant_term PARAMS ((rtx, rtx *));
-extern rtx expand_complex_abs PARAMS ((enum machine_mode, rtx, rtx,
- int));
+extern rtx avoid_constant_pool_reference PARAMS ((rtx));
+
+/* In function.c */
+extern rtx gen_mem_addressof PARAMS ((rtx, tree));
+
+/* In regclass.c */
extern enum machine_mode choose_hard_reg_mode PARAMS ((unsigned int,
unsigned int));
+
+/* In emit-rtl.c */
extern void set_unique_reg_note PARAMS ((rtx, enum reg_note, rtx));
/* Functions in rtlanal.c */
+/* Single set is implemented as macro for performance reasons. */
+#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));
-extern int rtx_addr_varies_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 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_dependant_p PARAMS ((rtx, rtx));
+extern int insn_dependent_p PARAMS ((rtx, rtx));
extern int reg_set_p PARAMS ((rtx, rtx));
-extern rtx single_set PARAMS ((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 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));
/* flow.c */
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];
extern rtx gen_rtx_CONST_DOUBLE PARAMS ((enum machine_mode, rtx,
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));
+
/* We need the cast here to ensure that we get the same result both with
and without prototypes. */
#define GEN_INT(N) gen_rtx_CONST_INT (VOIDmode, (HOST_WIDE_INT) (N))
#define LAST_VIRTUAL_REGISTER ((FIRST_VIRTUAL_REGISTER) + 4)
+/* REGNUM never really appearing in the INSN stream. */
+#define INVALID_REGNUM (~(unsigned int)0)
+
extern rtx find_next_ref PARAMS ((rtx, rtx));
-extern rtx *find_single_use PARAMS ((rtx, rtx, rtx *));
-extern rtx output_constant_def PARAMS ((union tree_node *));
-extern rtx immed_real_const PARAMS ((union tree_node *));
-extern union tree_node *make_tree PARAMS ((union tree_node *, rtx));
+extern rtx output_constant_def PARAMS ((tree, int));
+extern rtx immed_real_const PARAMS ((tree));
/* Define a default value for STORE_FLAG_VALUE. */
extern int rtx_to_tree_code PARAMS ((enum rtx_code));
/* In tree.c */
-extern void obfree PARAMS ((char *));
struct obstack;
extern void gcc_obstack_init PARAMS ((struct obstack *));
-extern void pop_obstacks PARAMS ((void));
-extern void push_obstacks PARAMS ((struct obstack *,
- struct obstack *));
+
/* In cse.c */
struct cse_basic_block_data;
+
+/* Return the right cost to give to an operation
+ to make the cost of the corresponding register-to-register instruction
+ N times that of a fast register-to-register instruction. */
+#define COSTS_N_INSNS(N) ((N) * 4)
+
+/* Maximum cost of a rtl expression. This value has the special meaning
+ not to use an rtx with this cost under any circumstances. */
+#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));
+extern void delete_trivially_dead_insns PARAMS ((rtx, int, int));
#ifdef BUFSIZ
extern int cse_main PARAMS ((rtx, int, int, FILE *));
#endif
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 true_regnum PARAMS ((rtx));
extern int redirect_jump_1 PARAMS ((rtx, rtx));
extern int redirect_jump PARAMS ((rtx, rtx, int));
-extern void jump_optimize PARAMS ((rtx, int, int, int));
-extern void jump_optimize_minimal PARAMS ((rtx));
extern void rebuild_jump_labels PARAMS ((rtx));
extern void thread_jumps PARAMS ((rtx, int, int));
extern int rtx_equal_for_thread_p PARAMS ((rtx, rtx, rtx));
extern int can_reverse_comparison_p PARAMS ((rtx, 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));
-
-/* Flags for jump_optimize() */
-#define JUMP_CROSS_JUMP 1
-#define JUMP_CROSS_JUMP_DEATH_MATTERS 2
-#define JUMP_NOOP_MOVES 1
-#define JUMP_AFTER_REGSCAN 1
+extern void purge_line_number_notes PARAMS ((rtx));
+extern void copy_loop_headers PARAMS ((rtx));
/* In emit-rtl.c. */
extern int max_reg_num PARAMS ((void));
extern void renumber_insns PARAMS ((FILE *));
extern void remove_unnecessary_notes PARAMS ((void));
-/* In insn-emit.c */
-extern void add_clobbers PARAMS ((rtx, int));
-
/* In combine.c */
extern int combine_instructions PARAMS ((rtx, unsigned int));
extern unsigned int extended_count PARAMS ((rtx, enum machine_mode, int));
/* In sched.c. */
#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 *));
/* In print-rtl.c */
+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_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 thread_prologue_and_epilogue_insns PARAMS ((rtx));
extern int prologue_epilogue_contains PARAMS ((rtx));
extern int sibcall_epilogue_contains PARAMS ((rtx));
-extern HOST_WIDE_INT get_frame_size PARAMS ((void));
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));
-
-/* In reload.c */
-extern int operands_match_p PARAMS ((rtx, rtx));
-extern int safe_from_earlyclobber PARAMS ((rtx, rtx));
+extern void purge_hard_subreg_sets PARAMS ((rtx));
/* In stmt.c */
extern void set_file_and_line_for_stmt PARAMS ((const char *, int));
extern int preserve_subexpressions_p PARAMS ((void));
/* In expr.c */
-extern void init_expr_once PARAMS ((void));
extern void move_by_pieces PARAMS ((rtx, rtx,
unsigned HOST_WIDE_INT,
unsigned int));
/* In flow.c */
-extern void allocate_bb_life_data PARAMS ((void));
-extern void allocate_reg_life_data PARAMS ((void));
extern void recompute_reg_usage PARAMS ((rtx, int));
#ifdef BUFSIZ
extern void print_rtl_with_bb PARAMS ((FILE *, rtx));
extern void dbr_schedule PARAMS ((rtx, FILE *));
#endif
-/* In optabs.c */
-extern void init_optabs PARAMS ((void));
-
/* In local-alloc.c */
#ifdef BUFSIZ
extern void dump_local_alloc PARAMS ((FILE *));
extern int local_alloc PARAMS ((void));
extern int function_invariant_p PARAMS ((rtx));
-/* In reload1.c */
-extern void reload_cse_regs PARAMS ((rtx));
-extern void init_reload PARAMS ((void));
-extern void mark_home_live PARAMS ((int));
-#ifdef BUFSIZ
-extern int reload PARAMS ((rtx, int, FILE *));
-#endif
-
-/* In caller-save.c */
-extern void init_caller_save PARAMS ((void));
-
/* In profile.c */
extern void init_branch_prob PARAMS ((const char *));
extern void branch_prob PARAMS ((void));
HOST_WIDE_INT *));
/* In calls.c */
-extern void emit_library_call PARAMS ((rtx, int, enum machine_mode,
- int, ...));
-extern rtx emit_library_call_value PARAMS ((rtx, rtx, int,
- enum machine_mode,
- 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
+};
+
+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,
+ ...));
/* In unroll.c */
extern int set_dominates_use PARAMS ((int, int, int, rtx, rtx));
/* In varasm.c */
-extern void bss_section PARAMS ((void));
extern int in_data_section PARAMS ((void));
-extern int supports_one_only PARAMS ((void));
extern void init_varasm_once PARAMS ((void));
/* In rtl.c */
extern void init_rtl PARAMS ((void));
-extern void rtx_free PARAMS ((rtx));
+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 *));
#define abort() fancy_abort (__FILE__, __LINE__, __FUNCTION__)
/* In alias.c */
+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 (*)(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 init_alias_analysis PARAMS ((void));
extern void end_alias_analysis PARAMS ((void));
extern rtx addr_side_effect_eval PARAMS ((rtx, int, int));
+extern void set_mem_alias_set PARAMS ((rtx, HOST_WIDE_INT));
/* In sibcall.c */
typedef enum {
/* In regrename.c */
extern void regrename_optimize PARAMS ((void));
-/* In condexec.c */
+/* In ifcvt.c */
extern void if_convert PARAMS ((int));
-#endif /* _RTL_H */
+/* In predict.c */
+extern void invert_br_probabilities PARAMS ((rtx));
+extern bool expensive_function_p PARAMS ((int));
+#endif /* ! GCC_RTL_H */