From 4b3d1ed028029965f1fae63b312dd1e0397f54f8 Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Fri, 14 Oct 2011 00:48:29 +0200 Subject: [PATCH] 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. --- ChangeLog | 7 +++++++ lib/ffsl.c | 1 + lib/ffsl.h | 4 ++++ lib/ffsll.c | 1 + 4 files changed, 13 insertions(+) diff --git a/ChangeLog b/ChangeLog index 8b06b2766..866dfa293 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,12 @@ 2011-10-13 Bruno Haible + 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 + ffs, bcopy, memset: Support symbol renaming via config.h. * lib/ffs.c: Include . * lib/bcopy.c: Likewise. diff --git a/lib/ffsl.c b/lib/ffsl.c index 0b93796ac..ee99ba7e0 100644 --- a/lib/ffsl.c +++ b/lib/ffsl.c @@ -1,3 +1,4 @@ #define FUNC ffsl #define TYPE long int +#define GCC_BUILTIN __builtin_ffsl #include "ffsl.h" diff --git a/lib/ffsl.h b/lib/ffsl.h index eb7fead56..9f209123d 100644 --- a/lib/ffsl.h +++ b/lib/ffsl.h @@ -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 } diff --git a/lib/ffsll.c b/lib/ffsll.c index d056d7c26..f0e9425ee 100644 --- a/lib/ffsll.c +++ b/lib/ffsll.c @@ -1,3 +1,4 @@ #define FUNC ffsll #define TYPE long long int +#define GCC_BUILTIN __builtin_ffsll #include "ffsl.h" -- 2.11.0