login
Header Space

 
 

[3/3] Use __fls for fls64 on 64-bit archs

Score:
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
To: Andrew Morton <akpm@...>, linux-arch <linux-arch@...>
Cc: Ingo Molnar <mingo@...>, Andi Kleen <andi@...>, LKML <linux-kernel@...>, <heukelum@...>
Date: Saturday, March 15, 2008 - 1:32 pm

Use __fls for fls64 on 64-bit archs. The implementation for
64-bit archs is moved from x86_64 to asm-generic.

Signed-off-by: Alexander van Heukelum <heukelum@fastmail.fm>
---
 include/asm-generic/bitops/fls64.h |   22 ++++++++++++++++++++++
 include/asm-x86/bitops_64.h        |   15 ++-------------
 2 files changed, 24 insertions(+), 13 deletions(-)

diff --git a/include/asm-generic/bitops/fls64.h b/include/asm-generic/bitops/fls64.h
index 1b6b17c..86d403f 100644
--- a/include/asm-generic/bitops/fls64.h
+++ b/include/asm-generic/bitops/fls64.h
@@ -3,6 +3,18 @@
 
 #include <asm/types.h>
 
+/**
+ * fls64 - find last set bit in a 64-bit word
+ * @x: the word to search
+ *
+ * This is defined in a similar way as the libc and compiler builtin
+ * ffsll, but returns the position of the most significant set bit.
+ *
+ * fls64(value) returns 0 if value is 0 or the position of the last
+ * set bit if value is nonzero. The last (most significant) bit is
+ * at position 64.
+ */
+#if BITS_PER_LONG == 32
 static inline int fls64(__u64 x)
 {
 	__u32 h = x >> 32;
@@ -10,5 +22,15 @@ static inline int fls64(__u64 x)
 		return fls(h) + 32;
 	return fls(x);
 }
+#elif BITS_PER_LONG == 64
+static inline int fls64(__u64 x)
+{
+	if (x == 0)
+		return 0;
+	return __fls(x) + 1;
+}
+#else
+#error BITS_PER_LONG not 32 or 64
+#endif
 
 #endif /* _ASM_GENERIC_BITOPS_FLS64_H_ */
diff --git a/include/asm-x86/bitops_64.h b/include/asm-x86/bitops_64.h
index aaf1519..1f1f796 100644
--- a/include/asm-x86/bitops_64.h
+++ b/include/asm-x86/bitops_64.h
@@ -112,19 +112,6 @@ static inline int ffs(int x)
 }
 
 /**
- * fls64 - find last bit set in 64 bit word
- * @x: the word to search
- *
- * This is defined the same way as fls.
- */
-static inline int fls64(__u64 x)
-{
-	if (x == 0)
-		return 0;
-	return __fls(x) + 1;
-}
-
-/**
  * fls - find last bit set
  * @x: the word to search
  *
@@ -146,6 +133,8 @@ static inline int fls(int x)
 
 #endif /* __KERNEL__ */
 
+#include <asm-generic/bitops/fls64.h>
+
 #ifdef __KERNEL__
 
 #include <asm-generic/bitops/ext2-non-atomic.h>
--
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
[0/3] Improve generic fls64 for 64-bit machines, Alexander van Heukelum, (Sat Mar 15, 1:29 pm)
Re: [0/3] Improve generic fls64 for 64-bit machines, Benny Halevy, (Thu Apr 3, 1:19 pm)
Re: [0/3] Improve generic fls64 for 64-bit machines, Alexander van Heukelum, (Fri Apr 4, 10:22 am)
Re: [0/3] Improve generic fls64 for 64-bit machines, Benny Halevy, (Sun Apr 6, 11:03 am)
Re: [0/3] Improve generic fls64 for 64-bit machines, Alexander van Heukelum, (Sun Apr 6, 3:10 pm)
Re: [0/3] Improve generic fls64 for 64-bit machines, Ingo Molnar, (Fri Mar 21, 9:10 am)
[3/3] Use __fls for fls64 on 64-bit archs, Alexander van Heukelum, (Sat Mar 15, 1:32 pm)
Re: [3/3] Use __fls for fls64 on 64-bit archs, Ricardo M. Correia, (Sat Jul 5, 12:56 pm)
[PATCH] x86: fix description of __fls(): __fls(0) is undefined, Alexander van Heukelum, (Sat Jul 5, 1:53 pm)
[2/3] Implement __fls on all 64-bit archs, Alexander van Heukelum, (Sat Mar 15, 1:31 pm)
[1/3] Introduce a generic __fls implementation, Alexander van Heukelum, (Sat Mar 15, 1:30 pm)
speck-geostationary