mirror of
https://github.com/sockspls/badfish
synced 2025-04-30 16:53: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:
parent
a042449f5d
commit
36bb57a47e
2 changed files with 13 additions and 21 deletions
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Add table
Reference in a new issue