// Don't search captures and checks with negative SEE values
if ( !isCheck
+ && move != ttMove
&& !move_is_promotion(move)
&& pos.see_sign(move) < 0)
continue;
// All legal moves have been searched. A special case: If we're in check
// and no legal moves were found, it is checkmate.
- if (pos.is_check() && moveCount == 0) // Mate!
+ if (!moveCount && pos.is_check()) // Mate!
return value_mated_in(ply);
assert(bestValue > -VALUE_INFINITE && bestValue < VALUE_INFINITE);
break;
// New best move?
- lock_grab(&(sp->lock));
- if (value > sp->bestValue && !thread_should_stop(threadID))
+ if (value > sp->bestValue) // Less then 2% of cases
{
- sp->bestValue = value;
- if (sp->bestValue >= sp->beta)
+ lock_grab(&(sp->lock));
+ if (value > sp->bestValue && !thread_should_stop(threadID))
{
- sp_update_pv(sp->parentSstack, ss, sp->ply);
- for (int i = 0; i < ActiveThreads; i++)
- if (i != threadID && (i == sp->master || sp->slaves[i]))
- Threads[i].stop = true;
+ sp->bestValue = value;
+ if (sp->bestValue >= sp->beta)
+ {
+ sp_update_pv(sp->parentSstack, ss, sp->ply);
+ for (int i = 0; i < ActiveThreads; i++)
+ if (i != threadID && (i == sp->master || sp->slaves[i]))
+ Threads[i].stop = true;
- sp->finished = true;
- }
+ sp->finished = true;
+ }
+ }
+ lock_release(&(sp->lock));
}
- lock_release(&(sp->lock));
}
lock_grab(&(sp->lock));