diff --git a/src/intrinsics.h b/src/intrinsics.h index 42dddf77c0cea59b8b12a9c1c9bb734652a486fc..7a4f0870b9d758ed6613e88b6b48a3c93887cd1c 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 */