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>
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
// pawn is not on the same file as the enemy king, because we don't
// generate captures.
// Find all friendly pawns not on the enemy king's file
Bitboard b1, b2, b3;
Bitboard empty = pos.empty_squares();
// Find all friendly pawns not on the enemy king's file
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)
if (dc != EmptyBoardBB)
{
Square to = pop_1st_bit(&b3);
(*mlist++).move = make_move(to - TDELTA_N, to);
}
// Pawn moves which gives discovered check. This is possible only if the
// 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
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);
// 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);
(*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
// of the enemy king
b1 &= (~dc & neighboring_files_bb(ksq));
// of the enemy king.
b1 = pos.pawns(Us) & neighboring_files_bb(ksq) & ~dc;
// Direct checks, single pawn pushes
b2 = (Us == WHITE ? b1 << 8 : b1 >> 8) & empty;
@ -824,7 +828,6 @@ namespace {
b3 = (Us == WHITE ? (b2 & TRank3BB) << 8 : (b2 & TRank3BB) >> 8)
& empty
& pos.pawn_attacks(Them, ksq);
while (b3)
{
Square to = pop_1st_bit(&b3);