- switch (PhaseTable[phaseIndex]) {
-
- case PH_GOOD_CAPTURES:
- assert(!pos.is_check());
- assert(movesPicked >= 0);
-
- while (movesPicked < numOfMoves)
- {
- bestIndex = find_best_index();
- move = moves[bestIndex].move;
- moves[bestIndex] = moves[movesPicked++];
- if ( move != ttMove
- && move != mateKiller
- && pos.pl_move_is_legal(move, pinned))
- return move;
- }
- break;
-
- case PH_NONCAPTURES:
- assert(!pos.is_check());
- assert(movesPicked >= 0);
-
- while (movesPicked < numOfMoves)
- {
- // If this is a PV node or we have only picked a few moves, scan
- // the entire move list for the best move. If many moves have already
- // been searched and it is not a PV node, we are probably failing low
- // anyway, so we just pick the first move from the list.
- bestIndex = (pvNode || movesPicked < 12) ? find_best_index() : movesPicked;
- move = moves[bestIndex].move;
- moves[bestIndex] = moves[movesPicked++];
- if ( move != ttMove
- && move != mateKiller
- && pos.pl_move_is_legal(move, pinned))
- return move;
- }
- break;
-
- case PH_EVASIONS:
- assert(pos.is_check());
- assert(movesPicked >= 0);
-
- while (movesPicked < numOfMoves)
- {
- bestIndex = find_best_index();
- move = moves[bestIndex].move;
- moves[bestIndex] = moves[movesPicked++];
- return move;
- }
- break;
-
- case PH_BAD_CAPTURES:
- assert(!pos.is_check());
- assert(movesPicked >= 0);
- // It's probably a good idea to use SEE move ordering here, instead
- // of just picking the first move. FIXME
- while (movesPicked < numOfBadCaptures)
- {
- move = badCaptures[movesPicked++].move;
- if ( move != ttMove
- && move != mateKiller
- && pos.pl_move_is_legal(move, pinned))
+ while (true)
+ {
+ while (curMove == lastMove)
+ generate_next();
+
+ switch (phase) {
+
+ case MAIN_SEARCH: case EVASION: case QSEARCH_0: case QSEARCH_1: case PROBCUT:
+ curMove++;
+ return ttMove;
+
+ case CAPTURES_S1:
+ move = pick_best(curMove++, lastMove)->move;
+ if (move != ttMove)
+ {
+ assert(captureThreshold <= 0); // Otherwise we cannot use see_sign()
+
+ if (pos.see_sign(move) >= captureThreshold)
+ return move;
+
+ // Losing capture, move it to the tail of the array
+ (lastBadCapture--)->move = move;
+ }
+ break;
+
+ case KILLERS_S1:
+ move = (curMove++)->move;
+ if ( move != MOVE_NONE
+ && pos.is_pseudo_legal(move)
+ && move != ttMove
+ && !pos.is_capture(move))