X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fbitboard.cpp;h=f6504aa9098b6aa808cdc89d1957c5da18930c1f;hp=32efaedafd55fcd92977babc906d493cb3bf9b85;hb=1d5eaba5735e24c3afdeb07a5108d7ebf9e3ff57;hpb=54b5b528d9ef6c4f14a2000eead9a5c0686f899e diff --git a/src/bitboard.cpp b/src/bitboard.cpp index 32efaeda..f6504aa9 100644 --- a/src/bitboard.cpp +++ b/src/bitboard.cpp @@ -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); }