X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fbitboard.cpp;h=a73c5a2dc7ad970d6c8f16275ead918d2af46ac1;hp=89b543212998155cbeb91b4f6040dd2bfaeaa541;hb=b1e79fed99d52dcb20d2d6a9c62522226e957963;hpb=aaad48464bc8a269634de371238826d09a6e240d diff --git a/src/bitboard.cpp b/src/bitboard.cpp index 89b54321..a73c5a2d 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 Marco Costalba + Copyright (C) 2008-2009 Marco Costalba Stockfish is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -35,67 +35,10 @@ #include #include "bitboard.h" +#include "bitcount.h" #include "direction.h" -//// -//// Constants and variables -//// - -const Bitboard SquaresByColorBB[2] = {BlackSquaresBB, WhiteSquaresBB}; - -const Bitboard FileBB[8] = { - FileABB, FileBBB, FileCBB, FileDBB, FileEBB, FileFBB, FileGBB, FileHBB -}; - -const Bitboard NeighboringFilesBB[8] = { - FileBBB, FileABB|FileCBB, FileBBB|FileDBB, FileCBB|FileEBB, - FileDBB|FileFBB, FileEBB|FileGBB, FileFBB|FileHBB, FileGBB -}; - -const Bitboard ThisAndNeighboringFilesBB[8] = { - FileABB|FileBBB, FileABB|FileBBB|FileCBB, - FileBBB|FileCBB|FileDBB, FileCBB|FileDBB|FileEBB, - FileDBB|FileEBB|FileFBB, FileEBB|FileFBB|FileGBB, - FileFBB|FileGBB|FileHBB, FileGBB|FileHBB -}; - -const Bitboard RankBB[8] = { - Rank1BB, Rank2BB, Rank3BB, Rank4BB, Rank5BB, Rank6BB, Rank7BB, Rank8BB -}; - -const Bitboard RelativeRankBB[2][8] = { - { - Rank1BB, Rank2BB, Rank3BB, Rank4BB, Rank5BB, Rank6BB, Rank7BB, Rank8BB - }, - { - Rank8BB, Rank7BB, Rank6BB, Rank5BB, Rank4BB, Rank3BB, Rank2BB, Rank1BB - } -}; - -const Bitboard InFrontBB[2][8] = { - { - Rank2BB | Rank3BB | Rank4BB | Rank5BB | Rank6BB | Rank7BB | Rank8BB, - Rank3BB | Rank4BB | Rank5BB | Rank6BB | Rank7BB | Rank8BB, - Rank4BB | Rank5BB | Rank6BB | Rank7BB | Rank8BB, - Rank5BB | Rank6BB | Rank7BB | Rank8BB, - Rank6BB | Rank7BB | Rank8BB, - Rank7BB | Rank8BB, - Rank8BB, - EmptyBoardBB - }, - { - EmptyBoardBB, - Rank1BB, - Rank2BB | Rank1BB, - Rank3BB | Rank2BB | Rank1BB, - Rank4BB | Rank3BB | Rank2BB | Rank1BB, - Rank5BB | Rank4BB | Rank3BB | Rank2BB | Rank1BB, - Rank6BB | Rank5BB | Rank4BB | Rank3BB | Rank2BB | Rank1BB, - Rank7BB | Rank6BB | Rank5BB | Rank4BB | Rank3BB | Rank2BB | Rank1BB - } -}; - #if defined(USE_COMPACT_ROOK_ATTACKS) Bitboard RankAttacks[8][64], FileAttacks[8][64]; @@ -270,6 +213,7 @@ Bitboard QueenPseudoAttacks[64]; //// namespace { + void init_masks(); void init_ray_bitboards(); void init_attacks(); @@ -359,7 +303,7 @@ union b_union { struct { uint32_t l; uint32_t h; - }; + } dw; }; // WARNING: Needs -fno-strict-aliasing compiler option @@ -370,15 +314,15 @@ Square pop_1st_bit(Bitboard *bb) { u.b = *bb; - if (u.l) + if (u.dw.l) { - b = u.l; + b = u.dw.l; *((uint32_t*)bb) = b & (b - 1); b ^= (b - 1); } else { - b = u.h; + b = u.dw.h; *((uint32_t*)bb+1) = b & (b - 1); // Little endian only? b = ~(b ^ (b - 1)); } @@ -396,7 +340,7 @@ Square pop_1st_bit(Bitboard *b) { #endif -#else +#else // defined(USE_FOLDED_BITSCAN) static const int BitTable[64] = { 0, 1, 2, 7, 3, 13, 8, 19, 4, 25, 14, 28, 9, 34, 20, 40, 5, 17, 26, 38, 15, @@ -450,7 +394,7 @@ namespace { void init_ray_bitboards() { int d[8] = {1, -1, 16, -16, 17, -17, 15, -15}; - for(int i = 0; i < 128; i = i + 9 & ~8) { + for(int i = 0; i < 128; i = (i + 9) & ~8) { for(int j = 0; j < 8; j++) { RayBB[(i&7)|((i>>4)<<3)][j] = EmptyBoardBB; for(int k = i + d[j]; (k & 0x88) == 0; k += d[j]) @@ -536,8 +480,15 @@ namespace { for(i = 0; i < 64; i++) { attackIndex[i] = index; mask[i] = sliding_attacks(i, 0ULL, 4, deltas, 1, 6, 1, 6); + +#if defined(USE_32BIT_ATTACKS) + j = (1 << (32 - shift[i])); +#else j = (1 << (64 - shift[i])); +#endif + for(k = 0; k < j; k++) { + #if defined(USE_32BIT_ATTACKS) b = index_to_bitboard(k, mask[i]); attacks[index +