/*
- Glaurung, a UCI chess playing engine.
- Copyright (C) 2004-2008 Tord Romstad
+ Stockfish, a UCI chess playing engine derived from Glaurung 2.1
+ Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
+ Copyright (C) 2008 Marco Costalba
- Glaurung is free software: you can redistribute it and/or modify
+ Stockfish is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
- Glaurung is distributed in the hope that it will be useful,
+ Stockfish is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
//// 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
-};
+}
////
#if defined(USE_32BIT_ATTACKS)
+// Use type-punning
+union b_union {
+
+ Bitboard b;
+ struct {
+ uint32_t l;
+ uint32_t h;
+ };
+};
+
+// WARNING: Needs -fno-strict-aliasing compiler option
Square pop_1st_bit(Bitboard *bb) {
- 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;
+ b_union u;
+ uint32_t b;
- *p = b & (b -1);
+ u.b = *bb;
- if (t)
- b ^= (b - 1);
+ if (u.l)
+ {
+ b = u.l;
+ *((uint32_t*)bb) = b & (b - 1);
+ b ^= (b - 1);
+ }
else
- b = ~(b ^ (b - 1));
-
+ {
+ b = u.h;
+ *((uint32_t*)bb+1) = b & (b - 1); // Little endian only?
+ b = ~(b ^ (b - 1));
+ }
return Square(BitTable[(b * 0x783a9b23) >> 26]);
}