use intrinsics on more platforms for SkCLZ
authorreed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>
Mon, 29 Apr 2013 14:18:44 +0000 (14:18 +0000)
committerreed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>
Mon, 29 Apr 2013 14:18:44 +0000 (14:18 +0000)
Review URL: https://codereview.chromium.org/14418004

git-svn-id: http://skia.googlecode.com/svn/trunk@8897 2bbb7eff-a529-9590-31e7-b0007b416f81

include/core/SkMath.h

index cee3257..2da1a3a 100644 (file)
@@ -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
 
 /**