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
// Use type-punning
union b_union {
- Bitboard b;
+ Bitboard dummy;
struct {
#if defined (BIGENDIAN)
uint32_t h;
uint32_t l;
uint32_t h;
#endif
- } dw;
+ } b;
};
-Square pop_1st_bit(Bitboard* bb) {
-
- b_union u;
- Square ret;
+Square pop_1st_bit(Bitboard* b) {
- u.b = *bb;
+ const b_union u = *((b_union*)b);
- if (u.dw.l)
+ if (u.b.l)
{
- ret = Square(BSFTable[((u.dw.l ^ (u.dw.l - 1)) * 0x783A9B23) >> 26]);
- u.dw.l &= (u.dw.l - 1);
- *bb = u.b;
- return ret;
+ ((b_union*)b)->b.l = u.b.l & (u.b.l - 1);
+ return Square(BSFTable[((u.b.l ^ (u.b.l - 1)) * 0x783A9B23) >> 26]);
}
- ret = Square(BSFTable[((~(u.dw.h ^ (u.dw.h - 1))) * 0x783A9B23) >> 26]);
- u.dw.h &= (u.dw.h - 1);
- *bb = u.b;
- return ret;
+
+ ((b_union*)b)->b.h = u.b.h & (u.b.h - 1);
+ return Square(BSFTable[((~(u.b.h ^ (u.b.h - 1))) * 0x783A9B23) >> 26]);
}
#endif // !defined(USE_BSFQ)
+#if !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.
else
BSFTable[((1ULL << i) * 0x218A392CD3D5DBFULL) >> 58] = i;
+ MS1BTable[0] = 0;
+ for (int i = 0, k = 1; i < 8; i++)
+ for (int j = 0; j < (1 << i); j++)
+ MS1BTable[k++] = i;
+
int steps[][9] = { {}, { 7, 9 }, { 17, 15, 10, 6, -6, -10, -15, -17 },
{}, {}, {}, { 9, 7, -7, -9, 8, 1, -1, -8 } };