move_t flags: mask -> value, unique castling flag (1 bit saved)

This commit is contained in:
2024-06-25 15:33:56 +02:00
parent 5cb90f5396
commit ffd5d056cc
3 changed files with 24 additions and 33 deletions

View File

@@ -86,7 +86,7 @@ pos_t *move_do(pos_t *pos, const move_t move, state_t *state)
pos_clr_sq(pos, to); /* clear square */
} else if (is_castle(move)) { /* handle rook move */
square_t rookfrom, rookto;
if (is_castle_K(move)) {
if (to > from) {
rookfrom = sq_rel(H1, us);
rookto = sq_rel(F1, us);
} else {
@@ -193,7 +193,7 @@ pos_t *move_undo(pos_t *pos, const move_t move, const state_t *state)
pos_set_sq(pos, to, pos->captured); /* restore captured piece */
} else if (is_castle(move)) { /* make reverse rook move */
square_t rookfrom, rookto;
if (is_castle_K(move)) {
if (to > from) {
rookfrom = sq_rel(F1, us);
rookto = sq_rel(H1, us);
} else {
@@ -254,7 +254,7 @@ pos_t *move_do_alt(pos_t *pos, const move_t move, state_t *state)
pos_clr_sq(pos, to); /* clear square */
} else if (is_castle(move)) { /* handle rook move */
square_t rookfrom, rookto;
if (is_castle_K(move)) {
if (to > from) {
rookfrom = sq_rel(H1, us);
rookto = sq_rel(F1, us);
} else {
@@ -344,7 +344,7 @@ pos_t *move_undo_alt(pos_t *pos, const move_t move, const state_t *state)
pos_set_sq(pos, to, pos->captured); /* restore captured piece */
} else if (is_castle(move)) { /* make reverse rook move */
square_t rookfrom, rookto;
if (is_castle_K(move)) {
if (to > from) {
rookfrom = sq_rel(F1, us);
rookto = sq_rel(H1, us);
} else {

View File

@@ -379,13 +379,13 @@ movelist_t *pos_gen_pseudo(pos_t *pos, movelist_t *movelist)
/* CHANGE HERE, either with bitmask >> or direct sq check */
bitboard_t occmask = rel_rank1 & (FILE_Fbb | FILE_Gbb);
if (!(occ & occmask)) {
*moves++ = move_make_flags(king, king + 2, M_CASTLE_K);
*moves++ = move_make_flags(king, king + 2, M_CASTLE);
}
}
if (can_ooo(pos->castle, us)) {
bitboard_t occmask = rel_rank1 & (FILE_Bbb | FILE_Cbb | FILE_Dbb);
if (!(occ & occmask)) { // &&
*moves++ = move_make_flags(king, king - 2, M_CASTLE_Q);
*moves++ = move_make_flags(king, king - 2, M_CASTLE);
}
}
}

View File

@@ -19,18 +19,15 @@
#include "board.h"
/* move structure:
* 3 3 2 2 1 1 1 1 1 1
* 1 0 4 3 8 7 5 4 2 1 6 5 0
* S UUUUUUU FFFFFF ccc ppp tttttt ffffff
* 1 1 1 1 1
* 8 5 4 2 1 6 5 0
* FFFF ppp tttttt ffffff
*
* bits len off range type mask get desc
* ffffff 6 0 0-5 square_t 077 &077 from
* tttttt 6 6 6-11 square_t 07700 (>>6) &077 to
* ppp 3 12 12-14 piece_type_t 070000 (>>12) &07 promoted
* ccc 3 15 15-17 piece_type_t 0700000 (>>15) &07 captured
* FFFFFF 6 18 18-23 move_flags_t 077000000 (>>18) &077 N/A flags
* UUUUUUU 7 24 24-30 unused 017700000000 future usage
* S 1 31 31-31 - 020000000000 sign
* bits len off range type mask get desc
* ffffff 6 0 0-5 square_t 077 &077 from
* tttttt 6 6 6-11 square_t 07700 (>>6) &077 to
* ppp 3 12 12-14 piece_type_t 070000 (>>12) &07 promoted
* FFF 3 15 15-17 move_flags_t 0700000 (>>15) &07 flags
*/
typedef s32 move_t;
@@ -42,30 +39,24 @@ enum {
M_OFF_FROM = 0,
M_OFF_TO = 6,
M_OFF_PROMOTED = 12,
// M_OFF_CAPTURED = 15,
M_OFF_FLAGS = 15
};
typedef enum {
M_PROMOTION = 070000,
// M_CAPTURE = BIT(M_OFF_FLAGS + 0),
M_ENPASSANT = BIT(M_OFF_FLAGS + 0),
M_CASTLE_K = BIT(M_OFF_FLAGS + 1), /* maybe only one ? */
M_CASTLE_Q = BIT(M_OFF_FLAGS + 2), /* maybe only one ? */
M_CHECK = BIT(M_OFF_FLAGS + 3), /* maybe unknown/useless ? */
// M_DPUSH = BIT(M_OFF_FLAGS + 7) /* pawn double push */
M_PROMOTION = 070000,
M_FLAGS_MASK = 0700000,
M_ENPASSANT = (1 << M_OFF_FLAGS),
M_CASTLE = (2 << M_OFF_FLAGS), /* maybe only one ? */
// M_CHECK = (3 << M_OFF_FLAGS) /* maybe unknown/useless ? */
} move_flags_t;
#define move_set_flags(move, flags) ((move) | (flags))
#define move_flags(move) ((move) & M_FLAGS_MASK)
//#define is_capture(m) ((m) & M_CAPTURE)
#define is_enpassant(m) ((m) & M_ENPASSANT)
#define is_promotion(m) ((m) & M_PROMOTION)
#define is_castle(m) ((m) & (M_CASTLE_K | M_CASTLE_Q))
#define is_castle_K(m) ((m) & M_CASTLE_K)
#define is_castle_Q(m) ((m) & M_CASTLE_Q)
#define is_check(m) ((m) & M_CHECK)
//#define is_dpush(m) ((m) & M_DPUSH)
#define is_promotion(m) ((m) & M_PROMOTION)
#define is_enpassant(m) (move_flags(m) == M_ENPASSANT)
#define is_castle(m) (move_flags(m) == M_CASTLE)
#define is_check(m) (move_flags(m) == M_CHECK)
#define MOVES_MAX 256