From a36d1e3c48b50752239b24c6ecc52090f07b51b4 Mon Sep 17 00:00:00 2001 From: Alex Guteniev Date: Mon, 14 Oct 2024 08:02:21 +0300 Subject: [PATCH 1/5] Fix floating minmax performance --- stl/src/vector_algorithms.cpp | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/stl/src/vector_algorithms.cpp b/stl/src/vector_algorithms.cpp index cd25f40064b..25350e37c3b 100644 --- a/stl/src/vector_algorithms.cpp +++ b/stl/src/vector_algorithms.cpp @@ -2222,11 +2222,23 @@ namespace { } } + // TRNSITION, DevCom-10767462 + template <_Min_max_mode _Mode, class _Traits, bool _Sign> + auto __std_minmax_impl_wrap(const void* const _First, const void* const _Last) { + auto _Rx = __std_minmax_impl<_Mode, _Traits, _Sign>(_First, _Last); + _mm256_zeroupper(); + return _Rx; + } + template <_Min_max_mode _Mode, class _Traits, bool _Sign> auto __std_minmax_disp(const void* const _First, const void* const _Last) noexcept { #ifndef _M_ARM64EC if (_Byte_length(_First, _Last) >= 32 && _Use_avx2()) { - return __std_minmax_impl<_Mode, typename _Traits::_Avx, _Sign>(_First, _Last); + if constexpr (_Traits::_Avx::_Is_floating && _Mode == _Min_max_mode::_Mode_both) { + return __std_minmax_impl_wrap<_Mode, typename _Traits::_Avx, _Sign>(_First, _Last); + } else { + return __std_minmax_impl<_Mode, typename _Traits::_Avx, _Sign>(_First, _Last); + } } if (_Byte_length(_First, _Last) >= 16 && _Use_sse42()) { From 716b2b7b675262653eaa9d1232691866ef0f0490 Mon Sep 17 00:00:00 2001 From: Alex Guteniev Date: Thu, 17 Oct 2024 14:06:17 +0300 Subject: [PATCH 2/5] all the floats --- 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 25350e37c3b..7479d28a1d4 100644 --- a/stl/src/vector_algorithms.cpp +++ b/stl/src/vector_algorithms.cpp @@ -2234,7 +2234,7 @@ namespace { auto __std_minmax_disp(const void* const _First, const void* const _Last) noexcept { #ifndef _M_ARM64EC if (_Byte_length(_First, _Last) >= 32 && _Use_avx2()) { - if constexpr (_Traits::_Avx::_Is_floating && _Mode == _Min_max_mode::_Mode_both) { + if constexpr (_Traits::_Avx::_Is_floating) { return __std_minmax_impl_wrap<_Mode, typename _Traits::_Avx, _Sign>(_First, _Last); } else { return __std_minmax_impl<_Mode, typename _Traits::_Avx, _Sign>(_First, _Last); From c65ac95c27dee347228b15a9d2626b98610c460c Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Thu, 17 Oct 2024 14:16:52 -0700 Subject: [PATCH 3/5] Fix typo. --- 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 7479d28a1d4..2658b392976 100644 --- a/stl/src/vector_algorithms.cpp +++ b/stl/src/vector_algorithms.cpp @@ -2222,7 +2222,7 @@ namespace { } } - // TRNSITION, DevCom-10767462 + // TRANSITION, DevCom-10767462 template <_Min_max_mode _Mode, class _Traits, bool _Sign> auto __std_minmax_impl_wrap(const void* const _First, const void* const _Last) { auto _Rx = __std_minmax_impl<_Mode, _Traits, _Sign>(_First, _Last); From 2d7679e43755a41f04eeab983b896badb2dd521e Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Thu, 17 Oct 2024 14:20:07 -0700 Subject: [PATCH 4/5] Add `noexcept`. --- 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 2658b392976..c41a27c66ed 100644 --- a/stl/src/vector_algorithms.cpp +++ b/stl/src/vector_algorithms.cpp @@ -2224,7 +2224,7 @@ namespace { // TRANSITION, DevCom-10767462 template <_Min_max_mode _Mode, class _Traits, bool _Sign> - auto __std_minmax_impl_wrap(const void* const _First, const void* const _Last) { + auto __std_minmax_impl_wrap(const void* const _First, const void* const _Last) noexcept { auto _Rx = __std_minmax_impl<_Mode, _Traits, _Sign>(_First, _Last); _mm256_zeroupper(); return _Rx; From 135d8ca286ff3a90b9d0a5d2dc19828185fc2ec9 Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Thu, 17 Oct 2024 14:21:22 -0700 Subject: [PATCH 5/5] Add `_M_ARM64EC` guard. --- stl/src/vector_algorithms.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/stl/src/vector_algorithms.cpp b/stl/src/vector_algorithms.cpp index c41a27c66ed..ba2eb8cb00f 100644 --- a/stl/src/vector_algorithms.cpp +++ b/stl/src/vector_algorithms.cpp @@ -2222,6 +2222,7 @@ namespace { } } +#ifndef _M_ARM64EC // TRANSITION, DevCom-10767462 template <_Min_max_mode _Mode, class _Traits, bool _Sign> auto __std_minmax_impl_wrap(const void* const _First, const void* const _Last) noexcept { @@ -2229,6 +2230,7 @@ namespace { _mm256_zeroupper(); return _Rx; } +#endif // ^^^ !defined(_M_ARM64EC) ^^^ template <_Min_max_mode _Mode, class _Traits, bool _Sign> auto __std_minmax_disp(const void* const _First, const void* const _Last) noexcept {