diff options
author | Michael Gran <spk121@yahoo.com> | 2023-06-20 15:10:20 -0700 |
---|---|---|
committer | Michael Gran <spk121@yahoo.com> | 2025-03-30 18:10:30 -0700 |
commit | faa6b8cf824cd5294a9c4850d95381957cdb35f3 (patch) | |
tree | f3e94743736fd72d3920b184a48b0e89fe50f3be | |
parent | 2177f3f6c54d34e257db1efc53cee3beba6b7af6 (diff) | |
download | guile-faa6b8cf824cd5294a9c4850d95381957cdb35f3.tar.gz |
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;
-rw-r--r-- | libguile/lightening/lightening/x86-cpu.c | 22 |
1 files 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; } |