mirror of
https://github.com/HChaZZY/Stockfish.git
synced 2025-12-24 02:57:11 +08:00
Greatly speed up SEE
Simply reshuffling the code inverting the condition in next_attacker() yields a miraculous speed up of more than 3% under gcc! On my laptop a bench run goes from 320Knps to 330Knps No functional change.
This commit is contained in:
@@ -106,25 +106,24 @@ void init() {
|
|||||||
/// 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 'occupied' bitboard and scan for new X-ray attacks behind it.
|
/// from the 'occupied' bitboard and scan for new X-ray attacks behind it.
|
||||||
|
|
||||||
template<PieceType Pt> static FORCE_INLINE
|
template<int Pt> static FORCE_INLINE
|
||||||
PieceType next_attacker(const Bitboard* bb, const Square& to, const Bitboard& stmAttackers,
|
PieceType next_attacker(const Bitboard* bb, const Square& to, const Bitboard& stmAttackers,
|
||||||
Bitboard& occupied, Bitboard& attackers) {
|
Bitboard& occupied, Bitboard& attackers) {
|
||||||
|
|
||||||
const PieceType NextPt = PieceType((int)Pt + 1);
|
if (stmAttackers & bb[Pt])
|
||||||
|
{
|
||||||
|
Bitboard b = stmAttackers & bb[Pt];
|
||||||
|
occupied ^= b & ~(b - 1);
|
||||||
|
|
||||||
if (!(stmAttackers & bb[Pt]))
|
if (Pt == PAWN || Pt == BISHOP || Pt == QUEEN)
|
||||||
return next_attacker<NextPt>(bb, to, stmAttackers, occupied, attackers);
|
attackers |= attacks_bb<BISHOP>(to, occupied) & (bb[BISHOP] | bb[QUEEN]);
|
||||||
|
|
||||||
Bitboard b = stmAttackers & bb[Pt];
|
if (Pt == ROOK || Pt == QUEEN)
|
||||||
occupied ^= b & ~(b - 1);
|
attackers |= attacks_bb<ROOK>(to, occupied) & (bb[ROOK] | bb[QUEEN]);
|
||||||
|
|
||||||
if (Pt == PAWN || Pt == BISHOP || Pt == QUEEN)
|
return (PieceType)Pt;
|
||||||
attackers |= attacks_bb<BISHOP>(to, occupied) & (bb[BISHOP] | bb[QUEEN]);
|
}
|
||||||
|
return next_attacker<Pt+1>(bb, to, stmAttackers, occupied, attackers);
|
||||||
if (Pt == ROOK || Pt == QUEEN)
|
|
||||||
attackers |= attacks_bb<ROOK>(to, occupied) & (bb[ROOK] | bb[QUEEN]);
|
|
||||||
|
|
||||||
return Pt;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template<> FORCE_INLINE
|
template<> FORCE_INLINE
|
||||||
@@ -1312,11 +1311,12 @@ int Position::see(Move m) const {
|
|||||||
stm = ~stm;
|
stm = ~stm;
|
||||||
stmAttackers = attackers & pieces(stm);
|
stmAttackers = attackers & pieces(stm);
|
||||||
|
|
||||||
// Stop before processing a king capture
|
if (captured == KING)
|
||||||
if (captured == KING && stmAttackers)
|
|
||||||
{
|
{
|
||||||
assert(slIndex < 32);
|
// Stop before processing a king capture
|
||||||
swapList[slIndex++] = QueenValueMg * 16;
|
if (stmAttackers)
|
||||||
|
swapList[slIndex++] = QueenValueMg * 16;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user