From: Marco Costalba Date: Sun, 8 Jan 2012 14:08:20 +0000 (+0100) Subject: Use CheckInfo to generate checks X-Git-Url: https://git.sesse.net/?p=stockfish;a=commitdiff_plain;h=9b43fd79372946128924ab3d42c64559e95d29d6 Use CheckInfo to generate checks It should help to avoid recalculating check squares of sliding attackers for queen when already done for bishops and rooks. Of course this helps when there are bishop, rook and queen on the board ! Fixed also a subtle bug (use of same variable b in while condition and in condition body) introduced recently by revision d655147e8c that triggers in case we have at least 2 non-pawn discovered check pieces. This is very rare that's why didn't show in the node count verification where we actually have a case of 2 dc pieces in position 14, but one is a pawn. No functional change. Signed-off-by: Marco Costalba --- diff --git a/src/movegen.cpp b/src/movegen.cpp index 1820fee2..865f9a82 100644 --- a/src/movegen.cpp +++ b/src/movegen.cpp @@ -247,8 +247,8 @@ namespace { template - inline MoveStack* generate_direct_checks(const Position& pos, MoveStack* mlist, Color us, - Bitboard dc, Square ksq) { + inline MoveStack* generate_direct_checks(const Position& pos, MoveStack* mlist, + Color us, const CheckInfo& ci) { assert(Pt != KING && Pt != PAWN); Bitboard checkSqs, b; @@ -258,7 +258,7 @@ namespace { if ((from = *pl++) == SQ_NONE) return mlist; - checkSqs = pos.attacks_from(ksq) & pos.empty_squares(); + checkSqs = ci.checkSq[Pt] & pos.empty_squares(); do { @@ -267,7 +267,7 @@ namespace { || (Pt == BISHOP && !(BishopPseudoAttacks[from] & checkSqs))) continue; - if (dc && bit_is_set(dc, from)) + if (ci.dcCandidates && bit_is_set(ci.dcCandidates, from)) continue; b = pos.attacks_from(from) & checkSqs; @@ -280,10 +280,11 @@ namespace { template<> - FORCE_INLINE MoveStack* generate_direct_checks(const Position& p, MoveStack* m, Color us, Bitboard dc, Square ksq) { + FORCE_INLINE MoveStack* generate_direct_checks(const Position& p, MoveStack* m, + Color us, const CheckInfo& ci) { - return us == WHITE ? generate_pawn_moves(p, m, dc, ksq) - : generate_pawn_moves(p, m, dc, ksq); + return us == WHITE ? generate_pawn_moves(p, m, ci.dcCandidates, ci.ksq) + : generate_pawn_moves(p, m, ci.dcCandidates, ci.ksq); } @@ -383,37 +384,31 @@ MoveStack* generate(const Position& pos, MoveStack* mlist) assert(!pos.in_check()); - Bitboard b, dc; - Square from; - PieceType pt; Color us = pos.side_to_move(); - Square ksq = pos.king_square(flip(us)); + CheckInfo ci(pos); + Bitboard dc = ci.dcCandidates; - assert(pos.piece_on(ksq) == make_piece(flip(us), KING)); - - b = dc = pos.discovered_check_candidates(); - - while (b) + while (dc) { - from = pop_1st_bit(&b); - pt = type_of(pos.piece_on(from)); + Square from = pop_1st_bit(&dc); + PieceType pt = type_of(pos.piece_on(from)); if (pt == PAWN) continue; // Will be generated togheter with direct checks - b = pos.attacks_from(Piece(pt), from) & pos.empty_squares(); + Bitboard b = pos.attacks_from(Piece(pt), from) & pos.empty_squares(); if (pt == KING) - b &= ~QueenPseudoAttacks[ksq]; + b &= ~QueenPseudoAttacks[ci.ksq]; SERIALIZE(b); } - mlist = generate_direct_checks(pos, mlist, us, dc, ksq); - mlist = generate_direct_checks(pos, mlist, us, dc, ksq); - mlist = generate_direct_checks(pos, mlist, us, dc, ksq); - mlist = generate_direct_checks(pos, mlist, us, dc, ksq); - mlist = generate_direct_checks(pos, mlist, us, dc, ksq); + mlist = generate_direct_checks(pos, mlist, us, ci); + mlist = generate_direct_checks(pos, mlist, us, ci); + mlist = generate_direct_checks(pos, mlist, us, ci); + mlist = generate_direct_checks(pos, mlist, us, ci); + mlist = generate_direct_checks(pos, mlist, us, ci); if (pos.can_castle(us)) { diff --git a/src/position.cpp b/src/position.cpp index 98f49c75..1c966300 100644 --- a/src/position.cpp +++ b/src/position.cpp @@ -79,7 +79,7 @@ namespace { CheckInfo::CheckInfo(const Position& pos) { Color them = flip(pos.side_to_move()); - Square ksq = pos.king_square(them); + ksq = pos.king_square(them); pinned = pos.pinned_pieces(); dcCandidates = pos.discovered_check_candidates(); diff --git a/src/position.h b/src/position.h index 36d88695..4583212c 100644 --- a/src/position.h +++ b/src/position.h @@ -37,6 +37,7 @@ struct CheckInfo { Bitboard dcCandidates; Bitboard pinned; Bitboard checkSq[8]; + Square ksq; };