ffsl, ffsll: Optimize for GCC.
authorBruno Haible <bruno@clisp.org>
Thu, 13 Oct 2011 22:48:29 +0000 (00:48 +0200)
committerBruno Haible <bruno@clisp.org>
Thu, 13 Oct 2011 22:48:29 +0000 (00:48 +0200)
* lib/ffsl.h (FUNC): Use GCC_BUILTIN if defined.
* lib/ffsl.c (GCC_BUILTIN): New macro.
* lib/ffsll.c (GCC_BUILTIN): Likewise.

ChangeLog
lib/ffsl.c
lib/ffsl.h
lib/ffsll.c

index 8b06b27..866dfa2 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,12 @@
 2011-10-13  Bruno Haible  <bruno@clisp.org>
 
+       ffsl, ffsll: Optimize for GCC.
+       * lib/ffsl.h (FUNC): Use GCC_BUILTIN if defined.
+       * lib/ffsl.c (GCC_BUILTIN): New macro.
+       * lib/ffsll.c (GCC_BUILTIN): Likewise.
+
+2011-10-13  Bruno Haible  <bruno@clisp.org>
+
        ffs, bcopy, memset: Support symbol renaming via config.h.
        * lib/ffs.c: Include <config.h>.
        * lib/bcopy.c: Likewise.
index 0b93796..ee99ba7 100644 (file)
@@ -1,3 +1,4 @@
 #define FUNC ffsl
 #define TYPE long int
+#define GCC_BUILTIN __builtin_ffsl
 #include "ffsl.h"
index eb7fead..9f20912 100644 (file)
@@ -31,6 +31,9 @@
 int
 FUNC (TYPE i)
 {
+#if (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) && defined GCC_BUILTIN
+  return GCC_BUILTIN (i);
+#else
   int result = 0;
   unsigned TYPE j = i;
 
@@ -44,4 +47,5 @@ FUNC (TYPE i)
       j >>= CHAR_BIT * sizeof (unsigned int);
       result += CHAR_BIT * sizeof (unsigned int);
     }
+#endif
 }
index d056d7c..f0e9425 100644 (file)
@@ -1,3 +1,4 @@
 #define FUNC ffsll
 #define TYPE long long int
+#define GCC_BUILTIN __builtin_ffsll
 #include "ffsl.h"