OSDN Git Service

2007-09-07 Tobias Burnus <burnus@net-b.de>
[pf3gnuchains/gcc-fork.git] / gcc / rtl.h
index b65af5f..0a114c3 100644 (file)
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -27,6 +27,8 @@ along with GCC; see the file COPYING3.  If not see
 #include "input.h"
 #include "real.h"
 #include "vec.h"
+#include "fixed-value.h"
+#include "alias.h"
 
 #undef FFS  /* Some systems predefine this symbol; don't let it interfere.  */
 #undef FLOAT /* Likewise.  */
@@ -139,7 +141,7 @@ typedef struct
    stricter alignment; OFFSET is the offset of the MEM within that object.  */
 typedef struct mem_attrs GTY(())
 {
-  HOST_WIDE_INT alias;         /* Memory alias set.  */
+  alias_set_type alias;                /* Memory alias set.  */
   tree expr;                   /* expr corresponding to MEM.  */
   rtx offset;                  /* Offset from start of DECL, as CONST_INT.  */
   rtx size;                    /* Size in bytes, as a CONST_INT.  */
@@ -307,6 +309,7 @@ struct rtx_def GTY((chain_next ("RTX_NEXT (&%h)"),
     HOST_WIDE_INT hwint[1];
     struct block_symbol block_sym;
     struct real_value rv;
+    struct fixed_value fv;
   } GTY ((special ("rtx_def"), desc ("GET_CODE (&%0)"))) u;
 };
 
@@ -529,6 +532,13 @@ struct rtvec_def GTY(()) {
                                 __LINE__, __FUNCTION__);               \
    &_rtx->u.rv; })
 
+#define XCNMPFV(RTX, C, M) __extension__                               \
+({ __typeof (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.fv; })
+
 #define BLOCK_SYMBOL_CHECK(RTX) __extension__                          \
 ({ __typeof (RTX) const _symbol = (RTX);                               \
    const unsigned int flags = RTL_CHECKC1 (_symbol, 1, SYMBOL_REF).rt_int; \
@@ -573,6 +583,7 @@ extern void rtvec_check_failed_bounds (const_rtvec, int, const char *, int,
 #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)
+#define XCNMPFV(RTX, C, M)         (&(RTX)->u.fv)
 #define BLOCK_SYMBOL_CHECK(RTX)            (&(RTX)->u.block_sym)
 
 #endif
@@ -1010,6 +1021,13 @@ rhs_regno (const_rtx x)
 #define CONST_DOUBLE_REAL_VALUE(r) \
   ((const struct real_value *) XCNMPRV (r, CONST_DOUBLE, VOIDmode))
 
+#define CONST_FIXED_VALUE(r) \
+  ((const struct fixed_value *) XCNMPFV (r, CONST_FIXED, VOIDmode))
+#define CONST_FIXED_VALUE_HIGH(r) \
+  ((HOST_WIDE_INT) (CONST_FIXED_VALUE(r)->data.high))
+#define CONST_FIXED_VALUE_LOW(r) \
+  ((HOST_WIDE_INT) (CONST_FIXED_VALUE(r)->data.low))
+
 /* For a CONST_VECTOR, return element #n.  */
 #define CONST_VECTOR_ELT(RTX, N) XCVECEXP (RTX, 0, N, CONST_VECTOR)
 
@@ -1044,10 +1062,10 @@ extern bool subreg_offset_representable_p (unsigned int, enum machine_mode,
                                           unsigned int, enum machine_mode);
 extern unsigned int subreg_regno (const_rtx);
 extern unsigned int subreg_nregs (const_rtx);
-extern unsigned HOST_WIDE_INT nonzero_bits (rtx, enum machine_mode);
-extern unsigned int num_sign_bit_copies (rtx, enum machine_mode);
+extern unsigned HOST_WIDE_INT nonzero_bits (const_rtx, enum machine_mode);
+extern unsigned int num_sign_bit_copies (const_rtx, enum machine_mode);
 extern bool constant_pool_constant_p (rtx);
-extern bool truncated_to_mode (enum machine_mode, rtx);
+extern bool truncated_to_mode (enum machine_mode, const_rtx);
 
 
 /* 1 if RTX is a subreg containing a reg that is already known to be
@@ -1458,7 +1476,7 @@ extern rtx emit_copy_of_insn_after (rtx, rtx);
 extern void set_reg_attrs_from_mem (rtx, rtx);
 extern void set_mem_attrs_from_reg (rtx, rtx);
 extern void set_reg_attrs_for_parm (rtx, rtx);
-extern int mem_expr_equal_p (tree, tree);
+extern int mem_expr_equal_p (const_tree, const_tree);
 
 /* In rtl.c */
 extern rtx rtx_alloc_stat (RTX_CODE MEM_STAT_DECL);
@@ -1496,7 +1514,7 @@ extern rtx operand_subword (rtx, unsigned int, int, enum machine_mode);
 
 /* In emit-rtl.c */
 extern rtx operand_subword_force (rtx, unsigned int, enum machine_mode);
-extern int subreg_lowpart_p (rtx);
+extern int subreg_lowpart_p (const_rtx);
 extern unsigned int subreg_lowpart_offset (enum machine_mode,
                                           enum machine_mode);
 extern unsigned int subreg_highpart_offset (enum machine_mode,
@@ -1582,7 +1600,7 @@ extern rtx prev_real_insn (rtx);
 extern rtx next_real_insn (rtx);
 extern rtx prev_active_insn (rtx);
 extern rtx next_active_insn (rtx);
-extern int active_insn_p (rtx);
+extern int active_insn_p (const_rtx);
 extern rtx prev_label (rtx);
 extern rtx next_label (rtx);
 extern rtx skip_consecutive_labels (rtx);
@@ -1645,7 +1663,7 @@ extern rtx simplify_subreg (enum machine_mode, rtx, enum machine_mode,
 extern rtx simplify_gen_subreg (enum machine_mode, rtx, enum machine_mode,
                                unsigned int);
 extern rtx simplify_replace_rtx (rtx, const_rtx, rtx);
-extern rtx simplify_rtx (rtx);
+extern rtx simplify_rtx (const_rtx);
 extern rtx avoid_constant_pool_reference (rtx);
 extern bool mode_signbit_p (enum machine_mode, const_rtx);
 
@@ -1677,8 +1695,8 @@ typedef struct replace_label_data
 extern int rtx_addr_can_trap_p (const_rtx);
 extern bool nonzero_address_p (const_rtx);
 extern int rtx_unstable_p (const_rtx);
-extern int rtx_varies_p (rtx, int);
-extern int rtx_addr_varies_p (rtx, int);
+extern bool rtx_varies_p (const_rtx, bool);
+extern bool rtx_addr_varies_p (const_rtx, bool);
 extern HOST_WIDE_INT get_integer_term (const_rtx);
 extern rtx get_related_value (const_rtx);
 extern bool offset_within_block_p (const_rtx, HOST_WIDE_INT);
@@ -1687,22 +1705,23 @@ extern int reg_mentioned_p (const_rtx, const_rtx);
 extern int count_occurrences (const_rtx, const_rtx, int);
 extern int reg_referenced_p (const_rtx, const_rtx);
 extern int reg_used_between_p (const_rtx, const_rtx, const_rtx);
-extern int reg_set_between_p (rtx, rtx, rtx);
+extern int reg_set_between_p (const_rtx, const_rtx, const_rtx);
 extern int commutative_operand_precedence (rtx);
 extern bool swap_commutative_operands_p (rtx, rtx);
-extern int modified_between_p (rtx, rtx, rtx);
+extern int modified_between_p (const_rtx, const_rtx, const_rtx);
 extern int no_labels_between_p (const_rtx, const_rtx);
-extern int modified_in_p (rtx, rtx);
-extern int reg_set_p (rtx, rtx);
+extern int modified_in_p (const_rtx, const_rtx);
+extern int reg_set_p (const_rtx, const_rtx);
 extern rtx single_set_2 (const_rtx, const_rtx);
 extern int multiple_sets (const_rtx);
 extern int set_noop_p (const_rtx);
-extern int noop_move_p (rtx);
+extern int noop_move_p (const_rtx);
 extern rtx find_last_value (rtx, rtx *, rtx, int);
 extern int refers_to_regno_p (unsigned int, unsigned int, const_rtx, rtx *);
 extern int reg_overlap_mentioned_p (const_rtx, const_rtx);
-extern rtx set_of (rtx, rtx);
-extern void note_stores (rtx, void (*) (rtx, rtx, void *), void *);
+extern const_rtx set_of (const_rtx, const_rtx);
+extern void note_stores (const_rtx, void (*) (rtx, const_rtx, void *), void *);
+extern void const_note_stores (const_rtx, void (*) (const_rtx, const_rtx, const void *), const void *);
 extern void note_uses (rtx *, void (*) (rtx *, void *), void *);
 extern int dead_or_set_p (const_rtx, const_rtx);
 extern int dead_or_set_regno_p (const_rtx, unsigned int);
@@ -1735,7 +1754,7 @@ extern int in_expr_list_p (const_rtx, const_rtx);
 extern void remove_node_from_expr_list (const_rtx, rtx *);
 extern int loc_mentioned_in_p (rtx *, const_rtx);
 extern rtx find_first_parameter_load (rtx, rtx);
-extern bool keep_with_call_p (rtx);
+extern bool keep_with_call_p (const_rtx);
 extern bool label_is_jump_target_p (const_rtx, const_rtx);
 extern int insn_rtx_cost (rtx);
 
@@ -1764,7 +1783,7 @@ rtx remove_list_elem (rtx, rtx *);
 extern void free_reg_info (void);
 
 /* recog.c */
-extern int asm_noperands (rtx);
+extern int asm_noperands (const_rtx);
 extern const char *decode_asm_operands (rtx, rtx *, rtx **, const char **,
                                        enum machine_mode *, location_t *);
 
@@ -2001,36 +2020,36 @@ 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);
-extern int exp_equiv_p (rtx, rtx, int, bool);
-extern unsigned hash_rtx (rtx x, enum machine_mode, int *, int *, bool);
+extern int exp_equiv_p (const_rtx, const_rtx, int, bool);
+extern unsigned hash_rtx (const_rtx x, enum machine_mode, int *, int *, bool);
 
 /* In jump.c */
 extern int comparison_dominates_p (enum rtx_code, enum rtx_code);
-extern int condjump_p (rtx);
-extern int any_condjump_p (rtx);
-extern int any_uncondjump_p (rtx);
-extern rtx pc_set (rtx);
-extern rtx condjump_label (rtx);
-extern int simplejump_p (rtx);
+extern int condjump_p (const_rtx);
+extern int any_condjump_p (const_rtx);
+extern int any_uncondjump_p (const_rtx);
+extern rtx pc_set (const_rtx);
+extern rtx condjump_label (const_rtx);
+extern int simplejump_p (const_rtx);
 extern int returnjump_p (rtx);
-extern int onlyjump_p (rtx);
-extern int only_sets_cc0_p (rtx);
-extern int sets_cc0_p (rtx);
+extern int onlyjump_p (const_rtx);
+extern int only_sets_cc0_p (const_rtx);
+extern int sets_cc0_p (const_rtx);
 extern int invert_jump_1 (rtx, rtx);
 extern int invert_jump (rtx, rtx, int);
-extern int rtx_renumbered_equal_p (rtx, rtx);
-extern int true_regnum (rtx);
-extern unsigned int reg_or_subregno (rtx);
+extern int rtx_renumbered_equal_p (const_rtx, const_rtx);
+extern int true_regnum (const_rtx);
+extern unsigned int reg_or_subregno (const_rtx);
 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 rtx reversed_comparison (const_rtx, enum machine_mode);
+extern enum rtx_code reversed_comparison_code (const_rtx, const_rtx);
+extern enum rtx_code reversed_comparison_code_parts (enum rtx_code, const_rtx,
+                                                    const_rtx, const_rtx);
 extern void delete_for_peephole (rtx, rtx);
-extern int condjump_in_parallel_p (rtx);
+extern int condjump_in_parallel_p (const_rtx);
 
 /* In emit-rtl.c.  */
 extern int max_reg_num (void);
@@ -2048,6 +2067,7 @@ extern int get_max_uid (void);
 extern int in_sequence_p (void);
 extern void force_next_line_note (void);
 extern void init_emit (void);
+extern void init_emit_regs (void);
 extern void init_emit_once (int);
 extern void push_topmost_sequence (void);
 extern void pop_topmost_sequence (void);
@@ -2075,10 +2095,10 @@ 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);
+                            const_rtx, unsigned int);
 
 /* In combine.c  */
-extern unsigned int extended_count (rtx, enum machine_mode, int);
+extern unsigned int extended_count (const_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 *);
@@ -2114,8 +2134,8 @@ extern void print_inline_rtx (FILE *, const_rtx, int);
 
 /* In function.c */
 extern void reposition_prologue_and_epilogue_notes (void);
-extern int prologue_epilogue_contains (rtx);
-extern int sibcall_epilogue_contains (rtx);
+extern int prologue_epilogue_contains (const_rtx);
+extern int sibcall_epilogue_contains (const_rtx);
 extern void mark_temp_addr_taken (rtx);
 extern void update_temp_slot_address (rtx, rtx);
 
@@ -2129,7 +2149,7 @@ extern rtx move_by_pieces (rtx, rtx, unsigned HOST_WIDE_INT,
                           unsigned int, int);
 
 /* In cfgrtl.c */
-extern void print_rtl_with_bb (FILE *, rtx);
+extern void print_rtl_with_bb (FILE *, const_rtx);
 
 /* In cfg.c.  */
 extern void dump_reg_info (FILE *);
@@ -2157,9 +2177,10 @@ extern void build_insn_chain (rtx);
 extern int reg_classes_intersect_p (enum reg_class, enum reg_class);
 extern int reg_class_subset_p (enum reg_class, enum reg_class);
 extern void globalize_reg (int);
-extern void init_reg_modes_once (void);
+extern void init_reg_modes_target (void);
 extern void init_regs (void);
 extern void init_fake_stack_mems (void);
+extern void save_register_info (void);
 extern void init_reg_sets (void);
 extern void regclass (rtx, int);
 extern void reg_scan (rtx, unsigned int);
@@ -2178,7 +2199,7 @@ extern void dbr_schedule (rtx);
 extern void dump_local_alloc (FILE *);
 
 /* In reload1.c */
-extern int function_invariant_p (rtx);
+extern int function_invariant_p (const_rtx);
 
 /* In calls.c */
 enum libcall_type
@@ -2200,7 +2221,7 @@ extern rtx emit_library_call_value (rtx, rtx, enum libcall_type,
 
 /* In varasm.c */
 extern void init_varasm_once (void);
-extern enum tls_model decl_default_tls_model (tree);
+extern enum tls_model decl_default_tls_model (const_tree);
   
 /* In rtl.c */
 extern void traverse_md_constants (int (*) (void **, void *), void *);
@@ -2218,24 +2239,24 @@ extern int read_rtx_lineno;
 
 /* In alias.c */
 extern rtx canon_rtx (rtx);
-extern int true_dependence (rtx, enum machine_mode, rtx, int (*)(rtx, int));
+extern int true_dependence (const_rtx, enum machine_mode, const_rtx, bool (*)(const_rtx, bool));
 extern rtx get_addr (rtx);
-extern int canon_true_dependence (rtx, enum machine_mode, rtx, rtx,
-                                 int (*)(rtx, int));
-extern int read_dependence (rtx, rtx);
-extern int anti_dependence (rtx, rtx);
-extern int output_dependence (rtx, rtx);
-extern void init_alias_once (void);
+extern int canon_true_dependence (const_rtx, enum machine_mode, rtx, const_rtx,
+                                 bool (*)(const_rtx, bool));
+extern int read_dependence (const_rtx, const_rtx);
+extern int anti_dependence (const_rtx, const_rtx);
+extern int output_dependence (const_rtx, const_rtx);
+extern void init_alias_target (void);
 extern void init_alias_analysis (void);
 extern void end_alias_analysis (void);
-extern bool memory_modified_in_insn_p (rtx, rtx);
+extern bool memory_modified_in_insn_p (const_rtx, const_rtx);
 extern rtx find_base_term (rtx);
 extern rtx gen_hard_reg_clobber (enum machine_mode, unsigned int);
 extern rtx get_reg_known_value (unsigned int);
 extern bool get_reg_known_equiv_p (unsigned int);
 
 #ifdef STACK_REGS
-extern int stack_regs_mentioned (rtx insn);
+extern int stack_regs_mentioned (const_rtx insn);
 #endif
 
 /* In toplev.c */
@@ -2268,11 +2289,11 @@ 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,
+  rtx (*reg_nonzero_bits) (const_rtx, enum machine_mode, const_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,
+  rtx (*reg_num_sign_bit_copies) (const_rtx, enum machine_mode, const_rtx, enum machine_mode,
                                  unsigned int, unsigned int *);
-  bool (*reg_truncated_to_mode) (enum machine_mode, rtx);
+  bool (*reg_truncated_to_mode) (enum machine_mode, const_rtx);
 
   /* Whenever you add entries here, make sure you adjust rtlhooks-def.h.  */
 };