| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| #ifndef TT_H_INCLUDED |
| #define TT_H_INCLUDED |
|
|
| #include "misc.h" |
| #include "types.h" |
|
|
| namespace Stockfish { |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| struct TTEntry { |
|
|
| Move move() const { return (Move )move16; } |
| Value value() const { return (Value)value16; } |
| Value eval() const { return (Value)eval16; } |
| Depth depth() const { return (Depth)depth8 + DEPTH_OFFSET; } |
| bool is_pv() const { return (bool)(genBound8 & 0x4); } |
| Bound bound() const { return (Bound)(genBound8 & 0x3); } |
| void save(Key k, Value v, bool pv, Bound b, Depth d, Move m, Value ev); |
|
|
| private: |
| friend class TranspositionTable; |
|
|
| uint16_t key16; |
| uint8_t depth8; |
| uint8_t genBound8; |
| uint16_t move16; |
| int16_t value16; |
| int16_t eval16; |
| }; |
|
|
|
|
| |
| |
| |
| |
| |
|
|
| class TranspositionTable { |
|
|
| static constexpr int ClusterSize = 3; |
|
|
| struct Cluster { |
| TTEntry entry[ClusterSize]; |
| char padding[2]; |
| }; |
|
|
| static_assert(sizeof(Cluster) == 32, "Unexpected Cluster size"); |
|
|
| |
| static constexpr unsigned GENERATION_BITS = 3; |
| static constexpr int GENERATION_DELTA = (1 << GENERATION_BITS); |
| static constexpr int GENERATION_CYCLE = 255 + (1 << GENERATION_BITS); |
| static constexpr int GENERATION_MASK = (0xFF << GENERATION_BITS) & 0xFF; |
|
|
| public: |
| ~TranspositionTable() { aligned_large_pages_free(table); } |
| void new_search() { generation8 += GENERATION_DELTA; } |
| TTEntry* probe(const Key key, bool& found) const; |
| int hashfull() const; |
| void resize(size_t mbSize); |
| void clear(); |
|
|
| TTEntry* first_entry(const Key key) const { |
| return &table[mul_hi64(key, clusterCount)].entry[0]; |
| } |
|
|
| private: |
| friend struct TTEntry; |
|
|
| size_t clusterCount; |
| Cluster* table; |
| uint8_t generation8; |
| }; |
|
|
| extern TranspositionTable TT; |
|
|
| } |
|
|
| #endif |
|
|