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;
   }

Reply via email to