From 726a802fdaf1ffb4ca95ebf6910a738781137ef5 Mon Sep 17 00:00:00 2001 From: Sean Anderson Date: Mon, 31 Jul 2023 17:27:33 -0400 Subject: arm: Use builtins for ffs/fls Since ARMv5, the clz instruction allows for efficient implementation of ffs/fls with builtins. Until ARMv7 (with Thumb-2), this instruction is only available in ARM mode. LTO makes it difficult to force specific functions to be in ARM mode, as it is effectively a form of very aggressive inlining. To work around this, fls/ffs are implemented in assembly for ARMv5 and ARMv6 when compiling U-Boot in Thumb mode. Overall, this saves around 75 bytes per call. This code is synced with v5.15 of the Linux kernel. Signed-off-by: Sean Anderson Reviewed-by: Tom Rini --- include/asm-generic/bitops/builtin-__ffs.h | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 include/asm-generic/bitops/builtin-__ffs.h (limited to 'include/asm-generic/bitops/builtin-__ffs.h') diff --git a/include/asm-generic/bitops/builtin-__ffs.h b/include/asm-generic/bitops/builtin-__ffs.h new file mode 100644 index 00000000000..87024da44d1 --- /dev/null +++ b/include/asm-generic/bitops/builtin-__ffs.h @@ -0,0 +1,16 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef _ASM_GENERIC_BITOPS_BUILTIN___FFS_H_ +#define _ASM_GENERIC_BITOPS_BUILTIN___FFS_H_ + +/** + * __ffs - find first bit in word. + * @word: The word to search + * + * Undefined if no bit exists, so code should check against 0 first. + */ +static __always_inline unsigned long __ffs(unsigned long word) +{ + return __builtin_ctzl(word); +} + +#endif -- cgit v1.2.3