Skip to content

Commit

Permalink
Retire SERIALIZE macros
Browse files Browse the repository at this point in the history
Explicitly write the 'while' loops. This adds some
code but makes clear what's the code behind the
macro.

No functional change.
  • Loading branch information
mcostalba committed Mar 9, 2014
1 parent 1d1b7df commit 5cf9e0b
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 19 deletions.
51 changes: 33 additions & 18 deletions src/movegen.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,6 @@
#include "movegen.h"
#include "position.h"

/// Simple macro to wrap a very common while loop, no fancy, no flexibility,
/// hardcoded names 'mlist' and 'from'.
#define SERIALIZE(b) while (b) (mlist++)->move = make_move(from, pop_lsb(&b))

/// Version used for pawns, where the 'from' square is given as a delta from the 'to' square
#define SERIALIZE_PAWNS(b, d) while (b) { Square to = pop_lsb(&b); \
(mlist++)->move = make_move(to - (d), to); }
namespace {

template<CastlingRight Cr, bool Checks, bool Chess960>
Expand Down Expand Up @@ -159,8 +152,17 @@ namespace {
}
}

SERIALIZE_PAWNS(b1, Up);
SERIALIZE_PAWNS(b2, Up + Up);
while (b1)
{
Square to = pop_lsb(&b1);
(mlist++)->move = make_move(to - Up, to);
}

while (b2)
{
Square to = pop_lsb(&b2);
(mlist++)->move = make_move(to - Up - Up, to);
}
}

// Promotions and underpromotions
Expand All @@ -183,8 +185,17 @@ namespace {
b1 = shift_bb<Right>(pawnsNotOn7) & enemies;
b2 = shift_bb<Left >(pawnsNotOn7) & enemies;

SERIALIZE_PAWNS(b1, Right);
SERIALIZE_PAWNS(b2, Left);
while (b1)
{
Square to = pop_lsb(&b1);
(mlist++)->move = make_move(to - Right, to);
}

while (b2)
{
Square to = pop_lsb(&b2);
(mlist++)->move = make_move(to - Left, to);
}

if (pos.ep_square() != SQ_NONE)
{
Expand Down Expand Up @@ -234,7 +245,8 @@ namespace {
if (Checks)
b &= ci->checkSq[Pt];

SERIALIZE(b);
while (b)
(mlist++)->move = make_move(from, pop_lsb(&b));
}

return mlist;
Expand All @@ -255,9 +267,10 @@ namespace {

if (Type != QUIET_CHECKS && Type != EVASIONS)
{
Square from = pos.king_square(Us);
Bitboard b = pos.attacks_from<KING>(from) & target;
SERIALIZE(b);
Square ksq = pos.king_square(Us);
Bitboard b = pos.attacks_from<KING>(ksq) & target;
while (b)
(mlist++)->move = make_move(ksq, pop_lsb(&b));
}

if (Type != CAPTURES && Type != EVASIONS && pos.can_castle(Us))
Expand Down Expand Up @@ -336,7 +349,8 @@ ExtMove* generate<QUIET_CHECKS>(const Position& pos, ExtMove* mlist) {
if (pt == KING)
b &= ~PseudoAttacks[QUEEN][ci.ksq];

SERIALIZE(b);
while (b)
(mlist++)->move = make_move(from, pop_lsb(&b));
}

return us == WHITE ? generate_all<WHITE, QUIET_CHECKS>(pos, mlist, ~pos.pieces(), &ci)
Expand All @@ -353,7 +367,7 @@ ExtMove* generate<EVASIONS>(const Position& pos, ExtMove* mlist) {

int checkersCnt = 0;
Color us = pos.side_to_move();
Square ksq = pos.king_square(us), from = ksq /* For SERIALIZE */, checksq;
Square ksq = pos.king_square(us), checksq;
Bitboard sliderAttacks = 0;
Bitboard b = pos.checkers();

Expand All @@ -376,7 +390,8 @@ ExtMove* generate<EVASIONS>(const Position& pos, ExtMove* mlist) {

// Generate evasions for king, capture and non capture moves
b = pos.attacks_from<KING>(ksq) & ~pos.pieces(us) & ~sliderAttacks;
SERIALIZE(b);
while (b)
(mlist++)->move = make_move(ksq, pop_lsb(&b));

if (checkersCnt > 1)
return mlist; // Double check, only a king move can save the day
Expand Down
2 changes: 1 addition & 1 deletion src/position.h
Original file line number Diff line number Diff line change
Expand Up @@ -292,7 +292,7 @@ inline Square Position::castling_rook_square(CastlingRight cr) const {
template<PieceType Pt>
inline Bitboard Position::attacks_from(Square s) const {

return Pt == BISHOP || Pt == ROOK ? attacks_bb<Pt>(s, pieces())
return Pt == BISHOP || Pt == ROOK ? attacks_bb<Pt>(s, byTypeBB[ALL_PIECES])
: Pt == QUEEN ? attacks_from<ROOK>(s) | attacks_from<BISHOP>(s)
: StepAttacksBB[Pt][s];
}
Expand Down

0 comments on commit 5cf9e0b

Please sign in to comment.