]> git.sesse.net Git - stockfish/blobdiff - src/movepick.cpp
Use a per-thread array for generated moves
[stockfish] / src / movepick.cpp
index 4f2fa01eb231ba64e10feaba33d1af33977a35be..a54398c0844726394fe4cc4cc32e3ba8222f54a0 100644 (file)
@@ -75,7 +75,7 @@ MovePicker::MovePicker(const Position& p, Move ttm, Depth d, const HistoryStats&
 
   assert(d > DEPTH_ZERO);
 
-  cur = end = moves;
+  cur = end = moves = pos.this_thread()->get_moves_array();
   endBadCaptures = moves + MAX_MOVES - 1;
   countermoves = cm;
   ss = s;
@@ -91,10 +91,11 @@ MovePicker::MovePicker(const Position& p, Move ttm, Depth d, const HistoryStats&
 }
 
 MovePicker::MovePicker(const Position& p, Move ttm, Depth d, const HistoryStats& h,
-                       Square sq) : pos(p), history(h), cur(moves), end(moves) {
+                       Square sq) : pos(p), history(h) {
 
   assert(d <= DEPTH_ZERO);
 
+  cur = end = moves = pos.this_thread()->get_moves_array();
   if (p.checkers())
       stage = EVASION;
 
@@ -123,10 +124,11 @@ MovePicker::MovePicker(const Position& p, Move ttm, Depth d, const HistoryStats&
 }
 
 MovePicker::MovePicker(const Position& p, Move ttm, const HistoryStats& h, PieceType pt)
-                       : pos(p), history(h), cur(moves), end(moves) {
+                       : pos(p), history(h) {
 
   assert(!pos.checkers());
 
+  cur = end = moves = pos.this_thread()->get_moves_array();
   stage = PROBCUT;
 
   // In ProbCut we generate only captures better than parent's captured piece
@@ -139,6 +141,7 @@ MovePicker::MovePicker(const Position& p, Move ttm, const HistoryStats& h, Piece
   end += (ttMove != MOVE_NONE);
 }
 
+MovePicker::~MovePicker() { pos.this_thread()->free_moves_array(); }
 
 /// score() assign a numerical move ordering score to each move in a move list.
 /// The moves with highest scores will be picked first.
@@ -231,7 +234,7 @@ void MovePicker::generate_next() {
       killers[2].move = killers[3].move = MOVE_NONE;
 
       // Be sure countermoves are different from killers
-      for (int i = 0; i < 2; i++)
+      for (int i = 0; i < 2; ++i)
           if (countermoves[i] != cur->move && countermoves[i] != (cur+1)->move)
               (end++)->move = countermoves[i];