#if BR_AES_X86NI_GCC_OLD
#pragma GCC push_options
#pragma GCC target("sse2,ssse3,pclmul")
+#pragma GCC diagnostic ignored "-Wpsabi"
#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
return pclmul_supported() ? &br_ghash_pclmul : 0;
}
+#if BR_AES_X86NI_GCC && BR_AES_X86NI_GCC_OLD
+#pragma GCC pop_options
+#endif
+
#else
/* see bearssl_hash.h */
* 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).
+ * either). We also need that #pragma for GCC 4.9 in order to work
+ * around a compiler bug (it tends to blow up on ghash_pclmul code
+ * otherwise).
*/
#if BR_AES_X86NI_GCC && !defined BR_AES_X86NI_GCC_OLD
-#if __GNUC__ == 4 && __GNUC_MINOR__ >= 4 && __GNUC_MINOR__ <= 8 && !__clang__
+#if __GNUC__ == 4 && __GNUC_MINOR__ >= 4 && __GNUC_MINOR__ <= 9 && !__clang__
#define BR_AES_X86NI_GCC_OLD 1
#endif
#endif