X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fposition.cpp;h=045b10cab7c276b8fc3806a09c4751c33fdf2523;hp=b2449a71956001ffc405aef33aa92da995d56bf7;hb=423c6d8a8a36fcc56d421caf0bbc12f53ba62c30;hpb=239d7b3fd144d2b493bb47ea97a436cec8ae5990;ds=inline diff --git a/src/position.cpp b/src/position.cpp index b2449a71..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); @@ -561,7 +560,7 @@ bool Position::is_pseudo_legal(const Move m) const { return false; // The destination square cannot be occupied by a friendly piece - if (color_of(piece_on(to)) == us) + if (piece_on(to) != NO_PIECE && color_of(piece_on(to)) == us) return false; // Handle the special case of a pawn move @@ -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 (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 @@ -688,15 +685,16 @@ bool Position::move_gives_check(Move m, const CheckInfo& ci) const { Color us = sideToMove; Square ksq = king_square(~us); - // Promotion with check ? - if (type_of(m) == PROMOTION) + switch (type_of(m)) + { + case PROMOTION: return attacks_from(Piece(promotion_type(m)), to, pieces() ^ from) & ksq; // En passant capture with check ? We have already handled the case // of direct checks and ordinary discovered check, the only case we // need to handle is the unusual case of a discovered check through // the captured pawn. - if (type_of(m) == ENPASSANT) + case ENPASSANT: { Square capsq = file_of(to) | rank_of(from); Bitboard b = (pieces() ^ from ^ capsq) | to; @@ -704,9 +702,7 @@ bool Position::move_gives_check(Move m, const CheckInfo& ci) const { return (attacks_bb< ROOK>(ksq, b) & pieces(us, QUEEN, ROOK)) | (attacks_bb(ksq, b) & pieces(us, QUEEN, BISHOP)); } - - // Castling with check ? - if (type_of(m) == CASTLE) + case CASTLE: { Square kfrom = from; Square rfrom = to; // 'King captures the rook' notation @@ -716,8 +712,10 @@ bool Position::move_gives_check(Move m, const CheckInfo& ci) const { return attacks_bb(rto, b) & ksq; } - - return false; + default: + assert(false); + return false; + } } @@ -771,7 +769,7 @@ void Position::do_move(Move m, StateInfo& newSt, const CheckInfo& ci, bool moveI PieceType capture = type_of(m) == ENPASSANT ? PAWN : type_of(piece_on(to)); assert(color_of(piece) == us); - assert(color_of(piece_on(to)) != us); + assert(piece_on(to) == NO_PIECE || color_of(piece_on(to)) == them); assert(capture != KING); if (capture) @@ -917,8 +915,8 @@ void Position::do_move(Move m, StateInfo& newSt, const CheckInfo& ci, bool moveI } // Prefetch pawn and material hash tables - prefetch((char*)thisThread->pawnTable.entries[st->pawnKey]); - prefetch((char*)thisThread->materialTable.entries[st->materialKey]); + prefetch((char*)thisThread->pawnsTable[st->pawnKey]); + prefetch((char*)thisThread->materialTable[st->materialKey]); // Update incremental scores st->psqScore += psq_delta(piece, from, to);