X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fbitboard.h;h=63f668b9b8a7307243c1146d55e079c1a713e5d7;hp=c957a40fe23d61296a0e094bf36bd44581cda5d6;hb=2c237da54647bb7526f3512bea183eb44919cdda;hpb=e06a117d5e78ec4edc051f2b161d36559f784d37 diff --git a/src/bitboard.h b/src/bitboard.h index c957a40f..63f668b9 100644 --- a/src/bitboard.h +++ b/src/bitboard.h @@ -76,6 +76,18 @@ extern Bitboard PseudoAttacks[PIECE_TYPE_NB][SQUARE_NB]; extern Bitboard PawnAttacks[COLOR_NB][SQUARE_NB]; +/// Magic holds all magic bitboards relevant data for a single square +struct Magic { + Bitboard mask; + Bitboard magic; + Bitboard* attacks; + unsigned shift; +}; + +extern Magic RookMagics[SQUARE_NB]; +extern Magic BishopMagics[SQUARE_NB]; + + /// Overloads of bitwise operators between a Bitboard and a Square for testing /// whether a given bit is set in a bitboard, and for setting and clearing bits. @@ -174,7 +186,7 @@ inline Bitboard forward_bb(Color c, Square s) { /// pawn_attack_span() returns a bitboard representing all the squares that can be /// attacked by a pawn of the given color when it moves along its file, starting /// from the given square: -/// PawnAttackSpan[c][s] = in_front_bb(c, rank_of(s)) & adjacent_files_bb(s); +/// PawnAttackSpan[c][s] = in_front_bb(c, rank_of(s)) & adjacent_files_bb(file_of(s)); inline Bitboard pawn_attack_span(Color c, Square s) { return PawnAttackSpan[c][s]; @@ -212,38 +224,24 @@ template<> inline int distance(Square x, Square y) { return distance(rank_ /// attacks_bb() returns a bitboard representing all the squares attacked by a /// piece of type Pt (bishop or rook) placed on 's'. The helper magic_index() /// looks up the index using the 'magic bitboards' approach. -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; +inline unsigned magic_index(const Magic& m, Bitboard occupied) { if (HasPext) - return unsigned(pext(occupied, Masks[s])); + return unsigned(pext(occupied, m.mask)); if (Is64Bit) - return unsigned(((occupied & Masks[s]) * Magics[s]) >> Shifts[s]); + return unsigned(((occupied & m.mask) * m.magic) >> m.shift); - unsigned lo = unsigned(occupied) & unsigned(Masks[s]); - unsigned hi = unsigned(occupied >> 32) & unsigned(Masks[s] >> 32); - return (lo * unsigned(Magics[s]) ^ hi * unsigned(Magics[s] >> 32)) >> Shifts[s]; + unsigned lo = unsigned(occupied) & unsigned(m.mask); + unsigned hi = unsigned(occupied >> 32) & unsigned(m.mask >> 32); + return (lo * unsigned(m.magic) ^ hi * unsigned(m.magic >> 32)) >> m.shift; } 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)]; + const Magic& M = Pt == ROOK ? RookMagics[s] : BishopMagics[s]; + return M.attacks[magic_index(M, occupied)]; } inline Bitboard attacks_bb(PieceType pt, Square s, Bitboard occupied) { @@ -253,7 +251,7 @@ inline Bitboard attacks_bb(PieceType pt, Square s, Bitboard occupied) { switch (pt) { case BISHOP: return attacks_bb(s, occupied); - case ROOK : return attacks_bb(s, occupied); + case ROOK : return attacks_bb< ROOK>(s, occupied); case QUEEN : return attacks_bb(s, occupied) | attacks_bb(s, occupied); default : return PseudoAttacks[pt][s]; }