3 #include <ccan/short_types/short_types.h>
6 unsigned int fls(unsigned long val)
9 /* This is significantly faster! */
10 return val ? sizeof(long) * CHAR_BIT - __builtin_clzl(val) : 0;
16 if (!(val & 0xffff0000u)) {
20 if (!(val & 0xff000000u)) {
24 if (!(val & 0xf0000000u)) {
28 if (!(val & 0xc0000000u)) {
32 if (!(val & 0x80000000u)) {
40 /* FIXME: Move to bitops. */
41 unsigned int ffsl(unsigned long val)
44 /* This is significantly faster! */
45 return __builtin_ffsl(val);
51 if (sizeof(long) == sizeof(u64)) {
52 if (!(val & 0xffffffff)) {
53 /* Workaround gcc warning on 32-bit:
54 error: right shift count >= width of type */
61 if (!(val & 0xffff)) {
85 unsigned int popcount(unsigned long val)
87 #if HAVE_BUILTIN_POPCOUNTL
88 return __builtin_popcountl(val);
90 if (sizeof(long) == sizeof(u64)) {
92 v = (v & 0x5555555555555555ULL)
93 + ((v >> 1) & 0x5555555555555555ULL);
94 v = (v & 0x3333333333333333ULL)
95 + ((v >> 1) & 0x3333333333333333ULL);
96 v = (v & 0x0F0F0F0F0F0F0F0FULL)
97 + ((v >> 1) & 0x0F0F0F0F0F0F0F0FULL);
98 v = (v & 0x00FF00FF00FF00FFULL)
99 + ((v >> 1) & 0x00FF00FF00FF00FFULL);
100 v = (v & 0x0000FFFF0000FFFFULL)
101 + ((v >> 1) & 0x0000FFFF0000FFFFULL);
102 v = (v & 0x00000000FFFFFFFFULL)
103 + ((v >> 1) & 0x00000000FFFFFFFFULL);
106 val = (val & 0x55555555ULL) + ((val >> 1) & 0x55555555ULL);
107 val = (val & 0x33333333ULL) + ((val >> 1) & 0x33333333ULL);
108 val = (val & 0x0F0F0F0FULL) + ((val >> 1) & 0x0F0F0F0FULL);
109 val = (val & 0x00FF00FFULL) + ((val >> 1) & 0x00FF00FFULL);
110 val = (val & 0x0000FFFFULL) + ((val >> 1) & 0x0000FFFFULL);
115 unsigned long align_up(unsigned long x, unsigned long align)
117 return (x + align - 1) & ~(align - 1);