In Position backup and restore contiguous data
authorMarco Costalba <mcostalba@gmail.com>
Fri, 20 Feb 2009 09:20:08 +0000 (10:20 +0100)
committerMarco Costalba <mcostalba@gmail.com>
Fri, 20 Feb 2009 21:49:54 +0000 (22:49 +0100)
Give the compiler one more chance to optimize the copy.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
src/position.cpp
src/position.h

index fdf3e911e9db32250781f6f8287451cc6eccbedf..2fc73b660d912898b9563f87a127ff682bf6d5e3 100644 (file)
@@ -678,24 +678,23 @@ bool Position::move_is_capture(Move m) const {
 
 void Position::backup(UndoInfo& u) const {
 
-  u.castleRights = castleRights;
-  u.epSquare     = epSquare;
+  for (Color c = WHITE; c <= BLACK; c++)
+  {
+      u.pinners[c]      = pinners[c];
+      u.pinned[c]       = pinned[c];
+      u.dcCandidates[c] = dcCandidates[c];
+  }
   u.checkersBB   = checkersBB;
   u.key          = key;
   u.pawnKey      = pawnKey;
   u.materialKey  = materialKey;
+  u.castleRights = castleRights;
   u.rule50       = rule50;
+  u.epSquare     = epSquare;
   u.lastMove     = lastMove;
   u.mgValue      = mgValue;
   u.egValue      = egValue;
   u.capture      = NO_PIECE_TYPE;
-
-  for (Color c = WHITE; c <= BLACK; c++)
-  {
-      u.pinners[c]      = pinners[c];
-      u.pinned[c]       = pinned[c];
-      u.dcCandidates[c] = dcCandidates[c];
-  }
 }
 
 
@@ -704,24 +703,23 @@ void Position::backup(UndoInfo& u) const {
 
 void Position::restore(const UndoInfo& u) {
 
-  castleRights = u.castleRights;
-  epSquare     = u.epSquare;
+  for (Color c = WHITE; c <= BLACK; c++)
+  {
+      pinners[c]      = u.pinners[c];
+      pinned[c]       = u.pinned[c];
+      dcCandidates[c] = u.dcCandidates[c];
+  }
   checkersBB   = u.checkersBB;
   key          = u.key;
   pawnKey      = u.pawnKey;
   materialKey  = u.materialKey;
+  castleRights = u.castleRights;
   rule50       = u.rule50;
+  epSquare     = u.epSquare;
   lastMove     = u.lastMove;
   mgValue     = u.mgValue;
   egValue     = u.egValue;
   // u.capture is restored in undo_move()
-
-  for (Color c = WHITE; c <= BLACK; c++)
-  {
-      pinners[c]      = u.pinners[c];
-      pinned[c]       = u.pinned[c];
-      dcCandidates[c] = u.dcCandidates[c];
-  }
 }
 
 
index 94b7003373d817fe6f40be5b13701b4197c6fd20..02e3a2452fd6382c05e1b0a714c69aa775056ff3 100644 (file)
@@ -74,17 +74,16 @@ enum CastleRights {
 
 
 /// The UndoInfo struct stores information we need to restore a Position
-/// object to its previous state when we retract a move.  Whenever a move
+/// object to its previous state when we retract a move. Whenever a move
 /// is made on the board (by calling Position::do_move), an UndoInfo object
-/// must be passed as a parameter.  When the move is unmade (by calling
+/// must be passed as a parameter. When the move is unmade (by calling
 /// Position::undo_move), the same UndoInfo object must be passed again.
 
 struct UndoInfo {
-  int castleRights;
-  Square epSquare;
-  Bitboard checkersBB, pinners[2], pinned[2], dcCandidates[2];
+  Bitboard pinners[2], pinned[2], dcCandidates[2], checkersBB;
   Key key, pawnKey, materialKey;
-  int rule50;
+  int castleRights, rule50;
+  Square epSquare;
   Move lastMove;
   Value mgValue, egValue;
   PieceType capture;
@@ -326,8 +325,6 @@ private:
 
   // Bitboards
   Bitboard byColorBB[2], byTypeBB[8];
-  Bitboard checkersBB;
-  mutable Bitboard pinners[2], pinned[2], dcCandidates[2];
 
   // Board
   Piece board[64];
@@ -340,16 +337,21 @@ private:
   int index[64];
 
   // Other info
+  Square kingSquare[2];
   Color sideToMove;
-  int castleRights;
+  int gamePly;
+  Key history[MaxGameLength];
+  Value npMaterial[2];
   File initialKFile, initialKRFile, initialQRFile;
+
+  // Info backed up in do_move()
+  mutable Bitboard pinners[2], pinned[2], dcCandidates[2];
+  Bitboard checkersBB;
+  Key key, pawnKey, materialKey;
+  int castleRights, rule50;
   Square epSquare;
-  Square kingSquare[2];
   Move lastMove;
-  Key key, pawnKey, materialKey, history[MaxGameLength];
-  int rule50, gamePly;
   Value mgValue, egValue;
-  Value npMaterial[2];
 
   // Static variables
   static int castleRightsMask[64];