|
@@ -91,6 +91,7 @@
|
|
|
// These #includes are for the byte swap functions declared later on.
|
|
|
#ifdef _MSC_VER
|
|
|
#include <stdlib.h> // NOLINT(build/include)
|
|
|
+#include <intrin.h>
|
|
|
#elif defined(__APPLE__)
|
|
|
#include <libkern/OSByteOrder.h>
|
|
|
#elif defined(__GLIBC__) || defined(__CYGWIN__)
|
|
@@ -394,12 +395,10 @@ class Bits {
|
|
|
static uint32 Log2FloorNonZero(uint32 n) {
|
|
|
#if defined(__GNUC__)
|
|
|
return 31 ^ static_cast<uint32>(__builtin_clz(n));
|
|
|
-#elif defined(COMPILER_MSVC) && defined(_M_IX86)
|
|
|
- _asm {
|
|
|
- bsr ebx, n
|
|
|
- mov n, ebx
|
|
|
- }
|
|
|
- return n;
|
|
|
+#elif defined(_MSC_VER)
|
|
|
+ unsigned long where;
|
|
|
+ _BitScanReverse(&where, n);
|
|
|
+ return where;
|
|
|
#else
|
|
|
return Log2FloorNonZero_Portable(n);
|
|
|
#endif
|
|
@@ -414,6 +413,10 @@ class Bits {
|
|
|
// implementation instead.
|
|
|
#if defined(__GNUC__) && !defined(GOOGLE_PROTOBUF_USE_PORTABLE_LOG2)
|
|
|
return 63 ^ static_cast<uint32>(__builtin_clzll(n));
|
|
|
+#elif defined(_MSC_VER) && defined(_M_X64)
|
|
|
+ unsigned long where;
|
|
|
+ _BitScanReverse64(&where, n);
|
|
|
+ return where;
|
|
|
#else
|
|
|
return Log2FloorNonZero64_Portable(n);
|
|
|
#endif
|