[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
improve clang support (2)
From: |
Bruno Haible |
Subject: |
improve clang support (2) |
Date: |
Wed, 05 Aug 2020 19:59:53 +0200 |
User-agent: |
KMail/5.1.3 (Linux/4.4.0-186-generic; KDE/5.18.0; x86_64; ; ) |
clang (>= 4.0.0 at least) has also the built-ins
__builtin_ctz
__builtin_ctzl
__builtin_ctzll
__builtin_ffs
__builtin_ffsl
__builtin_ffsll
2020-08-05 Bruno Haible <bruno@clisp.org>
Use __builtin_ctz{,l,ll} and __builtin_ffs{,l,ll} with clang everywhere.
* lib/count-trailing-zeros.h (COUNT_TRAILING_ZEROS): Use the GCC
built-in also on clang.
* lib/ffs.c: With clang, use the GCC built-in, not <intrin.h>.
* lib/ffsl.h: Likewise. Assume GCC_BUILTIN is defined.
diff --git a/lib/count-trailing-zeros.h b/lib/count-trailing-zeros.h
index 1eb5fb9..727b21d 100644
--- a/lib/count-trailing-zeros.h
+++ b/lib/count-trailing-zeros.h
@@ -38,7 +38,8 @@ extern "C" {
expand to code that computes the number of trailing zeros of the local
variable 'x' of type TYPE (an unsigned integer type) and return it
from the current function. */
-#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
+#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) \
+ || (__clang_major__ >= 4)
# define COUNT_TRAILING_ZEROS(BUILTIN, MSC_BUILTIN, TYPE) \
return x ? BUILTIN (x) : CHAR_BIT * sizeof x;
#elif _MSC_VER
diff --git a/lib/ffs.c b/lib/ffs.c
index d8a65ca..c94b8ac 100644
--- a/lib/ffs.c
+++ b/lib/ffs.c
@@ -23,14 +23,14 @@
#include <limits.h>
-#if defined _MSC_VER
+#if defined _MSC_VER && !(__clang_major__ >= 4)
# include <intrin.h>
#endif
int
ffs (int i)
{
-#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
+#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || (__clang_major__
>= 4)
return __builtin_ffs (i);
#elif defined _MSC_VER
/* _BitScanForward
diff --git a/lib/ffsl.h b/lib/ffsl.h
index fa5c093..b449f19 100644
--- a/lib/ffsl.h
+++ b/lib/ffsl.h
@@ -27,7 +27,7 @@
#include <limits.h>
#include <strings.h>
-#if defined _MSC_VER
+#if defined _MSC_VER && !(__clang_major__ >= 4)
# include <intrin.h>
/* Copied from ffs.c. */
static inline int
@@ -50,7 +50,8 @@ ffs (int i)
int
FUNC (TYPE i)
{
-#if (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) && defined
GCC_BUILTIN
+#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) \
+ || (__clang_major__ >= 4)
return GCC_BUILTIN (i);
#elif defined _MSC_VER && defined MSVC_BUILTIN
/* _BitScanForward, _BitScanForward64
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- improve clang support (2),
Bruno Haible <=