2 Stockfish, a UCI chess playing engine derived from Glaurung 2.1
3 Copyright (C) 2004-2023 The Stockfish developers (see AUTHORS file)
5 Stockfish is free software: you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation, either version 3 of the License, or
8 (at your option) any later version.
10 Stockfish is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
30 // TTEntry struct is the 10 bytes transposition table entry, defined as below:
42 Move move() const { return Move(move16); }
43 Value value() const { return Value(value16); }
44 Value eval() const { return Value(eval16); }
45 Depth depth() const { return Depth(depth8 + DEPTH_OFFSET); }
46 bool is_pv() const { return bool(genBound8 & 0x4); }
47 Bound bound() const { return Bound(genBound8 & 0x3); }
48 void save(Key k, Value v, bool pv, Bound b, Depth d, Move m, Value ev);
51 friend class TranspositionTable;
62 // A TranspositionTable is an array of Cluster, of size clusterCount. Each
63 // cluster consists of ClusterSize number of TTEntry. Each non-empty TTEntry
64 // contains information on exactly one position. The size of a Cluster should
65 // divide the size of a cache line for best performance, as the cacheline is
66 // prefetched when possible.
67 class TranspositionTable {
69 static constexpr int ClusterSize = 3;
72 TTEntry entry[ClusterSize];
73 char padding[2]; // Pad to 32 bytes
76 static_assert(sizeof(Cluster) == 32, "Unexpected Cluster size");
78 // Constants used to refresh the hash table periodically
79 static constexpr unsigned GENERATION_BITS = 3; // nb of bits reserved for other things
80 static constexpr int GENERATION_DELTA =
81 (1 << GENERATION_BITS); // increment for generation field
82 static constexpr int GENERATION_CYCLE = 255 + (1 << GENERATION_BITS); // cycle length
83 static constexpr int GENERATION_MASK =
84 (0xFF << GENERATION_BITS) & 0xFF; // mask to pull out generation number
87 ~TranspositionTable() { aligned_large_pages_free(table); }
88 void new_search() { generation8 += GENERATION_DELTA; } // Lower bits are used for other things
89 TTEntry* probe(const Key key, bool& found) const;
91 void resize(size_t mbSize);
94 TTEntry* first_entry(const Key key) const {
95 return &table[mul_hi64(key, clusterCount)].entry[0];
99 friend struct TTEntry;
103 uint8_t generation8; // Size must be not bigger than TTEntry::genBound8
106 extern TranspositionTable TT;
108 } // namespace Stockfish
110 #endif // #ifndef TT_H_INCLUDED