// Our dedicated sort in range [firstMove, lastMove), first splits
// positive scores from ramining then order seaprately the two sets.
template<typename T>
-inline void sort_moves(T* firstMove, T* lastMove)
+inline void sort_moves(T* firstMove, T* lastMove, T** lastPositive)
{
T tmp;
T *p, *d;
} while (p != d);
- // Sort positives and non-positives separately
+ // Sort just positive scored moves, remaining only when we get there
insertion_sort<T>(firstMove, p);
- insertion_sort<T>(p, lastMove);
+ *lastPositive = p;
}
// Picks up the best move in range [curMove, lastMove), one per cycle.
case PH_NONCAPTURES:
lastMove = generate_noncaptures(pos, moves);
score_noncaptures();
- sort_moves(moves, lastMove);
+ sort_moves(moves, lastMove, &lastGoodNonCapture);
return;
case PH_BAD_CAPTURES:
break;
case PH_NONCAPTURES:
+
+ // Sort negative scored moves only when we get there
+ if (curMove == lastGoodNonCapture)
+ insertion_sort(lastGoodNonCapture, lastMove);
+
move = (curMove++)->move;
if ( move != ttMoves[0].move
&& move != ttMoves[1].move
MoveStack ttMoves[2], killers[2];
int phase;
const uint8_t* phasePtr;
- MoveStack *curMove, *lastMove, *lastBadCapture;
+ MoveStack *curMove, *lastMove, *lastGoodNonCapture, *lastBadCapture;
Bitboard pinned;
MoveStack moves[256], badCaptures[64];
};