]> git.sesse.net Git - stockfish/blobdiff - src/bitboard.cpp
Big trailing whitespace cleanup part 1
[stockfish] / src / bitboard.cpp
index 8250e829713020bb7d13cf061eb41f39bc9082e6..89b543212998155cbeb91b4f6040dd2bfaeaa541 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.
@@ -249,8 +250,8 @@ Bitboard BMask[64];
 int BAttackIndex[64];
 Bitboard BAttacks[0x1480];
 
-Bitboard SetMaskBB[64];
-Bitboard ClearMaskBB[64];
+Bitboard SetMaskBB[65];
+Bitboard ClearMaskBB[65];
 
 Bitboard StepAttackBB[16][64];
 Bitboard RayBB[64][8];
@@ -349,30 +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(_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;
-    uint32_t *l, *h;
+// WARNING: Needs -fno-strict-aliasing compiler option
+Square pop_1st_bit(Bitboard *bb) {
 
-    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);
+  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
@@ -423,6 +433,8 @@ namespace {
   // be necessary to touch any of them.
 
   void init_masks() {
+    SetMaskBB[SQ_NONE] = 0ULL;
+    ClearMaskBB[SQ_NONE] = ~SetMaskBB[SQ_NONE];
     for(Square s = SQ_A1; s <= SQ_H8; s++) {
       SetMaskBB[s] = (1ULL << s);
       ClearMaskBB[s] = ~SetMaskBB[s];