X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fmovegen.cpp;h=5543af7cbd5dc61882f8640416532716f9f90e8b;hp=54af3222e5b21b7657edf691a791d1fbc8d5cbf1;hb=d155cd88d1ca914c8a9d398c0164b5a92a5b9629;hpb=af5743837d1fc52466d40ecd6394bee9db7a053d diff --git a/src/movegen.cpp b/src/movegen.cpp index 54af3222..5543af7c 100644 --- a/src/movegen.cpp +++ b/src/movegen.cpp @@ -25,6 +25,9 @@ #include "movegen.h" +// Simple macro to wrap a very common while loop, no facny, no flexibility, +// hardcoded list name 'mlist' and from square 'from'. +#define SERIALIZE_MOVES(b) while (b) (*mlist++).move = make_move(from, pop_1st_bit(&b)) //// //// Local definitions @@ -400,6 +403,7 @@ Move generate_move_if_legal(const Position& pos, Move m, Bitboard pinned) { assert(pos.is_ok()); assert(!pos.is_check()); assert(move_is_ok(m)); + assert(pinned == pos.pinned_pieces(pos.side_to_move())); Color us = pos.side_to_move(); Color them = opposite_color(us); @@ -426,7 +430,7 @@ Move generate_move_if_legal(const Position& pos, Move m, Bitboard pinned) { assert(pos.piece_on(to - pawn_push(us)) == pawn_of_color(them)); // The move is pseudo-legal. If it is legal, return it. - return (pos.move_is_legal(m) ? m : MOVE_NONE); + return (pos.move_is_legal(m, pinned) ? m : MOVE_NONE); } // Castling moves @@ -558,12 +562,12 @@ Move generate_move_if_legal(const Position& pos, Move m, Bitboard pinned) { return MOVE_NONE; } // The move is pseudo-legal. Return it if it is legal. - return (pos.move_is_legal(m) ? m : MOVE_NONE); + return (pos.move_is_legal(m, pinned) ? m : MOVE_NONE); } // Luckly we can handle all the other pieces in one go return ( pos.piece_attacks_square(from, to) - && pos.move_is_legal(m) + && pos.move_is_legal(m, pinned) && !move_promotion(m) ? m : MOVE_NONE); } @@ -573,18 +577,14 @@ namespace { template MoveStack* generate_piece_moves(const Position& pos, MoveStack* mlist, Color us, Bitboard target) { - Square from, to; + Square from; Bitboard b; for (int i = 0, e = pos.piece_count(us, Piece); i < e; i++) { from = pos.piece_list(us, Piece, i); b = pos.piece_attacks(from) & target; - while (b) - { - to = pop_1st_bit(&b); - (*mlist++).move = make_move(from, to); - } + SERIALIZE_MOVES(b); } return mlist; } @@ -593,14 +593,10 @@ namespace { MoveStack* generate_piece_moves(const Position& pos, MoveStack* mlist, Color us, Bitboard target) { Bitboard b; - Square to, from = pos.king_square(us); + Square from = pos.king_square(us); b = pos.piece_attacks(from) & target; - while (b) - { - to = pop_1st_bit(&b); - (*mlist++).move = make_move(from, to); - } + SERIALIZE_MOVES(b); return mlist; } @@ -611,11 +607,7 @@ namespace { { Square from = pop_1st_bit(&b); Bitboard bb = pos.piece_attacks(from) & blockSquares; - while (bb) - { - Square to = pop_1st_bit(&bb); - (*mlist++).move = make_move(from, to); - } + SERIALIZE_MOVES(bb); } return mlist; } @@ -626,7 +618,7 @@ namespace { > MoveStack* do_generate_pawn_captures(const Position& pos, MoveStack* mlist) { - Square sq; + Square to; Bitboard pawns = pos.pawns(Us); Bitboard enemyPieces = pos.pieces_of_color(Them); @@ -637,16 +629,16 @@ namespace { Bitboard b2 = b1 & TRank8BB; while (b2) { - sq = pop_1st_bit(&b2); - (*mlist++).move = make_promotion_move(sq - TDELTA_NE, sq, QUEEN); + to = pop_1st_bit(&b2); + (*mlist++).move = make_promotion_move(to - TDELTA_NE, to, QUEEN); } // Capturing non-promotions b2 = b1 & ~TRank8BB; while (b2) { - sq = pop_1st_bit(&b2); - (*mlist++).move = make_move(sq - TDELTA_NE, sq); + to = pop_1st_bit(&b2); + (*mlist++).move = make_move(to - TDELTA_NE, to); } // Captures in the h1-a8 (h8-a1 for black) direction @@ -656,24 +648,24 @@ namespace { b2 = b1 & TRank8BB; while (b2) { - sq = pop_1st_bit(&b2); - (*mlist++).move = make_promotion_move(sq - TDELTA_NW, sq, QUEEN); + to = pop_1st_bit(&b2); + (*mlist++).move = make_promotion_move(to - TDELTA_NW, to, QUEEN); } // Capturing non-promotions b2 = b1 & ~TRank8BB; while (b2) { - sq = pop_1st_bit(&b2); - (*mlist++).move = make_move(sq - TDELTA_NW, sq); + to = pop_1st_bit(&b2); + (*mlist++).move = make_move(to - TDELTA_NW, to); } // Non-capturing promotions b1 = (Us == WHITE ? pawns << 8 : pawns >> 8) & pos.empty_squares() & TRank8BB; while (b1) { - sq = pop_1st_bit(&b1); - (*mlist++).move = make_promotion_move(sq - TDELTA_N, sq, QUEEN); + to = pop_1st_bit(&b1); + (*mlist++).move = make_promotion_move(to - TDELTA_N, to, QUEEN); } // En passant captures @@ -687,8 +679,8 @@ namespace { while (b1) { - sq = pop_1st_bit(&b1); - (*mlist++).move = make_ep_move(sq, pos.ep_square()); + to = pop_1st_bit(&b1); + (*mlist++).move = make_ep_move(to, pos.ep_square()); } } return mlist; @@ -703,26 +695,26 @@ namespace { Bitboard enemyPieces = pos.pieces_of_color(Them); Bitboard emptySquares = pos.empty_squares(); Bitboard b1, b2; - Square sq; + Square to; // Underpromotion captures in the a1-h8 (a8-h1 for black) direction b1 = (Us == WHITE ? pawns << 9 : pawns >> 7) & ~FileABB & enemyPieces & TRank8BB; while (b1) { - sq = pop_1st_bit(&b1); - (*mlist++).move = make_promotion_move(sq - TDELTA_NE, sq, ROOK); - (*mlist++).move = make_promotion_move(sq - TDELTA_NE, sq, BISHOP); - (*mlist++).move = make_promotion_move(sq - TDELTA_NE, sq, KNIGHT); + to = pop_1st_bit(&b1); + (*mlist++).move = make_promotion_move(to - TDELTA_NE, to, ROOK); + (*mlist++).move = make_promotion_move(to - TDELTA_NE, to, BISHOP); + (*mlist++).move = make_promotion_move(to - TDELTA_NE, to, KNIGHT); } // Underpromotion captures in the h1-a8 (h8-a1 for black) direction b1 = (Us == WHITE ? pawns << 7 : pawns >> 9) & ~FileHBB & enemyPieces & TRank8BB; while (b1) { - sq = pop_1st_bit(&b1); - (*mlist++).move = make_promotion_move(sq - TDELTA_NW, sq, ROOK); - (*mlist++).move = make_promotion_move(sq - TDELTA_NW, sq, BISHOP); - (*mlist++).move = make_promotion_move(sq - TDELTA_NW, sq, KNIGHT); + to = pop_1st_bit(&b1); + (*mlist++).move = make_promotion_move(to - TDELTA_NW, to, ROOK); + (*mlist++).move = make_promotion_move(to - TDELTA_NW, to, BISHOP); + (*mlist++).move = make_promotion_move(to - TDELTA_NW, to, KNIGHT); } // Single pawn pushes @@ -730,24 +722,24 @@ namespace { b2 = b1 & TRank8BB; while (b2) { - sq = pop_1st_bit(&b2); - (*mlist++).move = make_promotion_move(sq - TDELTA_N, sq, ROOK); - (*mlist++).move = make_promotion_move(sq - TDELTA_N, sq, BISHOP); - (*mlist++).move = make_promotion_move(sq - TDELTA_N, sq, KNIGHT); + to = pop_1st_bit(&b2); + (*mlist++).move = make_promotion_move(to - TDELTA_N, to, ROOK); + (*mlist++).move = make_promotion_move(to - TDELTA_N, to, BISHOP); + (*mlist++).move = make_promotion_move(to - TDELTA_N, to, KNIGHT); } b2 = b1 & ~TRank8BB; while (b2) { - sq = pop_1st_bit(&b2); - (*mlist++).move = make_move(sq - TDELTA_N, sq); + to = pop_1st_bit(&b2); + (*mlist++).move = make_move(to - TDELTA_N, to); } // Double pawn pushes b2 = (Us == WHITE ? (b1 & TRank3BB) << 8 : (b1 & TRank3BB) >> 8) & emptySquares; while (b2) { - sq = pop_1st_bit(&b2); - (*mlist++).move = make_move(sq - TDELTA_N - TDELTA_N, sq); + to = pop_1st_bit(&b2); + (*mlist++).move = make_move(to - TDELTA_N - TDELTA_N, to); } return mlist; } @@ -816,11 +808,7 @@ namespace { { Square from = pop_1st_bit(&b); Bitboard bb = pos.piece_attacks(from) & pos.empty_squares(); - while (bb) - { - Square to = pop_1st_bit(&bb); - (*mlist++).move = make_move(from, to); - } + SERIALIZE_MOVES(bb); } // Direct checks b = target & ~dc; @@ -829,11 +817,7 @@ namespace { { Square from = pop_1st_bit(&b); Bitboard bb = pos.piece_attacks(from) & checkSqs; - while (bb) - { - Square to = pop_1st_bit(&bb); - (*mlist++).move = make_move(from, to); - } + SERIALIZE_MOVES(bb); } return mlist; } @@ -845,11 +829,7 @@ namespace { Bitboard b = pos.piece_attacks(from) & pos.empty_squares() & ~QueenPseudoAttacks[ksq]; - while (b) - { - Square to = pop_1st_bit(&b); - (*mlist++).move = make_move(from, to); - } + SERIALIZE_MOVES(b); } return mlist; } @@ -858,6 +838,8 @@ namespace { template MoveStack* do_generate_pawn_blocking_evasions(const Position& pos, Bitboard not_pinned, Bitboard blockSquares, MoveStack* mlist) { + Square to; + // Find non-pinned pawns Bitboard b1 = pos.pawns(Us) & not_pinned; @@ -866,7 +848,7 @@ namespace { Bitboard b2 = (Us == WHITE ? b1 << 8 : b1 >> 8) & blockSquares; while (b2) { - Square to = pop_1st_bit(&b2); + to = pop_1st_bit(&b2); assert(pos.piece_on(to) == EMPTY); @@ -885,7 +867,7 @@ namespace { b2 = (Us == WHITE ? b2 << 8 : b2 >> 8) & blockSquares;; while (b2) { - Square to = pop_1st_bit(&b2); + to = pop_1st_bit(&b2); assert(pos.piece_on(to) == EMPTY); assert(Us != WHITE || square_rank(to) == RANK_4);