xref: /openbmc/linux/include/asm-generic/bitops/__fls.h (revision 498495dba268b20e8eadd7fe93c140c68b6cc9d2)
1*b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
27d9dff22SAlexander van Heukelum #ifndef _ASM_GENERIC_BITOPS___FLS_H_
37d9dff22SAlexander van Heukelum #define _ASM_GENERIC_BITOPS___FLS_H_
47d9dff22SAlexander van Heukelum 
57d9dff22SAlexander van Heukelum #include <asm/types.h>
67d9dff22SAlexander van Heukelum 
77d9dff22SAlexander van Heukelum /**
87d9dff22SAlexander van Heukelum  * __fls - find last (most-significant) set bit in a long word
97d9dff22SAlexander van Heukelum  * @word: the word to search
107d9dff22SAlexander van Heukelum  *
117d9dff22SAlexander van Heukelum  * Undefined if no set bit exists, so code should check against 0 first.
127d9dff22SAlexander van Heukelum  */
__fls(unsigned long word)13c8399943SAndi Kleen static __always_inline unsigned long __fls(unsigned long word)
147d9dff22SAlexander van Heukelum {
157d9dff22SAlexander van Heukelum 	int num = BITS_PER_LONG - 1;
167d9dff22SAlexander van Heukelum 
177d9dff22SAlexander van Heukelum #if BITS_PER_LONG == 64
187d9dff22SAlexander van Heukelum 	if (!(word & (~0ul << 32))) {
197d9dff22SAlexander van Heukelum 		num -= 32;
207d9dff22SAlexander van Heukelum 		word <<= 32;
217d9dff22SAlexander van Heukelum 	}
227d9dff22SAlexander van Heukelum #endif
237d9dff22SAlexander van Heukelum 	if (!(word & (~0ul << (BITS_PER_LONG-16)))) {
247d9dff22SAlexander van Heukelum 		num -= 16;
257d9dff22SAlexander van Heukelum 		word <<= 16;
267d9dff22SAlexander van Heukelum 	}
277d9dff22SAlexander van Heukelum 	if (!(word & (~0ul << (BITS_PER_LONG-8)))) {
287d9dff22SAlexander van Heukelum 		num -= 8;
297d9dff22SAlexander van Heukelum 		word <<= 8;
307d9dff22SAlexander van Heukelum 	}
317d9dff22SAlexander van Heukelum 	if (!(word & (~0ul << (BITS_PER_LONG-4)))) {
327d9dff22SAlexander van Heukelum 		num -= 4;
337d9dff22SAlexander van Heukelum 		word <<= 4;
347d9dff22SAlexander van Heukelum 	}
357d9dff22SAlexander van Heukelum 	if (!(word & (~0ul << (BITS_PER_LONG-2)))) {
367d9dff22SAlexander van Heukelum 		num -= 2;
377d9dff22SAlexander van Heukelum 		word <<= 2;
387d9dff22SAlexander van Heukelum 	}
397d9dff22SAlexander van Heukelum 	if (!(word & (~0ul << (BITS_PER_LONG-1))))
407d9dff22SAlexander van Heukelum 		num -= 1;
417d9dff22SAlexander van Heukelum 	return num;
427d9dff22SAlexander van Heukelum }
437d9dff22SAlexander van Heukelum 
447d9dff22SAlexander van Heukelum #endif /* _ASM_GENERIC_BITOPS___FLS_H_ */
45