aarch64-modes.def: Define ccmp CC mode.
authorZhenqiang Chen <zhenqiang.chen@linaro.org>
Mon, 17 Nov 2014 06:12:43 +0000 (06:12 +0000)
committerZhenqiang Chen <zqchen@gcc.gnu.org>
Mon, 17 Nov 2014 06:12:43 +0000 (06:12 +0000)
2014-11-17  Zhenqiang Chen  <zhenqiang.chen@linaro.org>

* config/aarch64/aarch64-modes.def: Define ccmp CC mode.
* config/aarch64/aarch64.c (aarch64_get_condition_code_1): New function
extacted from aarch64_get_condition_code.
(aarch64_get_condition_code): Call aarch64_get_condition_code_1.
config/aarch64/predicates.md (ccmp_cc_register): New predicate.

From-SVN: r217643

gcc/ChangeLog
gcc/config/aarch64/aarch64-modes.def
gcc/config/aarch64/aarch64.c
gcc/config/aarch64/predicates.md

index 6e3045def0ac1161be6f2655c01caaf50a63993e..c7f353e8b9d3597d1184472c4115d1c537ad2708 100644 (file)
@@ -1,3 +1,11 @@
+2014-11-17  Zhenqiang Chen  <zhenqiang.chen@linaro.org>
+
+       * config/aarch64/aarch64-modes.def: Define ccmp CC mode.
+       * config/aarch64/aarch64.c (aarch64_get_condition_code_1): New function
+       extacted from aarch64_get_condition_code.
+       (aarch64_get_condition_code): Call aarch64_get_condition_code_1.
+       config/aarch64/predicates.md (ccmp_cc_register): New predicate.
+
 014-11-17  Zhenqiang Chen  <zhenqiang.chen@linaro.org>
 
        * config/aarch64/constraints.md (Usn, aarch64_ccmp_immediate,
index f9c436948a6f5177761ee1d288809f05a7e841c1..ccc1a33a69926ff6222354aabcf7a1fc39049c1f 100644 (file)
@@ -25,6 +25,16 @@ CC_MODE (CC_ZESWP); /* zero-extend LHS (but swap to make it RHS).  */
 CC_MODE (CC_SESWP); /* sign-extend LHS (but swap to make it RHS).  */
 CC_MODE (CC_NZ);    /* Only N and Z bits of condition flags are valid.  */
 CC_MODE (CC_Z);     /* Only Z bit of condition flags is valid.  */
+CC_MODE (CC_DNE);
+CC_MODE (CC_DEQ);
+CC_MODE (CC_DLE);
+CC_MODE (CC_DLT);
+CC_MODE (CC_DGE);
+CC_MODE (CC_DGT);
+CC_MODE (CC_DLEU);
+CC_MODE (CC_DLTU);
+CC_MODE (CC_DGEU);
+CC_MODE (CC_DGTU);
 
 /* Vector modes.  */
 VECTOR_MODES (INT, 8);        /*       V8QI V4HI V2SI.  */
index 92937bb87b48d0f935c1e1c344a7193d1e8c4538..86549979773ecec29f6a49f795fde02cab464a98 100644 (file)
@@ -3625,6 +3625,9 @@ aarch64_select_cc_mode (RTX_CODE code, rtx x, rtx y)
   return CCmode;
 }
 
+static int
+aarch64_get_condition_code_1 (enum machine_mode, enum rtx_code);
+
 int
 aarch64_get_condition_code (rtx x)
 {
@@ -3633,7 +3636,13 @@ aarch64_get_condition_code (rtx x)
 
   if (GET_MODE_CLASS (mode) != MODE_CC)
     mode = SELECT_CC_MODE (comp_code, XEXP (x, 0), XEXP (x, 1));
+  return aarch64_get_condition_code_1 (mode, comp_code);
+}
 
+static int
+aarch64_get_condition_code_1 (enum machine_mode mode, enum rtx_code comp_code)
+{
+  int ne = -1, eq = -1;
   switch (mode)
     {
     case CCFPmode:
@@ -3656,6 +3665,56 @@ aarch64_get_condition_code (rtx x)
        }
       break;
 
+    case CC_DNEmode:
+      ne = AARCH64_NE;
+      eq = AARCH64_EQ;
+      break;
+
+    case CC_DEQmode:
+      ne = AARCH64_EQ;
+      eq = AARCH64_NE;
+      break;
+
+    case CC_DGEmode:
+      ne = AARCH64_GE;
+      eq = AARCH64_LT;
+      break;
+
+    case CC_DLTmode:
+      ne = AARCH64_LT;
+      eq = AARCH64_GE;
+      break;
+
+    case CC_DGTmode:
+      ne = AARCH64_GT;
+      eq = AARCH64_LE;
+      break;
+
+    case CC_DLEmode:
+      ne = AARCH64_LE;
+      eq = AARCH64_GT;
+      break;
+
+    case CC_DGEUmode:
+      ne = AARCH64_CS;
+      eq = AARCH64_CC;
+      break;
+
+    case CC_DLTUmode:
+      ne = AARCH64_CC;
+      eq = AARCH64_CS;
+      break;
+
+    case CC_DGTUmode:
+      ne = AARCH64_HI;
+      eq = AARCH64_LS;
+      break;
+
+    case CC_DLEUmode:
+      ne = AARCH64_LS;
+      eq = AARCH64_HI;
+      break;
+
     case CCmode:
       switch (comp_code)
        {
@@ -3716,6 +3775,14 @@ aarch64_get_condition_code (rtx x)
       return -1;
       break;
     }
+
+  if (comp_code == NE)
+    return ne;
+
+  if (comp_code == EQ)
+    return eq;
+
+  return -1;
 }
 
 bool
index aa8f6f61d566f5d5406f6f21b0c6cd1b461b979e..f6fe58c5edb9da9807baa3bab9fc9d6b97f51fa6 100644 (file)
   (ior (match_operand 0 "register_operand")
        (match_operand 0 "aarch64_ccmp_immediate")))
 
+(define_special_predicate "ccmp_cc_register"
+  (and (match_code "reg")
+       (and (match_test "REGNO (op) == CC_REGNUM")
+           (ior (match_test "mode == GET_MODE (op)")
+                (match_test "mode == VOIDmode
+                             && (GET_MODE (op) == CC_DNEmode
+                                 || GET_MODE (op) == CC_DEQmode
+                                 || GET_MODE (op) == CC_DLEmode
+                                 || GET_MODE (op) == CC_DLTmode
+                                 || GET_MODE (op) == CC_DGEmode
+                                 || GET_MODE (op) == CC_DGTmode
+                                 || GET_MODE (op) == CC_DLEUmode
+                                 || GET_MODE (op) == CC_DLTUmode
+                                 || GET_MODE (op) == CC_DGEUmode
+                                 || GET_MODE (op) == CC_DGTUmode)"))))
+)
+
 (define_predicate "aarch64_simd_register"
   (and (match_code "reg")
        (ior (match_test "REGNO_REG_CLASS (REGNO (op)) == FP_LO_REGS")