From be540b6dd73eab00444c068fad707e88b223d608 Mon Sep 17 00:00:00 2001 From: Marco Costalba Date: Fri, 6 Aug 2010 12:01:21 +0100 Subject: [PATCH] Another push to perft speed We don't need to generate captures and non captures in a separate step. This gives another 7% push to perft speed. yes, I know, it is totally useless :-) No functional change. Signed-off-by: Marco Costalba --- src/movegen.cpp | 33 ++++++++++++++++++++++++++++----- src/movegen.h | 1 + 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/src/movegen.cpp b/src/movegen.cpp index df2b9b87..0598249d 100644 --- a/src/movegen.cpp +++ b/src/movegen.cpp @@ -140,6 +140,32 @@ MoveStack* generate_noncaptures(const Position& pos, MoveStack* mlist) { } +/// generate_non_evasions() generates all pseudo-legal captures and +/// non-captures. Returns a pointer to the end of the move list. + +MoveStack* generate_non_evasions(const Position& pos, MoveStack* mlist) { + + assert(pos.is_ok()); + assert(!pos.is_check()); + + Color us = pos.side_to_move(); + Bitboard target = pos.pieces_of_color(opposite_color(us)); + + mlist = generate_piece_moves(pos, mlist, us, target); + mlist = generate_piece_moves(pos, mlist, us, pos.empty_squares()); + + target |= pos.empty_squares(); + + mlist = generate_piece_moves(pos, mlist, us, target); + mlist = generate_piece_moves(pos, mlist, us, target); + mlist = generate_piece_moves(pos, mlist, us, target); + mlist = generate_piece_moves(pos, mlist, us, target); + mlist = generate_piece_moves(pos, mlist, us, target); + mlist = generate_castle_moves(pos, mlist); + return generate_castle_moves(pos, mlist); +} + + /// generate_non_capture_checks() generates all pseudo-legal non-captures and knight /// underpromotions that give check. Returns a pointer to the end of the move list. @@ -260,11 +286,8 @@ MoveStack* generate_moves(const Position& pos, MoveStack* mlist, bool pseudoLega Bitboard pinned = pos.pinned_pieces(pos.side_to_move()); // Generate pseudo-legal moves - if (pos.is_check()) - last = generate_evasions(pos, mlist); - else - last = generate_noncaptures(pos, generate_captures(pos, mlist)); - + last = pos.is_check() ? generate_evasions(pos, mlist) + : generate_non_evasions(pos, mlist); if (pseudoLegal) return last; diff --git a/src/movegen.h b/src/movegen.h index 9a5042ce..723ab8ba 100644 --- a/src/movegen.h +++ b/src/movegen.h @@ -36,6 +36,7 @@ extern MoveStack* generate_captures(const Position& pos, MoveStack* mlist); extern MoveStack* generate_noncaptures(const Position& pos, MoveStack* mlist); extern MoveStack* generate_non_capture_checks(const Position& pos, MoveStack* mlist); extern MoveStack* generate_evasions(const Position& pos, MoveStack* mlist); +extern MoveStack* generate_non_evasions(const Position& pos, MoveStack* mlist); extern MoveStack* generate_moves(const Position& pos, MoveStack* mlist, bool pseudoLegal = false); extern bool move_is_legal(const Position& pos, const Move m, Bitboard pinned); extern bool move_is_legal(const Position& pos, const Move m); -- 2.39.2