162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci#ifndef _TOOLS_LINUX_ASM_GENERIC_BITOPS___FFS_H_
362306a36Sopenharmony_ci#define _TOOLS_LINUX_ASM_GENERIC_BITOPS___FFS_H_
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci#include <asm/types.h>
662306a36Sopenharmony_ci#include <asm/bitsperlong.h>
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci/**
962306a36Sopenharmony_ci * __ffs - find first bit in word.
1062306a36Sopenharmony_ci * @word: The word to search
1162306a36Sopenharmony_ci *
1262306a36Sopenharmony_ci * Undefined if no bit exists, so code should check against 0 first.
1362306a36Sopenharmony_ci */
1462306a36Sopenharmony_cistatic __always_inline unsigned long __ffs(unsigned long word)
1562306a36Sopenharmony_ci{
1662306a36Sopenharmony_ci	int num = 0;
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci#if __BITS_PER_LONG == 64
1962306a36Sopenharmony_ci	if ((word & 0xffffffff) == 0) {
2062306a36Sopenharmony_ci		num += 32;
2162306a36Sopenharmony_ci		word >>= 32;
2262306a36Sopenharmony_ci	}
2362306a36Sopenharmony_ci#endif
2462306a36Sopenharmony_ci	if ((word & 0xffff) == 0) {
2562306a36Sopenharmony_ci		num += 16;
2662306a36Sopenharmony_ci		word >>= 16;
2762306a36Sopenharmony_ci	}
2862306a36Sopenharmony_ci	if ((word & 0xff) == 0) {
2962306a36Sopenharmony_ci		num += 8;
3062306a36Sopenharmony_ci		word >>= 8;
3162306a36Sopenharmony_ci	}
3262306a36Sopenharmony_ci	if ((word & 0xf) == 0) {
3362306a36Sopenharmony_ci		num += 4;
3462306a36Sopenharmony_ci		word >>= 4;
3562306a36Sopenharmony_ci	}
3662306a36Sopenharmony_ci	if ((word & 0x3) == 0) {
3762306a36Sopenharmony_ci		num += 2;
3862306a36Sopenharmony_ci		word >>= 2;
3962306a36Sopenharmony_ci	}
4062306a36Sopenharmony_ci	if ((word & 0x1) == 0)
4162306a36Sopenharmony_ci		num += 1;
4262306a36Sopenharmony_ci	return num;
4362306a36Sopenharmony_ci}
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ci#endif /* _TOOLS_LINUX_ASM_GENERIC_BITOPS___FFS_H_ */
46