This is my move generator for the bishop.
Code: Select all
case WB:
case BB:
blockers = aPieces & bob[fs];
bb = bss[fs][(blockers >> 9) & 63][0]
& bss[fs][(blockers >> 17) & 63][1]
& bss[fs][(blockers >> 25) & 63][2]
& bss[fs][(blockers >> 33) & 63][3]
& bss[fs][(blockers >> 41) & 63][4]
& bss[fs][(blockers >> 49) & 63][5]
& notme;
break;
This is the initialization code.
Code: Select all
void InitializeBSS() {
u08 sq, sqr, i, j, k, l;
s08 x, dx, y, dy;
u64 b, bb;
for (sq = 0; sq < 64; sq++) {
y = sq >> 3;
x = sq & 7;
for (i = 0; i < 128; i++) {
if (i ^ 1) {
j = i >> 1;
for (k = 8, l = 0; k <= 48; k += 8, l++) {
bb = 0;
b = (u64)i << k;
for (dx = +1, dy = +1; x + dx < +8 && y + dy < +8; dx++, dy++) {
sqr = (((y + dy) << 3) + x + dx);
bb |= one << sqr;
if ((one << sqr) & b) break;
}
for (dx = -1, dy = +1; x + dx > -1 && y + dy < +8; dx--, dy++) {
sqr = (((y + dy) << 3) + x + dx);
bb |= one << sqr;
if ((one << sqr) & b) break;
}
for (dx = +1, dy = -1; x + dx < +8 && y + dy > -1; dx++, dy--) {
sqr = (((y + dy) << 3) + x + dx);
bb |= one << sqr;
if ((one << sqr) & b) break;
}
for (dx = -1, dy = -1; x + dx > -1 && y + dy > -1; dx--, dy--) {
sqr = (((y + dy) << 3) + x + dx);
bb |= one << sqr;
if ((one << sqr) & b) break;
}
bss[sq][j][l] = bb;
}
}
}
}
}00000000
0x000000
00x000x0
000x0x00
00000000
000x0x00
00x000x0
00000000
After shifting upper 32 bits down by 24.
0x000000
00xx0xx0
00xx0xx0
00000000
After shifting rank 4 down.
00000000
0xxx0xx0
00xx0xx0
00000000
All the bits share two ranks without collisions and therefor the bishop code would look like this.
Code: Select all
case WB:
case BB:
blockers = aPieces & bob[fs];
// fold the blockers down to two ranks
bb = bss[fs][(blockers >> 9) & 63][0]
& bss[fs][(blockers >> 17) & 63][1]
& notme;
break;
Will that be faster than magic bishops? If so then help me end the universe and produce something faster than magics, lol.