sw_engine: fix MSVC compatibility problem.
authorHermet Park <chuneon.park@samsung.com>
Wed, 23 Jun 2021 07:17:10 +0000 (16:17 +0900)
committerJunsuChoi <jsuya.choi@samsung.com>
Thu, 24 Jun 2021 00:26:30 +0000 (09:26 +0900)
clz (count leading zero) is builtin function
that is not available in MSVC.

This patch replace clz for MSVC env.

Thanks @fire for pointing out this.

Refers: https://stackoverflow.com/questions/355967/how-to-use-msvc-intrinsics-to-get-the-equivalent-of-this-gcc-code

src/lib/sw_engine/tvgSwMath.cpp

index 19c2388..5913e54 100644 (file)
 /* Internal Class Implementation                                        */
 /************************************************************************/
 
+//clz: count leading zero’s
+#ifdef _MSC_VER
+    #include <intrin.h>
+    static uint32_t __inline _clz(uint32_t value)
+    {
+        unsigned long leadingZero = 0;
+        if (_BitScanReverse(&leadingZero, value)) return 31 - leadingZero;
+        else return 32;
+    }
+}
+#else
+    #define _clz(x) __builtin_clz((x))
+#endif
+
+
 constexpr SwFixed CORDIC_FACTOR = 0xDBD95B16UL;       //the Cordic shrink factor 0.858785336480436 * 2^32
 
 //this table was generated for SW_FT_PI = 180L << 16, i.e. degrees
@@ -68,8 +83,7 @@ static int32_t _normalize(SwPoint& pt)
     auto v = pt;
 
     //High order bit(MSB)
-    //clz: count leading zero’s
-    auto shift = 31 - __builtin_clz(abs(v.x) | abs(v.y));
+    auto shift = 31 - _clz(abs(v.x) | abs(v.y));
 
     if (shift <= SAFE_MSB) {
         shift = SAFE_MSB - shift;