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.