Move legal check out of MovePicker
authorMarco Costalba <mcostalba@gmail.com>
Mon, 23 May 2011 12:58:07 +0000 (14:58 +0200)
committerMarco Costalba <mcostalba@gmail.com>
Mon, 23 May 2011 19:20:52 +0000 (20:20 +0100)
No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
src/movepick.cpp
src/movepick.h
src/search.cpp

index 6a4b26eef6e92bae6d1efd5cb774ab712be108cd..2f9cd146010e28c0fa0b6f7523e8f7f5cde2ab14 100644 (file)
@@ -64,8 +64,6 @@ MovePicker::MovePicker(const Position& p, Move ttm, Depth d, const History& h,
 
   assert(d > DEPTH_ZERO);
 
-  pinned = p.pinned_pieces(pos.side_to_move());
-
   if (p.in_check())
   {
       ttMoves[1].move = killers[0].move = killers[1].move = MOVE_NONE;
@@ -98,8 +96,6 @@ MovePicker::MovePicker(const Position& p, Move ttm, Depth d, const History& h)
 
   assert(d <= DEPTH_ZERO);
 
-  pinned = p.pinned_pieces(pos.side_to_move());
-
   if (p.in_check())
       phasePtr = EvasionTable;
   else if (d >= DEPTH_QS_CHECKS)
@@ -275,16 +271,14 @@ Move MovePicker::get_next_move() {
       case PH_TT_MOVES:
           move = (curMove++)->move;
           if (   move != MOVE_NONE
-              && pos.move_is_pl(move)
-              && pos.pl_move_is_legal(move, pinned))
+              && pos.move_is_pl(move))
               return move;
           break;
 
       case PH_GOOD_CAPTURES:
           move = pick_best(curMove++, lastMove).move;
           if (   move != ttMoves[0].move
-              && move != ttMoves[1].move
-              && pos.pl_move_is_legal(move, pinned))
+              && move != ttMoves[1].move)
           {
               // Check for a non negative SEE now
               int seeValue = pos.see_sign(move);
@@ -302,7 +296,6 @@ Move MovePicker::get_next_move() {
           move = (curMove++)->move;
           if (   move != MOVE_NONE
               && pos.move_is_pl(move)
-              && pos.pl_move_is_legal(move, pinned)
               && move != ttMoves[0].move
               && move != ttMoves[1].move
               && !pos.move_is_capture(move))
@@ -318,8 +311,7 @@ Move MovePicker::get_next_move() {
           if (   move != ttMoves[0].move
               && move != ttMoves[1].move
               && move != killers[0].move
-              && move != killers[1].move
-              && pos.pl_move_is_legal(move, pinned))
+              && move != killers[1].move)
               return move;
           break;
 
@@ -330,15 +322,13 @@ Move MovePicker::get_next_move() {
       case PH_EVASIONS:
       case PH_QCAPTURES:
           move = pick_best(curMove++, lastMove).move;
-          if (   move != ttMoves[0].move
-              && pos.pl_move_is_legal(move, pinned))
+          if (move != ttMoves[0].move)
               return move;
           break;
 
       case PH_QCHECKS:
           move = (curMove++)->move;
-          if (   move != ttMoves[0].move
-              && pos.pl_move_is_legal(move, pinned))
+          if (   move != ttMoves[0].move)
               return move;
           break;
 
index fb3d4a62da030af55793b464da69c66c43dcf652..5455a3df6a6db3e2f3372a4301e54e5452951a95 100644 (file)
@@ -53,7 +53,6 @@ private:
 
   const Position& pos;
   const History& H;
-  Bitboard pinned;
   MoveStack ttMoves[2], killers[2];
   int badCaptureThreshold, phase;
   const uint8_t* phasePtr;
index 516ff100868655264da9f18a7f2b6282eb61a474..94eb6155bf756bfc8f938b43cbd038947bd9ff75 100644 (file)
@@ -880,6 +880,7 @@ split_point_start: // At split points actual search starts from here
     // Initialize a MovePicker object for the current position
     MovePickerExt<SpNode, Root> mp(pos, ttMove, depth, H, ss, (PvNode ? -VALUE_INFINITE : beta));
     CheckInfo ci(pos);
+    Bitboard pinned = pos.pinned_pieces(pos.side_to_move());
     ss->bestMove = MOVE_NONE;
     futilityBase = ss->eval + ss->evalMargin;
     singularExtensionNode =   !Root
@@ -908,7 +909,7 @@ split_point_start: // At split points actual search starts from here
           moveCount = ++sp->moveCount;
           lock_release(&(sp->lock));
       }
-      else if (move == excludedMove)
+      else if (move == excludedMove || !pos.pl_move_is_legal(move, pinned))
           continue;
       else
           moveCount++;
@@ -1325,6 +1326,7 @@ split_point_start: // At split points actual search starts from here
     // be generated.
     MovePicker mp(pos, ttMove, depth, H);
     CheckInfo ci(pos);
+    Bitboard pinned = pos.pinned_pieces(pos.side_to_move());
 
     // Loop through the moves until no moves remain or a beta cutoff occurs
     while (   alpha < beta
@@ -1332,6 +1334,9 @@ split_point_start: // At split points actual search starts from here
     {
       assert(move_is_ok(move));
 
+      if (!pos.pl_move_is_legal(move, pinned))
+          continue;
+
       givesCheck = pos.move_gives_check(move, ci);
 
       // Futility pruning