X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Frtl.h;h=733f88145bab2de276c5496f8c4a837b516f4e20;hb=924d43beb3709488f19f58a401c225db42ab0be6;hp=a49029ed14a53cd57474adda0562a814bde2f3ad;hpb=4023cea710db4a4b90f0f9c0e3105a298e9d06fc;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/rtl.h b/gcc/rtl.h index a49029ed14a..733f88145ba 100644 --- a/gcc/rtl.h +++ b/gcc/rtl.h @@ -1,5 +1,5 @@ /* Register Transfer Language (RTL) definitions for GNU C-Compiler - Copyright (C) 1987, 1991 Free Software Foundation, Inc. + Copyright (C) 1987, 91-95, 1996 Free Software Foundation, Inc. This file is part of GNU CC. @@ -15,13 +15,20 @@ 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, 675 Mass Ave, Cambridge, MA 02139, USA. */ +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ #include "machmode.h" #undef FFS /* Some systems predefine this symbol; don't let it interfere. */ #undef FLOAT /* Likewise. */ +#undef ABS /* Likewise. */ +#undef PC /* Likewise. */ + +#ifndef TREE_CODE +union tree_node; +#endif /* Register Transfer Language EXPRESSIONS CODES */ @@ -40,21 +47,22 @@ enum rtx_code { /* The cast here, saves many elsewhere. */ extern int rtx_length[]; -#define GET_RTX_LENGTH(CODE) (rtx_length[(int)(CODE)]) +#define GET_RTX_LENGTH(CODE) (rtx_length[(int) (CODE)]) extern char *rtx_name[]; -#define GET_RTX_NAME(CODE) (rtx_name[(int)(CODE)]) +#define GET_RTX_NAME(CODE) (rtx_name[(int) (CODE)]) extern char *rtx_format[]; -#define GET_RTX_FORMAT(CODE) (rtx_format[(int)(CODE)]) +#define GET_RTX_FORMAT(CODE) (rtx_format[(int) (CODE)]) extern char rtx_class[]; -#define GET_RTX_CLASS(CODE) (rtx_class[(int)(CODE)]) +#define GET_RTX_CLASS(CODE) (rtx_class[(int) (CODE)]) /* Common union for an element of an rtx. */ typedef union rtunion_def { + HOST_WIDE_INT rtwint; int rtint; char *rtstr; struct rtx_def *rtx; @@ -67,7 +75,11 @@ typedef union rtunion_def typedef struct rtx_def { #ifdef ONLY_INT_FIELDS +#ifdef CODE_FIELD_BUG + unsigned int code : 16; +#else unsigned short code; +#endif #else /* The kind of expression this is. */ enum rtx_code code : 16; @@ -86,6 +98,7 @@ typedef struct rtx_def /* 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 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. 1 in a CALL_INSN if it is a const call. @@ -97,12 +110,15 @@ typedef struct rtx_def if it is deleted. 1 in a REG expression if corresponds to a variable declared by the user. 0 for an internally generated temporary. - In a SYMBOL_REF, this flag is used for machine-specific purposes. */ + In a SYMBOL_REF, this flag is used for machine-specific purposes. + In a LABEL_REF or in a REG_LABEL note, this is LABEL_REF_NONLOCAL_P. */ unsigned int volatil : 1; /* 1 in a MEM referring to a field of a structure (not a union!). 0 if the MEM was a variable or the result of a * operator in C; 1 if it was the result of a . or -> operator (on a struct) in C. 1 in a REG if the register is used only in exit code a loop. + 1 in a SUBREG expression if was generated from a variable with a + promoted mode. 1 in a CODE_LABEL if the label is used for nonlocal gotos and must not be deleted even if its count is zero. 1 in a LABEL_REF if this is a reference to a label outside the @@ -130,6 +146,8 @@ typedef struct rtx_def rtunion fld[1]; } *rtx; +#include "gansidecl.h" + #define NULL_RTX (rtx) 0 /* Define macros to access the `code' field of the rtx. */ @@ -179,6 +197,7 @@ typedef struct rtvec_def{ #define XEXP(RTX, N) ((RTX)->fld[N].rtx) #define XINT(RTX, N) ((RTX)->fld[N].rtint) +#define XWINT(RTX, N) ((RTX)->fld[N].rtwint) #define XSTR(RTX, N) ((RTX)->fld[N].rtstr) #define XVEC(RTX, N) ((RTX)->fld[N].rtvec) #define XVECLEN(RTX, N) ((RTX)->fld[N].rtvec->num_elem) @@ -292,7 +311,16 @@ enum reg_note { REG_DEAD = 1, REG_INC = 2, REG_EQUIV = 3, REG_WAS_0 = 4, /* Names for REG_NOTE's in EXPR_LIST insn's. */ extern char *reg_note_name[]; -#define GET_REG_NOTE_NAME(MODE) (reg_note_name[(int)(MODE)]) +#define GET_REG_NOTE_NAME(MODE) (reg_note_name[(int) (MODE)]) + +/* This field is only present on CALL_INSNs. It holds a chain of EXPR_LIST of + USE and CLOBBER expressions. + USE expressions list the registers filled with arguments that + are passed to the function. + CLOBBER expressions document the registers explicitly clobbered + by this CALL_INSN. + Pseudo registers can not be mentioned in this list. */ +#define CALL_INSN_FUNCTION_USAGE(INSN) ((INSN)->fld[7].rtx) /* The label-number of a code-label. The assembler label is made from `L' and the label-number printed in decimal. @@ -302,20 +330,30 @@ extern char *reg_note_name[]; #define LINE_NUMBER NOTE /* In a NOTE that is a line number, this is a string for the file name - that the line is in. */ + that the line is in. We use the same field to record block numbers + temporarily in NOTE_INSN_BLOCK_BEG and NOTE_INSN_BLOCK_END notes. + (We avoid lots of casts between ints and pointers if we use a + different macro for the bock number.) */ #define NOTE_SOURCE_FILE(INSN) ((INSN)->fld[3].rtstr) +#define NOTE_BLOCK_NUMBER(INSN) ((INSN)->fld[3].rtint) /* In a NOTE that is a line number, this is the line number. Other kinds of NOTEs are identified by negative numbers here. */ #define NOTE_LINE_NUMBER(INSN) ((INSN)->fld[4].rtint) /* Codes that appear in the NOTE_LINE_NUMBER field - for kinds of notes that are not line numbers. */ + for kinds of notes that are not line numbers. -/* This note indicates the end of the real body of the function, - after moving the parms into their homes, etc. */ -#define NOTE_INSN_FUNCTION_BEG 0 + Notice that we do not try to use zero here for any of + the special note codes because sometimes the source line + actually can be zero! This happens (for example) when we + are generating code for the per-translation-unit constructor + and destructor routines for some C++ translation unit. + + If you should change any of the following values, or if you + should add a new value here, don't forget to change the + note_insn_name array in rtl.c. */ /* This note is used to get rid of an insn when it isn't safe to patch the insn out of the chain. */ @@ -336,13 +374,28 @@ extern char *reg_note_name[]; #define NOTE_INSN_LOOP_CONT -8 /* Generated at the start of a duplicated exit test. */ #define NOTE_INSN_LOOP_VTOP -9 -/* Don't forget to change note_insn_name in rtl.c. */ - +/* This marks the point immediately after the last prologue insn. */ +#define NOTE_INSN_PROLOGUE_END -10 +/* This marks the point immediately prior to the first epilogue insn. */ +#define NOTE_INSN_EPILOGUE_BEG -11 +/* Generated in place of user-declared labels when they are deleted. */ +#define NOTE_INSN_DELETED_LABEL -12 +/* This note indicates the start of the real body of the function, + i.e. the point just after all of the parms have been moved into + their homes, etc. */ +#define NOTE_INSN_FUNCTION_BEG -13 +/* These note where exception handling regions begin and end. */ +#define NOTE_INSN_EH_REGION_BEG -14 +#define NOTE_INSN_EH_REGION_END -15 + + +#if 0 /* These are not used, and I don't know what they were for. --rms. */ #define NOTE_DECL_NAME(INSN) ((INSN)->fld[3].rtstr) #define NOTE_DECL_CODE(INSN) ((INSN)->fld[4].rtint) #define NOTE_DECL_RTL(INSN) ((INSN)->fld[5].rtx) #define NOTE_DECL_IDENTIFIER(INSN) ((INSN)->fld[6].rtint) #define NOTE_DECL_TYPE(INSN) ((INSN)->fld[7].rtint) +#endif /* 0 */ /* Names for NOTE insn's other than line numbers. */ @@ -357,6 +410,17 @@ extern char *note_insn_name[]; of LABEL_REFs that point at it, so unused labels can be deleted. */ #define LABEL_NUSES(LABEL) ((LABEL)->fld[5].rtint) +/* The rest is used instead of the above, in a CODE_LABEL, + if bytecode is being output. + We make the slightly kludgy assumption that a LABEL has enough slots + to hold these things. That happens to be true. */ + +/* For static or external objects. */ +#define BYTECODE_LABEL(X) (XEXP ((X), 0)) + +/* For goto labels inside bytecode functions. */ +#define BYTECODE_BC_LABEL(X) (*(struct bc_label **) &XEXP ((X), 1)) + /* In jump.c, each JUMP_INSN can point to a label that it can jump to, so that if the JUMP_INSN is deleted, the label's LABEL_NUSES can be decremented and possibly the label can be deleted. */ @@ -393,7 +457,7 @@ extern char *note_insn_name[]; /* For a CONST_INT rtx, INTVAL extracts the integer. */ -#define INTVAL(RTX) ((RTX)->fld[0].rtint) +#define INTVAL(RTX) ((RTX)->fld[0].rtwint) /* For a SUBREG rtx, SUBREG_REG extracts the value we want a subreg of. SUBREG_WORD extracts the word-number. */ @@ -401,6 +465,17 @@ extern char *note_insn_name[]; #define SUBREG_REG(RTX) ((RTX)->fld[0].rtx) #define SUBREG_WORD(RTX) ((RTX)->fld[1].rtint) +/* 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 + the reg. SUBREG_PROMOTED_UNSIGNED_P gives the signedness of the + extension. + + When used as a LHS, is means that this extension must be done + when assigning to SUBREG_REG. */ + +#define SUBREG_PROMOTED_VAR_P(RTX) ((RTX)->in_struct) +#define SUBREG_PROMOTED_UNSIGNED_P(RTX) ((RTX)->unchanging) + /* Access various components of an ASM_OPERANDS rtx. */ #define ASM_OPERANDS_TEMPLATE(RTX) XSTR ((RTX), 0) @@ -426,6 +501,10 @@ extern char *note_insn_name[]; loop containing the reference. */ #define LABEL_OUTSIDE_LOOP_P(RTX) ((RTX)->in_struct) +/* For a LABEL_REF, 1 means it is for a nonlocal label. */ +/* Likewise in an EXPR_LIST for a REG_LABEL note. */ +#define LABEL_REF_NONLOCAL_P(RTX) ((RTX)->volatil) + /* For a CODE_LABEL, 1 means always consider this label to be needed. */ #define LABEL_PRESERVE_P(RTX) ((RTX)->in_struct) @@ -436,6 +515,16 @@ extern char *note_insn_name[]; with the preceding insn. */ #define SCHED_GROUP_P(INSN) ((INSN)->in_struct) +/* During sched, for the LOG_LINKS of an insn, these cache the adjusted + cost of the dependence link. The cost of executing an instruction + may vary based on how the results are used. LINK_COST_ZERO is 1 when + the cost through the link varies and is unchanged (i.e., the link has + zero additional cost). LINK_COST_FREE is 1 when the cost through the + link is zero (i.e., the link makes the cost free). In other cases, + the adjustment to the cost is recomputed each time it is needed. */ +#define LINK_COST_ZERO(X) ((X)->jump) +#define LINK_COST_FREE(X) ((X)->call) + /* For a SET rtx, SET_DEST is the place that is set and SET_SRC is the value it is set to. */ #define SET_DEST(RTX) ((RTX)->fld[0].rtx) @@ -465,12 +554,15 @@ extern char *note_insn_name[]; FUNCTION_ARGS_SIZE is the size of the argument block in the stack. POPS_ARGS is the number of bytes of input arguments popped by the function STACK_SLOT_LIST is the list of stack slots. + FORCED_LABELS is the list of labels whose address was taken. FUNCTION_FLAGS are where single-bit flags are saved. OUTGOING_ARGS_SIZE is the size of the largest outgoing stack parameter list. ORIGINAL_ARG_VECTOR is a vector of the original DECL_RTX values for the function arguments. ORIGINAL_DECL_INITIAL is a pointer to the original DECL_INITIAL for the function. + INLINE_REGNO_REG_RTX, INLINE_REGNO_POINTER_FLAG, and + INLINE_REGNO_POINTER_ALIGN are pointers to the corresponding arrays. We want this to lay down like an INSN. The PREV_INSN field is always NULL. The NEXT_INSN field always points to the @@ -485,10 +577,14 @@ extern char *note_insn_name[]; #define FUNCTION_ARGS_SIZE(RTX) ((RTX)->fld[8].rtint) #define POPS_ARGS(RTX) ((RTX)->fld[9].rtint) #define STACK_SLOT_LIST(RTX) ((RTX)->fld[10].rtx) -#define FUNCTION_FLAGS(RTX) ((RTX)->fld[11].rtint) -#define OUTGOING_ARGS_SIZE(RTX) ((RTX)->fld[12].rtint) -#define ORIGINAL_ARG_VECTOR(RTX) ((RTX)->fld[13].rtvec) -#define ORIGINAL_DECL_INITIAL(RTX) ((RTX)->fld[14].rtx) +#define FORCED_LABELS(RTX) ((RTX)->fld[11].rtx) +#define FUNCTION_FLAGS(RTX) ((RTX)->fld[12].rtint) +#define OUTGOING_ARGS_SIZE(RTX) ((RTX)->fld[13].rtint) +#define ORIGINAL_ARG_VECTOR(RTX) ((RTX)->fld[14].rtvec) +#define ORIGINAL_DECL_INITIAL(RTX) ((RTX)->fld[15].rtx) +#define INLINE_REGNO_REG_RTX(RTX) ((RTX)->fld[16].rtvec) +#define INLINE_REGNO_POINTER_FLAG(RTX) ((RTX)->fld[17].rtstr) +#define INLINE_REGNO_POINTER_ALIGN(RTX) ((RTX)->fld[18].rtstr) /* In FUNCTION_FLAGS we save some variables computed when emitting the code for the function and which must be `or'ed into the current flag values when @@ -526,109 +622,166 @@ extern char *note_insn_name[]; /* Generally useful functions. */ -extern rtx rtx_alloc (); -extern rtvec rtvec_alloc (); -extern rtx find_reg_note (); -extern rtx find_regno_note (); -extern int get_integer_term (); -extern rtx get_related_value (); -extern rtx single_set (); -extern rtx find_last_value (); -extern rtx gen_rtx (); -extern rtx copy_rtx (); -extern rtx copy_rtx_if_shared (); -extern rtx copy_most_rtx (); -extern rtx replace_rtx (); -extern rtvec gen_rtvec (); -extern rtvec gen_rtvec_v (); -extern rtx read_rtx (); -extern rtx gen_reg_rtx (); -extern rtx gen_label_rtx (); -extern rtx gen_inline_header_rtx (); -extern rtx gen_lowpart_common (); -extern rtx gen_lowpart (); -extern rtx gen_lowpart_if_possible (); -extern rtx operand_subword (); -extern rtx operand_subword_force (); -extern int subreg_lowpart_p (); -extern rtx make_safe_from (); -extern rtx memory_address (); -extern rtx get_insns (); -extern rtx get_last_insn (); -extern rtx get_last_insn_anywhere (); -extern void start_sequence (); -extern void push_to_sequence (); -extern void end_sequence (); -extern rtx gen_sequence (); -extern rtx expand_expr (); -extern rtx output_constant_def (); -extern rtx immed_real_const (); -extern rtx immed_real_const_1 (); -extern rtx immed_double_const (); -extern rtx force_const_mem (); -extern rtx get_pool_constant (); -extern enum machine_mode get_pool_mode (); -extern int get_pool_offset (); -extern rtx get_parm_real_loc (); -extern rtx assign_stack_local (); -extern rtx assign_stack_temp (); -extern rtx protect_from_queue (); -extern void emit_queue (); -extern rtx emit_move_insn (); -extern rtx emit_insn_before (); -extern rtx emit_jump_insn_before (); -extern rtx emit_call_insn_before (); -extern rtx emit_barrier_before (); -extern rtx emit_note_before (); -extern rtx emit_insn_after (); -extern rtx emit_jump_insn_after (); -extern rtx emit_barrier_after (); -extern rtx emit_label_after (); -extern rtx emit_note_after (); -extern rtx emit_line_note_after (); -extern rtx emit_insn (); -extern rtx emit_insns (); -extern rtx emit_insns_before (); -extern rtx emit_jump_insn (); -extern rtx emit_call_insn (); -extern rtx emit_label (); -extern rtx emit_barrier (); -extern rtx emit_line_note (); -extern rtx emit_note (); -extern rtx emit_line_note_force (); -extern rtx make_insn_raw (); -extern rtx previous_insn (); -extern rtx next_insn (); -extern rtx prev_nonnote_insn (); -extern rtx next_nonnote_insn (); -extern rtx prev_real_insn (); -extern rtx next_real_insn (); -extern rtx prev_active_insn (); -extern rtx next_active_insn (); -extern rtx prev_label (); -extern rtx next_label (); -extern rtx next_cc0_user (); -extern rtx prev_cc0_setter (); -extern rtx reg_set_last (); -extern rtx next_nondeleted_insn (); -extern enum rtx_code reverse_condition (); -extern enum rtx_code swap_condition (); -extern enum rtx_code unsigned_condition (); -extern enum rtx_code signed_condition (); -extern rtx plus_constant (), plus_constant_for_output (); -extern rtx find_equiv_reg (); -extern rtx squeeze_notes (); -extern rtx delete_insn (); -extern void delete_jump (); -extern rtx get_label_before (); -extern rtx get_label_after (); -extern rtx follow_jumps (); -extern rtx adj_offsettable_operand (); -extern rtx try_split (); -extern rtx split_insns (); -extern rtx simplify_unary_operation (), simplify_binary_operation (); -extern rtx simplify_ternary_operation (), simplify_relational_operation (); -extern rtx nonlocal_label_rtx_list (); +/* 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. */ + +#ifndef exact_log2 +#define exact_log2(N) exact_log2_wide ((HOST_WIDE_INT) (N)) +#define floor_log2(N) floor_log2_wide ((HOST_WIDE_INT) (N)) +#endif + +#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)) + +extern rtx plus_constant_wide PROTO((rtx, HOST_WIDE_INT)); +extern rtx plus_constant_for_output_wide PROTO((rtx, HOST_WIDE_INT)); + +#define GEN_INT(N) gen_rtx (CONST_INT, VOIDmode, (HOST_WIDE_INT) (N)) + +extern rtx bc_gen_rtx (); + +extern rtx gen_rtx PVPROTO((enum rtx_code, + enum machine_mode, ...)); +extern rtvec gen_rtvec PVPROTO((int, ...)); + +extern rtx read_rtx STDIO_PROTO((FILE *)); + +#if 0 +/* At present, don't prototype xrealloc, since all of the callers don't + cast their pointers to char *, and all of the xrealloc's don't use + void * yet. */ +extern char *xmalloc PROTO((size_t)); +extern char *xrealloc PROTO((void *, size_t)); +#else +extern char *xmalloc (); +extern char *xrealloc (); +#endif + +extern char *oballoc PROTO((int)); +extern char *permalloc PROTO((int)); +extern void free PROTO((void *)); +extern rtx rtx_alloc PROTO((RTX_CODE)); +extern rtvec rtvec_alloc PROTO((int)); +extern rtx find_reg_note PROTO((rtx, enum reg_note, rtx)); +extern rtx find_regno_note PROTO((rtx, enum reg_note, int)); +extern int find_reg_fusage PROTO((rtx, enum rtx_code, rtx)); +extern int find_regno_fusage PROTO((rtx, enum rtx_code, int)); +extern HOST_WIDE_INT get_integer_term PROTO((rtx)); +extern rtx get_related_value PROTO((rtx)); +extern rtx single_set PROTO((rtx)); +extern rtx find_last_value PROTO((rtx, rtx *, rtx)); +extern rtx copy_rtx PROTO((rtx)); +extern rtx copy_rtx_if_shared PROTO((rtx)); +extern rtx copy_most_rtx PROTO((rtx, rtx)); +extern rtx replace_rtx PROTO((rtx, rtx, rtx)); +extern rtvec gen_rtvec_v PROTO((int, rtx *)); +extern rtvec gen_rtvec_vv PROTO((int, rtunion *)); +extern rtx gen_reg_rtx PROTO((enum machine_mode)); +extern rtx gen_label_rtx PROTO((void)); +extern rtx gen_inline_header_rtx PROTO((rtx, rtx, int, int, int, int, + int, int, rtx, rtx, int, int, + rtvec, rtx, + rtvec, char *, char *)); +extern rtx gen_lowpart_common PROTO((enum machine_mode, rtx)); +extern rtx gen_lowpart PROTO((enum machine_mode, rtx)); +extern rtx gen_lowpart_if_possible PROTO((enum machine_mode, rtx)); +extern rtx gen_highpart PROTO((enum machine_mode, rtx)); +extern rtx gen_realpart PROTO((enum machine_mode, rtx)); +extern rtx gen_imagpart PROTO((enum machine_mode, rtx)); +extern rtx operand_subword PROTO((rtx, int, int, enum machine_mode)); +extern rtx operand_subword_force PROTO((rtx, int, enum machine_mode)); +extern int subreg_lowpart_p PROTO((rtx)); +extern rtx make_safe_from PROTO((rtx, rtx)); +extern rtx convert_memory_address PROTO((enum machine_mode, rtx)); +extern rtx memory_address PROTO((enum machine_mode, rtx)); +extern rtx get_insns PROTO((void)); +extern rtx get_last_insn PROTO((void)); +extern rtx get_last_insn_anywhere PROTO((void)); +extern void start_sequence PROTO((void)); +extern void push_to_sequence PROTO((rtx)); +extern void end_sequence PROTO((void)); +extern rtx gen_sequence PROTO((void)); +extern rtx immed_double_const PROTO((HOST_WIDE_INT, HOST_WIDE_INT, enum machine_mode)); +extern rtx force_const_mem PROTO((enum machine_mode, rtx)); +extern rtx force_reg PROTO((enum machine_mode, rtx)); +extern rtx get_pool_constant PROTO((rtx)); +extern enum machine_mode get_pool_mode PROTO((rtx)); +extern int get_pool_offset PROTO((rtx)); +extern rtx simplify_subtraction PROTO((rtx)); +extern rtx assign_stack_local PROTO((enum machine_mode, int, int)); +extern rtx assign_stack_temp PROTO((enum machine_mode, int, int)); +extern rtx assign_temp PROTO((union tree_node *, int, + int, int)); +extern rtx protect_from_queue PROTO((rtx, int)); +extern void emit_queue PROTO((void)); +extern rtx emit_move_insn PROTO((rtx, rtx)); +extern rtx emit_insn_before PROTO((rtx, rtx)); +extern rtx emit_jump_insn_before PROTO((rtx, rtx)); +extern rtx emit_call_insn_before PROTO((rtx, rtx)); +extern rtx emit_barrier_before PROTO((rtx)); +extern rtx emit_note_before PROTO((int, rtx)); +extern rtx emit_insn_after PROTO((rtx, rtx)); +extern rtx emit_jump_insn_after PROTO((rtx, rtx)); +extern rtx emit_barrier_after PROTO((rtx)); +extern rtx emit_label_after PROTO((rtx, rtx)); +extern rtx emit_note_after PROTO((int, rtx)); +extern rtx emit_line_note_after PROTO((char *, int, rtx)); +extern rtx emit_insn PROTO((rtx)); +extern rtx emit_insns PROTO((rtx)); +extern rtx emit_insns_before PROTO((rtx, rtx)); +extern rtx emit_insns_after PROTO((rtx, rtx)); +extern rtx emit_jump_insn PROTO((rtx)); +extern rtx emit_call_insn PROTO((rtx)); +extern rtx emit_label PROTO((rtx)); +extern rtx emit_barrier PROTO((void)); +extern rtx emit_line_note PROTO((char *, int)); +extern rtx emit_note PROTO((char *, int)); +extern rtx emit_line_note_force PROTO((char *, int)); +extern rtx make_insn_raw PROTO((rtx)); +extern rtx previous_insn PROTO((rtx)); +extern rtx next_insn PROTO((rtx)); +extern rtx prev_nonnote_insn PROTO((rtx)); +extern rtx next_nonnote_insn PROTO((rtx)); +extern rtx prev_real_insn PROTO((rtx)); +extern rtx next_real_insn PROTO((rtx)); +extern rtx prev_active_insn PROTO((rtx)); +extern rtx next_active_insn PROTO((rtx)); +extern rtx prev_label PROTO((rtx)); +extern rtx next_label PROTO((rtx)); +extern rtx next_cc0_user PROTO((rtx)); +extern rtx prev_cc0_setter PROTO((rtx)); +extern rtx reg_set_last PROTO((rtx, rtx)); +extern rtx next_nondeleted_insn PROTO((rtx)); +extern enum rtx_code reverse_condition PROTO((enum rtx_code)); +extern enum rtx_code swap_condition PROTO((enum rtx_code)); +extern enum rtx_code unsigned_condition PROTO((enum rtx_code)); +extern enum rtx_code signed_condition PROTO((enum rtx_code)); +extern rtx find_equiv_reg PROTO((rtx, rtx, enum reg_class, int, short *, int, enum machine_mode)); +extern rtx squeeze_notes PROTO((rtx, rtx)); +extern rtx delete_insn PROTO((rtx)); +extern void delete_jump PROTO((rtx)); +extern rtx get_label_before PROTO((rtx)); +extern rtx get_label_after PROTO((rtx)); +extern rtx follow_jumps PROTO((rtx)); +extern rtx adj_offsettable_operand PROTO((rtx, int)); +extern rtx try_split PROTO((rtx, rtx, int)); +extern rtx split_insns PROTO((rtx, rtx)); +extern rtx simplify_unary_operation PROTO((enum rtx_code, enum machine_mode, rtx, enum machine_mode)); +extern rtx simplify_binary_operation PROTO((enum rtx_code, enum machine_mode, rtx, rtx)); +extern rtx simplify_ternary_operation PROTO((enum rtx_code, enum machine_mode, enum machine_mode, rtx, rtx, rtx)); +extern rtx simplify_relational_operation PROTO((enum rtx_code, enum machine_mode, rtx, rtx)); +extern rtx nonlocal_label_rtx_list PROTO((void)); +extern rtx gen_move_insn PROTO((rtx, rtx)); +extern rtx gen_jump PROTO((rtx)); +extern rtx gen_beq PROTO((rtx)); +extern rtx gen_bge PROTO((rtx)); +extern rtx gen_ble PROTO((rtx)); +extern rtx eliminate_constant_term PROTO((rtx, rtx *)); +extern rtx expand_complex_abs PROTO((enum machine_mode, rtx, rtx, int)); +extern enum machine_mode choose_hard_reg_mode PROTO((int, int)); /* Maximum number of parallel sets and clobbers in any insn in this fn. Always at least 3, since the combiner could put that many togetherm @@ -636,16 +789,13 @@ extern rtx nonlocal_label_rtx_list (); extern int max_parallel; -extern int asm_noperands (); -extern char *decode_asm_operands (); +extern int asm_noperands PROTO((rtx)); +extern char *decode_asm_operands PROTO((rtx, rtx *, rtx **, char **, enum machine_mode *)); -#ifdef BITS_PER_WORD -/* Conditional is to detect when config.h has been included. */ -extern enum reg_class reg_preferred_class (); -extern enum reg_class reg_alternate_class (); -#endif +extern enum reg_class reg_preferred_class PROTO((int)); +extern enum reg_class reg_alternate_class PROTO((int)); -extern rtx get_first_nonparm_insn (); +extern rtx get_first_nonparm_insn PROTO((void)); /* Standard pieces of rtx, to be substituted directly into things. */ extern rtx pc_rtx; @@ -673,6 +823,7 @@ extern rtx const_tiny_rtx[3][(int) MAX_MACHINE_MODE]; go through these unique rtx objects. */ extern rtx stack_pointer_rtx; extern rtx frame_pointer_rtx; +extern rtx hard_frame_pointer_rtx; extern rtx arg_pointer_rtx; extern rtx pic_offset_table_rtx; extern rtx struct_value_rtx; @@ -680,6 +831,16 @@ extern rtx struct_value_incoming_rtx; extern rtx static_chain_rtx; extern rtx static_chain_incoming_rtx; +/* If HARD_FRAME_POINTER_REGNUM is defined, then a special dummy reg + is used to represent the frame pointer. This is because the + hard frame pointer and the automatic variables are separated by an amount + that cannot be determined until after register allocation. We can assume + that in this case ELIMINABLE_REGS will be defined, one action of which + will be to eliminate FRAME_POINTER_REGNUM into HARD_FRAME_POINTER_REGNUM. */ +#ifndef HARD_FRAME_POINTER_REGNUM +#define HARD_FRAME_POINTER_REGNUM FRAME_POINTER_REGNUM +#endif + /* Virtual registers are used during RTL generation to refer to locations into the stack frame when the actual location isn't known until RTL generation is complete. The routine instantiate_virtual_regs replaces these with @@ -696,7 +857,7 @@ extern rtx virtual_incoming_args_rtx; #define VIRTUAL_INCOMING_ARGS_REGNUM (FIRST_VIRTUAL_REGISTER) -/* If FRAME_GROWS_DOWNWARDS, this points to immediately above the first +/* If FRAME_GROWS_DOWNWARD, this points to immediately above the first variable on the stack. Otherwise, it points to the first variable on the stack. */ @@ -722,8 +883,21 @@ extern rtx virtual_outgoing_args_rtx; #define LAST_VIRTUAL_REGISTER ((FIRST_VIRTUAL_REGISTER) + 3) -extern rtx find_next_ref (); -extern rtx *find_single_use (); +extern rtx find_next_ref PROTO((rtx, rtx)); +extern rtx *find_single_use PROTO((rtx, rtx, rtx *)); + +/* It is hard to write the prototype for expand_expr, since it needs + expr.h to be included for the enumeration. */ + +extern rtx expand_expr (); + +extern rtx output_constant_def PROTO((union tree_node *)); +extern rtx immed_real_const PROTO((union tree_node *)); +extern union tree_node *make_tree PROTO((union tree_node *, rtx)); + +/* Abort routines */ +extern void fatal_insn_not_found PROTO((rtx)); +extern void fatal_insn PROTO((char *, rtx)); /* Define a default value for STORE_FLAG_VALUE. */ @@ -752,3 +926,14 @@ extern int cse_not_expected; /* Indexed by pseudo register number, gives the rtx for that pseudo. Allocated in parallel with regno_pointer_flag. */ extern rtx *regno_reg_rtx; + +/* Vector indexed by regno; contains the alignment in bytes for a + register that contains a pointer, if known. */ +extern char *regno_pointer_align; +#define REGNO_POINTER_ALIGN(REGNO) regno_pointer_align[REGNO] + +/* Translates rtx code to tree code, for those codes needed by + REAL_ARITHMETIC. The function returns an int because the caller may not + know what `enum tree_code' means. */ + +extern int rtx_to_tree_code PROTO((enum rtx_code));