-#if defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) \
- || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) \
- || defined(__ARM_ARCH_7EM__)
+/* note: features only available since:
+ * __ARM_ARCH gcc 4.8/clang 3.2
+ * ARMv8 support gcc 4.8/clang 3.4
+ * ARM64 support gcc 4.8/clang 3.5
+ */
+
+#if defined(__aarch64__)
+
+#elif (defined(__ARM_ARCH) && __ARM_ARCH >= 8)
+
+#define HAVE_ARMV8
+#define HAVE_ARMV7
+#define HAVE_ARMV6
+#define HAVE_ARMV5
+
+#elif (defined(__ARM_ARCH) && __ARM_ARCH >= 7) \
+ || defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) \
+ || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) \
+ || defined(__ARM_ARCH_7EM__) || defined(__ARM_ARCH_7S__)