X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Ftt.cpp;h=e140a0ba10ec5fa2183b506b68750a4dcbc39289;hp=ffb8b0124568e58101a913af300b60bf2dc195ce;hb=e33c94883fb1767a8aae29e8004d0621d296e33b;hpb=8d369600eca3fe3d059cfa8ba68d74ccdd883e33 diff --git a/src/tt.cpp b/src/tt.cpp index ffb8b012..e140a0ba 100644 --- a/src/tt.cpp +++ b/src/tt.cpp @@ -25,17 +25,11 @@ #include #include #include +#include #include "movegen.h" #include "tt.h" -#if defined(_MSC_VER) -#include -#endif - -// This is the number of TTEntry slots for each position -static const int ClusterSize = 4; - // The main transposition table TranspositionTable TT; @@ -67,14 +61,14 @@ void TranspositionTable::set_size(unsigned mbSize) { // We store a cluster of ClusterSize number of TTEntry for each position // and newSize is the maximum number of storable positions. - while ((2 * newSize) * ClusterSize * (sizeof(TTEntry)) <= (mbSize << 20)) + while ((2 * newSize) * sizeof(TTCluster) <= (mbSize << 20)) newSize *= 2; if (newSize != size) { size = newSize; delete [] entries; - entries = new TTEntry[size * ClusterSize]; + entries = new TTCluster[size]; if (!entries) { std::cerr << "Failed to allocate " << mbSize @@ -93,7 +87,7 @@ void TranspositionTable::set_size(unsigned mbSize) { void TranspositionTable::clear() { - memset(entries, 0, size * ClusterSize * sizeof(TTEntry)); + memset(entries, 0, size * sizeof(TTCluster)); } @@ -103,7 +97,7 @@ void TranspositionTable::clear() { inline TTEntry* TranspositionTable::first_entry(const Key posKey) const { - return entries + ((uint32_t(posKey) & (size - 1)) * ClusterSize); + return entries[uint32_t(posKey) & (size - 1)].data; } @@ -178,16 +172,15 @@ TTEntry* TranspositionTable::retrieve(const Key posKey) const { void TranspositionTable::prefetch(const Key posKey) const { -#if defined(_MSC_VER) - char* addr = (char*)first_entry(posKey); - _mm_prefetch(addr, _MM_HINT_T0); - _mm_prefetch(addr+64, _MM_HINT_T0); -#else - // We need to force an asm volatile here because gcc builtin - // is optimized away by Intel compiler. - char* addr = (char*)first_entry(posKey); - asm volatile("prefetcht0 %0" :: "m" (addr)); +#if defined(__INTEL_COMPILER) || defined(__ICL) + // This hack prevents prefetches to be optimized away by the + // Intel compiler. Both MSVC and gcc seems not affected. + __asm__ (""); #endif + + char const* addr = (char*)first_entry(posKey); + _mm_prefetch(addr, _MM_HINT_T2); + _mm_prefetch(addr+64, _MM_HINT_T2); // 64 bytes ahead }