[1/3][ARM] Keep ctz expressions together until after reload
authorKyrylo Tkachov <kyrylo.tkachov@arm.com>
Mon, 6 Jun 2016 15:59:48 +0000 (15:59 +0000)
committerKyrylo Tkachov <ktkachov@gcc.gnu.org>
Mon, 6 Jun 2016 15:59:48 +0000 (15:59 +0000)
PR middle-end/37780
* config/arm/arm.md (ctzsi2): Convert to define_insn_and_split.

From-SVN: r237138

gcc/ChangeLog
gcc/config/arm/arm.md

index 3bffb744b8d5b1985247504952c91e71c99bc110..7d8e76b3cd8f5635ace7556bcda3dd22115a3ba3 100644 (file)
@@ -1,3 +1,8 @@
+2016-06-06  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
+
+       PR middle-end/37780
+       * config/arm/arm.md (ctzsi2): Convert to define_insn_and_split.
+
 2016-06-06  Bernd Edlinger  <bernd.edlinger@hotmail.de>
 
        PR c/24414
index 451011d9486077ccbffd22518dc0837f63d087cd..04714a1335e5915e1237f430c9561bc6ef52e976 100644 (file)
    (set_attr "predicable_short_it" "no")
    (set_attr "type" "clz")])
 
-(define_expand "ctzsi2"
- [(set (match_operand:SI           0 "s_register_operand" "")
-       (ctz:SI (match_operand:SI  1 "s_register_operand" "")))]
+;; Keep this as a CTZ expression until after reload and then split
+;; into RBIT + CLZ.  Since RBIT is represented as an UNSPEC it is unlikely
+;; to fold with any other expression.
+
+(define_insn_and_split "ctzsi2"
+ [(set (match_operand:SI           0 "s_register_operand" "=r")
+       (ctz:SI (match_operand:SI  1 "s_register_operand" "r")))]
   "TARGET_32BIT && arm_arch_thumb2"
+  "#"
+  "&& reload_completed"
+  [(const_int 0)]
   "
-   {
-     rtx tmp = gen_reg_rtx (SImode); 
-     emit_insn (gen_rbitsi2 (tmp, operands[1]));
-     emit_insn (gen_clzsi2 (operands[0], tmp));
-   }
-   DONE;
-  "
-)
+  emit_insn (gen_rbitsi2 (operands[0], operands[1]));
+  emit_insn (gen_clzsi2 (operands[0], operands[0]));
+  DONE;
+")
 
 ;; V5E instructions.