X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fmovegen.cpp;h=96dd89c502f1e441e5e5edfa0b55fe1a8f7cbb8b;hp=76e171f8ab7d2b9e92d89e8046a17db8c0a4e2ae;hb=7f142d68179919a507204e7980fff4f79648dbbc;hpb=c45c6d308fea4e21004675ff62d9386834372675 diff --git a/src/movegen.cpp b/src/movegen.cpp index 76e171f8..96dd89c5 100644 --- a/src/movegen.cpp +++ b/src/movegen.cpp @@ -24,11 +24,11 @@ /// Simple macro to wrap a very common while loop, no facny, no flexibility, /// hardcoded names 'mlist' and 'from'. -#define SERIALIZE(b) while (b) (*mlist++).move = make_move(from, pop_lsb(&b)) +#define SERIALIZE(b) while (b) (mlist++)->move = make_move(from, pop_lsb(&b)) /// Version used for pawns, where the 'from' square is given as a delta from the 'to' square #define SERIALIZE_PAWNS(b, d) while (b) { Square to = pop_lsb(&b); \ - (*mlist++).move = make_move(to - (d), to); } + (mlist++)->move = make_move(to - (d), to); } namespace { template @@ -59,10 +59,10 @@ namespace { if (Chess960 && (pos.attackers_to(kto, pos.pieces() ^ rfrom) & enemies)) return mlist; - (*mlist++).move = make(kfrom, rfrom); + (mlist++)->move = make(kfrom, rfrom); - if (Checks && !pos.move_gives_check((mlist - 1)->move, CheckInfo(pos))) - mlist--; + if (Checks && !pos.gives_check((mlist - 1)->move, CheckInfo(pos))) + --mlist; return mlist; } @@ -79,19 +79,19 @@ namespace { Square to = pop_lsb(&b); if (Type == CAPTURES || Type == EVASIONS || Type == NON_EVASIONS) - (*mlist++).move = make(to - Delta, to, QUEEN); + (mlist++)->move = make(to - Delta, to, QUEEN); if (Type == QUIETS || Type == EVASIONS || Type == NON_EVASIONS) { - (*mlist++).move = make(to - Delta, to, ROOK); - (*mlist++).move = make(to - Delta, to, BISHOP); - (*mlist++).move = make(to - Delta, to, KNIGHT); + (mlist++)->move = make(to - Delta, to, ROOK); + (mlist++)->move = make(to - Delta, to, BISHOP); + (mlist++)->move = make(to - Delta, to, KNIGHT); } // Knight-promotion is the only one that can give a direct check not // already included in the queen-promotion. if (Type == QUIET_CHECKS && (StepAttacksBB[W_KNIGHT][to] & ci->ksq)) - (*mlist++).move = make(to - Delta, to, KNIGHT); + (mlist++)->move = make(to - Delta, to, KNIGHT); else (void)ci; // Silence a warning under MSVC } @@ -197,7 +197,7 @@ namespace { assert(b1); while (b1) - (*mlist++).move = make(pop_lsb(&b1), pos.ep_square()); + (mlist++)->move = make(pop_lsb(&b1), pos.ep_square()); } } @@ -221,7 +221,7 @@ namespace { && !(PseudoAttacks[Pt][from] & target & ci->checkSq[Pt])) continue; - if (ci->dcCandidates && (ci->dcCandidates & from)) + if (unlikely(ci->dcCandidates) && (ci->dcCandidates & from)) continue; } @@ -237,38 +237,36 @@ namespace { } - template FORCE_INLINE - ExtMove* generate_all(const Position& pos, ExtMove* mlist, Color us, - Bitboard target, const CheckInfo* ci = NULL) { + template FORCE_INLINE + ExtMove* generate_all(const Position& pos, ExtMove* mlist, Bitboard target, + const CheckInfo* ci = NULL) { const bool Checks = Type == QUIET_CHECKS; - mlist = (us == WHITE ? generate_pawn_moves(pos, mlist, target, ci) - : generate_pawn_moves(pos, mlist, target, ci)); - - mlist = generate_moves(pos, mlist, us, target, ci); - mlist = generate_moves(pos, mlist, us, target, ci); - mlist = generate_moves(pos, mlist, us, target, ci); - mlist = generate_moves(pos, mlist, us, target, ci); + mlist = generate_pawn_moves(pos, mlist, target, ci); + mlist = generate_moves(pos, mlist, Us, target, ci); + mlist = generate_moves(pos, mlist, Us, target, ci); + mlist = generate_moves< ROOK, Checks>(pos, mlist, Us, target, ci); + mlist = generate_moves< QUEEN, Checks>(pos, mlist, Us, target, ci); if (Type != QUIET_CHECKS && Type != EVASIONS) { - Square from = pos.king_square(us); + Square from = pos.king_square(Us); Bitboard b = pos.attacks_from(from) & target; SERIALIZE(b); } - if (Type != CAPTURES && Type != EVASIONS && pos.can_castle(us)) + if (Type != CAPTURES && Type != EVASIONS && pos.can_castle(Us)) { if (pos.is_chess960()) { - mlist = generate_castle(pos, mlist, us); - mlist = generate_castle(pos, mlist, us); + mlist = generate_castle< KING_SIDE, Checks, true>(pos, mlist, Us); + mlist = generate_castle(pos, mlist, Us); } else { - mlist = generate_castle(pos, mlist, us); - mlist = generate_castle(pos, mlist, us); + mlist = generate_castle< KING_SIDE, Checks, false>(pos, mlist, Us); + mlist = generate_castle(pos, mlist, Us); } } @@ -300,7 +298,8 @@ ExtMove* generate(const Position& pos, ExtMove* mlist) { : Type == QUIETS ? ~pos.pieces() : Type == NON_EVASIONS ? ~pos.pieces(us) : 0; - return generate_all(pos, mlist, us, target); + return us == WHITE ? generate_all(pos, mlist, target) + : generate_all(pos, mlist, target); } // Explicit template instantiations @@ -316,6 +315,7 @@ ExtMove* generate(const Position& pos, ExtMove* mlist) { assert(!pos.checkers()); + Color us = pos.side_to_move(); CheckInfo ci(pos); Bitboard dc = ci.dcCandidates; @@ -335,7 +335,8 @@ ExtMove* generate(const Position& pos, ExtMove* mlist) { SERIALIZE(b); } - return generate_all(pos, mlist, pos.side_to_move(), ~pos.pieces(), &ci); + return us == WHITE ? generate_all(pos, mlist, ~pos.pieces(), &ci) + : generate_all(pos, mlist, ~pos.pieces(), &ci); } @@ -358,7 +359,7 @@ ExtMove* generate(const Position& pos, ExtMove* mlist) { // evasions so to skip known illegal moves avoiding useless legality check later. do { - checkersCnt++; + ++checkersCnt; checksq = pop_lsb(&b); assert(color_of(pos.piece_on(checksq)) == ~us); @@ -395,7 +396,8 @@ ExtMove* generate(const Position& pos, ExtMove* mlist) { // Generate blocking evasions or captures of the checking piece Bitboard target = between_bb(checksq, ksq) | checksq; - return generate_all(pos, mlist, us, target); + return us == WHITE ? generate_all(pos, mlist, target) + : generate_all(pos, mlist, target); } @@ -412,10 +414,10 @@ ExtMove* generate(const Position& pos, ExtMove* mlist) { : generate(pos, mlist); while (cur != end) if ( (pinned || from_sq(cur->move) == ksq || type_of(cur->move) == ENPASSANT) - && !pos.pl_move_is_legal(cur->move, pinned)) + && !pos.legal(cur->move, pinned)) cur->move = (--end)->move; else - cur++; + ++cur; return end; }