X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fmovepick.cpp;h=09f7611c527b8e397f6422c2901f7a48854726cd;hb=62c0dc5dea4b3398afbf2bc015e91fdaedfdb81e;hp=2a57605e164fa0ceeb5c34f2e26bce6cc2af8a5b;hpb=53ab32ef0b6e47d8d962f8c1fccd32d3c22f138c;p=stockfish diff --git a/src/movepick.cpp b/src/movepick.cpp index 2a57605e..09f7611c 100644 --- a/src/movepick.cpp +++ b/src/movepick.cpp @@ -210,10 +210,10 @@ void MovePicker::score() { } -/// generate_next() generates, scores and sorts the next bunch of moves, when -/// there are no more moves to try for the current phase. +/// generate_next_stage() generates, scores and sorts the next bunch of moves, +/// when there are no more moves to try for the current stage. -void MovePicker::generate_next() { +void MovePicker::generate_next_stage() { cur = moves; @@ -233,15 +233,15 @@ void MovePicker::generate_next() { killers[2].move = killers[3].move = MOVE_NONE; killers[4].move = killers[5].move = MOVE_NONE; + // Please note that following code is racy and could yield to rare (less + // than 1 out of a million) duplicated entries in SMP case. This is harmless. + // Be sure countermoves are different from killers for (int i = 0; i < 2; ++i) if ( countermoves[i] != (cur+0)->move && countermoves[i] != (cur+1)->move) (end++)->move = countermoves[i]; - if (countermoves[1] && countermoves[1] == countermoves[0]) // Due to SMP races - killers[3].move = MOVE_NONE; - // Be sure followupmoves are different from killers and countermoves for (int i = 0; i < 2; ++i) if ( followupmoves[i] != (cur+0)->move @@ -249,10 +249,6 @@ void MovePicker::generate_next() { && followupmoves[i] != (cur+2)->move && followupmoves[i] != (cur+3)->move) (end++)->move = followupmoves[i]; - - if (followupmoves[1] && followupmoves[1] == followupmoves[0]) // Due to SMP races - (--end)->move = MOVE_NONE; - return; case QUIETS_1_S1: @@ -300,7 +296,7 @@ void MovePicker::generate_next() { /// next_move() is the most important method of the MovePicker class. It returns /// a new pseudo legal move every time it is called, until there are no more moves /// left. It picks the move with the biggest score from a list of generated moves -/// taking care not returning the ttMove if it has already been searched previously. +/// taking care not to return the ttMove if it has already been searched. template<> Move MovePicker::next_move() { @@ -309,7 +305,7 @@ Move MovePicker::next_move() { while (true) { while (cur == end) - generate_next(); + generate_next_stage(); switch (stage) {