using Eval::evaluate;
using namespace Search;
-// Fast wrapper for common case of pos.gives_check()
-#define FAST_GIVES_CHECK(pos, m, ci) \
- ((type_of(m) == NORMAL && ci.dcCandidates == 0) \
- ? (ci.checkSq[type_of(pos.piece_on(from_sq(m)))] & to_sq(m)) \
- : pos.gives_check(m, ci))
-
namespace {
// Set to true to force running with one thread. Used for debugging
/// Search::perft() is our utility to verify move generation. All the leaf nodes
/// up to the given depth are generated and counted and the sum returned.
-static size_t perft(Position& pos, Depth depth) {
+static uint64_t perft(Position& pos, Depth depth) {
StateInfo st;
- size_t cnt = 0;
+ uint64_t cnt = 0;
CheckInfo ci(pos);
const bool leaf = depth == 2 * ONE_PLY;
return cnt;
}
-size_t Search::perft(Position& pos, Depth depth) {
+uint64_t Search::perft(Position& pos, Depth depth) {
return depth > ONE_PLY ? ::perft(pos, depth) : MoveList<LEGAL>(pos).size();
}
ext = DEPTH_ZERO;
captureOrPromotion = pos.capture_or_promotion(move);
- givesCheck = FAST_GIVES_CHECK(pos, move, ci);
+
+ givesCheck = type_of(move) == NORMAL && !ci.dcCandidates
+ ? ci.checkSq[type_of(pos.piece_on(from_sq(move)))] & to_sq(move)
+ : pos.gives_check(move, ci);
+
dangerous = givesCheck
|| type_of(move) != NORMAL
|| pos.advanced_pawn_push(move);
{
assert(is_ok(move));
- givesCheck = FAST_GIVES_CHECK(pos, move, ci);
+ givesCheck = type_of(move) == NORMAL && !ci.dcCandidates
+ ? ci.checkSq[type_of(pos.piece_on(from_sq(move)))] & to_sq(move)
+ : pos.gives_check(move, ci);
// Futility pruning
if ( !PvNode