OSDN Git Service

* sh.h (STRUCT_VALUE, RETURN_IN_MEMORY): Define.
[pf3gnuchains/gcc-fork.git] / gcc / rtl.h
index fc344ce..263de4e 100644 (file)
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -87,6 +87,7 @@ typedef union rtunion_def
 {
   HOST_WIDE_INT rtwint;
   int rtint;
+  unsigned int rtuint;
   const char *rtstr;
   struct rtx_def *rtx;
   struct rtvec_def *rtvec;
@@ -148,7 +149,7 @@ typedef struct rtx_def
      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 
+     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.
@@ -162,7 +163,7 @@ typedef struct rtx_def
   unsigned int in_struct : 1;
   /* 1 if this rtx is used.  This is used for copying shared structure.
      See `unshare_all_rtl'.
-     In a REG, this is not needed for that purpose, and used instead 
+     In a REG, this is not needed for that purpose, and used instead
      in `leaf_renumber_regs_insn'.
      In a SYMBOL_REF, means that emit_library_call
      has used it as the function.  */
@@ -173,7 +174,7 @@ typedef struct rtx_def
   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.  
+     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.  */
   unsigned frame_related : 1;
@@ -338,6 +339,7 @@ extern void rtvec_check_failed_bounds PARAMS ((rtvec, int,
 
 #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)
@@ -396,101 +398,141 @@ extern void rtvec_check_failed_bounds PARAMS ((rtvec, int,
    clear, the insn should be executed only if the branch is not taken.  */
 #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)
+
 /* Holds a list of notes on what this insn does to various REGs.
-   It is a chain of EXPR_LIST rtx's, where the second operand
-   is the chain pointer and the first operand is the REG being described.
+   It is a chain of EXPR_LIST rtx's, where the second operand is the
+   chain pointer and the first operand is the REG being described.
    The mode field of the EXPR_LIST contains not a real machine mode
-   but a value that says what this note says about the REG:
-     REG_DEAD means that the value in REG dies in this insn (i.e., it is
-   not needed past this insn).  If REG is set in this insn, the REG_DEAD
-   note may, but need not, be omitted.
-     REG_INC means that the REG is autoincremented or autodecremented.
-     REG_EQUIV describes the insn as a whole; it says that the insn
-   sets a register to a constant value or to be equivalent to a memory
-   address.  If the register is spilled to the stack then the constant
-   value should be substituted for it.  The contents of the REG_EQUIV
-   is the constant value or memory address, which may be different
-   from the source of the SET although it has the same value.  A
-   REG_EQUIV note may also appear on an insn which copies a register
-   parameter to a pseudo-register, if there is a memory address which
-   could be used to hold that pseudo-register throughout the function.
-     REG_EQUAL is like REG_EQUIV except that the destination
-   is only momentarily equal to the specified rtx.  Therefore, it
-   cannot be used for substitution; but it can be used for cse.
-     REG_RETVAL means that this insn copies the return-value of
-   a library call out of the hard reg for return values.  This note
-   is actually an INSN_LIST and it points to the first insn involved
-   in setting up arguments for the call.  flow.c uses this to delete
-   the entire library call when its result is dead.
-     REG_LIBCALL is the inverse of REG_RETVAL: it goes on the first insn
-   of the library call and points at the one that has the REG_RETVAL.
-     REG_WAS_0 says that the register set in this insn held 0 before the insn.
-   The contents of the note is the insn that stored the 0.
-   If that insn is deleted or patched to a NOTE, the REG_WAS_0 is inoperative.
-   The REG_WAS_0 note is actually an INSN_LIST, not an EXPR_LIST.
-     REG_NONNEG means that the register is always nonnegative during
-   the containing loop.  This is used in branches so that decrement and
-   branch instructions terminating on zero can be matched.  There must be
-   an insn pattern in the md file named `decrement_and_branch_until_zero'
-   or else this will never be added to any instructions.
-     REG_NO_CONFLICT means there is no conflict *after this insn*
-   between the register in the note and the destination of this insn.
-     REG_UNUSED identifies a register set in this insn and never used.
-     REG_CC_SETTER and REG_CC_USER link a pair of insns that set and use
-   CC0, respectively.  Normally, these are required to be consecutive insns,
-   but we permit putting a cc0-setting insn in the delay slot of a branch
-   as long as only one copy of the insn exists.  In that case, these notes
-   point from one to the other to allow code generation to determine what
-   any require information and to properly update CC_STATUS.
-     REG_LABEL points to a CODE_LABEL.  Used by non-JUMP_INSNs to
-   say that the CODE_LABEL contained in the REG_LABEL note is used
-   by the insn.
-     REG_DEP_ANTI is used in LOG_LINKS which represent anti (write after read)
-   dependencies.  REG_DEP_OUTPUT is used in LOG_LINKS which represent output
-   (write after write) dependencies.  Data dependencies, which are the only
-   type of LOG_LINK created by flow, are represented by a 0 reg note kind.  */
-/*   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_EXEC_COUNT is attached to the first insn of each basic block, and
-   the first insn after each CALL_INSN.  It indicates how many times this
-   block was executed.
-     REG_SAVE_AREA is used to optimize rtl generated by dynamic stack
-   allocations for targets where SETJMP_VIA_SAVE_AREA is true.
-     REG_BR_PRED is attached to JUMP_INSNs only, it holds the branch prediction
-   flags computed by get_jump_flags() after dbr scheduling is complete.
-     REG_FRAME_RELATED_EXPR is attached to insns that are RTX_FRAME_RELATED_P,
-   but are too complex for DWARF to interpret what they imply.  The attached
-   rtx is used instead of intuition.
-     REG_EH_REGION is used to indicate what exception region an INSN
-   belongs in.  This can be used to indicate what region a call may throw
-   to. a REGION of 0 indicates that a call cannot throw at all.
-   a REGION  of -1 indicates that it cannot throw, nor will it execute
-   a non-local goto.
-     REG_EH_RETHROW is used to indicate 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_SAVE_NOTE is used by haifa-sched to save NOTE_INSN notes 
-   across scheduling.  */
+   but a value from enum reg_note.  */
 
 #define REG_NOTES(INSN)        XEXP(INSN, 6)
 
-#define ADDR_DIFF_VEC_FLAGS(RTX) X0ADVFLAGS(RTX, 4)
-
-#define CSELIB_VAL_PTR(RTX) X0CSELIB(RTX, 0)
-
 /* Don't forget to change reg_note_name in rtl.c.  */
-enum reg_note { REG_DEAD = 1, REG_INC = 2, REG_EQUIV = 3, REG_WAS_0 = 4,
-               REG_EQUAL = 5, REG_RETVAL = 6, REG_LIBCALL = 7,
-               REG_NONNEG = 8, REG_NO_CONFLICT = 9, REG_UNUSED = 10,
-               REG_CC_SETTER = 11, REG_CC_USER = 12, REG_LABEL = 13,
-               REG_DEP_ANTI = 14, REG_DEP_OUTPUT = 15, REG_BR_PROB = 16,
-               REG_EXEC_COUNT = 17, REG_NOALIAS = 18, REG_SAVE_AREA = 19,
-               REG_BR_PRED = 20, REG_EH_CONTEXT = 21,
-               REG_FRAME_RELATED_EXPR = 22, REG_EH_REGION = 23,
-               REG_EH_RETHROW = 24, REG_SAVE_NOTE = 25 };
+enum reg_note
+{
+  /* The value in REG dies in this insn (i.e., it is not needed past
+     this insn).  If REG is set in this insn, the REG_DEAD note may,
+     but need not, be omitted.  */
+  REG_DEAD = 1,
+
+  /* The REG is autoincremented or autodecremented.  */
+  REG_INC,
+
+  /* Describes the insn as a whole; it says that the insn sets a register
+     to a constant value or to be equivalent to a memory address.  If the
+     register is spilled to the stack then the constant value should be
+     substituted for it.  The contents of the REG_EQUIV is the constant
+     value or memory address, which may be different from the source of
+     the SET although it has the same value.  A REG_EQUIV note may also
+     appear on an insn which copies a register parameter to a pseudo-register,
+     if there is a memory address which could be used to hold that
+     pseudo-register throughout the function.  */
+   REG_EQUIV,
+
+  /* Like REG_EQUIV except that the destination is only momentarily equal
+     to the specified rtx.  Therefore, it cannot be used for substitution;
+     but it can be used for cse.  */
+  REG_EQUAL,
+
+  /* The register set in this insn held 0 before the insn.  The contents of
+     the note is the insn that stored the 0.  If that insn is deleted or
+     patched to a NOTE, the REG_WAS_0 is inoperative.  The REG_WAS_0 note
+     is actually an INSN_LIST, not an EXPR_LIST.  */
+  REG_WAS_0,
+
+  /* This insn copies the return-value of a library call out of the hard reg
+     for return values.  This note is actually an INSN_LIST and it points to
+     the first insn involved in setting up arguments for the call.  flow.c
+     uses this to delete the entire library call when its result is dead.  */
+  REG_RETVAL,
+
+  /* The inverse of REG_RETVAL: it goes on the first insn of the library call
+     and points at the one that has the REG_RETVAL.  */
+  REG_LIBCALL,
+
+  /* The register is always nonnegative during the containing loop.  This is
+     used in branches so that decrement and branch instructions terminating
+     on zero can be matched.  There must be an insn pattern in the md file
+     named `decrement_and_branch_until_zero' or else this will never be added
+     to any instructions.  */
+  REG_NONNEG,
+
+  /* There is no conflict *after this insn* between the register in the note
+     and the destination of this insn.  */
+  REG_NO_CONFLICT,
+
+  /* Identifies a register set in this insn and never used.  */
+  REG_UNUSED,
+
+  /* REG_CC_SETTER and REG_CC_USER link a pair of insns that set and use CC0,
+     respectively.  Normally, these are required to be consecutive insns, but
+     we permit putting a cc0-setting insn in the delay slot of a branch as
+     long as only one copy of the insn exists.  In that case, these notes
+     point from one to the other to allow code generation to determine what
+     any require information and to properly update CC_STATUS.  */
+  REG_CC_SETTER, REG_CC_USER,
+
+  /* Points to a CODE_LABEL.  Used by non-JUMP_INSNs to say that the
+     CODE_LABEL contained in the REG_LABEL note is used by the insn.  */
+  REG_LABEL,
+
+  /* REG_DEP_ANTI and REG_DEP_OUTPUT are used in LOG_LINKS to represent
+     write-after-read and write-after-write dependencies respectively.
+     Data dependencies, which are the only type of LOG_LINK created by
+     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,
+
+  /* REG_EXEC_COUNT is attached to the first insn of each basic block, and
+     the first insn after each CALL_INSN.  It indicates how many times this
+     block was executed.  */
+  REG_EXEC_COUNT,
+
+  /* Attached to a call insn; indicates that the call is malloc-like and
+     that the pointer returned cannot alias anything else.  */
+  REG_NOALIAS,
+
+  /* Used to optimize rtl generated by dynamic stack allocations for targets
+     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,
+
+  /* Attached to insns that are RTX_FRAME_RELATED_P, but are too complex
+     for DWARF to interpret what they imply.  The attached rtx is used
+     instead of intuition.  */
+  REG_FRAME_RELATED_EXPR,
+
+  /* Indicates that REG holds the exception context for the function.
+     This context is shared by inline functions, so the code to acquire
+     the real exception context is delayed until after inlining.  */
+  REG_EH_CONTEXT,
+
+  /* Indicates what exception region an INSN belongs in.  This is used to
+     indicate what region to which a call may throw.  REGION 0 indicates
+     that a call cannot throw at all.  REGION -1 indicates that it cannot
+     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
+};
+
 /* The base value for branch probability notes.  */
 #define REG_BR_PROB_BASE  10000
 
@@ -613,7 +655,7 @@ extern const char * const note_insn_name[];
 #define LABEL_ALTERNATE_NAME(RTX) XCSTR(RTX, 7, CODE_LABEL)
 
 /* The original regno this ADDRESSOF was built for.  */
-#define ADDRESSOF_REGNO(RTX) XCINT(RTX, 1, ADDRESSOF)
+#define ADDRESSOF_REGNO(RTX) XCUINT(RTX, 1, ADDRESSOF)
 
 /* The variable in the register we took the address of.  */
 #define ADDRESSOF_DECL(RTX) XCTREE(RTX, 2, ADDRESSOF)
@@ -642,7 +684,7 @@ extern const char * const note_insn_name[];
 
 /* For a REG rtx, REGNO extracts the register number.  */
 
-#define REGNO(RTX) XCINT(RTX, 0, REG)
+#define REGNO(RTX) XCUINT(RTX, 0, REG)
 
 /* For a REG rtx, REG_FUNCTION_VALUE_P is nonzero if the reg
    is the current function's return value.  */
@@ -660,12 +702,12 @@ extern const char * const note_insn_name[];
    SUBREG_WORD extracts the word-number.  */
 
 #define SUBREG_REG(RTX) XCEXP(RTX, 0, SUBREG)
-#define SUBREG_WORD(RTX) XCINT(RTX, 1, SUBREG)
+#define SUBREG_WORD(RTX) XCUINT(RTX, 1, SUBREG)
 
 /* 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.  
+   extension.
 
    When used as a LHS, is means that this extension must be done
    when assigning to SUBREG_REG.  */
@@ -999,8 +1041,10 @@ extern rtx gen_lowpart_if_possible        PARAMS ((enum machine_mode, rtx));
 extern rtx gen_highpart                        PARAMS ((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, int, int, enum machine_mode));
-extern rtx operand_subword_force       PARAMS ((rtx, int, enum machine_mode));
+extern rtx operand_subword             PARAMS ((rtx, unsigned int, int,
+                                                enum machine_mode));
+extern rtx operand_subword_force       PARAMS ((rtx, unsigned int,
+                                                enum machine_mode));
 extern int subreg_lowpart_p            PARAMS ((rtx));
 extern rtx make_safe_from              PARAMS ((rtx, rtx));
 extern rtx convert_memory_address      PARAMS ((enum machine_mode, rtx));
@@ -1101,8 +1145,10 @@ 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 enum machine_mode choose_hard_reg_mode PARAMS ((int, int));
+extern rtx expand_complex_abs          PARAMS ((enum machine_mode, rtx, rtx,
+                                                int));
+extern enum machine_mode choose_hard_reg_mode PARAMS ((unsigned int,
+                                                      unsigned int));
 extern void set_unique_reg_note         PARAMS ((rtx, enum reg_note, rtx));
 
 /* Functions in rtlanal.c */
@@ -1126,16 +1172,21 @@ extern int reg_set_p                    PARAMS ((rtx, rtx));
 extern rtx single_set                  PARAMS ((rtx));
 extern int multiple_sets               PARAMS ((rtx));
 extern rtx find_last_value             PARAMS ((rtx, rtx *, rtx, int));
-extern int refers_to_regno_p           PARAMS ((int, int, rtx, rtx *));
+extern int refers_to_regno_p           PARAMS ((unsigned int, unsigned int,
+                                                rtx, rtx *));
 extern int reg_overlap_mentioned_p     PARAMS ((rtx, rtx));
-extern void note_stores                        PARAMS ((rtx, void (*)(rtx, rtx, void *), void *));
+extern void note_stores                        PARAMS ((rtx,
+                                                void (*) (rtx, 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, int));
+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, int));
+extern rtx find_regno_note             PARAMS ((rtx, enum reg_note,
+                                                unsigned int));
 extern int find_reg_fusage             PARAMS ((rtx, enum rtx_code, rtx));
-extern int find_regno_fusage           PARAMS ((rtx, enum rtx_code, int));
+extern int find_regno_fusage           PARAMS ((rtx, enum rtx_code,
+                                                unsigned int));
 extern void remove_note                        PARAMS ((rtx, rtx));
 extern int side_effects_p              PARAMS ((rtx));
 extern int volatile_refs_p             PARAMS ((rtx));
@@ -1143,11 +1194,12 @@ 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 *, int, int));
+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 ((int, rtx));
+extern rtx regno_use_in                        PARAMS ((unsigned int, rtx));
 extern int auto_inc_p                  PARAMS ((rtx));
 extern void remove_node_from_expr_list PARAMS ((rtx, rtx *));
 extern int insns_safe_to_move_p         PARAMS ((rtx, rtx, rtx *));
@@ -1199,7 +1251,7 @@ extern rtx const_true_rtx;
 
 extern rtx const_tiny_rtx[3][(int) MAX_MACHINE_MODE];
 
-/* Returns a constant 0 rtx in mode MODE.  Integer modes are treated the 
+/* Returns a constant 0 rtx in mode MODE.  Integer modes are treated the
    same as VOIDmode.  */
 
 #define CONST0_RTX(MODE) (const_tiny_rtx[0][(int) (MODE)])
@@ -1339,7 +1391,7 @@ extern rtx gen_rtx_MEM PARAMS ((enum machine_mode, rtx));
 /* This points to the Canonical Frame Address of the function.  This
    should corrospond to the CFA produced by INCOMING_FRAME_SP_OFFSET,
    but is calculated relative to the arg pointer for simplicity; the
-   frame pointer nor stack pointer are necessarily fixed relative to 
+   frame pointer nor stack pointer are necessarily fixed relative to
    the CFA until after reload.  */
 
 #define virtual_cfa_rtx                        (global_rtl[GR_VIRTUAL_CFA])
@@ -1486,9 +1538,9 @@ extern void remove_unncessary_notes             PARAMS ((void));
 extern void add_clobbers               PARAMS ((rtx, int));
 
 /* In combine.c */
-extern int combine_instructions        PARAMS ((rtx, int));
-extern int extended_count              PARAMS ((rtx, enum machine_mode, int));
-extern rtx remove_death                        PARAMS ((int, 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 *));
@@ -1585,8 +1637,8 @@ 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, int, int));
-extern void reg_scan_update            PARAMS ((rtx, rtx, int));
+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));
@@ -1709,6 +1761,7 @@ extern void fancy_abort PARAMS ((const char *, int, const char *))
 #endif
 
 /* In alias.c */
+extern rtx canon_rtx                    PARAMS ((rtx));
 extern int true_dependence             PARAMS ((rtx, enum machine_mode, rtx,
                                                int (*)(rtx)));
 extern int read_dependence             PARAMS ((rtx, rtx));
@@ -1745,4 +1798,8 @@ extern void convert_from_ssa              PARAMS ((void));
 
 extern rtx stack_limit_rtx;
 
+/* In regrename.c */
+
+extern void regrename_optimize         PARAMS ((void));
+
 #endif /* _RTL_H */