From 4e619a13d6671db198bc9c39d54dd7f243ef5873 Mon Sep 17 00:00:00 2001 From: Marco Costalba Date: Wed, 22 Aug 2012 10:13:09 +0100 Subject: [PATCH] Merge generate_direct_checks() in generate_moves() Further reduce redundancy in move generation. Veirifed no speed regression on MSVC, Clang and gcc. No functional change. Signed-off-by: Marco Costalba --- src/movegen.cpp | 77 +++++++++++++++++++++---------------------------- 1 file changed, 33 insertions(+), 44 deletions(-) diff --git a/src/movegen.cpp b/src/movegen.cpp index dcd7e60b..ced938e8 100644 --- a/src/movegen.cpp +++ b/src/movegen.cpp @@ -215,52 +215,40 @@ namespace { } - template - FORCE_INLINE MoveStack* generate_direct_checks(const Position& pos, MoveStack* mlist, - Color us, const CheckInfo& ci) { + template FORCE_INLINE + MoveStack* generate_moves(const Position& pos, MoveStack* mlist, Color us, + Bitboard target, const CheckInfo* ci = NULL) { + assert(Pt != KING && Pt != PAWN); const Square* pl = pos.piece_list(us, Pt); for (Square from = *pl; from != SQ_NONE; from = *++pl) { - Bitboard target = ci.checkSq[Pt] & ~pos.pieces(); // Non capture checks only - - if ( (Pt == BISHOP || Pt == ROOK || Pt == QUEEN) - && !(PseudoAttacks[Pt][from] & target)) - continue; + if (OnlyChecks) + { + if ( (Pt == BISHOP || Pt == ROOK || Pt == QUEEN) + && !(PseudoAttacks[Pt][from] & target & ci->checkSq[Pt])) + continue; - if (ci.dcCandidates && (ci.dcCandidates & from)) - continue; + if (ci->dcCandidates && (ci->dcCandidates & from)) + continue; + } Bitboard b = pos.attacks_from(from) & target; - SERIALIZE(b); - } - - return mlist; - } + if (OnlyChecks) + b &= ci->checkSq[Pt]; - template - FORCE_INLINE MoveStack* generate_moves(const Position& pos, MoveStack* mlist, - Color us, Bitboard target) { - assert(Pt != KING && Pt != PAWN); - - const Square* pl = pos.piece_list(us, Pt); - - for (Square from = *pl; from != SQ_NONE; from = *++pl) - { - Bitboard b = pos.attacks_from(from) & target; SERIALIZE(b); } return mlist; } - - template<> - FORCE_INLINE MoveStack* generate_moves(const Position& pos, MoveStack* mlist, - Color us, Bitboard target) { + template<> FORCE_INLINE + MoveStack* generate_moves(const Position& pos, MoveStack* mlist, Color us, + Bitboard target, const CheckInfo*) { Square from = pos.king_square(us); Bitboard b = pos.attacks_from(from) & target; SERIALIZE(b); @@ -300,15 +288,15 @@ MoveStack* generate(const Position& pos, MoveStack* mlist) { mlist = (us == WHITE ? generate_pawn_moves(pos, mlist, target) : generate_pawn_moves(pos, mlist, target)); - mlist = generate_moves(pos, mlist, us, target); - mlist = generate_moves(pos, mlist, us, target); - mlist = generate_moves(pos, mlist, us, target); - mlist = generate_moves(pos, mlist, us, target); - mlist = generate_moves(pos, mlist, us, target); + mlist = generate_moves(pos, mlist, us, target); + mlist = generate_moves(pos, mlist, us, target); + mlist = generate_moves(pos, mlist, us, target); + mlist = generate_moves(pos, mlist, us, target); + mlist = generate_moves(pos, mlist, us, target); if (Type != CAPTURES && pos.can_castle(us)) { - mlist = generate_castle(pos, mlist, us); + mlist = generate_castle(pos, mlist, us); mlist = generate_castle(pos, mlist, us); } @@ -330,6 +318,7 @@ MoveStack* generate(const Position& pos, MoveStack* mlist) { Color us = pos.side_to_move(); CheckInfo ci(pos); + Bitboard empty = ~pos.pieces(); Bitboard dc = ci.dcCandidates; while (dc) @@ -351,14 +340,14 @@ MoveStack* generate(const Position& pos, MoveStack* mlist) { mlist = (us == WHITE ? generate_pawn_moves(pos, mlist, ci.dcCandidates, ci.ksq) : generate_pawn_moves(pos, mlist, ci.dcCandidates, ci.ksq)); - mlist = generate_direct_checks(pos, mlist, us, ci); - mlist = generate_direct_checks(pos, mlist, us, ci); - mlist = generate_direct_checks(pos, mlist, us, ci); - mlist = generate_direct_checks(pos, mlist, us, ci); + mlist = generate_moves(pos, mlist, us, empty, &ci); + mlist = generate_moves(pos, mlist, us, empty, &ci); + mlist = generate_moves(pos, mlist, us, empty, &ci); + mlist = generate_moves(pos, mlist, us, empty, &ci); if (pos.can_castle(us)) { - mlist = generate_castle(pos, mlist, us); + mlist = generate_castle(pos, mlist, us); mlist = generate_castle(pos, mlist, us); } @@ -430,10 +419,10 @@ MoveStack* generate(const Position& pos, MoveStack* mlist) { mlist = (us == WHITE ? generate_pawn_moves(pos, mlist, target) : generate_pawn_moves(pos, mlist, target)); - mlist = generate_moves(pos, mlist, us, target); - mlist = generate_moves(pos, mlist, us, target); - mlist = generate_moves(pos, mlist, us, target); - return generate_moves(pos, mlist, us, target); + mlist = generate_moves(pos, mlist, us, target); + mlist = generate_moves(pos, mlist, us, target); + mlist = generate_moves(pos, mlist, us, target); + return generate_moves(pos, mlist, us, target); } -- 2.39.2