+ Value singularBeta = ttValue - 2 * depth;
+ Depth singularDepth = (depth - 1) / 2;
+
+ ss->excludedMove = move;
+ value = search<NonPV>(pos, ss, singularBeta - 1, singularBeta, singularDepth, cutNode);
+ ss->excludedMove = MOVE_NONE;
+
+ if (value < singularBeta)
+ {
+ extension = 1;
+ singularQuietLMR = !ttCapture;
+
+ // Avoid search explosion by limiting the number of double extensions to at most 3
+ if ( !PvNode
+ && value < singularBeta - 93
+ && ss->doubleExtensions < 3)
+ {
+ extension = 2;
+ doubleExtension = true;
+ }
+ }
+
+ // Multi-cut pruning
+ // Our ttMove is assumed to fail high, and now we failed high also on a reduced
+ // search without the ttMove. So we assume this expected Cut-node is not singular,
+ // that multiple moves fail high, and we can prune the whole subtree by returning
+ // a soft bound.
+ else if (singularBeta >= beta)
+ return singularBeta;
+
+ // If the eval of ttMove is greater than beta we try also if there is another
+ // move that pushes it over beta, if so also produce a cutoff.
+ else if (ttValue >= beta)
+ {
+ ss->excludedMove = move;
+ value = search<NonPV>(pos, ss, beta - 1, beta, (depth + 3) / 2, cutNode);
+ ss->excludedMove = MOVE_NONE;
+
+ if (value >= beta)
+ return beta;
+ }