From 457ac26de5e2925c87bdc0169478d138074c50f8 Mon Sep 17 00:00:00 2001 From: Reuven Peleg Date: Tue, 3 Sep 2013 19:05:53 +0300 Subject: [PATCH] Rewrite backward pawn detection Use the new backmost_sq() instead of a loop. No functional change. --- src/pawns.cpp | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/src/pawns.cpp b/src/pawns.cpp index c5fda172..d65b0418 100644 --- a/src/pawns.cpp +++ b/src/pawns.cpp @@ -140,16 +140,12 @@ namespace { // We now know that there are no friendly pawns beside or behind this // pawn on adjacent files. We now check whether the pawn is // backward by looking in the forward direction on the adjacent - // files, and seeing whether we meet a friendly or an enemy pawn first. - b = pos.attacks_from(s, Us); + // files, and picking the closest pawn there. + b = pawn_attack_span(Us, s) & (ourPawns | theirPawns); + b = pawn_attack_span(Us, s) & rank_bb(backmost_sq(Us, b)); - // Note that we are sure to find something because pawn is not passed - // nor isolated, so loop is potentially infinite, but it isn't. - while (!(b & (ourPawns | theirPawns))) - b = shift_bb(b); - - // The friendly pawn needs to be at least two ranks closer than the - // enemy pawn in order to help the potentially backward pawn advance. + // If we have an enemy pawn in the same or next rank, the pawn is + // backward because it cannot advance without being captured. backward = (b | shift_bb(b)) & theirPawns; } -- 2.39.2