1
0
Fork 0
mirror of https://github.com/sockspls/badfish synced 2025-04-30 00:33:09 +00:00

Avoid a double copy when saving a TTEntry

In statement:

*tte = TTEntry(posKey32, v, t, d, m, generation, statV, kingD);

We first create a TTEntry, then we copy the temporary entry to
its final destination in *tte then we discard the TTEntry.

Instead of this assign the fields directly to the destination TTEntry.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
This commit is contained in:
Marco Costalba 2010-06-05 11:50:24 +02:00
parent 287b46aa63
commit ed2754227a
2 changed files with 23 additions and 20 deletions

View file

@ -125,7 +125,7 @@ void TranspositionTable::store(const Key posKey, Value v, ValueType t, Depth d,
if (m == MOVE_NONE) if (m == MOVE_NONE)
m = tte->move(); m = tte->move();
*tte = TTEntry(posKey32, v, t, d, m, generation, statV, kingD); tte->save(posKey32, v, t, d, m, generation, statV, kingD);
return; return;
} }
else if (i == 0) // replace would be a no-op in this common case else if (i == 0) // replace would be a no-op in this common case
@ -138,7 +138,7 @@ void TranspositionTable::store(const Key posKey, Value v, ValueType t, Depth d,
if (c1 + c2 + c3 > 0) if (c1 + c2 + c3 > 0)
replace = tte; replace = tte;
} }
*replace = TTEntry(posKey32, v, t, d, m, generation, statV, kingD); replace->save(posKey32, v, t, d, m, generation, statV, kingD);
writes++; writes++;
} }

View file

@ -53,29 +53,32 @@
class TTEntry { class TTEntry {
public: public:
TTEntry() {} void save(uint32_t k, Value v, ValueType t, Depth d, Move m, int g, Value statV, Value kd) {
TTEntry(uint32_t k, Value v, ValueType t, Depth d, Move m, int generation,
Value statV, Value kingD)
: key_ (k), data((m & 0x1FFFF) | (t << 20) | (generation << 23)),
value_(int16_t(v)), depth_(int16_t(d)),
staticValue_(int16_t(statV)), kingDanger_(int16_t(kingD)) {}
uint32_t key() const { return key_; } key32 = k;
Depth depth() const { return Depth(depth_); } data = (m & 0x1FFFF) | (t << 20) | (g << 23);
value16 = int16_t(v);
depth16 = int16_t(d);
staticValue = int16_t(statV);
kingDanger = int16_t(kd);
}
uint32_t key() const { return key32; }
Depth depth() const { return Depth(depth16); }
Move move() const { return Move(data & 0x1FFFF); } Move move() const { return Move(data & 0x1FFFF); }
Value value() const { return Value(value_); } Value value() const { return Value(value16); }
ValueType type() const { return ValueType((data >> 20) & 7); } ValueType type() const { return ValueType((data >> 20) & 7); }
int generation() const { return (data >> 23); } int generation() const { return data >> 23; }
Value static_value() const { return Value(staticValue_); } Value static_value() const { return Value(staticValue); }
Value king_danger() const { return Value(kingDanger_); } Value king_danger() const { return Value(kingDanger); }
private: private:
uint32_t key_; uint32_t key32;
uint32_t data; uint32_t data;
int16_t value_; int16_t value16;
int16_t depth_; int16_t depth16;
int16_t staticValue_; int16_t staticValue;
int16_t kingDanger_; int16_t kingDanger;
}; };
@ -84,7 +87,7 @@ const int ClusterSize = 4;
/// Each group of ClusterSize number of TTEntry form a TTCluster /// Each group of ClusterSize number of TTEntry form a TTCluster
/// that is indexed by a single position key. TTCluster size must /// that is indexed by a single position key. TTCluster size must
// be not bigger then a cache line size, in case it is less then /// be not bigger then a cache line size, in case it is less then
/// it should be padded to guarantee always aligned accesses. /// it should be padded to guarantee always aligned accesses.
struct TTCluster { struct TTCluster {