From: Marco Costalba Date: Wed, 5 Jan 2011 08:49:58 +0000 (+0100) Subject: Esplicitly inline generate_piece_moves() & friends X-Git-Url: https://git.sesse.net/?p=stockfish;a=commitdiff_plain;h=22ca7a601f8484d03eb7e9be79e03a74d2e4aa2c Esplicitly inline generate_piece_moves() & friends Should be already inlined by the compiler when optimizing but better safe than sorry ;-) No functional change. Signed-off-by: Marco Costalba --- diff --git a/src/movegen.cpp b/src/movegen.cpp index f688bfef..0f3e4ddb 100644 --- a/src/movegen.cpp +++ b/src/movegen.cpp @@ -52,19 +52,65 @@ namespace { EVASION }; - // Helper templates template MoveStack* generate_castle_moves(const Position&, MoveStack*); template MoveStack* generate_pawn_moves(const Position&, MoveStack*, Bitboard, Square); - // Template generate_piece_moves (captures and non-captures) with specializations and overloads - template - MoveStack* generate_piece_moves(const Position&, MoveStack*, Color, Bitboard); + template + inline MoveStack* generate_discovered_checks(const Position& pos, MoveStack* mlist, Square from) { + + assert(Piece != QUEEN); + + Bitboard b = pos.attacks_from(from) & pos.empty_squares(); + if (Piece == KING) + { + Square ksq = pos.king_square(opposite_color(pos.side_to_move())); + b &= ~QueenPseudoAttacks[ksq]; + } + SERIALIZE_MOVES(b); + return mlist; + } + + template + inline MoveStack* generate_direct_checks(const Position& pos, MoveStack* mlist, Color us, + Bitboard dc, Square ksq) { + assert(Piece != KING); + + Bitboard checkSqs, b; + Square from; + const Square* ptr = pos.piece_list_begin(us, Piece); + + if ((from = *ptr++) == SQ_NONE) + return mlist; + + checkSqs = pos.attacks_from(ksq) & pos.empty_squares(); + + do + { + if ( (Piece == QUEEN && !(QueenPseudoAttacks[from] & checkSqs)) + || (Piece == ROOK && !(RookPseudoAttacks[from] & checkSqs)) + || (Piece == BISHOP && !(BishopPseudoAttacks[from] & checkSqs))) + continue; + + if (dc && bit_is_set(dc, from)) + continue; + + b = pos.attacks_from(from) & checkSqs; + SERIALIZE_MOVES(b); + + } while ((from = *ptr++) != SQ_NONE); + + return mlist; + } template<> - MoveStack* generate_piece_moves(const Position&, MoveStack*, Color, Bitboard); + inline MoveStack* generate_direct_checks(const Position& p, MoveStack* m, Color us, Bitboard dc, Square ksq) { + + return (us == WHITE ? generate_pawn_moves(p, m, dc, ksq) + : generate_pawn_moves(p, m, dc, ksq)); + } template inline MoveStack* generate_piece_moves(const Position& p, MoveStack* m, Color us, Bitboard t) { @@ -76,20 +122,35 @@ namespace { : generate_pawn_moves(p, m, t, SQ_NONE)); } - // Templates for non-capture checks generation - template - MoveStack* generate_discovered_checks(const Position&, MoveStack*, Square); + inline MoveStack* generate_piece_moves(const Position& pos, MoveStack* mlist, Color us, Bitboard target) { - template - MoveStack* generate_direct_checks(const Position&, MoveStack*, Color, Bitboard, Square); + Bitboard b; + Square from; + const Square* ptr = pos.piece_list_begin(us, Piece); + + if (*ptr != SQ_NONE) + { + do { + from = *ptr; + b = pos.attacks_from(from) & target; + SERIALIZE_MOVES(b); + } while (*++ptr != SQ_NONE); + } + return mlist; + } template<> - inline MoveStack* generate_direct_checks(const Position& p, MoveStack* m, Color us, Bitboard dc, Square ksq) { + inline MoveStack* generate_piece_moves(const Position& pos, MoveStack* mlist, Color us, Bitboard target) { - return (us == WHITE ? generate_pawn_moves(p, m, dc, ksq) - : generate_pawn_moves(p, m, dc, ksq)); + Bitboard b; + Square from = pos.king_square(us); + + b = pos.attacks_from(from) & target; + SERIALIZE_MOVES(b); + return mlist; } + } @@ -415,35 +476,6 @@ bool move_is_legal(const Position& pos, const Move m, Bitboard pinned) { namespace { - template - MoveStack* generate_piece_moves(const Position& pos, MoveStack* mlist, Color us, Bitboard target) { - - Bitboard b; - Square from; - const Square* ptr = pos.piece_list_begin(us, Piece); - - if (*ptr != SQ_NONE) - { - do { - from = *ptr; - b = pos.attacks_from(from) & target; - SERIALIZE_MOVES(b); - } while (*++ptr != SQ_NONE); - } - return mlist; - } - - template<> - MoveStack* generate_piece_moves(const Position& pos, MoveStack* mlist, Color us, Bitboard target) { - - Bitboard b; - Square from = pos.king_square(us); - - b = pos.attacks_from(from) & target; - SERIALIZE_MOVES(b); - return mlist; - } - template inline Bitboard move_pawns(Bitboard p) { @@ -607,53 +639,6 @@ namespace { return mlist; } - template - MoveStack* generate_discovered_checks(const Position& pos, MoveStack* mlist, Square from) { - - assert(Piece != QUEEN); - - Bitboard b = pos.attacks_from(from) & pos.empty_squares(); - if (Piece == KING) - { - Square ksq = pos.king_square(opposite_color(pos.side_to_move())); - b &= ~QueenPseudoAttacks[ksq]; - } - SERIALIZE_MOVES(b); - return mlist; - } - - template - MoveStack* generate_direct_checks(const Position& pos, MoveStack* mlist, Color us, - Bitboard dc, Square ksq) { - assert(Piece != KING); - - Bitboard checkSqs, b; - Square from; - const Square* ptr = pos.piece_list_begin(us, Piece); - - if ((from = *ptr++) == SQ_NONE) - return mlist; - - checkSqs = pos.attacks_from(ksq) & pos.empty_squares(); - - do - { - if ( (Piece == QUEEN && !(QueenPseudoAttacks[from] & checkSqs)) - || (Piece == ROOK && !(RookPseudoAttacks[from] & checkSqs)) - || (Piece == BISHOP && !(BishopPseudoAttacks[from] & checkSqs))) - continue; - - if (dc && bit_is_set(dc, from)) - continue; - - b = pos.attacks_from(from) & checkSqs; - SERIALIZE_MOVES(b); - - } while ((from = *ptr++) != SQ_NONE); - - return mlist; - } - template MoveStack* generate_castle_moves(const Position& pos, MoveStack* mlist) {