Build: Require that _mm_set_epi64x() is usable to enable CLMUL support.

VS2013 doesn't have _mm_set_epi64x() so this way CLMUL gets
disabled with VS2013.

Thanks to Iouri Kharon for the bug report.
This commit is contained in:
Lasse Collin 2023-01-07 19:31:15 +02:00
parent bad44cfe19
commit 52bc1ee34d
2 changed files with 8 additions and 3 deletions

View File

@ -434,8 +434,9 @@ if(HAVE_IMMINTRIN_H)
#if (defined(__GNUC__) || defined(__clang__)) && !defined(__EDG__) #if (defined(__GNUC__) || defined(__clang__)) && !defined(__EDG__)
__attribute__((__target__(\"ssse3,sse4.1,pclmul\"))) __attribute__((__target__(\"ssse3,sse4.1,pclmul\")))
#endif #endif
__m128i my_clmul(__m128i a, __m128i b) __m128i my_clmul(__m128i a)
{ {
const __m128i b = _mm_set_epi64x(1, 2);
return _mm_clmulepi64_si128(a, b, 0); return _mm_clmulepi64_si128(a, b, 0);
} }
int main(void) { return 0; } int main(void) { return 0; }

View File

@ -938,6 +938,8 @@ AC_CHECK_DECL([_mm_movemask_epi8],
# For faster CRC on 32/64-bit x86 and E2K (see also crc64_fast.c): # For faster CRC on 32/64-bit x86 and E2K (see also crc64_fast.c):
# #
# - Check for the CLMUL intrinsic _mm_clmulepi64_si128 in <immintrin.h>. # - Check for the CLMUL intrinsic _mm_clmulepi64_si128 in <immintrin.h>.
# Check also for _mm_set_epi64x for consistency with CMake build
# where it's needed to disable CLMUL with VS2013.
# #
# - Check that __attribute__((__target__("ssse3,sse4.1,pclmul"))) works # - Check that __attribute__((__target__("ssse3,sse4.1,pclmul"))) works
# together with _mm_clmulepi64_si128 from <immintrin.h>. The attribute # together with _mm_clmulepi64_si128 from <immintrin.h>. The attribute
@ -965,13 +967,15 @@ else
#if (defined(__GNUC__) || defined(__clang__)) && !defined(__EDG__) #if (defined(__GNUC__) || defined(__clang__)) && !defined(__EDG__)
__attribute__((__target__("ssse3,sse4.1,pclmul"))) __attribute__((__target__("ssse3,sse4.1,pclmul")))
#endif #endif
__m128i my_clmul(__m128i a, __m128i b) __m128i my_clmul(__m128i a)
{ {
const __m128i b = _mm_set_epi64x(1, 2);
return _mm_clmulepi64_si128(a, b, 0); return _mm_clmulepi64_si128(a, b, 0);
} }
]])], [ ]])], [
AC_DEFINE([HAVE_USABLE_CLMUL], [1], AC_DEFINE([HAVE_USABLE_CLMUL], [1],
[Define to 1 if _mm_clmulepi64_si128 is usable. [Define to 1 if _mm_set_epi64x and
_mm_clmulepi64_si128 are usable.
See configure.ac for details.]) See configure.ac for details.])
AC_MSG_RESULT([yes]) AC_MSG_RESULT([yes])
], [ ], [