Skip to content

Commit

Permalink
bitops: Change function return types from long to int
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: Arnd Bergmann <[email protected]>
  • Loading branch information
toblux authored and arndb committed May 3, 2024
1 parent e67572c commit 9c313cc
Show file tree
Hide file tree
Showing 8 changed files with 14 additions and 14 deletions.
4 changes: 2 additions & 2 deletions include/asm-generic/bitops/__ffs.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,9 @@
*
* Undefined if no bit exists, so code should check against 0 first.
*/
static __always_inline unsigned long generic___ffs(unsigned long word)
static __always_inline unsigned int generic___ffs(unsigned long word)
{
int num = 0;
unsigned int num = 0;

#if BITS_PER_LONG == 64
if ((word & 0xffffffff) == 0) {
Expand Down
4 changes: 2 additions & 2 deletions include/asm-generic/bitops/__fls.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,9 @@
*
* Undefined if no set bit exists, so code should check against 0 first.
*/
static __always_inline unsigned long generic___fls(unsigned long word)
static __always_inline unsigned int generic___fls(unsigned long word)
{
int num = BITS_PER_LONG - 1;
unsigned int num = BITS_PER_LONG - 1;

#if BITS_PER_LONG == 64
if (!(word & (~0ul << 32))) {
Expand Down
2 changes: 1 addition & 1 deletion include/asm-generic/bitops/builtin-__ffs.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
*
* Undefined if no bit exists, so code should check against 0 first.
*/
static __always_inline unsigned long __ffs(unsigned long word)
static __always_inline unsigned int __ffs(unsigned long word)
{
return __builtin_ctzl(word);
}
Expand Down
2 changes: 1 addition & 1 deletion include/asm-generic/bitops/builtin-__fls.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
*
* Undefined if no set bit exists, so code should check against 0 first.
*/
static __always_inline unsigned long __fls(unsigned long word)
static __always_inline unsigned int __fls(unsigned long word)
{
return (sizeof(word) * 8) - 1 - __builtin_clzl(word);
}
Expand Down
6 changes: 3 additions & 3 deletions include/linux/bitops.h
Original file line number Diff line number Diff line change
Expand Up @@ -200,7 +200,7 @@ static __always_inline __s64 sign_extend64(__u64 value, int index)
return (__s64)(value << shift) >> shift;
}

static inline unsigned fls_long(unsigned long l)
static inline unsigned int fls_long(unsigned long l)
{
if (sizeof(l) == 4)
return fls(l);
Expand Down Expand Up @@ -236,7 +236,7 @@ static inline int get_count_order_long(unsigned long l)
* The result is not defined if no bits are set, so check that @word
* is non-zero before calling this.
*/
static inline unsigned long __ffs64(u64 word)
static inline unsigned int __ffs64(u64 word)
{
#if BITS_PER_LONG == 32
if (((u32)word) == 0UL)
Expand All @@ -252,7 +252,7 @@ static inline unsigned long __ffs64(u64 word)
* @word: The word to search
* @n: Bit to find
*/
static inline unsigned long fns(unsigned long word, unsigned int n)
static inline unsigned int fns(unsigned long word, unsigned int n)
{
unsigned int bit;

Expand Down
4 changes: 2 additions & 2 deletions tools/include/asm-generic/bitops/__ffs.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@
*
* Undefined if no bit exists, so code should check against 0 first.
*/
static __always_inline unsigned long __ffs(unsigned long word)
static __always_inline unsigned int __ffs(unsigned long word)
{
int num = 0;
unsigned int num = 0;

#if __BITS_PER_LONG == 64
if ((word & 0xffffffff) == 0) {
Expand Down
4 changes: 2 additions & 2 deletions tools/include/asm-generic/bitops/__fls.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,9 @@
*
* Undefined if no set bit exists, so code should check against 0 first.
*/
static __always_inline unsigned long generic___fls(unsigned long word)
static __always_inline unsigned int generic___fls(unsigned long word)
{
int num = BITS_PER_LONG - 1;
unsigned int num = BITS_PER_LONG - 1;

#if BITS_PER_LONG == 64
if (!(word & (~0ul << 32))) {
Expand Down
2 changes: 1 addition & 1 deletion tools/include/linux/bitops.h
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ static inline unsigned long hweight_long(unsigned long w)
return sizeof(w) == 4 ? hweight32(w) : hweight64(w);
}

static inline unsigned fls_long(unsigned long l)
static inline unsigned int fls_long(unsigned long l)
{
if (sizeof(l) == 4)
return fls(l);
Expand Down

0 comments on commit 9c313cc

Please sign in to comment.