From 84b42b3ab328e3f1b9829d8f5d967e4d45a45a39 Mon Sep 17 00:00:00 2001 From: bmc4 Date: Tue, 27 Apr 2021 19:59:46 -0300 Subject: [PATCH] Simplify pawn moves generator This patch simplifies QUIET_CHECKS pawn move generator by merging discovery check move generator with direct check move generator. It also simplifies emptySquares instantiation. In addition, I added a comment in generate_moves() to clarify Check branches. STC: LLR: 2.95 (-2.94,2.94) <-2.50,0.50> Total: 112648 W: 9952 L: 9945 D: 92751 Ptnml(0-2): 369, 7682, 40195, 7729, 349 https://tests.stockfishchess.org/tests/view/6088226895e7f1852abd2978 LTC: LLR: 2.93 (-2.94,2.94) <-2.50,0.50> Total: 74656 W: 2797 L: 2765 D: 69094 Ptnml(0-2): 38, 2328, 32554, 2380, 28 https://tests.stockfishchess.org/tests/view/60884e5095e7f1852abd2994 closes https://github.com/official-stockfish/Stockfish/pull/3447 No functional change --- src/movegen.cpp | 43 ++++++++++++++----------------------------- 1 file changed, 14 insertions(+), 29 deletions(-) diff --git a/src/movegen.cpp b/src/movegen.cpp index bd9d0b62..be168450 100644 --- a/src/movegen.cpp +++ b/src/movegen.cpp @@ -58,19 +58,16 @@ namespace { constexpr Direction UpLeft = (Us == WHITE ? NORTH_WEST : SOUTH_EAST); const Square ksq = pos.square(Them); - Bitboard emptySquares; + const Bitboard emptySquares = Type == QUIETS || Type == QUIET_CHECKS ? target : ~pos.pieces(); + const Bitboard enemies = Type == EVASIONS ? pos.checkers() + : Type == CAPTURES ? target : pos.pieces(Them); Bitboard pawnsOn7 = pos.pieces(Us, PAWN) & TRank7BB; Bitboard pawnsNotOn7 = pos.pieces(Us, PAWN) & ~TRank7BB; - Bitboard enemies = (Type == EVASIONS ? pos.checkers() - : Type == CAPTURES ? target : pos.pieces(Them)); - // Single and double pawn pushes, no promotions if (Type != CAPTURES) { - emptySquares = (Type == QUIETS || Type == QUIET_CHECKS ? target : ~pos.pieces()); - Bitboard b1 = shift(pawnsNotOn7) & emptySquares; Bitboard b2 = shift(b1 & TRank3BB) & emptySquares; @@ -82,22 +79,12 @@ namespace { if (Type == QUIET_CHECKS) { - b1 &= pawn_attacks_bb(Them, ksq); - b2 &= pawn_attacks_bb(Them, ksq); - - // Add pawn pushes which give 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. Note that a possible discovered check - // promotion has been already generated amongst the captures. - Bitboard dcCandidateQuiets = pos.blockers_for_king(Them) & pawnsNotOn7; - if (dcCandidateQuiets) - { - Bitboard dc1 = shift(dcCandidateQuiets) & emptySquares & ~file_bb(ksq); - Bitboard dc2 = shift(dc1 & TRank3BB) & emptySquares; - - b1 |= dc1; - b2 |= dc2; - } + // To make a quiet check, you either make a direct check by pushing a pawn + // or push a blocker pawn that is not on the same file as the enemy king. + // Discovered check promotion has been already generated amongst the captures. + Bitboard dcCandidatePawns = pos.blockers_for_king(Them) & ~file_bb(ksq); + b1 &= pawn_attacks_bb(Them, ksq) | shift< Up>(dcCandidatePawns); + b2 &= pawn_attacks_bb(Them, ksq) | shift(dcCandidatePawns); } while (b1) @@ -116,16 +103,13 @@ namespace { // Promotions and underpromotions if (pawnsOn7) { - if (Type == CAPTURES) - emptySquares = ~pos.pieces(); - - if (Type == EVASIONS) - emptySquares &= target; - Bitboard b1 = shift(pawnsOn7) & enemies; Bitboard b2 = shift(pawnsOn7) & enemies; Bitboard b3 = shift(pawnsOn7) & emptySquares; + if (Type == EVASIONS) + b3 &= target; + while (b1) moveList = make_promotions(moveList, pop_lsb(b1), ksq); @@ -185,8 +169,9 @@ namespace { while (bb) { Square from = pop_lsb(bb); - Bitboard b = attacks_bb(from, pos.pieces()) & target; + + // To check, you either move freely a blocker or make a direct check. if (Checks && (Pt == QUEEN || !(pos.blockers_for_king(~Us) & from))) b &= pos.check_squares(Pt); -- 2.39.2