From 6c10328eb88b0641586f31a782b63f45eada5609 Mon Sep 17 00:00:00 2001 From: Arkady Shapkin Date: Thu, 15 Feb 2018 23:17:46 +0300 Subject: [PATCH] Use _BitScanForward and _BitScanReverse on MSVC --- src/hb-private.hh | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/hb-private.hh b/src/hb-private.hh index 6430ba8e3..22948ae54 100644 --- a/src/hb-private.hh +++ b/src/hb-private.hh @@ -51,6 +51,9 @@ #include #include +#if defined(_MSC_VER) +#include +#endif #define HB_PASTE1(a,b) a##b #define HB_PASTE(a,b) HB_PASTE1(a,b) @@ -352,6 +355,10 @@ _hb_bit_storage (unsigned int number) { #if defined(__GNUC__) && (__GNUC__ >= 4) && defined(__OPTIMIZE__) return likely (number) ? (sizeof (unsigned int) * 8 - __builtin_clz (number)) : 0; +#elif defined_MSC_VER) && defined(__OPTIMIZE__) + unsigned long where; + if (_BitScanReverse(&where, number)) return 1 + where; + return 0; #else unsigned int n_bits = 0; while (number) { @@ -368,6 +375,11 @@ _hb_ctz (unsigned int number) { #if defined(__GNUC__) && (__GNUC__ >= 4) && defined(__OPTIMIZE__) return likely (number) ? __builtin_ctz (number) : 0; +#elif defined_MSC_VER) && defined(__OPTIMIZE__) + unsigned long where; + if (_BitScanForward(&where, n)) return where; + return 0; +} #else unsigned int n_bits = 0; if (unlikely (!number)) return 0;