X-Git-Url: http://git.sourceforge.jp/view?p=pf3gnuchains%2Fgcc-fork.git;a=blobdiff_plain;f=gcc%2Frtl.h;h=d076b1de4b44ed4140334f1c4cd308676c5c6e1e;hp=1968c88d34febc732a76dae4b0a9758e38bbdb5c;hb=89140b26d39e4c4ca40cced9acb7ab6c89ed7821;hpb=82880dfd5cfbedf5fd319d079e242d61b95fc57f diff --git a/gcc/rtl.h b/gcc/rtl.h index 1968c88d34f..d076b1de4b4 100644 --- a/gcc/rtl.h +++ b/gcc/rtl.h @@ -16,8 +16,8 @@ for more details. You should have received a copy of the GNU General Public License 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. */ +Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA +02110-1301, USA. */ #ifndef GCC_RTL_H #define GCC_RTL_H @@ -25,6 +25,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA #include "statistics.h" #include "machmode.h" #include "input.h" +#include "real.h" #undef FFS /* Some systems predefine this symbol; don't let it interfere. */ #undef FLOAT /* Likewise. */ @@ -90,8 +91,6 @@ enum rtx_class { #define RTX_COMMUTATIVE_MASK (~2) #define RTX_COMMUTATIVE_RESULT (RTX_COMM_COMPARE & RTX_COMMUTATIVE_MASK) #define RTX_NON_COMMUTATIVE_RESULT (RTX_COMPARE & RTX_COMMUTATIVE_MASK) -#define RTX_EXPR_FIRST (RTX_COMPARE) -#define RTX_EXPR_LAST (RTX_UNARY) extern const unsigned char rtx_length[NUM_RTX_CODE]; #define GET_RTX_LENGTH(CODE) (rtx_length[(int) (CODE)]) @@ -251,6 +250,7 @@ struct rtx_def GTY((chain_next ("RTX_NEXT (&%h)"), union u { rtunion fld[1]; HOST_WIDE_INT hwint[1]; + struct real_value rv; } GTY ((special ("rtx_def"), desc ("GET_CODE (&%0)"))) u; }; @@ -456,6 +456,20 @@ struct rtvec_def GTY(()) { __FUNCTION__); \ &_rtx->u.hwint[N]; })) +#define XCMWINT(RTX, N, C, M) __extension__ \ +(*({ rtx const _rtx = (RTX); \ + if (GET_CODE (_rtx) != (C) || GET_MODE (_rtx) != (M)) \ + rtl_check_failed_code_mode (_rtx, (C), (M), false, __FILE__, \ + __LINE__, __FUNCTION__); \ + &_rtx->u.hwint[N]; })) + +#define XCNMPRV(RTX, C, M) __extension__ \ +({ rtx const _rtx = (RTX); \ + if (GET_CODE (_rtx) != (C) || GET_MODE (_rtx) == (M)) \ + rtl_check_failed_code_mode (_rtx, (C), (M), true, __FILE__, \ + __LINE__, __FUNCTION__); \ + &_rtx->u.rv; }) + extern void rtl_check_failed_bounds (rtx, int, const char *, int, const char *) ATTRIBUTE_NORETURN; @@ -471,6 +485,9 @@ extern void rtl_check_failed_code1 (rtx, enum rtx_code, const char *, extern void rtl_check_failed_code2 (rtx, enum rtx_code, enum rtx_code, const char *, int, const char *) ATTRIBUTE_NORETURN; +extern void rtl_check_failed_code_mode (rtx, enum rtx_code, enum machine_mode, + bool, const char *, int, const char *) + ATTRIBUTE_NORETURN; extern void rtvec_check_failed_bounds (rtvec, int, const char *, int, const char *) ATTRIBUTE_NORETURN; @@ -484,6 +501,9 @@ extern void rtvec_check_failed_bounds (rtvec, int, const char *, int, #define RTVEC_ELT(RTVEC, I) ((RTVEC)->elem[I]) #define XWINT(RTX, N) ((RTX)->u.hwint[N]) #define XCWINT(RTX, N, C) ((RTX)->u.hwint[N]) +#define XCMWINT(RTX, N, C, M) ((RTX)->u.hwint[N]) +#define XCNMWINT(RTX, N, C, M) ((RTX)->u.hwint[N]) +#define XCNMPRV(RTX, C, M) (&(RTX)->u.rv) #endif @@ -581,19 +601,6 @@ extern void rtl_check_failed_flag (const char *, rtx, const char *, #define RTL_FLAG_CHECK8(NAME, RTX, C1, C2, C3, C4, C5, C6, C7, C8) (RTX) #endif -#define CLEAR_RTX_FLAGS(RTX) \ -do { \ - rtx const _rtx = (RTX); \ - _rtx->jump = 0; \ - _rtx->call = 0; \ - _rtx->unchanging = 0; \ - _rtx->volatil = 0; \ - _rtx->in_struct = 0; \ - _rtx->used = 0; \ - _rtx->frame_related = 0; \ - _rtx->return_val = 0; \ -} while (0) - #define XINT(RTX, N) (RTL_CHECK2 (RTX, N, 'i', 'n').rt_int) #define XSTR(RTX, N) (RTL_CHECK2 (RTX, N, 's', 'S').rt_str) #define XEXP(RTX, N) (RTL_CHECK2 (RTX, N, 'e', 'u').rt_rtx) @@ -721,9 +728,6 @@ enum reg_note REG_NOTE_MAX }; -/* The base value for branch probability notes. */ -#define REG_BR_PROB_BASE 10000 - /* Define macros to extract and insert the reg-note kind in an EXPR_LIST. */ #define REG_NOTE_KIND(LINK) ((enum reg_note) GET_MODE (LINK)) #define PUT_REG_NOTE_KIND(LINK, KIND) \ @@ -776,7 +780,6 @@ extern const char * const reg_note_name[]; #define NOTE_EH_HANDLER(INSN) XCINT (INSN, 4, NOTE) #define NOTE_BASIC_BLOCK(INSN) XCBBDEF (INSN, 4, NOTE) #define NOTE_EXPECTED_VALUE(INSN) XCEXP (INSN, 4, NOTE) -#define NOTE_PREDICTION(INSN) XCINT (INSN, 4, NOTE) #define NOTE_VAR_LOCATION(INSN) XCEXP (INSN, 4, NOTE) /* In a NOTE that is a line number, this is the line number. @@ -788,11 +791,6 @@ extern const char * const reg_note_name[]; (GET_CODE (INSN) == NOTE \ && NOTE_LINE_NUMBER (INSN) == NOTE_INSN_BASIC_BLOCK) -/* Algorithm and flags for prediction. */ -#define NOTE_PREDICTION_ALG(INSN) (XCINT(INSN, 4, NOTE)>>8) -#define NOTE_PREDICTION_FLAGS(INSN) (XCINT(INSN, 4, NOTE)&0xff) -#define NOTE_PREDICT(ALG,FLAGS) ((ALG<<8)+(FLAGS)) - /* Variable declaration and the location of a variable. */ #define NOTE_VAR_LOCATION_DECL(INSN) (XCTREE (XCEXP (INSN, 4, NOTE), \ 0, VAR_LOCATION)) @@ -936,13 +934,14 @@ enum label_kind #define INTVAL(RTX) XCWINT(RTX, 0, CONST_INT) /* For a CONST_DOUBLE: - For a DImode, there are two integers CONST_DOUBLE_LOW is the + For a VOIDmode, there are two integers CONST_DOUBLE_LOW is the low-order word and ..._HIGH the high-order. For a float, there is a REAL_VALUE_TYPE structure, and CONST_DOUBLE_REAL_VALUE(r) is a pointer to it. */ -#define CONST_DOUBLE_LOW(r) XCWINT (r, 0, CONST_DOUBLE) -#define CONST_DOUBLE_HIGH(r) XCWINT (r, 1, CONST_DOUBLE) -#define CONST_DOUBLE_REAL_VALUE(r) ((struct real_value *)&CONST_DOUBLE_LOW(r)) +#define CONST_DOUBLE_LOW(r) XCMWINT (r, 0, CONST_DOUBLE, VOIDmode) +#define CONST_DOUBLE_HIGH(r) XCMWINT (r, 1, CONST_DOUBLE, VOIDmode) +#define CONST_DOUBLE_REAL_VALUE(r) \ + ((const struct real_value *) XCNMPRV (r, CONST_DOUBLE, VOIDmode)) /* For a CONST_VECTOR, return element #n. */ #define CONST_VECTOR_ELT(RTX, N) XCVECEXP (RTX, 0, N, CONST_VECTOR) @@ -1044,7 +1043,7 @@ do { \ ASM_INPUT)->volatil) /* 1 if RTX is a mem that refers to an aggregate, either to the - aggregate itself of to a field of the aggregate. If zero, RTX may + aggregate itself or to a field of the aggregate. If zero, RTX may or may not be such a reference. */ #define MEM_IN_STRUCT_P(RTX) \ (RTL_FLAG_CHECK1("MEM_IN_STRUCT_P", (RTX), MEM)->in_struct) @@ -1341,7 +1340,6 @@ extern rtx expand_builtin_expect_jump (tree, rtx, rtx); extern void set_stack_check_libfunc (rtx); extern HOST_WIDE_INT trunc_int_for_mode (HOST_WIDE_INT, enum machine_mode); extern rtx plus_constant (rtx, HOST_WIDE_INT); -extern void optimize_save_area_alloca (void); /* In emit-rtl.c */ extern rtvec gen_rtvec (int, ...); @@ -1464,6 +1462,7 @@ extern rtx emit_note (int); extern rtx emit_note_copy (rtx); extern rtx emit_line_note (location_t); extern rtx make_insn_raw (rtx); +extern rtx make_jump_insn_raw (rtx); extern void add_function_usage_to (rtx, rtx); extern rtx last_call_insn (void); extern rtx previous_insn (rtx); @@ -1544,6 +1543,7 @@ extern rtx simplify_gen_subreg (enum machine_mode, rtx, enum machine_mode, extern rtx simplify_replace_rtx (rtx, rtx, rtx); extern rtx simplify_rtx (rtx); extern rtx avoid_constant_pool_reference (rtx); +extern bool constant_pool_reference_p (rtx x); extern bool mode_signbit_p (enum machine_mode, rtx); /* In regclass.c */ @@ -1612,6 +1612,7 @@ extern int side_effects_p (rtx); extern int volatile_refs_p (rtx); extern int volatile_insn_p (rtx); extern int may_trap_p (rtx); +extern int may_trap_or_fault_p (rtx); extern int inequality_comparisons_p (rtx); extern rtx replace_rtx (rtx, rtx, rtx); extern rtx replace_regs (rtx, rtx *, unsigned int, int); @@ -1890,7 +1891,6 @@ extern int rtx_to_tree_code (enum rtx_code); /* In cse.c */ extern int delete_trivially_dead_insns (rtx, int); extern int cse_main (rtx, int, FILE *); -extern void cse_condition_code_reg (void); extern int exp_equiv_p (rtx, rtx, int, bool); extern unsigned hash_rtx (rtx x, enum machine_mode, int *, int *, bool); @@ -1915,12 +1915,13 @@ extern int redirect_jump_1 (rtx, rtx); extern void redirect_jump_2 (rtx, rtx, rtx, int, int); extern int redirect_jump (rtx, rtx, int); extern void rebuild_jump_labels (rtx); +extern rtx reversed_comparison (rtx, enum machine_mode); extern enum rtx_code reversed_comparison_code (rtx, rtx); extern enum rtx_code reversed_comparison_code_parts (enum rtx_code, rtx, rtx, rtx); extern void delete_for_peephole (rtx, rtx); extern int condjump_in_parallel_p (rtx); -extern void purge_line_number_notes (rtx); +extern void purge_line_number_notes (void); /* In emit-rtl.c. */ extern int max_reg_num (void); @@ -1941,7 +1942,6 @@ extern void init_emit (void); extern void init_emit_once (int); extern void push_topmost_sequence (void); extern void pop_topmost_sequence (void); -extern void reverse_comparison (rtx); extern void set_new_first_and_last_insn (rtx, rtx); extern void unshare_all_rtl (void); extern void unshare_all_rtl_again (rtx); @@ -1966,17 +1966,16 @@ extern rtx delete_insn_and_edges (rtx); extern void delete_insn_chain_and_edges (rtx, rtx); extern rtx gen_lowpart_SUBREG (enum machine_mode, rtx); extern rtx gen_const_mem (enum machine_mode, rtx); +extern rtx gen_frame_mem (enum machine_mode, rtx); +extern rtx gen_tmp_stack_mem (enum machine_mode, rtx); extern bool validate_subreg (enum machine_mode, enum machine_mode, rtx, unsigned int); /* In combine.c */ -extern int combine_instructions (rtx, unsigned int); extern unsigned int extended_count (rtx, enum machine_mode, int); extern rtx remove_death (unsigned int, rtx); extern void dump_combine_stats (FILE *); extern void dump_combine_total_stats (FILE *); -/* In web.c */ -extern void web_main (void); /* In sched-rgn.c. */ extern void schedule_insns (FILE *); @@ -2038,8 +2037,6 @@ extern void expand_dec (rtx, rtx); /* In gcse.c */ extern bool can_copy_p (enum machine_mode); extern rtx fis_get_condition (rtx); -extern int gcse_main (rtx, FILE *); -extern int bypass_jumps (FILE *); /* In postreload-gcse.c */ extern void gcse_after_reload_main (rtx); @@ -2087,6 +2084,9 @@ extern void dbr_schedule (rtx, FILE *); extern void dump_local_alloc (FILE *); extern int local_alloc (void); +/* In reload1.c */ +extern int function_invariant_p (rtx); + /* In reg-stack.c */ extern bool reg_to_stack (FILE *); @@ -2109,9 +2109,9 @@ extern rtx emit_library_call_value (rtx, rtx, enum libcall_type, enum machine_mode, int, ...); /* In varasm.c */ -extern int in_data_section (void); extern void init_varasm_once (void); - +extern enum tls_model decl_default_tls_model (tree); + /* In rtl.c */ extern void traverse_md_constants (int (*) (void **, void *), void *); struct md_constant { char *name, *value; }; @@ -2119,6 +2119,10 @@ struct md_constant { char *name, *value; }; /* In read-rtl.c */ extern int read_skip_spaces (FILE *); extern bool read_rtx (FILE *, rtx *, int *); +extern void copy_rtx_ptr_loc (const void *, const void *); +extern void print_rtx_ptr_loc (const void *); +extern const char *join_c_conditions (const char *, const char *); +extern void print_c_condition (const char *); extern const char *read_rtx_filename; extern int read_rtx_lineno; @@ -2186,6 +2190,7 @@ extern void sms_schedule (FILE *); struct rtl_hooks { rtx (*gen_lowpart) (enum machine_mode, rtx); + rtx (*gen_lowpart_no_emit) (enum machine_mode, rtx); rtx (*reg_nonzero_bits) (rtx, enum machine_mode, rtx, enum machine_mode, unsigned HOST_WIDE_INT, unsigned HOST_WIDE_INT *); rtx (*reg_num_sign_bit_copies) (rtx, enum machine_mode, rtx, enum machine_mode,