Comments
Patch
@@ -703,6 +703,8 @@ do { \
#define CLZ_DEFINED_VALUE_AT_ZERO(MODE, VALUE) \
((VALUE) = ((MODE) == SImode ? 32 : 64), 2)
+#define CTZ_DEFINED_VALUE_AT_ZERO(MODE, VALUE) \
+ ((VALUE) = ((MODE) == SImode ? 32 : 64), 2)
#define INCOMING_RETURN_ADDR_RTX gen_rtx_REG (Pmode, LR_REGNUM)
@@ -153,6 +153,8 @@
(UNSPEC_CMTST 83) ; Used in aarch64-simd.md.
(UNSPEC_FMAX 83) ; Used in aarch64-simd.md.
(UNSPEC_FMIN 84) ; Used in aarch64-simd.md.
+ (UNSPEC_CLS 85) ; Used in aarch64-simd.md.
+ (UNSPEC_RBIT 86) ; Used in aarch64-simd.md.
]
)
@@ -2128,6 +2130,33 @@
[(set_attr "v8type" "clz")
(set_attr "mode" "<MODE>")])
+(define_insn "clrsb<mode>2"
+ [(set (match_operand:GPI 0 "register_operand" "=r")
+ (unspec:GPI [(match_operand:GPI 1 "register_operand" "r")] UNSPEC_CLS))]
+ ""
+ "cls\\t%<w>0, %<w>1"
+ [(set_attr "v8type" "clz")
+ (set_attr "mode" "<MODE>")])
+
+(define_insn "rbit<mode>2"
+ [(set (match_operand:GPI 0 "register_operand" "=r")
+ (unspec:GPI [(match_operand:GPI 1 "register_operand" "r")] UNSPEC_RBIT))]
+ ""
+ "rbit\\t%<w>0, %<w>1"
+ [(set_attr "v8type" "rbit")
+ (set_attr "mode" "<MODE>")])
+
+(define_expand "ctz<mode>2"
+ [(match_operand:GPI 0 "register_operand")
+ (match_operand:GPI 1 "register_operand")]
+ ""
+ {
+ emit_insn (gen_rbit<mode>2 (operands[0], operands[1]));
+ emit_insn (gen_clz<mode>2 (operands[0], operands[0]));
+ DONE;
+ }
+)
+
(define_insn "*and<mode>3nr_compare0"
[(set (reg:CC CC_REGNUM)
(compare:CC
new file mode 100644
@@ -0,0 +1,9 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+unsigned int functest(unsigned int x)
+{
+ return __builtin_clrsb(x);
+}
+
+/* { dg-final { scan-assembler "cls\tw" } } */
new file mode 100644
@@ -0,0 +1,9 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+unsigned int functest(unsigned int x)
+{
+ return __builtin_clz(x);
+}
+
+/* { dg-final { scan-assembler "clz\tw" } } */
new file mode 100644
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+unsigned int functest(unsigned int x)
+{
+ return __builtin_ctz(x);
+}
+
+/* { dg-final { scan-assembler "rbit\tw" } } */
+/* { dg-final { scan-assembler "clz\tw" } } */
+