summaryrefslogtreecommitdiff
path: root/src/search
diff options
context:
space:
mode:
Diffstat (limited to 'src/search')
-rw-r--r--src/search/pawn_moves.c78
1 files changed, 59 insertions, 19 deletions
diff --git a/src/search/pawn_moves.c b/src/search/pawn_moves.c
index f015e7d..5d94571 100644
--- a/src/search/pawn_moves.c
+++ b/src/search/pawn_moves.c
@@ -1,5 +1,4 @@
#include "../search.h"
-#include <stdio.h>
#include <assert.h>
#include <inttypes.h>
@@ -15,7 +14,7 @@ bitboard_t get_white_pawn_forwardmoves(moves_t* moves, position_t position) {
bitboard_t friendly_pawns = position.bitboards[WHITE_PAWN];
bitboard_t y = friendly_pieces | enemy_bitboard;
bitboard_t x = ~((friendly_pawns << 8) & y) & (friendly_pawns << 8);
- bitboard_t first_move_x = x & BITMASK_RANK_C;
+ bitboard_t first_move_x = x & BITMASK_RANK_3;
first_move_x |= (first_move_x << 8) & (~y);
x |= first_move_x;
@@ -33,8 +32,8 @@ bitboard_t get_black_pawn_forwardmoves(moves_t* moves, position_t position) {
position.bitboards[BLACK_PAWN];
bitboard_t friendly_pawns = position.bitboards[BLACK_PAWN];
bitboard_t y = friendly_pieces | enemy_bitboard;
- bitboard_t x = ~((friendly_pawns << 8) & y) & (friendly_pawns << 8);
- bitboard_t first_move_x = x | BITMASK_RANK_F;
+ bitboard_t x = ~((friendly_pawns >> 8) & y) & (friendly_pawns >> 8);
+ bitboard_t first_move_x = x & BITMASK_RANK_6;
first_move_x |= (first_move_x >> 8) & (~y);
x |= first_move_x;
@@ -47,38 +46,44 @@ void get_pawn_moves(moves_t* moves, position_t position) {
bitboard_t forward_moves;
bitboard_t friendly_pawns;
+ bitboard_t enemy_bitboard;
if (position.turn == WHITE_TURN) {
forward_moves = get_white_pawn_forwardmoves(moves, position);
friendly_pawns = position.bitboards[WHITE_PAWN];
+ enemy_bitboard = blacks(position);
} else {
forward_moves = get_black_pawn_forwardmoves(moves, position);
friendly_pawns = position.bitboards[BLACK_PAWN];
+ enemy_bitboard = whites(position);
}
- bitboard_t column_masks[8] = {
- BITMASK_COLM_1,
- BITMASK_COLM_2,
- BITMASK_COLM_3,
- BITMASK_COLM_4,
- BITMASK_COLM_5,
- BITMASK_COLM_6,
- BITMASK_COLM_7,
- BITMASK_COLM_8,
+ bitboard_t file_masks[8] = {
+ BITMASK_FILE_A,
+ BITMASK_FILE_B,
+ BITMASK_FILE_C,
+ BITMASK_FILE_D,
+ BITMASK_FILE_E,
+ BITMASK_FILE_F,
+ BITMASK_FILE_G,
+ BITMASK_FILE_H,
};
for (int i = 0; i < 8; i++) {
- bitboard_t item = column_masks[i] & forward_moves;
- bitboard_t pawns = column_masks[i] & friendly_pawns;
+ bitboard_t item = file_masks[i] & forward_moves;
+ bitboard_t pawns = file_masks[i] & friendly_pawns;
int from = __builtin_ctzll(pawns);
pawns &= (pawns - 1);
int next_from = __builtin_ctzll(pawns);
+ if (pawns == 0) next_from = 64; // to work around UB
+
while (item) {
int to = __builtin_ctzll(item);
if (to > next_from) {
from = next_from;
pawns &= (pawns - 1);
next_from = __builtin_ctzll(pawns);
+ if (pawns == 0) next_from = 64;
}
item &= (item - 1);
add_move(moves, from, to);
@@ -90,11 +95,11 @@ void get_pawn_moves(moves_t* moves, position_t position) {
int rank_shift;
int from_shift;
if (position.turn == WHITE_TURN) {
- PASSANT_RANK = BITMASK_RANK_E;
+ PASSANT_RANK = BITMASK_RANK_5;
rank_shift = 40;
from_shift = -9;
} else {
- PASSANT_RANK = BITMASK_RANK_D;
+ PASSANT_RANK = BITMASK_RANK_4;
from_shift = 7;
rank_shift = 16;
}
@@ -103,7 +108,7 @@ void get_pawn_moves(moves_t* moves, position_t position) {
if (position.passantable_column > 1) left = position.passantable_column - 1;
if (position.passantable_column < 8) right = position.passantable_column + 1;
if (left != 0) {
- bitboard_t MASK = column_masks[left - 1] & friendly_pawns & PASSANT_RANK;
+ bitboard_t MASK = file_masks[left - 1] & friendly_pawns & PASSANT_RANK;
if (MASK != 0) {
add_move(
moves,
@@ -113,7 +118,7 @@ void get_pawn_moves(moves_t* moves, position_t position) {
}
}
if (right != 0) {
- bitboard_t MASK = column_masks[right - 1] & friendly_pawns & PASSANT_RANK;
+ bitboard_t MASK = file_masks[right - 1] & friendly_pawns & PASSANT_RANK;
if (MASK != 0) {
add_move(
moves,
@@ -123,4 +128,39 @@ void get_pawn_moves(moves_t* moves, position_t position) {
}
}
}
+
+
+ bitboard_t ATTACK_MASK;
+ int shift;
+ if (position.turn == WHITE_TURN) {
+ shift = 0;
+ } else {
+ shift = -16;
+ }
+ for (int i = 0; i < 8; i++) {
+ if (i == 0) ATTACK_MASK = 512;
+ else if (i == 7) ATTACK_MASK = 128;
+ else {
+ ATTACK_MASK = 640;
+ }
+ bitboard_t pawns = file_masks[i] & friendly_pawns;
+ while (pawns) {
+ int from = __builtin_ctzll(pawns);
+ pawns &= pawns - 1;
+
+ bitboard_t MASK;
+ if (from + shift > 0) {
+ MASK = ATTACK_MASK << (from + shift);
+ } else {
+ MASK = ATTACK_MASK >> -(from + shift);
+ }
+
+ MASK &= enemy_bitboard;
+ while (MASK) {
+ int to = __builtin_ctzll(MASK);
+ MASK &= MASK - 1;
+ add_move(moves, from, to);
+ }
+ }
+ }
}