Use the generic bitops header files from the kernel. Imported from kernel 4.2.3. Signed-off-by: Fabio Estevam <fabio.estevam@freescale.com>master
parent
f598e7a99e
commit
77c8554e4d
@ -0,0 +1,43 @@ |
||||
#ifndef _ASM_GENERIC_BITOPS___FFS_H_ |
||||
#define _ASM_GENERIC_BITOPS___FFS_H_ |
||||
|
||||
#include <asm/types.h> |
||||
|
||||
/**
|
||||
* __ffs - find first bit in word. |
||||
* @word: The word to search |
||||
* |
||||
* Undefined if no bit exists, so code should check against 0 first. |
||||
*/ |
||||
static __always_inline unsigned long __ffs(unsigned long word) |
||||
{ |
||||
int num = 0; |
||||
|
||||
#if BITS_PER_LONG == 64 |
||||
if ((word & 0xffffffff) == 0) { |
||||
num += 32; |
||||
word >>= 32; |
||||
} |
||||
#endif |
||||
if ((word & 0xffff) == 0) { |
||||
num += 16; |
||||
word >>= 16; |
||||
} |
||||
if ((word & 0xff) == 0) { |
||||
num += 8; |
||||
word >>= 8; |
||||
} |
||||
if ((word & 0xf) == 0) { |
||||
num += 4; |
||||
word >>= 4; |
||||
} |
||||
if ((word & 0x3) == 0) { |
||||
num += 2; |
||||
word >>= 2; |
||||
} |
||||
if ((word & 0x1) == 0) |
||||
num += 1; |
||||
return num; |
||||
} |
||||
|
||||
#endif /* _ASM_GENERIC_BITOPS___FFS_H_ */ |
@ -0,0 +1,43 @@ |
||||
#ifndef _ASM_GENERIC_BITOPS___FLS_H_ |
||||
#define _ASM_GENERIC_BITOPS___FLS_H_ |
||||
|
||||
#include <asm/types.h> |
||||
|
||||
/**
|
||||
* __fls - find last (most-significant) set bit in a long word |
||||
* @word: the word to search |
||||
* |
||||
* Undefined if no set bit exists, so code should check against 0 first. |
||||
*/ |
||||
static __always_inline unsigned long __fls(unsigned long word) |
||||
{ |
||||
int num = BITS_PER_LONG - 1; |
||||
|
||||
#if BITS_PER_LONG == 64 |
||||
if (!(word & (~0ul << 32))) { |
||||
num -= 32; |
||||
word <<= 32; |
||||
} |
||||
#endif |
||||
if (!(word & (~0ul << (BITS_PER_LONG-16)))) { |
||||
num -= 16; |
||||
word <<= 16; |
||||
} |
||||
if (!(word & (~0ul << (BITS_PER_LONG-8)))) { |
||||
num -= 8; |
||||
word <<= 8; |
||||
} |
||||
if (!(word & (~0ul << (BITS_PER_LONG-4)))) { |
||||
num -= 4; |
||||
word <<= 4; |
||||
} |
||||
if (!(word & (~0ul << (BITS_PER_LONG-2)))) { |
||||
num -= 2; |
||||
word <<= 2; |
||||
} |
||||
if (!(word & (~0ul << (BITS_PER_LONG-1)))) |
||||
num -= 1; |
||||
return num; |
||||
} |
||||
|
||||
#endif /* _ASM_GENERIC_BITOPS___FLS_H_ */ |
@ -0,0 +1,41 @@ |
||||
#ifndef _ASM_GENERIC_BITOPS_FLS_H_ |
||||
#define _ASM_GENERIC_BITOPS_FLS_H_ |
||||
|
||||
/**
|
||||
* fls - find last (most-significant) bit set |
||||
* @x: the word to search |
||||
* |
||||
* This is defined the same way as ffs. |
||||
* Note fls(0) = 0, fls(1) = 1, fls(0x80000000) = 32. |
||||
*/ |
||||
|
||||
static __always_inline int 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; |
||||
} |
||||
|
||||
#endif /* _ASM_GENERIC_BITOPS_FLS_H_ */ |
@ -0,0 +1,36 @@ |
||||
#ifndef _ASM_GENERIC_BITOPS_FLS64_H_ |
||||
#define _ASM_GENERIC_BITOPS_FLS64_H_ |
||||
|
||||
#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 __always_inline int fls64(__u64 x) |
||||
{ |
||||
__u32 h = x >> 32; |
||||
if (h) |
||||
return fls(h) + 32; |
||||
return fls(x); |
||||
} |
||||
#elif BITS_PER_LONG == 64 |
||||
static __always_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_ */ |
Loading…
Reference in new issue