From: Marco Costalba Date: Fri, 8 May 2009 08:53:45 +0000 (+0200) Subject: Micro optimize generate_pawn_checks() X-Git-Url: https://git.sesse.net/?p=stockfish;a=commitdiff_plain;h=5f7d37273caf4256d10c0b92e68c397c398fedd1;hp=be4ee0729ddc7eddcbb7912143a75769ea20fcd1 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 --- 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)