From bba162b604944671211d8dd7bf384dcf20428ff8 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Wed, 23 Jun 2021 16:17:10 +0900 Subject: [PATCH] sw_engine: fix MSVC compatibility problem. 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 | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/lib/sw_engine/tvgSwMath.cpp b/src/lib/sw_engine/tvgSwMath.cpp index 19c23883..5913e54a 100644 --- a/src/lib/sw_engine/tvgSwMath.cpp +++ b/src/lib/sw_engine/tvgSwMath.cpp @@ -27,6 +27,21 @@ /* Internal Class Implementation */ /************************************************************************/ +//clz: count leading zero’s +#ifdef _MSC_VER + #include + 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;