Introduce Score struct

Save mid and end game scores in an union so to
operate on both values in one instruction.

This patch just introduces the infrastructure and changes
EvalInfo to use a single Score value instead of mgValue
and egValue.

Speed is more or less the same because we still don't use
unified midgame-endgame tables where the single assignment
optimization can prove effective.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
This commit is contained in:
Marco Costalba
2009-11-07 11:15:55 +01:00
parent 2f5ee9e4e8
commit 06f06a9be8
3 changed files with 85 additions and 67 deletions

View File

@@ -52,6 +52,40 @@ enum Value {
};
/// Score struct keeps a midgame and an endgame value in a single
/// ScoreValue 64 bit union.
union ScoreValue {
int64_t v64;
struct {
int32_t mgv;
int32_t egv;
} v32;
};
struct Score {
Score() {}
Score(const Score& s) { v = s.v; }
Score(int mg, int eg) { v.v32.mgv = int32_t(mg); v.v32.egv = int32_t(eg); }
Score& operator=(const Score& s) { v = s.v; return *this; }
Score& operator+=(const Score& s) { v.v32.mgv += s.v.v32.mgv; v.v32.egv += s.v.v32.egv; return *this; }
Score& operator-=(const Score& s) { v.v32.mgv -= s.v.v32.mgv; v.v32.egv -= s.v.v32.egv; return *this; }
Value mg() const { return Value(v.v32.mgv); }
Value eg() const { return Value(v.v32.egv); }
private:
ScoreValue v;
};
inline Score operator*(int i, Score s) { return Score(i * s.mg(), i * s.eg()); }
inline Score operator*(Score s, int i) { return s * i; }
inline Score operator-(Score s) { return Score(-s.mg(), -s.eg()); }
extern std::ostream& operator<<(std::ostream& os, Score s);
////
//// Constants and variables
////
@@ -97,8 +131,7 @@ const Value PieceValueEndgame[17] = {
/// Bonus for having the side to move (modified by Joona Kiiski)
const Value TempoValueMidgame = Value(48);
const Value TempoValueEndgame = Value(22);
const Score TempoValue = Score(48, 22);
////