if (isCheck)
staticValue = -VALUE_INFINITE;
- else if (tte && tte->type() == VALUE_TYPE_EVAL)
+ else if (tte && (tte->type() == VALUE_TYPE_EVAL || tte->staticValue()))
{
// Use the cached evaluation score if possible
assert(tte->value() == evaluate(pos, ei, threadID));
Value bestValue = staticValue;
if (bestValue >= beta)
- {
- // Update transposition table before to leave
- TT.store(pos, value_to_tt(bestValue, ply), depth, MOVE_NONE, VALUE_TYPE_EXACT);
- return bestValue;
- }
- else if (!isCheck && !tte && ei.futilityMargin == 0)
{
// Store the score to avoid a future costly evaluation() call
- TT.store(pos, value_to_tt(bestValue, ply), Depth(-127*OnePly), MOVE_NONE, VALUE_TYPE_EVAL);
+ if (!isCheck && !tte && ei.futilityMargin == 0)
+ TT.store(pos, value_to_tt(bestValue, ply), Depth(-127*OnePly), MOVE_NONE, VALUE_TYPE_EVAL);
+
+ return bestValue;
}
if (bestValue > alpha)
assert(bestValue > -VALUE_INFINITE && bestValue < VALUE_INFINITE);
+ // Update transposition table
+ if (!pvNode)
+ {
+ Depth d = (depth == Depth(0) ? Depth(0) : Depth(-1));
+ Value v = value_to_tt(bestValue, ply);
+ TTEntry* e;
+ if (bestValue < beta)
+ e = TT.store(pos, v, d, MOVE_NONE, VALUE_TYPE_UPPER);
+ else
+ e = TT.store(pos, v, d, MOVE_NONE, VALUE_TYPE_LOWER);
+
+ assert(e && e == TT.retrieve(pos));
+ assert(!e->staticValue());
+
+ // If the just stored value happens to be equal to the static evaluation
+ // score then set the flag, so to avoid calling evaluation() next time we
+ // hit this position.
+ if (staticValue == v && !ei.futilityMargin)
+ e->setStaticValue();
+ }
+
// Update killers only for good check moves
Move m = ss[ply].currentMove;
if (alpha >= beta && ok_to_history(pos, m)) // Only non capture moves are considered