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>

Reply via email to