From c698362680d7d66801be100e20346bbbf4ec5c4f Mon Sep 17 00:00:00 2001 From: Marco Costalba Date: Sat, 9 Feb 2013 10:22:34 +0100 Subject: [PATCH] Microptimize first_entry() for 32bits Do a 32bit bitwise 'and' instead of a 64bit subtract and bitwise 'and'. This is possible because even in the biggest hash table case (8GB) the number of entries is 2^29 so storable in an unsigned int. No functional change. --- src/tt.cpp | 10 ++++++---- src/tt.h | 4 ++-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/tt.cpp b/src/tt.cpp index 2445f794..fa0d39de 100644 --- a/src/tt.cpp +++ b/src/tt.cpp @@ -32,12 +32,14 @@ TranspositionTable TT; // Our global transposition table void TranspositionTable::set_size(size_t mbSize) { - size_t newSize = 1ULL << msb((mbSize << 20) / sizeof(TTEntry[ClusterSize])); + assert(msb((mbSize << 20) / sizeof(TTEntry)) < 32); - if (newSize == size) + uint32_t size = 1 << msb((mbSize << 20) / sizeof(TTEntry[ClusterSize])); + + if (clusterMask == size - 1) return; - size = newSize; + clusterMask = size - 1; delete [] entries; entries = new (std::nothrow) TTEntry[size * ClusterSize]; @@ -58,7 +60,7 @@ void TranspositionTable::set_size(size_t mbSize) { void TranspositionTable::clear() { - memset(entries, 0, size * sizeof(TTEntry[ClusterSize])); + memset(entries, 0, (clusterMask + 1) * sizeof(TTEntry[ClusterSize])); } diff --git a/src/tt.h b/src/tt.h index 3484f0eb..81bfd3b2 100644 --- a/src/tt.h +++ b/src/tt.h @@ -96,7 +96,7 @@ public: void store(const Key key, Value v, Bound type, Depth d, Move m, Value statV, Value kingD); private: - size_t size; + uint32_t clusterMask; TTEntry* entries; uint8_t generation; // Size must be not bigger then TTEntry::generation8 }; @@ -110,7 +110,7 @@ extern TranspositionTable TT; inline TTEntry* TranspositionTable::first_entry(const Key key) const { - return entries + ((uint32_t)key & (size - 1)) * ClusterSize; + return entries + ((uint32_t)key & clusterMask) * ClusterSize; } -- 2.39.2