From 36bb57a47e137f075fe546887be01fdd0d4670e3 Mon Sep 17 00:00:00 2001 From: Marco Costalba Date: Fri, 15 Jul 2011 22:24:18 +0100 Subject: [PATCH] Simplify and micro-optimize hidden_checkers() No functional change. Signed-off-by: Marco Costalba --- src/movepick.cpp | 4 ++-- src/position.cpp | 30 +++++++++++------------------- 2 files changed, 13 insertions(+), 21 deletions(-) diff --git a/src/movepick.cpp b/src/movepick.cpp index b9594ba1..e9f31456 100644 --- a/src/movepick.cpp +++ b/src/movepick.cpp @@ -51,12 +51,12 @@ namespace { const uint8_t QsearchRecapturesTable[] = { PH_TT_MOVE, PH_QRECAPTURES, PH_STOP }; const uint8_t ProbCutTable[] = { PH_TT_MOVE, PH_GOOD_PROBCUT, PH_STOP }; - // Unary predicate used by std::partition to split positive scores from ramining + // Unary predicate used by std::partition to split positive scores from remaining // ones so to sort separately the two sets, and with the second sort delayed. inline bool has_positive_score(const MoveStack& move) { return move.score > 0; } // Picks and pushes to the front the best move in range [firstMove, lastMove), - // it is faster then sorting all the moves in advance when moves are few, as + // it is faster than sorting all the moves in advance when moves are few, as // normally are the possible captures. inline MoveStack* pick_best(MoveStack* firstMove, MoveStack* lastMove) { diff --git a/src/position.cpp b/src/position.cpp index f25ee276..43de6678 100644 --- a/src/position.cpp +++ b/src/position.cpp @@ -361,36 +361,28 @@ void Position::print(Move move) const { /// Position:hidden_checkers<>() returns a bitboard of all pinned (against the -/// king) pieces for the given color and for the given pinner type. Or, when -/// template parameter FindPinned is false, the pieces of the given color -/// candidate for a discovery check against the enemy king. -/// Bitboard checkersBB must be already updated when looking for pinners. +/// king) pieces for the given color. Or, when template parameter FindPinned is +/// false, the function return the pieces of the given color candidate for a +/// discovery check against the enemy king. template Bitboard Position::hidden_checkers(Color c) const { - Bitboard result = EmptyBoardBB; + // Pinned pieces protect our king, dicovery checks attack the enemy king + Bitboard b, result = EmptyBoardBB; Bitboard pinners = pieces(FindPinned ? opposite_color(c) : c); - - // Pinned pieces protect our king, dicovery checks attack - // the enemy king. Square ksq = king_square(FindPinned ? c : opposite_color(c)); - // Pinners are sliders, not checkers, that give check when candidate pinned is removed - pinners &= (pieces(ROOK, QUEEN) & RookPseudoAttacks[ksq]) | (pieces(BISHOP, QUEEN) & BishopPseudoAttacks[ksq]); - - if (FindPinned && pinners) - pinners &= ~st->checkersBB; + // Pinners are sliders, that give check when candidate pinned is removed + pinners &= (pieces(ROOK, QUEEN) & RookPseudoAttacks[ksq]) + | (pieces(BISHOP, QUEEN) & BishopPseudoAttacks[ksq]); while (pinners) { - Square s = pop_1st_bit(&pinners); - Bitboard b = squares_between(s, ksq) & occupied_squares(); - - assert(b); + b = squares_between(ksq, pop_1st_bit(&pinners)) & occupied_squares(); - if ( !(b & (b - 1)) // Only one bit set? - && (b & pieces(c))) // Is an our piece? + // Only one bit set and is an our piece? + if (b && !(b & (b - 1)) && (b & pieces(c))) result |= b; } return result; -- 2.39.2