Skip to content

<algorithm>: Vectorize reverse_copy() #181

@StephanTLavavej

Description

@StephanTLavavej

Currently, we vectorize reverse():

STL/stl/inc/xutility

Lines 4599 to 4623 in 957fe99

template <class _BidIt>
void reverse(const _BidIt _First, const _BidIt _Last) { // reverse elements in [_First, _Last)
_Adl_verify_range(_First, _Last);
auto _UFirst = _Get_unwrapped(_First);
auto _ULast = _Get_unwrapped(_Last);
#if (defined(_M_IX86) || defined(_M_X64)) && !defined(_M_CEE_PURE) && !defined(_M_HYBRID)
using _Elem = remove_pointer_t<decltype(_UFirst)>;
constexpr bool _Allow_vectorization =
conjunction_v<is_pointer<decltype(_UFirst)>, _Is_trivially_swappable<_Elem>, negation<is_volatile<_Elem>>>;
if constexpr (_Allow_vectorization && sizeof(_Elem) == 1) {
__std_reverse_trivially_swappable_1(_UFirst, _ULast);
} else if constexpr (_Allow_vectorization && sizeof(_Elem) == 2) {
__std_reverse_trivially_swappable_2(_UFirst, _ULast);
} else if constexpr (_Allow_vectorization && sizeof(_Elem) == 4) {
__std_reverse_trivially_swappable_4(_UFirst, _ULast);
} else if constexpr (_Allow_vectorization && sizeof(_Elem) == 8) {
__std_reverse_trivially_swappable_8(_UFirst, _ULast);
} else
#endif // (defined(_M_IX86) || defined(_M_X64)) && !defined(_M_CEE_PURE) && !defined(_M_HYBRID)
{
for (; _UFirst != _ULast && _UFirst != --_ULast; ++_UFirst) {
_STD iter_swap(_UFirst, _ULast);
}
}
}

We should extend this significant optimization to reverse_copy():

STL/stl/inc/algorithm

Lines 1975 to 1988 in 957fe99

template <class _BidIt, class _OutIt>
_OutIt reverse_copy(_BidIt _First, _BidIt _Last, _OutIt _Dest) {
// copy reversing elements in [_First, _Last)
_Adl_verify_range(_First, _Last);
const auto _UFirst = _Get_unwrapped(_First);
auto _ULast = _Get_unwrapped(_Last);
auto _UDest = _Get_unwrapped_n(_Dest, _Idl_distance<_BidIt>(_UFirst, _ULast));
for (; _UFirst != _ULast; ++_UDest) {
*_UDest = *--_ULast;
}
_Seek_wrapped(_Dest, _UDest);
return _Dest;
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    fixedSomething works now, yay!performanceMust go faster

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions