Rewrite pop_1st_bit() to be endian independent
[stockfish] / src / bitboard.cpp
index 321055e826dba25609ab2ce00e0f5743080fcca7..40cdbb21ff956601238b0db0dc72176e5cb081cb 100644 (file)
@@ -92,33 +92,13 @@ Square first_1(Bitboard b) {
   return Square(BSFTable[(fold * 0x783A9B23) >> 26]);
 }
 
-// Use type-punning
-union b_union {
-
-    Bitboard dummy;
-    struct {
-#if defined (BIGENDIAN)
-        uint32_t h;
-        uint32_t l;
-#else
-        uint32_t l;
-        uint32_t h;
-#endif
-    } b;
-};
-
 Square pop_1st_bit(Bitboard* b) {
 
-   const b_union u = *((b_union*)b);
-
-   if (u.b.l)
-   {
-       ((b_union*)b)->b.l = u.b.l & (u.b.l - 1);
-       return Square(BSFTable[((u.b.l ^ (u.b.l - 1)) * 0x783A9B23) >> 26]);
-   }
-
-   ((b_union*)b)->b.h = u.b.h & (u.b.h - 1);
-   return Square(BSFTable[((~(u.b.h ^ (u.b.h - 1))) * 0x783A9B23) >> 26]);
+  Bitboard bb = *b;
+  *b = bb & (bb - 1);
+  bb ^= (bb - 1);
+  uint32_t fold = unsigned(bb) ^ unsigned(bb >> 32);
+  return Square(BSFTable[(fold * 0x783A9B23) >> 26]);
 }
 
 Square last_1(Bitboard b) {