From: Marco Costalba Date: Thu, 7 May 2009 13:32:28 +0000 (+0200) Subject: Further parametrize generate_pawn_captures X-Git-Url: https://git.sesse.net/?p=stockfish;a=commitdiff_plain;h=1d15b38cd8b15610a660bde417923c642a413a22;hp=5c81602d14539f8259a715477315e28b5de7cb54 Further parametrize generate_pawn_captures We can parametrize for the capture direction too. Also use a single template parameter and calculate (at compile time) remainin parameters directly in the function. No functional change. Signed-off-by: Marco Costalba --- diff --git a/src/movegen.cpp b/src/movegen.cpp index 287b1c0d..440dd839 100644 --- a/src/movegen.cpp +++ b/src/movegen.cpp @@ -56,10 +56,13 @@ namespace { template MoveStack* generate_pawn_blocking_evasions(const Position&, Bitboard, Bitboard, MoveStack*); - template + template MoveStack* generate_pawn_captures(const Position& pos, MoveStack* mlist); - template + template + MoveStack* generate_pawn_captures_diagonal(MoveStack* mlist, Bitboard pawns, Bitboard enemyPieces); + + template MoveStack* generate_pawn_noncaptures(const Position& pos, MoveStack* mlist); template @@ -105,11 +108,11 @@ namespace { assert(Piece == PAWN); if (Type == CAPTURE) - return (us == WHITE ? generate_pawn_captures(p, m) - : generate_pawn_captures(p, m)); + return (us == WHITE ? generate_pawn_captures(p, m) + : generate_pawn_captures(p, m)); else - return (us == WHITE ? generate_pawn_noncaptures(p, m) - : generate_pawn_noncaptures(p, m)); + return (us == WHITE ? generate_pawn_noncaptures(p, m) + : generate_pawn_noncaptures(p, m)); } template @@ -610,24 +613,27 @@ namespace { return mlist; } - template - MoveStack* generate_pawn_captures(const Position& pos, MoveStack* mlist) { + template + MoveStack* generate_pawn_captures_diagonal(MoveStack* mlist, Bitboard pawns, Bitboard enemyPieces) { + + // Calculate our parametrized parameters at compile time + const Bitboard TRank8BB = (Us == WHITE ? Rank8BB : Rank1BB); + const Bitboard TFileABB = (Diagonal == DELTA_NE ? FileABB : FileHBB); + const SquareDelta TDELTA_NE = (Us == WHITE ? DELTA_NE : DELTA_SE); + const SquareDelta TDELTA_NW = (Us == WHITE ? DELTA_NW : DELTA_SW); + const SquareDelta TTDELTA_NE = (Diagonal == DELTA_NE ? TDELTA_NE : TDELTA_NW); Square to; - Bitboard pawns = pos.pawns(Us); - Bitboard enemyPieces = pos.pieces_of_color(Them); - // Captures in the a1-h8 (a8-h1 for black) direction - Bitboard b1 = move_pawns(pawns) & ~FileABB & enemyPieces; + // Captures in the a1-h8 (a8-h1 for black) diagonal or in the h1-a8 (h8-a1 for black) + Bitboard b1 = move_pawns(pawns) & ~TFileABB & enemyPieces; // Capturing promotions Bitboard b2 = b1 & TRank8BB; while (b2) { to = pop_1st_bit(&b2); - (*mlist++).move = make_promotion_move(to - TDELTA_NE, to, QUEEN); + (*mlist++).move = make_promotion_move(to - TTDELTA_NE, to, QUEEN); } // Capturing non-promotions @@ -635,30 +641,29 @@ namespace { while (b2) { to = pop_1st_bit(&b2); - (*mlist++).move = make_move(to - TDELTA_NE, to); + (*mlist++).move = make_move(to - TTDELTA_NE, to); } + return mlist; + } - // Captures in the h1-a8 (h8-a1 for black) direction - b1 = move_pawns(pawns) & ~FileHBB & enemyPieces; + template + MoveStack* generate_pawn_captures(const Position& pos, MoveStack* mlist) { - // Capturing promotions - b2 = b1 & TRank8BB; - while (b2) - { - to = pop_1st_bit(&b2); - (*mlist++).move = make_promotion_move(to - TDELTA_NW, to, QUEEN); - } + // Calculate our parametrized parameters at compile time + const Color Them = (Us == WHITE ? BLACK : WHITE); + const Bitboard TRank8BB = (Us == WHITE ? Rank8BB : Rank1BB); + const SquareDelta TDELTA_N = (Us == WHITE ? DELTA_N : DELTA_S); - // Capturing non-promotions - b2 = b1 & ~TRank8BB; - while (b2) - { - to = pop_1st_bit(&b2); - (*mlist++).move = make_move(to - TDELTA_NW, to); - } + Square to; + Bitboard pawns = pos.pawns(Us); + Bitboard enemyPieces = pos.pieces_of_color(opposite_color(Us)); + + // Standard captures and capturing promotions in both directions + mlist = generate_pawn_captures_diagonal(mlist, pawns, enemyPieces); + mlist = generate_pawn_captures_diagonal(mlist, pawns, enemyPieces); // Non-capturing promotions - b1 = move_pawns(pawns) & pos.empty_squares() & TRank8BB; + Bitboard b1 = move_pawns(pawns) & pos.empty_squares() & TRank8BB; while (b1) { to = pop_1st_bit(&b1); @@ -683,16 +688,21 @@ namespace { return mlist; } - template + template MoveStack* generate_pawn_noncaptures(const Position& pos, MoveStack* mlist) { - Bitboard pawns = pos.pawns(Us); - Bitboard enemyPieces = pos.pieces_of_color(Them); - Bitboard emptySquares = pos.empty_squares(); + // Calculate our parametrized parameters at compile time + const Bitboard TRank8BB = (Us == WHITE ? Rank8BB : Rank1BB); + const Bitboard TRank3BB = (Us == WHITE ? Rank3BB : Rank6BB); + const SquareDelta TDELTA_NE = (Us == WHITE ? DELTA_NE : DELTA_SE); + const SquareDelta TDELTA_NW = (Us == WHITE ? DELTA_NW : DELTA_SW); + const SquareDelta TDELTA_N = (Us == WHITE ? DELTA_N : DELTA_S); + Bitboard b1, b2; Square to; + Bitboard pawns = pos.pawns(Us); + Bitboard enemyPieces = pos.pieces_of_color(opposite_color(Us)); + Bitboard emptySquares = pos.empty_squares(); // Underpromotion captures in the a1-h8 (a8-h1 for black) direction b1 = move_pawns(pawns) & ~FileABB & enemyPieces & TRank8BB; @@ -745,7 +755,6 @@ namespace { template MoveStack* generate_pawn_checks(const Position& pos, Bitboard dc, Square ksq, MoveStack* mlist) { - // Find all friendly pawns not on the enemy king's file Bitboard b1, b2, b3; Bitboard empty = pos.empty_squares();