|
@@ -215,7 +215,6 @@ extern int _find_next_bit_be(const unsigned long *p, int size, int offset);
|
|
|
|
|
|
#if __LINUX_ARM_ARCH__ < 5
|
|
|
|
|
|
-#include <asm-generic/bitops/ffz.h>
|
|
|
#include <asm-generic/bitops/__fls.h>
|
|
|
#include <asm-generic/bitops/__ffs.h>
|
|
|
#include <asm-generic/bitops/fls.h>
|
|
@@ -223,93 +222,20 @@ extern int _find_next_bit_be(const unsigned long *p, int size, int offset);
|
|
|
|
|
|
#else
|
|
|
|
|
|
-static inline int constant_fls(int x)
|
|
|
-{
|
|
|
- int r = 32;
|
|
|
-
|
|
|
- if (!x)
|
|
|
- return 0;
|
|
|
- if (!(x & 0xffff0000u)) {
|
|
|
- x <<= 16;
|
|
|
- r -= 16;
|
|
|
- }
|
|
|
- if (!(x & 0xff000000u)) {
|
|
|
- x <<= 8;
|
|
|
- r -= 8;
|
|
|
- }
|
|
|
- if (!(x & 0xf0000000u)) {
|
|
|
- x <<= 4;
|
|
|
- r -= 4;
|
|
|
- }
|
|
|
- if (!(x & 0xc0000000u)) {
|
|
|
- x <<= 2;
|
|
|
- r -= 2;
|
|
|
- }
|
|
|
- if (!(x & 0x80000000u)) {
|
|
|
- x <<= 1;
|
|
|
- r -= 1;
|
|
|
- }
|
|
|
- return r;
|
|
|
-}
|
|
|
-
|
|
|
-/*
|
|
|
- * On ARMv5 and above those functions can be implemented around the
|
|
|
- * clz instruction for much better code efficiency. __clz returns
|
|
|
- * the number of leading zeros, zero input will return 32, and
|
|
|
- * 0x80000000 will return 0.
|
|
|
- */
|
|
|
-static inline unsigned int __clz(unsigned int x)
|
|
|
-{
|
|
|
- unsigned int ret;
|
|
|
-
|
|
|
- asm("clz\t%0, %1" : "=r" (ret) : "r" (x));
|
|
|
-
|
|
|
- return ret;
|
|
|
-}
|
|
|
-
|
|
|
-/*
|
|
|
- * fls() returns zero if the input is zero, otherwise returns the bit
|
|
|
- * position of the last set bit, where the LSB is 1 and MSB is 32.
|
|
|
- */
|
|
|
-static inline int fls(int x)
|
|
|
-{
|
|
|
- if (__builtin_constant_p(x))
|
|
|
- return constant_fls(x);
|
|
|
-
|
|
|
- return 32 - __clz(x);
|
|
|
-}
|
|
|
-
|
|
|
-/*
|
|
|
- * __fls() returns the bit position of the last bit set, where the
|
|
|
- * LSB is 0 and MSB is 31. Zero input is undefined.
|
|
|
- */
|
|
|
-static inline unsigned long __fls(unsigned long x)
|
|
|
-{
|
|
|
- return fls(x) - 1;
|
|
|
-}
|
|
|
-
|
|
|
-/*
|
|
|
- * ffs() returns zero if the input was zero, otherwise returns the bit
|
|
|
- * position of the first set bit, where the LSB is 1 and MSB is 32.
|
|
|
- */
|
|
|
-static inline int ffs(int x)
|
|
|
-{
|
|
|
- return fls(x & -x);
|
|
|
-}
|
|
|
-
|
|
|
/*
|
|
|
- * __ffs() returns the bit position of the first bit set, where the
|
|
|
- * LSB is 0 and MSB is 31. Zero input is undefined.
|
|
|
+ * On ARMv5 and above, the gcc built-ins may rely on the clz instruction
|
|
|
+ * and produce optimal inlined code in all cases. On ARMv7 it is even
|
|
|
+ * better by also using the rbit instruction.
|
|
|
*/
|
|
|
-static inline unsigned long __ffs(unsigned long x)
|
|
|
-{
|
|
|
- return ffs(x) - 1;
|
|
|
-}
|
|
|
-
|
|
|
-#define ffz(x) __ffs( ~(x) )
|
|
|
+#include <asm-generic/bitops/builtin-__fls.h>
|
|
|
+#include <asm-generic/bitops/builtin-__ffs.h>
|
|
|
+#include <asm-generic/bitops/builtin-fls.h>
|
|
|
+#include <asm-generic/bitops/builtin-ffs.h>
|
|
|
|
|
|
#endif
|
|
|
|
|
|
+#include <asm-generic/bitops/ffz.h>
|
|
|
+
|
|
|
#include <asm-generic/bitops/fls64.h>
|
|
|
|
|
|
#include <asm-generic/bitops/sched.h>
|