diff --git a/src/hb-private.hh b/src/hb-private.hh index 6430ba8e3bfec85cc0f9c1becaf9dfe024db53e5..22948ae547dac4f401c1df5d59b9a66c2817731c 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;