X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fbitboard.h;h=21dc6e44087a36e5c527d0d9a15b78119aa48463;hb=8fb45caadef67fb2ccc27857c15ade987d9f5e2f;hp=77a824ba62106965ba9513803a19c650c092bb4c;hpb=900279a06f432fbba63b5a320028830b40e06e3e;p=stockfish diff --git a/src/bitboard.h b/src/bitboard.h index 77a824ba..21dc6e44 100644 --- a/src/bitboard.h +++ b/src/bitboard.h @@ -257,6 +257,32 @@ inline Bitboard attacks_bb(Piece pc, Square s, Bitboard occupied) { } +/// 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__)