Micro optimize generate_pawn_checks()
authorMarco Costalba <mcostalba@gmail.com>
Fri, 8 May 2009 08:53:45 +0000 (10:53 +0200)
committerMarco Costalba <mcostalba@gmail.com>
Fri, 8 May 2009 08:56:59 +0000 (10:56 +0200)
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 <mcostalba@gmail.com>
src/movegen.cpp

index 14705d3..cbb7168 100644 (file)
@@ -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<Us, DELTA_N>(b1) & empty;
     b3 = b2 & pos.pawn_attacks(Them, ksq);
     while (b3)