X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fbitboard.h;h=ed7e318ca3198ed970aa9508752bf10e1e7d4ded;hp=3ea92bdf2e56400b273cafaf4f1689bc12a5de7e;hb=69eb391cd779223c331fb0de80392cbd323055a9;hpb=659990b43ff1a089be9878561048fa4c60ba2705 diff --git a/src/bitboard.h b/src/bitboard.h index 3ea92bdf..ed7e318c 100644 --- a/src/bitboard.h +++ b/src/bitboard.h @@ -76,6 +76,32 @@ 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; + + /// looks up the index using the 'magic bitboards' approach. + unsigned index(Bitboard occupied) const { + + if (HasPext) + return unsigned(pext(occupied, mask)); + + if (Is64Bit) + return unsigned(((occupied & mask) * magic) >> shift); + + unsigned lo = unsigned(occupied) & unsigned(mask); + unsigned hi = unsigned(occupied >> 32) & unsigned(mask >> 32); + return (lo * unsigned(magic) ^ hi * unsigned(magic >> 32)) >> 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 +200,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]; @@ -209,47 +235,14 @@ template<> inline int distance(Square x, Square y) { return distance(file_ template<> inline int distance(Square x, Square y) { return distance(rank_of(x), rank_of(y)); } -/// Magic holds all magic relevant data for a single square -struct Magic { - - Bitboard mask; - Bitboard magic; - Bitboard* attacks; - unsigned shift; -}; - /// 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 Magic RookMagics[SQUARE_NB]; - extern Magic BishopMagics[SQUARE_NB]; - - const Magic* Magics = Pt == ROOK ? RookMagics : BishopMagics; - Bitboard mask = Magics[s].mask; - Bitboard magic = Magics[s].magic; - unsigned shift = Magics[s].shift; - - if (HasPext) - return unsigned(pext(occupied, mask)); - - if (Is64Bit) - return unsigned(((occupied & mask) * magic) >> shift); - - unsigned lo = unsigned(occupied) & unsigned(mask); - unsigned hi = unsigned(occupied >> 32) & unsigned(mask >> 32); - return (lo * unsigned(magic) ^ hi * unsigned(magic >> 32)) >> shift; -} +/// piece of type Pt (bishop or rook) placed on 's'. template inline Bitboard attacks_bb(Square s, Bitboard occupied) { - extern Magic RookMagics[SQUARE_NB]; - extern Magic BishopMagics[SQUARE_NB]; - - return (Pt == ROOK ? RookMagics : BishopMagics)[s].attacks[magic_index(s, occupied)]; + const Magic& M = Pt == ROOK ? RookMagics[s] : BishopMagics[s]; + return M.attacks[M.index(occupied)]; } inline Bitboard attacks_bb(PieceType pt, Square s, Bitboard occupied) { @@ -259,7 +252,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]; }