inline cell log2(cell x)
{
cell n;
-#if defined(FACTOR_X86) || defined(FACTOR_AMD64)
- asm ("bsr %1, %0;":"=r"(n):"r"(x));
+#if defined(FACTOR_X86)
+ #if defined(_MSC_VER)
+ _BitScanReverse(&n,x);
+ #else
+ asm ("bsr %1, %0;":"=r"(n):"r"(x));
+ #endif
+#elif defined(FACTOR_AMD64)
+ #if defined(_MSC_VER)
+ _BitScanReverse64(&n,x);
+ #else
+ asm ("bsr %1, %0;":"=r"(n):"r"(x));
+ #endif
#elif defined(FACTOR_PPC)
asm ("cntlzw %1, %0;":"=r"(n):"r"(x));
n = (31 - n);
inline cell rightmost_set_bit(cell x)
{
- return log2(x & -x);
+ return log2(x & (~x + 1));
}
inline cell popcount(cell x)