]> git.sesse.net Git - stockfish/commitdiff
Micro optimization of generate_piece_moves()
authorMarco Costalba <mcostalba@gmail.com>
Wed, 23 Sep 2009 20:45:32 +0000 (21:45 +0100)
committerMarco Costalba <mcostalba@gmail.com>
Thu, 24 Sep 2009 06:11:39 +0000 (07:11 +0100)
This patch make the piece list always terminated by SQ_NONE,
so that we can use a simpler and faster loop in move
generation.

Speedup is about 0.6%.

No functional change.

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

index edb36feabd796f83b2c0c9e2fa6cca25d7c69f6a..f83dded7c4bea3d5d15429ba45f08b18fa597bdc 100644 (file)
@@ -476,10 +476,10 @@ namespace {
 
     Square from;
     Bitboard b;
+    const Square* ptr = pos.piece_list_begin(us, Piece);
 
-    for (int i = 0, e = pos.piece_count(us, Piece); i < e; i++)
+    while ((from = *ptr++) != SQ_NONE)
     {
-        from = pos.piece_list(us, Piece, i);
         b = pos.attacks_from<Piece>(from) & target;
         SERIALIZE_MOVES(b);
     }
@@ -502,10 +502,10 @@ namespace {
                                      Color us, Bitboard target, Bitboard pinned) {
     Square from;
     Bitboard b;
+    const Square* ptr = pos.piece_list_begin(us, Piece);
 
-    for (int i = 0, e = pos.piece_count(us, Piece); i < e; i++)
+    while ((from = *ptr++) != SQ_NONE)
     {
-        from = pos.piece_list(us, Piece, i);
         if (pinned && bit_is_set(pinned, from))
             continue;
 
index e759b64242734a66ba22ad078065751f05e91609..443ba88141b6ae9c3303b4c361efd52c62df64a0 100644 (file)
@@ -838,6 +838,7 @@ void Position::do_move(Move m, StateInfo& newSt, Bitboard dcCandidates) {
       Square lastPawnSquare = pieceList[us][PAWN][pieceCount[us][PAWN]];
       index[lastPawnSquare] = index[to];
       pieceList[us][PAWN][index[lastPawnSquare]] = lastPawnSquare;
+      pieceList[us][PAWN][pieceCount[us][PAWN]] = SQ_NONE;
       index[to] = pieceCount[us][promotion] - 1;
       pieceList[us][promotion][index[to]] = to;
 
@@ -943,6 +944,7 @@ void Position::do_capture_move(Bitboard& key, PieceType capture, Color them, Squ
     Square lastPieceSquare = pieceList[them][capture][pieceCount[them][capture]];
     index[lastPieceSquare] = index[capsq];
     pieceList[them][capture][index[lastPieceSquare]] = lastPieceSquare;
+    pieceList[them][capture][pieceCount[them][capture]] = SQ_NONE;
 
     // Reset rule 50 counter
     st->rule50 = 0;
@@ -1099,6 +1101,7 @@ void Position::undo_move(Move m) {
       Square lastPromotionSquare = pieceList[us][promotion][pieceCount[us][promotion]];
       index[lastPromotionSquare] = index[to];
       pieceList[us][promotion][index[lastPromotionSquare]] = lastPromotionSquare;
+      pieceList[us][promotion][pieceCount[us][promotion]] = SQ_NONE;
       index[to] = pieceCount[us][PAWN] - 1;
       pieceList[us][PAWN][index[to]] = to;
   }
index 88ee8fe233f4c50f5d0eef96facb15055946a689..370bb1d45e0476a9618c42725e350b7dc0e018e2 100644 (file)
@@ -193,6 +193,7 @@ public:
 
   // Piece lists
   Square piece_list(Color c, PieceType pt, int index) const;
+  const Square* piece_list_begin(Color c, PieceType pt) const;
 
   // Information about attacks to or from a given square
   Bitboard attackers_to(Square s) const;
@@ -403,6 +404,10 @@ inline Square Position::piece_list(Color c, PieceType pt, int index) const {
   return pieceList[c][pt][index];
 }
 
+inline const Square* Position::piece_list_begin(Color c, PieceType pt) const {
+  return pieceList[c][pt];
+}
+
 inline Square Position::ep_square() const {
   return st->epSquare;
 }