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