>From 8c7b90680b73580b5c257baa3c9c22239ab0c3d1 Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Tue, 4 Aug 2020 00:40:24 +0200 Subject: [PATCH 4/6] integer_length: Optimize for MSVC. * lib/integer_length.c: Include . (integer_length): With MSVC, use the _BitScanReverse built-in. --- ChangeLog | 6 ++++++ lib/integer_length.c | 14 ++++++++++---- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index 51b2be7..b2169e3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,11 @@ 2020-08-03 Bruno Haible + integer_length: Optimize for MSVC. + * lib/integer_length.c: Include . + (integer_length): With MSVC, use the _BitScanReverse built-in. + +2020-08-03 Bruno Haible + ffsll: Optimize for MSVC in 64-bit mode. * lib/ffsl.h (FUNC): On MSVC, use MSVC_BUILTIN if defined. * lib/ffsll.c (MSVC_BUILTIN): Define for MSVC in 64-bit mode. diff --git a/lib/integer_length.c b/lib/integer_length.c index edad54b..43d8f49 100644 --- a/lib/integer_length.c +++ b/lib/integer_length.c @@ -25,10 +25,8 @@ #include "float+.h" -/* MSVC with option -fp:strict refuses to compile constant initializers that - contain floating-point operations. Pacify this compiler. */ -#ifdef _MSC_VER -# pragma fenv_access (off) +#if defined _MSC_VER +# include #endif #define NBITS (sizeof (unsigned int) * CHAR_BIT) @@ -41,6 +39,14 @@ integer_length (unsigned int x) return 0; else return NBITS - __builtin_clz (x); +#elif defined _MSC_VER + /* _BitScanReverse + */ + unsigned long bit; + if (_BitScanReverse (&bit, x)) + return bit + 1; + else + return 0; #else # if defined DBL_EXPBIT0_WORD && defined DBL_EXPBIT0_BIT if (NBITS <= DBL_MANT_BIT) -- 2.7.4