Fixed compilation for GCC 4.4 to 4.8 (AES-NI opcodes; intrinsics headers require...
authorThomas Pornin <pornin@bolet.org>
Thu, 9 Mar 2017 20:13:23 +0000 (20:13 +0000)
committerThomas Pornin <pornin@bolet.org>
Thu, 9 Mar 2017 20:13:23 +0000 (20:13 +0000)
src/hash/ghash_pclmul.c
src/inner.h
src/symcipher/aes_x86ni.c
src/symcipher/aes_x86ni_cbcdec.c
src/symcipher/aes_x86ni_cbcenc.c
src/symcipher/aes_x86ni_ctr.c

index 67ab252..7ec9823 100644 (file)
 #if BR_AES_X86NI
 
 #if BR_AES_X86NI_GCC
-/* #pragma GCC target "sse2,ssse3,pclmul" */
+#if BR_AES_X86NI_GCC_OLD
+#pragma GCC push_options
+#pragma GCC target("sse2,ssse3,pclmul")
+#endif
 #include <tmmintrin.h>
 #include <wmmintrin.h>
 #include <cpuid.h>
+#if BR_AES_X86NI_GCC_OLD
+#pragma GCC pop_options
+#endif
 #endif
 
 #if BR_AES_X86NI_MSC
index b03f043..47431c0 100644 (file)
 #define BR_TARGET(x)
 #endif
 
+/*
+ * GCC versions from 4.4 to 4.8 (inclusive) must use a special #pragma
+ * to activate extra opcodes before including the relevant intrinsic
+ * headers. But these don't work with Clang (which does not need them
+ * either).
+ */
+#if BR_AES_X86NI_GCC && !defined BR_AES_X86NI_GCC_OLD
+#if __GNUC__ == 4 && __GNUC_MINOR__ >= 4 && __GNUC_MINOR__ <= 8 && !__clang__
+#define BR_AES_X86NI_GCC_OLD   1
+#endif
+#endif
+
 /*
  * POWER8 crypto support. We rely on compiler macros for the
  * architecture, since we do not have a reliable, simple way to detect
index dcc3952..d2d6369 100644 (file)
 #if BR_AES_X86NI
 
 #if BR_AES_X86NI_GCC
+#if BR_AES_X86NI_GCC_OLD
+#pragma GCC push_options
+#pragma GCC target("sse2,sse4.1,aes,pclmul")
+#endif
 #include <wmmintrin.h>
 #include <cpuid.h>
+#if BR_AES_X86NI_GCC_OLD
+#pragma GCC pop_options
+#endif
 #endif
 
 #if BR_AES_X86NI_MSC
@@ -71,6 +78,14 @@ br_aes_x86ni_supported(void)
 #undef MASK
 }
 
+/*
+ * Per-function attributes appear unreliable on old GCC, so we use the
+ * pragma for all remaining functions in this file.
+ */
+#if BR_AES_X86NI_GCC_OLD
+#pragma GCC target("sse2,sse4.1,aes,pclmul")
+#endif
+
 BR_TARGET("sse2,aes")
 static inline __m128i
 expand_step128(__m128i k, __m128i k2)
index 6f75348..e140b9f 100644 (file)
@@ -27,6 +27,9 @@
 #if BR_AES_X86NI
 
 #if BR_AES_X86NI_GCC
+#if BR_AES_X86NI_GCC_OLD
+#pragma GCC target("sse2,sse4.1,aes,pclmul")
+#endif
 #include <wmmintrin.h>
 #endif
 
index f1c473e..2addfb6 100644 (file)
@@ -27,6 +27,9 @@
 #if BR_AES_X86NI
 
 #if BR_AES_X86NI_GCC
+#if BR_AES_X86NI_GCC_OLD
+#pragma GCC target("sse2,sse4.1,aes,pclmul")
+#endif
 #include <wmmintrin.h>
 #endif
 
index a476843..41c31b2 100644 (file)
@@ -27,6 +27,9 @@
 #if BR_AES_X86NI
 
 #if BR_AES_X86NI_GCC
+#if BR_AES_X86NI_GCC_OLD
+#pragma GCC target("sse2,sse4.1,aes,pclmul")
+#endif
 #include <smmintrin.h>
 #include <wmmintrin.h>
 #define bswap32   __builtin_bswap32