1
0
Fork 0
mirror of https://github.com/sockspls/badfish synced 2025-07-11 19:49:14 +00:00

Simplify generate<EVASIONS>

No speed regression, tested with both perft and
bench.

No functional change.
This commit is contained in:
Marco Costalba 2014-03-09 11:48:41 +01:00
parent 5cf9e0b254
commit 20ff12e1be

View file

@ -365,38 +365,30 @@ ExtMove* generate<EVASIONS>(const Position& pos, ExtMove* mlist) {
assert(pos.checkers()); assert(pos.checkers());
int checkersCnt = 0;
Color us = pos.side_to_move(); Color us = pos.side_to_move();
Square ksq = pos.king_square(us), checksq; Square ksq = pos.king_square(us);
Bitboard sliderAttacks = 0; Bitboard sliderAttacks = 0;
Bitboard b = pos.checkers(); Bitboard sliders = pos.checkers() & ~pos.pieces(KNIGHT) & ~pos.pieces(PAWN);
assert(pos.checkers());
// Find all the squares attacked by slider checkers. We will remove them from // Find all the squares attacked by slider checkers. We will remove them from
// the king evasions in order to skip known illegal moves, which avoids any // the king evasions in order to skip known illegal moves, which avoids any
// useless legality checks later on. // useless legality checks later on.
do while (sliders)
{ {
++checkersCnt; Square checksq = pop_lsb(&sliders);
checksq = pop_lsb(&b); sliderAttacks |= LineBB[checksq][ksq] ^ checksq;
}
assert(color_of(pos.piece_on(checksq)) == ~us);
if (type_of(pos.piece_on(checksq)) > KNIGHT) // A slider
sliderAttacks |= LineBB[checksq][ksq] ^ checksq;
} while (b);
// Generate evasions for king, capture and non capture moves // Generate evasions for king, capture and non capture moves
b = pos.attacks_from<KING>(ksq) & ~pos.pieces(us) & ~sliderAttacks; Bitboard b = pos.attacks_from<KING>(ksq) & ~pos.pieces(us) & ~sliderAttacks;
while (b) while (b)
(mlist++)->move = make_move(ksq, pop_lsb(&b)); (mlist++)->move = make_move(ksq, pop_lsb(&b));
if (checkersCnt > 1) if (more_than_one(pos.checkers()))
return mlist; // Double check, only a king move can save the day return mlist; // Double check, only a king move can save the day
// Generate blocking evasions or captures of the checking piece // Generate blocking evasions or captures of the checking piece
Square checksq = lsb(pos.checkers());
Bitboard target = between_bb(checksq, ksq) | checksq; Bitboard target = between_bb(checksq, ksq) | checksq;
return us == WHITE ? generate_all<WHITE, EVASIONS>(pos, mlist, target) return us == WHITE ? generate_all<WHITE, EVASIONS>(pos, mlist, target)