// Initialize a MovePicker object for the current position
MovePickerExt<SpNode, Root> mp(pos, ttMove, depth, H, ss, (PvNode ? -VALUE_INFINITE : beta));
CheckInfo ci(pos);
+ Bitboard pinned = pos.pinned_pieces(pos.side_to_move());
ss->bestMove = MOVE_NONE;
futilityBase = ss->eval + ss->evalMargin;
singularExtensionNode = !Root
{
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++;
// a margin then we extend ttMove.
if ( singularExtensionNode
&& move == ttMove
+ && pos.pl_move_is_legal(move, pinned)
&& ext < ONE_PLY)
{
Value ttValue = value_from_tt(tte->value(), ss->ply);
}
// Update current move (this must be done after singular extension search)
- ss->currentMove = move;
newDepth = depth - ONE_PLY + ext;
// Step 12. Futility pruning (is omitted in PV nodes)
}
}
+ // Check for legality only before to do the move
+ if (!pos.pl_move_is_legal(move, pinned))
+ {
+ moveCount--;
+ continue;
+ }
+
+ ss->currentMove = move;
+
// Step 13. Make the move
pos.do_move(move, st, ci, givesCheck);
// be generated.
MovePicker mp(pos, ttMove, depth, H);
CheckInfo ci(pos);
+ Bitboard pinned = pos.pinned_pieces(pos.side_to_move());
// Loop through the moves until no moves remain or a beta cutoff occurs
while ( alpha < beta
}
// 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());
continue;
}
+ // Check for legality only before to do the move
+ if (!pos.pl_move_is_legal(move, pinned))
+ continue;
+
// Update current move
ss->currentMove = 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))
{