- dcPawns1 = dcPawns2 = EmptyBoardBB;
- if (Type == CHECK && (pawns & dcp))
- {
- // 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.
- dcPawns1 = move_pawns<Us, DELTA_N>(pawns & dcp & ~file_bb(ksq)) & emptySquares & ~TRank8BB;
- dcPawns2 = move_pawns<Us, DELTA_N>(dcPawns1 & TRank3BB) & emptySquares;
+ // Single pawn pushes
+ b1 = move_pawns<Us, DELTA_N>(pawns) & emptySquares & ~TRank8BB;
+ b2 = (Type == CHECK ? (b1 & pos.attacks_from<PAWN>(ksq, Them)) | dcPawns1 :
+ (Type == EVASION ? b1 & blockSquares : b1));
+ SERIALIZE_MOVES_D(b2, -TDELTA_N);
+
+ // Double pawn pushes
+ b1 = move_pawns<Us, DELTA_N>(b1 & TRank3BB) & emptySquares;
+ b2 = (Type == CHECK ? (b1 & pos.attacks_from<PAWN>(ksq, Them)) | dcPawns2 :
+ (Type == EVASION ? b1 & blockSquares : b1));
+ SERIALIZE_MOVES_D(b2, -TDELTA_N -TDELTA_N);