]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
s390/bitops: Switch to generic fls(), fls64(), etc.
authorHeiko Carstens <hca@linux.ibm.com>
Mon, 22 Sep 2025 11:40:19 +0000 (13:40 +0200)
committerAlexander Gordeev <agordeev@linux.ibm.com>
Wed, 24 Sep 2025 14:24:17 +0000 (16:24 +0200)
Switch to generic fls(), fls64(), etc. which are implemented with
__builtin_ctzl(), __builtin_clzl().
Those builtins are available for all supported compilers.

Kernel image size is reduced by ~10kb (gcc 15.1.0 + 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/include/asm/bitops.h

index e643f24ebc05e57307a8e179f2af9eccb17a1872..8b9060c26c5261693cfda576d8702c7fe6aee1e3 100644 (file)
@@ -180,17 +180,6 @@ static __always_inline __attribute_const__ unsigned long __flogr(unsigned long w
        }
 }
 
-/**
- * __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 __flatten unsigned long __ffs(unsigned long word)
-{
-       return __flogr(-word & word) ^ (BITS_PER_LONG - 1);
-}
-
 /**
  * ffs - find first bit set
  * @word: the word to search
@@ -205,48 +194,13 @@ static __always_inline __flatten int ffs(int word)
        return BITS_PER_LONG - __flogr(-val & val);
 }
 
-/**
- * __fls - find last (most-significant) set bit in a long word
- * @word: the word to search
- *
- * Undefined if no set bit exists, so code should check against 0 first.
- */
-static __always_inline __flatten unsigned long __fls(unsigned long word)
-{
-       return __flogr(word) ^ (BITS_PER_LONG - 1);
-}
-
-/**
- * fls64 - find last set bit in a 64-bit word
- * @word: the word to search
- *
- * This is defined in a similar way as the libc and compiler builtin
- * ffsll, but returns the position of the most significant set bit.
- *
- * fls64(value) returns 0 if value is 0 or the position of the last
- * set bit if value is nonzero. The last (most significant) bit is
- * at position 64.
- */
-static __always_inline __flatten int fls64(unsigned long word)
-{
-       return BITS_PER_LONG - __flogr(word);
-}
-
-/**
- * fls - find last (most-significant) bit set
- * @word: the word to search
- *
- * This is defined the same way as ffs.
- * Note fls(0) = 0, fls(1) = 1, fls(0x80000000) = 32.
- */
-static __always_inline __flatten int fls(unsigned int word)
-{
-       return fls64(word);
-}
-
+#include <asm-generic/bitops/builtin-__ffs.h>
+#include <asm-generic/bitops/ffz.h>
+#include <asm-generic/bitops/builtin-__fls.h>
+#include <asm-generic/bitops/builtin-fls.h>
+#include <asm-generic/bitops/fls64.h>
 #include <asm/arch_hweight.h>
 #include <asm-generic/bitops/const_hweight.h>
-#include <asm-generic/bitops/ffz.h>
 #include <asm-generic/bitops/sched.h>
 #include <asm-generic/bitops/le.h>
 #include <asm-generic/bitops/ext2-atomic-setbit.h>