]> git.sesse.net Git - stockfish/blobdiff - src/tt.h
Avoid searching TT twice for the same key/position during probe() and store().
[stockfish] / src / tt.h
index c442205253e2232aad77ffde7bf9ea70bc6bc0ba..0c324c73f21151455ecd6583ef5478a1fe0e56f0 100644 (file)
--- a/src/tt.h
+++ b/src/tt.h
@@ -38,28 +38,30 @@ struct TTEntry {
   Move  move()  const      { return (Move )move16; }
   Value value() const      { return (Value)value16; }
   Value eval_value() const { return (Value)evalValue; }
-  Depth depth() const      { return (Depth)(depth8) + DEPTH_NONE; }
+  Depth depth() const      { return (Depth)depth8; }
   Bound bound() const      { return (Bound)(genBound8 & 0x3); }
 
-private:
-  friend class TranspositionTable;
+  void save(Key k, Value v, Bound b, Depth d, Move m, Value ev, uint8_t g) {
 
-  void save(uint16_t k, Value v, Bound b, Depth d, Move m, uint8_t g, Value ev) {
-
-    key16     = (uint16_t)k;
-    move16    = (uint16_t)m;
-    value16   = (int16_t)v;
-    evalValue = (int16_t)ev;
-    depth8    = (uint8_t)(d - DEPTH_NONE);
-    genBound8 = g | (uint8_t)b;
+    k >>= 48;
+    if (m || k != key16) // preserve any existing ttMove
+        move16 = (uint16_t)m;
+    key16      = (uint16_t)k;
+    value16    = (int16_t)v;
+    evalValue  = (int16_t)ev;
+    genBound8  = (uint8_t)(g | b);
+    depth8     = (int8_t)d;
   }
 
+private:
+  friend class TranspositionTable;
+
   uint16_t key16;
   uint16_t move16;
   int16_t  value16;
   int16_t  evalValue;
   uint8_t  genBound8;
-  uint8_t  depth8;
+  int8_t   depth8;
 };
 
 /// TTCluster is a 32 bytes cluster of TT entries consisting of:
@@ -67,10 +69,9 @@ private:
 /// 3 x TTEntry (3 x 10 bytes)
 /// padding     (2 bytes)
 
-const unsigned TTClusterSize = 3;
+static const unsigned TTClusterSize = 3;
 
 struct TTCluster {
-
   TTEntry entry[TTClusterSize];
   char padding[2];
 };
@@ -86,12 +87,11 @@ class TranspositionTable {
 public:
  ~TranspositionTable() { free(mem); }
   void new_search() { generation += 4; } // Lower 2 bits are used by Bound
-
-  const TTEntry* probe(const Key key) const;
+  uint8_t get_generation() const { return generation; }
+  TTEntry* probe(const Key key, bool& found) const;
   TTEntry* first_entry(const Key key) const;
   void resize(size_t mbSize);
   void clear();
-  void store(const Key key, Value v, Bound type, Depth d, Move m, Value statV);
 
 private:
   size_t clusterCount;
@@ -109,7 +109,7 @@ extern TranspositionTable TT;
 
 inline TTEntry* TranspositionTable::first_entry(const Key key) const {
 
-  return &table[(uint32_t)key & (clusterCount - 1)].entry[0];
+  return &table[(size_t)key & (clusterCount - 1)].entry[0];
 }
 
 #endif // #ifndef TT_H_INCLUDED