| /* SPDX-License-Identifier: GPL-2.0 */ |
| #ifndef _ASM_GENERIC_BITOPS___FLS_H_ |
| #define _ASM_GENERIC_BITOPS___FLS_H_ |
| |
| #include <asm/types.h> |
| |
| /** |
| * generic___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 generic___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; |
| } |
| |
| #ifndef __HAVE_ARCH___FLS |
| #define __fls(word) generic___fls(word) |
| #endif |
| |
| #endif /* _ASM_GENERIC_BITOPS___FLS_H_ */ |