Prechádzať zdrojové kódy

better popcount if intrinsic not supported

Nicolas Winkler 7 rokov pred
rodič
commit
b177ebc3b5
1 zmenil súbory, kde vykonal 8 pridanie a 6 odobranie
  1. 8 6
      src/BitOperations.h

+ 8 - 6
src/BitOperations.h

@@ -77,15 +77,17 @@ namespace chessy
 
     inline int popcount(U64 x) {
 #if __GNUC__ > 4
-        return __builtin_popcount(x);
+        return __builtin_popcountll(x);
 #elif defined(_MSC_VER) && defined(_M_X64)
         return _mm_popcnt_u64(x);
 #else
-        int result = 0;
-        for (int i = 0; i < 64; i++)
-            if (x & (1ULL << i))
-                result++;
-        return result;
+        x = (x & 0x5555555555555555) + ((x & 0xAAAAAAAAAAAAAAAA) >> 1);
+        x = (x & 0x3333333333333333) + ((x & 0xCCCCCCCCCCCCCCCC) >> 2);
+        x = (x & 0x0F0F0F0F0F0F0F0F) + ((x & 0xF0F0F0F0F0F0F0F0) >> 4);
+        x = (x & 0x00FF00FF00FF00FF) + ((x & 0xFF00FF00FF00FF00) >> 8);
+        x = (x & 0x0000FFFF0000FFFF) + ((x & 0xFFFF0000FFFF0000) >> 16);
+        x = (x & 0x00000000FFFFFFFF) + ((x & 0xFFFFFFFF00000000) >> 32);
+        return x;
 #endif
     }
 }