Simplify move encoding
authorFabian Fichter <ianfab@users.noreply.github.com>
Sun, 30 Sep 2018 09:19:42 +0000 (11:19 +0200)
committerFabian Fichter <ianfab@users.noreply.github.com>
Sun, 7 Oct 2018 12:55:39 +0000 (14:55 +0200)
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.

src/movegen.cpp
src/types.h

index 17dad19..4c095de 100644 (file)
@@ -71,13 +71,9 @@ namespace {
   template<Color c, GenType Type, Direction D>
   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<T>(to - D, to, pt);
+            *moveList++ = make<PROMOTION>(to - D, to, pt);
 
     return moveList;
   }
index 3e2633c..800414c 100644 (file)
@@ -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<MoveType T>
 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) {