X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fmovegen.cpp;h=ced938e8c2b9e835ef3b44e16088a7d2f4a31a2c;hp=c275109d4bc0e967f9ca55b4b0b9d8d629931640;hb=6e840f8033aab2b73c8b99b00cb91a20ed578e2b;hpb=6b5322ce000d6a8a6f845beda2d7e149e1baea0c diff --git a/src/movegen.cpp b/src/movegen.cpp index c275109d..ced938e8 100644 --- a/src/movegen.cpp +++ b/src/movegen.cpp @@ -215,61 +215,40 @@ namespace { } - template - inline MoveStack* generate_direct_checks(const Position& pos, MoveStack* mlist, - Color us, const CheckInfo& ci) { + template FORCE_INLINE + MoveStack* generate_moves(const Position& pos, MoveStack* mlist, Color us, + Bitboard target, const CheckInfo* ci = NULL) { + assert(Pt != KING && Pt != PAWN); - Bitboard b, target; - Square from; const Square* pl = pos.piece_list(us, Pt); - if (*pl != SQ_NONE) + for (Square from = *pl; from != SQ_NONE; from = *++pl) { - target = ci.checkSq[Pt] & ~pos.pieces(); // Non capture checks only - - do { - from = *pl; - + if (OnlyChecks) + { if ( (Pt == BISHOP || Pt == ROOK || Pt == QUEEN) - && !(PseudoAttacks[Pt][from] & target)) + && !(PseudoAttacks[Pt][from] & target & ci->checkSq[Pt])) continue; - if (ci.dcCandidates && (ci.dcCandidates & from)) + if (ci->dcCandidates && (ci->dcCandidates & from)) continue; + } - b = pos.attacks_from(from) & target; - SERIALIZE(b); - } while (*++pl != SQ_NONE); - } - - return mlist; - } - + Bitboard b = pos.attacks_from(from) & target; - template - FORCE_INLINE MoveStack* generate_moves(const Position& pos, MoveStack* mlist, - Color us, Bitboard target) { - assert(Pt != KING && Pt != PAWN); + if (OnlyChecks) + b &= ci->checkSq[Pt]; - Bitboard b; - Square from; - const Square* pl = pos.piece_list(us, Pt); - - if (*pl != SQ_NONE) - do { - from = *pl; - b = pos.attacks_from(from) & target; - SERIALIZE(b); - } while (*++pl != SQ_NONE); + SERIALIZE(b); + } return mlist; } - - template<> - FORCE_INLINE MoveStack* generate_moves(const Position& pos, MoveStack* mlist, - Color us, Bitboard target) { + template<> FORCE_INLINE + MoveStack* generate_moves(const Position& pos, MoveStack* mlist, Color us, + Bitboard target, const CheckInfo*) { Square from = pos.king_square(us); Bitboard b = pos.attacks_from(from) & target; SERIALIZE(b); @@ -309,15 +288,15 @@ MoveStack* generate(const Position& pos, MoveStack* mlist) { mlist = (us == WHITE ? generate_pawn_moves(pos, mlist, target) : generate_pawn_moves(pos, mlist, target)); - mlist = generate_moves(pos, mlist, us, target); - mlist = generate_moves(pos, mlist, us, target); - mlist = generate_moves(pos, mlist, us, target); - mlist = generate_moves(pos, mlist, us, target); - mlist = generate_moves(pos, mlist, us, target); + mlist = generate_moves(pos, mlist, us, target); + mlist = generate_moves(pos, mlist, us, target); + mlist = generate_moves(pos, mlist, us, target); + mlist = generate_moves(pos, mlist, us, target); + mlist = generate_moves(pos, mlist, us, target); if (Type != CAPTURES && pos.can_castle(us)) { - mlist = generate_castle(pos, mlist, us); + mlist = generate_castle(pos, mlist, us); mlist = generate_castle(pos, mlist, us); } @@ -339,6 +318,7 @@ MoveStack* generate(const Position& pos, MoveStack* mlist) { Color us = pos.side_to_move(); CheckInfo ci(pos); + Bitboard empty = ~pos.pieces(); Bitboard dc = ci.dcCandidates; while (dc) @@ -360,14 +340,14 @@ MoveStack* generate(const Position& pos, MoveStack* mlist) { mlist = (us == WHITE ? generate_pawn_moves(pos, mlist, ci.dcCandidates, ci.ksq) : generate_pawn_moves(pos, mlist, ci.dcCandidates, ci.ksq)); - mlist = generate_direct_checks(pos, mlist, us, ci); - mlist = generate_direct_checks(pos, mlist, us, ci); - mlist = generate_direct_checks(pos, mlist, us, ci); - mlist = generate_direct_checks(pos, mlist, us, ci); + mlist = generate_moves(pos, mlist, us, empty, &ci); + mlist = generate_moves(pos, mlist, us, empty, &ci); + mlist = generate_moves(pos, mlist, us, empty, &ci); + mlist = generate_moves(pos, mlist, us, empty, &ci); if (pos.can_castle(us)) { - mlist = generate_castle(pos, mlist, us); + mlist = generate_castle(pos, mlist, us); mlist = generate_castle(pos, mlist, us); } @@ -439,10 +419,10 @@ MoveStack* generate(const Position& pos, MoveStack* mlist) { mlist = (us == WHITE ? generate_pawn_moves(pos, mlist, target) : generate_pawn_moves(pos, mlist, target)); - mlist = generate_moves(pos, mlist, us, target); - mlist = generate_moves(pos, mlist, us, target); - mlist = generate_moves(pos, mlist, us, target); - return generate_moves(pos, mlist, us, target); + mlist = generate_moves(pos, mlist, us, target); + mlist = generate_moves(pos, mlist, us, target); + mlist = generate_moves(pos, mlist, us, target); + return generate_moves(pos, mlist, us, target); }