//// Includes
////
+#ifdef _MSC_VER
+ #include <intrin.h>
+ #ifdef _WIN64
+ #pragma intrinsic(_BitScanForward64)
+ #else
+ #pragma intrinsic(_BitScanForward)
+ #endif
+ #define USING_INTRINSICS
+#endif
+
#include <iostream>
#include "bitboard.h"
#if defined(USE_COMPACT_ROOK_ATTACKS)
void init_file_and_rank_attacks();
#endif
-};
+}
////
/// pop_1st_bit() finds and clears the least significant nonzero bit in a
/// nonzero bitboard.
-#if defined(USE_32BIT_ATTACKS)
-
-Square pop_1st_bit(Bitboard *bb) {
+#if defined(USE_32BIT_ATTACKS) && defined(_MSC_VER)
- uint32_t t = uint32_t(*bb);
- uint32_t* p = t ? (uint32_t*)bb : (uint32_t*)bb + 1; // Little endian only?
- uint32_t b = t ? t : *p;
+// On 32bit system compiled with MSVC this verion seems
+// slightly faster then the standard one.
- *p = b & (b -1);
+Square pop_1st_bit(Bitboard *b) {
- if (t)
- b ^= (b - 1);
- else
- b = ~(b ^ (b - 1));
+ unsigned long index;
+ uint32_t *l, *h;
- return Square(BitTable[(b * 0x783a9b23) >> 26]);
+ if (*(l = (uint32_t*)b) != 0)
+ {
+ _BitScanForward(&index, *l);
+ *l &= ~(1 << index);
+ }
+ else if (*(h = (uint32_t*)b + 1) != 0)
+ {
+ _BitScanForward(&index, *h);
+ *h &= ~(1 << index);
+ index += 32;
+ } else
+ return SQ_NONE;
+
+ return Square(index);
}
#else