X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fmovegen.cpp;h=f22df724952a81d82cac66616c6921641b560d5e;hp=a9683825f096513439ccdec76b7dd0737c518c2e;hb=9bffe811c44b88ba3b5dd0904539c8ca14257a35;hpb=4f5f97107ed263c4e7bd700b031ce269f94c18b4 diff --git a/src/movegen.cpp b/src/movegen.cpp index a9683825..f22df724 100644 --- a/src/movegen.cpp +++ b/src/movegen.cpp @@ -40,52 +40,30 @@ namespace { QUEEN_SIDE }; + static const bool CAPTURE = true; + static const bool NON_CAPTURE = false; + // Function bool castling_is_check(const Position&, CastlingSide); - // Template + // Main templates template MoveStack* generate_castle_moves(const Position&, MoveStack*); - // Template generate_pawn_captures() with specializations + template + MoveStack* generate_piece_checks(const Position&, MoveStack*, Color us, Bitboard, Square); + + // Helper templates + template + MoveStack* do_generate_pawn_blocking_evasions(const Position& pos, Bitboard not_pinned, + Bitboard blockSquares, MoveStack* mlist); + template MoveStack* do_generate_pawn_captures(const Position& pos, MoveStack* mlist); - template - inline MoveStack* generate_pawn_captures(const Position& p, MoveStack* m) { - return do_generate_pawn_captures(p, m); - } - template<> - inline MoveStack* generate_pawn_captures(const Position& p, MoveStack* m) { - return do_generate_pawn_captures(p, m); - } - - // Template generate_pawn_noncaptures() with specializations template MoveStack* do_generate_pawn_noncaptures(const Position& pos, MoveStack* mlist); - template - inline MoveStack* generate_pawn_noncaptures(const Position& p, MoveStack* m) { - return do_generate_pawn_noncaptures(p, m); - } - template<> - inline MoveStack* generate_pawn_noncaptures(const Position& p, MoveStack* m) { - return do_generate_pawn_noncaptures(p, m); - } - - // Template generate_pawn_blocking_evasions() with specializations - template - MoveStack* do_generate_pawn_blocking_evasions(const Position& pos, Bitboard not_pinned, - Bitboard blockSquares, MoveStack* mlist); - template - inline MoveStack* generate_pawn_blocking_evasions(const Position& p, MoveStack* m, Bitboard np, Bitboard bs) { - return do_generate_pawn_blocking_evasions(p, np, bs, m); - } - template<> - inline MoveStack* generate_pawn_blocking_evasions(const Position& p, MoveStack* m, Bitboard np, Bitboard bs) { - return do_generate_pawn_blocking_evasions(p, np, bs, m); - } - // Template generate_pawn_checks() with specializations template MoveStack* do_generate_pawn_checks(const Position&, Bitboard, Square, MoveStack*); @@ -99,17 +77,31 @@ namespace { return do_generate_pawn_checks(p, dc, ksq, m); } - // non-pawn templates + // Template generate_piece_moves() with specializations template MoveStack* generate_piece_moves(const Position&, MoveStack*, Color us, Bitboard); template<> MoveStack* generate_piece_moves(const Position& pos, MoveStack* mlist, Color us, Bitboard target); - template - MoveStack* generate_piece_checks(const Position&, MoveStack*, Color us, Bitboard, Square); + template + inline MoveStack* generate_piece_moves(const Position& p, MoveStack* m, Color us) { + + assert(Piece == PAWN); + + if (Capture) + return (us == WHITE ? do_generate_pawn_captures(p, m) + : do_generate_pawn_captures(p, m)); + else + return (us == WHITE ? do_generate_pawn_noncaptures(p, m) + : do_generate_pawn_noncaptures(p, m)); + } + // Template generate_piece_blocking_evasions() with specializations template - MoveStack* generate_piece_blocking_evasions(const Position&, MoveStack*, Bitboard, Bitboard); + MoveStack* generate_piece_blocking_evasions(const Position&, MoveStack*, Color us, Bitboard, Bitboard); + + template<> + MoveStack* generate_piece_blocking_evasions(const Position& p, MoveStack* m, Color us, Bitboard np, Bitboard bs); } @@ -134,12 +126,7 @@ int generate_captures(const Position& pos, MoveStack* mlist) { mlist = generate_piece_moves(pos, mlist, us, target); mlist = generate_piece_moves(pos, mlist, us, target); mlist = generate_piece_moves(pos, mlist, us, target); - - if (us == WHITE) - mlist = generate_pawn_captures(pos, mlist); - else - mlist = generate_pawn_captures(pos, mlist); - + mlist = generate_piece_moves(pos, mlist, us); mlist = generate_piece_moves(pos, mlist, us, target); return int(mlist - mlist_start); } @@ -157,11 +144,7 @@ int generate_noncaptures(const Position& pos, MoveStack* mlist) { Bitboard target = pos.empty_squares(); MoveStack* mlist_start = mlist; - if (us == WHITE) - mlist = generate_pawn_noncaptures(pos, mlist); - else - mlist = generate_pawn_noncaptures(pos, mlist); - + mlist = generate_piece_moves(pos, mlist, us); mlist = generate_piece_moves(pos, mlist, us, target); mlist = generate_piece_moves(pos, mlist, us, target); mlist = generate_piece_moves(pos, mlist, us, target); @@ -323,29 +306,12 @@ int generate_evasions(const Position& pos, MoveStack* mlist) { assert((pos.occupied_squares() & blockSquares) == EmptyBoardBB); - // Pawn moves. Because a blocking evasion can never be a capture, we - // only generate pawn pushes. - if (us == WHITE) - mlist = generate_pawn_blocking_evasions(pos, mlist, not_pinned, blockSquares); - else - mlist = generate_pawn_blocking_evasions(pos, mlist, not_pinned, blockSquares); - // Pieces moves - b1 = pos.knights(us) & not_pinned; - if (b1) - mlist = generate_piece_blocking_evasions(pos, mlist, b1, blockSquares); - - b1 = pos.bishops(us) & not_pinned; - if (b1) - mlist = generate_piece_blocking_evasions(pos, mlist, b1, blockSquares); - - b1 = pos.rooks(us) & not_pinned; - if (b1) - mlist = generate_piece_blocking_evasions(pos, mlist, b1, blockSquares); - - b1 = pos.queens(us) & not_pinned; - if (b1) - mlist = generate_piece_blocking_evasions(pos, mlist, b1, blockSquares); + mlist = generate_piece_blocking_evasions(pos, mlist, us, not_pinned, blockSquares); + mlist = generate_piece_blocking_evasions(pos, mlist, us, not_pinned, blockSquares); + mlist = generate_piece_blocking_evasions(pos, mlist, us, not_pinned, blockSquares); + mlist = generate_piece_blocking_evasions(pos, mlist, us, not_pinned, blockSquares); + mlist = generate_piece_blocking_evasions(pos, mlist, us, not_pinned, blockSquares); } // Finally, the ugly special case of en passant captures. An en passant @@ -621,8 +587,10 @@ namespace { } template - MoveStack* generate_piece_blocking_evasions(const Position& pos, MoveStack* mlist, - Bitboard b, Bitboard blockSquares) { + MoveStack* generate_piece_blocking_evasions(const Position& pos, MoveStack* mlist, Color us, + Bitboard not_pinned, Bitboard blockSquares) { + + Bitboard b = pos.pieces_of_color_and_type(us, Piece) & not_pinned; while (b) { Square from = pop_1st_bit(&b); @@ -632,6 +600,14 @@ namespace { return mlist; } + template<> + MoveStack* generate_piece_blocking_evasions(const Position& p, MoveStack* m, Color us, + Bitboard np, Bitboard bs) { + if (us == WHITE) + return do_generate_pawn_blocking_evasions(p, np, bs, m); + else + return do_generate_pawn_blocking_evasions(p, np, bs, m); + } template