mike121 pushed a commit to branch wip-mingw-2025 in repository guile. commit faa6b8cf824cd5294a9c4850d95381957cdb35f3 Author: Michael Gran <spk...@yahoo.com> AuthorDate: Tue Jun 20 15:10:20 2023 -0700
WIN32: use GCC builtin ffs to replace missing function FFS is missing on MINGW. * libguile/lightening/lightening/x86-cpu.c [__GNUC__ && _WIN32](USE_BUILTIN_FFS): new macro (__ffs): wrapper function (ffsw): use __ffs; --- libguile/lightening/lightening/x86-cpu.c | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/libguile/lightening/lightening/x86-cpu.c b/libguile/lightening/lightening/x86-cpu.c index 7757dc054..d8289a317 100644 --- a/libguile/lightening/lightening/x86-cpu.c +++ b/libguile/lightening/lightening/x86-cpu.c @@ -1012,14 +1012,30 @@ mulr(jit_state_t *_jit, int32_t r0, int32_t r1, int32_t r2) } } +#if defined(__GNUC__) && defined(_WIN32) +/* ffs may be missing on WIN32 but is always available as GCC + builtin. */ +#define USE_BUILTIN_FFS +#endif + +static int +__ffs(int i) +{ +#ifdef USE_BUILTIN_FFS + return __builtin_ffs(i); +#else + return ffs(i); +#endif +} + static int ffsw(jit_word_t i) { if (sizeof(int) == sizeof(i)) - return ffs(i); - int bit = ffs((int)i); + return __ffs(i); + int bit = __ffs((int)i); if (bit == 0) { - bit = ffs((int)((uint64_t)i >> 32)); + bit = __ffs((int)((uint64_t)i >> 32)); if (bit) bit += 32; }