xref: /openbmc/linux/include/asm-generic/bitops/fls.h (revision 597473720f4dc69749542bfcfed4a927a43d935e)
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 Wilcox static __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