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