X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fbitboard.cpp;h=f6504aa9098b6aa808cdc89d1957c5da18930c1f;hp=6ab90124aeaad62c4242926555a1539c68ba06a7;hb=1d5eaba5735e24c3afdeb07a5108d7ebf9e3ff57;hpb=3fda064a669c2bcecfa31d66c661efa7408499de diff --git a/src/bitboard.cpp b/src/bitboard.cpp index 6ab90124..f6504aa9 100644 --- a/src/bitboard.cpp +++ b/src/bitboard.cpp @@ -1,7 +1,7 @@ /* Stockfish, a UCI chess playing engine derived from Glaurung 2.1 Copyright (C) 2004-2008 Tord Romstad (Glaurung author) - Copyright (C) 2008-2014 Marco Costalba, Joona Kiiski, Tord Romstad + Copyright (C) 2008-2015 Marco Costalba, Joona Kiiski, Tord Romstad Stockfish is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -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; @@ -275,7 +277,7 @@ namespace { reference[size] = sliding_attack(deltas, s, b); if (HasPext) - attacks[s][_pext_u64(b, masks[s])] = reference[size]; + attacks[s][pext(b, masks[s])] = reference[size]; size++; b = (b - masks[s]) & masks[s]; @@ -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); }