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