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
This commit is contained in:
Hermet Park 2021-06-23 16:17:10 +09:00 committed by Hermet Park
parent 4f35c478c2
commit bba162b604

View file

@ -27,6 +27,21 @@
/* Internal Class Implementation */
/************************************************************************/
//clz: count leading zeros
#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 zeros
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;