Explicitly use a dedicated bitboard for occupied squares
authorMarco Costalba <mcostalba@gmail.com>
Sun, 30 Oct 2011 10:11:45 +0000 (11:11 +0100)
committerMarco Costalba <mcostalba@gmail.com>
Sun, 30 Oct 2011 12:51:20 +0000 (13:51 +0100)
Instead of byTypeBB[0]. This better self-documents the code.

No functional and speed change.

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

index 397c87dd694c8eaba043f273d2255a883b68b69c..605cc1ae63f3e63c0f4bd0f13cc68b40b0b979cb 100644 (file)
@@ -812,7 +812,7 @@ void Position::do_move(Move m, StateInfo& newSt, const CheckInfo& ci, bool moveI
       // Remove captured piece
       clear_bit(&byColorBB[them], capsq);
       clear_bit(&byTypeBB[capture], capsq);
-      clear_bit(&byTypeBB[0], capsq);
+      clear_bit(&occupied, capsq);
 
       // Update hash key
       key ^= zobrist[them][capture][capsq];
@@ -868,7 +868,7 @@ void Position::do_move(Move m, StateInfo& newSt, const CheckInfo& ci, bool moveI
   Bitboard move_bb = make_move_bb(from, to);
   do_move_bb(&byColorBB[us], move_bb);
   do_move_bb(&byTypeBB[pt], move_bb);
-  do_move_bb(&byTypeBB[0], move_bb); // HACK: byTypeBB[0] == occupied squares
+  do_move_bb(&occupied, move_bb);
 
   board[to] = board[from];
   board[from] = PIECE_NONE;
@@ -1025,18 +1025,18 @@ void Position::do_castle_move(Move m) {
   // Remove pieces from source squares
   clear_bit(&byColorBB[us], kfrom);
   clear_bit(&byTypeBB[KING], kfrom);
-  clear_bit(&byTypeBB[0], kfrom);
+  clear_bit(&occupied, kfrom);
   clear_bit(&byColorBB[us], rfrom);
   clear_bit(&byTypeBB[ROOK], rfrom);
-  clear_bit(&byTypeBB[0], rfrom);
+  clear_bit(&occupied, rfrom);
 
   // Put pieces on destination squares
   set_bit(&byColorBB[us], kto);
   set_bit(&byTypeBB[KING], kto);
-  set_bit(&byTypeBB[0], kto);
+  set_bit(&occupied, kto);
   set_bit(&byColorBB[us], rto);
   set_bit(&byTypeBB[ROOK], rto);
-  set_bit(&byTypeBB[0], rto);
+  set_bit(&occupied, rto);
 
   // Update board
   Piece king = make_piece(us, KING);
@@ -1155,7 +1155,7 @@ void Position::undo_move(Move m) {
   Bitboard move_bb = make_move_bb(to, from);
   do_move_bb(&byColorBB[us], move_bb);
   do_move_bb(&byTypeBB[pt], move_bb);
-  do_move_bb(&byTypeBB[0], move_bb); // HACK: byTypeBB[0] == occupied squares
+  do_move_bb(&occupied, move_bb);
 
   board[from] = make_piece(us, pt);
   board[to] = PIECE_NONE;
@@ -1177,7 +1177,7 @@ void Position::undo_move(Move m) {
       // Restore the captured piece
       set_bit(&byColorBB[them], capsq);
       set_bit(&byTypeBB[st->capturedType], capsq);
-      set_bit(&byTypeBB[0], capsq);
+      set_bit(&occupied, capsq);
 
       board[capsq] = make_piece(them, st->capturedType);
 
@@ -1265,7 +1265,7 @@ int Position::see_sign(Move m) const {
 int Position::see(Move m) const {
 
   Square from, to;
-  Bitboard occupied, attackers, stmAttackers, b;
+  Bitboard occ, attackers, stmAttackers, b;
   int swapList[32], slIndex = 1;
   PieceType capturedType, pt;
   Color stm;
@@ -1281,7 +1281,7 @@ int Position::see(Move m) const {
   from = move_from(m);
   to = move_to(m);
   capturedType = type_of(piece_on(to));
-  occupied = occupied_squares();
+  occ = occupied_squares();
 
   // Handle en passant moves
   if (st->epSquare == to && type_of(piece_on(from)) == PAWN)
@@ -1292,14 +1292,14 @@ int Position::see(Move m) const {
       assert(type_of(piece_on(capQq)) == PAWN);
 
       // Remove the captured pawn
-      clear_bit(&occupied, capQq);
+      clear_bit(&occ, capQq);
       capturedType = PAWN;
   }
 
   // Find all attackers to the destination square, with the moving piece
   // removed, but possibly an X-ray attacker added behind it.
-  clear_bit(&occupied, from);
-  attackers = attackers_to(to, occupied);
+  clear_bit(&occ, from);
+  attackers = attackers_to(to, occ);
 
   // If the opponent has no attackers we are finished
   stm = flip(color_of(piece_on(from)));
@@ -1326,11 +1326,11 @@ int Position::see(Move m) const {
       // Remove the attacker we just found from the 'occupied' bitboard,
       // and scan for new X-ray attacks behind the attacker.
       b = stmAttackers & pieces(pt);
-      occupied ^= (b & (~b + 1));
-      attackers |=  (rook_attacks_bb(to, occupied)   & pieces(ROOK, QUEEN))
-                  | (bishop_attacks_bb(to, occupied) & pieces(BISHOP, QUEEN));
+      occ ^= (b & (~b + 1));
+      attackers |=  (rook_attacks_bb(to, occ)   & pieces(ROOK, QUEEN))
+                  | (bishop_attacks_bb(to, occ) & pieces(BISHOP, QUEEN));
 
-      attackers &= occupied; // Cut out pieces we've already done
+      attackers &= occ; // Cut out pieces we've already done
 
       // Add the new entry to the swap list
       assert(slIndex < 32);
@@ -1386,6 +1386,7 @@ void Position::clear() {
   }
   sideToMove = WHITE;
   nodes = 0;
+  occupied = 0;
 }
 
 
@@ -1403,7 +1404,7 @@ void Position::put_piece(Piece p, Square s) {
 
   set_bit(&byTypeBB[pt], s);
   set_bit(&byColorBB[c], s);
-  set_bit(&byTypeBB[0], s); // HACK: byTypeBB[0] contains all occupied squares.
+  set_bit(&occupied, s);
 }
 
 
index 8af624ca78c3a8f27480c75b68a3b3eb36781d17..ea7f37c685dcfd98d74683829cfc67ee893210b2 100644 (file)
@@ -238,6 +238,7 @@ private:
   // Bitboards
   Bitboard byTypeBB[8];        // [pieceType]
   Bitboard byColorBB[2];       // [color]
+  Bitboard occupied;
 
   // Piece counts
   int pieceCount[2][8];        // [color][pieceType]
@@ -287,11 +288,11 @@ inline Color Position::side_to_move() const {
 }
 
 inline Bitboard Position::occupied_squares() const {
-  return byTypeBB[0];
+  return occupied;
 }
 
 inline Bitboard Position::empty_squares() const {
-  return ~byTypeBB[0];
+  return ~occupied;
 }
 
 inline Bitboard Position::pieces(Color c) const {