1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */ 2136abb32SAkinobu Mita #ifndef _ASM_GENERIC_BITOPS_FLS_H_ 3136abb32SAkinobu Mita #define _ASM_GENERIC_BITOPS_FLS_H_ 4136abb32SAkinobu Mita 5136abb32SAkinobu Mita /** 6136abb32SAkinobu Mita * fls - find last (most-significant) bit set 7136abb32SAkinobu Mita * @x: the word to search 8136abb32SAkinobu Mita * 9136abb32SAkinobu Mita * This is defined the same way as ffs. 10136abb32SAkinobu Mita * Note fls(0) = 0, fls(1) = 1, fls(0x80000000) = 32. 11136abb32SAkinobu Mita */ 12136abb32SAkinobu Mita fls(unsigned int x)13*3fc2579eSMatthew Wilcoxstatic __always_inline int fls(unsigned int x) 14136abb32SAkinobu Mita { 15136abb32SAkinobu Mita int r = 32; 16136abb32SAkinobu Mita 17136abb32SAkinobu Mita if (!x) 18136abb32SAkinobu Mita return 0; 19136abb32SAkinobu Mita if (!(x & 0xffff0000u)) { 20136abb32SAkinobu Mita x <<= 16; 21136abb32SAkinobu Mita r -= 16; 22136abb32SAkinobu Mita } 23136abb32SAkinobu Mita if (!(x & 0xff000000u)) { 24136abb32SAkinobu Mita x <<= 8; 25136abb32SAkinobu Mita r -= 8; 26136abb32SAkinobu Mita } 27136abb32SAkinobu Mita if (!(x & 0xf0000000u)) { 28136abb32SAkinobu Mita x <<= 4; 29136abb32SAkinobu Mita r -= 4; 30136abb32SAkinobu Mita } 31136abb32SAkinobu Mita if (!(x & 0xc0000000u)) { 32136abb32SAkinobu Mita x <<= 2; 33136abb32SAkinobu Mita r -= 2; 34136abb32SAkinobu Mita } 35136abb32SAkinobu Mita if (!(x & 0x80000000u)) { 36136abb32SAkinobu Mita x <<= 1; 37136abb32SAkinobu Mita r -= 1; 38136abb32SAkinobu Mita } 39136abb32SAkinobu Mita return r; 40136abb32SAkinobu Mita } 41136abb32SAkinobu Mita 42136abb32SAkinobu Mita #endif /* _ASM_GENERIC_BITOPS_FLS_H_ */ 43