X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fbitboard.h;h=b99cc2597ceb7959709b50c1dbfa3514e2479383;hp=d187102ff1bf17914dd806c250b85bf8d757049f;hb=e304db9d1ecf6a2318708483c90fadecf4fac4ee;hpb=9793fa1906cc204fc2a520ebb8dd3093f7fc7e40 diff --git a/src/bitboard.h b/src/bitboard.h index d187102f..b99cc259 100644 --- a/src/bitboard.h +++ b/src/bitboard.h @@ -25,36 +25,43 @@ namespace Bitboards { -extern void init(); -extern void print(Bitboard b); +void init(); +void print(Bitboard b); + +} + +namespace Bitbases { + +void init_kpk(); +uint32_t probe_kpk(Square wksq, Square wpsq, Square bksq, Color stm); } CACHE_LINE_ALIGNMENT -extern Bitboard RMasks[64]; -extern Bitboard RMagics[64]; -extern Bitboard* RAttacks[64]; -extern unsigned RShifts[64]; - -extern Bitboard BMasks[64]; -extern Bitboard BMagics[64]; -extern Bitboard* BAttacks[64]; -extern unsigned BShifts[64]; - -extern Bitboard SquareBB[64]; -extern Bitboard FileBB[8]; -extern Bitboard RankBB[8]; -extern Bitboard AdjacentFilesBB[8]; -extern Bitboard ThisAndAdjacentFilesBB[8]; -extern Bitboard InFrontBB[2][8]; -extern Bitboard StepAttacksBB[16][64]; -extern Bitboard BetweenBB[64][64]; -extern Bitboard DistanceRingsBB[64][8]; -extern Bitboard ForwardBB[2][64]; -extern Bitboard PassedPawnMask[2][64]; -extern Bitboard AttackSpanMask[2][64]; -extern Bitboard PseudoAttacks[6][64]; +extern Bitboard RMasks[SQUARE_NB]; +extern Bitboard RMagics[SQUARE_NB]; +extern Bitboard* RAttacks[SQUARE_NB]; +extern unsigned RShifts[SQUARE_NB]; + +extern Bitboard BMasks[SQUARE_NB]; +extern Bitboard BMagics[SQUARE_NB]; +extern Bitboard* BAttacks[SQUARE_NB]; +extern unsigned BShifts[SQUARE_NB]; + +extern Bitboard SquareBB[SQUARE_NB]; +extern Bitboard FileBB[FILE_NB]; +extern Bitboard RankBB[RANK_NB]; +extern Bitboard AdjacentFilesBB[FILE_NB]; +extern Bitboard ThisAndAdjacentFilesBB[FILE_NB]; +extern Bitboard InFrontBB[COLOR_NB][RANK_NB]; +extern Bitboard StepAttacksBB[PIECE_NB][SQUARE_NB]; +extern Bitboard BetweenBB[SQUARE_NB][SQUARE_NB]; +extern Bitboard DistanceRingsBB[SQUARE_NB][8]; +extern Bitboard ForwardBB[COLOR_NB][SQUARE_NB]; +extern Bitboard PassedPawnMask[COLOR_NB][SQUARE_NB]; +extern Bitboard AttackSpanMask[COLOR_NB][SQUARE_NB]; +extern Bitboard PseudoAttacks[PIECE_TYPE_NB][SQUARE_NB]; /// Overloads of bitwise operators between a Bitboard and a Square for testing @@ -221,51 +228,67 @@ inline Bitboard attacks_bb(Square s, Bitboard occ) { } -/// first_1() finds the least significant nonzero bit in a nonzero bitboard. -/// pop_1st_bit() finds and clears the least significant nonzero bit in a -/// nonzero bitboard. +/// lsb()/msb() finds the least/most significant bit in a nonzero bitboard. +/// pop_lsb() finds and clears the least significant bit in a nonzero bitboard. #if defined(USE_BSFQ) -#if defined(_MSC_VER) && !defined(__INTEL_COMPILER) +# if defined(_MSC_VER) && !defined(__INTEL_COMPILER) -FORCE_INLINE Square first_1(Bitboard b) { +FORCE_INLINE Square lsb(Bitboard b) { unsigned long index; _BitScanForward64(&index, b); return (Square) index; } -FORCE_INLINE Square last_1(Bitboard b) { +FORCE_INLINE Square msb(Bitboard b) { unsigned long index; _BitScanReverse64(&index, b); return (Square) index; } -#else -FORCE_INLINE Square first_1(Bitboard b) { // Assembly code by Heinz van Saanen - Bitboard dummy; - __asm__("bsfq %1, %0": "=r"(dummy): "rm"(b) ); - return (Square) dummy; +# elif defined(__arm__) + +FORCE_INLINE int lsb32(uint32_t v) { + __asm__("rbit %0, %1" : "=r"(v) : "r"(v)); + return __builtin_clz(v); } -FORCE_INLINE Square last_1(Bitboard b) { - Bitboard dummy; - __asm__("bsrq %1, %0": "=r"(dummy): "rm"(b) ); - return (Square) dummy; +FORCE_INLINE Square msb(Bitboard b) { + return (Square) (63 - __builtin_clzll(b)); } -#endif -FORCE_INLINE Square pop_1st_bit(Bitboard* b) { - const Square s = first_1(*b); - *b &= ~(1ULL<> 32))); +} + +# else + +FORCE_INLINE Square lsb(Bitboard b) { // Assembly code by Heinz van Saanen + Bitboard index; + __asm__("bsfq %1, %0": "=r"(index): "rm"(b) ); + return (Square) index; +} + +FORCE_INLINE Square msb(Bitboard b) { + Bitboard index; + __asm__("bsrq %1, %0": "=r"(index): "rm"(b) ); + return (Square) index; +} + +# endif + +FORCE_INLINE Square pop_lsb(Bitboard* b) { + const Square s = lsb(*b); + *b &= ~(1ULL << s); return s; } #else // if !defined(USE_BSFQ) -extern Square first_1(Bitboard b); -extern Square last_1(Bitboard b); -extern Square pop_1st_bit(Bitboard* b); +extern Square msb(Bitboard b); +extern Square lsb(Bitboard b); +extern Square pop_lsb(Bitboard* b); #endif