Commit | Line | Data |
---|---|---|
2dfc383a AM |
1 | #ifndef _ASM_GENERIC_BITOPS_FLS64_H_ |
2 | #define _ASM_GENERIC_BITOPS_FLS64_H_ | |
3 | ||
a54baa14 AM |
4 | #include <asm/types.h> |
5 | ||
d57594c2 AH |
6 | /** |
7 | * fls64 - find last set bit in a 64-bit word | |
8 | * @x: the word to search | |
9 | * | |
10 | * This is defined in a similar way as the libc and compiler builtin | |
11 | * ffsll, but returns the position of the most significant set bit. | |
12 | * | |
13 | * fls64(value) returns 0 if value is 0 or the position of the last | |
14 | * set bit if value is nonzero. The last (most significant) bit is | |
15 | * at position 64. | |
16 | */ | |
17 | #if BITS_PER_LONG == 32 | |
c8399943 | 18 | static __always_inline int fls64(__u64 x) |
2dfc383a AM |
19 | { |
20 | __u32 h = x >> 32; | |
21 | if (h) | |
22 | return fls(h) + 32; | |
23 | return fls(x); | |
24 | } | |
d57594c2 | 25 | #elif BITS_PER_LONG == 64 |
c8399943 | 26 | static __always_inline int fls64(__u64 x) |
d57594c2 AH |
27 | { |
28 | if (x == 0) | |
29 | return 0; | |
30 | return __fls(x) + 1; | |
31 | } | |
32 | #else | |
33 | #error BITS_PER_LONG not 32 or 64 | |
34 | #endif | |
2dfc383a AM |
35 | |
36 | #endif /* _ASM_GENERIC_BITOPS_FLS64_H_ */ |