]> www.infradead.org Git - users/hch/misc.git/commitdiff
s390/bitops: Switch to generic ffs() if supported by compiler
authorHeiko Carstens <hca@linux.ibm.com>
Mon, 22 Sep 2025 11:40:20 +0000 (13:40 +0200)
committerAlexander Gordeev <agordeev@linux.ibm.com>
Wed, 24 Sep 2025 14:24:18 +0000 (16:24 +0200)
Use generic ffs() / __builtin_ffs() if supported by the compiler. GCC 16
will have support for __builtin_ffs().
See gcc commit f50cff9766c5 ("s390: Implement clz and ctz for SI mode").

In the distant future when GCC 16 becomes the minimum supported version,
this allows to get rid of the flogr inline assembly.

Kernel image size is reduced by ~500 bytes (gcc 16 beta + defconfig).

Acked-by: Alexander Gordeev <agordeev@linux.ibm.com>
Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
Signed-off-by: Alexander Gordeev <agordeev@linux.ibm.com>
arch/s390/Kconfig
arch/s390/include/asm/bitops.h

index bf680c26a33cf7bef2ed5e25cabc061597c131b1..22862ce7ec68d62702217984f61dff067e32b1e5 100644 (file)
@@ -49,6 +49,13 @@ config KASAN_SHADOW_OFFSET
        depends on KASAN
        default 0x1C000000000000
 
+config CC_HAS_BUILTIN_FFS
+       def_bool !(CC_IS_GCC && GCC_VERSION < 160000)
+       help
+         GCC versions before 16.0.0 generate library calls to ffs()
+         for __builtin_ffs() even when __has_builtin(__builtin_ffs)
+         is true.
+
 config CC_ASM_FLAG_OUTPUT_BROKEN
        def_bool CC_IS_GCC && GCC_VERSION < 140200
        help
index 8b9060c26c5261693cfda576d8702c7fe6aee1e3..1564dd3a5a826a17cc5af24db7408b36f950c698 100644 (file)
@@ -122,6 +122,8 @@ static inline bool test_bit_inv(unsigned long nr,
        return test_bit(nr ^ (BITS_PER_LONG - 1), ptr);
 }
 
+#ifndef CONFIG_CC_HAS_BUILTIN_FFS
+
 /**
  * __flogr - find leftmost one
  * @word - The word to search
@@ -194,6 +196,12 @@ static __always_inline __flatten int ffs(int word)
        return BITS_PER_LONG - __flogr(-val & val);
 }
 
+#else /* CONFIG_CC_HAS_BUILTIN_FFS */
+
+#include <asm-generic/bitops/builtin-ffs.h>
+
+#endif /* CONFIG_CC_HAS_BUILTIN_FFS */
+
 #include <asm-generic/bitops/builtin-__ffs.h>
 #include <asm-generic/bitops/ffz.h>
 #include <asm-generic/bitops/builtin-__fls.h>