Linux-libre 5.4.48-gnu
[librecmc/linux-libre.git] / tools / include / asm-generic / bitops / fls.h
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef _ASM_GENERIC_BITOPS_FLS_H_
3 #define _ASM_GENERIC_BITOPS_FLS_H_
4
5 /**
6  * fls - find last (most-significant) bit set
7  * @x: the word to search
8  *
9  * This is defined the same way as ffs.
10  * Note fls(0) = 0, fls(1) = 1, fls(0x80000000) = 32.
11  */
12
13 static __always_inline int fls(unsigned int x)
14 {
15         int r = 32;
16
17         if (!x)
18                 return 0;
19         if (!(x & 0xffff0000u)) {
20                 x <<= 16;
21                 r -= 16;
22         }
23         if (!(x & 0xff000000u)) {
24                 x <<= 8;
25                 r -= 8;
26         }
27         if (!(x & 0xf0000000u)) {
28                 x <<= 4;
29                 r -= 4;
30         }
31         if (!(x & 0xc0000000u)) {
32                 x <<= 2;
33                 r -= 2;
34         }
35         if (!(x & 0x80000000u)) {
36                 x <<= 1;
37                 r -= 1;
38         }
39         return r;
40 }
41
42 #endif /* _ASM_GENERIC_BITOPS_FLS_H_ */