@@ -55,113 +55,34 @@ __mismatch(_Iter1 __first1, _Sent1 __last1, _Iter2 __first2, _Pred& __pred, _Pro
55
55
}
56
56
57
57
#if _LIBCPP_VECTORIZE_ALGORITHMS
58
-
59
- template <class _ValueType >
60
- _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 __simd_vector<long long , 2 >
61
- __reverse_vector (__simd_vector<long long , 2 >& __cmp_res) {
62
- # if defined(_LIBCPP_BIG_ENDIAN)
63
- __cmp_res = __builtin_shufflevector (__cmp_res, __cmp_res, 1 , 0 );
64
- # endif
65
- return __cmp_res;
66
- }
67
-
68
- template <class _ValueType >
69
- _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 __simd_vector<long , 2 >
70
- __reverse_vector (__simd_vector<long , 2 >& __cmp_res) {
71
- # if defined(_LIBCPP_BIG_ENDIAN)
72
- __cmp_res = __builtin_shufflevector (__cmp_res, __cmp_res, 1 , 0 );
73
- # endif
74
- return __cmp_res;
75
- }
76
-
77
- template <class _ValueType >
78
- _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 __simd_vector<long , 4 >
79
- __reverse_vector (__simd_vector<long , 4 >& __cmp_res) {
80
- # if defined(_LIBCPP_BIG_ENDIAN)
81
- __cmp_res = __builtin_shufflevector (__cmp_res, __cmp_res, 3 , 2 , 1 , 0 );
82
- # endif
83
- return __cmp_res;
84
- }
85
-
86
- template <class _ValueType >
87
- _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 __simd_vector<int , 8 >
88
- __reverse_vector (__simd_vector<int , 8 >& __cmp_res) {
89
- # if defined(_LIBCPP_BIG_ENDIAN)
90
- __cmp_res = __builtin_shufflevector (__cmp_res, __cmp_res, 7 , 6 , 5 , 4 , 3 , 2 , 1 , 0 );
91
- # endif
92
- return __cmp_res;
93
- }
94
-
95
- template <class _ValueType >
96
- _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 __simd_vector<int , 4 >
97
- __reverse_vector (__simd_vector<int , 4 >& __cmp_res) {
98
- # if defined(_LIBCPP_BIG_ENDIAN)
99
- __cmp_res = __builtin_shufflevector (__cmp_res, __cmp_res, 3 , 2 , 1 , 0 );
100
- # endif
101
- return __cmp_res;
58
+ template <class _ValueType , size_t _Np>
59
+ _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI __simd_vector<long long , _Np>
60
+ __reverse_vector (__simd_vector<long long , _Np> __cmp_res) {
61
+ return [&]<size_t ... _Indices>(index_sequence<_Indices...>) {
62
+ return __builtin_shufflevector (__cmp_res, __cmp_res, (_Np - _Indices - 1 )...);
63
+ }(make_index_sequence<_Np>{});
64
+ }
65
+ template <class _ValueType , size_t _Np>
66
+ _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI __simd_vector<long , _Np>
67
+ __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>
74
+ __reverse_vector (__simd_vector<int , _Np> __cmp_res) {
75
+ return [&]<size_t ... _Indices>(index_sequence<_Indices...>) {
76
+ return __builtin_shufflevector (__cmp_res, __cmp_res, (_Np - _Indices - 1 )...);
77
+ }(make_index_sequence<_Np>{});
78
+ }
79
+ template <class _ValueType , size_t _Np>
80
+ _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI __simd_vector<_ValueType, _Np>
81
+ __reverse_vector (__simd_vector<_ValueType, _Np> __cmp_res) {
82
+ return [&]<size_t ... _Indices>(index_sequence<_Indices...>) {
83
+ return __builtin_shufflevector (__cmp_res, __cmp_res, (_Np - _Indices - 1 )...);
84
+ }(make_index_sequence<_Np>{});
102
85
}
103
-
104
- template <class _ValueType >
105
- _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 __simd_vector<_ValueType, 8 >
106
- __reverse_vector (__simd_vector<_ValueType, 8 >& __cmp_res) {
107
- # if defined(_LIBCPP_BIG_ENDIAN)
108
- __cmp_res = __builtin_shufflevector (__cmp_res, __cmp_res, 7 , 6 , 5 , 4 , 3 , 2 , 1 , 0 );
109
- # endif
110
- return __cmp_res;
111
- }
112
-
113
- template <class _ValueType >
114
- _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 __simd_vector<_ValueType, 16 >
115
- __reverse_vector (__simd_vector<_ValueType, 16 > __cmp_res) {
116
- # if defined(_LIBCPP_BIG_ENDIAN)
117
- __cmp_res = __builtin_shufflevector (__cmp_res, __cmp_res, 15 , 14 , 13 , 12 , 11 , 10 , 9 , 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 , 0 );
118
- # endif
119
- return __cmp_res;
120
- }
121
-
122
- template <class _ValueType >
123
- _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 __simd_vector<_ValueType, 32 >
124
- __reverse_vector (__simd_vector<_ValueType, 32 > __cmp_res) {
125
- # if defined(_LIBCPP_BIG_ENDIAN)
126
- __cmp_res = __builtin_shufflevector (
127
- __cmp_res,
128
- __cmp_res,
129
- 31 ,
130
- 30 ,
131
- 29 ,
132
- 28 ,
133
- 27 ,
134
- 26 ,
135
- 25 ,
136
- 24 ,
137
- 23 ,
138
- 22 ,
139
- 21 ,
140
- 20 ,
141
- 19 ,
142
- 18 ,
143
- 17 ,
144
- 16 ,
145
- 15 ,
146
- 14 ,
147
- 13 ,
148
- 12 ,
149
- 11 ,
150
- 10 ,
151
- 9 ,
152
- 8 ,
153
- 7 ,
154
- 6 ,
155
- 5 ,
156
- 4 ,
157
- 3 ,
158
- 2 ,
159
- 1 ,
160
- 0 );
161
- # endif
162
- return __cmp_res;
163
- }
164
-
165
86
template <class _Iter >
166
87
_LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 pair<_Iter, _Iter>
167
88
__mismatch_vectorized (_Iter __first1, _Iter __last1, _Iter __first2) {
@@ -184,7 +105,9 @@ __mismatch_vectorized(_Iter __first1, _Iter __last1, _Iter __first2) {
184
105
185
106
for (size_t __i = 0 ; __i != __unroll_count; ++__i) {
186
107
auto __cmp_res = __lhs[__i] == __rhs[__i];
108
+ # if defined(_LIBCPP_BIG_ENDIAN)
187
109
__cmp_res = std::__reverse_vector<__value_type>(__cmp_res);
110
+ # endif
188
111
if (!std::__all_of (__cmp_res)) {
189
112
auto __offset = __i * __vec_size + std::__find_first_not_set (__cmp_res);
190
113
return {__first1 + __offset, __first2 + __offset};
@@ -198,7 +121,9 @@ __mismatch_vectorized(_Iter __first1, _Iter __last1, _Iter __first2) {
198
121
// check the remaining 0-3 vectors
199
122
while (static_cast <size_t >(__last1 - __first1) >= __vec_size) {
200
123
auto __cmp_res = std::__load_vector<__vec>(__first1) == std::__load_vector<__vec>(__first2);
124
+ # if defined(_LIBCPP_BIG_ENDIAN)
201
125
__cmp_res = std::__reverse_vector<__value_type>(__cmp_res);
126
+ # endif
202
127
if (!std::__all_of (__cmp_res)) {
203
128
auto __offset = std::__find_first_not_set (__cmp_res);
204
129
return {__first1 + __offset, __first2 + __offset};
@@ -216,7 +141,9 @@ __mismatch_vectorized(_Iter __first1, _Iter __last1, _Iter __first2) {
216
141
__first1 = __last1 - __vec_size;
217
142
__first2 = __last2 - __vec_size;
218
143
auto __cmp_res = std::__load_vector<__vec>(__first1) == std::__load_vector<__vec>(__first2);
144
+ # if defined(_LIBCPP_BIG_ENDIAN)
219
145
__cmp_res = std::__reverse_vector<__value_type>(__cmp_res);
146
+ # endif
220
147
auto __offset = std::__find_first_not_set (__cmp_res);
221
148
return {__first1 + __offset, __first2 + __offset};
222
149
} // else loop over the elements individually
0 commit comments