Skip to content

Commit 42f64c8

Browse files
committed
Based on the suggestion, apply the variadic template technique to reduce code
1 parent 40cab24 commit 42f64c8

File tree

1 file changed

+33
-106
lines changed

1 file changed

+33
-106
lines changed

libcxx/include/__algorithm/mismatch.h

Lines changed: 33 additions & 106 deletions
Original file line numberDiff line numberDiff line change
@@ -55,113 +55,34 @@ __mismatch(_Iter1 __first1, _Sent1 __last1, _Iter2 __first2, _Pred& __pred, _Pro
5555
}
5656

5757
#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>{});
10285
}
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-
16586
template <class _Iter>
16687
_LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 pair<_Iter, _Iter>
16788
__mismatch_vectorized(_Iter __first1, _Iter __last1, _Iter __first2) {
@@ -184,7 +105,9 @@ __mismatch_vectorized(_Iter __first1, _Iter __last1, _Iter __first2) {
184105

185106
for (size_t __i = 0; __i != __unroll_count; ++__i) {
186107
auto __cmp_res = __lhs[__i] == __rhs[__i];
108+
# if defined(_LIBCPP_BIG_ENDIAN)
187109
__cmp_res = std::__reverse_vector<__value_type>(__cmp_res);
110+
# endif
188111
if (!std::__all_of(__cmp_res)) {
189112
auto __offset = __i * __vec_size + std::__find_first_not_set(__cmp_res);
190113
return {__first1 + __offset, __first2 + __offset};
@@ -198,7 +121,9 @@ __mismatch_vectorized(_Iter __first1, _Iter __last1, _Iter __first2) {
198121
// check the remaining 0-3 vectors
199122
while (static_cast<size_t>(__last1 - __first1) >= __vec_size) {
200123
auto __cmp_res = std::__load_vector<__vec>(__first1) == std::__load_vector<__vec>(__first2);
124+
# if defined(_LIBCPP_BIG_ENDIAN)
201125
__cmp_res = std::__reverse_vector<__value_type>(__cmp_res);
126+
# endif
202127
if (!std::__all_of(__cmp_res)) {
203128
auto __offset = std::__find_first_not_set(__cmp_res);
204129
return {__first1 + __offset, __first2 + __offset};
@@ -216,7 +141,9 @@ __mismatch_vectorized(_Iter __first1, _Iter __last1, _Iter __first2) {
216141
__first1 = __last1 - __vec_size;
217142
__first2 = __last2 - __vec_size;
218143
auto __cmp_res = std::__load_vector<__vec>(__first1) == std::__load_vector<__vec>(__first2);
144+
# if defined(_LIBCPP_BIG_ENDIAN)
219145
__cmp_res = std::__reverse_vector<__value_type>(__cmp_res);
146+
# endif
220147
auto __offset = std::__find_first_not_set(__cmp_res);
221148
return {__first1 + __offset, __first2 + __offset};
222149
} // else loop over the elements individually

0 commit comments

Comments
 (0)