|
@@ -77,15 +77,17 @@ namespace chessy
|
|
|
|
|
|
inline int popcount(U64 x) {
|
|
|
#if __GNUC__ > 4
|
|
|
- return __builtin_popcount(x);
|
|
|
+ return __builtin_popcountll(x);
|
|
|
#elif defined(_MSC_VER) && defined(_M_X64)
|
|
|
return _mm_popcnt_u64(x);
|
|
|
#else
|
|
|
- int result = 0;
|
|
|
- for (int i = 0; i < 64; i++)
|
|
|
- if (x & (1ULL << i))
|
|
|
- result++;
|
|
|
- return result;
|
|
|
+ x = (x & 0x5555555555555555) + ((x & 0xAAAAAAAAAAAAAAAA) >> 1);
|
|
|
+ x = (x & 0x3333333333333333) + ((x & 0xCCCCCCCCCCCCCCCC) >> 2);
|
|
|
+ x = (x & 0x0F0F0F0F0F0F0F0F) + ((x & 0xF0F0F0F0F0F0F0F0) >> 4);
|
|
|
+ x = (x & 0x00FF00FF00FF00FF) + ((x & 0xFF00FF00FF00FF00) >> 8);
|
|
|
+ x = (x & 0x0000FFFF0000FFFF) + ((x & 0xFFFF0000FFFF0000) >> 16);
|
|
|
+ x = (x & 0x00000000FFFFFFFF) + ((x & 0xFFFFFFFF00000000) >> 32);
|
|
|
+ return x;
|
|
|
#endif
|
|
|
}
|
|
|
}
|