X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fbitboard.h;h=c4fc26e1eefb1787b35ebb6090d271e53404c53b;hp=2ad8773634dce967e6cc6b223e68eeb3d4d66f05;hb=2dd24dc4e618dc7b83799890fe7e84b09b6456b4;hpb=db4b0d8b7db8db15c16a71212990354094f00b0d diff --git a/src/bitboard.h b/src/bitboard.h index 2ad87736..c4fc26e1 100644 --- a/src/bitboard.h +++ b/src/bitboard.h @@ -61,16 +61,6 @@ const Bitboard Rank8BB = Rank1BB << (8 * 7); extern int SquareDistance[SQUARE_NB][SQUARE_NB]; -extern Bitboard RookMasks [SQUARE_NB]; -extern Bitboard RookMagics [SQUARE_NB]; -extern Bitboard* RookAttacks[SQUARE_NB]; -extern unsigned RookShifts [SQUARE_NB]; - -extern Bitboard BishopMasks [SQUARE_NB]; -extern Bitboard BishopMagics [SQUARE_NB]; -extern Bitboard* BishopAttacks[SQUARE_NB]; -extern unsigned BishopShifts [SQUARE_NB]; - extern Bitboard SquareBB[SQUARE_NB]; extern Bitboard FileBB[FILE_NB]; extern Bitboard RankBB[RANK_NB]; @@ -225,6 +215,13 @@ template<> inline int distance(Square x, Square y) { return distance(rank_ template inline unsigned magic_index(Square s, Bitboard occupied) { + extern Bitboard RookMasks[SQUARE_NB]; + extern Bitboard RookMagics[SQUARE_NB]; + extern unsigned RookShifts[SQUARE_NB]; + extern Bitboard BishopMasks[SQUARE_NB]; + extern Bitboard BishopMagics[SQUARE_NB]; + extern unsigned BishopShifts[SQUARE_NB]; + Bitboard* const Masks = Pt == ROOK ? RookMasks : BishopMasks; Bitboard* const Magics = Pt == ROOK ? RookMagics : BishopMagics; unsigned* const Shifts = Pt == ROOK ? RookShifts : BishopShifts; @@ -242,6 +239,10 @@ inline unsigned magic_index(Square s, Bitboard occupied) { template inline Bitboard attacks_bb(Square s, Bitboard occupied) { + + extern Bitboard* RookAttacks[SQUARE_NB]; + extern Bitboard* BishopAttacks[SQUARE_NB]; + return (Pt == ROOK ? RookAttacks : BishopAttacks)[s][magic_index(s, occupied)]; } @@ -257,22 +258,57 @@ 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__) -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;