]> git.sesse.net Git - stockfish/blobdiff - src/bitboard.cpp
Unify pinned and discovery checks code
[stockfish] / src / bitboard.cpp
index 458f9318f9d00d0d6c3b716c6268a78d7caef9de..e0cb1c2021b9b65a94a01fbe3d46491bd1e1a31f 100644 (file)
@@ -1,13 +1,14 @@
 /*
-  Glaurung, a UCI chess playing engine.
-  Copyright (C) 2004-2008 Tord Romstad
+  Stockfish, a UCI chess playing engine derived from Glaurung 2.1
+  Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
+  Copyright (C) 2008 Marco Costalba
 
-  Glaurung is free software: you can redistribute it and/or modify
+  Stockfish is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation, either version 3 of the License, or
   (at your option) any later version.
 
-  Glaurung is distributed in the hope that it will be useful,
+  Stockfish is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
 //// 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 +285,7 @@ namespace {
 #if defined(USE_COMPACT_ROOK_ATTACKS)
   void init_file_and_rank_attacks();
 #endif
-};
+}
 
 
 ////
@@ -339,20 +350,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(_WIN32)
+#if defined(USE_32BIT_ATTACKS)
+
+// Use type-punning
+union b_union {
+
+    Bitboard b;
+    struct {
+        uint32_t l;
+        uint32_t h;
+    };
+};
 
+// WARNING: Needs -fno-strict-aliasing compiler option
 Square pop_1st_bit(Bitboard *bb) {
 
-  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));
+  b_union u;
+  uint32_t b;
 
-  *ptr = b & c; // clear the bit
-  if (a)
-     c = ~c;
+  u.b = *bb;
 
-  return Square(BitTable[(c * 0x783a9b23) >> 26]);
+  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