xref: /linux/include/asm-generic/bitops/ffs.h (revision bfb921b2a9d5d1123d1d10b196a39db629ddef87)
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_ */
47