mirror of
https://github.com/sockspls/badfish
synced 2025-07-12 03:59:15 +00:00
Retire FORCE_INLINE
No speed regression on my machine (i7-3770k, gcc 4.9.1, linux 3.16): stat test master diff mean 2,482,415 2,474,987 7,906 stdev 4,603 5,644 2,497 speedup 0.32% P(speedup>0) 100.0% Fishtest 9+0.03: ELO: 0.26 +-1.8 (95%) LOS: 61.2% Total: 60000 W: 12437 L: 12392 D: 35171 No functional change. Resolves #334
This commit is contained in:
parent
20e92895af
commit
6c040c821a
8 changed files with 20 additions and 28 deletions
|
@ -53,7 +53,7 @@ namespace {
|
||||||
WIN = 4
|
WIN = 4
|
||||||
};
|
};
|
||||||
|
|
||||||
inline Result& operator|=(Result& r, Result v) { return r = Result(r | v); }
|
Result& operator|=(Result& r, Result v) { return r = Result(r | v); }
|
||||||
|
|
||||||
struct KPKPosition {
|
struct KPKPosition {
|
||||||
KPKPosition() = default;
|
KPKPosition() = default;
|
||||||
|
|
|
@ -69,7 +69,7 @@ namespace {
|
||||||
// bsf_index() returns the index into BSFTable[] to look up the bitscan. Uses
|
// bsf_index() returns the index into BSFTable[] to look up the bitscan. Uses
|
||||||
// Matt Taylor's folding for 32 bit case, extended to 64 bit by Kim Walisch.
|
// Matt Taylor's folding for 32 bit case, extended to 64 bit by Kim Walisch.
|
||||||
|
|
||||||
FORCE_INLINE unsigned bsf_index(Bitboard b) {
|
unsigned bsf_index(Bitboard b) {
|
||||||
b ^= b - 1;
|
b ^= b - 1;
|
||||||
return Is64Bit ? (b * DeBruijn64) >> 58
|
return Is64Bit ? (b * DeBruijn64) >> 58
|
||||||
: ((unsigned(b) ^ unsigned(b >> 32)) * DeBruijn32) >> 26;
|
: ((unsigned(b) ^ unsigned(b >> 32)) * DeBruijn32) >> 26;
|
||||||
|
|
|
@ -231,7 +231,7 @@ template<> inline int distance<Rank>(Square x, Square y) { return distance(rank_
|
||||||
/// piece of type Pt (bishop or rook) placed on 's'. The helper magic_index()
|
/// piece of type Pt (bishop or rook) placed on 's'. The helper magic_index()
|
||||||
/// looks up the index using the 'magic bitboards' approach.
|
/// looks up the index using the 'magic bitboards' approach.
|
||||||
template<PieceType Pt>
|
template<PieceType Pt>
|
||||||
FORCE_INLINE unsigned magic_index(Square s, Bitboard occupied) {
|
inline unsigned magic_index(Square s, Bitboard occupied) {
|
||||||
|
|
||||||
Bitboard* const Masks = Pt == ROOK ? RookMasks : BishopMasks;
|
Bitboard* const Masks = Pt == ROOK ? RookMasks : BishopMasks;
|
||||||
Bitboard* const Magics = Pt == ROOK ? RookMagics : BishopMagics;
|
Bitboard* const Magics = Pt == ROOK ? RookMagics : BishopMagics;
|
||||||
|
@ -271,13 +271,13 @@ inline Bitboard attacks_bb(Piece pc, Square s, Bitboard occupied) {
|
||||||
|
|
||||||
# if defined(_MSC_VER) && !defined(__INTEL_COMPILER)
|
# if defined(_MSC_VER) && !defined(__INTEL_COMPILER)
|
||||||
|
|
||||||
FORCE_INLINE Square lsb(Bitboard b) {
|
inline Square lsb(Bitboard b) {
|
||||||
unsigned long idx;
|
unsigned long idx;
|
||||||
_BitScanForward64(&idx, b);
|
_BitScanForward64(&idx, b);
|
||||||
return (Square) idx;
|
return (Square) idx;
|
||||||
}
|
}
|
||||||
|
|
||||||
FORCE_INLINE Square msb(Bitboard b) {
|
inline Square msb(Bitboard b) {
|
||||||
unsigned long idx;
|
unsigned long idx;
|
||||||
_BitScanReverse64(&idx, b);
|
_BitScanReverse64(&idx, b);
|
||||||
return (Square) idx;
|
return (Square) idx;
|
||||||
|
@ -285,28 +285,28 @@ FORCE_INLINE Square msb(Bitboard b) {
|
||||||
|
|
||||||
# elif defined(__arm__)
|
# elif defined(__arm__)
|
||||||
|
|
||||||
FORCE_INLINE int lsb32(uint32_t v) {
|
inline int lsb32(uint32_t v) {
|
||||||
__asm__("rbit %0, %1" : "=r"(v) : "r"(v));
|
__asm__("rbit %0, %1" : "=r"(v) : "r"(v));
|
||||||
return __builtin_clz(v);
|
return __builtin_clz(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
FORCE_INLINE Square msb(Bitboard b) {
|
inline Square msb(Bitboard b) {
|
||||||
return (Square) (63 - __builtin_clzll(b));
|
return (Square) (63 - __builtin_clzll(b));
|
||||||
}
|
}
|
||||||
|
|
||||||
FORCE_INLINE Square lsb(Bitboard b) {
|
inline Square lsb(Bitboard b) {
|
||||||
return (Square) (uint32_t(b) ? lsb32(uint32_t(b)) : 32 + lsb32(uint32_t(b >> 32)));
|
return (Square) (uint32_t(b) ? lsb32(uint32_t(b)) : 32 + lsb32(uint32_t(b >> 32)));
|
||||||
}
|
}
|
||||||
|
|
||||||
# else // Assumed gcc or compatible compiler
|
# else // Assumed gcc or compatible compiler
|
||||||
|
|
||||||
FORCE_INLINE Square lsb(Bitboard b) { // Assembly code by Heinz van Saanen
|
inline Square lsb(Bitboard b) { // Assembly code by Heinz van Saanen
|
||||||
Bitboard idx;
|
Bitboard idx;
|
||||||
__asm__("bsfq %1, %0": "=r"(idx): "rm"(b) );
|
__asm__("bsfq %1, %0": "=r"(idx): "rm"(b) );
|
||||||
return (Square) idx;
|
return (Square) idx;
|
||||||
}
|
}
|
||||||
|
|
||||||
FORCE_INLINE Square msb(Bitboard b) {
|
inline Square msb(Bitboard b) {
|
||||||
Bitboard idx;
|
Bitboard idx;
|
||||||
__asm__("bsrq %1, %0": "=r"(idx): "rm"(b) );
|
__asm__("bsrq %1, %0": "=r"(idx): "rm"(b) );
|
||||||
return (Square) idx;
|
return (Square) idx;
|
||||||
|
@ -324,7 +324,7 @@ Square msb(Bitboard b);
|
||||||
|
|
||||||
/// pop_lsb() finds and clears the least significant bit in a non-zero bitboard
|
/// pop_lsb() finds and clears the least significant bit in a non-zero bitboard
|
||||||
|
|
||||||
FORCE_INLINE Square pop_lsb(Bitboard* b) {
|
inline Square pop_lsb(Bitboard* b) {
|
||||||
const Square s = lsb(*b);
|
const Square s = lsb(*b);
|
||||||
*b &= *b - 1;
|
*b &= *b - 1;
|
||||||
return s;
|
return s;
|
||||||
|
|
|
@ -66,7 +66,7 @@ namespace {
|
||||||
|
|
||||||
|
|
||||||
template<GenType Type, Square Delta>
|
template<GenType Type, Square Delta>
|
||||||
inline ExtMove* make_promotions(ExtMove* moveList, Square to, const CheckInfo* ci) {
|
ExtMove* make_promotions(ExtMove* moveList, Square to, const CheckInfo* ci) {
|
||||||
|
|
||||||
if (Type == CAPTURES || Type == EVASIONS || Type == NON_EVASIONS)
|
if (Type == CAPTURES || Type == EVASIONS || Type == NON_EVASIONS)
|
||||||
*moveList++ = make<PROMOTION>(to - Delta, to, QUEEN);
|
*moveList++ = make<PROMOTION>(to - Delta, to, QUEEN);
|
||||||
|
@ -219,7 +219,7 @@ namespace {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
template<PieceType Pt, bool Checks> FORCE_INLINE
|
template<PieceType Pt, bool Checks>
|
||||||
ExtMove* generate_moves(const Position& pos, ExtMove* moveList, Color us,
|
ExtMove* generate_moves(const Position& pos, ExtMove* moveList, Color us,
|
||||||
Bitboard target, const CheckInfo* ci) {
|
Bitboard target, const CheckInfo* ci) {
|
||||||
|
|
||||||
|
@ -252,7 +252,7 @@ namespace {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
template<Color Us, GenType Type> FORCE_INLINE
|
template<Color Us, GenType Type>
|
||||||
ExtMove* generate_all(const Position& pos, ExtMove* moveList, Bitboard target,
|
ExtMove* generate_all(const Position& pos, ExtMove* moveList, Bitboard target,
|
||||||
const CheckInfo* ci = nullptr) {
|
const CheckInfo* ci = nullptr) {
|
||||||
|
|
||||||
|
|
|
@ -52,7 +52,7 @@ namespace {
|
||||||
// pick_best() finds the best move in the range (begin, end) and moves it to
|
// pick_best() finds the best move in the range (begin, end) and moves it to
|
||||||
// the front. It's faster than sorting all the moves in advance when there
|
// the front. It's faster than sorting all the moves in advance when there
|
||||||
// are few moves e.g. the possible captures.
|
// are few moves e.g. the possible captures.
|
||||||
inline Move pick_best(ExtMove* begin, ExtMove* end)
|
Move pick_best(ExtMove* begin, ExtMove* end)
|
||||||
{
|
{
|
||||||
std::swap(*begin, *std::max_element(begin, end));
|
std::swap(*begin, *std::max_element(begin, end));
|
||||||
return *begin;
|
return *begin;
|
||||||
|
|
|
@ -58,7 +58,7 @@ Score psq[COLOR_NB][PIECE_TYPE_NB][SQUARE_NB];
|
||||||
// valuable attacker for the side to move, remove the attacker we just found
|
// valuable attacker for the side to move, remove the attacker we just found
|
||||||
// from the bitboards and scan for new X-ray attacks behind it.
|
// from the bitboards and scan for new X-ray attacks behind it.
|
||||||
|
|
||||||
template<int Pt> FORCE_INLINE
|
template<int Pt>
|
||||||
PieceType min_attacker(const Bitboard* bb, const Square& to, const Bitboard& stmAttackers,
|
PieceType min_attacker(const Bitboard* bb, const Square& to, const Bitboard& stmAttackers,
|
||||||
Bitboard& occupied, Bitboard& attackers) {
|
Bitboard& occupied, Bitboard& attackers) {
|
||||||
|
|
||||||
|
@ -78,7 +78,7 @@ PieceType min_attacker(const Bitboard* bb, const Square& to, const Bitboard& stm
|
||||||
return (PieceType)Pt;
|
return (PieceType)Pt;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<> FORCE_INLINE
|
template<>
|
||||||
PieceType min_attacker<KING>(const Bitboard*, const Square&, const Bitboard&, Bitboard&, Bitboard&) {
|
PieceType min_attacker<KING>(const Bitboard*, const Square&, const Bitboard&, Bitboard&, Bitboard&) {
|
||||||
return KING; // No need to update bitboards: it is the last cycle
|
return KING; // No need to update bitboards: it is the last cycle
|
||||||
}
|
}
|
||||||
|
|
|
@ -66,14 +66,14 @@ namespace {
|
||||||
enum NodeType { Root, PV, NonPV };
|
enum NodeType { Root, PV, NonPV };
|
||||||
|
|
||||||
// Razoring and futility margin based on depth
|
// Razoring and futility margin based on depth
|
||||||
inline Value razor_margin(Depth d) { return Value(512 + 32 * d); }
|
Value razor_margin(Depth d) { return Value(512 + 32 * d); }
|
||||||
inline Value futility_margin(Depth d) { return Value(200 * d); }
|
Value futility_margin(Depth d) { return Value(200 * d); }
|
||||||
|
|
||||||
// Futility and reductions lookup tables, initialized at startup
|
// Futility and reductions lookup tables, initialized at startup
|
||||||
int FutilityMoveCounts[2][16]; // [improving][depth]
|
int FutilityMoveCounts[2][16]; // [improving][depth]
|
||||||
Depth Reductions[2][2][64][64]; // [pv][improving][depth][moveNumber]
|
Depth Reductions[2][2][64][64]; // [pv][improving][depth][moveNumber]
|
||||||
|
|
||||||
template <bool PvNode> inline Depth reduction(bool i, Depth d, int mn) {
|
template <bool PvNode> Depth reduction(bool i, Depth d, int mn) {
|
||||||
return Reductions[PvNode][i][std::min(d, 63 * ONE_PLY)][std::min(mn, 63)];
|
return Reductions[PvNode][i][std::min(d, 63 * ONE_PLY)][std::min(mn, 63)];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -79,14 +79,6 @@
|
||||||
# define pext(b, m) (0)
|
# define pext(b, m) (0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
|
||||||
# define FORCE_INLINE __forceinline
|
|
||||||
#elif defined(__GNUC__)
|
|
||||||
# define FORCE_INLINE inline __attribute__((always_inline))
|
|
||||||
#else
|
|
||||||
# define FORCE_INLINE inline
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef USE_POPCNT
|
#ifdef USE_POPCNT
|
||||||
const bool HasPopCnt = true;
|
const bool HasPopCnt = true;
|
||||||
#else
|
#else
|
||||||
|
|
Loading…
Add table
Reference in a new issue