]> git.sesse.net Git - stockfish/blobdiff - src/tt.h
Smart TT save
[stockfish] / src / tt.h
index 420aaa6b60c03a106a949a6c8dfc7e447273fdf0..48c5638a7d971d1ed3c581a37b7a87529948d462 100644 (file)
--- a/src/tt.h
+++ b/src/tt.h
@@ -43,14 +43,34 @@ struct TTEntry {
 
   void save(Key k, Value v, Bound b, Depth d, Move m, Value ev, uint8_t g) {
 
-    if (m || (k >> 48) != key16) // Preserve any existing move for the same position
-        move16 = (uint16_t)m;
-
-    key16     = (uint16_t)(k >> 48);
-    value16   = (int16_t)v;
-    eval16    = (int16_t)ev;
-    genBound8 = (uint8_t)(g | b);
-    depth8    = (int8_t)d;
+      if (key16 != (k >> 48))
+      {
+          key16     = (uint16_t)(k >> 48);
+          move16    = (uint16_t)m;
+          value16   = (int16_t)v;
+          eval16    = (int16_t)ev;
+          genBound8 = (uint8_t)(g | b);
+          depth8    = (int8_t)d;
+      }
+      else
+      {
+          // Preserve any existing move for the same position
+          if (m)
+              move16 = (uint16_t)m;
+
+          // Don't overwrite more valuable values
+          if (   d + 2 > depth8 
+              || g != (genBound8 & 0xFC) 
+              || b == BOUND_EXACT)
+          {
+              value16   = (int16_t)v;
+              genBound8 = (uint8_t)(g | b);
+              depth8    = (int8_t)d;
+          }
+
+          if (ev != VALUE_NONE)
+              eval16 = (int16_t)ev;
+      }
   }
 
 private:
@@ -66,7 +86,7 @@ private:
 
 
 /// A TranspositionTable consists of a power of 2 number of clusters and each
-/// cluster consists of TTClusterSize number of TTEntry. Each non-empty entry
+/// cluster consists of ClusterSize number of TTEntry. Each non-empty entry
 /// contains information of exactly one position. The size of a cluster should
 /// not be bigger than a cache line size. In case it is less, it should be padded
 /// to guarantee always aligned accesses.
@@ -74,18 +94,21 @@ private:
 class TranspositionTable {
 
   static const int CacheLineSize = 64;
-  static const int TTClusterSize = 3;
+  static const int ClusterSize = 3;
 
   struct Cluster {
-    TTEntry entry[TTClusterSize];
+    TTEntry entry[ClusterSize];
     char padding[2]; // Align to the cache line size
   };
 
+  static_assert(sizeof(Cluster) == CacheLineSize / 2, "Cluster size incorrect");
+
 public:
  ~TranspositionTable() { free(mem); }
   void new_search() { generation8 += 4; } // Lower 2 bits are used by Bound
   uint8_t generation() const { return generation8; }
   TTEntry* probe(const Key key, bool& found) const;
+  int hashfull() const;
   void resize(size_t mbSize);
   void clear();