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