Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

generic: Implement generic ffs/fls using __builtin_* functions

This patch implements ffs, __ffs, fls, __fls using __builtin_* gcc
functions. These header files can be used by other architectures that
rely on the gcc builtins.

Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
Acked-by: Arnd Bergmann <arnd@arndb.de>

+63
+15
include/asm-generic/bitops/builtin-__ffs.h
··· 1 + #ifndef _ASM_GENERIC_BITOPS_BUILTIN___FFS_H_ 2 + #define _ASM_GENERIC_BITOPS_BUILTIN___FFS_H_ 3 + 4 + /** 5 + * __ffs - find first bit in word. 6 + * @word: The word to search 7 + * 8 + * Undefined if no bit exists, so code should check against 0 first. 9 + */ 10 + static __always_inline unsigned long __ffs(unsigned long word) 11 + { 12 + return __builtin_ctzl(word); 13 + } 14 + 15 + #endif
+15
include/asm-generic/bitops/builtin-__fls.h
··· 1 + #ifndef _ASM_GENERIC_BITOPS_BUILTIN___FLS_H_ 2 + #define _ASM_GENERIC_BITOPS_BUILTIN___FLS_H_ 3 + 4 + /** 5 + * __fls - find last (most-significant) set bit in a long word 6 + * @word: the word to search 7 + * 8 + * Undefined if no set bit exists, so code should check against 0 first. 9 + */ 10 + static __always_inline unsigned long __fls(unsigned long word) 11 + { 12 + return (sizeof(word) * 8) - 1 - __builtin_clzl(word); 13 + } 14 + 15 + #endif
+17
include/asm-generic/bitops/builtin-ffs.h
··· 1 + #ifndef _ASM_GENERIC_BITOPS_BUILTIN_FFS_H_ 2 + #define _ASM_GENERIC_BITOPS_BUILTIN_FFS_H_ 3 + 4 + /** 5 + * ffs - find first bit set 6 + * @x: the word to search 7 + * 8 + * This is defined the same way as 9 + * the libc and compiler builtin ffs routines, therefore 10 + * differs in spirit from the above ffz (man ffs). 11 + */ 12 + static __always_inline int ffs(int x) 13 + { 14 + return __builtin_ffs(x); 15 + } 16 + 17 + #endif
+16
include/asm-generic/bitops/builtin-fls.h
··· 1 + #ifndef _ASM_GENERIC_BITOPS_BUILTIN_FLS_H_ 2 + #define _ASM_GENERIC_BITOPS_BUILTIN_FLS_H_ 3 + 4 + /** 5 + * fls - find last (most-significant) bit set 6 + * @x: the word to search 7 + * 8 + * This is defined the same way as ffs. 9 + * Note fls(0) = 0, fls(1) = 1, fls(0x80000000) = 32. 10 + */ 11 + static __always_inline int fls(int x) 12 + { 13 + return x ? sizeof(x) * 8 - __builtin_clz(x) : 0; 14 + } 15 + 16 + #endif