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