X-Git-Url: https://bearssl.org/gitweb//home/git/?p=BearSSL;a=blobdiff_plain;f=src%2Finner.h;h=2829f23650fef59ed7a3c76befd1bbf0d5598bc4;hp=fb7f4a4f2d0b9b24a25365c8adecb00067f16228;hb=24c6f09bf83015e04e16666e8a5fb66e75967e0d;hpb=5414fd525e903fe65e372735f106dcdc19109aad diff --git a/src/inner.h b/src/inner.h index fb7f4a4..2829f23 100644 --- a/src/inner.h +++ b/src/inner.h @@ -144,10 +144,46 @@ #endif #endif +/* + * Determine whether SSE2 intrinsics are understood by the compiler. + * Right now, we restrict ourselves to compiler versions where things + * are documented to work well: + * -- GCC 4.4+ and Clang 3.7+ understand the function attribute "target" + * -- MS Visual Studio 2005 documents the existence of + * SSE2-powered code _might_ work with older versions, but there is no + * pressing need to do so right now. + */ +#ifndef BR_SSE2 +#if (__i386__ || __x86_64__) \ + && ((__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)) \ + || (__clang_major__ > 3 \ + || (__clang_major__ == 3 && __clang_minor__ >= 7))) +#define BR_SSE2 1 +#elif (_M_IX86 || _M_X64) && (_MSC_VER >= 1400) +#define BR_SSE2 1 +#endif +#endif + +/* + * If we use SSE2 intrinsics, determine the compiler brand. + */ +#if BR_SSE2 +#ifndef BR_SSE2_GCC +#if __GNUC__ +#define BR_SSE2_GCC 1 +#endif +#endif +#ifndef BR_SSE2_MSC +#if _MSC_VER >= 1400 +#define BR_SSE2_MSC 1 +#endif +#endif +#endif + /* * A macro to tag a function with a "target" attribute (for GCC and Clang). */ -#if BR_AES_X86NI_GCC +#if BR_AES_X86NI_GCC || BR_SSE2_GCC #define BR_TARGET(x) __attribute__((target(x))) #else #define BR_TARGET(x) @@ -156,8 +192,8 @@ /* * 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). We also need that #pragma for GCC 4.9 in order to work + * AES-NI headers. But these don't work with Clang (which does not need + * them 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). */