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

bitops: Change function return types from long to int

Change the return types of bitops functions (ffs, fls, and fns) from
long to int. The expected return values are in the range [0, 64], for
which int is sufficient.

Additionally, int aligns well with the return types of the corresponding
__builtin_* functions, potentially reducing overall type conversions.

Many of the existing bitops functions already return an int and don't
need to be changed. The bitops functions in arch/ should be considered
separately.

Adjust some return variables to match the function return types.

With GCC 13 and defconfig, these changes reduced the size of a test
kernel image by 5,432 bytes on arm64 and by 248 bytes on riscv; there
were no changes in size on x86_64, powerpc, or m68k.

Signed-off-by: Thorsten Blum <thorsten.blum@toblux.com>
Signed-off-by: Arnd Bergmann <arnd@arndb.de>

authored by

Thorsten Blum and committed by
Arnd Bergmann
9c313ccd e67572cd

+14 -14
+2 -2
include/asm-generic/bitops/__ffs.h
··· 10 10 * 11 11 * Undefined if no bit exists, so code should check against 0 first. 12 12 */ 13 - static __always_inline unsigned long generic___ffs(unsigned long word) 13 + static __always_inline unsigned int generic___ffs(unsigned long word) 14 14 { 15 - int num = 0; 15 + unsigned int num = 0; 16 16 17 17 #if BITS_PER_LONG == 64 18 18 if ((word & 0xffffffff) == 0) {
+2 -2
include/asm-generic/bitops/__fls.h
··· 10 10 * 11 11 * Undefined if no set bit exists, so code should check against 0 first. 12 12 */ 13 - static __always_inline unsigned long generic___fls(unsigned long word) 13 + static __always_inline unsigned int generic___fls(unsigned long word) 14 14 { 15 - int num = BITS_PER_LONG - 1; 15 + unsigned int num = BITS_PER_LONG - 1; 16 16 17 17 #if BITS_PER_LONG == 64 18 18 if (!(word & (~0ul << 32))) {
+1 -1
include/asm-generic/bitops/builtin-__ffs.h
··· 8 8 * 9 9 * Undefined if no bit exists, so code should check against 0 first. 10 10 */ 11 - static __always_inline unsigned long __ffs(unsigned long word) 11 + static __always_inline unsigned int __ffs(unsigned long word) 12 12 { 13 13 return __builtin_ctzl(word); 14 14 }
+1 -1
include/asm-generic/bitops/builtin-__fls.h
··· 8 8 * 9 9 * Undefined if no set bit exists, so code should check against 0 first. 10 10 */ 11 - static __always_inline unsigned long __fls(unsigned long word) 11 + static __always_inline unsigned int __fls(unsigned long word) 12 12 { 13 13 return (sizeof(word) * 8) - 1 - __builtin_clzl(word); 14 14 }
+3 -3
include/linux/bitops.h
··· 200 200 return (__s64)(value << shift) >> shift; 201 201 } 202 202 203 - static inline unsigned fls_long(unsigned long l) 203 + static inline unsigned int fls_long(unsigned long l) 204 204 { 205 205 if (sizeof(l) == 4) 206 206 return fls(l); ··· 236 236 * The result is not defined if no bits are set, so check that @word 237 237 * is non-zero before calling this. 238 238 */ 239 - static inline unsigned long __ffs64(u64 word) 239 + static inline unsigned int __ffs64(u64 word) 240 240 { 241 241 #if BITS_PER_LONG == 32 242 242 if (((u32)word) == 0UL) ··· 252 252 * @word: The word to search 253 253 * @n: Bit to find 254 254 */ 255 - static inline unsigned long fns(unsigned long word, unsigned int n) 255 + static inline unsigned int fns(unsigned long word, unsigned int n) 256 256 { 257 257 unsigned int bit; 258 258
+2 -2
tools/include/asm-generic/bitops/__ffs.h
··· 11 11 * 12 12 * Undefined if no bit exists, so code should check against 0 first. 13 13 */ 14 - static __always_inline unsigned long __ffs(unsigned long word) 14 + static __always_inline unsigned int __ffs(unsigned long word) 15 15 { 16 - int num = 0; 16 + unsigned int num = 0; 17 17 18 18 #if __BITS_PER_LONG == 64 19 19 if ((word & 0xffffffff) == 0) {
+2 -2
tools/include/asm-generic/bitops/__fls.h
··· 10 10 * 11 11 * Undefined if no set bit exists, so code should check against 0 first. 12 12 */ 13 - static __always_inline unsigned long generic___fls(unsigned long word) 13 + static __always_inline unsigned int generic___fls(unsigned long word) 14 14 { 15 - int num = BITS_PER_LONG - 1; 15 + unsigned int num = BITS_PER_LONG - 1; 16 16 17 17 #if BITS_PER_LONG == 64 18 18 if (!(word & (~0ul << 32))) {
+1 -1
tools/include/linux/bitops.h
··· 70 70 return sizeof(w) == 4 ? hweight32(w) : hweight64(w); 71 71 } 72 72 73 - static inline unsigned fls_long(unsigned long l) 73 + static inline unsigned int fls_long(unsigned long l) 74 74 { 75 75 if (sizeof(l) == 4) 76 76 return fls(l);