Skip offset calculation in slider attacks
authorMarco Costalba <mcostalba@gmail.com>
Sun, 5 Jun 2011 13:41:59 +0000 (14:41 +0100)
committerMarco Costalba <mcostalba@gmail.com>
Sun, 5 Jun 2011 14:01:22 +0000 (15:01 +0100)
Another small simplification and micro optimization.

No functional change in both 32 and 64 bits.

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

index 0d2888988c88c7caed8ddb03c5e16cbfaed731f8..c6ee517d4aa8e7b5f7f3dfc0464f814f59f54e39 100644 (file)
@@ -24,9 +24,6 @@
 
 // Global bitboards definitions with static storage duration are
 // automatically set to zero before enter main().
-Bitboard RAttacks[0x19000];
-Bitboard BAttacks[0x1480];
-
 Magics RMagics[64];
 Magics BMagics[64];
 
@@ -53,6 +50,15 @@ uint8_t BitCount8Bit[256];
 
 namespace {
 
+  CACHE_LINE_ALIGNMENT
+
+  int BSFTable[64];
+
+  Bitboard RAttacks[0x19000];
+  Bitboard BAttacks[0x1480];
+
+  void init_sliding_attacks(Bitboard attacks[], Magics m[], const Bitboard mult[], Square deltas[]);
+
 #if defined(IS_64BIT)
 
 const uint64_t DeBruijnMagic = 0x218A392CD3D5DBFULL;
@@ -163,9 +169,6 @@ const uint64_t RMult[64] = {
 
 #endif // defined(IS_64BIT)
 
-  CACHE_LINE_ALIGNMENT int BSFTable[64];
-
-  void init_sliding_attacks(Bitboard attacks[], Magics m[], const Bitboard mult[], Square deltas[]);
 }
 
 
@@ -397,10 +400,10 @@ namespace {
     {
         excluded = ((Rank1BB | Rank8BB) & ~rank_bb(s)) | ((FileABB | FileHBB) & ~file_bb(s));
 
-        m[s].offset = offset;
-        m[s].mult   = mult[s];
-        m[s].mask   = sliding_attacks(s, EmptyBoardBB, deltas, excluded);
-        m[s].shift  = (CpuIs64Bit ? 64 : 32) - count_1s<CNT64>(m[s].mask);
+        m[s].attacks = &attacks[offset];
+        m[s].mult    = mult[s];
+        m[s].mask    = sliding_attacks(s, EmptyBoardBB, deltas, excluded);
+        m[s].shift   = (CpuIs64Bit ? 64 : 32) - count_1s<CNT64>(m[s].mask);
 
         maxKey = 1 << count_1s<CNT64>(m[s].mask);
 
@@ -411,7 +414,7 @@ namespace {
             index = CpuIs64Bit ? occupancy * mult[s]
                                : unsigned(occupancy * mult[s] ^ (occupancy >> 32) * (mult[s] >> 32));
 
-            attacks[offset + (index >> m[s].shift)] = sliding_attacks(s, occupancy, deltas, EmptyBoardBB);
+            m[s].attacks[index >> m[s].shift] = sliding_attacks(s, occupancy, deltas, EmptyBoardBB);
         }
         offset += maxKey;
     }
index b3a0033c65832b84fe4089d149861a34d5ddde62..00f0f576d91972762e7f2781a585c3600f371e24 100644 (file)
@@ -69,16 +69,13 @@ extern uint8_t BitCount8Bit[256];
 struct Magics {
   Bitboard mask;
   uint64_t mult;
-  uint32_t offset;
   uint32_t shift;
+  Bitboard* attacks;
 };
 
 extern Magics RMagics[64];
 extern Magics BMagics[64];
 
-extern Bitboard RAttacks[0x19000];
-extern Bitboard BAttacks[0x1480];
-
 
 /// Functions for testing whether a given bit is set in a bitboard, and for
 /// setting and clearing bits.
@@ -176,12 +173,12 @@ inline Bitboard in_front_bb(Color c, Square s) {
 
 inline Bitboard rook_attacks_bb(Square s, Bitboard occ) {
   const Magics& m = RMagics[s];
-  return RAttacks[m.offset + (((occ & m.mask) * m.mult) >> m.shift)];
+  return m.attacks[((occ & m.mask) * m.mult) >> m.shift];
 }
 
 inline Bitboard bishop_attacks_bb(Square s, Bitboard occ) {
   const Magics& m = BMagics[s];
-  return BAttacks[m.offset + (((occ & m.mask) * m.mult) >> m.shift)];
+  return m.attacks[((occ & m.mask) * m.mult) >> m.shift];
 }
 
 #else // if !defined(IS_64BIT)
@@ -189,15 +186,13 @@ inline Bitboard bishop_attacks_bb(Square s, Bitboard occ) {
 inline Bitboard rook_attacks_bb(Square s, Bitboard occ) {
   const Magics& m = RMagics[s];
   Bitboard b = occ & m.mask;
-  return RAttacks[m.offset +
-        ((unsigned(b) * unsigned(m.mult) ^ unsigned(b >> 32) * unsigned(m.mult >> 32)) >> m.shift)];
+  return m.attacks[(unsigned(b) * unsigned(m.mult) ^ unsigned(b >> 32) * unsigned(m.mult >> 32)) >> m.shift];
 }
 
 inline Bitboard bishop_attacks_bb(Square s, Bitboard occ) {
   const Magics& m = BMagics[s];
   Bitboard b = occ & m.mask;
-  return BAttacks[m.offset +
-        ((unsigned(b) * unsigned(m.mult) ^ unsigned(b >> 32) * unsigned(m.mult >> 32)) >> m.shift)];
+  return m.attacks[(unsigned(b) * unsigned(m.mult) ^ unsigned(b >> 32) * unsigned(m.mult >> 32)) >> m.shift];
 }
 
 #endif