Author: Gerd Isenberg
Date: 09:25:34 02/24/06
Go up one level in this thread
I quick editor hack of one diagonal to look for the number of compares/test.
128 64-bit cases, for the a1-h8 diagonal from e5 (msvc6, 32-bit).
counting "cmp" in foo.asm
285 occurrence(s) have been found.
counting "test" in foo.asm
33 occurrence(s) have been found
So on average only 318/128 == ~2.48 cmp/test per case, not that bad -
considering the benefit of the routine...
Other rays and squares, specially ranks, may be much cheaper.
Since raystates and piece squares don't change so randomly during the search, i
guess the branch predictor is quite often right.
Dann - i have to admit your approach has some merits!
#include <stdio.h>
enum {
a1,b1,c1,d1,e1,f1,g1,h1,
a2,b2,c2,d2,e2,f2,g2,h2,
a3,b3,c3,d3,e3,f3,g3,h3,
a4,b4,c4,d4,e4,f4,g4,h4,
a5,b5,c5,d5,e5,f5,g5,h5,
a6,b6,c6,d6,e6,f6,g6,h6,
a7,b7,c7,d7,e7,f7,g7,h7,
a8,b8,c8,d8,e8,f8,g8,h8,
};
typedef unsigned __int64 BitBoard;
#define ONE ((BitBoard)(1))
#define A1 (ONE<<a1)
#define A2 (ONE<<a2)
#define A3 (ONE<<a3)
#define A4 (ONE<<a4)
#define A5 (ONE<<a5)
#define A6 (ONE<<a6)
#define A7 (ONE<<a7)
#define A8 (ONE<<a8)
#define B1 (ONE<<b1)
#define B2 (ONE<<b2)
#define B3 (ONE<<b3)
#define B4 (ONE<<b4)
#define B5 (ONE<<b5)
#define B6 (ONE<<b6)
#define B7 (ONE<<b7)
#define B8 (ONE<<b8)
#define C1 (ONE<<c1)
#define C2 (ONE<<c2)
#define C3 (ONE<<c3)
#define C4 (ONE<<c4)
#define C5 (ONE<<c5)
#define C6 (ONE<<c6)
#define C7 (ONE<<c7)
#define C8 (ONE<<c8)
#define D1 (ONE<<d1)
#define D2 (ONE<<d2)
#define D3 (ONE<<d3)
#define D4 (ONE<<d4)
#define D5 (ONE<<d5)
#define D6 (ONE<<d6)
#define D7 (ONE<<d7)
#define D8 (ONE<<d8)
#define E1 (ONE<<e1)
#define E2 (ONE<<e2)
#define E3 (ONE<<e3)
#define E4 (ONE<<e4)
#define E5 (ONE<<e5)
#define E6 (ONE<<e6)
#define E7 (ONE<<e7)
#define E8 (ONE<<e8)
#define F1 (ONE<<f1)
#define F2 (ONE<<f2)
#define F3 (ONE<<f3)
#define F4 (ONE<<f4)
#define F5 (ONE<<f5)
#define F6 (ONE<<f6)
#define F7 (ONE<<f7)
#define F8 (ONE<<f8)
#define G1 (ONE<<g1)
#define G2 (ONE<<g2)
#define G3 (ONE<<g3)
#define G4 (ONE<<g4)
#define G5 (ONE<<g5)
#define G6 (ONE<<g6)
#define G7 (ONE<<g7)
#define G8 (ONE<<g8)
#define H1 (ONE<<h1)
#define H2 (ONE<<h2)
#define H3 (ONE<<h3)
#define H4 (ONE<<h4)
#define H5 (ONE<<h5)
#define H6 (ONE<<h6)
#define H7 (ONE<<h7)
#define H8 (ONE<<h8)
int fooE5(BitBoard bb)
{
switch (bb)
{
case A1|B2|C3|D4|F6|G7|H8: return 1;
case A1|B2|C3|D4|F6|G7 : return 2;
case A1|B2|C3|D4|F6| H8: return 3;
case A1|B2|C3|D4|F6 : return 4;
case A1|B2|C3|D4 |G7|H8: return 5;
case A1|B2|C3|D4 |G7 : return 6;
case A1|B2|C3|D4 | H8: return 7;
case A1|B2|C3|D4 : return 8;
case A1|B2|C3 |F6|G7|H8: return 9;
case A1|B2|C3 |F6|G7 : return 10;
case A1|B2|C3 |F6| H8: return 11;
case A1|B2|C3 |F6 : return 12;
case A1|B2|C3 |G7|H8: return 13;
case A1|B2|C3 |G7 : return 14;
case A1|B2|C3 | H8: return 15;
case A1|B2|C3 : return 16;
case A1|B2 |D4|F6|G7|H8: return 17;
case A1|B2 |D4|F6|G7 : return 18;
case A1|B2 |D4|F6| H8: return 19;
case A1|B2 |D4|F6 : return 20;
case A1|B2 |D4 |G7|H8: return 21;
case A1|B2 |D4 |G7 : return 22;
case A1|B2 |D4 | H8: return 23;
case A1|B2 |D4 : return 24;
case A1|B2 |F6|G7|H8: return 25;
case A1|B2 |F6|G7 : return 26;
case A1|B2 |F6| H8: return 27;
case A1|B2 |F6 : return 28;
case A1|B2 |G7|H8: return 29;
case A1|B2 |G7 : return 30;
case A1|B2 | H8: return 31;
case A1|B2 : return 32;
case A1 |C3|D4|F6|G7|H8: return 33;
case A1 |C3|D4|F6|G7 : return 34;
case A1 |C3|D4|F6| H8: return 35;
case A1 |C3|D4|F6 : return 36;
case A1 |C3|D4 |G7|H8: return 37;
case A1 |C3|D4 |G7 : return 38;
case A1 |C3|D4 | H8: return 39;
case A1 |C3|D4 : return 40;
case A1 |C3 |F6|G7|H8: return 41;
case A1 |C3 |F6|G7 : return 42;
case A1 |C3 |F6| H8: return 43;
case A1 |C3 |F6 : return 44;
case A1 |C3 |G7|H8: return 45;
case A1 |C3 |G7 : return 46;
case A1 |C3 | H8: return 47;
case A1 |C3 : return 48;
case A1 |D4|F6|G7|H8: return 49;
case A1 |D4|F6|G7 : return 50;
case A1 |D4|F6| H8: return 51;
case A1 |D4|F6 : return 52;
case A1 |D4 |G7|H8: return 53;
case A1 |D4 |G7 : return 54;
case A1 |D4 | H8: return 55;
case A1 |D4 : return 56;
case A1 |F6|G7|H8: return 57;
case A1 |F6|G7 : return 58;
case A1 |F6| H8: return 59;
case A1 |F6 : return 60;
case A1 |G7|H8: return 61;
case A1 |G7 : return 62;
case A1 | H8: return 63;
case A1 : return 64;
case B2|C3|D4|F6|G7|H8: return 65;
case B2|C3|D4|F6|G7 : return 66;
case B2|C3|D4|F6| H8: return 67;
case B2|C3|D4|F6 : return 68;
case B2|C3|D4 |G7|H8: return 69;
case B2|C3|D4 |G7 : return 70;
case B2|C3|D4 | H8: return 71;
case B2|C3|D4 : return 72;
case B2|C3 |F6|G7|H8: return 73;
case B2|C3 |F6|G7 : return 74;
case B2|C3 |F6| H8: return 75;
case B2|C3 |F6 : return 76;
case B2|C3 |G7|H8: return 77;
case B2|C3 |G7 : return 78;
case B2|C3 | H8: return 79;
case B2|C3 : return 80;
case B2 |D4|F6|G7|H8: return 81;
case B2 |D4|F6|G7 : return 82;
case B2 |D4|F6| H8: return 83;
case B2 |D4|F6 : return 84;
case B2 |D4 |G7|H8: return 85;
case B2 |D4 |G7 : return 86;
case B2 |D4 | H8: return 87;
case B2 |D4 : return 88;
case B2 |F6|G7|H8: return 89;
case B2 |F6|G7 : return 90;
case B2 |F6| H8: return 91;
case B2 |F6 : return 92;
case B2 |G7|H8: return 93;
case B2 |G7 : return 94;
case B2 | H8: return 95;
case B2 : return 96;
case C3|D4|F6|G7|H8: return 97;
case C3|D4|F6|G7 : return 98;
case C3|D4|F6| H8: return 99;
case C3|D4|F6 : return 100;
case C3|D4 |G7|H8: return 101;
case C3|D4 |G7 : return 102;
case C3|D4 | H8: return 103;
case C3|D4 : return 104;
case C3 |F6|G7|H8: return 105;
case C3 |F6|G7 : return 106;
case C3 |F6| H8: return 107;
case C3 |F6 : return 108;
case C3 |G7|H8: return 109;
case C3 |G7 : return 110;
case C3 | H8: return 111;
case C3 : return 112;
case D4|F6|G7|H8: return 113;
case D4|F6|G7 : return 114;
case D4|F6| H8: return 115;
case D4|F6 : return 116;
case D4 |G7|H8: return 117;
case D4 |G7 : return 118;
case D4 | H8: return 119;
case D4 : return 120;
case F6|G7|H8: return 121;
case F6|G7 : return 122;
case F6| H8: return 123;
case F6 : return 124;
case G7|H8: return 125;
case G7 : return 126;
case H8: return 127;
case 0: return 128;
}
return 12;
}
BitBoard table[] = {
A1|B2|C3|D4|F6|G7|H8,
B2|C3|D4|F6|G7|H8,
C3|D4|F6|G7|H8,
B2 |F6|G7 ,
};
#define N_ITEMS (sizeof(table)/sizeof(table[0]))
int main(void)
{
int count = 0;
for (int i = 0; i < N_ITEMS; i++) {
count += fooE5(table[i]);
}
printf("Here we are %d\n", count);
return 0;
}
This page took 0 seconds to execute
Last modified: Thu, 15 Apr 21 08:11:13 -0700
Current Computer Chess Club Forums at Talkchess. This site by Sean Mintz.