#else
asm("bsr %1, %0;" : "=r"(n) : "r"(x));
#endif
+
#elif defined(FACTOR_AMD64)
#if defined(_MSC_VER)
n = 0;
#else
asm("bsr %1, %0;" : "=r"(n) : "r"(x));
#endif
-#elif defined(FACTOR_PPC64)
-#if defined(__GNUC__)
- n = (63 - __builtin_clzll(x));
+
+#elif defined(FACTOR_ARM)
+#if defined(_MSC_VER)
+ _BitScanReverse((unsigned long*)&n, x);
#else
-#error Unsupported compiler
+ n = (31 - __builtin_clz(x));
#endif
+
+#elif defined(FACTOR_ARM64)
+#if defined(_MSC_VER)
+ n = 0;
+ _BitScanReverse64((unsigned long*)&n, x);
+#else
+ n = (63 - __builtin_clzll(x));
+#endif
+
#elif defined(FACTOR_PPC32)
#if defined(__GNUC__)
n = (31 - __builtin_clz(x));
#else
#error Unsupported compiler
#endif
+
+#elif defined(FACTOR_PPC64)
+#if defined(__GNUC__)
+ n = (63 - __builtin_clzll(x));
+#else
+#error Unsupported compiler
+#endif
+
#else
#error Unsupported CPU
#endif
cell ks = 24;
#endif
- x = x - ((x >> 1) & k1); /* put count of each 2 bits into those 2 bits */
- x = (x & k2) + ((x >> 2) & k2); /* put count of each 4 bits into those 4 bits */
- x = (x + (x >> 4)) & k4; /* put count of each 8 bits into those 8 bits */
- x = (x * kf) >> ks; /* returns 8 most significant bits of x + (x<<8) + */
- (x<<16) + (x<<24) + ... */
+ x = x - ((x >> 1) & k1); // put count of each 2 bits into those 2 bits
+ x = (x & k2) + ((x >> 2) & k2); // put count of each 4 bits into those 4 bits
+ x = (x + (x >> 4)) & k4; // put count of each 8 bits into those 8 bits
+ x = (x * kf) >> ks; // returns 8 most significant bits of x + (x<<8) +
+ // (x<<16) + (x<<24) + ...
return x;
#endif