X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fbitboard.cpp;h=f76ed31c3c8263cd7cfb87698f658ed6caab8555;hb=578b21bbeedc41b6e0d1b2df46887b1636a78e2b;hp=32efaedafd55fcd92977babc906d493cb3bf9b85;hpb=54b5b528d9ef6c4f14a2000eead9a5c0686f899e;p=stockfish diff --git a/src/bitboard.cpp b/src/bitboard.cpp index 32efaeda..f76ed31c 100644 --- a/src/bitboard.cpp +++ b/src/bitboard.cpp @@ -69,7 +69,7 @@ namespace { // bsf_index() returns the index into BSFTable[] to look up the bitscan. Uses // Matt Taylor's folding for 32 bit case, extended to 64 bit by Kim Walisch. - FORCE_INLINE unsigned bsf_index(Bitboard b) { + unsigned bsf_index(Bitboard b) { b ^= b - 1; return Is64Bit ? (b * DeBruijn64) >> 58 : ((unsigned(b) ^ unsigned(b >> 32)) * DeBruijn32) >> 26; @@ -249,7 +249,9 @@ namespace { { 728, 10316, 55013, 32803, 12281, 15100, 16645, 255 } }; Bitboard occupancy[4096], reference[4096], edges, b; - int i, size; + int age[4096], current = 0, i, size; + + std::memset(age, 0, sizeof(age)); // attacks[s] is a pointer to the beginning of the attacks table for square 's' attacks[SQ_A1] = table; @@ -298,22 +300,21 @@ namespace { magics[s] = rng.sparse_rand(); while (popcount((magics[s] * masks[s]) >> 56) < 6); - std::memset(attacks[s], 0, size * sizeof(Bitboard)); - // A good magic must map every possible occupancy to an index that // looks up the correct sliding attack in the attacks[s] database. // Note that we build up the database for square 's' as a side // effect of verifying the magic. - for (i = 0; i < size; ++i) + for (++current, i = 0; i < size; ++i) { - Bitboard& attack = attacks[s][index(s, occupancy[i])]; - - if (attack && attack != reference[i]) + unsigned idx = index(s, occupancy[i]); + + if (age[idx] < current) + { + age[idx] = current; + attacks[s][idx] = reference[i]; + } + else if (attacks[s][idx] != reference[i]) break; - - assert(reference[i]); - - attack = reference[i]; } } while (i < size); }