X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fmovegen.cpp;h=2972eeeed9e75f5856362f4095819e40731507dc;hb=3b857d1625c87ae3b87ea9e960b2c8d2d3284b9a;hp=a2e9c9c96578b850d9c7484be0c57d6d4b64219b;hpb=8be2c483a1d71865cda6f737d72fa11b64f73dd5;p=stockfish diff --git a/src/movegen.cpp b/src/movegen.cpp index a2e9c9c9..2972eeee 100644 --- a/src/movegen.cpp +++ b/src/movegen.cpp @@ -36,10 +36,7 @@ namespace { int generate_black_pawn_captures(const Position&, MoveStack*); int generate_white_pawn_noncaptures(const Position&, MoveStack*); int generate_black_pawn_noncaptures(const Position&, MoveStack*); - int generate_knight_moves(const Position&, MoveStack*, Color side, Bitboard t); - int generate_bishop_moves(const Position&, MoveStack*, Color side, Bitboard t); - int generate_rook_moves(const Position&, MoveStack*, Color side, Bitboard t); - int generate_queen_moves(const Position&, MoveStack*, Color side, Bitboard t); + int generate_piece_moves(PieceType, const Position&, MoveStack*, Color side, Bitboard t); int generate_king_moves(const Position&, MoveStack*, Square from, Bitboard t); int generate_castle_moves(const Position&, MoveStack*, Color us); @@ -68,10 +65,9 @@ int generate_captures(const Position& pos, MoveStack* mlist) { else n = generate_black_pawn_captures(pos, mlist); - n += generate_knight_moves(pos, mlist+n, us, target); - n += generate_bishop_moves(pos, mlist+n, us, target); - n += generate_rook_moves(pos, mlist+n, us, target); - n += generate_queen_moves(pos, mlist+n, us, target); + for (PieceType pce = KNIGHT; pce < KING; pce++) + n += generate_piece_moves(pce, pos, mlist+n, us, target); + n += generate_king_moves(pos, mlist+n, pos.king_square(us), target); return n; } @@ -94,10 +90,9 @@ int generate_noncaptures(const Position& pos, MoveStack *mlist) { else n = generate_black_pawn_noncaptures(pos, mlist); - n += generate_knight_moves(pos, mlist+n, us, target); - n += generate_bishop_moves(pos, mlist+n, us, target); - n += generate_rook_moves(pos, mlist+n, us, target); - n += generate_queen_moves(pos, mlist+n, us, target); + for (PieceType pce = KNIGHT; pce < KING; pce++) + n += generate_piece_moves(pce, pos, mlist+n, us, target); + n += generate_king_moves(pos, mlist+n, pos.king_square(us), target); n += generate_castle_moves(pos, mlist+n, us); return n; @@ -712,9 +707,8 @@ Move generate_move_if_legal(const Position &pos, Move m, Bitboard pinned) { return MOVE_NONE; // Proceed according to the type of the moving piece. - switch (type_of_piece(pc)) - { - case PAWN: + if (type_of_piece(pc) == PAWN) + { // If the destination square is on the 8/1th rank, the move must // be a promotion. if ( ( (square_rank(to) == RANK_8 && us == WHITE) @@ -768,43 +762,12 @@ Move generate_move_if_legal(const Position &pos, Move m, Bitboard pinned) { } // The move is pseudo-legal. Return it if it is legal. return (pos.move_is_legal(m) ? m : MOVE_NONE); - break; + } - case KNIGHT: - return ( pos.knight_attacks_square(from, to) - && pos.move_is_legal(m) - && !move_promotion(m) ? m : MOVE_NONE); - break; - - case BISHOP: - return ( pos.bishop_attacks_square(from, to) - && pos.move_is_legal(m) - && !move_promotion(m) ? m : MOVE_NONE); - break; - - case ROOK: - return ( pos.rook_attacks_square(from, to) - && pos.move_is_legal(m) - && !move_promotion(m) ? m : MOVE_NONE); - break; - - case QUEEN: - return ( pos.queen_attacks_square(from, to) - && pos.move_is_legal(m) - && !move_promotion(m) ? m : MOVE_NONE); - break; - - case KING: - return ( pos.king_attacks_square(from, to) - && pos.move_is_legal(m) - && !move_promotion(m) ? m : MOVE_NONE); - break; - - default: - assert(false); - } - assert(false); - return 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) + && !move_promotion(m) ? m : MOVE_NONE); } @@ -1039,74 +1002,23 @@ namespace { return n; } - - int generate_knight_moves(const Position &pos, MoveStack *mlist, - Color side, Bitboard target) { - Square from, to; - Bitboard b; - int i, n = 0; - - for(i = 0; i < pos.knight_count(side); i++) { - from = pos.knight_list(side, i); - b = pos.knight_attacks(from) & target; - while(b) { - to = pop_1st_bit(&b); - mlist[n++].move = make_move(from, to); - } - } - return n; - } - - - int generate_bishop_moves(const Position &pos, MoveStack *mlist, - Color side, Bitboard target) { - Square from, to; - Bitboard b; - int i, n = 0; - - for(i = 0; i < pos.bishop_count(side); i++) { - from = pos.bishop_list(side, i); - b = pos.bishop_attacks(from) & target; - while(b) { - to = pop_1st_bit(&b); - mlist[n++].move = make_move(from, to); - } - } - return n; - } - - - int generate_rook_moves(const Position &pos, MoveStack *mlist, - Color side, Bitboard target) { - Square from, to; - Bitboard b; - int i, n = 0; - - for(i = 0; i < pos.rook_count(side); i++) { - from = pos.rook_list(side, i); - b = pos.rook_attacks(from) & target; - while(b) { - to = pop_1st_bit(&b); - mlist[n++].move = make_move(from, to); - } - } - return n; - } - - - int generate_queen_moves(const Position &pos, MoveStack *mlist, + int generate_piece_moves(PieceType piece, const Position &pos, MoveStack *mlist, Color side, Bitboard target) { + + const Piece_attacks_fn mem_fn = piece_attacks_fn[piece]; Square from, to; Bitboard b; - int i, n = 0; + int n = 0; - for(i = 0; i < pos.queen_count(side); i++) { - from = pos.queen_list(side, i); - b = pos.queen_attacks(from) & target; - while(b) { - to = pop_1st_bit(&b); - mlist[n++].move = make_move(from, to); - } + for (int i = 0; i < pos.piece_count(side, piece); i++) + { + from = pos.piece_list(side, piece, i); + b = (pos.*mem_fn)(from) & target; + while (b) + { + to = pop_1st_bit(&b); + mlist[n++].move = make_move(from, to); + } } return n; } @@ -1184,5 +1096,4 @@ namespace { return n; } - }