* lib/ffsl.h (FUNC): On MSVC, use MSVC_BUILTIN if defined.
* lib/ffsll.c (MSVC_BUILTIN): Define for MSVC in 64-bit mode.
* lib/ffsl.c (MSVC_BUILTIN): Define for MSVC.
+2020-08-03 Bruno Haible <bruno@clisp.org>
+
+ 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.
+ * lib/ffsl.c (MSVC_BUILTIN): Define for MSVC.
+
2020-08-03 Bruno Haible <bruno@clisp.org>
ffsll: Optimize for MSVC in 32-bit mode.
#define FUNC ffsl
#define TYPE long int
#define GCC_BUILTIN __builtin_ffsl
+#define MSVC_BUILTIN _BitScanForward
#include "ffsl.h"
{
#if (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) && defined GCC_BUILTIN
return GCC_BUILTIN (i);
+#elif defined _MSC_VER && defined MSVC_BUILTIN
+ /* _BitScanForward, _BitScanForward64
+ <https://docs.microsoft.com/en-us/cpp/intrinsics/bitscanforward-bitscanforward64> */
+ unsigned long bit;
+ if (MSVC_BUILTIN (&bit, i))
+ return bit + 1;
+ else
+ return 0;
#else
unsigned TYPE j = i;
/* Split j into chunks, and look at one chunk after the other. */
#define FUNC ffsll
#define TYPE long long int
#define GCC_BUILTIN __builtin_ffsll
+#ifdef _WIN64
+# define MSVC_BUILTIN _BitScanForward64
+#endif
#include "ffsl.h"