- // Remove pieces from source squares
- byColorBB[us] ^= kfrom;
- byTypeBB[KING] ^= kfrom;
- occupied ^= kfrom;
- byColorBB[us] ^= rfrom;
- byTypeBB[ROOK] ^= rfrom;
- occupied ^= rfrom;
-
- // Put pieces on destination squares
- byColorBB[us] |= kto;
- byTypeBB[KING] |= kto;
- occupied |= kto;
- byColorBB[us] |= rto;
- byTypeBB[ROOK] |= rto;
- occupied |= rto;
+ // Move the pieces, with some care; in chess960 could be kto == rfrom
+ Bitboard k_from_to_bb = SquareBB[kfrom] ^ SquareBB[kto];
+ Bitboard r_from_to_bb = SquareBB[rfrom] ^ SquareBB[rto];
+ byTypeBB[KING] ^= k_from_to_bb;
+ byTypeBB[ROOK] ^= r_from_to_bb;
+ byTypeBB[ALL_PIECES] ^= k_from_to_bb ^ r_from_to_bb;
+ byColorBB[us] ^= k_from_to_bb ^ r_from_to_bb;