Split branches in generate_piece_moves()
authorMarco Costalba <mcostalba@gmail.com>
Fri, 27 Aug 2010 10:15:07 +0000 (12:15 +0200)
committerMarco Costalba <mcostalba@gmail.com>
Fri, 27 Aug 2010 12:28:07 +0000 (13:28 +0100)
Instead of one comparison in while() condition use two,
the first to check if the piece is exsistant and the second
to loop across pieces of that type.

This should help branch prediction in cases we have only
one piece of the same type, for instance for queens, the
first branch is always true and the second is almost always
false.

Increased speed of 0.3-0.5 % on Gcc pgo compiles.

No functional change.

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

index 0598249d404e81bfa5fbb64eea5802e8dc47598d..ea3255cc3c8c91e7f309f360f12a119f3707c747 100644 (file)
@@ -429,10 +429,13 @@ namespace {
     Square from;
     const Square* ptr = pos.piece_list_begin(us, Piece);
 
-    while ((from = *ptr++) != SQ_NONE)
+    if (*ptr != SQ_NONE)
     {
-        b = pos.attacks_from<Piece>(from) & target;
-        SERIALIZE_MOVES(b);
+        do {
+            from = *ptr;
+            b = pos.attacks_from<Piece>(from) & target;
+            SERIALIZE_MOVES(b);
+        } while (*++ptr != SQ_NONE);
     }
     return mlist;
   }