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

Micro-optimize do_generate_pawn_checks()

Discovery check candidates are normally empty, so
avoid discovery checks generation in that common case.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
This commit is contained in:
Marco Costalba 2009-02-10 12:28:47 +01:00
parent 33ddeec5e0
commit 151d47dc85

View file

@ -783,33 +783,37 @@ namespace {
template<Color Us, Color Them, Bitboard TRank8BB, Bitboard TRank3BB, SquareDelta TDELTA_N> template<Color Us, Color Them, Bitboard TRank8BB, Bitboard TRank3BB, SquareDelta TDELTA_N>
MoveStack* do_generate_pawn_checks(const Position& pos, Bitboard dc, Square ksq, MoveStack* mlist) MoveStack* do_generate_pawn_checks(const Position& pos, Bitboard dc, Square ksq, MoveStack* mlist)
{ {
// Pawn moves which gives discovered check. This is possible only if the // Find all friendly pawns not on the enemy king's file
// pawn is not on the same file as the enemy king, because we don't Bitboard b1, b2, b3;
// generate captures.
Bitboard empty = pos.empty_squares(); Bitboard empty = pos.empty_squares();
// Find all friendly pawns not on the enemy king's file if (dc != EmptyBoardBB)
Bitboard b1 = pos.pawns(Us) & ~file_bb(ksq), b2, b3;
// Discovered checks, single pawn pushes, no promotions
b2 = b3 = (Us == WHITE ? (b1 & dc) << 8 : (b1 & dc) >> 8) & empty & ~TRank8BB;
while (b3)
{ {
Square to = pop_1st_bit(&b3); // Pawn moves which gives discovered check. This is possible only if the
(*mlist++).move = make_move(to - TDELTA_N, to); // pawn is not on the same file as the enemy king, because we don't
} // generate captures.
b1 = pos.pawns(Us) & ~file_bb(ksq);
// Discovered checks, double pawn pushes // Discovered checks, single pawn pushes, no promotions
b3 = (Us == WHITE ? (b2 & TRank3BB) << 8 : (b2 & TRank3BB) >> 8) & empty; b2 = b3 = (Us == WHITE ? (b1 & dc) << 8 : (b1 & dc) >> 8) & empty & ~TRank8BB;
while (b3) while (b3)
{ {
Square to = pop_1st_bit(&b3); Square to = pop_1st_bit(&b3);
(*mlist++).move = make_move(to - TDELTA_N - TDELTA_N, to); (*mlist++).move = make_move(to - TDELTA_N, to);
}
// Discovered checks, double pawn pushes
b3 = (Us == WHITE ? (b2 & TRank3BB) << 8 : (b2 & TRank3BB) >> 8) & empty;
while (b3)
{
Square to = pop_1st_bit(&b3);
(*mlist++).move = make_move(to - TDELTA_N - TDELTA_N, to);
}
} }
// Direct checks. These are possible only for pawns on neighboring files // Direct checks. These are possible only for pawns on neighboring files
// of the enemy king // of the enemy king.
b1 &= (~dc & neighboring_files_bb(ksq)); b1 = pos.pawns(Us) & neighboring_files_bb(ksq) & ~dc;
// Direct checks, single pawn pushes // Direct checks, single pawn pushes
b2 = (Us == WHITE ? b1 << 8 : b1 >> 8) & empty; b2 = (Us == WHITE ? b1 << 8 : b1 >> 8) & empty;
@ -824,7 +828,6 @@ namespace {
b3 = (Us == WHITE ? (b2 & TRank3BB) << 8 : (b2 & TRank3BB) >> 8) b3 = (Us == WHITE ? (b2 & TRank3BB) << 8 : (b2 & TRank3BB) >> 8)
& empty & empty
& pos.pawn_attacks(Them, ksq); & pos.pawn_attacks(Them, ksq);
while (b3) while (b3)
{ {
Square to = pop_1st_bit(&b3); Square to = pop_1st_bit(&b3);