Use intrinsic in pop_1st_bit() under MSVC 64 bits

Around 1% speedup when compiled with MSVC 64

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
This commit is contained in:
Marco Costalba
2011-03-17 13:47:15 +01:00
parent 635be39acf
commit 5ea08e79c4
2 changed files with 16 additions and 7 deletions

View File

@@ -257,15 +257,25 @@ inline bool squares_aligned(Square s1, Square s2, Square s3) {
/// pop_1st_bit() finds and clears the least significant nonzero bit in a
/// nonzero bitboard.
#if defined(USE_BSFQ) // Assembly code by Heinz van Saanen
#if defined(USE_BSFQ)
inline Square first_1(Bitboard b) {
#if defined(_MSC_VER) && !defined(__INTEL_COMPILER)
FORCE_INLINE Square first_1(Bitboard b) {
unsigned long index;
_BitScanForward64(&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);
return (Square) dummy;
}
#endif
inline Square pop_1st_bit(Bitboard* b) {
FORCE_INLINE Square pop_1st_bit(Bitboard* b) {
const Square s = first_1(*b);
*b &= ~(1ULL<<s);
return s;