From 59de6de36326964ec03eff0c2f20cc99ec84ef08 Mon Sep 17 00:00:00 2001 From: Alex Guteniev Date: Mon, 16 Jun 2025 09:28:24 +0300 Subject: [PATCH 1/2] Optimize `find` for ARM64EC --- stl/src/vector_algorithms.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/stl/src/vector_algorithms.cpp b/stl/src/vector_algorithms.cpp index b83b5fe3969..f3f17b2b2d0 100644 --- a/stl/src/vector_algorithms.cpp +++ b/stl/src/vector_algorithms.cpp @@ -3297,12 +3297,20 @@ const void* __stdcall __std_find_trivial_unsized_8(const void* const _First, con const void* __stdcall __std_find_trivial_1( const void* const _First, const void* const _Last, const uint8_t _Val) noexcept { +#ifdef _M_ARM64EC + return memchr(_First, _Val, _Byte_length(_First, _Last)); +#else return _Finding::_Find_impl<_Finding::_Find_traits_1, _Finding::_Predicate::_Equal>(_First, _Last, _Val); +#endif } const void* __stdcall __std_find_trivial_2( const void* const _First, const void* const _Last, const uint16_t _Val) noexcept { +#ifdef _M_ARM64EC + return wmemchr(static_cast(_First), static_cast(_Val), _Byte_length(_First, _Last) * 2); +#else return _Finding::_Find_impl<_Finding::_Find_traits_2, _Finding::_Predicate::_Equal>(_First, _Last, _Val); +#endif } const void* __stdcall __std_find_trivial_4( From def468e3e7e41fbaa1f144cf0100d516aa8bbb12 Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Fri, 27 Jun 2025 07:30:32 -0700 Subject: [PATCH 2/2] Fix wmemchr() count. Also, we don't need to static_cast from uint16_t to wchar_t. That's a value-preserving integral conversion. --- stl/src/vector_algorithms.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stl/src/vector_algorithms.cpp b/stl/src/vector_algorithms.cpp index f3f17b2b2d0..475900b762d 100644 --- a/stl/src/vector_algorithms.cpp +++ b/stl/src/vector_algorithms.cpp @@ -3307,7 +3307,7 @@ const void* __stdcall __std_find_trivial_1( const void* __stdcall __std_find_trivial_2( const void* const _First, const void* const _Last, const uint16_t _Val) noexcept { #ifdef _M_ARM64EC - return wmemchr(static_cast(_First), static_cast(_Val), _Byte_length(_First, _Last) * 2); + return wmemchr(static_cast(_First), _Val, _Byte_length(_First, _Last) / sizeof(wchar_t)); #else return _Finding::_Find_impl<_Finding::_Find_traits_2, _Finding::_Predicate::_Equal>(_First, _Last, _Val); #endif