xref: /linux/include/asm-generic/bitops/__fls.h (revision ca55b2fef3a9373fcfc30f82fd26bc7fccbda732)
1 #ifndef _ASM_GENERIC_BITOPS___FLS_H_
2 #define _ASM_GENERIC_BITOPS___FLS_H_
3 
4 #include <asm/types.h>
5 
6 /**
7  * __fls - find last (most-significant) set bit in a long word
8  * @word: the word to search
9  *
10  * Undefined if no set bit exists, so code should check against 0 first.
11  */
12 static __always_inline unsigned long __fls(unsigned long word)
13 {
14 	int num = BITS_PER_LONG - 1;
15 
16 #if BITS_PER_LONG == 64
17 	if (!(word & (~0ul << 32))) {
18 		num -= 32;
19 		word <<= 32;
20 	}
21 #endif
22 	if (!(word & (~0ul << (BITS_PER_LONG-16)))) {
23 		num -= 16;
24 		word <<= 16;
25 	}
26 	if (!(word & (~0ul << (BITS_PER_LONG-8)))) {
27 		num -= 8;
28 		word <<= 8;
29 	}
30 	if (!(word & (~0ul << (BITS_PER_LONG-4)))) {
31 		num -= 4;
32 		word <<= 4;
33 	}
34 	if (!(word & (~0ul << (BITS_PER_LONG-2)))) {
35 		num -= 2;
36 		word <<= 2;
37 	}
38 	if (!(word & (~0ul << (BITS_PER_LONG-1))))
39 		num -= 1;
40 	return num;
41 }
42 
43 #endif /* _ASM_GENERIC_BITOPS___FLS_H_ */
44