Currently, we vectorize reverse():
|
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():
|
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;
|
|
}
|
Currently, we vectorize
reverse():STL/stl/inc/xutility
Lines 4599 to 4623 in 957fe99
We should extend this significant optimization to
reverse_copy():STL/stl/inc/algorithm
Lines 1975 to 1988 in 957fe99