CACHE_LINE_ALIGNMENT
int BSFTable[64];
+ int MS1BTable[256];
Bitboard RTable[0x19000]; // Storage space for rook attacks
Bitboard BTable[0x1480]; // Storage space for bishop attacks
return Square(BSFTable[((~(u.b.h ^ (u.b.h - 1))) * 0x783A9B23) >> 26]);
}
-#endif // !defined(USE_BSFQ)
+Square last_1(Bitboard b) {
+
+ int result = 0;
+
+ if (b > 0xFFFFFFFF)
+ {
+ b >>= 32;
+ result = 32;
+ }
+ if (b > 0xFFFF)
+ {
+ b >>= 16;
+ result += 16;
+ }
+
+ if (b > 0xFF)
+ {
+ b >>= 8;
+ result += 8;
+ }
+
+ return Square(result + MS1BTable[b]);
+}
+
+#endif // !defined(USE_BSFQ)
/// bitboards_init() initializes various bitboard arrays. It is called during
/// program initialization.
void bitboards_init() {
+ for (int k = 0, i = 0; i < 8; i++)
+ while (k < (2 << i))
+ MS1BTable[k++] = i;
+
for (Bitboard b = 0; b < 256; b++)
BitCount8Bit[b] = (uint8_t)popcount<Max15>(b);