A position can never repeat the one on the previous move.
Thus we can start searching for a repetition from the 4th
ply behind. In the case:
std::min(st->rule50, st->pliesFromNull) < 4
We don't need to do any more calculations. This case happens
very often - in more than a half of all calls of the function.
No functional change.
if (st->rule50 > 99 && (!checkers() || MoveList<LEGAL>(*this).size()))
return true;
if (st->rule50 > 99 && (!checkers() || MoveList<LEGAL>(*this).size()))
return true;
- StateInfo* stp = st;
- for (int i = 2, e = std::min(st->rule50, st->pliesFromNull); i <= e; i += 2)
- {
+ int e = std::min(st->rule50, st->pliesFromNull);
+
+ if (e < 4)
+ return false;
+
+ StateInfo* stp = st->previous->previous;
+
+ do {
stp = stp->previous->previous;
if (stp->key == st->key)
return true; // Draw at first repetition
stp = stp->previous->previous;
if (stp->key == st->key)
return true; // Draw at first repetition
+
+ } while ((e -= 2) >= 4);