X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fbitboard.h;h=715f6c4af485bf8bb7f1313601cb6710024ae0f2;hp=21dc6e44087a36e5c527d0d9a15b78119aa48463;hb=7ae3c05795e79c9bd945607cdcfb08198f4c4b45;hpb=8fb45caadef67fb2ccc27857c15ade987d9f5e2f diff --git a/src/bitboard.h b/src/bitboard.h index 21dc6e44..715f6c4a 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]; @@ -134,13 +124,13 @@ inline Bitboard file_bb(Square s) { } -/// shift_bb() moves a bitboard one step along direction Delta. Mainly for pawns +/// shift() moves a bitboard one step along direction D. Mainly for pawns -template -inline Bitboard shift_bb(Bitboard b) { - return Delta == DELTA_N ? b << 8 : Delta == DELTA_S ? b >> 8 - : Delta == DELTA_NE ? (b & ~FileHBB) << 9 : Delta == DELTA_SE ? (b & ~FileHBB) >> 7 - : Delta == DELTA_NW ? (b & ~FileABB) << 7 : Delta == DELTA_SW ? (b & ~FileABB) >> 9 +template +inline Bitboard shift(Bitboard b) { + return D == NORTH ? b << 8 : D == SOUTH ? b >> 8 + : D == NORTH_EAST ? (b & ~FileHBB) << 9 : D == SOUTH_EAST ? (b & ~FileHBB) >> 7 + : D == NORTH_WEST ? (b & ~FileABB) << 7 : D == SOUTH_WEST ? (b & ~FileABB) >> 9 : 0; } @@ -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)]; } @@ -267,13 +268,9 @@ inline int popcount(Bitboard b) { 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) +#elif defined(_MSC_VER) || defined(__INTEL_COMPILER) - return (int)__popcnt64(b); + return (int)_mm_popcnt_u64(b); #else // Assumed gcc or compatible compiler