X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Ftypes.h;h=ac97f7f1b0a8990a8a10c54c05e4f53905a2b70c;hp=8ce7dab55df09cc92a9ba14ebd2ef4c48de94fad;hb=6b909b2343190f2989d21c8f69f40e9f09c530c0;hpb=04ff9c2548eb4d8b8a59db23f7212c7a8cdd25aa diff --git a/src/types.h b/src/types.h index 8ce7dab5..ac97f7f1 100644 --- a/src/types.h +++ b/src/types.h @@ -35,31 +35,13 @@ /// | only in 64-bit mode. For compiling requires hardware with /// | popcnt support. +#include #include #include -#if defined(_MSC_VER) - -// Disable some silly and noisy warning from MSVC compiler -#pragma warning(disable: 4127) // Conditional expression is constant -#pragma warning(disable: 4146) // Unary minus operator applied to unsigned type -#pragma warning(disable: 4800) // Forcing value to bool 'true' or 'false' - -// MSVC does not support -typedef signed __int8 int8_t; -typedef unsigned __int8 uint8_t; -typedef signed __int16 int16_t; -typedef unsigned __int16 uint16_t; -typedef signed __int32 int32_t; -typedef unsigned __int32 uint32_t; -typedef signed __int64 int64_t; -typedef unsigned __int64 uint64_t; +#include "platform.h" -#else -# include -#endif - -#if defined(_WIN64) +#if defined(_WIN64) && !defined(IS_64BIT) # include // MSVC popcnt and bsfq instrinsics # define IS_64BIT # define USE_BSFQ @@ -69,6 +51,10 @@ typedef unsigned __int64 uint64_t; # include // Intel header for _mm_popcnt_u64() intrinsic #endif +# if !defined(NO_PREFETCH) && (defined(__INTEL_COMPILER) || defined(_MSC_VER)) +# include // Intel and Microsoft header for _mm_prefetch() +# endif + #if defined(_MSC_VER) || defined(__INTEL_COMPILER) # define CACHE_LINE_ALIGNMENT __declspec(align(64)) #else @@ -98,7 +84,7 @@ const bool Is64Bit = false; typedef uint64_t Key; typedef uint64_t Bitboard; -const int MAX_MOVES = 256; +const int MAX_MOVES = 192; const int MAX_PLY = 100; const int MAX_PLY_PLUS_2 = MAX_PLY + 2; @@ -137,24 +123,32 @@ enum Move { MOVE_NULL = 65 }; -struct MoveStack { - Move move; - int score; +enum MoveType { + NORMAL = 0, + PROMOTION = 1 << 14, + ENPASSANT = 2 << 14, + CASTLE = 3 << 14 }; -inline bool operator<(const MoveStack& f, const MoveStack& s) { - return f.score < s.score; -} - -enum CastleRight { +enum CastleRight { // Defined as in PolyGlot book hash key CASTLES_NONE = 0, WHITE_OO = 1, - BLACK_OO = 2, - WHITE_OOO = 4, + WHITE_OOO = 2, + BLACK_OO = 4, BLACK_OOO = 8, ALL_CASTLES = 15 }; +enum CastlingSide { + KING_SIDE, + QUEEN_SIDE +}; + +enum Phase { + PHASE_ENDGAME = 0, + PHASE_MIDGAME = 128 +}; + enum ScaleFactor { SCALE_FACTOR_DRAW = 0, SCALE_FACTOR_NORMAL = 64, @@ -162,11 +156,11 @@ enum ScaleFactor { SCALE_FACTOR_NONE = 255 }; -enum ValueType { - VALUE_TYPE_NONE = 0, - VALUE_TYPE_UPPER = 1, - VALUE_TYPE_LOWER = 2, - VALUE_TYPE_EXACT = VALUE_TYPE_UPPER | VALUE_TYPE_LOWER +enum Bound { + BOUND_NONE = 0, + BOUND_UPPER = 1, + BOUND_LOWER = 2, + BOUND_EXACT = BOUND_UPPER | BOUND_LOWER }; enum Value { @@ -181,11 +175,19 @@ enum Value { VALUE_MATED_IN_MAX_PLY = -VALUE_MATE + MAX_PLY, VALUE_ENSURE_INTEGER_SIZE_P = INT_MAX, - VALUE_ENSURE_INTEGER_SIZE_N = INT_MIN + VALUE_ENSURE_INTEGER_SIZE_N = INT_MIN, + + Mg = 0, Eg = 1, + + PawnValueMg = 198, PawnValueEg = 258, + KnightValueMg = 817, KnightValueEg = 846, + BishopValueMg = 836, BishopValueEg = 857, + RookValueMg = 1270, RookValueEg = 1278, + QueenValueMg = 2521, QueenValueEg = 2558 }; enum PieceType { - NO_PIECE_TYPE = 0, + NO_PIECE_TYPE = 0, ALL_PIECES = 0, PAWN = 1, KNIGHT = 2, BISHOP = 3, ROOK = 4, QUEEN = 5, KING = 6 }; @@ -316,30 +318,51 @@ inline Score operator/(Score s, int i) { return make_score(mg_value(s) / i, eg_value(s) / i); } +/// Weight score v by score w trying to prevent overflow +inline Score apply_weight(Score v, Score w) { + return make_score((int(mg_value(v)) * mg_value(w)) / 0x100, + (int(eg_value(v)) * eg_value(w)) / 0x100); +} + #undef ENABLE_OPERATORS_ON #undef ENABLE_SAFE_OPERATORS_ON -const Value PawnValueMidgame = Value(0x0C6); -const Value PawnValueEndgame = Value(0x102); -const Value KnightValueMidgame = Value(0x331); -const Value KnightValueEndgame = Value(0x34E); -const Value BishopValueMidgame = Value(0x344); -const Value BishopValueEndgame = Value(0x359); -const Value RookValueMidgame = Value(0x4F6); -const Value RookValueEndgame = Value(0x4FE); -const Value QueenValueMidgame = Value(0x9D9); -const Value QueenValueEndgame = Value(0x9FE); - -extern const Value PieceValueMidgame[17]; // Indexed by Piece or PieceType -extern const Value PieceValueEndgame[17]; -extern int SquareDistance[64][64]; +namespace Zobrist { + + extern Key psq[2][8][64]; // [color][pieceType][square / piece count] + extern Key enpassant[8]; // [file] + extern Key castle[16]; // [castleRight] + extern Key side; + extern Key exclusion; + + void init(); +} + +CACHE_LINE_ALIGNMENT + +extern Score pieceSquareTable[16][64]; // [piece][square] +extern Value PieceValue[2][18]; // [Mg / Eg][piece / pieceType] +extern int SquareDistance[64][64]; // [square][square] + +struct MoveStack { + Move move; + int score; +}; + +inline bool operator<(const MoveStack& f, const MoveStack& s) { + return f.score < s.score; +} inline Color operator~(Color c) { return Color(c ^ 1); } inline Square operator~(Square s) { - return Square(s ^ 56); + return Square(s ^ 56); // Vertical flip SQ_A1 -> SQ_A8 +} + +inline Square operator|(File f, Rank r) { + return Square((r << 3) | f); } inline Value mate_in(int ply) { @@ -354,6 +377,10 @@ inline Piece make_piece(Color c, PieceType pt) { return Piece((c << 3) | pt); } +inline CastleRight make_castle_right(Color c, CastlingSide s) { + return CastleRight(WHITE_OO << ((s == QUEEN_SIDE) + 2 * c)); +} + inline PieceType type_of(Piece p) { return PieceType(p & 7); } @@ -362,11 +389,7 @@ inline Color color_of(Piece p) { return Color(p >> 3); } -inline Square make_square(File f, Rank r) { - return Square((r << 3) | f); -} - -inline bool square_is_ok(Square s) { +inline bool is_ok(Square s) { return s >= SQ_A1 && s <= SQ_H8; } @@ -379,7 +402,7 @@ inline Rank rank_of(Square s) { } inline Square mirror(Square s) { - return Square(s ^ 7); + return Square(s ^ 7); // Horizontal flip SQ_A1 -> SQ_H1 } inline Square relative_square(Color c, Square s) { @@ -395,7 +418,7 @@ inline Rank relative_rank(Color c, Square s) { } inline bool opposite_colors(Square s1, Square s2) { - int s = s1 ^ s2; + int s = int(s1) ^ int(s2); return ((s >> 3) ^ s) & 1; } @@ -411,10 +434,6 @@ inline int square_distance(Square s1, Square s2) { return SquareDistance[s1][s2]; } -inline char piece_type_to_char(PieceType pt) { - return " PNBRQK"[pt]; -} - inline char file_to_char(File f) { return char(f - FILE_A + int('a')); } @@ -435,23 +454,11 @@ inline Square to_sq(Move m) { return Square(m & 0x3F); } -inline bool is_special(Move m) { - return m & (3 << 14); -} - -inline bool is_promotion(Move m) { - return (m & (3 << 14)) == (1 << 14); -} - -inline int is_enpassant(Move m) { - return (m & (3 << 14)) == (2 << 14); +inline MoveType type_of(Move m) { + return MoveType(m & (3 << 14)); } -inline int is_castle(Move m) { - return (m & (3 << 14)) == (3 << 14); -} - -inline PieceType promotion_piece_type(Move m) { +inline PieceType promotion_type(Move m) { return PieceType(((m >> 12) & 3) + 2); } @@ -459,16 +466,9 @@ inline Move make_move(Square from, Square to) { return Move(to | (from << 6)); } -inline Move make_promotion(Square from, Square to, PieceType pt) { - return Move(to | (from << 6) | (1 << 14) | ((pt - 2) << 12)) ; -} - -inline Move make_enpassant(Square from, Square to) { - return Move(to | (from << 6) | (2 << 14)); -} - -inline Move make_castle(Square from, Square to) { - return Move(to | (from << 6) | (3 << 14)); +template +inline Move make(Square from, Square to, PieceType pt = KNIGHT) { + return Move(to | (from << 6) | T | ((pt - KNIGHT) << 12)) ; } inline bool is_ok(Move m) {