X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fmovegen.cpp;h=1524bf1f2453baa1152e9c95874209c91184d04c;hp=b4e089a8bced134eb0178d7581a7f980970ece42;hb=4ef6b2c32a0f4e7b6193349312da5e335d48416b;hpb=73131e7c7845fcd89c0d28d9471159f774cfdc00 diff --git a/src/movegen.cpp b/src/movegen.cpp index b4e089a8..1524bf1f 100644 --- a/src/movegen.cpp +++ b/src/movegen.cpp @@ -61,8 +61,8 @@ namespace { (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; } @@ -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); } @@ -405,17 +407,17 @@ template<> ExtMove* generate(const Position& pos, ExtMove* mlist) { ExtMove *end, *cur = mlist; - Bitboard pinned = pos.pinned_pieces(); + Bitboard pinned = pos.pinned_pieces(pos.side_to_move()); Square ksq = pos.king_square(pos.side_to_move()); end = pos.checkers() ? generate(pos, 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; }