1
0
Fork 0

Streamline generate_moves()

Greatly simplify these very performace critical functions.
Amazingly we don't have any speed regression actually under
MSVC we have the same assembly for generate_moves() !

In generate_direct_checks() 'target' is calculated only
once being a loop invariant.

On Clang there is even a slight speed up.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
sf_2.3.1_base
Marco Costalba 2012-08-22 08:29:49 +01:00
parent b84af67f4c
commit 0de9257610
1 changed files with 16 additions and 25 deletions

View File

@ -216,31 +216,25 @@ namespace {
template<PieceType Pt>
inline MoveStack* generate_direct_checks(const Position& pos, MoveStack* mlist,
Color us, const CheckInfo& ci) {
FORCE_INLINE MoveStack* generate_direct_checks(const Position& pos, MoveStack* mlist,
Color us, const CheckInfo& ci) {
assert(Pt != KING && Pt != PAWN);
Bitboard b, target;
Square from;
const Square* pl = pos.piece_list(us, Pt);
if (*pl != SQ_NONE)
for (Square from = *pl; from != SQ_NONE; from = *++pl)
{
target = ci.checkSq[Pt] & ~pos.pieces(); // Non capture checks only
Bitboard target = ci.checkSq[Pt] & ~pos.pieces(); // Non capture checks only
do {
from = *pl;
if ( (Pt == BISHOP || Pt == ROOK || Pt == QUEEN)
&& !(PseudoAttacks[Pt][from] & target))
continue;
if ( (Pt == BISHOP || Pt == ROOK || Pt == QUEEN)
&& !(PseudoAttacks[Pt][from] & target))
continue;
if (ci.dcCandidates && (ci.dcCandidates & from))
continue;
if (ci.dcCandidates && (ci.dcCandidates & from))
continue;
b = pos.attacks_from<Pt>(from) & target;
SERIALIZE(b);
} while (*++pl != SQ_NONE);
Bitboard b = pos.attacks_from<Pt>(from) & target;
SERIALIZE(b);
}
return mlist;
@ -252,16 +246,13 @@ namespace {
Color us, Bitboard target) {
assert(Pt != KING && Pt != PAWN);
Bitboard b;
Square from;
const Square* pl = pos.piece_list(us, Pt);
if (*pl != SQ_NONE)
do {
from = *pl;
b = pos.attacks_from<Pt>(from) & target;
SERIALIZE(b);
} while (*++pl != SQ_NONE);
for (Square from = *pl; from != SQ_NONE; from = *++pl)
{
Bitboard b = pos.attacks_from<Pt>(from) & target;
SERIALIZE(b);
}
return mlist;
}