OSDN Git Service

rx: Move SELECT_CC_MODE to function.
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 17 Jan 2011 17:39:44 +0000 (17:39 +0000)
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 17 Jan 2011 17:39:44 +0000 (17:39 +0000)
Rewrite to look at comparison codes, not arithmetic codes.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@168915 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/rx/rx-modes.def
gcc/config/rx/rx-protos.h
gcc/config/rx/rx.c
gcc/config/rx/rx.h

index e60aec4..3e94cc7 100644 (file)
@@ -1,5 +1,12 @@
 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>
index 0c4c192..31e3225 100644 (file)
@@ -21,3 +21,5 @@
 CC_MODE (CC_ZS);
 CC_MODE (CC_ZSO);
 CC_MODE (CC_ZSC);
+
+CC_MODE (CC_F);                /* fcmp */
index 528ccb3..c5b7b6c 100644 (file)
@@ -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
 \f
 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 */
index 8f6f384..b5a996f 100644 (file)
@@ -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;
+    }
+}
+
 \f
 #undef  TARGET_FUNCTION_VALUE
 #define TARGET_FUNCTION_VALUE          rx_function_value
index 35b5d58..d26c80c 100644 (file)
@@ -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)