SCORE_ENSURE_INTEGER_SIZE_N = INT_MIN
};
-typedef union {
- uint32_t full;
- struct { int16_t eg, mg; } half;
-} ScoreView;
-
-inline Score make_score(int mg, int eg) {
- ScoreView v;
- v.half.mg = (int16_t)(mg - (uint16_t(eg) >> 15));
- v.half.eg = (int16_t)eg;
- return Score(v.full);
-}
+inline Score make_score(int mg, int eg) { return Score((mg << 16) + eg); }
+/// Extracting the signed lower and upper 16 bits is not so trivial because
+/// according to the standard a simple cast to short is implementation defined
+/// and so is a right shift of a signed integer.
inline Value mg_value(Score s) {
- ScoreView v;
- v.full = s;
- return Value(v.half.mg + (uint16_t(v.half.eg) >> 15));
+ return Value(((s + 0x8000) & ~0xffff) / 0x10000);
}
inline Value eg_value(Score s) {
- ScoreView v;
- v.full = s;
- return Value(v.half.eg);
+ return Value((int)(unsigned(s) & 0x7FFFU) - (int)(unsigned(s) & 0x8000U));
}
#define ENABLE_BASE_OPERATORS_ON(T) \
return make_score(mg_value(s) / i, eg_value(s) / i);
}
+CACHE_LINE_ALIGNMENT
+
extern Value PieceValue[PHASE_NB][PIECE_NB];
struct ExtMove {