]> git.sesse.net Git - stockfish/blobdiff - src/bitboard.cpp
Restore MS1BTable[]
[stockfish] / src / bitboard.cpp
index bdde916183294fa26e1b29cfd05921c16efb0482..36d582d3a6a2ebec48639658a20241f6efb11786 100644 (file)
@@ -58,6 +58,7 @@ namespace {
   CACHE_LINE_ALIGNMENT
 
   int BSFTable[64];
+  int MS1BTable[256];
   Bitboard RTable[0x19000]; // Storage space for rook attacks
   Bitboard BTable[0x1480];  // Storage space for bishop attacks
 
@@ -112,7 +113,7 @@ Square first_1(Bitboard b) {
 // Use type-punning
 union b_union {
 
-    Bitboard b;
+    Bitboard dummy;
     struct {
 #if defined (BIGENDIAN)
         uint32_t h;
@@ -121,37 +122,59 @@ union b_union {
         uint32_t l;
         uint32_t h;
 #endif
-    } dw;
+    } b;
 };
 
-Square pop_1st_bit(Bitboard* bb) {
-
-   b_union u;
-   Square ret;
+Square pop_1st_bit(Bitboard* b) {
 
-   u.b = *bb;
+   const b_union u = *((b_union*)b);
 
-   if (u.dw.l)
+   if (u.b.l)
    {
-       ret = Square(BSFTable[((u.dw.l ^ (u.dw.l - 1)) * 0x783A9B23) >> 26]);
-       u.dw.l &= (u.dw.l - 1);
-       *bb = u.b;
-       return ret;
+       ((b_union*)b)->b.l = u.b.l & (u.b.l - 1);
+       return Square(BSFTable[((u.b.l ^ (u.b.l - 1)) * 0x783A9B23) >> 26]);
    }
-   ret = Square(BSFTable[((~(u.dw.h ^ (u.dw.h - 1))) * 0x783A9B23) >> 26]);
-   u.dw.h &= (u.dw.h - 1);
-   *bb = u.b;
-   return ret;
+
+   ((b_union*)b)->b.h = u.b.h & (u.b.h - 1);
+   return Square(BSFTable[((~(u.b.h ^ (u.b.h - 1))) * 0x783A9B23) >> 26]);
 }
 
-#endif // !defined(USE_BSFQ)
+Square last_1(Bitboard b) {
+
+  int result = 0;
+
+  if (b > 0xFFFFFFFF)
+  {
+      b >>= 32;
+      result = 32;
+  }
+
+  if (b > 0xFFFF)
+  {
+      b >>= 16;
+      result += 16;
+  }
 
+  if (b > 0xFF)
+  {
+      b >>= 8;
+      result += 8;
+  }
+
+  return Square(result + MS1BTable[b]);
+}
+
+#endif // !defined(USE_BSFQ)
 
 /// bitboards_init() initializes various bitboard arrays. It is called during
 /// program initialization.
 
 void bitboards_init() {
 
+  for (int k = 0, i = 0; i < 8; i++)
+      while (k < (2 << i))
+          MS1BTable[k++] = i;
+
   for (Bitboard b = 0; b < 256; b++)
       BitCount8Bit[b] = (uint8_t)popcount<Max15>(b);