From: Richard Henderson Date: Mon, 17 Jan 2011 17:39:44 +0000 (-0800) Subject: rx: Move SELECT_CC_MODE to function. X-Git-Tag: upstream/12.2.0~87038 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=27bf36f3e5540426d1d83b95c66d383f70aa314f;p=platform%2Fupstream%2Fgcc.git rx: Move SELECT_CC_MODE to function. Rewrite to look at comparison codes, not arithmetic codes. From-SVN: r168915 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e60aec4..3e94cc7 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,12 @@ 2011-01-17 Richard Henderson + * config/rx/rx-modes.def (CC_F): New mode. + * config/rx/rx.c (rx_select_cc_mode): New. + * config/rx/rx.h (SELECT_CC_MODE): Use it. + * config/rx/rx-protos.h: Update. + +2011-01-17 Richard Henderson + * except.c (dump_eh_tree): Fix stray ; after for statement. 2011-01-17 Richard Guenther diff --git a/gcc/config/rx/rx-modes.def b/gcc/config/rx/rx-modes.def index 0c4c192..31e3225 100644 --- a/gcc/config/rx/rx-modes.def +++ b/gcc/config/rx/rx-modes.def @@ -21,3 +21,5 @@ CC_MODE (CC_ZS); CC_MODE (CC_ZSO); CC_MODE (CC_ZSC); + +CC_MODE (CC_F); /* fcmp */ diff --git a/gcc/config/rx/rx-protos.h b/gcc/config/rx/rx-protos.h index 528ccb3..c5b7b6c 100644 --- a/gcc/config/rx/rx-protos.h +++ b/gcc/config/rx/rx-protos.h @@ -24,6 +24,7 @@ /* A few abbreviations to make the prototypes shorter. */ #define Mmode enum machine_mode #define Fargs CUMULATIVE_ARGS +#define Rcode enum rtx_code extern void rx_expand_prologue (void); extern int rx_initial_elimination_offset (int, int); @@ -40,6 +41,7 @@ extern bool rx_is_legitimate_constant (rtx); extern bool rx_is_mode_dependent_addr (rtx); extern bool rx_is_restricted_memory_address (rtx, Mmode); extern void rx_notice_update_cc (rtx body, rtx insn); +extern Mmode rx_select_cc_mode (Rcode, rtx, rtx); #endif #endif /* GCC_RX_PROTOS_H */ diff --git a/gcc/config/rx/rx.c b/gcc/config/rx/rx.c index 8f6f384..b5a996ff 100644 --- a/gcc/config/rx/rx.c +++ b/gcc/config/rx/rx.c @@ -2756,6 +2756,35 @@ rx_memory_move_cost (enum machine_mode mode, reg_class_t regclass, bool in) { return 2 + memory_move_secondary_cost (mode, regclass, in); } + +/* Return the minimal CC mode needed to implement (CMP_CODE X Y). */ + +enum machine_mode +rx_select_cc_mode (enum rtx_code cmp_code, rtx x, rtx y ATTRIBUTE_UNUSED) +{ + if (GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT) + return CC_Fmode; + + switch (cmp_code) + { + case EQ: + case NE: + case LT: + case GE: + return CC_ZSmode; + case GT: + case LE: + return CC_ZSOmode; + case GEU: + case LTU: + case GTU: + case LEU: + return CC_ZSCmode; + default: + return CCmode; + } +} + #undef TARGET_FUNCTION_VALUE #define TARGET_FUNCTION_VALUE rx_function_value diff --git a/gcc/config/rx/rx.h b/gcc/config/rx/rx.h index 35b5d58..d26c80c 100644 --- a/gcc/config/rx/rx.h +++ b/gcc/config/rx/rx.h @@ -624,12 +624,4 @@ extern int rx_float_compare_mode; #define BRANCH_COST(SPEED,PREDICT) 1 #define REGISTER_MOVE_COST(MODE,FROM,TO) 2 -#define SELECT_CC_MODE(OP,X,Y) \ - (GET_MODE_CLASS (GET_MODE (X)) == MODE_FLOAT ? CC_ZSmode : \ - (GET_CODE (X) == PLUS || GET_CODE (X) == MINUS ? CC_ZSCmode : \ - (GET_CODE (X) == ABS ? CC_ZSOmode : \ - (GET_CODE (X) == AND || GET_CODE (X) == NOT || GET_CODE (X) == IOR \ - || GET_CODE (X) == XOR || GET_CODE (X) == ROTATE \ - || GET_CODE (X) == ROTATERT || GET_CODE (X) == ASHIFTRT \ - || GET_CODE (X) == LSHIFTRT || GET_CODE (X) == ASHIFT ? CC_ZSmode : \ - CCmode)))) +#define SELECT_CC_MODE(OP,X,Y) rx_select_cc_mode(OP, X, Y)