X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fvalue.h;h=fec6516a4c8c4014427afeeb3cf22d6b9941d865;hp=03ae24b7832770fa19128c5dc8e609bd230ec2d9;hb=0973cc2ef63060294f790803e0525b66ee91dfee;hpb=ef6fca98a0b70b82ba701e6969a80cd9daf78705 diff --git a/src/value.h b/src/value.h index 03ae24b7..fec6516a 100644 --- a/src/value.h +++ b/src/value.h @@ -52,10 +52,11 @@ enum Value { }; -/// Score struct keeps a midgame and an endgame value in a single -/// ScoreValue 64 bit union. +/// Score enum keeps a midgame and an endgame value in a single +/// integer (enum), first LSB 16 bits are used to store endgame +/// value, while upper bits are used for midgame value. -enum Score; +enum Score { ENSURE_32_BIT_SIZE = 1 << 31 }; inline Value eg_value(Score s) { return Value(int16_t(s & 0xffff)); } inline Value mg_value(Score s) { return Value((int(s) + 32768) >> 16); } @@ -68,20 +69,14 @@ inline Score operator-(Score s1, Score s2) { return Score(int(s1) - int(s2)); } inline void operator+=(Score& s1, Score s2) { s1 = Score(int(s1) + int(s2)); } inline void operator-=(Score& s1, Score s2) { s1 = Score(int(s1) - int(s2)); } inline Score operator*(int i, Score s) { return Score(i * int(s)); } -inline Score operator/(Score s, int i) { return Score(int(s) / i); } + +// Division must be handled separately for each term +inline Score operator/(Score s, int i) { return make_score(mg_value(s) / i, eg_value(s) / i); } // Only declared but not defined. We don't want to multiply two scores due to // a very high risk of overflow. So user should explicitly convert to integer. inline Score operator*(Score s1, Score s2); -// Following are only declared to prevent erroneus instantations -inline Score operator*(Score s, int i); -inline Score operator/(Score s1, Score s2); -inline Score operator+(Score s, int i); -inline Score operator+(int i, Score s); -inline Score operator-(Score s, int i); -inline Score operator-(int i, Score s); - //// //// Constants and variables