- // A pawn is backward when it is behind all pawns of the same color on the
- // adjacent files and cannot be safely advanced.
- if (!neighbours || lever || relative_rank(Us, s) >= RANK_5)
- backward = false;
- else
- {
- // Find the backmost rank with neighbours or stoppers
- b = rank_bb(backmost_sq(Us, neighbours | stoppers));
-
- // The pawn is backward when it cannot safely progress to that rank:
- // either there is a stopper in the way on this rank, or there is a
- // stopper on adjacent file which controls the way to that rank.
- backward = (b | shift<Up>(b & adjacent_files_bb(f))) & stoppers;
-
- assert(!(backward && (forward_ranks_bb(Them, s + Up) & neighbours)));
- }
+ // A pawn is backward when it is behind all pawns of the same color
+ // on the adjacent files and cannot be safely advanced.
+ backward = !lever && !(ourPawns & pawn_attack_span(Them, s + Up))
+ && (stoppers & (leverPush | (s + Up)));