浏览代码

Merge pull request #4310 from KindDragon/patch-1

Support using MSVC intrinsics in Log2FloorNonZero
Feng Xiao 7 年之前
父节点
当前提交
d5f5725c0a
共有 1 个文件被更改,包括 9 次插入6 次删除
  1. 9 6
      src/google/protobuf/stubs/port.h

+ 9 - 6
src/google/protobuf/stubs/port.h

@@ -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