-// 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]);
+Square pop_lsb(Bitboard* b) {
+
+ Bitboard bb = *b;
+ *b = bb & (bb - 1);
+
+ if (Is64Bit)
+ return Square(BSFTable[((bb & -bb) * 0x218A392CD3D5DBFULL) >> 58]);
+
+ bb ^= (bb - 1);
+ uint32_t fold = unsigned(bb) ^ unsigned(bb >> 32);
+ return Square(BSFTable[(fold * 0x783A9B23) >> 26]);