X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fsyzygy%2Ftbprobe.cpp;h=22b3697ce44a1d1c8d1b5d5fbf656330d508adcb;hb=a90fc4c877b39769ebdf227b3124008ec394ad3d;hp=46c513d256097f23c8044c09e86c3cceacefabea;hpb=23f384cac33e8484a23d8077b9387431cb8382b7;p=stockfish diff --git a/src/syzygy/tbprobe.cpp b/src/syzygy/tbprobe.cpp index 46c513d2..22b3697c 100644 --- a/src/syzygy/tbprobe.cpp +++ b/src/syzygy/tbprobe.cpp @@ -239,7 +239,13 @@ template T number(void* addr) const union { uint32_t i; char c[4]; } Le = { 0x01020304 }; const bool IsLittleEndian = (Le.c[0] == 4); - T v = *((T*)addr); + T v; + + if ((uintptr_t)addr & (alignof(T) - 1)) // Unaligned pointer (very rare) + std::memcpy(&v, addr, sizeof(T)); + else + v = *((T*)addr); + if (LE != IsLittleEndian) swap_byte(v); return v; @@ -1061,10 +1067,10 @@ void do_init(Entry& e, T& p, uint8_t* data) { enum { Split = 1, HasPawns = 2 }; - uint8_t flags = *data++; + assert(e.hasPawns == !!(*data & HasPawns)); + assert((e.key != e.key2) == !!(*data & Split)); - assert(e.hasPawns == !!(flags & HasPawns)); - assert((e.key != e.key2) == !!(flags & Split)); + data++; // First byte stores flags const int Sides = IsWDL && (e.key != e.key2) ? 2 : 1; const File MaxFile = e.hasPawns ? FILE_D : FILE_A; @@ -1201,7 +1207,7 @@ WDLScore search(Position& pos, ProbeState* result) { moveCount++; - pos.do_move(move, st, pos.gives_check(move)); + pos.do_move(move, st); value = -search(pos, result); pos.undo_move(move); @@ -1449,7 +1455,7 @@ int Tablebases::probe_dtz(Position& pos, ProbeState* result) { { bool zeroing = pos.capture(move) || type_of(pos.moved_piece(move)) == PAWN; - pos.do_move(move, st, pos.gives_check(move)); + pos.do_move(move, st); // For zeroing moves we want the dtz of the move _before_ doing it, // otherwise we will get the dtz of the next move sequence. Search the @@ -1523,7 +1529,7 @@ bool Tablebases::root_probe(Position& pos, Search::RootMoves& rootMoves, Value& // Probe each move for (size_t i = 0; i < rootMoves.size(); ++i) { Move move = rootMoves[i].pv[0]; - pos.do_move(move, st, pos.gives_check(move)); + pos.do_move(move, st); int v = 0; if (pos.checkers() && dtz > 0) { @@ -1659,7 +1665,7 @@ bool Tablebases::root_probe_wdl(Position& pos, Search::RootMoves& rootMoves, Val // Probe each move for (size_t i = 0; i < rootMoves.size(); ++i) { Move move = rootMoves[i].pv[0]; - pos.do_move(move, st, pos.gives_check(move)); + pos.do_move(move, st); WDLScore v = -Tablebases::probe_wdl(pos, &result); pos.undo_move(move);