diff options
author | Fabio Estevam <fabio.estevam@freescale.com> | 2015-11-05 14:43:23 (GMT) |
---|---|---|
committer | Tom Rini <trini@konsulko.com> | 2015-11-05 15:51:57 (GMT) |
commit | 77c8554e4d7db8d04f03ee92d186bd87f74e3773 (patch) | |
tree | 709b900ed22641760b41ca9880679eab2b36c2eb /include/asm-generic/bitops/fls64.h | |
parent | f598e7a99eda286d4c0883e440b5f81c8ac050f3 (diff) | |
download | u-boot-77c8554e4d7db8d04f03ee92d186bd87f74e3773.tar.xz |
include: Add generic bitops headers
Use the generic bitops header files from the kernel.
Imported from kernel 4.2.3.
Signed-off-by: Fabio Estevam <fabio.estevam@freescale.com>
Diffstat (limited to 'include/asm-generic/bitops/fls64.h')
-rw-r--r-- | include/asm-generic/bitops/fls64.h | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/include/asm-generic/bitops/fls64.h b/include/asm-generic/bitops/fls64.h new file mode 100644 index 0000000..b097cf8 --- /dev/null +++ b/include/asm-generic/bitops/fls64.h @@ -0,0 +1,36 @@ +#ifndef _ASM_GENERIC_BITOPS_FLS64_H_ +#define _ASM_GENERIC_BITOPS_FLS64_H_ + +#include <asm/types.h> + +/** + * fls64 - find last set bit in a 64-bit word + * @x: 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. + */ +#if BITS_PER_LONG == 32 +static __always_inline int fls64(__u64 x) +{ + __u32 h = x >> 32; + if (h) + return fls(h) + 32; + return fls(x); +} +#elif BITS_PER_LONG == 64 +static __always_inline int fls64(__u64 x) +{ + if (x == 0) + return 0; + return __fls(x) + 1; +} +#else +#error BITS_PER_LONG not 32 or 64 +#endif + +#endif /* _ASM_GENERIC_BITOPS_FLS64_H_ */ |