mirror of
https://github.com/HChaZZY/Stockfish.git
synced 2025-12-21 17:46:26 +08: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:
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user