]> git.sesse.net Git - stockfish/blobdiff - src/bitboard.cpp
Rename pawn_rank() in relative_rank()
[stockfish] / src / bitboard.cpp
index 458f9318f9d00d0d6c3b716c6268a78d7caef9de..8250e829713020bb7d13cf061eb41f39bc9082e6 100644 (file)
 //// Includes
 ////
 
+#ifdef _MSC_VER
+    #include <intrin.h>
+    #ifdef _WIN64
+        #pragma intrinsic(_BitScanForward64)
+    #else
+        #pragma intrinsic(_BitScanForward)
+    #endif
+    #define USING_INTRINSICS
+#endif
+
 #include <iostream>
 
 #include "bitboard.h"
@@ -274,7 +284,7 @@ namespace {
 #if defined(USE_COMPACT_ROOK_ATTACKS)
   void init_file_and_rank_attacks();
 #endif
-};
+}
 
 
 ////
@@ -339,20 +349,30 @@ 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(_WIN32)
+#if defined(USE_32BIT_ATTACKS) && defined(_MSC_VER)
 
-Square pop_1st_bit(Bitboard *bb) {
+// On 32bit system compiled with MSVC this verion seems
+// slightly faster then the standard one.
 
-  uint32_t  a = uint32_t(*bb);
-  uint32_t* ptr = a ? (uint32_t*)bb : (uint32_t*)bb + 1; // Little endian only?
-  uint32_t  b = a ? a : *ptr;
-  uint32_t  c = ~(b ^ (b - 1));
+Square pop_1st_bit(Bitboard *b) {
 
-  *ptr = b & c; // clear the bit
-  if (a)
-     c = ~c;
+    unsigned long index;
+    uint32_t *l, *h;
 
-  return Square(BitTable[(c * 0x783a9b23) >> 26]);
+    if (*(l = (uint32_t*)b) != 0)
+    {
+        _BitScanForward(&index, *l);
+        *l &= ~(1 << index);
+    }
+    else if (*(h = (uint32_t*)b + 1) != 0)
+    {
+        _BitScanForward(&index, *h);
+        *h &= ~(1 << index);
+        index += 32;
+    } else
+        return SQ_NONE;
+
+    return Square(index);
 }
 
 #else