]> git.sesse.net Git - stockfish/blobdiff - src/bitboard.cpp
Templetize Position::xxx_attacks_square()
[stockfish] / src / bitboard.cpp
index 298db7a7ee357764540bd61990df8f84929e63a6..89065c49fe81eb11d0328e08b121cb0018c23f77 100644 (file)
 //// Includes
 ////
 
-#ifdef _MSC_VER\r
-    #include <intrin.h>\r
-    #ifdef _WIN64\r
-        #pragma intrinsic(_BitScanForward64)\r
-    #else\r
-        #pragma intrinsic(_BitScanForward)\r
-    #endif\r
-    #define USING_INTRINSICS\r
+#ifdef _MSC_VER
+    #include <intrin.h>
+    #ifdef _WIN64
+        #pragma intrinsic(_BitScanForward64)
+    #else
+        #pragma intrinsic(_BitScanForward)
+    #endif
+    #define USING_INTRINSICS
 #endif
 
 #include <iostream>
@@ -284,7 +284,7 @@ namespace {
 #if defined(USE_COMPACT_ROOK_ATTACKS)
   void init_file_and_rank_attacks();
 #endif
-};
+}
 
 
 ////
@@ -349,30 +349,39 @@ Square first_1(Bitboard b) {
 /// pop_1st_bit() finds and clears the least significant nonzero bit in a
 /// nonzero bitboard.
 
-#if defined(USE_32BIT_ATTACKS) && defined(_MSC_VER)
+#if defined(USE_32BIT_ATTACKS)
 
-// On 32bit system compiled with MSVC this verion seems
-// slightly faster then the standard one.
+// Use type-punning
+union b_union {
 
-Square pop_1st_bit(Bitboard *b) {
+    Bitboard b;
+    struct {
+        uint32_t l;
+        uint32_t h;
+    };
+};
 
-    unsigned long index;\r
-    uint32_t *l, *h;\r
-\r
-    if (*(l = (uint32_t*)b) != 0)\r
-    {\r
-        _BitScanForward(&index, *l);\r
-        *l &= ~(1 << index);\r
-    } \r
-    else if (*(h = (uint32_t*)b + 1) != 0)\r
-    {\r
-        _BitScanForward(&index, *h);\r
-        *h &= ~(1 << index);\r
-        index += 32;\r
-    } else\r
-        return SQ_NONE;\r
-\r
-    return Square(index);
+// WARNING: Needs -fno-strict-aliasing compiler option
+Square pop_1st_bit(Bitboard *bb) {
+
+  b_union u;
+  uint32_t b;
+
+  u.b = *bb;
+
+  if (u.l)
+  {
+      b = u.l;
+      *((uint32_t*)bb) = b & (b - 1);
+      b ^= (b - 1);
+  }
+  else
+  {
+      b = u.h;
+      *((uint32_t*)bb+1) = b & (b - 1); // Little endian only?
+      b = ~(b ^ (b - 1));
+  }
+  return Square(BitTable[(b * 0x783a9b23) >> 26]);
 }
 
 #else