X-Git-Url: http://winboard.nl/cgi-bin?p=bonanza.git;a=blobdiff_plain;f=mate1ply.c;h=b4d52db7fbb6e0d9dbd849a9263f0d7503175974;hp=b09a6d1d7fb46ef0ce4ad54b7c992fede3e1cd15;hb=cygwin;hpb=18b507e1b20fc6c32ee50f00fb910a59110c1a1d diff --git a/mate1ply.c b/mate1ply.c index b09a6d1..b4d52db 100644 --- a/mate1ply.c +++ b/mate1ply.c @@ -5,13 +5,15 @@ #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; @@ -26,20 +28,18 @@ is_b_mate_in_1ply( tree_t * restrict ptree ) 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); } @@ -49,7 +49,7 @@ is_b_mate_in_1ply( tree_t * restrict ptree ) 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); @@ -62,7 +62,7 @@ is_b_mate_in_1ply( tree_t * restrict ptree ) 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 ); @@ -71,8 +71,8 @@ is_b_mate_in_1ply( tree_t * restrict ptree ) 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); } } @@ -83,13 +83,12 @@ is_b_mate_in_1ply( tree_t * restrict ptree ) { 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 ); @@ -97,8 +96,8 @@ is_b_mate_in_1ply( tree_t * restrict ptree ) 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); } } @@ -108,8 +107,9 @@ is_b_mate_in_1ply( tree_t * restrict ptree ) 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 { @@ -120,7 +120,7 @@ is_b_mate_in_1ply( tree_t * restrict ptree ) } } - while ( BBToU(bb) ) + while ( BBTest(bb) ) { to = FirstOne( bb ); Xor( to, bb ); @@ -128,8 +128,8 @@ is_b_mate_in_1ply( tree_t * restrict ptree ) 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); } } @@ -138,14 +138,14 @@ is_b_mate_in_1ply( tree_t * restrict ptree ) 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); } } @@ -154,14 +154,14 @@ is_b_mate_in_1ply( tree_t * restrict ptree ) 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 ); @@ -178,16 +178,15 @@ is_b_mate_in_1ply( tree_t * restrict ptree ) 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 ); @@ -197,7 +196,7 @@ is_b_mate_in_1ply( tree_t * restrict ptree ) 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 ); @@ -215,7 +214,7 @@ is_b_mate_in_1ply( tree_t * restrict ptree ) 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]; @@ -231,16 +230,15 @@ is_b_mate_in_1ply( tree_t * restrict ptree ) 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 ); @@ -249,7 +247,7 @@ is_b_mate_in_1ply( tree_t * restrict ptree ) 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 ); @@ -272,7 +270,7 @@ is_b_mate_in_1ply( tree_t * restrict ptree ) 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]; @@ -291,21 +289,19 @@ is_b_mate_in_1ply( tree_t * restrict ptree ) 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 ); @@ -317,7 +313,7 @@ is_b_mate_in_1ply( tree_t * restrict ptree ) 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 ); @@ -329,14 +325,14 @@ is_b_mate_in_1ply( tree_t * restrict ptree ) } 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 ); @@ -354,10 +350,10 @@ is_b_mate_in_1ply( tree_t * restrict ptree ) 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 ); @@ -367,7 +363,7 @@ is_b_mate_in_1ply( tree_t * restrict ptree ) 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 ); @@ -385,7 +381,7 @@ is_b_mate_in_1ply( tree_t * restrict ptree ) 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]; @@ -402,10 +398,10 @@ is_b_mate_in_1ply( tree_t * restrict ptree ) 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 ); @@ -414,7 +410,7 @@ is_b_mate_in_1ply( tree_t * restrict ptree ) 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 ); @@ -437,7 +433,7 @@ is_b_mate_in_1ply( tree_t * restrict ptree ) 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]; @@ -459,10 +455,10 @@ is_b_mate_in_1ply( tree_t * restrict ptree ) 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 ); @@ -474,7 +470,7 @@ is_b_mate_in_1ply( tree_t * restrict ptree ) 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 ); @@ -486,13 +482,13 @@ is_b_mate_in_1ply( tree_t * restrict ptree ) } 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 ); @@ -507,10 +503,10 @@ is_b_mate_in_1ply( tree_t * restrict ptree ) 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 ); @@ -519,7 +515,7 @@ is_b_mate_in_1ply( tree_t * restrict ptree ) 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 ); @@ -562,10 +558,10 @@ is_b_mate_in_1ply( tree_t * restrict ptree ) 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 ); @@ -584,10 +580,10 @@ is_b_mate_in_1ply( tree_t * restrict ptree ) 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 ); @@ -634,10 +630,10 @@ is_b_mate_in_1ply( tree_t * restrict ptree ) 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 ); @@ -656,10 +652,10 @@ is_b_mate_in_1ply( tree_t * restrict ptree ) 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 ); @@ -705,10 +701,10 @@ is_b_mate_in_1ply( tree_t * restrict ptree ) 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 ); @@ -731,7 +727,7 @@ is_b_mate_in_1ply( tree_t * restrict ptree ) } BBAnd( bb, BB_BKNIGHT, b_chk_tbl[SQ_WKING].knight ); - while ( BBToU(bb) ) { + while ( BBTest(bb) ) { from = FirstOne( bb ); Xor( from, bb ); @@ -754,10 +750,10 @@ is_b_mate_in_1ply( tree_t * restrict ptree ) 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 ); @@ -782,7 +778,7 @@ is_b_mate_in_1ply( tree_t * restrict ptree ) 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]; @@ -796,10 +792,10 @@ is_b_mate_in_1ply( tree_t * restrict ptree ) 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 ); @@ -810,7 +806,7 @@ is_b_mate_in_1ply( tree_t * restrict ptree ) 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 ); @@ -824,7 +820,7 @@ is_b_mate_in_1ply( tree_t * restrict ptree ) } BBAnd( bb, BB_BLANCE, b_chk_tbl[SQ_WKING].lance ); - while ( BBToU(bb) ) { + while ( BBTest(bb) ) { from = FirstOne( bb ); Xor( from, bb ); @@ -845,7 +841,7 @@ is_b_mate_in_1ply( tree_t * restrict ptree ) 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 ) ) { @@ -853,10 +849,10 @@ is_b_mate_in_1ply( tree_t * restrict ptree ) 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 ); @@ -876,10 +872,10 @@ is_b_mate_in_1ply( tree_t * restrict ptree ) 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 ); @@ -912,12 +908,12 @@ is_b_mate_in_1ply( tree_t * restrict ptree ) 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 ); @@ -952,11 +948,11 @@ is_b_mate_in_1ply( tree_t * restrict ptree ) 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 ); @@ -983,7 +979,7 @@ is_b_mate_in_1ply( tree_t * restrict ptree ) } -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; @@ -1001,17 +997,16 @@ is_w_mate_in_1ply( tree_t * restrict ptree ) 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); } @@ -1021,7 +1016,7 @@ is_w_mate_in_1ply( tree_t * restrict ptree ) 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); @@ -1034,7 +1029,7 @@ is_w_mate_in_1ply( tree_t * restrict ptree ) 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 ); @@ -1043,8 +1038,8 @@ is_w_mate_in_1ply( tree_t * restrict ptree ) 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); } } @@ -1055,13 +1050,12 @@ is_w_mate_in_1ply( tree_t * restrict ptree ) { 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 ); @@ -1069,8 +1063,8 @@ is_w_mate_in_1ply( tree_t * restrict ptree ) 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); } } @@ -1080,8 +1074,9 @@ is_w_mate_in_1ply( tree_t * restrict ptree ) 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 { @@ -1092,7 +1087,7 @@ is_w_mate_in_1ply( tree_t * restrict ptree ) } } - while ( BBToU(bb) ) + while ( BBTest(bb) ) { to = LastOne( bb ); Xor( to, bb ); @@ -1100,8 +1095,8 @@ is_w_mate_in_1ply( tree_t * restrict ptree ) 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); } } @@ -1110,14 +1105,14 @@ is_w_mate_in_1ply( tree_t * restrict ptree ) 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); } } @@ -1126,14 +1121,14 @@ is_w_mate_in_1ply( tree_t * restrict ptree ) 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 ); @@ -1150,16 +1145,15 @@ is_w_mate_in_1ply( tree_t * restrict ptree ) 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 ); @@ -1169,7 +1163,7 @@ is_w_mate_in_1ply( tree_t * restrict ptree ) 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 ); @@ -1187,7 +1181,7 @@ is_w_mate_in_1ply( tree_t * restrict ptree ) 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]; @@ -1203,16 +1197,15 @@ is_w_mate_in_1ply( tree_t * restrict ptree ) 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 ); @@ -1221,7 +1214,7 @@ is_w_mate_in_1ply( tree_t * restrict ptree ) 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 ); @@ -1244,7 +1237,7 @@ is_w_mate_in_1ply( tree_t * restrict ptree ) 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]; @@ -1263,20 +1256,18 @@ is_w_mate_in_1ply( tree_t * restrict ptree ) 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 ); @@ -1288,7 +1279,7 @@ is_w_mate_in_1ply( tree_t * restrict ptree ) 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 ); @@ -1300,14 +1291,14 @@ is_w_mate_in_1ply( tree_t * restrict ptree ) } 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 ); @@ -1325,10 +1316,10 @@ is_w_mate_in_1ply( tree_t * restrict ptree ) 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 ); @@ -1338,7 +1329,7 @@ is_w_mate_in_1ply( tree_t * restrict ptree ) 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 ); @@ -1356,7 +1347,7 @@ is_w_mate_in_1ply( tree_t * restrict ptree ) 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]; @@ -1373,10 +1364,10 @@ is_w_mate_in_1ply( tree_t * restrict ptree ) 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 ); @@ -1385,7 +1376,7 @@ is_w_mate_in_1ply( tree_t * restrict ptree ) 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 ); @@ -1408,7 +1399,7 @@ is_w_mate_in_1ply( tree_t * restrict ptree ) 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]; @@ -1430,10 +1421,10 @@ is_w_mate_in_1ply( tree_t * restrict ptree ) 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 ); @@ -1445,7 +1436,7 @@ is_w_mate_in_1ply( tree_t * restrict ptree ) 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 ); @@ -1457,13 +1448,13 @@ is_w_mate_in_1ply( tree_t * restrict ptree ) } 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 ); @@ -1478,10 +1469,10 @@ is_w_mate_in_1ply( tree_t * restrict ptree ) 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 ); @@ -1490,7 +1481,7 @@ is_w_mate_in_1ply( tree_t * restrict ptree ) 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 ); @@ -1533,10 +1524,10 @@ is_w_mate_in_1ply( tree_t * restrict ptree ) 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 ); @@ -1555,10 +1546,10 @@ is_w_mate_in_1ply( tree_t * restrict ptree ) 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 ); @@ -1605,10 +1596,10 @@ is_w_mate_in_1ply( tree_t * restrict ptree ) 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 ); @@ -1627,10 +1618,10 @@ is_w_mate_in_1ply( tree_t * restrict ptree ) 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 ); @@ -1677,10 +1668,10 @@ is_w_mate_in_1ply( tree_t * restrict ptree ) 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 ); @@ -1703,7 +1694,7 @@ is_w_mate_in_1ply( tree_t * restrict ptree ) } BBAnd( bb, BB_WKNIGHT, w_chk_tbl[SQ_BKING].knight ); - while ( BBToU(bb) ) { + while ( BBTest(bb) ) { from = LastOne( bb ); Xor( from, bb ); @@ -1726,10 +1717,10 @@ is_w_mate_in_1ply( tree_t * restrict ptree ) 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 ); @@ -1754,7 +1745,7 @@ is_w_mate_in_1ply( tree_t * restrict ptree ) 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]; @@ -1768,10 +1759,10 @@ is_w_mate_in_1ply( tree_t * restrict ptree ) 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 ); @@ -1782,7 +1773,7 @@ is_w_mate_in_1ply( tree_t * restrict ptree ) 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 ); @@ -1796,7 +1787,7 @@ is_w_mate_in_1ply( tree_t * restrict ptree ) } BBAnd( bb, BB_WLANCE, w_chk_tbl[SQ_BKING].lance ); - while ( BBToU(bb) ) { + while ( BBTest(bb) ) { from = LastOne( bb ); Xor( from, bb ); @@ -1817,7 +1808,7 @@ is_w_mate_in_1ply( tree_t * restrict ptree ) 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 ) ) { @@ -1825,10 +1816,10 @@ is_w_mate_in_1ply( tree_t * restrict ptree ) 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 ); @@ -1848,10 +1839,10 @@ is_w_mate_in_1ply( tree_t * restrict ptree ) 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 ); @@ -1884,12 +1875,12 @@ is_w_mate_in_1ply( tree_t * restrict ptree ) 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 ); @@ -1924,11 +1915,11 @@ is_w_mate_in_1ply( tree_t * restrict ptree ) 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 ); @@ -1955,7 +1946,7 @@ is_w_mate_in_1ply( tree_t * restrict ptree ) } -static int +static int CONV can_w_piece_capture( const tree_t * restrict ptree, int to ) { bitboard_t bb_sum, bb, bb_attacks; @@ -1970,29 +1961,22 @@ can_w_piece_capture( const tree_t * restrict ptree, int to ) 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 ); @@ -2005,10 +1989,10 @@ can_w_piece_capture( const tree_t * restrict ptree, int to ) } -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; @@ -2020,29 +2004,21 @@ can_b_piece_capture( const tree_t * restrict ptree, int to ) 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 ); @@ -2055,9 +2031,11 @@ can_b_piece_capture( const tree_t * restrict ptree, int to ) } -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] ) @@ -2074,10 +2052,9 @@ can_w_king_escape( tree_t * restrict ptree, int to, bitboard_t bb ) 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 ) ) @@ -2104,9 +2081,11 @@ 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 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] ) @@ -2124,10 +2103,9 @@ can_b_king_escape( tree_t * restrict ptree, int to, bitboard_t bb ) 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 ) )