162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci#ifndef _ASM_GENERIC_BITOPS_FLS_H_
362306a36Sopenharmony_ci#define _ASM_GENERIC_BITOPS_FLS_H_
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci/**
662306a36Sopenharmony_ci * fls - find last (most-significant) bit set
762306a36Sopenharmony_ci * @x: the word to search
862306a36Sopenharmony_ci *
962306a36Sopenharmony_ci * This is defined the same way as ffs.
1062306a36Sopenharmony_ci * Note fls(0) = 0, fls(1) = 1, fls(0x80000000) = 32.
1162306a36Sopenharmony_ci */
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_cistatic __always_inline int fls(unsigned int x)
1462306a36Sopenharmony_ci{
1562306a36Sopenharmony_ci	int r = 32;
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci	if (!x)
1862306a36Sopenharmony_ci		return 0;
1962306a36Sopenharmony_ci	if (!(x & 0xffff0000u)) {
2062306a36Sopenharmony_ci		x <<= 16;
2162306a36Sopenharmony_ci		r -= 16;
2262306a36Sopenharmony_ci	}
2362306a36Sopenharmony_ci	if (!(x & 0xff000000u)) {
2462306a36Sopenharmony_ci		x <<= 8;
2562306a36Sopenharmony_ci		r -= 8;
2662306a36Sopenharmony_ci	}
2762306a36Sopenharmony_ci	if (!(x & 0xf0000000u)) {
2862306a36Sopenharmony_ci		x <<= 4;
2962306a36Sopenharmony_ci		r -= 4;
3062306a36Sopenharmony_ci	}
3162306a36Sopenharmony_ci	if (!(x & 0xc0000000u)) {
3262306a36Sopenharmony_ci		x <<= 2;
3362306a36Sopenharmony_ci		r -= 2;
3462306a36Sopenharmony_ci	}
3562306a36Sopenharmony_ci	if (!(x & 0x80000000u)) {
3662306a36Sopenharmony_ci		x <<= 1;
3762306a36Sopenharmony_ci		r -= 1;
3862306a36Sopenharmony_ci	}
3962306a36Sopenharmony_ci	return r;
4062306a36Sopenharmony_ci}
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci#endif /* _ASM_GENERIC_BITOPS_FLS_H_ */
43