Final touches to pop_1st_bit optimization
authorMarco Costalba <mcostalba@gmail.com>
Fri, 19 Sep 2008 03:33:55 +0000 (05:33 +0200)
committerMarco Costalba <mcostalba@gmail.com>
Fri, 19 Sep 2008 03:33:55 +0000 (05:33 +0200)
This final version is a little bit faster then
previous patch and is a bit cleaned up also.

On 32 bit x86 pop_1st_bit is now more then
two times faster then the original one that
is optimized for 64 bit processors.

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

index 5dd0137da39d225d34b4a41bb48279851fa29644..e4fcb7ce438de974b17303135427868b441ad002 100644 (file)
@@ -343,18 +343,16 @@ Square first_1(Bitboard b) {
 
 Square pop_1st_bit(Bitboard *bb) {
 
-  uint32_t  t = uint32_t(*bb);
-  uint32_t* p = t ? (uint32_t*)bb : (uint32_t*)bb + 1; // Little endian only?
-  uint32_t  b = t ? t : *p;
+  uint32_t  a = uint32_t(*bb);
+  uint32_t* ptr = a ? (uint32_t*)bb : (uint32_t*)bb + 1; // Little endian only?
+  uint32_t  b = a ? a : *ptr;
+  uint32_t  c = ~(b ^ (b - 1));
 
-  *p = b & (b -1);
+  *ptr = b & c; // clear the bit
+  if (a)
+     c = ~c;
 
-  if (t)
-     b ^= (b - 1);
-  else
-     b = ~(b ^ (b - 1));
-
-  return Square(BitTable[(b * 0x783a9b23) >> 26]);
+  return Square(BitTable[(c * 0x783a9b23) >> 26]);
 }
 
 #else