mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-26 21:54:11 +08:00
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: Alexander van Heukelum <heukelum@fastmail.fm> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
parent
7d9dff22e8
commit
56a6b1eb7b
@ -388,6 +388,11 @@ static inline int fls64(unsigned long x)
|
||||
}
|
||||
#endif
|
||||
|
||||
static inline unsigned long __fls(unsigned long x)
|
||||
{
|
||||
return fls64(x) - 1;
|
||||
}
|
||||
|
||||
static inline int fls(int x)
|
||||
{
|
||||
return fls64((unsigned int) x);
|
||||
|
@ -407,6 +407,22 @@ fls (int t)
|
||||
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>
|
||||
|
||||
/*
|
||||
|
@ -591,6 +591,11 @@ static inline int __ilog2(unsigned long x)
|
||||
return 63 - lz;
|
||||
}
|
||||
|
||||
static inline unsigned long __fls(unsigned long x)
|
||||
{
|
||||
return __ilog2(x);
|
||||
}
|
||||
|
||||
#if defined(CONFIG_CPU_MIPS32) || defined(CONFIG_CPU_MIPS64)
|
||||
|
||||
/*
|
||||
|
@ -210,6 +210,7 @@ static __inline__ int fls(int x)
|
||||
return ret;
|
||||
}
|
||||
|
||||
#include <asm-generic/bitops/__fls.h>
|
||||
#include <asm-generic/bitops/fls64.h>
|
||||
#include <asm-generic/bitops/hweight.h>
|
||||
#include <asm-generic/bitops/lock.h>
|
||||
|
@ -313,6 +313,11 @@ static __inline__ int fls(unsigned int x)
|
||||
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)
|
||||
* 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)
|
||||
}
|
||||
|
||||
#include <asm-generic/bitops/fls.h>
|
||||
#include <asm-generic/bitops/__fls.h>
|
||||
#include <asm-generic/bitops/fls64.h>
|
||||
|
||||
#include <asm-generic/bitops/hweight.h>
|
||||
|
@ -95,6 +95,7 @@ static inline unsigned long ffz(unsigned long word)
|
||||
#include <asm-generic/bitops/ext2-atomic.h>
|
||||
#include <asm-generic/bitops/minix.h>
|
||||
#include <asm-generic/bitops/fls.h>
|
||||
#include <asm-generic/bitops/__fls.h>
|
||||
#include <asm-generic/bitops/fls64.h>
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
|
@ -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/__ffs.h>
|
||||
#include <asm-generic/bitops/fls.h>
|
||||
#include <asm-generic/bitops/__fls.h>
|
||||
#include <asm-generic/bitops/fls64.h>
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
Loading…
Reference in New Issue
Block a user