41 #if !defined(AK_BIT_SCAN_INSTRUCTIONS)
46 #if defined(__clang__) || defined (__GNUC__)
49 return __builtin_popcountll(in_bits);
55 while (in_bits) { ++num; in_bits &= in_bits - 1; }
62 #if defined(__clang__) || defined (__GNUC__)
65 return __builtin_popcount(in_bits);
71 while (in_bits) { ++num; in_bits &= in_bits - 1; }
79 #if defined(__clang__) || defined(__GNUC__)
82 return in_bits ? __builtin_ctzll(in_bits) : 64;
84 #elif defined _MSC_VER && (defined AK_CPU_X86_64 || defined AK_CPU_ARM_64)
87 unsigned long ret = 0;
88 _BitScanForward64(&ret, in_bits);
89 return in_bits ? ret : 64;
94 if (in_bits == 0)
return 64;
96 if ((in_bits & 0x00000000FFFFFFFFULL) == 0) { ret += 32; in_bits >>= 32; }
97 if ((in_bits & 0x000000000000FFFFULL) == 0) { ret += 16; in_bits >>= 16; }
98 if ((in_bits & 0x00000000000000FFULL) == 0) { ret += 8; in_bits >>= 8; }
99 if ((in_bits & 0x000000000000000FULL) == 0) { ret += 4; in_bits >>= 4; }
100 if ((in_bits & 0x0000000000000003ULL) == 0) { ret += 2; in_bits >>= 2; }
101 if ((in_bits & 0x0000000000000001ULL) == 0) { ret += 1; in_bits >>= 1; }
106 #if defined(__clang__) || defined (__GNUC__)
109 return in_bits ? __builtin_ctz(in_bits) : 32;
111 #elif defined _MSC_VER
114 unsigned long ret = 0;
115 _BitScanForward(&ret, in_bits);
116 return in_bits ? ret : 32;
121 if (in_bits == 0)
return 32;
123 if ((in_bits & 0x0000FFFFULL) == 0) { ret += 16; in_bits >>= 16; }
124 if ((in_bits & 0x000000FFULL) == 0) { ret += 8; in_bits >>= 8; }
125 if ((in_bits & 0x0000000FULL) == 0) { ret += 4; in_bits >>= 4; }
126 if ((in_bits & 0x00000003ULL) == 0) { ret += 2; in_bits >>= 2; }
127 if ((in_bits & 0x00000001ULL) == 0) { ret += 1; in_bits >>= 1; }
135 #if defined(__clang__) || defined (__GNUC__)
138 return in_bits ? __builtin_clzll(in_bits) : 64;
140 #elif defined _MSC_VER && (defined AK_CPU_X86_64 || defined AK_CPU_ARM_64)
143 unsigned long ret = 0;
144 _BitScanReverse64(&ret, in_bits);
145 return in_bits ? 63 - ret : 64;
150 if (in_bits == 0)
return 64;
152 if ((in_bits & 0xFFFFFFFF00000000ULL) == 0) { ret += 32; in_bits <<= 32; }
153 if ((in_bits & 0xFFFF000000000000ULL) == 0) { ret += 16; in_bits <<= 16; }
154 if ((in_bits & 0xFF00000000000000ULL) == 0) { ret += 8; in_bits <<= 8; }
155 if ((in_bits & 0xF000000000000000ULL) == 0) { ret += 4; in_bits <<= 4; }
156 if ((in_bits & 0xC000000000000000ULL) == 0) { ret += 2; in_bits <<= 2; }
157 if ((in_bits & 0x8000000000000000ULL) == 0) { ret += 1; in_bits <<= 1; }
162 #if defined(__clang__) || defined (__GNUC__)
165 return in_bits ? __builtin_clz(in_bits) : 32;
167 #elif defined _MSC_VER
170 unsigned long ret = 0;
171 _BitScanReverse(&ret, in_bits);
172 return in_bits ? 31 - ret : 32;
177 if (in_bits == 0)
return 32;
179 if ((in_bits & 0xFFFF0000ULL) == 0) { ret += 16; in_bits <<= 16; }
180 if ((in_bits & 0xFF000000ULL) == 0) { ret += 8; in_bits <<= 8; }
181 if ((in_bits & 0xF0000000ULL) == 0) { ret += 4; in_bits <<= 4; }
182 if ((in_bits & 0xC0000000ULL) == 0) { ret += 2; in_bits <<= 2; }
183 if ((in_bits & 0x80000000ULL) == 0) { ret += 1; in_bits <<= 1; }
189 #endif // defined(AK_BIT_SCAN_INSTRUCTIONS)
206 in_uValue |= in_uValue >> 1;
207 in_uValue |= in_uValue >> 2;
208 in_uValue |= in_uValue >> 4;
209 in_uValue |= in_uValue >> 8;
210 in_uValue |= in_uValue >> 16;
217 return (x << r) | (x >> (32 - r));
222 return (x << r) | (x >> (64 - r));