| /* SPDX-License-Identifier: GPL-2.0 */ | |
| #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_ */ |