diff options
| author | Scott Gasch <[email protected]> | 2016-06-01 18:58:58 -0700 |
|---|---|---|
| committer | Scott Gasch <[email protected]> | 2016-06-01 18:58:58 -0700 |
| commit | 3fd43cd5fcb22bb65bf2a92a25d95d801b11c9e0 (patch) | |
| tree | 9b6443235d16ba17f094a1a1c7ae53d2bcb9267b /src/testbitboard.c | |
Initial checkin for typhoon chess engine.
Diffstat (limited to 'src/testbitboard.c')
| -rw-r--r-- | src/testbitboard.c | 299 |
1 files changed, 299 insertions, 0 deletions
diff --git a/src/testbitboard.c b/src/testbitboard.c new file mode 100644 index 0000000..7d2bfeb --- /dev/null +++ b/src/testbitboard.c @@ -0,0 +1,299 @@ +/** + +Copyright (c) Scott Gasch + +Module Name: + + testbitboard.c + +Abstract: + + Unit test for the bitboard code. + +Author: + + Scott Gasch ([email protected]) 19 Oct 2004 + +Revision History: + +**/ + +#ifdef TEST +#include "chess.h" + +void TestBitboards(void) +/** + +Routine description: + + Sanity check bitboard code and benchmark the different ways to + twiddle bits. + +Parameters: + + void + +Return value: + + void + +**/ +{ + COOR c; + ULONG b; + BITBOARD bb; + BITBOARD bbSpeed[1000]; + ULONG u, v, w, z; + UINT64 u64; + + Trace("Testing bitboard operations...\n"); + + // + // Make a table of 1000 random bitboards + // + for (u = 0; + u < 1000; + u++) + { + bbSpeed[u] = 0; + w = rand() % 24; + for (v = 0; v < w; v++) + { + z = RANDOM_COOR; + ASSERT(SLOWCOOR_TO_BB(z) == COOR_TO_BB(z)); + bb = COOR_TO_BB(z); + bbSpeed[u] |= bb; + } + } + +#if 1 + // + // Various benchmaring code. + // + u64 = SystemReadTimeStampCounter(); + for (u = 0; u < 1000000; u++) + { + b = u % 64; + bb = SLOWCOOR_TO_BB(b); + } + printf(" SLOWCOOR_TO_BB: %" COMPILER_LONGLONG_UNSIGNED_FORMAT + " cycles/op\n", + (SystemReadTimeStampCounter() - u64) / 1000000); + u64 = SystemReadTimeStampCounter(); + for (u = 0; u < 1000000; u++) + { + b = u % 64; + bb = COOR_TO_BB(b); + } + printf(" COOR_TO_BB: %" COMPILER_LONGLONG_UNSIGNED_FORMAT + " cycles/op\n", + (SystemReadTimeStampCounter() - u64) / 1000000); + + u64 = SystemReadTimeStampCounter(); + for (v = 1; v < 1000; v++) + { + for (u = 0; u < 1000; u++) + { + b = SlowCountBits(bbSpeed[u]); + } + } + printf(" SlowCountBits: %" COMPILER_LONGLONG_UNSIGNED_FORMAT + " cycles/op\n", + (SystemReadTimeStampCounter() - u64) / (1000 * 1000)); + + u64 = SystemReadTimeStampCounter(); + for (v = 0; v < 1000; v++) + { + for (u = 0; u < 1000; u++) + { + b = CountBits(bbSpeed[u]); + } + } + printf(" CountBits: %" COMPILER_LONGLONG_UNSIGNED_FORMAT + " cycles/op\n", + (SystemReadTimeStampCounter() - u64) / (1000 * 1000)); + + u64 = SystemReadTimeStampCounter(); + for (v = 0; v < 1000; v++) + { + for (u = 0; u < 1000; u++) + { + b = SlowLastBit(bbSpeed[u]); + } + } + printf(" SlowLastBit: %" COMPILER_LONGLONG_UNSIGNED_FORMAT + " cycles/op\n", + (SystemReadTimeStampCounter() - u64) / (1000 * 1000)); + + u64 = SystemReadTimeStampCounter(); + for (v = 0; v < 1000; v++) + { + for (u = 0; u < 1000; u++) + { + b = LastBit(bbSpeed[u]); + } + } + printf(" LastBit: %" COMPILER_LONGLONG_UNSIGNED_FORMAT + " cycles/op\n", + (SystemReadTimeStampCounter() - u64) / (1000 * 1000)); + + u64 = SystemReadTimeStampCounter(); + for (v = 0; v < 1000; v++) + { + for (u = 0; u < 1000; u++) + { + b = SlowFirstBit(bbSpeed[u]); + } + } + printf(" SlowFirstBit: %" COMPILER_LONGLONG_UNSIGNED_FORMAT + " cycles/op\n", + (SystemReadTimeStampCounter() - u64) / (1000 * 1000)); + + u64 = SystemReadTimeStampCounter(); + for (v = 0; v < 1000; v++) + { + for (u = 0; u < 1000; u++) + { + b = DeBruijnFirstBit(bbSpeed[u]); + } + } + printf(" DeBruijnFirstBit: %" COMPILER_LONGLONG_UNSIGNED_FORMAT + " cycles/op\n", + (SystemReadTimeStampCounter() - u64) / (1000 * 1000)); + + u64 = SystemReadTimeStampCounter(); + for (v = 0; v < 1000; v++) + { + for (u = 0; u < 1000; u++) + { + b = FirstBit(bbSpeed[u]); + } + } + printf(" FirstBit: %" COMPILER_LONGLONG_UNSIGNED_FORMAT + " cycles/op\n", + (SystemReadTimeStampCounter() - u64) / (1000 * 1000)); +#endif + + FOREACH_SQUARE(c) + { + if (!IS_ON_BOARD(c)) continue; + + if (BIT_NUMBER_TO_COOR(COOR_TO_BIT_NUMBER(c)) != c) + { + UtilPanic(TESTCASE_FAILURE, + NULL, + "bit number to coor / coor to bit number", + NULL, + NULL, + __FILE__, __LINE__); + } + + if (SLOW_BIT_NUMBER_TO_COOR(COOR_TO_BIT_NUMBER(c)) != c) + { + UtilPanic(TESTCASE_FAILURE, + NULL, + "slow bit number to coor / coor to bit number", + NULL, + NULL, + __FILE__, __LINE__); + } + + if (BIT_NUMBER_TO_COOR(COOR_TO_BIT_NUMBER(c)) != + SLOW_BIT_NUMBER_TO_COOR(COOR_TO_BIT_NUMBER(c))) + { + UtilPanic(TESTCASE_FAILURE, + NULL, + "bit number to coor / slow bit number to coor", + NULL, + NULL, + __FILE__, __LINE__); + } + } + + for (b = 1; + b < 64; + b++) + { + if (COOR_TO_BIT_NUMBER(BIT_NUMBER_TO_COOR(b)) != (b)) + { + UtilPanic(TESTCASE_FAILURE, + NULL, + "coor to bit number / bit number to coor", + NULL, + NULL, + __FILE__, __LINE__); + } + } + + bb = COOR_TO_BB(A4); + bb |= COOR_TO_BB(A6); + bb |= COOR_TO_BB(A8); + bb |= COOR_TO_BB(B6); + bb |= COOR_TO_BB(H2); + if (CountBits(bb) != 5) + { + UtilPanic(TESTCASE_FAILURE, + NULL, "CountBits", NULL, NULL, + __FILE__, __LINE__); + } + bb &= BBFILE[A]; + if (CountBits(bb) != 3) + { + UtilPanic(TESTCASE_FAILURE, + NULL, "CountBits", NULL, NULL, + __FILE__, __LINE__); + } + b = 0; + while(IS_ON_BOARD(c = CoorFromBitBoardRank8ToRank1(&bb))) + { + b++; + if ((c != A4) && (c != A6) && (c != A8)) + { + UtilPanic(TESTCASE_FAILURE, + NULL, "CoorFromBitBoardRank8ToRank1", NULL, NULL, + __FILE__, __LINE__); + } + } + + if (b != 3) + { + UtilPanic(TESTCASE_FAILURE, + NULL, "CoorFromBitBoardRank8ToRank1", NULL, NULL, + __FILE__, __LINE__); + } + + bb = SLOWCOOR_TO_BB(A4) | SLOWCOOR_TO_BB(H2); + bb |= SLOWCOOR_TO_BB(D4) | SLOWCOOR_TO_BB(F6) | SLOWCOOR_TO_BB(F4); + if (CountBits(bb) != 5) + { + UtilPanic(TESTCASE_FAILURE, + NULL, "CountBits", NULL, NULL, + __FILE__, __LINE__); + } + bb &= BBRANK[4]; + if (CountBits(bb) != 3) + { + UtilPanic(TESTCASE_FAILURE, + NULL, "CountBits", NULL, NULL, + __FILE__, __LINE__); + } + b = 0; + while(IS_ON_BOARD(c = CoorFromBitBoardRank1ToRank8(&bb))) + { + b++; + if ((c != A4) && (c != D4) && (c != F4)) + { + UtilPanic(TESTCASE_FAILURE, + NULL, "CoorFromBitBoardRank1ToRank8", NULL, NULL, + __FILE__, __LINE__); + } + } + + if (b != 3) + { + UtilPanic(TESTCASE_FAILURE, + NULL, "CoorFromBitBoardRank1ToRank8", NULL, NULL, + __FILE__, __LINE__); + } +} +#endif |
