&& abs(beta) < VALUE_MATE_IN_MAX_PLY
&& !pos.pawn_on_7th(pos.side_to_move()))
{
+ if ( depth <= ONE_PLY
+ && eval + razor_margin(3 * ONE_PLY) <= alpha)
+ return qsearch<NonPV, false>(pos, ss, alpha, beta, DEPTH_ZERO);
+
Value ralpha = alpha - razor_margin(depth);
Value v = qsearch<NonPV, false>(pos, ss, ralpha, ralpha+1, DEPTH_ZERO);
if (v <= ralpha)
// must be mate or stalemate. If we are in a singular extension search then
// return a fail low score.
if (!moveCount)
- return excludedMove ? alpha
- : inCheck ? mated_in(ss->ply) : DrawValue[pos.side_to_move()];
+ bestValue = excludedMove ? alpha
+ : inCheck ? mated_in(ss->ply) : DrawValue[pos.side_to_move()];
+
+ // Quiet best move: update killers, history, countermoves and followupmoves
+ else if (bestValue >= beta && !pos.capture_or_promotion(bestMove) && !inCheck)
+ update_stats(pos, ss, bestMove, depth, quietsSearched, quietCount - 1);
TT.store(posKey, value_to_tt(bestValue, ss->ply),
bestValue >= beta ? BOUND_LOWER :
PvNode && bestMove ? BOUND_EXACT : BOUND_UPPER,
depth, bestMove, ss->staticEval);
- // Quiet best move: update killers, history, countermoves and followupmoves
- if (bestValue >= beta && !pos.capture_or_promotion(bestMove) && !inCheck)
- update_stats(pos, ss, bestMove, depth, quietsSearched, quietCount - 1);
-
assert(bestValue > -VALUE_INFINITE && bestValue < VALUE_INFINITE);
return bestValue;