Signed-off-by: Marco Costalba <mcostalba@gmail.com>
if (PvNode && thread.maxPly < ss->ply)
thread.maxPly = ss->ply;
if (PvNode && thread.maxPly < ss->ply)
thread.maxPly = ss->ply;
- // Step 1. Initialize node and poll. Polling can abort search
+ // Step 1. Initialize node.
if (!SpNode)
{
ss->currentMove = ss->bestMove = threatMove = (ss+1)->excludedMove = MOVE_NONE;
if (!SpNode)
{
ss->currentMove = ss->bestMove = threatMove = (ss+1)->excludedMove = MOVE_NONE;
goto split_point_start;
}
goto split_point_start;
}
- if (pos.thread() == 0 && ++NodesSincePoll > NodesBetweenPolls)
- {
- NodesSincePoll = 0;
- poll(pos);
- }
-
- // Step 2. Check for aborted search and immediate draw
- if (( StopRequest
- || pos.is_draw<false>()
- || ss->ply > PLY_MAX) && !RootNode)
- return VALUE_DRAW;
-
// Step 3. Mate distance pruning
if (!RootNode)
{
// Step 3. Mate distance pruning
if (!RootNode)
{
if (pos.pl_move_is_legal(move, ci.pinned))
{
pos.do_move(move, st, ci, pos.move_gives_check(move, ci));
if (pos.pl_move_is_legal(move, ci.pinned))
{
pos.do_move(move, st, ci, pos.move_gives_check(move, ci));
- value = -search<NonPV>(pos, ss+1, -rbeta, -rbeta+1, rdepth);
+
+ if (pos.is_draw<false>() || ss->ply + 1 > PLY_MAX)
+ value = VALUE_DRAW;
+ else
+ value = -search<NonPV>(pos, ss+1, -rbeta, -rbeta+1, rdepth);
+
pos.undo_move(move);
if (value >= rbeta)
return value;
pos.undo_move(move);
if (value >= rbeta)
return value;
// Step 14. Make the move
pos.do_move(move, st, ci, givesCheck);
// Step 14. Make the move
pos.do_move(move, st, ci, givesCheck);
+ // Step XX. Poll. Check if search should be aborted.
+ if (pos.thread() == 0 && ++NodesSincePoll > NodesBetweenPolls)
+ {
+ NodesSincePoll = 0;
+ poll(pos);
+ }
+
+ // Step XX. Check for aborted search and immediate draw
+ if ( StopRequest
+ || pos.is_draw<false>()
+ || ss->ply + 1 > PLY_MAX)
+ {
+ value = VALUE_DRAW;
+ goto undo;
+ }
+
// Step extra. pv search (only in PV nodes)
// The first move in list is the expected PV
if (isPvMove)
// Step extra. pv search (only in PV nodes)
// The first move in list is the expected PV
if (isPvMove)
pos.undo_move(move);
assert(value > -VALUE_INFINITE && value < VALUE_INFINITE);
pos.undo_move(move);
assert(value > -VALUE_INFINITE && value < VALUE_INFINITE);