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;
}
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);
}
// 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
// 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));
}
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)))
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)))
&& (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<KNIGHT>(to), ksq);
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);
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);
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);
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);
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
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))))
{
&& moveCount >= LMRPVMoves
&& !dangerous
&& !moveIsCapture
- && !move_promotion(move)
+ && !move_is_promotion(move)
&& !move_is_castle(move)
&& !move_is_killer(move, ss[ply]))
{
if ( useFutilityPruning
&& !dangerous
&& !moveIsCapture
- && !move_promotion(move))
+ && !move_is_promotion(move))
{
// History pruning. See ok_to_prune() definition
if ( moveCount >= 2 + int(depth)
&& moveCount >= LMRNonPVMoves
&& !dangerous
&& !moveIsCapture
- && !move_promotion(move)
+ && !move_is_promotion(move)
&& !move_is_castle(move)
&& !move_is_killer(move, ss[ply]))
{
if ( enoughMaterial
&& !isCheck
&& !pvNode
- && !move_promotion(move)
+ && !move_is_promotion(move)
&& !pos.move_is_check(move, dcCandidates)
&& !pos.move_is_passed_pawn_push(move))
{
// 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)
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;
if ( !dangerous
&& moveCount >= LMRNonPVMoves
&& !moveIsCapture
- && !move_promotion(move)
+ && !move_is_promotion(move)
&& !move_is_castle(move)
&& !move_is_killer(move, ss[sp->ply]))
{
if ( !dangerous
&& moveCount >= LMRPVMoves
&& !moveIsCapture
- && !move_promotion(move)
+ && !move_is_promotion(move)
&& !move_is_castle(move)
&& !move_is_killer(move, ss[sp->ply]))
{
&& 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];
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);
}