diff options
-rw-r--r-- | include/core/SkMath.h | 22 | ||||
-rw-r--r-- | tests/MathTest.cpp | 2 |
2 files changed, 18 insertions, 6 deletions
diff --git a/include/core/SkMath.h b/include/core/SkMath.h index cee3257197..2da1a3a921 100644 --- a/include/core/SkMath.h +++ b/include/core/SkMath.h @@ -40,12 +40,24 @@ int32_t SkSqrtBits(int32_t value, int bitBias); //! Returns the number of leading zero bits (0...32) int SkCLZ_portable(uint32_t); -#if defined(SK_CPU_ARM) - #define SkCLZ(x) __builtin_clz(x) -#endif - #ifndef SkCLZ - #define SkCLZ(x) SkCLZ_portable(x) + #if defined(_MSC_VER) && _MSC_VER >= 1400 + #include <intrin.h> + + static inline int SkCLZ(uint32_t mask) { + if (mask) { + DWORD index; + _BitScanReverse(&index, mask); + return index ^ 0x1F; + } else { + return 32; + } + } + #elif defined(SK_CPU_ARM) || defined(__GNUC__) + #define SkCLZ(x) __builtin_clz(x) + #else + #define SkCLZ(x) SkCLZ_portable(x) + #endif #endif /** diff --git a/tests/MathTest.cpp b/tests/MathTest.cpp index 4ad83d1829..ca860e462b 100644 --- a/tests/MathTest.cpp +++ b/tests/MathTest.cpp @@ -17,7 +17,7 @@ static void test_clz(skiatest::Reporter* reporter) { REPORTER_ASSERT(reporter, 32 == SkCLZ(0)); REPORTER_ASSERT(reporter, 31 == SkCLZ(1)); REPORTER_ASSERT(reporter, 1 == SkCLZ(1 << 30)); - REPORTER_ASSERT(reporter, 0 == SkCLZ(~0UL)); + REPORTER_ASSERT(reporter, 0 == SkCLZ(~0U)); SkRandom rand; for (int i = 0; i < 1000; ++i) { |