15#if (defined _M_IX86 || defined _M_X64) && !defined(_M_HYBRID_X86_ARM64) && !defined(_M_ARM64EC)
16 #define _CRT_SIMD_SUPPORT_AVAILABLE
19#if defined _CRT_SIMD_SUPPORT_AVAILABLE
22#define _UCRT_ENABLE_SSE2 \
23 _Pragma("clang attribute push(__attribute__((target(\"sse2\"))), apply_to=function)")
24#define _UCRT_ENABLE_AVX2 \
25 _Pragma("clang attribute push(__attribute__((target(\"sse2,avx,avx2\"))), apply_to=function)")
26#define _UCRT_RESTORE_DEFAULT_ISA \
27 _Pragma("clang attribute pop")
28#elif defined(__GNUC__)
29#define _UCRT_ENABLE_SSE2 \
30 _Pragma("GCC push_options") \
31 _Pragma("GCC target(\"sse2\")")
32#define _UCRT_ENABLE_AVX2 \
33 _Pragma("GCC push_options") \
34 _Pragma("GCC target(\"avx2\")")
35#define _UCRT_RESTORE_DEFAULT_ISA \
36 _Pragma("GCC pop_options")
38#define _UCRT_ENABLE_SSE2
39#define _UCRT_ENABLE_AVX2
40#define _UCRT_RESTORE_DEFAULT_ISA
46 enum class __crt_simd_isa
52 template <__crt_simd_isa Isa>
53 struct __crt_simd_cleanup_guard;
55 template <__crt_simd_isa Isa>
56 struct __crt_simd_pack_traits;
58 template <__crt_simd_isa Isa,
typename Element>
59 struct __crt_simd_traits;
63 template <__crt_simd_isa Isa,
typename Element>
64 struct __crt_simd_element_traits
65 : __crt_simd_pack_traits<Isa>
67 using element_type = Element;
68 using __crt_simd_pack_traits<
Isa>::pack_size;
81 struct __crt_simd_cleanup_guard<__crt_simd_isa::sse2>
86 ~__crt_simd_cleanup_guard()
throw()
92 struct __crt_simd_pack_traits<__crt_simd_isa::sse2>
94 using pack_type = __m128i;
96 enum :
size_t { pack_size =
sizeof(pack_type) };
98 static __forceinline pack_type get_zero_pack()
throw()
103 static __forceinline
int compute_byte_mask(pack_type
const x)
throw()
110 struct __crt_simd_traits<__crt_simd_isa::sse2,
uint8_t>
111 : __crt_simd_element_traits<__crt_simd_isa::sse2, uint8_t>
113 static __forceinline pack_type compare_equals(pack_type
const x, pack_type
const y)
throw()
120 struct __crt_simd_traits<__crt_simd_isa::sse2,
uint16_t>
121 : __crt_simd_element_traits<__crt_simd_isa::sse2, uint16_t>
123 static __forceinline pack_type compare_equals(pack_type
const x, pack_type
const y)
throw()
129_UCRT_RESTORE_DEFAULT_ISA
134 struct __crt_simd_cleanup_guard<__crt_simd_isa::avx2>
136 ~__crt_simd_cleanup_guard()
147 struct __crt_simd_pack_traits<__crt_simd_isa::avx2>
149 using pack_type = __m256i;
151 enum :
size_t { pack_size =
sizeof(pack_type) };
153 static __forceinline pack_type get_zero_pack()
throw()
158 static __forceinline
int compute_byte_mask(pack_type
const x)
throw()
165 struct __crt_simd_traits<__crt_simd_isa::avx2,
uint8_t>
166 : __crt_simd_element_traits<__crt_simd_isa::avx2, uint8_t>
168 static __forceinline pack_type compare_equals(pack_type
const x, pack_type
const y)
throw()
175 struct __crt_simd_traits<__crt_simd_isa::avx2,
uint16_t>
176 : __crt_simd_element_traits<__crt_simd_isa::avx2, uint16_t>
178 static __forceinline pack_type compare_equals(pack_type
const x, pack_type
const y)
throw()
184_UCRT_RESTORE_DEFAULT_ISA
unsigned short int uint16_t
result_buffer_count char *const _In_ int const _In_ bool const _In_ unsigned const _In_ STRFLT const _In_ bool const _Inout_ __crt_cached_ptd_host &ptd throw()
size_t const element_size
__m128i _mm_setzero_si128(void)
__m128i _mm_cmpeq_epi8(__m128i a, __m128i b)
__m128i _mm_cmpeq_epi16(__m128i a, __m128i b)
int _mm_movemask_epi8(__m128i a)
GLint GLint GLint GLint GLint x
GLint GLint GLint GLint GLint GLint y
__m256i __cdecl _mm256_setzero_si256(void)
int __cdecl _mm256_movemask_epi8(__m256i)
__m256i __cdecl _mm256_cmpeq_epi8(__m256i, __m256i)
void __cdecl _mm256_zeroupper(void)
__m256i __cdecl _mm256_cmpeq_epi16(__m256i, __m256i)