3 Copyright (c) Scott Gasch
11 Unit test for the bitboard code.
24 void TestBitboards(void)
29 Sanity check bitboard code and benchmark the different ways to
45 BITBOARD bbSpeed[1000];
49 Trace("Testing bitboard operations...\n");
52 // Make a table of 1000 random bitboards
60 for (v = 0; v < w; v++)
63 ASSERT(SLOWCOOR_TO_BB(z) == COOR_TO_BB(z));
71 // Various benchmaring code.
73 u64 = SystemReadTimeStampCounter();
74 for (u = 0; u < 1000000; u++)
77 bb = SLOWCOOR_TO_BB(b);
79 printf(" SLOWCOOR_TO_BB: %" COMPILER_LONGLONG_UNSIGNED_FORMAT
81 (SystemReadTimeStampCounter() - u64) / 1000000);
82 u64 = SystemReadTimeStampCounter();
83 for (u = 0; u < 1000000; u++)
88 printf(" COOR_TO_BB: %" COMPILER_LONGLONG_UNSIGNED_FORMAT
90 (SystemReadTimeStampCounter() - u64) / 1000000);
92 u64 = SystemReadTimeStampCounter();
93 for (v = 1; v < 1000; v++)
95 for (u = 0; u < 1000; u++)
97 b = SlowCountBits(bbSpeed[u]);
100 printf(" SlowCountBits: %" COMPILER_LONGLONG_UNSIGNED_FORMAT
102 (SystemReadTimeStampCounter() - u64) / (1000 * 1000));
104 u64 = SystemReadTimeStampCounter();
105 for (v = 0; v < 1000; v++)
107 for (u = 0; u < 1000; u++)
109 b = CountBits(bbSpeed[u]);
112 printf(" CountBits: %" COMPILER_LONGLONG_UNSIGNED_FORMAT
114 (SystemReadTimeStampCounter() - u64) / (1000 * 1000));
116 u64 = SystemReadTimeStampCounter();
117 for (v = 0; v < 1000; v++)
119 for (u = 0; u < 1000; u++)
121 b = SlowLastBit(bbSpeed[u]);
124 printf(" SlowLastBit: %" COMPILER_LONGLONG_UNSIGNED_FORMAT
126 (SystemReadTimeStampCounter() - u64) / (1000 * 1000));
128 u64 = SystemReadTimeStampCounter();
129 for (v = 0; v < 1000; v++)
131 for (u = 0; u < 1000; u++)
133 b = LastBit(bbSpeed[u]);
136 printf(" LastBit: %" COMPILER_LONGLONG_UNSIGNED_FORMAT
138 (SystemReadTimeStampCounter() - u64) / (1000 * 1000));
140 u64 = SystemReadTimeStampCounter();
141 for (v = 0; v < 1000; v++)
143 for (u = 0; u < 1000; u++)
145 b = SlowFirstBit(bbSpeed[u]);
148 printf(" SlowFirstBit: %" COMPILER_LONGLONG_UNSIGNED_FORMAT
150 (SystemReadTimeStampCounter() - u64) / (1000 * 1000));
152 u64 = SystemReadTimeStampCounter();
153 for (v = 0; v < 1000; v++)
155 for (u = 0; u < 1000; u++)
157 b = DeBruijnFirstBit(bbSpeed[u]);
160 printf(" DeBruijnFirstBit: %" COMPILER_LONGLONG_UNSIGNED_FORMAT
162 (SystemReadTimeStampCounter() - u64) / (1000 * 1000));
164 u64 = SystemReadTimeStampCounter();
165 for (v = 0; v < 1000; v++)
167 for (u = 0; u < 1000; u++)
169 b = FirstBit(bbSpeed[u]);
172 printf(" FirstBit: %" COMPILER_LONGLONG_UNSIGNED_FORMAT
174 (SystemReadTimeStampCounter() - u64) / (1000 * 1000));
179 if (!IS_ON_BOARD(c)) continue;
181 if (BIT_NUMBER_TO_COOR(COOR_TO_BIT_NUMBER(c)) != c)
183 UtilPanic(TESTCASE_FAILURE,
185 "bit number to coor / coor to bit number",
191 if (SLOW_BIT_NUMBER_TO_COOR(COOR_TO_BIT_NUMBER(c)) != c)
193 UtilPanic(TESTCASE_FAILURE,
195 "slow bit number to coor / coor to bit number",
201 if (BIT_NUMBER_TO_COOR(COOR_TO_BIT_NUMBER(c)) !=
202 SLOW_BIT_NUMBER_TO_COOR(COOR_TO_BIT_NUMBER(c)))
204 UtilPanic(TESTCASE_FAILURE,
206 "bit number to coor / slow bit number to coor",
217 if (COOR_TO_BIT_NUMBER(BIT_NUMBER_TO_COOR(b)) != (b))
219 UtilPanic(TESTCASE_FAILURE,
221 "coor to bit number / bit number to coor",
229 bb |= COOR_TO_BB(A6);
230 bb |= COOR_TO_BB(A8);
231 bb |= COOR_TO_BB(B6);
232 bb |= COOR_TO_BB(H2);
233 if (CountBits(bb) != 5)
235 UtilPanic(TESTCASE_FAILURE,
236 NULL, "CountBits", NULL, NULL,
240 if (CountBits(bb) != 3)
242 UtilPanic(TESTCASE_FAILURE,
243 NULL, "CountBits", NULL, NULL,
247 while(IS_ON_BOARD(c = CoorFromBitBoardRank8ToRank1(&bb)))
250 if ((c != A4) && (c != A6) && (c != A8))
252 UtilPanic(TESTCASE_FAILURE,
253 NULL, "CoorFromBitBoardRank8ToRank1", NULL, NULL,
260 UtilPanic(TESTCASE_FAILURE,
261 NULL, "CoorFromBitBoardRank8ToRank1", NULL, NULL,
265 bb = SLOWCOOR_TO_BB(A4) | SLOWCOOR_TO_BB(H2);
266 bb |= SLOWCOOR_TO_BB(D4) | SLOWCOOR_TO_BB(F6) | SLOWCOOR_TO_BB(F4);
267 if (CountBits(bb) != 5)
269 UtilPanic(TESTCASE_FAILURE,
270 NULL, "CountBits", NULL, NULL,
274 if (CountBits(bb) != 3)
276 UtilPanic(TESTCASE_FAILURE,
277 NULL, "CountBits", NULL, NULL,
281 while(IS_ON_BOARD(c = CoorFromBitBoardRank1ToRank8(&bb)))
284 if ((c != A4) && (c != D4) && (c != F4))
286 UtilPanic(TESTCASE_FAILURE,
287 NULL, "CoorFromBitBoardRank1ToRank8", NULL, NULL,
294 UtilPanic(TESTCASE_FAILURE,
295 NULL, "CoorFromBitBoardRank1ToRank8", NULL, NULL,