old versions of GCC (e.g. 5.4) cannot detect support for aes,pclmul
diff --git a/lib/fusion.c b/lib/fusion.c
index d1f074a..c121bee 100644
--- a/lib/fusion.c
+++ b/lib/fusion.c
@@ -40,6 +40,7 @@
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
+#include <immintrin.h>
#include <tmmintrin.h>
#include <nmmintrin.h>
#include <wmmintrin.h>
@@ -849,14 +850,30 @@
sizeof(struct aesgcm_context),
aes128gcm_setup};
+#include <cpuid.h>
+
int ptls_fusion_is_supported_by_cpu(void)
{
-#define REQUIRE(s) \
- if (!__builtin_cpu_supports(s)) \
+ unsigned leaf1_ecx, leaf7_ebx;
+
+ { /* GCC-specific code to obtain CPU features */
+ unsigned unused1, unused2, unused3;
+ if (!__get_cpuid(1, &unused1, &unused2, &leaf1_ecx, &unused3))
+ return 0;
+ if (!__get_cpuid_count(7, 0, &unused1, &leaf7_ebx, &unused2, &unused3))
+ return 0;
+ }
+
+
+ /* AVX2 */
+ if ((leaf7_ebx & (1 << 5)) == 0)
return 0;
- REQUIRE("avx2");
- REQUIRE("aes");
- REQUIRE("pclmul");
-#undef REQUIRE
+ /* AES */
+ if ((leaf1_ecx & (1 << 25)) == 0)
+ return 0;
+ /* PCLMUL */
+ if ((leaf1_ecx & (1 << 1)) == 0)
+ return 0;
+
return 1;
}