summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Gran <spk121@yahoo.com>2023-06-20 15:10:20 -0700
committerMichael Gran <spk121@yahoo.com>2025-03-30 18:10:30 -0700
commitfaa6b8cf824cd5294a9c4850d95381957cdb35f3 (patch)
treef3e94743736fd72d3920b184a48b0e89fe50f3be
parent2177f3f6c54d34e257db1efc53cee3beba6b7af6 (diff)
downloadguile-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.c22
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;
}