Computer Chess Club Archives


Search

Terms

Messages

Subject: sample assembly [long post]

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.