1*b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */ 22dc0b972SArnaldo Carvalho de Melo #ifndef _TOOLS_LINUX_ASM_GENERIC_BITOPS___FFS_H_ 32dc0b972SArnaldo Carvalho de Melo #define _TOOLS_LINUX_ASM_GENERIC_BITOPS___FFS_H_ 42dc0b972SArnaldo Carvalho de Melo 52dc0b972SArnaldo Carvalho de Melo #include <asm/types.h> 6bb970707SArnaldo Carvalho de Melo #include <asm/bitsperlong.h> 72dc0b972SArnaldo Carvalho de Melo 82dc0b972SArnaldo Carvalho de Melo /** 92dc0b972SArnaldo Carvalho de Melo * __ffs - find first bit in word. 102dc0b972SArnaldo Carvalho de Melo * @word: The word to search 112dc0b972SArnaldo Carvalho de Melo * 122dc0b972SArnaldo Carvalho de Melo * Undefined if no bit exists, so code should check against 0 first. 132dc0b972SArnaldo Carvalho de Melo */ __ffs(unsigned long word)142dc0b972SArnaldo Carvalho de Melostatic __always_inline unsigned long __ffs(unsigned long word) 152dc0b972SArnaldo Carvalho de Melo { 162dc0b972SArnaldo Carvalho de Melo int num = 0; 172dc0b972SArnaldo Carvalho de Melo 182dc0b972SArnaldo Carvalho de Melo #if __BITS_PER_LONG == 64 192dc0b972SArnaldo Carvalho de Melo if ((word & 0xffffffff) == 0) { 202dc0b972SArnaldo Carvalho de Melo num += 32; 212dc0b972SArnaldo Carvalho de Melo word >>= 32; 222dc0b972SArnaldo Carvalho de Melo } 232dc0b972SArnaldo Carvalho de Melo #endif 242dc0b972SArnaldo Carvalho de Melo if ((word & 0xffff) == 0) { 252dc0b972SArnaldo Carvalho de Melo num += 16; 262dc0b972SArnaldo Carvalho de Melo word >>= 16; 272dc0b972SArnaldo Carvalho de Melo } 282dc0b972SArnaldo Carvalho de Melo if ((word & 0xff) == 0) { 292dc0b972SArnaldo Carvalho de Melo num += 8; 302dc0b972SArnaldo Carvalho de Melo word >>= 8; 312dc0b972SArnaldo Carvalho de Melo } 322dc0b972SArnaldo Carvalho de Melo if ((word & 0xf) == 0) { 332dc0b972SArnaldo Carvalho de Melo num += 4; 342dc0b972SArnaldo Carvalho de Melo word >>= 4; 352dc0b972SArnaldo Carvalho de Melo } 362dc0b972SArnaldo Carvalho de Melo if ((word & 0x3) == 0) { 372dc0b972SArnaldo Carvalho de Melo num += 2; 382dc0b972SArnaldo Carvalho de Melo word >>= 2; 392dc0b972SArnaldo Carvalho de Melo } 402dc0b972SArnaldo Carvalho de Melo if ((word & 0x1) == 0) 412dc0b972SArnaldo Carvalho de Melo num += 1; 422dc0b972SArnaldo Carvalho de Melo return num; 432dc0b972SArnaldo Carvalho de Melo } 442dc0b972SArnaldo Carvalho de Melo 452dc0b972SArnaldo Carvalho de Melo #endif /* _TOOLS_LINUX_ASM_GENERIC_BITOPS___FFS_H_ */ 46