Fixed compilation for GCC 4.4 to 4.8 (AES-NI opcodes; intrinsics headers require target options to be set).

This commit is contained in:
Thomas Pornin 2017-03-09 20:13:23 +00:00
parent 98432a0a30
commit 2f88a67304
6 changed files with 43 additions and 1 deletions

View file

@ -32,10 +32,16 @@
#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

View file

@ -154,6 +154,18 @@
#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

View file

@ -32,8 +32,15 @@
#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)

View 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

View 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

View 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