@@ -21,3 +21,5 @@
CC_MODE (CC_ZS);
CC_MODE (CC_ZSO);
CC_MODE (CC_ZSC);
+
+CC_MODE (CC_F); /* fcmp */
@@ -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 */
@@ -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
@@ -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)
From: Richard Henderson <rth@twiddle.net> --- gcc/config/rx/rx-modes.def | 2 ++ gcc/config/rx/rx-protos.h | 2 ++ gcc/config/rx/rx.c | 29 +++++++++++++++++++++++++++++ gcc/config/rx/rx.h | 10 +--------- 4 files changed, 34 insertions(+), 9 deletions(-)