Micro-optimize pl_move_is_legal()
authorMarco Costalba <mcostalba@gmail.com>
Sun, 21 Nov 2010 11:43:16 +0000 (12:43 +0100)
committerMarco Costalba <mcostalba@gmail.com>
Sun, 21 Nov 2010 11:49:16 +0000 (12:49 +0100)
This L1/L2 optimization has an incredible +4.7% speedup
in perft test where this function is the most time consumer.

Verified a speed up also in normal bench, although smaller.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
src/position.cpp

index 6abef5b47bcb42c764901fdc0cb7a871d7e80039..001d233dd3021da4cd5da699eb7c39d2de0e308e 100644 (file)
@@ -588,22 +588,18 @@ bool Position::pl_move_is_legal(Move m, Bitboard pinned) const {
   if (move_is_castle(m))
       return true;
 
-  Color us = side_to_move();
-  Square from = move_from(m);
-
-  assert(color_of_piece_on(from) == us);
-  assert(piece_on(king_square(us)) == piece_of_color_and_type(us, KING));
-
   // En passant captures are a tricky special case. Because they are
   // rather uncommon, we do it simply by testing whether the king is attacked
   // after the move is made
   if (move_is_ep(m))
   {
+      Color us = side_to_move();
       Color them = opposite_color(us);
+      Square from = move_from(m);
       Square to = move_to(m);
       Square capsq = make_square(square_file(to), square_rank(from));
-      Bitboard b = occupied_squares();
       Square ksq = king_square(us);
+      Bitboard b = occupied_squares();
 
       assert(to == ep_square());
       assert(piece_on(from) == piece_of_color_and_type(us, PAWN));
@@ -618,6 +614,12 @@ bool Position::pl_move_is_legal(Move m, Bitboard pinned) const {
             && !(bishop_attacks_bb(ksq, b) & pieces(BISHOP, QUEEN, them));
   }
 
+  Color us = side_to_move();
+  Square from = move_from(m);
+
+  assert(color_of_piece_on(from) == us);
+  assert(piece_on(king_square(us)) == piece_of_color_and_type(us, KING));
+
   // If the moving piece is a king, check whether the destination
   // square is attacked by the opponent.
   if (type_of_piece_on(from) == KING)