/*
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
#if !defined(BITBOARD_H_INCLUDED)
#define BITBOARD_H_INCLUDED
-
////
//// Defines
////
//#define USE_32BIT_ATTACKS
#define USE_FOLDED_BITSCAN
-#define BITCOUNT_SWAR_64
-//#define BITCOUNT_SWAR_32
-//#define BITCOUNT_LOOP
-
#else
#define USE_32BIT_ATTACKS
#define USE_FOLDED_BITSCAN
-#define BITCOUNT_SWAR_32
#endif
const Bitboard WhiteSquaresBB = 0x55AA55AA55AA55AAULL;
const Bitboard BlackSquaresBB = 0xAA55AA55AA55AA55ULL;
-
-extern const Bitboard SquaresByColorBB[2];
+const Bitboard SquaresByColorBB[2] = { BlackSquaresBB, WhiteSquaresBB };
const Bitboard FileABB = 0x0101010101010101ULL;
const Bitboard FileBBB = 0x0202020202020202ULL;
const Bitboard FileGBB = 0x4040404040404040ULL;
const Bitboard FileHBB = 0x8080808080808080ULL;
-extern const Bitboard FileBB[8];
-extern const Bitboard NeighboringFilesBB[8];
-extern const Bitboard ThisAndNeighboringFilesBB[8];
+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 Rank1BB = 0xFFULL;
const Bitboard Rank2BB = 0xFF00ULL;
const Bitboard Rank7BB = 0xFF000000000000ULL;
const Bitboard Rank8BB = 0xFF00000000000000ULL;
-extern const Bitboard RankBB[8];
-extern const Bitboard RelativeRankBB[2][8];
-extern const Bitboard InFrontBB[2][8];
+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
+ }
+};
extern Bitboard SetMaskBB[65];
extern Bitboard ClearMaskBB[65];
extern Bitboard OutpostMask[2][64];
#if defined(USE_COMPACT_ROOK_ATTACKS)
+
extern Bitboard RankAttacks[8][64], FileAttacks[8][64];
+
#else
+
extern const uint64_t RMult[64];
extern const int RShift[64];
extern Bitboard RMask[64];
extern int RAttackIndex[64];
extern Bitboard RAttacks[0x19000];
+
#endif // defined(USE_COMPACT_ROOK_ATTACKS)
extern const uint64_t BMult[64];
}
+/// Functions used to update a bitboard after a move. This is faster
+/// then calling a sequence of clear_bit() + set_bit()
+
+inline Bitboard make_move_bb(Square from, Square to) {
+ return SetMaskBB[from] | SetMaskBB[to];
+}
+
+inline void do_move_bb(Bitboard *b, Bitboard move_bb) {
+ *b ^= move_bb;
+}
+
/// rank_bb() and file_bb() gives a bitboard containing all squares on a given
/// file or rank. It is also possible to pass a square as input to these
/// functions.
/// relative_rank_bb() takes a color and a rank as input, and returns a bitboard
/// representing all squares on the given rank from the given color's point of
-/// view. For instance, relative_rank_bb(WHITE, 7) gives all squares on the
+/// view. For instance, relative_rank_bb(WHITE, 7) gives all squares on the
/// 7th rank, while relative_rank_bb(BLACK, 7) gives all squares on the 2nd
/// rank.
}
-/// count_1s() counts the number of nonzero bits in a bitboard.
-
-#if defined(BITCOUNT_LOOP)
-
-inline int count_1s(Bitboard b) {
- int r;
- for(r = 0; b; r++, b &= b - 1);
- return r;
-}
-
-inline int count_1s_max_15(Bitboard b) {
- return count_1s(b);
-}
-
-#elif defined(BITCOUNT_SWAR_32)
-
-inline int count_1s(Bitboard b) {
- unsigned w = unsigned(b >> 32), v = unsigned(b);
- v -= (v >> 1) & 0x55555555; // 0-2 in 2 bits
- w -= (w >> 1) & 0x55555555;
- v = ((v >> 2) & 0x33333333) + (v & 0x33333333); // 0-4 in 4 bits
- w = ((w >> 2) & 0x33333333) + (w & 0x33333333);
- v = ((v >> 4) + v) & 0x0F0F0F0F; // 0-8 in 8 bits
- v += (((w >> 4) + w) & 0x0F0F0F0F); // 0-16 in 8 bits
- v *= 0x01010101; // mul is fast on amd procs
- return int(v >> 24);
-}
-
-inline int count_1s_max_15(Bitboard b) {
- unsigned w = unsigned(b >> 32), v = unsigned(b);
- v -= (v >> 1) & 0x55555555; // 0-2 in 2 bits
- w -= (w >> 1) & 0x55555555;
- v = ((v >> 2) & 0x33333333) + (v & 0x33333333); // 0-4 in 4 bits
- w = ((w >> 2) & 0x33333333) + (w & 0x33333333);
- v += w; // 0-8 in 4 bits
- v *= 0x11111111;
- return int(v >> 28);
-}
-
-#elif defined(BITCOUNT_SWAR_64)
-
-inline int count_1s(Bitboard b) {
- b -= ((b>>1) & 0x5555555555555555ULL);
- b = ((b>>2) & 0x3333333333333333ULL) + (b & 0x3333333333333333ULL);
- b = ((b>>4) + b) & 0x0F0F0F0F0F0F0F0FULL;
- b *= 0x0101010101010101ULL;
- return int(b >> 56);
-}
-
-inline int count_1s_max_15(Bitboard b) {
- b -= (b>>1) & 0x5555555555555555ULL;
- b = ((b>>2) & 0x3333333333333333ULL) + (b & 0x3333333333333333ULL);
- b *= 0x1111111111111111ULL;
- return int(b >> 60);
-}
-
-#endif // BITCOUNT
-
-
////
//// Prototypes
////