[U-Boot] [PATCH v7 02/21] include: Add generic bitops headers
York Sun
yorksun at freescale.com
Tue Dec 1 18:26:59 CET 2015
On 11/05/2015 06:43 AM, Fabio Estevam wrote:
> Use the generic bitops header files from the kernel.
>
> Imported from kernel 4.2.3.
>
> Signed-off-by: Fabio Estevam <fabio.estevam at freescale.com>
> ---
> Changes since v6:
> - Do not touch include/linux/bitops here to avoid build warnings (Daniel)
>
> include/asm-generic/bitops/__ffs.h | 43 ++++++++++++++++++++++++++++++++++++++
> include/asm-generic/bitops/__fls.h | 43 ++++++++++++++++++++++++++++++++++++++
> include/asm-generic/bitops/fls.h | 41 ++++++++++++++++++++++++++++++++++++
> include/asm-generic/bitops/fls64.h | 36 +++++++++++++++++++++++++++++++
> 4 files changed, 163 insertions(+)
> create mode 100644 include/asm-generic/bitops/__ffs.h
> create mode 100644 include/asm-generic/bitops/__fls.h
> create mode 100644 include/asm-generic/bitops/fls.h
> create mode 100644 include/asm-generic/bitops/fls64.h
>
<snip>
> diff --git a/include/asm-generic/bitops/__fls.h b/include/asm-generic/bitops/__fls.h
> new file mode 100644
> index 0000000..a60a7cc
> --- /dev/null
> +++ b/include/asm-generic/bitops/__fls.h
> @@ -0,0 +1,43 @@
> +#ifndef _ASM_GENERIC_BITOPS___FLS_H_
> +#define _ASM_GENERIC_BITOPS___FLS_H_
> +
> +#include <asm/types.h>
> +
> +/**
> + * __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 unsigned long __fls(unsigned long word)
> +{
> + int num = BITS_PER_LONG - 1;
> +
> +#if BITS_PER_LONG == 64
> + if (!(word & (~0ul << 32))) {
> + num -= 32;
> + word <<= 32;
> + }
> +#endif
> + if (!(word & (~0ul << (BITS_PER_LONG-16)))) {
> + num -= 16;
> + word <<= 16;
> + }
> + if (!(word & (~0ul << (BITS_PER_LONG-8)))) {
> + num -= 8;
> + word <<= 8;
> + }
> + if (!(word & (~0ul << (BITS_PER_LONG-4)))) {
> + num -= 4;
> + word <<= 4;
> + }
> + if (!(word & (~0ul << (BITS_PER_LONG-2)))) {
> + num -= 2;
> + word <<= 2;
> + }
> + if (!(word & (~0ul << (BITS_PER_LONG-1))))
> + num -= 1;
> + return num;
> +}
Sorry for catching this late. All above left shift causes compiling warning on
32-bit host (ubuntu 12.04 with gcc 4.6.3)
include/asm-generic/bitops/__fls.h:17:2: warning: left shift count >= width of
type [enabled by default]
The root cause may be in include/configs/sandbox.h
#define CONFIG_SANDBOX_BITS_PER_LONG 64
York
More information about the U-Boot
mailing list