}
+/// popcount() counts the number of non-zero bits in a bitboard
+
+inline int popcount(Bitboard b) {
+
+#ifndef USE_POPCNT
+
+ extern uint8_t PopCnt16[1 << 16];
+ union { Bitboard bb; uint16_t u[4]; } v = { b };
+ return PopCnt16[v.u[0]] + PopCnt16[v.u[1]] + PopCnt16[v.u[2]] + PopCnt16[v.u[3]];
+
+#elif defined(_MSC_VER) && defined(__INTEL_COMPILER)
+
+ return _mm_popcnt_u64(b);
+
+#elif defined(_MSC_VER)
+
+ return (int)__popcnt64(b);
+
+#else // Assumed gcc or compatible compiler
+
+ return __builtin_popcountll(b);
+
+#endif
+}
+
+
/// lsb() and msb() return the least/most significant bit in a non-zero bitboard
#if defined(__GNUC__)
-inline Square lsb(Bitboard b) { return Square(__builtin_ctzll(b)); }
-inline Square msb(Bitboard b) { return Square(63 - __builtin_clzll(b)); }
+inline Square lsb(Bitboard b) {
+ assert(b);
+ return Square(__builtin_ctzll(b));
+}
+
+inline Square msb(Bitboard b) {
+ assert(b);
+ return Square(63 - __builtin_clzll(b));
+}
#elif defined(_WIN64) && defined(_MSC_VER)
inline Square lsb(Bitboard b) {
+ assert(b);
unsigned long idx;
_BitScanForward64(&idx, b);
return (Square) idx;
}
inline Square msb(Bitboard b) {
+ assert(b);
unsigned long idx;
_BitScanReverse64(&idx, b);
return (Square) idx;