}
#define POPCNT_INTRINSIC(x) __popcnt64(x)
-#define BITSCAN_INTRINSIC(idx, x) _BitScanForward64(idx, x)
#elif defined(__INTEL_COMPILER) && (defined(__x86_64) || defined(_M_X64)) // Intel compiler
}
#define POPCNT_INTRINSIC(x) _mm_popcnt_u64(x)
-#define BITSCAN_INTRINSIC(idx, x) _BitScanForward64(idx, x)
#else // Safe fallback for unsupported compilers
inline bool cpu_has_popcnt() { return false; }
#define POPCNT_INTRINSIC(x) count_1s(x)
-#define BITSCAN_INTRINSIC(idx, x) count_1s(x) // dummy
#endif
}
-/// pop_1st_bit() finds and clears the least significant nonzero bit in a
-/// nonzero bitboard. If template parameter is true an intrinsic is called,
-/// otherwise we fallback on a software implementation.
-
-template<bool UseIntrinsic>
-inline Square pop_1st_bit(Bitboard *b) {
-
- return pop_1st_bit(b);
-}
-
-template<>
-inline Square pop_1st_bit<true>(Bitboard *b) {
-
- unsigned long idx;
- Bitboard bb = *b;
- BITSCAN_INTRINSIC(&idx, bb);
- *b &= (bb - 1);
- return Square(idx);
-}
-
-
// Global variable initialized at startup that is set to true if
// CPU on which application runs supports POPCNT intrinsic. Unless
// DISABLE_POPCNT_SUPPORT is defined.