#define cmk_position \
"r2q1rk1/ppp2ppp/2n1bn2/2b1p3/3pP3/3P1NPP/PPP1NPB1/R1BQ1RK1 b - - 0 9 "
typedef U32 Move;
typedef struct Move Move;
struct Move {
unsigned source : 6;
unsigned target : 6;
unsigned piece : 5;
unsigned piece_capture : 5;
unsigned piece_promote : 5;
unsigned dbl : 1;
unsigned enpassant : 1;
unsigned castle : 1;
unsigned capture : 1;
unsigned promote : 1;
};
int Move_cmp(Move a, Move b) { return *(uint32_t *)&a == *(uint32_t *)&b; }
Move Move_encode(Square src, Square tgt, Piece_T Piece, Piece_T Capture,
Piece_T Promote, int dbl, int enpassant, int castle) {
Move move = C32(0);
move |=
(src) | (tgt << 6) | (dbl << 27) | (enpassant << 28) | (castle << 29);
move |= (Piece_index(Piece) << 12);
if (Capture != NULL) {
move |= (Piece_index(Capture) << 17);
move |= (1 << 30);
}
if (Promote != NULL) {
move |= (Piece_index(Promote) << 22);
move |= (1 << 31);
}
return move;
return (Move){
.source = src,
.target = tgt,
.dbl = dbl,
.enpassant = enpassant,
.castle = castle,
.capture = Capture != NULL,
.promote = Promote != NULL,
.piece = Piece_index(Piece),
.piece_capture = Capture ? Piece_index(Capture) : 0,
.piece_promote = Promote ? Piece_index(Promote) : 0,
};
}
#define Move_source(move) (((move)&C32(0x0000003f)))
#define Move_target(move) (((move)&C32(0x00000fc0)) >> 6)
#define Move_double(move) (((move)&C32(0x08000000)) >> 27)
#define Move_enpassant(move) (((move)&C32(0x10000000)) >> 28)
#define Move_castle(move) (((move)&C32(0x20000000)) >> 29)
#define Move_capture(move) (((move)&C32(0x40000000)) >> 30)
#define Move_promote(move) (((move)&C32(0x80000000)) >> 31)
#define Move_piece(move) (Piece_fromIndex(((move)&C32(0x0001F000)) >> 12))
#define Move_piece_capture(move) \
(assert(Move_capture(move)), \
Piece_fromIndex(((move)&C32(0x003E0000)) >> 17))
#define Move_piece_promote(move) \
(assert(Move_promote(move)), \
Piece_fromIndex(((move)&C32(0x07C00000)) >> 22))
#define Move_source(move) (move.source)
#define Move_target(move) (move.target)
#define Move_double(move) (move.dbl)
#define Move_enpassant(move) (move.enpassant)
#define Move_castle(move) (move.castle)
#define Move_capture(move) (move.capture)
#define Move_promote(move) (move.promote)
#define Move_piece(move) (Piece_fromIndex(move.piece))
#define Move_piece_capture(move) (Piece_fromIndex(move.piece_capture))
#define Move_piece_promote(move) (Piece_fromIndex(move.piece_promote))
// clang-format off
const int castling_rights[64] = {