X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fbitboard.cpp;h=b3dbd00be2f6fe5583a2e16ad7c4e2771b504609;hp=d0bd7e702643e1bc323910c92eb3bf2e589a395a;hb=68171ecacaeb0617e3b10c2aaa72d30e5731bf9e;hpb=4630ab574333be3cfabb6fcf3eca6d66ae961fe1 diff --git a/src/bitboard.cpp b/src/bitboard.cpp index d0bd7e70..b3dbd00b 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-2013 Marco Costalba, Joona Kiiski, Tord Romstad + Copyright (C) 2008-2014 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 @@ -18,8 +18,7 @@ */ #include -#include -#include +#include // For memset #include "bitboard.h" #include "bitcount.h" @@ -130,19 +129,17 @@ Square msb(Bitboard b) { const std::string Bitboards::pretty(Bitboard b) { - std::ostringstream ss; + std::string s = "+---+---+---+---+---+---+---+---+\n"; - for (Rank rank = RANK_8; rank >= RANK_1; --rank) + for (Rank r = RANK_8; r >= RANK_1; --r) { - ss << "+---+---+---+---+---+---+---+---+" << '\n'; + for (File f = FILE_A; f <= FILE_H; ++f) + s.append(b & make_square(f, r) ? "| X " : "| "); - for (File file = FILE_A; file <= FILE_H; ++file) - ss << "| " << (b & (file | rank) ? "X " : " "); - - ss << "|\n"; + s.append("|\n+---+---+---+---+---+---+---+---+\n"); } - ss << "+---+---+---+---+---+---+---+---+"; - return ss.str(); + + return s; } @@ -152,7 +149,10 @@ const std::string Bitboards::pretty(Bitboard b) { void Bitboards::init() { for (Square s = SQ_A1; s <= SQ_H8; ++s) - BSFTable[bsf_index(SquareBB[s] = 1ULL << s)] = s; + { + SquareBB[s] = 1ULL << s; + BSFTable[bsf_index(SquareBB[s])] = s; + } for (Bitboard b = 1; b < 256; ++b) MS1BTable[b] = more_than_one(b) ? MS1BTable[b - 1] : lsb(b); @@ -246,20 +246,6 @@ namespace { } - Bitboard pick_random(RKISS& rk, int booster) { - - // Values s1 and s2 are used to rotate the candidate magic of a - // quantity known to be optimal to quickly find the magics. - int s1 = booster & 63, s2 = (booster >> 6) & 63; - - Bitboard m = rk.rand(); - m = (m >> s1) | (m << (64 - s1)); - m &= rk.rand(); - m = (m >> s2) | (m << (64 - s2)); - return m & rk.rand(); - } - - // init_magics() computes all rook and bishop attacks at startup. Magic // bitboards are used to look up attacks of sliding pieces. As a reference see // chessprogramming.wikispaces.com/Magic+Bitboards. In particular, here we @@ -268,8 +254,8 @@ namespace { void init_magics(Bitboard table[], Bitboard* attacks[], Bitboard magics[], Bitboard masks[], unsigned shifts[], Square deltas[], Fn index) { - int MagicBoosters[][8] = { { 3191, 2184, 1310, 3618, 2091, 1308, 2452, 3996 }, - { 1059, 3608, 605, 3234, 3326, 38, 2029, 3043 } }; + int MagicBoosters[][RANK_NB] = { { 969, 1976, 2850, 542, 2069, 2852, 1708, 164 }, + { 3101, 552, 3555, 926, 834, 26, 2131, 1117 } }; RKISS rk; Bitboard occupancy[4096], reference[4096], edges, b; int i, size, booster; @@ -295,7 +281,12 @@ namespace { b = size = 0; do { occupancy[size] = b; - reference[size++] = sliding_attack(deltas, s, b); + reference[size] = sliding_attack(deltas, s, b); + + if (HasPext) + attacks[s][_pext_u64(b, masks[s])] = reference[size]; + + size++; b = (b - masks[s]) & masks[s]; } while (b); @@ -304,12 +295,16 @@ namespace { if (s < SQ_H8) attacks[s + 1] = attacks[s] + size; + if (HasPext) + continue; + booster = MagicBoosters[Is64Bit][rank_of(s)]; // Find a magic for square 's' picking up an (almost) random number // until we find the one that passes the verification test. do { - do magics[s] = pick_random(rk, booster); + do + magics[s] = rk.magic_rand(booster); while (popcount((magics[s] * masks[s]) >> 56) < 6); std::memset(attacks[s], 0, size * sizeof(Bitboard)); @@ -325,11 +320,11 @@ namespace { if (attack && attack != reference[i]) break; - assert(reference[i] != 0); + assert(reference[i]); attack = reference[i]; } - } while (i != size); + } while (i < size); } } }