Commit 56a6b1eb authored by Alexander van Heukelum's avatar Alexander van Heukelum Committed by Ingo Molnar

generic: implement __fls on all 64-bit archs

Implement __fls on all 64-bit archs:

alpha has an implementation of fls64.
	Added __fls(x) = fls64(x) - 1.

ia64 has fls, but not __fls.
	Added __fls based on code of fls.

mips and powerpc have __ilog2, which is the same as __fls.
	Added __fls = __ilog2.

parisc, s390, sh and sparc64:
	Include generic __fls.

x86_64 already has __fls.
Signed-off-by: default avatarAlexander van Heukelum <heukelum@fastmail.fm>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent 7d9dff22
...@@ -388,6 +388,11 @@ static inline int fls64(unsigned long x) ...@@ -388,6 +388,11 @@ static inline int fls64(unsigned long x)
} }
#endif #endif
static inline unsigned long __fls(unsigned long x)
{
return fls64(x) - 1;
}
static inline int fls(int x) static inline int fls(int x)
{ {
return fls64((unsigned int) x); return fls64((unsigned int) x);
......
...@@ -407,6 +407,22 @@ fls (int t) ...@@ -407,6 +407,22 @@ fls (int t)
return ia64_popcnt(x); return ia64_popcnt(x);
} }
/*
* Find the last (most significant) bit set. Undefined for x==0.
* Bits are numbered from 0..63 (e.g., __fls(9) == 3).
*/
static inline unsigned long
__fls (unsigned long x)
{
x |= x >> 1;
x |= x >> 2;
x |= x >> 4;
x |= x >> 8;
x |= x >> 16;
x |= x >> 32;
return ia64_popcnt(x) - 1;
}
#include <asm-generic/bitops/fls64.h> #include <asm-generic/bitops/fls64.h>
/* /*
......
...@@ -591,6 +591,11 @@ static inline int __ilog2(unsigned long x) ...@@ -591,6 +591,11 @@ static inline int __ilog2(unsigned long x)
return 63 - lz; return 63 - lz;
} }
static inline unsigned long __fls(unsigned long x)
{
return __ilog2(x);
}
#if defined(CONFIG_CPU_MIPS32) || defined(CONFIG_CPU_MIPS64) #if defined(CONFIG_CPU_MIPS32) || defined(CONFIG_CPU_MIPS64)
/* /*
......
...@@ -210,6 +210,7 @@ static __inline__ int fls(int x) ...@@ -210,6 +210,7 @@ static __inline__ int fls(int x)
return ret; return ret;
} }
#include <asm-generic/bitops/__fls.h>
#include <asm-generic/bitops/fls64.h> #include <asm-generic/bitops/fls64.h>
#include <asm-generic/bitops/hweight.h> #include <asm-generic/bitops/hweight.h>
#include <asm-generic/bitops/lock.h> #include <asm-generic/bitops/lock.h>
......
...@@ -313,6 +313,11 @@ static __inline__ int fls(unsigned int x) ...@@ -313,6 +313,11 @@ static __inline__ int fls(unsigned int x)
return 32 - lz; return 32 - lz;
} }
static __inline__ unsigned long __fls(unsigned long x)
{
return __ilog2(x);
}
/* /*
* 64-bit can do this using one cntlzd (count leading zeroes doubleword) * 64-bit can do this using one cntlzd (count leading zeroes doubleword)
* instruction; for 32-bit we use the generic version, which does two * instruction; for 32-bit we use the generic version, which does two
......
...@@ -769,6 +769,7 @@ static inline int sched_find_first_bit(unsigned long *b) ...@@ -769,6 +769,7 @@ static inline int sched_find_first_bit(unsigned long *b)
} }
#include <asm-generic/bitops/fls.h> #include <asm-generic/bitops/fls.h>
#include <asm-generic/bitops/__fls.h>
#include <asm-generic/bitops/fls64.h> #include <asm-generic/bitops/fls64.h>
#include <asm-generic/bitops/hweight.h> #include <asm-generic/bitops/hweight.h>
......
...@@ -95,6 +95,7 @@ static inline unsigned long ffz(unsigned long word) ...@@ -95,6 +95,7 @@ static inline unsigned long ffz(unsigned long word)
#include <asm-generic/bitops/ext2-atomic.h> #include <asm-generic/bitops/ext2-atomic.h>
#include <asm-generic/bitops/minix.h> #include <asm-generic/bitops/minix.h>
#include <asm-generic/bitops/fls.h> #include <asm-generic/bitops/fls.h>
#include <asm-generic/bitops/__fls.h>
#include <asm-generic/bitops/fls64.h> #include <asm-generic/bitops/fls64.h>
#endif /* __KERNEL__ */ #endif /* __KERNEL__ */
......
...@@ -34,6 +34,7 @@ extern void change_bit(unsigned long nr, volatile unsigned long *addr); ...@@ -34,6 +34,7 @@ extern void change_bit(unsigned long nr, volatile unsigned long *addr);
#include <asm-generic/bitops/ffz.h> #include <asm-generic/bitops/ffz.h>
#include <asm-generic/bitops/__ffs.h> #include <asm-generic/bitops/__ffs.h>
#include <asm-generic/bitops/fls.h> #include <asm-generic/bitops/fls.h>
#include <asm-generic/bitops/__fls.h>
#include <asm-generic/bitops/fls64.h> #include <asm-generic/bitops/fls64.h>
#ifdef __KERNEL__ #ifdef __KERNEL__
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment