22
22
#include < __type_traits/is_constant_evaluated.h>
23
23
#include < __type_traits/is_equality_comparable.h>
24
24
#include < __type_traits/is_integral.h>
25
- #include < __utility/integer_sequence.h>
26
25
#include < __utility/move.h>
27
26
#include < __utility/pair.h>
28
27
#include < __utility/unreachable.h>
@@ -56,32 +55,7 @@ __mismatch(_Iter1 __first1, _Sent1 __last1, _Iter2 __first2, _Pred& __pred, _Pro
56
55
}
57
56
58
57
#if _LIBCPP_VECTORIZE_ALGORITHMS
59
- template <class _ValueType , size_t _Np>
60
- _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI __simd_vector<long long , _Np>
61
- __reverse_vector (__simd_vector<long long , _Np> __cmp_res) {
62
- return [&]<size_t ... _Indices>(index_sequence<_Indices...>) {
63
- return __builtin_shufflevector (__cmp_res, __cmp_res, (_Np - _Indices - 1 )...);
64
- }(make_index_sequence<_Np>{});
65
- }
66
- template <class _ValueType , size_t _Np>
67
- _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI __simd_vector<long , _Np> __reverse_vector (__simd_vector<long , _Np> __cmp_res) {
68
- return [&]<size_t ... _Indices>(index_sequence<_Indices...>) {
69
- return __builtin_shufflevector (__cmp_res, __cmp_res, (_Np - _Indices - 1 )...);
70
- }(make_index_sequence<_Np>{});
71
- }
72
- template <class _ValueType , size_t _Np>
73
- _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI __simd_vector<int , _Np> __reverse_vector (__simd_vector<int , _Np> __cmp_res) {
74
- return [&]<size_t ... _Indices>(index_sequence<_Indices...>) {
75
- return __builtin_shufflevector (__cmp_res, __cmp_res, (_Np - _Indices - 1 )...);
76
- }(make_index_sequence<_Np>{});
77
- }
78
- template <class _ValueType , size_t _Np>
79
- _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI __simd_vector<_ValueType, _Np>
80
- __reverse_vector (__simd_vector<_ValueType, _Np> __cmp_res) {
81
- return [&]<size_t ... _Indices>(index_sequence<_Indices...>) {
82
- return __builtin_shufflevector (__cmp_res, __cmp_res, (_Np - _Indices - 1 )...);
83
- }(make_index_sequence<_Np>{});
84
- }
58
+
85
59
template <class _Iter >
86
60
_LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 pair<_Iter, _Iter>
87
61
__mismatch_vectorized (_Iter __first1, _Iter __last1, _Iter __first2) {
@@ -103,11 +77,7 @@ __mismatch_vectorized(_Iter __first1, _Iter __last1, _Iter __first2) {
103
77
}
104
78
105
79
for (size_t __i = 0 ; __i != __unroll_count; ++__i) {
106
- auto __cmp_res = __lhs[__i] == __rhs[__i];
107
- # if defined(_LIBCPP_BIG_ENDIAN)
108
- __cmp_res = std::__reverse_vector<__value_type>(__cmp_res);
109
- # endif
110
- if (!std::__all_of (__cmp_res)) {
80
+ if (auto __cmp_res = __lhs[__i] == __rhs[__i]; !std::__all_of (__cmp_res)) {
111
81
auto __offset = __i * __vec_size + std::__find_first_not_set (__cmp_res);
112
82
return {__first1 + __offset, __first2 + __offset};
113
83
}
@@ -119,11 +89,8 @@ __mismatch_vectorized(_Iter __first1, _Iter __last1, _Iter __first2) {
119
89
120
90
// check the remaining 0-3 vectors
121
91
while (static_cast <size_t >(__last1 - __first1) >= __vec_size) {
122
- auto __cmp_res = std::__load_vector<__vec>(__first1) == std::__load_vector<__vec>(__first2);
123
- # if defined(_LIBCPP_BIG_ENDIAN)
124
- __cmp_res = std::__reverse_vector<__value_type>(__cmp_res);
125
- # endif
126
- if (!std::__all_of (__cmp_res)) {
92
+ if (auto __cmp_res = std::__load_vector<__vec>(__first1) == std::__load_vector<__vec>(__first2);
93
+ !std::__all_of (__cmp_res)) {
127
94
auto __offset = std::__find_first_not_set (__cmp_res);
128
95
return {__first1 + __offset, __first2 + __offset};
129
96
}
@@ -139,11 +106,8 @@ __mismatch_vectorized(_Iter __first1, _Iter __last1, _Iter __first2) {
139
106
if (static_cast <size_t >(__first1 - __orig_first1) >= __vec_size) {
140
107
__first1 = __last1 - __vec_size;
141
108
__first2 = __last2 - __vec_size;
142
- auto __cmp_res = std::__load_vector<__vec>(__first1) == std::__load_vector<__vec>(__first2);
143
- # if defined(_LIBCPP_BIG_ENDIAN)
144
- __cmp_res = std::__reverse_vector<__value_type>(__cmp_res);
145
- # endif
146
- auto __offset = std::__find_first_not_set (__cmp_res);
109
+ auto __offset =
110
+ std::__find_first_not_set (std::__load_vector<__vec>(__first1) == std::__load_vector<__vec>(__first2));
147
111
return {__first1 + __offset, __first2 + __offset};
148
112
} // else loop over the elements individually
149
113
}
0 commit comments