From: Fabian Fichter Date: Sun, 30 Sep 2018 09:19:42 +0000 (+0200) Subject: Simplify move encoding X-Git-Url: http://winboard.nl/cgi-bin?a=commitdiff_plain;h=59b5e2d75ac0b1aba0aa721825a465f7481c8aa2;p=fairystockfish.git Simplify move encoding Using 32 bits for move encoding, the encoding of promotions can be simplified, which results in a 5-10% speed-up. Tested in combination with previous commit. STC ELO: 21.39 +-10.0 (95%) LOS: 100.0% Total: 2000 W: 491 L: 368 D: 1141 http://35.161.250.236:6543/tests/view/5bb096486e23db0fbab0ddf5 LTC ELO: 14.95 +-9.3 (95%) LOS: 99.9% Total: 2000 W: 420 L: 334 D: 1246 http://35.161.250.236:6543/tests/view/5bb112c56e23db0fbab0de0a No functional change. --- diff --git a/src/movegen.cpp b/src/movegen.cpp index 17dad19..4c095de 100644 --- a/src/movegen.cpp +++ b/src/movegen.cpp @@ -71,13 +71,9 @@ namespace { template ExtMove* make_promotions(const Position& pos, ExtMove* moveList, Square to) { - const MoveType T = (D == NORTH_WEST || D == SOUTH_WEST) ? PROMOTION_LEFT - : (D == NORTH_EAST || D == SOUTH_EAST) ? PROMOTION_RIGHT - : PROMOTION_STRAIGHT; - if (Type == CAPTURES || Type == EVASIONS || Type == NON_EVASIONS) for (PieceType pt : pos.promotion_piece_types()) - *moveList++ = make(to - D, to, pt); + *moveList++ = make(to - D, to, pt); return moveList; } diff --git a/src/types.h b/src/types.h index 3e2633c..800414c 100644 --- a/src/types.h +++ b/src/types.h @@ -125,11 +125,8 @@ enum MoveType { ENPASSANT = 1 << 12, CASTLING = 2 << 12, PROMOTION = 3 << 12, - PROMOTION_STRAIGHT = PROMOTION, - PROMOTION_LEFT = 4 << 12, - PROMOTION_RIGHT = 5 << 12, - DROP = 6 << 12, - PIECE_PROMOTION = 7 << 12, + DROP = 4 << 12, + PIECE_PROMOTION = 5 << 12, }; enum Color { @@ -475,10 +472,7 @@ constexpr Direction pawn_push(Color c) { } inline MoveType type_of(Move m) { - MoveType t = MoveType(m & (15 << 12)); - if (t == PROMOTION_STRAIGHT || t == PROMOTION_LEFT || t == PROMOTION_RIGHT) - return PROMOTION; - return t; + return MoveType(m & (15 << 12)); } constexpr Square to_sq(Move m) { @@ -488,20 +482,6 @@ constexpr Square to_sq(Move m) { inline Square from_sq(Move m) { if (type_of(m) == DROP) return SQ_NONE; - if (type_of(m) == PROMOTION) - { - Square to = to_sq(m); - MoveType t = MoveType(m & (15 << 12)); - // Assume here that promotion occur only for relative ranks >= RANK_5. - Direction up = (to & 32) ? NORTH : SOUTH; - if (t == PROMOTION_STRAIGHT) - return to - up; - if (t == PROMOTION_LEFT) - return to - up - WEST; - if (t == PROMOTION_RIGHT) - return to - up - EAST; - assert(false); - } return Square((m >> 6) & 0x3F); } @@ -510,7 +490,7 @@ inline int from_to(Move m) { } inline PieceType promotion_type(Move m) { - return type_of(m) == PROMOTION ? PieceType((m >> 6) & 63) : NO_PIECE_TYPE; + return type_of(m) == PROMOTION ? PieceType((m >> 16) & 63) : NO_PIECE_TYPE; } inline Move make_move(Square from, Square to) { @@ -519,17 +499,15 @@ inline Move make_move(Square from, Square to) { template inline Move make(Square from, Square to, PieceType pt = NO_PIECE_TYPE) { - if (T == PROMOTION_STRAIGHT || T == PROMOTION_LEFT || T == PROMOTION_RIGHT) - return Move(T + (pt << 6) + to); - return Move(T + (from << 6) + to); + return Move((pt << 16) + T + (from << 6) + to); } constexpr Move make_drop(Square to, PieceType pt) { - return Move(DROP + (pt << 6) + to); + return Move(DROP + (pt << 16) + to); } constexpr PieceType dropped_piece_type(Move m) { - return PieceType((m >> 6) & 63); + return PieceType((m >> 16) & 63); } inline bool is_ok(Move m) {