From: Marco Costalba Date: Wed, 22 Aug 2012 07:29:49 +0000 (+0100) Subject: Streamline generate_moves() X-Git-Url: https://git.sesse.net/?p=stockfish;a=commitdiff_plain;h=0de92576100bba948cae854ebb9cd5a7a9502b43 Streamline generate_moves() Greatly simplify these very performace critical functions. Amazingly we don't have any speed regression actually under MSVC we have the same assembly for generate_moves() ! In generate_direct_checks() 'target' is calculated only once being a loop invariant. On Clang there is even a slight speed up. No functional change. Signed-off-by: Marco Costalba --- diff --git a/src/movegen.cpp b/src/movegen.cpp index c275109d..dcd7e60b 100644 --- a/src/movegen.cpp +++ b/src/movegen.cpp @@ -216,31 +216,25 @@ namespace { template - inline MoveStack* generate_direct_checks(const Position& pos, MoveStack* mlist, - Color us, const CheckInfo& ci) { + FORCE_INLINE MoveStack* generate_direct_checks(const Position& pos, MoveStack* mlist, + Color us, const CheckInfo& ci) { assert(Pt != KING && Pt != PAWN); - Bitboard b, target; - Square from; const Square* pl = pos.piece_list(us, Pt); - if (*pl != SQ_NONE) + for (Square from = *pl; from != SQ_NONE; from = *++pl) { - target = ci.checkSq[Pt] & ~pos.pieces(); // Non capture checks only + Bitboard target = ci.checkSq[Pt] & ~pos.pieces(); // Non capture checks only - do { - from = *pl; + if ( (Pt == BISHOP || Pt == ROOK || Pt == QUEEN) + && !(PseudoAttacks[Pt][from] & target)) + continue; - if ( (Pt == BISHOP || Pt == ROOK || Pt == QUEEN) - && !(PseudoAttacks[Pt][from] & target)) - continue; + if (ci.dcCandidates && (ci.dcCandidates & from)) + continue; - if (ci.dcCandidates && (ci.dcCandidates & from)) - continue; - - b = pos.attacks_from(from) & target; - SERIALIZE(b); - } while (*++pl != SQ_NONE); + Bitboard b = pos.attacks_from(from) & target; + SERIALIZE(b); } return mlist; @@ -252,16 +246,13 @@ namespace { Color us, Bitboard target) { assert(Pt != KING && Pt != PAWN); - Bitboard b; - Square from; const Square* pl = pos.piece_list(us, Pt); - if (*pl != SQ_NONE) - do { - from = *pl; - b = pos.attacks_from(from) & target; - SERIALIZE(b); - } while (*++pl != SQ_NONE); + for (Square from = *pl; from != SQ_NONE; from = *++pl) + { + Bitboard b = pos.attacks_from(from) & target; + SERIALIZE(b); + } return mlist; }