From: Orvid King Date: Mon, 14 Sep 2015 17:53:41 +0000 (-0700) Subject: MSVC 2015 constexpr in Bits.h X-Git-Tag: deprecate-dynamic-initializer~409 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=72f394052266ab7874cd624b94d548fb68d9323d;p=folly.git MSVC 2015 constexpr in Bits.h Summary: MSVC 2015 supports constexpr intrinsics, and, as the GCC builtins are implemented by #287, we can remove all the MSVC specific intrinsic stuff that isn't constexpr supported. Closes https://github.com/facebook/folly/pull/288 Reviewed By: @yfeldblum Differential Revision: D2419064 Pulled By: @JoelMarcey --- diff --git a/folly/Bits.h b/folly/Bits.h index 4c1182a6..b6d0a23e 100644 --- a/folly/Bits.h +++ b/folly/Bits.h @@ -55,10 +55,11 @@ #ifndef FOLLY_BITS_H_ #define FOLLY_BITS_H_ -#if !defined(__clang__) && !defined(_MSC_VER) +#if !defined(__clang__) && !(defined(_MSC_VER) && (_MSC_VER < 1900)) #define FOLLY_INTRINSIC_CONSTEXPR constexpr #else -// GCC is the only compiler with intrinsics constexpr. +// GCC and MSVC 2015+ are the only compilers with +// intrinsics constexpr. #define FOLLY_INTRINSIC_CONSTEXPR const #endif @@ -72,14 +73,6 @@ # include #endif -#ifdef _MSC_VER -# include -# pragma intrinsic(_BitScanForward) -# pragma intrinsic(_BitScanForward64) -# pragma intrinsic(_BitScanReverse) -# pragma intrinsic(_BitScanReverse64) -#endif - #include #include #include @@ -100,12 +93,7 @@ typename std::enable_if< sizeof(T) <= sizeof(unsigned int)), unsigned int>::type findFirstSet(T x) { -#ifdef _MSC_VER - unsigned long index; - return _BitScanForward(&index, x) ? index : 0; -#else return __builtin_ffs(x); -#endif } template @@ -117,12 +105,7 @@ typename std::enable_if< sizeof(T) <= sizeof(unsigned long)), unsigned int>::type findFirstSet(T x) { -#ifdef _MSC_VER - unsigned long index; - return _BitScanForward(&index, x) ? index : 0; -#else return __builtin_ffsl(x); -#endif } template @@ -134,12 +117,7 @@ typename std::enable_if< sizeof(T) <= sizeof(unsigned long long)), unsigned int>::type findFirstSet(T x) { -#ifdef _MSC_VER - unsigned long index; - return _BitScanForward64(&index, x) ? index : 0; -#else return __builtin_ffsll(x); -#endif } template @@ -164,18 +142,7 @@ typename std::enable_if< sizeof(T) <= sizeof(unsigned int)), unsigned int>::type findLastSet(T x) { -#ifdef _MSC_VER - unsigned long index; - int clz; - if (_BitScanReverse(&index, x)) { - clz = static_cast(31 - index); - } else { - clz = 32; - } - return x ? 8 * sizeof(unsigned int) - clz : 0; -#else return x ? 8 * sizeof(unsigned int) - __builtin_clz(x) : 0; -#endif } template @@ -187,18 +154,7 @@ typename std::enable_if< sizeof(T) <= sizeof(unsigned long)), unsigned int>::type findLastSet(T x) { -#ifdef _MSC_VER - unsigned long index; - int clz; - if (_BitScanReverse(&index, x)) { - clz = static_cast(31 - index); - } else { - clz = 32; - } - return x ? 8 * sizeof(unsigned int) - clz : 0; -#else return x ? 8 * sizeof(unsigned long) - __builtin_clzl(x) : 0; -#endif } template @@ -210,18 +166,7 @@ typename std::enable_if< sizeof(T) <= sizeof(unsigned long long)), unsigned int>::type findLastSet(T x) { -#ifdef _MSC_VER - unsigned long index; - unsigned long long clz; - if (_BitScanReverse(&index, x)) { - clz = static_cast(63 - index); - } else { - clz = 64; - } - return x ? 8 * sizeof(unsigned long long) - clz : 0; -#else return x ? 8 * sizeof(unsigned long long) - __builtin_clzll(x) : 0; -#endif } template