+ // Update castle rights, try to shortcut a common case
+ if ((castleRightsMask[from] & castleRightsMask[to]) != ALL_CASTLES)
+ {
+ st->key ^= zobCastle[st->castleRights];
+ st->castleRights &= castleRightsMask[from];
+ st->castleRights &= castleRightsMask[to];
+ st->key ^= zobCastle[st->castleRights];
+ }
+
+ bool checkEpSquare = (pt == PAWN && abs(int(to) - int(from)) == 16);
+
+ // Prefetch TT access as soon as we know key is updated
+ if (!checkEpSquare && TT)
+ TT->prefetch(st->key);
+
+ // Move the piece
+ Bitboard move_bb = make_move_bb(from, to);
+ do_move_bb(&(byColorBB[us]), move_bb);
+ do_move_bb(&(byTypeBB[pt]), move_bb);
+ do_move_bb(&(byTypeBB[0]), move_bb); // HACK: byTypeBB[0] == occupied squares
+
+ board[to] = board[from];
+ board[from] = EMPTY;
+