Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 56a6b1eb authored by Alexander van Heukelum's avatar Alexander van Heukelum Committed by Ingo Molnar
Browse files

generic: implement __fls on all 64-bit archs



Implement __fls on all 64-bit archs:

alpha has an implementation of fls64.
	Added __fls(x) = fls64(x) - 1.

ia64 has fls, but not __fls.
	Added __fls based on code of fls.

mips and powerpc have __ilog2, which is the same as __fls.
	Added __fls = __ilog2.

parisc, s390, sh and sparc64:
	Include generic __fls.

x86_64 already has __fls.

Signed-off-by: default avatarAlexander van Heukelum <heukelum@fastmail.fm>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent 7d9dff22
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -388,6 +388,11 @@ static inline int fls64(unsigned long x)
}
#endif

static inline unsigned long __fls(unsigned long x)
{
	return fls64(x) - 1;
}

static inline int fls(int x)
{
	return fls64((unsigned int) x);
+16 −0
Original line number Diff line number Diff line
@@ -407,6 +407,22 @@ fls (int t)
	return ia64_popcnt(x);
}

/*
 * Find the last (most significant) bit set.  Undefined for x==0.
 * Bits are numbered from 0..63 (e.g., __fls(9) == 3).
 */
static inline unsigned long
__fls (unsigned long x)
{
	x |= x >> 1;
	x |= x >> 2;
	x |= x >> 4;
	x |= x >> 8;
	x |= x >> 16;
	x |= x >> 32;
	return ia64_popcnt(x) - 1;
}

#include <asm-generic/bitops/fls64.h>

/*
+5 −0
Original line number Diff line number Diff line
@@ -591,6 +591,11 @@ static inline int __ilog2(unsigned long x)
	return 63 - lz;
}

static inline unsigned long __fls(unsigned long x)
{
	return __ilog2(x);
}

#if defined(CONFIG_CPU_MIPS32) || defined(CONFIG_CPU_MIPS64)

/*
+1 −0
Original line number Diff line number Diff line
@@ -210,6 +210,7 @@ static __inline__ int fls(int x)
	return ret;
}

#include <asm-generic/bitops/__fls.h>
#include <asm-generic/bitops/fls64.h>
#include <asm-generic/bitops/hweight.h>
#include <asm-generic/bitops/lock.h>
+5 −0
Original line number Diff line number Diff line
@@ -313,6 +313,11 @@ static __inline__ int fls(unsigned int x)
	return 32 - lz;
}

static __inline__ unsigned long __fls(unsigned long x)
{
	return __ilog2(x);
}

/*
 * 64-bit can do this using one cntlzd (count leading zeroes doubleword)
 * instruction; for 32-bit we use the generic version, which does two
Loading