xref: /openbmc/linux/include/asm-generic/bitops/ffs.h (revision 09020adb)
109020adbSAkinobu Mita #ifndef _ASM_GENERIC_BITOPS_FFS_H_
209020adbSAkinobu Mita #define _ASM_GENERIC_BITOPS_FFS_H_
309020adbSAkinobu Mita 
409020adbSAkinobu Mita /**
509020adbSAkinobu Mita  * ffs - find first bit set
609020adbSAkinobu Mita  * @x: the word to search
709020adbSAkinobu Mita  *
809020adbSAkinobu Mita  * This is defined the same way as
909020adbSAkinobu Mita  * the libc and compiler builtin ffs routines, therefore
1009020adbSAkinobu Mita  * differs in spirit from the above ffz (man ffs).
1109020adbSAkinobu Mita  */
1209020adbSAkinobu Mita static inline int ffs(int x)
1309020adbSAkinobu Mita {
1409020adbSAkinobu Mita 	int r = 1;
1509020adbSAkinobu Mita 
1609020adbSAkinobu Mita 	if (!x)
1709020adbSAkinobu Mita 		return 0;
1809020adbSAkinobu Mita 	if (!(x & 0xffff)) {
1909020adbSAkinobu Mita 		x >>= 16;
2009020adbSAkinobu Mita 		r += 16;
2109020adbSAkinobu Mita 	}
2209020adbSAkinobu Mita 	if (!(x & 0xff)) {
2309020adbSAkinobu Mita 		x >>= 8;
2409020adbSAkinobu Mita 		r += 8;
2509020adbSAkinobu Mita 	}
2609020adbSAkinobu Mita 	if (!(x & 0xf)) {
2709020adbSAkinobu Mita 		x >>= 4;
2809020adbSAkinobu Mita 		r += 4;
2909020adbSAkinobu Mita 	}
3009020adbSAkinobu Mita 	if (!(x & 3)) {
3109020adbSAkinobu Mita 		x >>= 2;
3209020adbSAkinobu Mita 		r += 2;
3309020adbSAkinobu Mita 	}
3409020adbSAkinobu Mita 	if (!(x & 1)) {
3509020adbSAkinobu Mita 		x >>= 1;
3609020adbSAkinobu Mita 		r += 1;
3709020adbSAkinobu Mita 	}
3809020adbSAkinobu Mita 	return r;
3909020adbSAkinobu Mita }
4009020adbSAkinobu Mita 
4109020adbSAkinobu Mita #endif /* _ASM_GENERIC_BITOPS_FFS_H_ */
42