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 Estevamstatic __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 Estevamstatic __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