Merge tag 'sched-urgent-2024-03-24' of git://git.kernel.org/pub/scm/linux/kernel...
[sfrench/cifs-2.6.git] / include / asm-generic / bitops / ffs.h
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef _ASM_GENERIC_BITOPS_FFS_H_
3 #define _ASM_GENERIC_BITOPS_FFS_H_
4
5 /**
6  * generic_ffs - find first bit set
7  * @x: the word to search
8  *
9  * This is defined the same way as
10  * the libc and compiler builtin ffs routines, therefore
11  * differs in spirit from ffz (man ffs).
12  */
13 static inline int generic_ffs(int x)
14 {
15         int r = 1;
16
17         if (!x)
18                 return 0;
19         if (!(x & 0xffff)) {
20                 x >>= 16;
21                 r += 16;
22         }
23         if (!(x & 0xff)) {
24                 x >>= 8;
25                 r += 8;
26         }
27         if (!(x & 0xf)) {
28                 x >>= 4;
29                 r += 4;
30         }
31         if (!(x & 3)) {
32                 x >>= 2;
33                 r += 2;
34         }
35         if (!(x & 1)) {
36                 x >>= 1;
37                 r += 1;
38         }
39         return r;
40 }
41
42 #ifndef __HAVE_ARCH_FFS
43 #define ffs(x) generic_ffs(x)
44 #endif
45
46 #endif /* _ASM_GENERIC_BITOPS_FFS_H_ */