[UCRT] Fix GCC/Clang build of SSE2/AVX code

On GCC the code using extended ISA cannot be inlined and must either be marked with a function attribute or compiled with the proper target options ('-mavx2' on the command line or '#pragma GCC target("avx2")' inside the code)
This commit is contained in:
Timo Kreuzer 2024-11-10 14:57:01 +02:00
parent 51e6ce3aa7
commit 97e20ef342
2 changed files with 25 additions and 1 deletions

View file

@ -18,6 +18,24 @@
#if defined _CRT_SIMD_SUPPORT_AVAILABLE #if defined _CRT_SIMD_SUPPORT_AVAILABLE
#if defined(__clang__)
#define _UCRT_ENABLE_EXTENDED_ISA \
_Pragma("clang attribute push(__attribute__((target(\"sse2,avx,avx2\"))), apply_to=function)")
#define _UCRT_RESTORE_DEFAULT_ISA \
_Pragma("clang attribute pop")
#elif defined(__GNUC__)
#define _UCRT_ENABLE_EXTENDED_ISA \
_Pragma("GCC push_options") \
_Pragma("GCC target(\"avx2\")")
#define _UCRT_RESTORE_DEFAULT_ISA \
_Pragma("GCC pop_options")
#else
#define _UCRT_ENABLE_EXTENDED_ISA
#define _UCRT_RESTORE_DEFAULT_ISA
#endif
_UCRT_ENABLE_EXTENDED_ISA
extern "C" int __isa_available; extern "C" int __isa_available;
enum class __crt_simd_isa enum class __crt_simd_isa
@ -155,4 +173,6 @@
} }
}; };
_UCRT_RESTORE_DEFAULT_ISA
#endif // _CRT_SIMD_SUPPORT_AVAILABLE #endif // _CRT_SIMD_SUPPORT_AVAILABLE

View file

@ -78,11 +78,13 @@ static __forceinline size_t __cdecl common_strnlen_c(
#ifdef _CRT_SIMD_SUPPORT_AVAILABLE #ifdef _CRT_SIMD_SUPPORT_AVAILABLE
_UCRT_ENABLE_EXTENDED_ISA
template <strnlen_mode Mode, __crt_simd_isa Isa, typename Element> template <strnlen_mode Mode, __crt_simd_isa Isa, typename Element>
_Check_return_ _Check_return_
_When_(maximum_count > _String_length_(string), _Post_satisfies_(return == _String_length_(string))) _When_(maximum_count > _String_length_(string), _Post_satisfies_(return == _String_length_(string)))
_When_(maximum_count <= _String_length_(string), _Post_satisfies_(return == maximum_count)) _When_(maximum_count <= _String_length_(string), _Post_satisfies_(return == maximum_count))
static __forceinline size_t __cdecl common_strnlen_simd( static __inline size_t __cdecl common_strnlen_simd(
Element const* const string, Element const* const string,
size_t const maximum_count size_t const maximum_count
) throw() ) throw()
@ -168,6 +170,8 @@ static __forceinline size_t __cdecl common_strnlen_c(
return static_cast<size_t>(it - string); return static_cast<size_t>(it - string);
} }
_UCRT_RESTORE_DEFAULT_ISA
#endif // _CRT_SIMD_SUPPORT_AVAILABLE #endif // _CRT_SIMD_SUPPORT_AVAILABLE
template <strnlen_mode Mode, typename Element> template <strnlen_mode Mode, typename Element>