X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fmovegen.cpp;h=dab830ba708dcb161b83c86934bbd12f2b239267;hp=e61220800a8db5708e4b0c3909f5865fdbfcc859;hb=d9caede3249698440b7579e31d92aaa9984a128b;hpb=5cf9e0b254262094efb2bdb9f81d213c515b102e diff --git a/src/movegen.cpp b/src/movegen.cpp index e6122080..dab830ba 100644 --- a/src/movegen.cpp +++ b/src/movegen.cpp @@ -365,38 +365,30 @@ ExtMove* generate(const Position& pos, ExtMove* mlist) { assert(pos.checkers()); - int checkersCnt = 0; Color us = pos.side_to_move(); - Square ksq = pos.king_square(us), checksq; + Square ksq = pos.king_square(us); Bitboard sliderAttacks = 0; - Bitboard b = pos.checkers(); - - assert(pos.checkers()); + Bitboard sliders = pos.checkers() & ~pos.pieces(KNIGHT, PAWN); // Find all the squares attacked by slider checkers. We will remove them from // the king evasions in order to skip known illegal moves, which avoids any // useless legality checks later on. - do + while (sliders) { - ++checkersCnt; - checksq = pop_lsb(&b); - - assert(color_of(pos.piece_on(checksq)) == ~us); - - if (type_of(pos.piece_on(checksq)) > KNIGHT) // A slider - sliderAttacks |= LineBB[checksq][ksq] ^ checksq; - - } while (b); + Square checksq = pop_lsb(&sliders); + sliderAttacks |= LineBB[checksq][ksq] ^ checksq; + } // Generate evasions for king, capture and non capture moves - b = pos.attacks_from(ksq) & ~pos.pieces(us) & ~sliderAttacks; + Bitboard b = pos.attacks_from(ksq) & ~pos.pieces(us) & ~sliderAttacks; while (b) (mlist++)->move = make_move(ksq, pop_lsb(&b)); - if (checkersCnt > 1) + if (more_than_one(pos.checkers())) return mlist; // Double check, only a king move can save the day // Generate blocking evasions or captures of the checking piece + Square checksq = lsb(pos.checkers()); Bitboard target = between_bb(checksq, ksq) | checksq; return us == WHITE ? generate_all(pos, mlist, target)