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