#include "types.h"
+namespace Bitboards {
+
+extern void init();
+extern void print(Bitboard b);
+
+}
+
CACHE_LINE_ALIGNMENT
extern Bitboard RMasks[64];
}
+/// single_bit() returns true if in the 'b' bitboard is set a single bit (or if
+/// b == 0).
+
+inline bool single_bit(Bitboard b) {
+ return !(b & (b - 1));
+}
+
+
/// 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.
#if defined(_MSC_VER) && !defined(__INTEL_COMPILER)
FORCE_INLINE Square first_1(Bitboard b) {
- unsigned long index;
- _BitScanForward64(&index, b);
- return (Square) index;
+ unsigned long index;
+ _BitScanForward64(&index, b);
+ return (Square) index;
+}
+
+FORCE_INLINE Square last_1(Bitboard b) {
+ unsigned long index;
+ _BitScanReverse64(&index, b);
+ return (Square) index;
}
#else
__asm__("bsfq %1, %0": "=r"(dummy): "rm"(b) );
return (Square) dummy;
}
+
+FORCE_INLINE Square last_1(Bitboard b) {
+ Bitboard dummy;
+ __asm__("bsrq %1, %0": "=r"(dummy): "rm"(b) );
+ return (Square) dummy;
+}
#endif
FORCE_INLINE Square pop_1st_bit(Bitboard* b) {
#else // if !defined(USE_BSFQ)
extern Square first_1(Bitboard b);
+extern Square last_1(Bitboard b);
extern Square pop_1st_bit(Bitboard* b);
#endif
-
-extern void print_bitboard(Bitboard b);
-extern void bitboards_init();
-
#endif // !defined(BITBOARD_H_INCLUDED)