+2024-05-17 Bruno Haible <bruno@clisp.org>
+
+ stdbit-h: Fix compilation error with MSVC in C++ mode.
+ * lib/stdbit.in.h (_BitScanReverse, _BitScanReverse64, _BitScanForward,
+ _BitScanForward64, __cpuid, __popcnt, __popcnt64): Declare with a
+ prototype.
+ * lib/count-leading-zeros.h (_BitScanReverse, _BitScanReverse64):
+ Likewise.
+ * lib/count-trailing-zeros.h (_BitScanForward, _BitScanForward64):
+ Likewise.
+ * lib/count-one-bits.h (__cpuid, __popcnt, __popcnt64): Likewise.
+
2024-05-17 Paul Eggert <eggert@cs.ucla.edu>
byteswap: port better to limited platforms
# define COUNT_LEADING_ZEROS(BUILTIN, MSC_BUILTIN, TYPE) \
return x ? BUILTIN (x) : CHAR_BIT * sizeof x;
#elif _MSC_VER
+extern unsigned char _BitScanReverse (unsigned long *, unsigned long);
# pragma intrinsic (_BitScanReverse)
# if defined _M_X64
+extern unsigned char _BitScanReverse64 (unsigned long *, unsigned long long);
# pragma intrinsic (_BitScanReverse64)
# endif
# define COUNT_LEADING_ZEROS(BUILTIN, MSC_BUILTIN, TYPE) \
# include <intrin.h>
# else
/* Don't pollute the namespace with too many MSVC intrinsics. */
+extern void __cpuid (int[4], int);
# pragma intrinsic (__cpuid)
+extern unsigned int __popcnt (unsigned int);
# pragma intrinsic (__popcnt)
# if defined _M_X64
+extern unsigned long long __popcnt64 (unsigned long long);
# pragma intrinsic (__popcnt64)
# endif
# endif
# define COUNT_TRAILING_ZEROS(BUILTIN, MSC_BUILTIN, TYPE) \
return x ? BUILTIN (x) : CHAR_BIT * sizeof x;
#elif _MSC_VER
+extern unsigned char _BitScanForward (unsigned long *, unsigned long);
# pragma intrinsic (_BitScanForward)
# if defined _M_X64
+extern unsigned char _BitScanForward64 (unsigned long *, unsigned long long);
# pragma intrinsic (_BitScanForward64)
# endif
# define COUNT_TRAILING_ZEROS(BUILTIN, MSC_BUILTIN, TYPE) \
return n ? __builtin_clzll (n) : 8 * sizeof n;
}
#elif defined _MSC_VER
+
+/* Declare the few MSVC intrinsics that we need. We prefer not to include
+ <intrin.h> because it would pollute the namespace. */
+extern unsigned char _BitScanReverse (unsigned long *, unsigned long);
# pragma intrinsic (_BitScanReverse)
# ifdef _M_X64
+extern unsigned char _BitScanReverse64 (unsigned long *, unsigned long long);
# pragma intrinsic (_BitScanReverse64)
# endif
+
_GL_STDBIT_INLINE int
__gl_stdbit_clzl (unsigned long int n)
{
return n ? __builtin_ctzll (n) : 8 * sizeof n;
}
#elif defined _MSC_VER
+
+/* Declare the few MSVC intrinsics that we need. We prefer not to include
+ <intrin.h> because it would pollute the namespace. */
+extern unsigned char _BitScanForward (unsigned long *, unsigned long);
# pragma intrinsic (_BitScanForward)
# ifdef _M_X64
+extern unsigned char _BitScanForward64 (unsigned long *, unsigned long long);
# pragma intrinsic (_BitScanForward64)
# endif
+
_GL_STDBIT_INLINE int
__gl_stdbit_ctzl (unsigned long int n)
{
# ifdef _MSC_VER
# if 1500 <= _MSC_VER && (defined _M_IX86 || defined _M_X64)
+/* Declare the few MSVC intrinsics that we need. We prefer not to include
+ <intrin.h> because it would pollute the namespace. */
+extern void __cpuid (int[4], int);
# pragma intrinsic (__cpuid)
+extern unsigned int __popcnt (unsigned int);
# pragma intrinsic (__popcnt)
# ifdef _M_X64
+extern unsigned long long __popcnt64 (unsigned long long);
# pragma intrinsic (__popcnt64)
# else
_GL_STDC_COUNT_ONES_INLINE int