#define DebugOut { static int count = 0; \
if ( count++ < 16 ) { out_CSA_posi( ptree, stdout, 0 ); } }
-static int can_w_king_escape( tree_t * restrict ptree, int to, bitboard_t bb );
-static int can_b_king_escape( tree_t * restrict ptree, int to, bitboard_t bb );
-static int can_w_piece_capture( const tree_t * restrict ptree, int to );
-static int can_b_piece_capture( const tree_t * restrict ptree, int to );
+static int CONV can_w_king_escape( tree_t * restrict ptree, int to,
+ const bitboard_t * restrict pbb );
+static int CONV can_b_king_escape( tree_t * restrict ptree, int to,
+ const bitboard_t * restrict pbb );
+static int CONV can_w_piece_capture( const tree_t * restrict ptree, int to );
+static int CONV can_b_piece_capture( const tree_t * restrict ptree, int to );
-unsigned int
+unsigned int CONV
is_b_mate_in_1ply( tree_t * restrict ptree )
{
bitboard_t bb, bb_temp, bb_check, bb_check_pro, bb_attacks, bb_drop, bb_move;
if ( IsHandRook(HAND_B) ) {
- BBAnd( bb, abb_w_gold_attacks[SQ_WKING],
- abb_b_gold_attacks[SQ_WKING] );
+ BBAnd( bb, abb_w_gold_attacks[SQ_WKING], abb_b_gold_attacks[SQ_WKING] );
BBAnd( bb, bb, bb_drop );
- while( BBToU(bb) )
+ while( BBTest(bb) )
{
to = FirstOne( bb );
Xor( to, bb );
if ( ! is_white_attacked( ptree, to ) ) { continue; }
- bb_attacks = abb_file_attacks[to][0];
- bb_attacks.p[aslide[to].ir0] |= ai_rook_attacks_r0[to][0];
- if ( can_w_king_escape( ptree, to, bb_attacks ) ) { continue; }
- if ( can_w_piece_capture( ptree, to ) ) { continue; }
+ BBOr( bb_attacks, abb_file_attacks[to][0], abb_rank_attacks[to][0] );
+ if ( can_w_king_escape( ptree, to, &bb_attacks ) ) { continue; }
+ if ( can_w_piece_capture( ptree, to ) ) { continue; }
return To2Move(to) | Drop2Move(rook);
}
if ( ! BOARD[to] && is_white_attacked( ptree, to ) )
{
bb_attacks = abb_file_attacks[to][0];
- if ( ! can_w_king_escape( ptree, to, bb_attacks )
+ if ( ! can_w_king_escape( ptree, to, &bb_attacks )
&& ! can_w_piece_capture( ptree, to ) )
{
return To2Move(to) | Drop2Move(lance);
BBAnd( bb, abb_w_silver_attacks[SQ_WKING],
abb_b_silver_attacks[SQ_WKING] );
BBAnd( bb, bb, bb_drop );
- while( BBToU(bb) )
+ while( BBTest(bb) )
{
to = FirstOne( bb );
Xor( to, bb );
BBOr( bb_attacks, abb_bishop_attacks_rr45[to][0],
abb_bishop_attacks_rl45[to][0] );
- if ( can_w_king_escape( ptree, to, bb_attacks ) ) { continue; }
- if ( can_w_piece_capture( ptree, to ) ) { continue; }
+ if ( can_w_king_escape( ptree, to, &bb_attacks ) ) { continue; }
+ if ( can_w_piece_capture( ptree, to ) ) { continue; }
return To2Move(to) | Drop2Move(bishop);
}
}
{
BBAnd( bb, abb_b_gold_attacks[SQ_WKING],
abb_b_silver_attacks[SQ_WKING] );
- BBNot( bb, bb );
- BBAnd( bb, bb, bb_drop );
+ BBNotAnd( bb, bb_drop, bb );
BBAnd( bb, bb, abb_w_gold_attacks[SQ_WKING] );
}
else { BBAnd( bb, bb_drop, abb_w_gold_attacks[SQ_WKING] ); }
- while ( BBToU(bb) )
+ while ( BBTest(bb) )
{
to = FirstOne( bb );
Xor( to, bb );
if ( ! is_white_attacked( ptree, to ) ) { continue; }
bb_attacks = abb_b_gold_attacks[to];
- if ( can_w_king_escape( ptree, to, bb_attacks ) ) { continue; }
- if ( can_w_piece_capture( ptree, to ) ) { continue; }
+ if ( can_w_king_escape( ptree, to, &bb_attacks ) ) { continue; }
+ if ( can_w_piece_capture( ptree, to ) ) { continue; }
return To2Move(to) | Drop2Move(gold);
}
}
if ( IsHandGold(HAND_B) )
{
if ( IsHandBishop(HAND_B) ) { goto b_silver_drop_end; }
- BBNot( bb, abb_w_gold_attacks[SQ_WKING] );
- BBAnd( bb, bb, abb_w_silver_attacks[SQ_WKING] );
+ BBNotAnd( bb,
+ abb_w_silver_attacks[SQ_WKING],
+ abb_w_gold_attacks[SQ_WKING] );
BBAnd( bb, bb, bb_drop );
}
else {
}
}
- while ( BBToU(bb) )
+ while ( BBTest(bb) )
{
to = FirstOne( bb );
Xor( to, bb );
if ( ! is_white_attacked( ptree, to ) ) { continue; }
bb_attacks = abb_b_silver_attacks[to];
- if ( can_w_king_escape( ptree, to, bb_attacks ) ) { continue; }
- if ( can_w_piece_capture( ptree, to ) ) { continue; }
+ if ( can_w_king_escape( ptree, to, &bb_attacks ) ) { continue; }
+ if ( can_w_piece_capture( ptree, to ) ) { continue; }
return To2Move(to) | Drop2Move(silver);
}
}
if ( IsHandKnight(HAND_B) ) {
BBAnd( bb, bb_drop, abb_w_knight_attacks[SQ_WKING] );
- while ( BBToU(bb) )
+ while ( BBTest(bb) )
{
to = FirstOne( bb );
Xor( to, bb );
BBIni( bb_attacks );
- if ( can_w_king_escape( ptree, to, bb_attacks ) ) { continue; }
- if ( can_w_piece_capture( ptree, to ) ) { continue; }
+ if ( can_w_king_escape( ptree, to, &bb_attacks ) ) { continue; }
+ if ( can_w_piece_capture( ptree, to ) ) { continue; }
return To2Move(to) | Drop2Move(knight);
}
}
BBNot( bb_move, BB_BOCCUPY );
bb = BB_BDRAGON;
- while ( BBToU(bb) ) {
+ while ( BBTest(bb) ) {
from = FirstOne( bb );
Xor( from, bb );
AttackDragon( bb_attacks, from );
BBAnd( bb_check, bb_move, bb_attacks );
BBAnd( bb_check, bb_check, abb_king_attacks[SQ_WKING] );
- if ( ! BBToU(bb_check) ) { continue; }
+ if ( ! BBTest(bb_check) ) { continue; }
Xor( from, BB_B_HDK );
Xor( from, BB_B_RD );
if ( (int)adirec[SQ_WKING][to] & flag_cross )
{
- bb_attacks = abb_file_attacks[to][0];
- bb_attacks.p[aslide[to].ir0] |= ai_rook_attacks_r0[to][0];
+ BBOr( bb_attacks, abb_file_attacks[to][0], abb_rank_attacks[to][0] );
BBOr( bb_attacks, bb_attacks, abb_king_attacks[to] );
}
else { AttackDragon( bb_attacks, to ); }
- if ( can_w_king_escape( ptree, to, bb_attacks ) ) { continue; }
+ if ( can_w_king_escape( ptree, to, &bb_attacks ) ) { continue; }
if ( IsDiscoverWK( from, to ) );
- else if ( can_w_piece_capture( ptree, to ) ) { continue; }
- if ( IsDiscoverBK( from, to ) ) { continue; }
+ else if ( can_w_piece_capture( ptree, to ) ) { continue; }
+ if ( IsDiscoverBK( from, to ) ) { continue; }
XorFile( from, OCCUPIED_FILE );
XorDiag2( from, OCCUPIED_DIAG2 );
Xor( from, BB_B_HDK );
return ( To2Move(to) | From2Move(from)
| Cap2Move(-BOARD[to]) | Piece2Move(dragon) );
- } while ( BBToU(bb_check) );
+ } while ( BBTest(bb_check) );
XorFile( from, OCCUPIED_FILE );
XorDiag2( from, OCCUPIED_DIAG2 );
AttackRook( bb_attacks, from );
BBAnd( bb_check, bb_move, bb_attacks );
BBAnd( bb_check, bb_check, abb_king_attacks[SQ_WKING] );
- if ( ! BBToU(bb_check) ) { continue; }
+ if ( ! BBTest(bb_check) ) { continue; }
BB_B_RD.p[0] ^= abb_mask[from].p[0];
BB_BOCCUPY.p[0] ^= abb_mask[from].p[0];
if ( (int)adirec[SQ_WKING][to] & flag_cross )
{
- bb_attacks = abb_file_attacks[to][0];
- bb_attacks.p[aslide[to].ir0] |= ai_rook_attacks_r0[to][0];
+ BBOr( bb_attacks, abb_file_attacks[to][0], abb_rank_attacks[to][0] );
BBOr( bb_attacks, bb_attacks, abb_king_attacks[to] );
}
else { AttackDragon( bb_attacks, to ); }
- if ( can_w_king_escape( ptree, to, bb_attacks ) ) { continue; }
+ if ( can_w_king_escape( ptree, to, &bb_attacks ) ) { continue; }
if ( IsDiscoverWK( from, to ) );
- else if ( can_w_piece_capture( ptree, to ) ) { continue; }
- if ( IsDiscoverBK( from, to ) ) { continue; }
+ else if ( can_w_piece_capture( ptree, to ) ) { continue; }
+ if ( IsDiscoverBK( from, to ) ) { continue; }
XorFile( from, OCCUPIED_FILE );
XorDiag2( from, OCCUPIED_DIAG2 );
BB_B_RD.p[0] ^= abb_mask[from].p[0];
return ( To2Move(to) | From2Move(from) | FLAG_PROMO
| Cap2Move(-BOARD[to]) | Piece2Move(rook) );
- } while ( BBToU(bb_check) );
+ } while ( BBTest(bb_check) );
XorFile( from, OCCUPIED_FILE );
XorDiag2( from, OCCUPIED_DIAG2 );
bb_check.p[2] &= abb_b_gold_attacks[SQ_WKING].p[2];
bb_check.p[1] &= abb_w_gold_attacks[SQ_WKING].p[1];
bb_check.p[2] &= abb_w_gold_attacks[SQ_WKING].p[2];
- if ( ! BBToU(bb_check) ) { continue; }
+ if ( ! BBTest(bb_check) ) { continue; }
BB_B_RD.p[1] ^= abb_mask[from].p[1];
BB_B_RD.p[2] ^= abb_mask[from].p[2];
if ( to <= I7 ) {
if ( (int)adirec[SQ_WKING][to] & flag_cross )
{
- bb_attacks = abb_file_attacks[to][0];
- bb_attacks.p[aslide[to].ir0] |= ai_rook_attacks_r0[to][0];
+ BBOr(bb_attacks, abb_file_attacks[to][0], abb_rank_attacks[to][0]);
bb_attacks.p[0] |= abb_king_attacks[to].p[0];
bb_attacks.p[1] |= abb_king_attacks[to].p[1];
}
else { AttackDragon( bb_attacks, to ); }
} else {
- bb_attacks = abb_file_attacks[to][0];
- bb_attacks.p[aslide[to].ir0] |= ai_rook_attacks_r0[to][0];
+ BBOr( bb_attacks, abb_file_attacks[to][0], abb_rank_attacks[to][0] );
}
- if ( can_w_king_escape( ptree, to, bb_attacks ) ) { continue; }
+ if ( can_w_king_escape( ptree, to, &bb_attacks ) ) { continue; }
if ( IsDiscoverWK( from, to ) );
- else if ( can_w_piece_capture( ptree, to ) ) { continue; }
- if ( IsDiscoverBK( from, to ) ) { continue; }
+ else if ( can_w_piece_capture( ptree, to ) ) { continue; }
+ if ( IsDiscoverBK( from, to ) ) { continue; }
XorFile( from, OCCUPIED_FILE );
XorDiag2( from, OCCUPIED_DIAG2 );
return ( To2Move(to) | From2Move(from)
| ( (to < A6) ? FLAG_PROMO : 0 )
| Cap2Move(-BOARD[to]) | Piece2Move(rook) );
- } while ( BBToU(bb_check) );
+ } while ( BBTest(bb_check) );
XorFile( from, OCCUPIED_FILE );
XorDiag2( from, OCCUPIED_DIAG2 );
}
bb = BB_BHORSE;
- while ( BBToU(bb) ) {
+ while ( BBTest(bb) ) {
from = FirstOne( bb );
Xor( from, bb );
AttackHorse( bb_attacks, from );
BBAnd( bb_check, bb_move, bb_attacks );
BBAnd( bb_check, bb_check, abb_king_attacks[SQ_WKING] );
- if ( ! BBToU(bb_check) ) { continue; }
+ if ( ! BBTest(bb_check) ) { continue; }
Xor( from, BB_B_HDK );
Xor( from, BB_B_BH );
BBOr( bb_attacks, abb_bishop_attacks_rr45[to][0],
abb_bishop_attacks_rl45[to][0] );
BBOr( bb_attacks, bb_attacks, abb_king_attacks[to] );
- if ( can_w_king_escape( ptree, to, bb_attacks ) ) { continue; }
+ if ( can_w_king_escape( ptree, to, &bb_attacks ) ) { continue; }
if ( IsDiscoverWK( from, to ) );
- else if ( can_w_piece_capture( ptree, to ) ) { continue; }
- if ( IsDiscoverBK( from, to ) ) { continue; }
+ else if ( can_w_piece_capture( ptree, to ) ) { continue; }
+ if ( IsDiscoverBK( from, to ) ) { continue; }
XorFile( from, OCCUPIED_FILE );
XorDiag2( from, OCCUPIED_DIAG2 );
Xor( from, BB_B_HDK );
return ( To2Move(to) | From2Move(from)
| Cap2Move(-BOARD[to]) | Piece2Move(horse) );
- } while ( BBToU(bb_check) );
+ } while ( BBTest(bb_check) );
XorFile( from, OCCUPIED_FILE );
XorDiag2( from, OCCUPIED_DIAG2 );
AttackBishop( bb_attacks, from );
BBAnd( bb_check, bb_move, bb_attacks );
BBAnd( bb_check, bb_check, abb_king_attacks[SQ_WKING] );
- if ( ! BBToU(bb_check) ) { continue; }
+ if ( ! BBTest(bb_check) ) { continue; }
BB_B_BH.p[0] ^= abb_mask[from].p[0];
BB_BOCCUPY.p[0] ^= abb_mask[from].p[0];
BBOr( bb_attacks, abb_bishop_attacks_rr45[to][0],
abb_bishop_attacks_rl45[to][0] );
BBOr( bb_attacks, bb_attacks, abb_king_attacks[to] );
- if ( can_w_king_escape( ptree, to, bb_attacks ) ) { continue; }
+ if ( can_w_king_escape( ptree, to, &bb_attacks ) ) { continue; }
if ( IsDiscoverWK( from, to ) );
- else if ( can_w_piece_capture( ptree, to ) ) { continue; }
- if ( IsDiscoverBK( from, to ) ) { continue; }
+ else if ( can_w_piece_capture( ptree, to ) ) { continue; }
+ if ( IsDiscoverBK( from, to ) ) { continue; }
XorFile( from, OCCUPIED_FILE );
XorDiag2( from, OCCUPIED_DIAG2 );
BB_B_BH.p[0] ^= abb_mask[from].p[0];
return ( To2Move(to) | From2Move(from) | FLAG_PROMO
| Cap2Move(-BOARD[to]) | Piece2Move(bishop) );
- } while ( BBToU(bb_check) );
+ } while ( BBTest(bb_check) );
XorFile( from, OCCUPIED_FILE );
XorDiag2( from, OCCUPIED_DIAG2 );
bb_check.p[2] &= abb_b_silver_attacks[SQ_WKING].p[2];
bb_check.p[1] &= abb_w_silver_attacks[SQ_WKING].p[1];
bb_check.p[2] &= abb_w_silver_attacks[SQ_WKING].p[2];
- if ( ! BBToU(bb_check) ) { continue; }
+ if ( ! BBTest(bb_check) ) { continue; }
BB_B_BH.p[1] ^= abb_mask[from].p[1];
BB_B_BH.p[2] ^= abb_mask[from].p[2];
bb_attacks.p[0] |= abb_king_attacks[to].p[0];
bb_attacks.p[1] |= abb_king_attacks[to].p[1];
}
- if ( can_w_king_escape( ptree, to, bb_attacks ) ) { continue; }
+ if ( can_w_king_escape( ptree, to, &bb_attacks ) ) { continue; }
if ( IsDiscoverWK( from, to ) );
- else if ( can_w_piece_capture( ptree, to ) ) { continue; }
- if ( IsDiscoverBK( from, to ) ) { continue; }
+ else if ( can_w_piece_capture( ptree, to ) ) { continue; }
+ if ( IsDiscoverBK( from, to ) ) { continue; }
XorFile( from, OCCUPIED_FILE );
XorDiag2( from, OCCUPIED_DIAG2 );
return ( To2Move(to) | From2Move(from)
| ( (to < A6) ? FLAG_PROMO : 0 )
| Cap2Move(-BOARD[to]) | Piece2Move(bishop) );
- } while ( BBToU(bb_check) );
+ } while ( BBTest(bb_check) );
XorFile( from, OCCUPIED_FILE );
XorDiag2( from, OCCUPIED_DIAG2 );
}
BBAnd( bb, BB_BTGOLD, b_chk_tbl[SQ_WKING].gold );
- while ( BBToU(bb) ) {
+ while ( BBTest(bb) ) {
from = FirstOne( bb );
Xor( from, bb );
BBAnd( bb_check, bb_move, abb_b_gold_attacks[from] );
BBAnd( bb_check, bb_check, abb_w_gold_attacks[SQ_WKING] );
- if ( ! BBToU(bb_check) ) { continue; }
+ if ( ! BBTest(bb_check) ) { continue; }
Xor( from, BB_BTGOLD );
Xor( from, BB_BOCCUPY );
if ( ! is_white_attacked( ptree, to ) ) { continue; }
bb_attacks = abb_b_gold_attacks[to];
- if ( can_w_king_escape( ptree, to, bb_attacks ) ) { continue; }
+ if ( can_w_king_escape( ptree, to, &bb_attacks ) ) { continue; }
if ( IsDiscoverWK( from, to ) );
- else if ( can_w_piece_capture( ptree, to ) ) { continue; }
- if ( IsDiscoverBK( from, to ) ) { continue; }
+ else if ( can_w_piece_capture( ptree, to ) ) { continue; }
+ if ( IsDiscoverBK( from, to ) ) { continue; }
XorFile( from, OCCUPIED_FILE );
XorDiag2( from, OCCUPIED_DIAG2 );
Xor( from, BB_BTGOLD );
return ( To2Move(to) | From2Move(from)
| Cap2Move(-BOARD[to]) | Piece2Move(BOARD[from]) );
- } while ( BBToU(bb_check) );
+ } while ( BBTest(bb_check) );
XorFile( from, OCCUPIED_FILE );
XorDiag2( from, OCCUPIED_DIAG2 );
if ( ! is_white_attacked( ptree, to ) ) { continue; }
bb_attacks = abb_b_gold_attacks[to];
- if ( can_w_king_escape( ptree, to, bb_attacks ) ) { continue; }
+ if ( can_w_king_escape( ptree, to, &bb_attacks ) ) { continue; }
if ( IsDiscoverWK( from, to ) );
- else if ( can_w_piece_capture( ptree, to ) ) { continue; }
- if ( IsDiscoverBK( from, to ) ) { continue; }
+ else if ( can_w_piece_capture( ptree, to ) ) { continue; }
+ if ( IsDiscoverBK( from, to ) ) { continue; }
XorFile( from, OCCUPIED_FILE );
XorDiag2( from, OCCUPIED_DIAG2 );
if ( ! is_white_attacked( ptree, to ) ) { continue; }
bb_attacks = abb_b_silver_attacks[to];
- if ( can_w_king_escape( ptree, to, bb_attacks ) ) { continue; }
+ if ( can_w_king_escape( ptree, to, &bb_attacks ) ) { continue; }
if ( IsDiscoverWK( from, to ) );
- else if ( can_w_piece_capture( ptree, to ) ) { continue; }
- if ( IsDiscoverBK( from, to ) ) { continue; }
+ else if ( can_w_piece_capture( ptree, to ) ) { continue; }
+ if ( IsDiscoverBK( from, to ) ) { continue; }
XorFile( from, OCCUPIED_FILE );
XorDiag2( from, OCCUPIED_DIAG2 );
if ( ! is_white_attacked( ptree, to ) ) { continue; }
bb_attacks = abb_b_gold_attacks[to];
- if ( can_w_king_escape( ptree, to, bb_attacks ) ) { continue; }
+ if ( can_w_king_escape( ptree, to, &bb_attacks ) ) { continue; }
if ( IsDiscoverWK( from, to ) );
- else if ( can_w_piece_capture( ptree, to ) ) { continue; }
- if ( IsDiscoverBK( from, to ) ) { continue; }
+ else if ( can_w_piece_capture( ptree, to ) ) { continue; }
+ if ( IsDiscoverBK( from, to ) ) { continue; }
XorFile( from, OCCUPIED_FILE );
XorDiag2( from, OCCUPIED_DIAG2 );
if ( ! is_white_attacked( ptree, to ) ) { continue; }
bb_attacks = abb_b_silver_attacks[to];
- if ( can_w_king_escape( ptree, to, bb_attacks ) ) { continue; }
+ if ( can_w_king_escape( ptree, to, &bb_attacks ) ) { continue; }
if ( IsDiscoverWK( from, to ) );
- else if ( can_w_piece_capture( ptree, to ) ) { continue; }
- if ( IsDiscoverBK( from, to ) ) { continue; }
+ else if ( can_w_piece_capture( ptree, to ) ) { continue; }
+ if ( IsDiscoverBK( from, to ) ) { continue; }
XorFile( from, OCCUPIED_FILE );
XorDiag2( from, OCCUPIED_DIAG2 );
if ( ! is_white_attacked( ptree, to ) ) { continue; }
bb_attacks = abb_b_silver_attacks[to];
- if ( can_w_king_escape( ptree, to, bb_attacks ) ) { continue; }
+ if ( can_w_king_escape( ptree, to, &bb_attacks ) ) { continue; }
if ( IsDiscoverWK( from, to ) );
- else if ( can_w_piece_capture( ptree, to ) ) { continue; }
- if ( IsDiscoverBK( from, to ) ) { continue; }
+ else if ( can_w_piece_capture( ptree, to ) ) { continue; }
+ if ( IsDiscoverBK( from, to ) ) { continue; }
XorFile( from, OCCUPIED_FILE );
XorDiag2( from, OCCUPIED_DIAG2 );
}
BBAnd( bb, BB_BKNIGHT, b_chk_tbl[SQ_WKING].knight );
- while ( BBToU(bb) ) {
+ while ( BBTest(bb) ) {
from = FirstOne( bb );
Xor( from, bb );
if ( ! is_white_attacked( ptree, to ) ) { continue; }
bb_attacks = abb_b_gold_attacks[to];
- if ( can_w_king_escape( ptree, to, bb_attacks ) ) { continue; }
+ if ( can_w_king_escape( ptree, to, &bb_attacks ) ) { continue; }
if ( IsDiscoverWK( from, to ) );
- else if ( can_w_piece_capture( ptree, to ) ) { continue; }
- if ( IsDiscoverBK( from, to ) ) { continue; }
+ else if ( can_w_piece_capture( ptree, to ) ) { continue; }
+ if ( IsDiscoverBK( from, to ) ) { continue; }
XorFile( from, OCCUPIED_FILE );
XorDiag2( from, OCCUPIED_DIAG2 );
BBAnd( bb_check, bb_move, abb_b_knight_attacks[from] );
BBAnd( bb_check, bb_check, abb_w_knight_attacks[SQ_WKING] );
- if ( BBToU(bb_check) ) {
+ if ( BBTest(bb_check) ) {
BB_BKNIGHT.p[1] ^= abb_mask[from].p[1];
BB_BKNIGHT.p[2] ^= abb_mask[from].p[2];
BB_BOCCUPY.p[1] ^= abb_mask[from].p[1];
Xor( to, bb_check );
BBIni( bb_attacks );
- if ( can_w_king_escape( ptree, to, bb_attacks ) ) { continue; }
+ if ( can_w_king_escape( ptree, to, &bb_attacks ) ) { continue; }
if ( IsDiscoverWK( from, to ) );
- else if ( can_w_piece_capture( ptree, to ) ) { continue; }
- if ( IsDiscoverBK( from, to ) ) { continue; }
+ else if ( can_w_piece_capture( ptree, to ) ) { continue; }
+ if ( IsDiscoverBK( from, to ) ) { continue; }
XorFile( from, OCCUPIED_FILE );
XorDiag2( from, OCCUPIED_DIAG2 );
BB_BKNIGHT.p[2] ^= abb_mask[from].p[2];
return ( To2Move(to) | From2Move(from)
| Cap2Move(-BOARD[to]) | Piece2Move(knight) );
- } while ( BBToU(bb_check) );
+ } while ( BBTest(bb_check) );
XorFile( from, OCCUPIED_FILE );
XorDiag2( from, OCCUPIED_DIAG2 );
}
BBAnd( bb, BB_BLANCE, b_chk_tbl[SQ_WKING].lance );
- while ( BBToU(bb) ) {
+ while ( BBTest(bb) ) {
from = FirstOne( bb );
Xor( from, bb );
XorDiag1( from, OCCUPIED_DIAG1 );
bb_check.p[0] &= 0x1ffU;
- if ( BBToU(bb_check) ) {
+ if ( BBTest(bb_check) ) {
to = SQ_WKING+nfile;
if ( ! is_white_attacked( ptree, to ) ) {
goto b_lance_next;
}
bb_temp = abb_file_attacks[to][0];
- if ( can_w_king_escape( ptree, to, bb_temp ) ) { goto b_lance_next; }
+ if ( can_w_king_escape( ptree, to, &bb_temp ) ) { goto b_lance_next; }
if ( IsDiscoverWK( from, to ) );
- else if ( can_w_piece_capture( ptree, to ) ) { goto b_lance_next; }
- if ( IsDiscoverBK( from, to ) ) { goto b_lance_next; }
+ else if ( can_w_piece_capture( ptree, to ) ) { goto b_lance_next; }
+ if ( IsDiscoverBK( from, to ) ) { goto b_lance_next; }
XorFile( from, OCCUPIED_FILE );
XorDiag2( from, OCCUPIED_DIAG2 );
if ( ! is_white_attacked( ptree, to ) ) { continue; }
bb_attacks = abb_b_gold_attacks[to];
- if ( can_w_king_escape( ptree, to, bb_attacks ) ) { continue; }
+ if ( can_w_king_escape( ptree, to, &bb_attacks ) ) { continue; }
if ( IsDiscoverWK( from, to ) );
- else if ( can_w_piece_capture( ptree, to ) ) { continue; }
- if ( IsDiscoverBK( from, to ) ) { continue; }
+ else if ( can_w_piece_capture( ptree, to ) ) { continue; }
+ if ( IsDiscoverBK( from, to ) ) { continue; }
XorFile( from, OCCUPIED_FILE );
XorDiag2( from, OCCUPIED_DIAG2 );
XorDiag2( from, OCCUPIED_DIAG2 );
XorDiag1( from, OCCUPIED_DIAG1 );
- if ( ! is_white_attacked( ptree, to ) ) { goto b_pawn_pro_next; }
+ if ( ! is_white_attacked( ptree, to ) ) { goto b_pawn_pro_next; }
bb_attacks = abb_b_gold_attacks[to];
- if ( can_w_king_escape( ptree,to,bb_attacks ) ) { goto b_pawn_pro_next; }
+ if ( can_w_king_escape( ptree,to,&bb_attacks ) ) { goto b_pawn_pro_next; }
if ( IsDiscoverWK( from, to ) );
- else if ( can_w_piece_capture( ptree, to ) ) { goto b_pawn_pro_next; }
- if ( IsDiscoverBK( from, to ) ) { goto b_pawn_pro_next; }
+ else if ( can_w_piece_capture( ptree, to ) ) { goto b_pawn_pro_next; }
+ if ( IsDiscoverBK( from, to ) ) { goto b_pawn_pro_next; }
XorFile( from, OCCUPIED_FILE );
XorDiag2( from, OCCUPIED_DIAG2 );
XorDiag2( from, OCCUPIED_DIAG2 );
XorDiag1( from, OCCUPIED_DIAG1 );
- if ( ! is_white_attacked( ptree, to ) ) { goto b_pawn_end; }
+ if ( ! is_white_attacked( ptree, to ) ) { goto b_pawn_end; }
BBIni( bb_attacks );
- if ( can_w_king_escape( ptree,to,bb_attacks ) ) { goto b_pawn_end; }
- if ( can_w_piece_capture( ptree, to ) ) { goto b_pawn_end; }
- if ( IsDiscoverBK( from, to ) ) { goto b_pawn_end; }
+ if ( can_w_king_escape( ptree,to,&bb_attacks ) ) { goto b_pawn_end; }
+ if ( can_w_piece_capture( ptree, to ) ) { goto b_pawn_end; }
+ if ( IsDiscoverBK( from, to ) ) { goto b_pawn_end; }
XorFile( from, OCCUPIED_FILE );
XorDiag2( from, OCCUPIED_DIAG2 );
}
-unsigned int
+unsigned int CONV
is_w_mate_in_1ply( tree_t * restrict ptree )
{
bitboard_t bb, bb_temp, bb_check, bb_check_pro, bb_attacks, bb_drop, bb_move;
BBAnd( bb, abb_w_gold_attacks[SQ_BKING],
abb_b_gold_attacks[SQ_BKING] );
BBAnd( bb, bb, bb_drop );
- while( BBToU(bb) )
+ while( BBTest(bb) )
{
to = LastOne( bb );
Xor( to, bb );
if ( ! is_black_attacked( ptree, to ) ) { continue; }
- bb_attacks = abb_file_attacks[to][0];
- bb_attacks.p[aslide[to].ir0] |= ai_rook_attacks_r0[to][0];
- if ( can_b_king_escape( ptree, to, bb_attacks ) ) { continue; }
- if ( can_b_piece_capture( ptree, to ) ) { continue; }
+ BBOr( bb_attacks, abb_file_attacks[to][0], abb_rank_attacks[to][0] );
+ if ( can_b_king_escape( ptree, to, &bb_attacks ) ) { continue; }
+ if ( can_b_piece_capture( ptree, to ) ) { continue; }
return To2Move(to) | Drop2Move(rook);
}
if ( ( ! BOARD[to] ) && is_black_attacked( ptree, to ) )
{
bb_attacks = abb_file_attacks[to][0];
- if ( ( ! can_b_king_escape( ptree, to, bb_attacks ) )
+ if ( ( ! can_b_king_escape( ptree, to, &bb_attacks ) )
&& ( ! can_b_piece_capture( ptree, to ) ) )
{
return To2Move(to) | Drop2Move(lance);
BBAnd( bb, abb_w_silver_attacks[SQ_BKING],
abb_b_silver_attacks[SQ_BKING] );
BBAnd( bb, bb, bb_drop );
- while( BBToU(bb) )
+ while( BBTest(bb) )
{
to = LastOne( bb );
Xor( to, bb );
BBOr( bb_attacks, abb_bishop_attacks_rr45[to][0],
abb_bishop_attacks_rl45[to][0] );
- if ( can_b_king_escape( ptree, to, bb_attacks ) ) { continue; }
- if ( can_b_piece_capture( ptree, to ) ) { continue; }
+ if ( can_b_king_escape( ptree, to, &bb_attacks ) ) { continue; }
+ if ( can_b_piece_capture( ptree, to ) ) { continue; }
return To2Move(to) | Drop2Move(bishop);
}
}
{
BBAnd( bb, abb_w_gold_attacks[SQ_BKING],
abb_w_silver_attacks[SQ_BKING] );
- BBNot( bb, bb );
- BBAnd( bb, bb, bb_drop );
+ BBNotAnd( bb, bb_drop, bb );
BBAnd( bb, bb, abb_b_gold_attacks[SQ_BKING] );
}
else { BBAnd( bb, bb_drop, abb_b_gold_attacks[SQ_BKING] ); }
- while ( BBToU(bb) )
+ while ( BBTest(bb) )
{
to = LastOne( bb );
Xor( to, bb );
if ( ! is_black_attacked( ptree, to ) ) { continue; }
bb_attacks = abb_w_gold_attacks[to];
- if ( can_b_king_escape( ptree, to, bb_attacks ) ) { continue; }
- if ( can_b_piece_capture( ptree, to ) ) { continue; }
+ if ( can_b_king_escape( ptree, to, &bb_attacks ) ) { continue; }
+ if ( can_b_piece_capture( ptree, to ) ) { continue; }
return To2Move(to) | Drop2Move(gold);
}
}
if ( IsHandGold(HAND_W) )
{
if ( IsHandBishop(HAND_W) ) { goto w_silver_drop_end; }
- BBNot( bb, abb_b_gold_attacks[SQ_BKING] );
- BBAnd( bb, bb, abb_b_silver_attacks[SQ_BKING] );
+ BBNotAnd( bb,
+ abb_b_silver_attacks[SQ_BKING],
+ abb_b_gold_attacks[SQ_BKING] );
BBAnd( bb, bb, bb_drop );
}
else {
}
}
- while ( BBToU(bb) )
+ while ( BBTest(bb) )
{
to = LastOne( bb );
Xor( to, bb );
if ( ! is_black_attacked( ptree, to ) ) { continue; }
bb_attacks = abb_w_silver_attacks[to];
- if ( can_b_king_escape( ptree, to, bb_attacks ) ) { continue; }
- if ( can_b_piece_capture( ptree, to ) ) { continue; }
+ if ( can_b_king_escape( ptree, to, &bb_attacks ) ) { continue; }
+ if ( can_b_piece_capture( ptree, to ) ) { continue; }
return To2Move(to) | Drop2Move(silver);
}
}
if ( IsHandKnight(HAND_W) ) {
BBAnd( bb, bb_drop, abb_b_knight_attacks[SQ_BKING] );
- while ( BBToU(bb) )
+ while ( BBTest(bb) )
{
to = LastOne( bb );
Xor( to, bb );
BBIni( bb_attacks );
- if ( can_b_king_escape( ptree, to, bb_attacks ) ) { continue; }
- if ( can_b_piece_capture( ptree, to ) ) { continue; }
+ if ( can_b_king_escape( ptree, to, &bb_attacks ) ) { continue; }
+ if ( can_b_piece_capture( ptree, to ) ) { continue; }
return To2Move(to) | Drop2Move(knight);
}
}
BBNot( bb_move, BB_WOCCUPY );
bb = BB_WDRAGON;
- while ( BBToU(bb) ) {
+ while ( BBTest(bb) ) {
from = LastOne( bb );
Xor( from, bb );
AttackDragon( bb_attacks, from );
BBAnd( bb_check, bb_move, bb_attacks );
BBAnd( bb_check, bb_check, abb_king_attacks[SQ_BKING] );
- if ( ! BBToU(bb_check) ) { continue; }
+ if ( ! BBTest(bb_check) ) { continue; }
Xor( from, BB_W_HDK );
Xor( from, BB_W_RD );
if ( (int)adirec[SQ_BKING][to] & flag_cross )
{
- bb_attacks = abb_file_attacks[to][0];
- bb_attacks.p[aslide[to].ir0] |= ai_rook_attacks_r0[to][0];
+ BBOr( bb_attacks, abb_file_attacks[to][0], abb_rank_attacks[to][0] );
BBOr( bb_attacks, bb_attacks, abb_king_attacks[to] );
}
else { AttackDragon( bb_attacks, to ); }
- if ( can_b_king_escape( ptree, to, bb_attacks ) ) { continue; }
+ if ( can_b_king_escape( ptree, to, &bb_attacks ) ) { continue; }
if ( IsDiscoverBK( from, to ) );
- else if ( can_b_piece_capture( ptree, to ) ) { continue; }
- if ( IsDiscoverWK( from, to ) ) { continue; }
+ else if ( can_b_piece_capture( ptree, to ) ) { continue; }
+ if ( IsDiscoverWK( from, to ) ) { continue; }
XorFile( from, OCCUPIED_FILE );
XorDiag2( from, OCCUPIED_DIAG2 );
Xor( from, BB_W_HDK );
return ( To2Move(to) | From2Move(from)
| Cap2Move(BOARD[to]) | Piece2Move(dragon) );
- } while ( BBToU(bb_check) );
+ } while ( BBTest(bb_check) );
XorFile( from, OCCUPIED_FILE );
XorDiag2( from, OCCUPIED_DIAG2 );
AttackRook( bb_attacks, from );
BBAnd( bb_check, bb_move, bb_attacks );
BBAnd( bb_check, bb_check, abb_king_attacks[SQ_BKING] );
- if ( ! BBToU(bb_check) ) { continue; }
+ if ( ! BBTest(bb_check) ) { continue; }
BB_W_RD.p[2] ^= abb_mask[from].p[2];
BB_WOCCUPY.p[2] ^= abb_mask[from].p[2];
if ( (int)adirec[SQ_BKING][to] & flag_cross )
{
- bb_attacks = abb_file_attacks[to][0];
- bb_attacks.p[aslide[to].ir0] |= ai_rook_attacks_r0[to][0];
+ BBOr( bb_attacks, abb_file_attacks[to][0], abb_rank_attacks[to][0] );
BBOr( bb_attacks, bb_attacks, abb_king_attacks[to] );
}
else { AttackDragon( bb_attacks, to ); }
- if ( can_b_king_escape( ptree, to, bb_attacks ) ) { continue; }
+ if ( can_b_king_escape( ptree, to, &bb_attacks ) ) { continue; }
if ( IsDiscoverBK( from, to ) );
- else if ( can_b_piece_capture( ptree, to ) ) { continue; }
- if ( IsDiscoverWK( from, to ) ) { continue; }
+ else if ( can_b_piece_capture( ptree, to ) ) { continue; }
+ if ( IsDiscoverWK( from, to ) ) { continue; }
XorFile( from, OCCUPIED_FILE );
XorDiag2( from, OCCUPIED_DIAG2 );
BB_W_RD.p[2] ^= abb_mask[from].p[2];
return ( To2Move(to) | From2Move(from) | FLAG_PROMO
| Cap2Move(BOARD[to]) | Piece2Move(rook) );
- } while ( BBToU(bb_check) );
+ } while ( BBTest(bb_check) );
XorFile( from, OCCUPIED_FILE );
XorDiag2( from, OCCUPIED_DIAG2 );
bb_check.p[0] &= abb_w_gold_attacks[SQ_BKING].p[0];
bb_check.p[1] &= abb_w_gold_attacks[SQ_BKING].p[1];
bb_check.p[2] &= abb_king_attacks[SQ_BKING].p[2];
- if ( ! BBToU(bb_check) ) { continue; }
+ if ( ! BBTest(bb_check) ) { continue; }
BB_W_RD.p[0] ^= abb_mask[from].p[0];
BB_W_RD.p[1] ^= abb_mask[from].p[1];
if ( to >= A3 ) {
if ( (int)adirec[SQ_BKING][to] & flag_cross )
{
- bb_attacks = abb_file_attacks[to][0];
- bb_attacks.p[aslide[to].ir0] |= ai_rook_attacks_r0[to][0];
+ BBOr(bb_attacks, abb_file_attacks[to][0], abb_rank_attacks[to][0]);
bb_attacks.p[1] |= abb_king_attacks[to].p[1];
bb_attacks.p[2] |= abb_king_attacks[to].p[2];
}
else { AttackDragon( bb_attacks, to ); }
} else {
- bb_attacks = abb_file_attacks[to][0];
- bb_attacks.p[aslide[to].ir0] |= ai_rook_attacks_r0[to][0];
+ BBOr(bb_attacks, abb_file_attacks[to][0], abb_rank_attacks[to][0]);
}
- if ( can_b_king_escape( ptree, to, bb_attacks ) ) { continue; }
+ if ( can_b_king_escape( ptree, to, &bb_attacks ) ) { continue; }
if ( IsDiscoverBK( from, to ) );
- else if ( can_b_piece_capture( ptree, to ) ) { continue; }
- if ( IsDiscoverWK( from, to ) ) { continue; }
+ else if ( can_b_piece_capture( ptree, to ) ) { continue; }
+ if ( IsDiscoverWK( from, to ) ) { continue; }
XorFile( from, OCCUPIED_FILE );
XorDiag2( from, OCCUPIED_DIAG2 );
return ( To2Move(to) | From2Move(from)
| ( (to > I4) ? FLAG_PROMO : 0 )
| Cap2Move(BOARD[to]) | Piece2Move(rook) );
- } while ( BBToU(bb_check) );
+ } while ( BBTest(bb_check) );
XorFile( from, OCCUPIED_FILE );
XorDiag2( from, OCCUPIED_DIAG2 );
}
bb = BB_WHORSE;
- while ( BBToU(bb) ) {
+ while ( BBTest(bb) ) {
from = LastOne( bb );
Xor( from, bb );
AttackHorse( bb_attacks, from );
BBAnd( bb_check, bb_move, bb_attacks );
BBAnd( bb_check, bb_check, abb_king_attacks[SQ_BKING] );
- if ( ! BBToU(bb_check) ) { continue; }
+ if ( ! BBTest(bb_check) ) { continue; }
Xor( from, BB_W_HDK );
Xor( from, BB_W_BH );
BBOr( bb_attacks, abb_bishop_attacks_rr45[to][0],
abb_bishop_attacks_rl45[to][0] );
BBOr( bb_attacks, bb_attacks, abb_king_attacks[to] );
- if ( can_b_king_escape( ptree, to, bb_attacks ) ) { continue; }
+ if ( can_b_king_escape( ptree, to, &bb_attacks ) ) { continue; }
if ( IsDiscoverBK( from, to ) );
- else if ( can_b_piece_capture( ptree, to ) ) { continue; }
- if ( IsDiscoverWK( from, to ) ) { continue; }
+ else if ( can_b_piece_capture( ptree, to ) ) { continue; }
+ if ( IsDiscoverWK( from, to ) ) { continue; }
XorFile( from, OCCUPIED_FILE );
XorDiag2( from, OCCUPIED_DIAG2 );
Xor( from, BB_W_HDK );
return ( To2Move(to) | From2Move(from)
| Cap2Move(BOARD[to]) | Piece2Move(horse) );
- } while ( BBToU(bb_check) );
+ } while ( BBTest(bb_check) );
XorFile( from, OCCUPIED_FILE );
XorDiag2( from, OCCUPIED_DIAG2 );
AttackBishop( bb_attacks, from );
BBAnd( bb_check, bb_move, bb_attacks );
BBAnd( bb_check, bb_check, abb_king_attacks[SQ_BKING] );
- if ( ! BBToU(bb_check) ) { continue; }
+ if ( ! BBTest(bb_check) ) { continue; }
BB_W_BH.p[2] ^= abb_mask[from].p[2];
BB_WOCCUPY.p[2] ^= abb_mask[from].p[2];
BBOr( bb_attacks, abb_bishop_attacks_rr45[to][0],
abb_bishop_attacks_rl45[to][0] );
BBOr( bb_attacks, bb_attacks, abb_king_attacks[to] );
- if ( can_b_king_escape( ptree, to, bb_attacks ) ) { continue; }
+ if ( can_b_king_escape( ptree, to, &bb_attacks ) ) { continue; }
if ( IsDiscoverBK( from, to ) );
- else if ( can_b_piece_capture( ptree, to ) ) { continue; }
- if ( IsDiscoverWK( from, to ) ) { continue; }
+ else if ( can_b_piece_capture( ptree, to ) ) { continue; }
+ if ( IsDiscoverWK( from, to ) ) { continue; }
XorFile( from, OCCUPIED_FILE );
XorDiag2( from, OCCUPIED_DIAG2 );
BB_W_BH.p[2] ^= abb_mask[from].p[2];
return ( To2Move(to) | From2Move(from) | FLAG_PROMO
| Cap2Move(BOARD[to]) | Piece2Move(bishop) );
- } while ( BBToU(bb_check) );
+ } while ( BBTest(bb_check) );
XorFile( from, OCCUPIED_FILE );
XorDiag2( from, OCCUPIED_DIAG2 );
bb_check.p[0] &= abb_w_silver_attacks[SQ_BKING].p[0];
bb_check.p[1] &= abb_w_silver_attacks[SQ_BKING].p[1];
bb_check.p[2] &= abb_king_attacks[SQ_BKING].p[2];
- if ( ! BBToU(bb_check) ) { continue; }
+ if ( ! BBTest(bb_check) ) { continue; }
BB_W_BH.p[0] ^= abb_mask[from].p[0];
BB_W_BH.p[1] ^= abb_mask[from].p[1];
bb_attacks.p[1] |= abb_king_attacks[to].p[1];
bb_attacks.p[2] |= abb_king_attacks[to].p[2];
}
- if ( can_b_king_escape( ptree, to, bb_attacks ) ) { continue; }
+ if ( can_b_king_escape( ptree, to, &bb_attacks ) ) { continue; }
if ( IsDiscoverBK( from, to ) );
- else if ( can_b_piece_capture( ptree, to ) ) { continue; }
- if ( IsDiscoverWK( from, to ) ) { continue; }
+ else if ( can_b_piece_capture( ptree, to ) ) { continue; }
+ if ( IsDiscoverWK( from, to ) ) { continue; }
XorFile( from, OCCUPIED_FILE );
XorDiag2( from, OCCUPIED_DIAG2 );
return ( To2Move(to) | From2Move(from)
| ( (to > I4) ? FLAG_PROMO : 0 )
| Cap2Move(BOARD[to]) | Piece2Move(bishop) );
- } while ( BBToU(bb_check) );
+ } while ( BBTest(bb_check) );
XorFile( from, OCCUPIED_FILE );
XorDiag2( from, OCCUPIED_DIAG2 );
}
BBAnd( bb, BB_WTGOLD, w_chk_tbl[SQ_BKING].gold );
- while ( BBToU(bb) ) {
+ while ( BBTest(bb) ) {
from = LastOne( bb );
Xor( from, bb );
BBAnd( bb_check, bb_move, abb_w_gold_attacks[from] );
BBAnd( bb_check, bb_check, abb_b_gold_attacks[SQ_BKING] );
- if ( ! BBToU(bb_check) ) { continue; }
+ if ( ! BBTest(bb_check) ) { continue; }
Xor( from, BB_WTGOLD );
Xor( from, BB_WOCCUPY );
if ( ! is_black_attacked( ptree, to ) ) { continue; }
bb_attacks = abb_w_gold_attacks[to];
- if ( can_b_king_escape( ptree, to, bb_attacks ) ) { continue; }
+ if ( can_b_king_escape( ptree, to, &bb_attacks ) ) { continue; }
if ( IsDiscoverBK( from, to ) );
- else if ( can_b_piece_capture( ptree, to ) ) { continue; }
- if ( IsDiscoverWK( from, to ) ) { continue; }
+ else if ( can_b_piece_capture( ptree, to ) ) { continue; }
+ if ( IsDiscoverWK( from, to ) ) { continue; }
XorFile( from, OCCUPIED_FILE );
XorDiag2( from, OCCUPIED_DIAG2 );
Xor( from, BB_WTGOLD );
return ( To2Move(to) | From2Move(from)
| Cap2Move(BOARD[to]) | Piece2Move(-BOARD[from]) );
- } while ( BBToU(bb_check) );
+ } while ( BBTest(bb_check) );
XorFile( from, OCCUPIED_FILE );
XorDiag2( from, OCCUPIED_DIAG2 );
if ( ! is_black_attacked( ptree, to ) ) { continue; }
bb_attacks = abb_w_gold_attacks[to];
- if ( can_b_king_escape( ptree, to, bb_attacks ) ) { continue; }
+ if ( can_b_king_escape( ptree, to, &bb_attacks ) ) { continue; }
if ( IsDiscoverBK( from, to ) );
- else if ( can_b_piece_capture( ptree, to ) ) { continue; }
- if ( IsDiscoverWK( from, to ) ) { continue; }
+ else if ( can_b_piece_capture( ptree, to ) ) { continue; }
+ if ( IsDiscoverWK( from, to ) ) { continue; }
XorFile( from, OCCUPIED_FILE );
XorDiag2( from, OCCUPIED_DIAG2 );
if ( ! is_black_attacked( ptree, to ) ) { continue; }
bb_attacks = abb_w_silver_attacks[to];
- if ( can_b_king_escape( ptree, to, bb_attacks ) ) { continue; }
+ if ( can_b_king_escape( ptree, to, &bb_attacks ) ) { continue; }
if ( IsDiscoverBK( from, to ) );
- else if ( can_b_piece_capture( ptree, to ) ) { continue; }
- if ( IsDiscoverWK( from, to ) ) { continue; }
+ else if ( can_b_piece_capture( ptree, to ) ) { continue; }
+ if ( IsDiscoverWK( from, to ) ) { continue; }
XorFile( from, OCCUPIED_FILE );
XorDiag2( from, OCCUPIED_DIAG2 );
if ( ! is_black_attacked( ptree, to ) ) { continue; }
bb_attacks = abb_w_gold_attacks[to];
- if ( can_b_king_escape( ptree, to, bb_attacks ) ) { continue; }
+ if ( can_b_king_escape( ptree, to, &bb_attacks ) ) { continue; }
if ( IsDiscoverBK( from, to ) );
- else if ( can_b_piece_capture( ptree, to ) ) { continue; }
- if ( IsDiscoverWK( from, to ) ) { continue; }
+ else if ( can_b_piece_capture( ptree, to ) ) { continue; }
+ if ( IsDiscoverWK( from, to ) ) { continue; }
XorFile( from, OCCUPIED_FILE );
XorDiag2( from, OCCUPIED_DIAG2 );
if ( ! is_black_attacked( ptree, to ) ) { continue; }
bb_attacks = abb_w_silver_attacks[to];
- if ( can_b_king_escape( ptree, to, bb_attacks ) ) { continue; }
+ if ( can_b_king_escape( ptree, to, &bb_attacks ) ) { continue; }
if ( IsDiscoverBK( from, to ) );
- else if ( can_b_piece_capture( ptree, to ) ) { continue; }
- if ( IsDiscoverWK( from, to ) ) { continue; }
+ else if ( can_b_piece_capture( ptree, to ) ) { continue; }
+ if ( IsDiscoverWK( from, to ) ) { continue; }
XorFile( from, OCCUPIED_FILE );
XorDiag2( from, OCCUPIED_DIAG2 );
if ( ! is_black_attacked( ptree, to ) ) { continue; }
bb_attacks = abb_w_silver_attacks[to];
- if ( can_b_king_escape( ptree, to, bb_attacks ) ) { continue; }
+ if ( can_b_king_escape( ptree, to, &bb_attacks ) ) { continue; }
if ( IsDiscoverBK( from, to ) );
- else if ( can_b_piece_capture( ptree, to ) ) { continue; }
- if ( IsDiscoverWK( from, to ) ) { continue; }
+ else if ( can_b_piece_capture( ptree, to ) ) { continue; }
+ if ( IsDiscoverWK( from, to ) ) { continue; }
XorFile( from, OCCUPIED_FILE );
XorDiag2( from, OCCUPIED_DIAG2 );
}
BBAnd( bb, BB_WKNIGHT, w_chk_tbl[SQ_BKING].knight );
- while ( BBToU(bb) ) {
+ while ( BBTest(bb) ) {
from = LastOne( bb );
Xor( from, bb );
if ( ! is_black_attacked( ptree, to ) ) { continue; }
bb_attacks = abb_w_gold_attacks[to];
- if ( can_b_king_escape( ptree, to, bb_attacks ) ) { continue; }
+ if ( can_b_king_escape( ptree, to, &bb_attacks ) ) { continue; }
if ( IsDiscoverBK( from, to ) );
- else if ( can_b_piece_capture( ptree, to ) ) { continue; }
- if ( IsDiscoverWK( from, to ) ) { continue; }
+ else if ( can_b_piece_capture( ptree, to ) ) { continue; }
+ if ( IsDiscoverWK( from, to ) ) { continue; }
XorFile( from, OCCUPIED_FILE );
XorDiag2( from, OCCUPIED_DIAG2 );
BBAnd( bb_check, bb_move, abb_w_knight_attacks[from] );
BBAnd( bb_check, bb_check, abb_b_knight_attacks[SQ_BKING] );
- if ( BBToU(bb_check) ) {
+ if ( BBTest(bb_check) ) {
BB_WKNIGHT.p[0] ^= abb_mask[from].p[0];
BB_WKNIGHT.p[1] ^= abb_mask[from].p[1];
BB_WOCCUPY.p[0] ^= abb_mask[from].p[0];
Xor( to, bb_check );
BBIni( bb_attacks );
- if ( can_b_king_escape( ptree, to, bb_attacks ) ) { continue; }
+ if ( can_b_king_escape( ptree, to, &bb_attacks ) ) { continue; }
if ( IsDiscoverBK( from, to ) );
- else if ( can_b_piece_capture( ptree, to ) ) { continue; }
- if ( IsDiscoverWK( from, to ) ) { continue; }
+ else if ( can_b_piece_capture( ptree, to ) ) { continue; }
+ if ( IsDiscoverWK( from, to ) ) { continue; }
XorFile( from, OCCUPIED_FILE );
XorDiag2( from, OCCUPIED_DIAG2 );
BB_WKNIGHT.p[1] ^= abb_mask[from].p[1];
return ( To2Move(to) | From2Move(from)
| Cap2Move(BOARD[to]) | Piece2Move(knight) );
- } while ( BBToU(bb_check) );
+ } while ( BBTest(bb_check) );
XorFile( from, OCCUPIED_FILE );
XorDiag2( from, OCCUPIED_DIAG2 );
}
BBAnd( bb, BB_WLANCE, w_chk_tbl[SQ_BKING].lance );
- while ( BBToU(bb) ) {
+ while ( BBTest(bb) ) {
from = LastOne( bb );
Xor( from, bb );
XorDiag1( from, OCCUPIED_DIAG1 );
bb_check.p[2] &= 0x7fc0000U;
- if ( BBToU(bb_check) ) {
+ if ( BBTest(bb_check) ) {
to = SQ_BKING-nfile;
if ( ! is_black_attacked( ptree, to ) ) {
goto w_lance_next;
}
bb_temp = abb_file_attacks[to][0];
- if ( can_b_king_escape( ptree, to, bb_temp ) ) { goto w_lance_next; }
+ if ( can_b_king_escape( ptree, to, &bb_temp ) ) { goto w_lance_next; }
if ( IsDiscoverBK( from, to ) );
- else if ( can_b_piece_capture( ptree, to ) ) { goto w_lance_next; }
- if ( IsDiscoverWK( from, to ) ) { goto w_lance_next; }
+ else if ( can_b_piece_capture( ptree, to ) ) { goto w_lance_next; }
+ if ( IsDiscoverWK( from, to ) ) { goto w_lance_next; }
XorFile( from, OCCUPIED_FILE );
XorDiag2( from, OCCUPIED_DIAG2 );
if ( ! is_black_attacked( ptree, to ) ) { continue; }
bb_attacks = abb_w_gold_attacks[to];
- if ( can_b_king_escape( ptree, to, bb_attacks ) ) { continue; }
+ if ( can_b_king_escape( ptree, to, &bb_attacks ) ) { continue; }
if ( IsDiscoverBK( from, to ) );
- else if ( can_b_piece_capture( ptree, to ) ) { continue; }
- if ( IsDiscoverWK( from, to ) ) { continue; }
+ else if ( can_b_piece_capture( ptree, to ) ) { continue; }
+ if ( IsDiscoverWK( from, to ) ) { continue; }
XorFile( from, OCCUPIED_FILE );
XorDiag2( from, OCCUPIED_DIAG2 );
XorDiag2( from, OCCUPIED_DIAG2 );
XorDiag1( from, OCCUPIED_DIAG1 );
- if ( ! is_black_attacked( ptree, to ) ) { goto w_pawn_pro_next; }
+ if ( ! is_black_attacked( ptree, to ) ) { goto w_pawn_pro_next; }
bb_attacks = abb_w_gold_attacks[to];
- if ( can_b_king_escape( ptree,to,bb_attacks ) ) { goto w_pawn_pro_next; }
+ if ( can_b_king_escape( ptree,to,&bb_attacks ) ) { goto w_pawn_pro_next; }
if ( IsDiscoverBK( from, to ) );
- else if ( can_b_piece_capture( ptree, to ) ) { goto w_pawn_pro_next; }
- if ( IsDiscoverWK( from, to ) ) { goto w_pawn_pro_next; }
+ else if ( can_b_piece_capture( ptree, to ) ) { goto w_pawn_pro_next; }
+ if ( IsDiscoverWK( from, to ) ) { goto w_pawn_pro_next; }
XorFile( from, OCCUPIED_FILE );
XorDiag2( from, OCCUPIED_DIAG2 );
XorDiag2( from, OCCUPIED_DIAG2 );
XorDiag1( from, OCCUPIED_DIAG1 );
- if ( ! is_black_attacked( ptree, to ) ) { goto w_pawn_end; }
+ if ( ! is_black_attacked( ptree, to ) ) { goto w_pawn_end; }
BBIni( bb_attacks );
- if ( can_b_king_escape( ptree,to,bb_attacks ) ) { goto w_pawn_end; }
- if ( can_b_piece_capture( ptree, to ) ) { goto w_pawn_end; }
- if ( IsDiscoverWK( from, to ) ) { goto w_pawn_end; }
+ if ( can_b_king_escape( ptree,to,&bb_attacks ) ) { goto w_pawn_end; }
+ if ( can_b_piece_capture( ptree, to ) ) { goto w_pawn_end; }
+ if ( IsDiscoverWK( from, to ) ) { goto w_pawn_end; }
XorFile( from, OCCUPIED_FILE );
XorDiag2( from, OCCUPIED_DIAG2 );
}
-static int
+static int CONV
can_w_piece_capture( const tree_t * restrict ptree, int to )
{
bitboard_t bb_sum, bb, bb_attacks;
BBAnd( bb_sum, BB_WKNIGHT, abb_b_knight_attacks[to] );
- BBAnd( bb, BB_WSILVER, abb_b_silver_attacks[to] );
- BBOr( bb_sum, bb, bb_sum );
-
- BBAnd( bb, BB_WTGOLD, abb_b_gold_attacks[to] );
- BBOr( bb_sum, bb, bb_sum );
+ BBAndOr( bb_sum, BB_WSILVER, abb_b_silver_attacks[to] );
+ BBAndOr( bb_sum, BB_WTGOLD, abb_b_gold_attacks[to] );
BBOr( bb, BB_WHORSE, BB_WDRAGON );
- BBAnd( bb, bb, abb_king_attacks[to] );
- BBOr( bb_sum, bb, bb_sum );
+ BBAndOr( bb_sum, bb, abb_king_attacks[to] );
AttackBishop( bb, to );
- BBAnd( bb, BB_W_BH, bb );
- BBOr( bb_sum, bb, bb_sum );
+ BBAndOr( bb_sum, BB_W_BH, bb );
- bb_sum.p[aslide[to].ir0] |= BB_W_RD.p[aslide[to].ir0] & AttackRank(to);
-
- BBAnd( bb, BB_WLANCE, abb_minus_rays[to] );
- BBOr( bb, bb, BB_W_RD );
+ BBAndOr( bb_sum, BB_W_RD, AttackRank(to) );
+ bb = BB_W_RD;
+ BBAndOr( bb, BB_WLANCE, abb_minus_rays[to] );
bb_attacks = AttackFile( to );
- BBAnd( bb, bb, bb_attacks );
- BBOr( bb_sum, bb_sum, bb );
+ BBAndOr( bb_sum, bb, bb_attacks );
- while ( BBToU( bb_sum ) )
+ while ( BBTest( bb_sum ) )
{
from = FirstOne( bb_sum );
Xor( from, bb_sum );
}
-static int
+static int CONV
can_b_piece_capture( const tree_t * restrict ptree, int to )
{
- bitboard_t bb_sum, bb, bb_attacks;
+ bitboard_t bb_sum, bb;
int idirec, from;
from = to+nfile;
BBAnd( bb_sum, BB_BKNIGHT, abb_w_knight_attacks[to] );
- BBAnd( bb, BB_BSILVER, abb_w_silver_attacks[to] );
- BBOr( bb_sum, bb_sum, bb );
-
- BBAnd( bb, BB_BTGOLD, abb_w_gold_attacks[to] );
- BBOr( bb_sum, bb_sum, bb );
+ BBAndOr( bb_sum, BB_BSILVER, abb_w_silver_attacks[to] );
+ BBAndOr( bb_sum, BB_BTGOLD, abb_w_gold_attacks[to] );
BBOr( bb, BB_BHORSE, BB_BDRAGON );
- BBAnd( bb, bb, abb_king_attacks[to] );
- BBOr( bb_sum, bb_sum, bb );
+ BBAndOr( bb_sum, bb, abb_king_attacks[to] );
AttackBishop( bb, to );
- BBAnd( bb, bb, BB_B_BH );
- BBOr( bb_sum, bb_sum, bb );
+ BBAndOr( bb_sum, bb, BB_B_BH );
+ BBAndOr( bb_sum, BB_B_RD, AttackRank(to) );
- bb_sum.p[aslide[to].ir0] |= BB_B_RD.p[aslide[to].ir0] & AttackRank(to);
-
- BBAnd( bb, BB_BLANCE, abb_plus_rays[to] );
- BBOr( bb, bb, BB_B_RD );
- bb_attacks = AttackFile( to );
- BBAnd( bb, bb, bb_attacks );
- BBOr( bb_sum, bb_sum, bb );
+ bb = BB_B_RD;
+ BBAndOr( bb, BB_BLANCE, abb_plus_rays[to] );
+ BBAndOr( bb_sum, bb, AttackFile( to ) );
- while ( BBToU( bb_sum ) )
+ while ( BBTest( bb_sum ) )
{
from = LastOne( bb_sum );
Xor( from, bb_sum );
}
-static int
-can_w_king_escape( tree_t * restrict ptree, int to, bitboard_t bb )
+static int CONV
+can_w_king_escape( tree_t * restrict ptree, int to,
+ const bitboard_t * restrict pbb )
{
+ bitboard_t bb = *pbb;
int iret = 0, iescape;
if ( !BOARD[to] )
BBOr( bb, bb, abb_mask[to] );
BBOr( bb, bb, BB_WOCCUPY );
- BBNot( bb, bb );
- BBAnd( bb, bb, abb_king_attacks[SQ_WKING] );
+ BBNotAnd( bb, abb_king_attacks[SQ_WKING], bb );
- while( BBToU(bb) )
+ while( BBTest(bb) )
{
iescape = FirstOne( bb );
if ( ! is_white_attacked( ptree, iescape ) )
}
-static int
-can_b_king_escape( tree_t * restrict ptree, int to, bitboard_t bb )
+static int CONV
+can_b_king_escape( tree_t * restrict ptree, int to,
+ const bitboard_t * restrict pbb )
{
+ bitboard_t bb = *pbb;
int iret = 0, iescape;
if ( !BOARD[to] )
BBOr( bb, bb, abb_mask[to] );
BBOr( bb, bb, BB_BOCCUPY );
- BBNot( bb, bb );
- BBAnd( bb, bb, abb_king_attacks[SQ_BKING] );
+ BBNotAnd( bb, abb_king_attacks[SQ_BKING], bb );
- while( BBToU(bb) )
+ while( BBTest(bb) )
{
iescape = LastOne( bb );
if ( ! is_black_attacked( ptree, iescape ) )