3 #include <ccan/build_assert/build_assert.h>
4 #include <ccan/short_types/short_types.h>
5 #include <ccan/ilog/ilog.h>
8 unsigned int fls(unsigned long val)
10 BUILD_ASSERT(sizeof(val) == sizeof(u32) || sizeof(val) == sizeof(u64));
11 if (sizeof(val) == sizeof(u32))
17 /* FIXME: Move to bitops. */
18 unsigned int ffsl(unsigned long val)
21 /* This is significantly faster! */
22 return __builtin_ffsl(val);
28 if (sizeof(long) == sizeof(u64)) {
29 if (!(val & 0xffffffff)) {
30 /* Workaround gcc warning on 32-bit:
31 error: right shift count >= width of type */
38 if (!(val & 0xffff)) {
62 unsigned int popcount(unsigned long val)
64 #if HAVE_BUILTIN_POPCOUNTL
65 return __builtin_popcountl(val);
67 if (sizeof(long) == sizeof(u64)) {
69 v = (v & 0x5555555555555555ULL)
70 + ((v >> 1) & 0x5555555555555555ULL);
71 v = (v & 0x3333333333333333ULL)
72 + ((v >> 1) & 0x3333333333333333ULL);
73 v = (v & 0x0F0F0F0F0F0F0F0FULL)
74 + ((v >> 1) & 0x0F0F0F0F0F0F0F0FULL);
75 v = (v & 0x00FF00FF00FF00FFULL)
76 + ((v >> 1) & 0x00FF00FF00FF00FFULL);
77 v = (v & 0x0000FFFF0000FFFFULL)
78 + ((v >> 1) & 0x0000FFFF0000FFFFULL);
79 v = (v & 0x00000000FFFFFFFFULL)
80 + ((v >> 1) & 0x00000000FFFFFFFFULL);
83 val = (val & 0x55555555ULL) + ((val >> 1) & 0x55555555ULL);
84 val = (val & 0x33333333ULL) + ((val >> 1) & 0x33333333ULL);
85 val = (val & 0x0F0F0F0FULL) + ((val >> 1) & 0x0F0F0F0FULL);
86 val = (val & 0x00FF00FFULL) + ((val >> 1) & 0x00FF00FFULL);
87 val = (val & 0x0000FFFFULL) + ((val >> 1) & 0x0000FFFFULL);
92 unsigned long align_up(unsigned long x, unsigned long align)
94 return (x + align - 1) & ~(align - 1);