1
0
Fork 0
mirror of https://github.com/sockspls/badfish synced 2025-04-30 08:43:09 +00:00

Simplify and micro-optimize hidden_checkers()

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
This commit is contained in:
Marco Costalba 2011-07-15 22:24:18 +01:00
parent a042449f5d
commit 36bb57a47e
2 changed files with 13 additions and 21 deletions

View file

@ -51,12 +51,12 @@ namespace {
const uint8_t QsearchRecapturesTable[] = { PH_TT_MOVE, PH_QRECAPTURES, PH_STOP }; const uint8_t QsearchRecapturesTable[] = { PH_TT_MOVE, PH_QRECAPTURES, PH_STOP };
const uint8_t ProbCutTable[] = { PH_TT_MOVE, PH_GOOD_PROBCUT, 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. // 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; } 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), // 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. // normally are the possible captures.
inline MoveStack* pick_best(MoveStack* firstMove, MoveStack* lastMove) inline MoveStack* pick_best(MoveStack* firstMove, MoveStack* lastMove)
{ {

View file

@ -361,36 +361,28 @@ void Position::print(Move move) const {
/// Position:hidden_checkers<>() returns a bitboard of all pinned (against the /// 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 /// king) pieces for the given color. Or, when template parameter FindPinned is
/// template parameter FindPinned is false, the pieces of the given color /// false, the function return the pieces of the given color candidate for a
/// candidate for a discovery check against the enemy king. /// discovery check against the enemy king.
/// Bitboard checkersBB must be already updated when looking for pinners.
template<bool FindPinned> template<bool FindPinned>
Bitboard Position::hidden_checkers(Color c) const { 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); 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)); Square ksq = king_square(FindPinned ? c : opposite_color(c));
// Pinners are sliders, not checkers, that give check when candidate pinned is removed // Pinners are sliders, that give check when candidate pinned is removed
pinners &= (pieces(ROOK, QUEEN) & RookPseudoAttacks[ksq]) | (pieces(BISHOP, QUEEN) & BishopPseudoAttacks[ksq]); pinners &= (pieces(ROOK, QUEEN) & RookPseudoAttacks[ksq])
| (pieces(BISHOP, QUEEN) & BishopPseudoAttacks[ksq]);
if (FindPinned && pinners)
pinners &= ~st->checkersBB;
while (pinners) while (pinners)
{ {
Square s = pop_1st_bit(&pinners); b = squares_between(ksq, pop_1st_bit(&pinners)) & occupied_squares();
Bitboard b = squares_between(s, ksq) & occupied_squares();
assert(b); // Only one bit set and is an our piece?
if (b && !(b & (b - 1)) && (b & pieces(c)))
if ( !(b & (b - 1)) // Only one bit set?
&& (b & pieces(c))) // Is an our piece?
result |= b; result |= b;
} }
return result; return result;