#elif !defined(USE_BSFQ)
-CACHE_LINE_ALIGNMENT
-static const int BitTable[64] = {
+static CACHE_LINE_ALIGNMENT
+const int BitTable[64] = {
63, 30, 3, 32, 25, 41, 22, 33, 15, 50, 42, 13, 11, 53, 19, 34, 61, 29, 2,
51, 21, 43, 45, 10, 18, 47, 1, 54, 9, 57, 0, 35, 62, 31, 40, 4, 49, 5, 52,
26, 60, 6, 23, 44, 46, 27, 56, 16, 7, 39, 48, 24, 59, 14, 12, 55, 38, 28,
Bitboard b;
struct {
+#if defined (BIGENDIAN)
+ uint32_t h;
+ uint32_t l;
+#else
uint32_t l;
uint32_t h;
+#endif
} dw;
};
-// WARNING: Needs -fno-strict-aliasing compiler option
Square pop_1st_bit(Bitboard* bb) {
- b_union u;
-
- u.b = *bb;
+ b_union* u;
+ Square ret;
- if (u.dw.l)
- {
- *((uint32_t*)bb) = u.dw.l & (u.dw.l - 1);
- return Square(BitTable[((u.dw.l ^ (u.dw.l - 1)) * 0x783a9b23) >> 26]);
- }
+ u = (b_union*)bb;
- *((uint32_t*)bb+1) = u.dw.h & (u.dw.h - 1); // Little endian only?
- return Square(BitTable[((~(u.dw.h ^ (u.dw.h - 1))) * 0x783a9b23) >> 26]);
+ if (u->dw.l)
+ {
+ ret = Square(BitTable[((u->dw.l ^ (u->dw.l - 1)) * 0x783a9b23) >> 26]);
+ u->dw.l &= (u->dw.l - 1);
+ return ret;
+ }
+ ret = Square(BitTable[((~(u->dw.h ^ (u->dw.h - 1))) * 0x783a9b23) >> 26]);
+ u->dw.h &= (u->dw.h - 1);
+ return ret;
}
#endif
+int bitScanReverse32(uint32_t b)
+{
+ int result = 0;
+
+ if (b > 0xFFFF) {
+ b >>= 16;
+ result += 16;
+ }
+ if (b > 0xFF) {
+ b >>= 8;
+ result += 8;
+ }
+ if (b > 0xF) {
+ b >>= 4;
+ result += 4;
+ }
+ if (b > 0x3) {
+ b >>= 2;
+ result += 2;
+ }
+ return result + (b > 0) + (b > 1);
+}
+
namespace {
// All functions below are used to precompute various bitboards during