mirror of
https://github.com/reactos/reactos.git
synced 2025-06-20 07:36:05 +00:00
[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:
parent
51e6ce3aa7
commit
97e20ef342
2 changed files with 25 additions and 1 deletions
|
@ -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
|
||||||
|
|
|
@ -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>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue