aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsandra <sandra@138bc75d-0d04-0410-961f-82ee72b054a4>2006-05-12 13:53:27 +0000
committersandra <sandra@138bc75d-0d04-0410-961f-82ee72b054a4>2006-05-12 13:53:27 +0000
commit301f5dae3f962bd28c9724b74c42c47277b44c7e (patch)
tree45e3737a3b19d08135b5f466c936faf77a3bffb6
parentf81f318e44530a289cca61078be0babc34ee8307 (diff)
Implement clz using ff1 instruction on ColdFire architectures that support it
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/csl/coldfire-4_1@113723 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--ChangeLog.csl7
-rw-r--r--gcc/config/m68k/m68k.h4
-rw-r--r--gcc/config/m68k/m68k.md9
-rw-r--r--gcc/longlong.h5
4 files changed, 25 insertions, 0 deletions
diff --git a/ChangeLog.csl b/ChangeLog.csl
index c2bce035871..3cc3512c751 100644
--- a/ChangeLog.csl
+++ b/ChangeLog.csl
@@ -1,3 +1,10 @@
+2006-05-12 Sandra Loosemore <sandra@codesourcery.com>
+
+ * gcc/config/m68k/m68k.md ("clzsi2"): Define for ColdFire
+ architectures that support ff1 instruction.
+ * gcc/config/m68k/m68k.h (CLZ_DEFINED_VALUE_AT_ZERO): Ditto.
+ * gcc/longlong.h (count_leading_zeros, COUNT_LEADING_ZEROS_0): Ditto.
+
2006-05-11 Richard Sandiford <richard@codesourcery.com>
gcc/
diff --git a/gcc/config/m68k/m68k.h b/gcc/config/m68k/m68k.h
index 6e4498e6845..65b18dbff7b 100644
--- a/gcc/config/m68k/m68k.h
+++ b/gcc/config/m68k/m68k.h
@@ -852,6 +852,10 @@ __transfer_from_trampoline () \
#define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1
+/* The ColdFire FF1 instruction returns 32 for zero. */
+#define CLZ_DEFINED_VALUE_AT_ZERO(MODE, VALUE) \
+ ((VALUE) = 32, 1)
+
#define STORE_FLAG_VALUE (-1)
#define Pmode SImode
diff --git a/gcc/config/m68k/m68k.md b/gcc/config/m68k/m68k.md
index 2dfdc2edcb0..044d7a0d485 100644
--- a/gcc/config/m68k/m68k.md
+++ b/gcc/config/m68k/m68k.md
@@ -3986,6 +3986,15 @@
return "f<FP:prec>abs%.<FP:prec> %1,%0";
})
+;; bit indexing instructions
+
+;; ColdFire ff1 instruction implements clz.
+(define_insn "clzsi2"
+ [(set (match_operand:SI 0 "register_operand" "=d")
+ (clz:SI (match_operand:SI 1 "register_operand" "0")))]
+ "m68k_arch_isaaplus || m68k_arch_isac"
+ "ff1 %0")
+
;; one complement instructions
;; "one_cmpldi2" is mainly here to help combine().
diff --git a/gcc/longlong.h b/gcc/longlong.h
index cdcabed6a40..fbe3438565d 100644
--- a/gcc/longlong.h
+++ b/gcc/longlong.h
@@ -521,6 +521,11 @@ UDItype __umulsidi3 (USItype, USItype);
__asm__ ("bfffo %1{%b2:%b2},%0" \
: "=d" ((USItype) (count)) \
: "od" ((USItype) (x)), "n" (0))
+/* Some ColdFire architectures have a ff1 instruction supported via
+ __builtin_clz. */
+#elif defined (__mcfisaaplus__) || defined (__mcfisac__)
+#define count_leading_zeros(count,x) ((count) = __builtin_clz (x))
+#define COUNT_LEADING_ZEROS_0 32
#endif
#endif /* mc68000 */