https://git.reactos.org/?p=reactos.git;a=commitdiff;h=97e20ef342300158940d61...
commit 97e20ef342300158940d61892cdc70ed63bf93cd Author: Timo Kreuzer timo.kreuzer@reactos.org AuthorDate: Sun Nov 10 14:57:01 2024 +0200 Commit: Timo Kreuzer timo.kreuzer@reactos.org CommitDate: Thu Jan 16 14:18:53 2025 +0200
[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) --- sdk/lib/ucrt/inc/corecrt_internal_simd.h | 20 ++++++++++++++++++++ sdk/lib/ucrt/string/strnlen.cpp | 6 +++++- 2 files changed, 25 insertions(+), 1 deletion(-)
diff --git a/sdk/lib/ucrt/inc/corecrt_internal_simd.h b/sdk/lib/ucrt/inc/corecrt_internal_simd.h index 5770418e034..01a92229438 100644 --- a/sdk/lib/ucrt/inc/corecrt_internal_simd.h +++ b/sdk/lib/ucrt/inc/corecrt_internal_simd.h @@ -18,6 +18,24 @@
#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;
enum class __crt_simd_isa @@ -155,4 +173,6 @@ } };
+_UCRT_RESTORE_DEFAULT_ISA + #endif // _CRT_SIMD_SUPPORT_AVAILABLE diff --git a/sdk/lib/ucrt/string/strnlen.cpp b/sdk/lib/ucrt/string/strnlen.cpp index 6cee4e85e0f..302086cb9f9 100644 --- a/sdk/lib/ucrt/string/strnlen.cpp +++ b/sdk/lib/ucrt/string/strnlen.cpp @@ -78,11 +78,13 @@ static __forceinline size_t __cdecl common_strnlen_c(
#ifdef _CRT_SIMD_SUPPORT_AVAILABLE
+_UCRT_ENABLE_EXTENDED_ISA + template <strnlen_mode Mode, __crt_simd_isa Isa, typename Element> _Check_return_ _When_(maximum_count > _String_length_(string), _Post_satisfies_(return == _String_length_(string))) _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, size_t const maximum_count ) throw() @@ -168,6 +170,8 @@ static __forceinline size_t __cdecl common_strnlen_c( return static_cast<size_t>(it - string); }
+_UCRT_RESTORE_DEFAULT_ISA + #endif // _CRT_SIMD_SUPPORT_AVAILABLE
template <strnlen_mode Mode, typename Element>