From 3a4d6e2034a872d9c8550a5024bacb3bd27dcad3 Mon Sep 17 00:00:00 2001 From: Marco Costalba Date: Sat, 20 Jun 2009 08:31:39 +0100 Subject: [PATCH] Micro optimize and rename move_promotion() Rename to move_is_promotion() to be more clear, also add a new function move_promotion_piece() to get the promotion piece type in the few places where is needed. No functional change. Signed-off-by: Marco Costalba --- src/move.cpp | 4 ++-- src/move.h | 6 +++++- src/movegen.cpp | 4 ++-- src/movepick.cpp | 4 ++-- src/position.cpp | 12 ++++++------ src/san.cpp | 6 +++--- src/search.cpp | 20 ++++++++++---------- 7 files changed, 30 insertions(+), 26 deletions(-) diff --git a/src/move.cpp b/src/move.cpp index e7b9257d..065fd230 100644 --- a/src/move.cpp +++ b/src/move.cpp @@ -129,8 +129,8 @@ const std::string move_to_string(Move move) { return (from == SQ_E1 ? "e1c1" : "e8c8"); } str = square_to_string(from) + square_to_string(to); - if (move_promotion(move)) - str += piece_type_to_char(move_promotion(move), false); + if (move_is_promotion(move)) + str += piece_type_to_char(move_promotion_piece(move), false); } return str; } diff --git a/src/move.h b/src/move.h index 5a58afe6..672eade6 100644 --- a/src/move.h +++ b/src/move.h @@ -78,10 +78,14 @@ inline Square move_to(Move m) { return Square(m & 0x3F); } -inline PieceType move_promotion(Move m) { +inline PieceType move_promotion_piece(Move m) { return PieceType((int(m) >> 12) & 7); } +inline int move_is_promotion(Move m) { + return m & (7 << 12); +} + inline int move_is_ep(Move m) { return m & (1 << 15); } diff --git a/src/movegen.cpp b/src/movegen.cpp index 7558c89d..33da450e 100644 --- a/src/movegen.cpp +++ b/src/movegen.cpp @@ -506,7 +506,7 @@ bool move_is_legal(const Position& pos, const Move m, Bitboard pinned) { // be a promotion. if ( ( (square_rank(to) == RANK_8 && us == WHITE) ||(square_rank(to) == RANK_1 && us != WHITE)) - && !move_promotion(m)) + && !move_is_promotion(m)) return false; // Proceed according to the square delta between the source and @@ -560,7 +560,7 @@ bool move_is_legal(const Position& pos, const Move m, Bitboard pinned) { // Luckly we can handle all the other pieces in one go return ( pos.piece_attacks_square(pos.piece_on(from), from, to) && pos.pl_move_is_legal(m, pinned) - && !move_promotion(m)); + && !move_is_promotion(m)); } diff --git a/src/movepick.cpp b/src/movepick.cpp index 4b08e1b4..cea4efb4 100644 --- a/src/movepick.cpp +++ b/src/movepick.cpp @@ -247,7 +247,7 @@ void MovePicker::score_captures() { seeValue = pos.see(m); if (seeValue >= 0) { - if (move_promotion(m)) + if (move_is_promotion(m)) moves[i].score = QueenValueMidgame; else moves[i].score = int(pos.midgame_value_of_piece_on(move_to(m))) @@ -307,7 +307,7 @@ void MovePicker::score_qcaptures() { for (int i = 0; i < numOfMoves; i++) { Move m = moves[i].move; - if (move_promotion(m)) + if (move_is_promotion(m)) moves[i].score = QueenValueMidgame; else moves[i].score = int(pos.midgame_value_of_piece_on(move_to(m))) diff --git a/src/position.cpp b/src/position.cpp index c17c5c57..64b83385 100644 --- a/src/position.cpp +++ b/src/position.cpp @@ -555,12 +555,12 @@ bool Position::move_is_check(Move m, Bitboard dcCandidates) const { && (direction_between_squares(from, ksq) != direction_between_squares(to, ksq))) return true; - if (move_promotion(m)) // Promotion with check? + if (move_is_promotion(m)) // Promotion with check? { Bitboard b = occupied_squares(); clear_bit(&b, from); - switch (move_promotion(m)) + switch (move_promotion_piece(m)) { case KNIGHT: return bit_is_set(piece_attacks(to), ksq); @@ -721,7 +721,7 @@ void Position::do_move(Move m, StateInfo& newSt, Bitboard dcCandidates) { if (move_is_castle(m)) do_castle_move(m); - else if (move_promotion(m)) + else if (move_is_promotion(m)) do_promotion_move(m); else if (move_is_ep(m)) do_ep_move(m); @@ -1005,7 +1005,7 @@ void Position::do_promotion_move(Move m) { board[from] = EMPTY; // Insert promoted piece - promotion = move_promotion(m); + promotion = move_promotion_piece(m); assert(promotion >= KNIGHT && promotion <= QUEEN); set_bit(&(byColorBB[us]), to); set_bit(&(byTypeBB[promotion]), to); @@ -1152,7 +1152,7 @@ void Position::undo_move(Move m) { if (move_is_castle(m)) undo_castle_move(m); - else if (move_promotion(m)) + else if (move_is_promotion(m)) undo_promotion_move(m); else if (move_is_ep(m)) undo_ep_move(m); @@ -1304,7 +1304,7 @@ void Position::undo_promotion_move(Move m) { assert(piece_on(from) == EMPTY); // Remove promoted piece - promotion = move_promotion(m); + promotion = move_promotion_piece(m); assert(piece_on(to)==piece_of_color_and_type(us, promotion)); assert(promotion >= KNIGHT && promotion <= QUEEN); clear_bit(&(byColorBB[us]), to); diff --git a/src/san.cpp b/src/san.cpp index b53b2013..0aa8318e 100644 --- a/src/san.cpp +++ b/src/san.cpp @@ -113,10 +113,10 @@ const string move_to_san(const Position& pos, Move m) { san += "x"; } san += square_to_string(move_to(m)); - if (move_promotion(m)) + if (move_is_promotion(m)) { san += '='; - san += piece_type_to_char(move_promotion(m), true); + san += piece_type_to_char(move_promotion_piece(m), true); } } // Is the move check? We don't use pos.move_is_check(m) here, because @@ -273,7 +273,7 @@ Move move_from_san(const Position& pos, const string& movestr) { while ((m = mp.get_next_move()) != MOVE_NONE) if ( pos.type_of_piece_on(move_from(m)) == pt && move_to(m) == to - && move_promotion(m) == promotion + && move_promotion_piece(m) == promotion && (fromFile == FILE_NONE || fromFile == square_file(move_from(m))) && (fromRank == RANK_NONE || fromRank == square_rank(move_from(m)))) { diff --git a/src/search.cpp b/src/search.cpp index 7e501fc4..6b6ad248 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -1086,7 +1086,7 @@ namespace { && moveCount >= LMRPVMoves && !dangerous && !moveIsCapture - && !move_promotion(move) + && !move_is_promotion(move) && !move_is_castle(move) && !move_is_killer(move, ss[ply])) { @@ -1337,7 +1337,7 @@ namespace { if ( useFutilityPruning && !dangerous && !moveIsCapture - && !move_promotion(move)) + && !move_is_promotion(move)) { // History pruning. See ok_to_prune() definition if ( moveCount >= 2 + int(depth) @@ -1370,7 +1370,7 @@ namespace { && moveCount >= LMRNonPVMoves && !dangerous && !moveIsCapture - && !move_promotion(move) + && !move_is_promotion(move) && !move_is_castle(move) && !move_is_killer(move, ss[ply])) { @@ -1545,7 +1545,7 @@ namespace { if ( enoughMaterial && !isCheck && !pvNode - && !move_promotion(move) + && !move_is_promotion(move) && !pos.move_is_check(move, dcCandidates) && !pos.move_is_passed_pawn_push(move)) { @@ -1566,7 +1566,7 @@ namespace { // Don't search captures and checks with negative SEE values if ( !isCheck - && !move_promotion(move) + && !move_is_promotion(move) && (pos.midgame_value_of_piece_on(move_from(move)) > pos.midgame_value_of_piece_on(move_to(move))) && pos.see(move) < 0) @@ -1663,7 +1663,7 @@ namespace { if ( useFutilityPruning && !dangerous && !moveIsCapture - && !move_promotion(move) + && !move_is_promotion(move) && moveCount >= 2 + int(sp->depth) && ok_to_prune(pos, move, ss[sp->ply].threatMove, sp->depth, Threads[threadID].H)) continue; @@ -1677,7 +1677,7 @@ namespace { if ( !dangerous && moveCount >= LMRNonPVMoves && !moveIsCapture - && !move_promotion(move) + && !move_is_promotion(move) && !move_is_castle(move) && !move_is_killer(move, ss[sp->ply])) { @@ -1780,7 +1780,7 @@ namespace { if ( !dangerous && moveCount >= LMRPVMoves && !moveIsCapture - && !move_promotion(move) + && !move_is_promotion(move) && !move_is_castle(move) && !move_is_killer(move, ss[sp->ply])) { @@ -2236,7 +2236,7 @@ namespace { && pos.type_of_piece_on(move_to(m)) != PAWN && ( pos.non_pawn_material(WHITE) + pos.non_pawn_material(BLACK) - pos.midgame_value_of_piece_on(move_to(m)) == Value(0)) - && !move_promotion(m) + && !move_is_promotion(m) && !move_is_ep(m)) { result += PawnEndgameExtension[pvNode]; @@ -2347,7 +2347,7 @@ namespace { bool ok_to_history(const Position& pos, Move m) { - return !pos.move_is_capture(m) && !move_promotion(m); + return !pos.move_is_capture(m) && !move_is_promotion(m); } -- 2.39.2