From 5c223f16be42b65b0f07cb65c17d32a98256e164 Mon Sep 17 00:00:00 2001 From: Michael Whiteley Date: Tue, 26 May 2026 15:56:06 -0600 Subject: [PATCH 1/5] pawn captures. --- src/board/movegen.rs | 12 ++++++------ src/types/bitboard.rs | 1 + 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/board/movegen.rs b/src/board/movegen.rs index 1d469efa2..bc4e332b5 100644 --- a/src/board/movegen.rs +++ b/src/board/movegen.rs @@ -104,12 +104,12 @@ impl super::Board { } fn collect_pawn_captures( - &self, list: &mut MoveList, pawns: Bitboard, dir: i8, target: Bitboard, seventh_rank: Bitboard, + &self, list: &mut MoveList, pawns: Bitboard, dir: i8, target: Bitboard, ) { - let promos = (pawns & seventh_rank).shift(dir); - list.push_promotion_capture_setwise(dir, promos & target); - let captures = (pawns & !seventh_rank).shift(dir); - list.push_pawns_setwise(dir, captures & target, MoveKind::Capture); + let captures = pawns.shift(dir) & target; + let promos = captures & Bitboard::BOTH_HOME_ROWS; + list.push_promotion_capture_setwise(dir, promos); + list.push_pawns_setwise(dir, captures ^ promos, MoveKind::Capture); let ep = self.en_passant(); if ep != Square::None && pawns.contains(ep.shift(-dir)) { @@ -152,7 +152,7 @@ impl super::Board { for i in 0..2 { let the_pawns = pawns & (!pinned | pin_masks[i]) & shift_masks[i]; - self.collect_pawn_captures(list, the_pawns, dirs[i], target, seventh_rank); + self.collect_pawn_captures(list, the_pawns, dirs[i], target); } } } diff --git a/src/types/bitboard.rs b/src/types/bitboard.rs index b7381d0e3..1f1102551 100644 --- a/src/types/bitboard.rs +++ b/src/types/bitboard.rs @@ -12,6 +12,7 @@ pub struct Bitboard(pub u64); impl Bitboard { pub const ALL: Self = Self(0xFFFFFFFFFFFFFFFF); pub const LIGHT_SQUARES: Self = Self(0x55AA55AA55AA55AA); + pub const BOTH_HOME_ROWS: Self = Self(0xFF000000000000FF); pub const SEVENTH_RANK: [Bitboard; 2] = [Self::rank(Rank::R7), Self::rank(Rank::R2)]; pub const SIXTH_RANK: [Bitboard; 2] = [Self::rank(Rank::R6), Self::rank(Rank::R3)]; pub const THIRD_RANK: [Bitboard; 2] = [Self::rank(Rank::R3), Self::rank(Rank::R6)]; From b7a117e867cc05e6517a5ad167141eae309569bd Mon Sep 17 00:00:00 2001 From: Michael Whiteley Date: Tue, 26 May 2026 16:13:18 -0600 Subject: [PATCH 2/5] more --- src/board/movegen.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/board/movegen.rs b/src/board/movegen.rs index bc4e332b5..7e99416e6 100644 --- a/src/board/movegen.rs +++ b/src/board/movegen.rs @@ -127,7 +127,8 @@ impl super::Board { let king_sq = self.king_square(stm); let pushable_pawns = pawns & (!pinned | Bitboard::file(king_sq.file())); - let promotions = (pushable_pawns & seventh_rank).shift(up) & empty; + //let promotions = (pushable_pawns & seventh_rank).shift(up) & empty; + let promotions = (pawns & (!pinned | Bitboard::file(king_sq.file()))).shift(up) & empty & Bitboard::BOTH_HOME_ROWS; if mgkind == MovegenKind::Quiet { let non_promotions = pushable_pawns & !seventh_rank; From bfe285204b3ec99e5e2d5d8446e97cb53eb8313f Mon Sep 17 00:00:00 2001 From: Michael Whiteley Date: Tue, 26 May 2026 16:17:01 -0600 Subject: [PATCH 3/5] cleanup --- src/board/movegen.rs | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/board/movegen.rs b/src/board/movegen.rs index 7e99416e6..ad3198a08 100644 --- a/src/board/movegen.rs +++ b/src/board/movegen.rs @@ -121,18 +121,15 @@ impl super::Board { let stm = self.side_to_move(); let up = Square::UP[stm]; let pawns = self.colored_pieces(stm, PieceType::Pawn); - let seventh_rank = Bitboard::SEVENTH_RANK[stm]; let third_rank = Bitboard::THIRD_RANK[stm]; let empty = !self.occupancies(); let king_sq = self.king_square(stm); - let pushable_pawns = pawns & (!pinned | Bitboard::file(king_sq.file())); - //let promotions = (pushable_pawns & seventh_rank).shift(up) & empty; - let promotions = (pawns & (!pinned | Bitboard::file(king_sq.file()))).shift(up) & empty & Bitboard::BOTH_HOME_ROWS; + let pushed_pawns = (pawns & (!pinned | Bitboard::file(king_sq.file()))).shift(up) & empty; + let promotions = pushed_pawns & Bitboard::BOTH_HOME_ROWS; if mgkind == MovegenKind::Quiet { - let non_promotions = pushable_pawns & !seventh_rank; - let single_pushes = non_promotions.shift(up) & empty; + let single_pushes = pushed_pawns ^ promotions; let double_pushes = (single_pushes & third_rank).shift(up) & empty; list.push_pawns_setwise(up, single_pushes & target, MoveKind::Normal); From 0b0c8eb973514a5fc14bd0fbc47b1a902290fc33 Mon Sep 17 00:00:00 2001 From: Michael Whiteley Date: Tue, 26 May 2026 16:21:17 -0600 Subject: [PATCH 4/5] cleanup bench 3479389 --- src/board/movegen.rs | 8 ++++---- src/types/bitboard.rs | 1 - 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/board/movegen.rs b/src/board/movegen.rs index ad3198a08..5a5c55f79 100644 --- a/src/board/movegen.rs +++ b/src/board/movegen.rs @@ -126,7 +126,7 @@ impl super::Board { let king_sq = self.king_square(stm); let pushed_pawns = (pawns & (!pinned | Bitboard::file(king_sq.file()))).shift(up) & empty; - let promotions = pushed_pawns & Bitboard::BOTH_HOME_ROWS; + let promotions = pushed_pawns & Bitboard::BOTH_HOME_ROWS & target; if mgkind == MovegenKind::Quiet { let single_pushes = pushed_pawns ^ promotions; @@ -134,9 +134,9 @@ impl super::Board { list.push_pawns_setwise(up, single_pushes & target, MoveKind::Normal); list.push_pawns_setwise(up * 2, double_pushes & target, MoveKind::DoublePush); - list.push_pawns_setwise(up, promotions & target, MoveKind::PromotionR); - list.push_pawns_setwise(up, promotions & target, MoveKind::PromotionB); - list.push_pawns_setwise(up, promotions & target, MoveKind::PromotionN); + list.push_pawns_setwise(up, promotions, MoveKind::PromotionR); + list.push_pawns_setwise(up, promotions, MoveKind::PromotionB); + list.push_pawns_setwise(up, promotions, MoveKind::PromotionN); } if mgkind == MovegenKind::Noisy { diff --git a/src/types/bitboard.rs b/src/types/bitboard.rs index 1f1102551..d200271a3 100644 --- a/src/types/bitboard.rs +++ b/src/types/bitboard.rs @@ -13,7 +13,6 @@ impl Bitboard { pub const ALL: Self = Self(0xFFFFFFFFFFFFFFFF); pub const LIGHT_SQUARES: Self = Self(0x55AA55AA55AA55AA); pub const BOTH_HOME_ROWS: Self = Self(0xFF000000000000FF); - pub const SEVENTH_RANK: [Bitboard; 2] = [Self::rank(Rank::R7), Self::rank(Rank::R2)]; pub const SIXTH_RANK: [Bitboard; 2] = [Self::rank(Rank::R6), Self::rank(Rank::R3)]; pub const THIRD_RANK: [Bitboard; 2] = [Self::rank(Rank::R3), Self::rank(Rank::R6)]; pub const HOME_ROWS: [Bitboard; 2] = [Self::rank(Rank::R1), Self::rank(Rank::R8)]; From ce2141f414f50aad90541d66ecf5b95de205f337 Mon Sep 17 00:00:00 2001 From: Michael Whiteley Date: Tue, 26 May 2026 17:00:14 -0600 Subject: [PATCH 5/5] Cargo formatting. bench 3479389 --- src/board/movegen.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/board/movegen.rs b/src/board/movegen.rs index 5a5c55f79..8a895a791 100644 --- a/src/board/movegen.rs +++ b/src/board/movegen.rs @@ -103,9 +103,7 @@ impl super::Board { } } - fn collect_pawn_captures( - &self, list: &mut MoveList, pawns: Bitboard, dir: i8, target: Bitboard, - ) { + fn collect_pawn_captures(&self, list: &mut MoveList, pawns: Bitboard, dir: i8, target: Bitboard) { let captures = pawns.shift(dir) & target; let promos = captures & Bitboard::BOTH_HOME_ROWS; list.push_promotion_capture_setwise(dir, promos);