X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fbitboard.h;h=38870a2be69fbd8a33ca8a50e610db4a29dd7c86;hp=c957a40fe23d61296a0e094bf36bd44581cda5d6;hb=27ba611a3da37423a3502e49beeebe11c9a11d8e;hpb=e06a117d5e78ec4edc051f2b161d36559f784d37 diff --git a/src/bitboard.h b/src/bitboard.h index c957a40f..38870a2b 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. @@ -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) {