41 #if !defined(AK_BIT_SCAN_INSTRUCTIONS)
46 #if __clang__ || defined __GNUC__
49 return __builtin_popcount(in_bits);
55 while (in_bits) { ++num; in_bits &= in_bits - 1; }
63 #if defined _MSC_VER && (defined AK_CPU_X86_64 || defined AK_CPU_ARM_64)
66 unsigned long ret = 0;
67 _BitScanForward64(&ret, in_bits);
68 return in_bits ? ret : 64;
70 #elif __clang__ || defined __GNUC__
73 return in_bits ? __builtin_ctzll(in_bits) : 64;
78 if (in_bits == 0)
return 64;
80 if ((in_bits & 0x00000000FFFFFFFFULL) == 0) { ret += 32; in_bits >>= 32; }
81 if ((in_bits & 0x000000000000FFFFULL) == 0) { ret += 16; in_bits >>= 16; }
82 if ((in_bits & 0x00000000000000FFULL) == 0) { ret += 8; in_bits >>= 8; }
83 if ((in_bits & 0x000000000000000FULL) == 0) { ret += 4; in_bits >>= 4; }
84 if ((in_bits & 0x0000000000000003ULL) == 0) { ret += 2; in_bits >>= 2; }
85 if ((in_bits & 0x0000000000000001ULL) == 0) { ret += 1; in_bits >>= 1; }
93 unsigned long ret = 0;
94 _BitScanForward(&ret, in_bits);
95 return in_bits ? ret : 32;
98 #elif __clang__ || defined __GNUC__
101 return in_bits ? __builtin_ctz(in_bits) : 32;
106 if (in_bits == 0)
return 32;
108 if ((in_bits & 0x0000FFFFULL) == 0) { ret += 16; in_bits >>= 16; }
109 if ((in_bits & 0x000000FFULL) == 0) { ret += 8; in_bits >>= 8; }
110 if ((in_bits & 0x0000000FULL) == 0) { ret += 4; in_bits >>= 4; }
111 if ((in_bits & 0x00000003ULL) == 0) { ret += 2; in_bits >>= 2; }
112 if ((in_bits & 0x00000001ULL) == 0) { ret += 1; in_bits >>= 1; }
120 #if defined _MSC_VER && (defined AK_CPU_X86_64 || defined AK_CPU_ARM_64)
123 unsigned long ret = 0;
124 _BitScanReverse64(&ret, in_bits);
125 return in_bits ? 63 - ret : 64;
127 #elif __clang__ || defined __GNUC__
130 return in_bits ? __builtin_clzll(in_bits) : 64;
135 if (in_bits == 0)
return 64;
137 if ((in_bits & 0xFFFFFFFF00000000ULL) == 0) { ret += 32; in_bits <<= 32; }
138 if ((in_bits & 0xFFFF000000000000ULL) == 0) { ret += 16; in_bits <<= 16; }
139 if ((in_bits & 0xFF00000000000000ULL) == 0) { ret += 8; in_bits <<= 8; }
140 if ((in_bits & 0xF000000000000000ULL) == 0) { ret += 4; in_bits <<= 4; }
141 if ((in_bits & 0xC000000000000000ULL) == 0) { ret += 2; in_bits <<= 2; }
142 if ((in_bits & 0x8000000000000000ULL) == 0) { ret += 1; in_bits <<= 1; }
150 unsigned long ret = 0;
151 _BitScanReverse(&ret, in_bits);
152 return in_bits ? 31 - ret : 32;
154 #elif __clang__ || defined __GNUC__
157 return in_bits ? __builtin_clz(in_bits) : 32;
162 if (in_bits == 0)
return 32;
164 if ((in_bits & 0xFFFF0000ULL) == 0) { ret += 16; in_bits <<= 16; }
165 if ((in_bits & 0xFF000000ULL) == 0) { ret += 8; in_bits <<= 8; }
166 if ((in_bits & 0xF0000000ULL) == 0) { ret += 4; in_bits <<= 4; }
167 if ((in_bits & 0xC0000000ULL) == 0) { ret += 2; in_bits <<= 2; }
168 if ((in_bits & 0x80000000ULL) == 0) { ret += 1; in_bits <<= 1; }
174 #endif // defined(AK_BIT_SCAN_INSTRUCTIONS)
191 in_uValue |= in_uValue >> 1;
192 in_uValue |= in_uValue >> 2;
193 in_uValue |= in_uValue >> 4;
194 in_uValue |= in_uValue >> 8;
195 in_uValue |= in_uValue >> 16;
202 return (x << r) | (x >> (32 - r));
207 return (x << r) | (x >> (64 - r));