From df6ba1fa5c28397338fac176fb7677ab4b7ab08e Mon Sep 17 00:00:00 2001 From: Marco Costalba Date: Sun, 21 Nov 2010 12:43:16 +0100 Subject: [PATCH] Micro-optimize pl_move_is_legal() This L1/L2 optimization has an incredible +4.7% speedup in perft test where this function is the most time consumer. Verified a speed up also in normal bench, although smaller. No functional change. Signed-off-by: Marco Costalba --- src/position.cpp | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/position.cpp b/src/position.cpp index 6abef5b4..001d233d 100644 --- a/src/position.cpp +++ b/src/position.cpp @@ -588,22 +588,18 @@ bool Position::pl_move_is_legal(Move m, Bitboard pinned) const { if (move_is_castle(m)) return true; - Color us = side_to_move(); - Square from = move_from(m); - - assert(color_of_piece_on(from) == us); - assert(piece_on(king_square(us)) == piece_of_color_and_type(us, KING)); - // En passant captures are a tricky special case. Because they are // rather uncommon, we do it simply by testing whether the king is attacked // after the move is made if (move_is_ep(m)) { + Color us = side_to_move(); Color them = opposite_color(us); + Square from = move_from(m); Square to = move_to(m); Square capsq = make_square(square_file(to), square_rank(from)); - Bitboard b = occupied_squares(); Square ksq = king_square(us); + Bitboard b = occupied_squares(); assert(to == ep_square()); assert(piece_on(from) == piece_of_color_and_type(us, PAWN)); @@ -618,6 +614,12 @@ bool Position::pl_move_is_legal(Move m, Bitboard pinned) const { && !(bishop_attacks_bb(ksq, b) & pieces(BISHOP, QUEEN, them)); } + Color us = side_to_move(); + Square from = move_from(m); + + assert(color_of_piece_on(from) == us); + assert(piece_on(king_square(us)) == piece_of_color_and_type(us, KING)); + // If the moving piece is a king, check whether the destination // square is attacked by the opponent. if (type_of_piece_on(from) == KING) -- 2.39.2