From: Marco Costalba Date: Tue, 25 Dec 2012 10:22:55 +0000 (+0100) Subject: Small tweak in is_pseudo_legal() X-Git-Url: https://git.sesse.net/?p=stockfish;a=commitdiff_plain;h=423c6d8a8a36fcc56d421caf0bbc12f53ba62c30;ds=inline Small tweak in is_pseudo_legal() This is difficult code becuase a bug here could lead to very subtle crashes in case of SMP games where we have TT move corruption due to concurrent access. Anyhow I have fully verified te code throwing at it random moves. It shoudl work. No functional change. --- diff --git a/src/position.cpp b/src/position.cpp index 0ed2fff4..045b10ca 100644 --- a/src/position.cpp +++ b/src/position.cpp @@ -542,7 +542,6 @@ bool Position::move_is_legal(const Move m) const { bool Position::is_pseudo_legal(const Move m) const { Color us = sideToMove; - Color them = ~sideToMove; Square from = from_sq(m); Square to = to_sq(m); Piece pc = piece_moved(m); @@ -587,7 +586,7 @@ bool Position::is_pseudo_legal(const Move m) const { case DELTA_SE: // Capture. The destination square must be occupied by an enemy // piece (en passant captures was handled earlier). - if (piece_on(to) == NO_PIECE || color_of(piece_on(to)) != them) + if (piece_on(to) == NO_PIECE || color_of(piece_on(to)) != ~us) return false; // From and to files must be one file apart, avoids a7h5 @@ -636,14 +635,12 @@ bool Position::is_pseudo_legal(const Move m) const { { if (type_of(pc) != KING) { - Bitboard b = checkers(); - Square checksq = pop_lsb(&b); - - if (b) // double check ? In this case a king move is required + // Double check? In this case a king move is required + if (more_than_one(checkers())) return false; // Our move must be a blocking evasion or a capture of the checking piece - if (!((between_bb(checksq, king_square(us)) | checkers()) & to)) + if (!((between_bb(lsb(checkers()), king_square(us)) | checkers()) & to)) return false; } // In case of king moves under check we have to remove king so to catch