Commit 27bf36f3 by Richard Henderson Committed by Richard Henderson

rx: Move SELECT_CC_MODE to function.

Rewrite to look at comparison codes, not arithmetic codes.

From-SVN: r168915
parent 999209d0
2011-01-17 Richard Henderson <rth@redhat.com>
* 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 <rth@redhat.com>
* except.c (dump_eh_tree): Fix stray ; after for statement.
2011-01-17 Richard Guenther <rguenther@suse.de>
......
......@@ -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 */
......@@ -2757,6 +2757,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)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment