From ef78f8d706fb1b0fec4b7dcba5066800dcd2655e Mon Sep 17 00:00:00 2001 From: Matthieu Schaller <matthieu.schaller@durham.ac.uk> Date: Thu, 1 Dec 2016 09:53:36 +0000 Subject: [PATCH] Added two more intrinsics for long long types. --- src/intrinsics.h | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/src/intrinsics.h b/src/intrinsics.h index 42dddf77c0..7a4f0870b9 100644 --- a/src/intrinsics.h +++ b/src/intrinsics.h @@ -66,6 +66,23 @@ __attribute__((always_inline)) INLINE static int intrinsics_clz( #endif } +/** + * @brief Returns the number of leading 0-bits in x, starting at the most + * significant bit position. If x is 0, the result is undefined. + * + * This is a wrapper for the GNU intrinsic with an implementation. + */ +__attribute__((always_inline)) INLINE static int intrinsics_clzll( + unsigned long long x) { + +#ifdef __GNUC__ + /* Use GCC intrinsics if possible */ + return __builtin_clzll(x); +#else +#error "Missing definition of clz for long long on this platform." +#endif +} + /** * @brief Returns the number of 1-bits in x. * @@ -88,4 +105,21 @@ __attribute__((always_inline)) INLINE static int intrinsics_popcount( #endif } +/** + * @brief Returns the number of 1-bits in x. + * + * This is a wrapper for the GNU intrinsic with an implementation (from + * Hacker's Delight) if the compiler intrinsics are not available. + */ +__attribute__((always_inline)) INLINE static int intrinsics_popcountll( + unsigned long long x) { + +#ifdef __GNUC__ + /* Use GCC intrinsics if possible */ + return __builtin_popcountll(x); +#else +#error "Missing definition of popcount for long long on this platform." +#endif +} + #endif /* SWIFT_INTRINSICS_H */ -- GitLab