Fix floating `minmax` performance (#5016)

Co-authored-by: Stephan T. Lavavej <stl@nuwen.net>
This commit is contained in:
Alex Guteniev 2024-10-21 14:56:07 -07:00 коммит произвёл GitHub
Родитель bfd5b8ce7b
Коммит 3532569b95
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: B5690EEEBB952194
1 изменённых файлов: 15 добавлений и 1 удалений

Просмотреть файл

@ -2222,11 +2222,25 @@ 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 {
auto _Rx = __std_minmax_impl<_Mode, _Traits, _Sign>(_First, _Last);
_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 {
#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) {
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()) {