https://git.reactos.org/?p=reactos.git;a=commitdiff;h=97e20ef342300158940d61892cdc70ed63bf93cd
commit 97e20ef342300158940d61892cdc70ed63bf93cd Author: Timo Kreuzer <timo.kreu...@reactos.org> AuthorDate: Sun Nov 10 14:57:01 2024 +0200 Commit: Timo Kreuzer <timo.kreu...@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>