diff options
| -rw-r--r-- | tools/include/asm-generic/bitops/__ffs.h | 43 | ||||
| -rw-r--r-- | tools/perf/MANIFEST | 1 | ||||
| -rw-r--r-- | tools/perf/Makefile.perf | 1 | ||||
| -rw-r--r-- | tools/perf/util/include/linux/bitops.h | 37 |
4 files changed, 46 insertions, 36 deletions
diff --git a/tools/include/asm-generic/bitops/__ffs.h b/tools/include/asm-generic/bitops/__ffs.h new file mode 100644 index 000000000000..c94175015a82 --- /dev/null +++ b/tools/include/asm-generic/bitops/__ffs.h | |||
| @@ -0,0 +1,43 @@ | |||
| 1 | #ifndef _TOOLS_LINUX_ASM_GENERIC_BITOPS___FFS_H_ | ||
| 2 | #define _TOOLS_LINUX_ASM_GENERIC_BITOPS___FFS_H_ | ||
| 3 | |||
| 4 | #include <asm/types.h> | ||
| 5 | |||
| 6 | /** | ||
| 7 | * __ffs - find first bit in word. | ||
| 8 | * @word: The word to search | ||
| 9 | * | ||
| 10 | * Undefined if no bit exists, so code should check against 0 first. | ||
| 11 | */ | ||
| 12 | static __always_inline unsigned long __ffs(unsigned long word) | ||
| 13 | { | ||
| 14 | int num = 0; | ||
| 15 | |||
| 16 | #if __BITS_PER_LONG == 64 | ||
| 17 | if ((word & 0xffffffff) == 0) { | ||
| 18 | num += 32; | ||
| 19 | word >>= 32; | ||
| 20 | } | ||
| 21 | #endif | ||
| 22 | if ((word & 0xffff) == 0) { | ||
| 23 | num += 16; | ||
| 24 | word >>= 16; | ||
| 25 | } | ||
| 26 | if ((word & 0xff) == 0) { | ||
| 27 | num += 8; | ||
| 28 | word >>= 8; | ||
| 29 | } | ||
| 30 | if ((word & 0xf) == 0) { | ||
| 31 | num += 4; | ||
| 32 | word >>= 4; | ||
| 33 | } | ||
| 34 | if ((word & 0x3) == 0) { | ||
| 35 | num += 2; | ||
| 36 | word >>= 2; | ||
| 37 | } | ||
| 38 | if ((word & 0x1) == 0) | ||
| 39 | num += 1; | ||
| 40 | return num; | ||
| 41 | } | ||
| 42 | |||
| 43 | #endif /* _TOOLS_LINUX_ASM_GENERIC_BITOPS___FFS_H_ */ | ||
diff --git a/tools/perf/MANIFEST b/tools/perf/MANIFEST index 344c4d3d0a4a..39c08636357b 100644 --- a/tools/perf/MANIFEST +++ b/tools/perf/MANIFEST | |||
| @@ -5,6 +5,7 @@ tools/lib/api | |||
| 5 | tools/lib/symbol/kallsyms.c | 5 | tools/lib/symbol/kallsyms.c |
| 6 | tools/lib/symbol/kallsyms.h | 6 | tools/lib/symbol/kallsyms.h |
| 7 | tools/include/asm/bug.h | 7 | tools/include/asm/bug.h |
| 8 | tools/include/asm-generic/bitops/__ffs.h | ||
| 8 | tools/include/linux/compiler.h | 9 | tools/include/linux/compiler.h |
| 9 | tools/include/linux/hash.h | 10 | tools/include/linux/hash.h |
| 10 | tools/include/linux/export.h | 11 | tools/include/linux/export.h |
diff --git a/tools/perf/Makefile.perf b/tools/perf/Makefile.perf index 763e68fb5767..dbf8ca6c13cd 100644 --- a/tools/perf/Makefile.perf +++ b/tools/perf/Makefile.perf | |||
| @@ -232,6 +232,7 @@ LIB_H += ../include/linux/hash.h | |||
| 232 | LIB_H += ../../include/linux/stringify.h | 232 | LIB_H += ../../include/linux/stringify.h |
| 233 | LIB_H += util/include/linux/bitmap.h | 233 | LIB_H += util/include/linux/bitmap.h |
| 234 | LIB_H += util/include/linux/bitops.h | 234 | LIB_H += util/include/linux/bitops.h |
| 235 | LIB_H += ../include/asm-generic/bitops/__ffs.h | ||
| 235 | LIB_H += ../include/linux/compiler.h | 236 | LIB_H += ../include/linux/compiler.h |
| 236 | LIB_H += util/include/linux/const.h | 237 | LIB_H += util/include/linux/const.h |
| 237 | LIB_H += util/include/linux/ctype.h | 238 | LIB_H += util/include/linux/ctype.h |
diff --git a/tools/perf/util/include/linux/bitops.h b/tools/perf/util/include/linux/bitops.h index c3294163de17..762bb83333c0 100644 --- a/tools/perf/util/include/linux/bitops.h +++ b/tools/perf/util/include/linux/bitops.h | |||
| @@ -52,42 +52,7 @@ static inline unsigned long hweight_long(unsigned long w) | |||
| 52 | 52 | ||
| 53 | #define BITOP_WORD(nr) ((nr) / BITS_PER_LONG) | 53 | #define BITOP_WORD(nr) ((nr) / BITS_PER_LONG) |
| 54 | 54 | ||
| 55 | /** | 55 | #include <asm-generic/bitops/__ffs.h> |
| 56 | * __ffs - find first bit in word. | ||
| 57 | * @word: The word to search | ||
| 58 | * | ||
| 59 | * Undefined if no bit exists, so code should check against 0 first. | ||
| 60 | */ | ||
| 61 | static __always_inline unsigned long __ffs(unsigned long word) | ||
| 62 | { | ||
| 63 | int num = 0; | ||
| 64 | |||
| 65 | #if BITS_PER_LONG == 64 | ||
| 66 | if ((word & 0xffffffff) == 0) { | ||
| 67 | num += 32; | ||
| 68 | word >>= 32; | ||
| 69 | } | ||
| 70 | #endif | ||
| 71 | if ((word & 0xffff) == 0) { | ||
| 72 | num += 16; | ||
| 73 | word >>= 16; | ||
| 74 | } | ||
| 75 | if ((word & 0xff) == 0) { | ||
| 76 | num += 8; | ||
| 77 | word >>= 8; | ||
| 78 | } | ||
| 79 | if ((word & 0xf) == 0) { | ||
| 80 | num += 4; | ||
| 81 | word >>= 4; | ||
| 82 | } | ||
| 83 | if ((word & 0x3) == 0) { | ||
| 84 | num += 2; | ||
| 85 | word >>= 2; | ||
| 86 | } | ||
| 87 | if ((word & 0x1) == 0) | ||
| 88 | num += 1; | ||
| 89 | return num; | ||
| 90 | } | ||
| 91 | 56 | ||
| 92 | typedef const unsigned long __attribute__((__may_alias__)) long_alias_t; | 57 | typedef const unsigned long __attribute__((__may_alias__)) long_alias_t; |
| 93 | 58 | ||
