xref: /rk3399_rockchip-uboot/arch/nios2/include/asm/bitops/ffs.h (revision 83653121d7382fccfe329cb732f77f116341ef1d)
1*819833afSPeter Tyser #ifndef _ASM_GENERIC_BITOPS_FFS_H_
2*819833afSPeter Tyser #define _ASM_GENERIC_BITOPS_FFS_H_
3*819833afSPeter Tyser 
4*819833afSPeter Tyser /**
5*819833afSPeter Tyser  * ffs - find first bit set
6*819833afSPeter Tyser  * @x: the word to search
7*819833afSPeter Tyser  *
8*819833afSPeter Tyser  * This is defined the same way as
9*819833afSPeter Tyser  * the libc and compiler builtin ffs routines, therefore
10*819833afSPeter Tyser  * differs in spirit from the above ffz (man ffs).
11*819833afSPeter Tyser  */
ffs(int x)12*819833afSPeter Tyser static inline int ffs(int x)
13*819833afSPeter Tyser {
14*819833afSPeter Tyser 	int r = 1;
15*819833afSPeter Tyser 
16*819833afSPeter Tyser 	if (!x)
17*819833afSPeter Tyser 		return 0;
18*819833afSPeter Tyser 	if (!(x & 0xffff)) {
19*819833afSPeter Tyser 		x >>= 16;
20*819833afSPeter Tyser 		r += 16;
21*819833afSPeter Tyser 	}
22*819833afSPeter Tyser 	if (!(x & 0xff)) {
23*819833afSPeter Tyser 		x >>= 8;
24*819833afSPeter Tyser 		r += 8;
25*819833afSPeter Tyser 	}
26*819833afSPeter Tyser 	if (!(x & 0xf)) {
27*819833afSPeter Tyser 		x >>= 4;
28*819833afSPeter Tyser 		r += 4;
29*819833afSPeter Tyser 	}
30*819833afSPeter Tyser 	if (!(x & 3)) {
31*819833afSPeter Tyser 		x >>= 2;
32*819833afSPeter Tyser 		r += 2;
33*819833afSPeter Tyser 	}
34*819833afSPeter Tyser 	if (!(x & 1)) {
35*819833afSPeter Tyser 		x >>= 1;
36*819833afSPeter Tyser 		r += 1;
37*819833afSPeter Tyser 	}
38*819833afSPeter Tyser 	return r;
39*819833afSPeter Tyser }
40*819833afSPeter Tyser 
41*819833afSPeter Tyser #endif /* _ASM_GENERIC_BITOPS_FFS_H_ */
42