From 5f7d37273caf4256d10c0b92e68c397c398fedd1 Mon Sep 17 00:00:00 2001 From: Marco Costalba Date: Fri, 8 May 2009 10:53:45 +0200 Subject: [PATCH 1/1] Micro optimize generate_pawn_checks() Use a better condition to find candidate direct check pawns. In particular consider only pawns in the front ranks of the enemy king, this greatly reduces pawns candidates bitboard that now is empty more then 90% of the time so that we can early skip further tests. No functional change. Signed-off-by: Marco Costalba --- src/movegen.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/movegen.cpp b/src/movegen.cpp index 14705d30..cbb71688 100644 --- a/src/movegen.cpp +++ b/src/movegen.cpp @@ -756,13 +756,15 @@ namespace { const Bitboard TRank8BB = (Us == WHITE ? Rank8BB : Rank1BB); const Bitboard TRank3BB = (Us == WHITE ? Rank3BB : Rank6BB); const SquareDelta TDELTA_N = (Us == WHITE ? DELTA_N : DELTA_S); + const SquareDelta TDELTA_S = (Us == WHITE ? DELTA_S : DELTA_N); Bitboard b1, b2, b3; - Bitboard empty = pos.empty_squares(); Bitboard pawns = pos.pawns(Us); if (dc & pawns) { + Bitboard empty = pos.empty_squares(); + // 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. @@ -786,10 +788,15 @@ namespace { } // Direct checks. These are possible only for pawns on neighboring files - // of the enemy king. + // and in the two ranks that, after the push, are in front of the enemy king. b1 = pawns & neighboring_files_bb(ksq) & ~dc; + b2 = rank_bb(ksq + 2 * TDELTA_S) | rank_bb(ksq + 3 * TDELTA_S); + b1 &= b2; + if (!b1) + return mlist; // Direct checks, single pawn pushes + Bitboard empty = pos.empty_squares(); b2 = move_pawns(b1) & empty; b3 = b2 & pos.pawn_attacks(Them, ksq); while (b3) -- 2.39.2