{
assert(move_is_ok(move));
+ if (move == excludedMove)
+ continue;
+
+ // At PV and SpNode nodes we want the moves to be legal
+ if ((PvNode || SpNode) && !pos.pl_move_is_legal(move, pinned))
+ continue;
+
if (SpNode)
{
moveCount = ++sp->moveCount;
lock_release(&(sp->lock));
}
- else if (move == excludedMove)
- continue;
else
moveCount++;
// Check for legality only before to do the move
if (!pos.pl_move_is_legal(move, pinned))
+ {
+ moveCount--;
continue;
+ }
ss->currentMove = move;
}
// Detect non-capture evasions that are candidate to be pruned
- evasionPrunable = inCheck
+ evasionPrunable = !PvNode
+ && inCheck
&& bestValue > VALUE_MATED_IN_PLY_MAX
&& !pos.move_is_capture(move)
&& !pos.can_castle(pos.side_to_move());
pos.do_move(pv[0], *st++);
- Bitboard pinned = pos.pinned_pieces(pos.side_to_move());
-
while ( (tte = TT.probe(pos.get_key())) != NULL
&& tte->move() != MOVE_NONE
&& pos.move_is_pl(tte->move())
- && pos.pl_move_is_legal(tte->move(), pinned)
+ && pos.pl_move_is_legal(tte->move(), pos.pinned_pieces(pos.side_to_move()))
&& ply < PLY_MAX
&& (!pos.is_draw() || ply < 2))
{