X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fmovegen.cpp;h=cda43b3a5824af177645a75a2066d0c5bcf7d10b;hb=fe53a18f7a149f7e6d1a9dde8a7478692ef82997;hp=471541644a0cf1e82b37f4bc19ddfe1a3b87698f;hpb=a2038c1a011552c3d56d3b318780f7f5eadaf05d;p=stockfish
diff --git a/src/movegen.cpp b/src/movegen.cpp
index 47154164..cda43b3a 100644
--- a/src/movegen.cpp
+++ b/src/movegen.cpp
@@ -16,22 +16,33 @@
along with this program. If not, see .
*/
+#include "movegen.h"
+
#include
+#include
-#include "movegen.h"
+#include "bitboard.h"
#include "position.h"
namespace Stockfish {
namespace {
- template
+ template
ExtMove* make_promotions(ExtMove* moveList, [[maybe_unused]] Square to) {
if constexpr (Type == CAPTURES || Type == EVASIONS || Type == NON_EVASIONS)
+ {
*moveList++ = make(to - D, to, QUEEN);
+ if constexpr (Enemy && Type == CAPTURES)
+ {
+ *moveList++ = make(to - D, to, ROOK);
+ *moveList++ = make(to - D, to, BISHOP);
+ *moveList++ = make(to - D, to, KNIGHT);
+ }
+ }
- if constexpr (Type == QUIETS || Type == EVASIONS || Type == NON_EVASIONS)
+ if constexpr ((Type == QUIETS && !Enemy) || Type == EVASIONS || Type == NON_EVASIONS)
{
*moveList++ = make(to - D, to, ROOK);
*moveList++ = make(to - D, to, BISHOP);
@@ -106,13 +117,13 @@ namespace {
b3 &= target;
while (b1)
- moveList = make_promotions(moveList, pop_lsb(b1));
+ moveList = make_promotions(moveList, pop_lsb(b1));
while (b2)
- moveList = make_promotions(moveList, pop_lsb(b2));
+ moveList = make_promotions(moveList, pop_lsb(b2));
while (b3)
- moveList = make_promotions(moveList, pop_lsb(b3));
+ moveList = make_promotions(moveList, pop_lsb(b3));
}
// Standard and en passant captures
@@ -225,9 +236,10 @@ namespace {
/// Generates all pseudo-legal captures plus queen promotions
/// Generates all pseudo-legal non-captures and underpromotions
-/// Generates all pseudo-legal check evasions when the side to move is in check
-/// Generates all pseudo-legal non-captures giving check, except castling and promotions
+/// Generates all pseudo-legal check evasions
/// Generates all pseudo-legal captures and non-captures
+/// Generates all pseudo-legal non-captures giving check,
+/// except castling and promotions
///
/// Returns a pointer to the end of the move list.
@@ -235,7 +247,7 @@ template
ExtMove* generate(const Position& pos, ExtMove* moveList) {
static_assert(Type != LEGAL, "Unsupported type in generate()");
- assert((Type == EVASIONS) == (bool)pos.checkers());
+ assert((Type == EVASIONS) == bool(pos.checkers()));
Color us = pos.side_to_move();
@@ -264,7 +276,7 @@ ExtMove* generate(const Position& pos, ExtMove* moveList) {
moveList = pos.checkers() ? generate(pos, moveList)
: generate(pos, moveList);
while (cur != moveList)
- if ( ((pinned && pinned & from_sq(*cur)) || from_sq(*cur) == ksq || type_of(*cur) == EN_PASSANT)
+ if ( ((pinned & from_sq(*cur)) || from_sq(*cur) == ksq || type_of(*cur) == EN_PASSANT)
&& !pos.legal(*cur))
*cur = (--moveList)->move;
else