X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fposition.cpp;h=ca1c21c38dc8a5f2f7e9e8f16f971ed59c75313c;hp=45d0147aef1f2c6d4b244ef8ae261ebe36bc4d7a;hb=ad44ff2bca7a4e919ce8375cda95ec849e63ef60;hpb=2f01d67a925e01508b4f3ae3bdc1c44d14b85c8e diff --git a/src/position.cpp b/src/position.cpp index 45d0147a..ca1c21c3 100644 --- a/src/position.cpp +++ b/src/position.cpp @@ -658,20 +658,18 @@ inline void Position::update_checkers(Bitboard* pCheckersBB, Square ksq, Square const bool Rook = (Piece == QUEEN || Piece == ROOK); const bool Slider = Bishop || Rook; + assert(*pCheckersBB == EmptyBoardBB); + // Direct checks - if ( ( (Bishop && bit_is_set(BishopPseudoAttacks[ksq], to)) + if ( ( !Slider // try to early skip slide piece attacks + || (Bishop && bit_is_set(BishopPseudoAttacks[ksq], to)) || (Rook && bit_is_set(RookPseudoAttacks[ksq], to))) - && bit_is_set(attacks_from(ksq), to)) // slow, try to early skip - set_bit(pCheckersBB, to); - - else if ( Piece != KING - && !Slider - && bit_is_set(Piece == PAWN ? attacks_from(ksq, opposite_color(sideToMove)) - : attacks_from(ksq), to)) - set_bit(pCheckersBB, to); - + && bit_is_set(Piece == PAWN ? attacks_from(ksq, opposite_color(sideToMove)) : attacks_from(ksq) , to)) + { + *pCheckersBB = SetMaskBB[to]; + } // Discovery checks - if (Piece != QUEEN && bit_is_set(dcCandidates, from)) + if (Piece != QUEEN && dcCandidates && bit_is_set(dcCandidates, from)) { if (Piece != ROOK) (*pCheckersBB) |= (attacks_from(ksq) & pieces(ROOK, QUEEN, side_to_move())); @@ -691,7 +689,7 @@ void Position::do_move(Move m, StateInfo& newSt) { do_move(m, newSt, discovered_check_candidates(side_to_move())); } -void Position::do_move(Move m, StateInfo& newSt, Bitboard dcCandidates) { +void Position::do_move(Move m, StateInfo& newSt, Bitboard dcCandidates, bool moveCanBeCheck) { assert(is_ok()); assert(move_is_ok(m)); @@ -860,21 +858,25 @@ void Position::do_move(Move m, StateInfo& newSt, Bitboard dcCandidates) { st->key = key; // Update checkers bitboard, piece must be already moved - if (ep | pm) - st->checkersBB = attackers_to(king_square(them)) & pieces_of_color(us); - else + st->checkersBB = EmptyBoardBB; + + if (moveCanBeCheck) { - st->checkersBB = EmptyBoardBB; - Square ksq = king_square(them); - switch (pt) + if (ep | pm) + st->checkersBB = attackers_to(king_square(them)) & pieces_of_color(us); + else { - case PAWN: update_checkers(&(st->checkersBB), ksq, from, to, dcCandidates); break; - case KNIGHT: update_checkers(&(st->checkersBB), ksq, from, to, dcCandidates); break; - case BISHOP: update_checkers(&(st->checkersBB), ksq, from, to, dcCandidates); break; - case ROOK: update_checkers(&(st->checkersBB), ksq, from, to, dcCandidates); break; - case QUEEN: update_checkers(&(st->checkersBB), ksq, from, to, dcCandidates); break; - case KING: update_checkers(&(st->checkersBB), ksq, from, to, dcCandidates); break; - default: assert(false); break; + Square ksq = king_square(them); + switch (pt) + { + case PAWN: update_checkers(&(st->checkersBB), ksq, from, to, dcCandidates); break; + case KNIGHT: update_checkers(&(st->checkersBB), ksq, from, to, dcCandidates); break; + case BISHOP: update_checkers(&(st->checkersBB), ksq, from, to, dcCandidates); break; + case ROOK: update_checkers(&(st->checkersBB), ksq, from, to, dcCandidates); break; + case QUEEN: update_checkers(&(st->checkersBB), ksq, from, to, dcCandidates); break; + case KING: update_checkers(&(st->checkersBB), ksq, from, to, dcCandidates); break; + default: assert(false); break; + } } }