diff --git a/src/movepick.cpp b/src/movepick.cpp
index aa6f7c19..a7e5bdac 100644
--- a/src/movepick.cpp
+++ b/src/movepick.cpp
@@ -18,11 +18,6 @@
along with this program. If not, see .
*/
-
-////
-//// Includes
-////
-
#include
#include "history.h"
@@ -31,11 +26,6 @@
#include "search.h"
#include "value.h"
-
-////
-//// Local definitions
-////
-
namespace {
enum MovegenPhase {
@@ -58,11 +48,6 @@ namespace {
}
-////
-//// Functions
-////
-
-
/// Constructor for the MovePicker class. Apart from the position for which
/// it is asked to pick legal moves, MovePicker also wants some information
/// to help it to return the presumably good moves first, to decide which
@@ -77,21 +62,22 @@ MovePicker::MovePicker(const Position& p, Move ttm, Depth d, const History& h,
badCaptureThreshold = 0;
badCaptures = moves + MOVES_MAX;
+ assert(d > DEPTH_ZERO);
+
pinned = p.pinned_pieces(pos.side_to_move());
- if (ss && !p.is_check())
+ if (p.is_check())
+ {
+ ttMoves[1].move = killers[0].move = killers[1].move = MOVE_NONE;
+ phasePtr = EvasionsPhaseTable;
+ }
+ else
{
ttMoves[1].move = (ss->mateKiller == ttm) ? MOVE_NONE : ss->mateKiller;
searchTT |= ttMoves[1].move;
killers[0].move = ss->killers[0];
killers[1].move = ss->killers[1];
- } else
- ttMoves[1].move = killers[0].move = killers[1].move = MOVE_NONE;
- if (p.is_check())
- phasePtr = EvasionsPhaseTable;
- else if (d > DEPTH_ZERO)
- {
// Consider sligtly negative captures as good if at low
// depth and far from beta.
if (ss && ss->eval < beta - PawnValueMidgame && d < 3 * ONE_PLY)
@@ -99,6 +85,23 @@ MovePicker::MovePicker(const Position& p, Move ttm, Depth d, const History& h,
phasePtr = MainSearchPhaseTable;
}
+
+ phasePtr += int(!searchTT) - 1;
+ go_next_phase();
+}
+
+MovePicker::MovePicker(const Position& p, Move ttm, Depth d, const History& h)
+ : pos(p), H(h) {
+ int searchTT = ttm;
+ ttMoves[0].move = ttm;
+ ttMoves[1].move = MOVE_NONE;
+
+ assert(d <= DEPTH_ZERO);
+
+ pinned = p.pinned_pieces(pos.side_to_move());
+
+ if (p.is_check())
+ phasePtr = EvasionsPhaseTable;
else if (d >= DEPTH_QS_CHECKS)
phasePtr = QsearchWithChecksPhaseTable;
else
@@ -354,4 +357,3 @@ Move MovePicker::get_next_move() {
go_next_phase();
}
}
-
diff --git a/src/movepick.h b/src/movepick.h
index c71ff1a9..d97bb629 100644
--- a/src/movepick.h
+++ b/src/movepick.h
@@ -17,23 +17,13 @@
along with this program. If not, see .
*/
-
#if !defined MOVEPICK_H_INCLUDED
#define MOVEPICK_H_INCLUDED
-////
-//// Includes
-////
-
#include "depth.h"
#include "history.h"
#include "position.h"
-
-////
-//// Types
-////
-
struct SearchStack;
/// MovePicker is a class which is used to pick one legal move at a time from
@@ -49,7 +39,8 @@ class MovePicker {
MovePicker& operator=(const MovePicker&); // silence a warning under MSVC
public:
- MovePicker(const Position& p, Move ttm, Depth d, const History& h, SearchStack* ss = NULL, Value beta = -VALUE_INFINITE);
+ MovePicker(const Position& p, Move ttm, Depth d, const History& h, SearchStack* ss, Value beta);
+ MovePicker(const Position& p, Move ttm, Depth d, const History& h);
Move get_next_move();
int number_of_evasions() const;
@@ -70,10 +61,6 @@ private:
};
-////
-//// Inline functions
-////
-
/// MovePicker::number_of_evasions() simply returns the number of moves in
/// evasions phase. It is intended to be used in positions where the side to
/// move is in check, for detecting checkmates or situations where there is