aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorDaniel Gutson <dgutson@codesourcery.com>2009-09-04 02:52:08 +0000
committerDaniel Gutson <dgutson@gcc.gnu.org>2009-09-04 02:52:08 +0000
commitca96ed43b2666f3552806f84ff1229e76fb042d2 (patch)
treec42128928f5a992274cc7e584fea7e404deb3a4b /gcc
parent9af43ec7a23b80c4fa17681245303ebdb1262fb5 (diff)
downloadgcc-ca96ed43b2666f3552806f84ff1229e76fb042d2.zip
gcc-ca96ed43b2666f3552806f84ff1229e76fb042d2.tar.gz
gcc-ca96ed43b2666f3552806f84ff1229e76fb042d2.tar.bz2
arm.md (UNSPEC_RBIT): New constant.
2009-09-03 Daniel Gutson <dgutson@codesourcery.com> * config/arm/arm.md (UNSPEC_RBIT): New constant. (rbitsi2): New insn. (ctzsi2): New expand. * config/arm/arm.h (CTZ_DEFINED_VALUE_AT_ZERO): New macro. testsuite/ * gcc.target/arm/ctz.c: New test case. From-SVN: r151402
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog10
-rw-r--r--gcc/config/arm/arm.h1
-rw-r--r--gcc/config/arm/arm.md21
-rw-r--r--gcc/testsuite/gcc.target/arm/ctz.c12
4 files changed, 44 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 3cbcff3..a3a0f8b 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,13 @@
+2009-09-03 Daniel Gutson <dgutson@codesourcery.com>
+
+ * config/arm/arm.md (UNSPEC_RBIT): New constant.
+ (rbitsi2): New insn.
+ (ctzsi2): New expand.
+ * config/arm/arm.h (CTZ_DEFINED_VALUE_AT_ZERO): New macro.
+
+ testsuite/
+ * gcc.target/arm/ctz.c: New test case.
+
2009-09-03 Martin Jambor <mjambor@suse.cz>
* tree-sra.c (duplicate_expr_for_different_base): Removed.
diff --git a/gcc/config/arm/arm.h b/gcc/config/arm/arm.h
index ae32da5..215c9fb 100644
--- a/gcc/config/arm/arm.h
+++ b/gcc/config/arm/arm.h
@@ -2368,6 +2368,7 @@ extern int making_const_table;
/* The arm5 clz instruction returns 32. */
#define CLZ_DEFINED_VALUE_AT_ZERO(MODE, VALUE) ((VALUE) = 32, 1)
+#define CTZ_DEFINED_VALUE_AT_ZERO(MODE, VALUE) ((VALUE) = 32, 1)
#undef ASM_APP_OFF
#define ASM_APP_OFF (TARGET_THUMB1 ? "\t.code\t16\n" : \
diff --git a/gcc/config/arm/arm.md b/gcc/config/arm/arm.md
index 09a1b08..fd00c70 100644
--- a/gcc/config/arm/arm.md
+++ b/gcc/config/arm/arm.md
@@ -100,6 +100,7 @@
(UNSPEC_GOTSYM_OFF 24) ; The offset of the start of the the GOT from a
; a given symbolic address.
(UNSPEC_THUMB1_CASESI 25) ; A Thumb1 compressed dispatch-table call.
+ (UNSPEC_RBIT 26) ; rbit operation.
]
)
@@ -10955,6 +10956,26 @@
[(set_attr "predicable" "yes")
(set_attr "insn" "clz")])
+(define_insn "rbitsi2"
+ [(set (match_operand:SI 0 "s_register_operand" "=r")
+ (unspec:SI [(match_operand:SI 1 "s_register_operand" "r")] UNSPEC_RBIT))]
+ "TARGET_32BIT && arm_arch_thumb2"
+ "rbit%?\\t%0, %1"
+ [(set_attr "predicable" "yes")
+ (set_attr "insn" "clz")])
+
+(define_expand "ctzsi2"
+ [(set (match_operand:SI 0 "s_register_operand" "")
+ (ctz:SI (match_operand:SI 1 "s_register_operand" "")))]
+ "TARGET_32BIT && arm_arch_thumb2"
+ "
+ rtx tmp = gen_reg_rtx (SImode);
+ emit_insn (gen_rbitsi2 (tmp, operands[1]));
+ emit_insn (gen_clzsi2 (operands[0], tmp));
+ DONE;
+ "
+)
+
;; V5E instructions.
(define_insn "prefetch"
diff --git a/gcc/testsuite/gcc.target/arm/ctz.c b/gcc/testsuite/gcc.target/arm/ctz.c
new file mode 100644
index 0000000..63e9d02
--- /dev/null
+++ b/gcc/testsuite/gcc.target/arm/ctz.c
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target arm32 } */
+/* { dg-options "-O2 -march=armv6t2" } */
+
+unsigned int functest(unsigned int x)
+{
+ return __builtin_ctz(x);
+}
+
+/* { dg-final { scan-assembler "rbit" } } */
+/* { dg-final { scan-assembler "clz" } } */
+/* { dg-final { scan-assembler-not "rsb" } } */