]>
git.ipfire.org Git - thirdparty/gcc.git/blob - libstdc++-v3/testsuite/experimental/simd/tests/operator_cvt.cc
1 // Copyright (C) 2020-2023 Free Software Foundation, Inc.
3 // This file is part of the GNU ISO C++ Library. This library is free
4 // software; you can redistribute it and/or modify it under the
5 // terms of the GNU General Public License as published by the
6 // Free Software Foundation; either version 3, or (at your option)
9 // This library is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 // GNU General Public License for more details.
14 // You should have received a copy of the GNU General Public License along
15 // with this library; see the file COPYING3. If not see
16 // <http://www.gnu.org/licenses/>.
18 // expensive: * [1-9] * *
19 #include "bits/verify.h"
20 #include "bits/metahelpers.h"
22 // type with sizeof(char) but different signedness
23 using xchar
= std::conditional_t
<std::is_unsigned_v
<char>, schar
, uchar
>;
25 using vschar
= std::experimental::native_simd
<schar
>;
26 using vuchar
= std::experimental::native_simd
<uchar
>;
27 using vshort
= std::experimental::native_simd
<short>;
28 using vushort
= std::experimental::native_simd
<ushort
>;
29 using vint
= std::experimental::native_simd
<int>;
30 using vuint
= std::experimental::native_simd
<uint
>;
31 using vlong
= std::experimental::native_simd
<long>;
32 using vulong
= std::experimental::native_simd
<ulong
>;
33 using vllong
= std::experimental::native_simd
<llong
>;
34 using vullong
= std::experimental::native_simd
<ullong
>;
35 using vfloat
= std::experimental::native_simd
<float>;
36 using vdouble
= std::experimental::native_simd
<double>;
37 using vldouble
= std::experimental::native_simd
<long double>;
38 using vchar
= std::experimental::native_simd
<char>;
39 using vxchar
= std::experimental::native_simd
<xchar
>;
42 using vi8
= std::experimental::fixed_size_simd
<T
, vschar::size()>;
44 using vi16
= std::experimental::fixed_size_simd
<T
, vshort::size()>;
46 using vf32
= std::experimental::fixed_size_simd
<T
, vfloat::size()>;
48 using vi32
= std::experimental::fixed_size_simd
<T
, vint::size()>;
50 using vf64
= std::experimental::fixed_size_simd
<T
, vdouble::size()>;
52 using vi64
= std::experimental::fixed_size_simd
<T
, vllong::size()>;
54 using vl
= typename
std::conditional
<sizeof(long) == sizeof(llong
), vi64
<T
>,
57 template <class A
, class B
, class Expected
= A
>
59 binary_op_return_type()
61 using namespace vir::test
;
62 static_assert(std::is_same
<A
, Expected
>::value
, "");
63 using AC
= std::add_const_t
<A
>;
64 using BC
= std::add_const_t
<B
>;
65 COMPARE(typeid(A() + B()), typeid(Expected
));
66 COMPARE(typeid(B() + A()), typeid(Expected
));
67 COMPARE(typeid(AC() + BC()), typeid(Expected
));
68 COMPARE(typeid(BC() + AC()), typeid(Expected
));
75 using T
= typename
V::value_type
;
76 namespace simd_abi
= std::experimental::simd_abi
;
77 binary_op_return_type
<V
, V
, V
>();
78 binary_op_return_type
<V
, T
, V
>();
79 binary_op_return_type
<V
, int, V
>();
81 if constexpr (std::is_same_v
<V
, vfloat
>)
83 binary_op_return_type
<vfloat
, schar
>();
84 binary_op_return_type
<vfloat
, uchar
>();
85 binary_op_return_type
<vfloat
, short>();
86 binary_op_return_type
<vfloat
, ushort
>();
88 binary_op_return_type
<vf32
<float>, schar
>();
89 binary_op_return_type
<vf32
<float>, uchar
>();
90 binary_op_return_type
<vf32
<float>, short>();
91 binary_op_return_type
<vf32
<float>, ushort
>();
92 binary_op_return_type
<vf32
<float>, int>();
93 binary_op_return_type
<vf32
<float>, float>();
95 binary_op_return_type
<vf32
<float>, vf32
<schar
>>();
96 binary_op_return_type
<vf32
<float>, vf32
<uchar
>>();
97 binary_op_return_type
<vf32
<float>, vf32
<short>>();
98 binary_op_return_type
<vf32
<float>, vf32
<ushort
>>();
99 binary_op_return_type
<vf32
<float>, vf32
<float>>();
101 VERIFY((is_substitution_failure
<vfloat
, uint
>));
102 VERIFY((is_substitution_failure
<vfloat
, long>));
103 VERIFY((is_substitution_failure
<vfloat
, ulong
>));
104 VERIFY((is_substitution_failure
<vfloat
, llong
>));
105 VERIFY((is_substitution_failure
<vfloat
, ullong
>));
106 VERIFY((is_substitution_failure
<vfloat
, double>));
107 VERIFY((is_substitution_failure
<vfloat
, vf32
<schar
>>));
108 VERIFY((is_substitution_failure
<vfloat
, vf32
<uchar
>>));
109 VERIFY((is_substitution_failure
<vfloat
, vf32
<short>>));
110 VERIFY((is_substitution_failure
<vfloat
, vf32
<ushort
>>));
111 VERIFY((is_substitution_failure
<vfloat
, vf32
<int>>));
112 VERIFY((is_substitution_failure
<vfloat
, vf32
<uint
>>));
113 VERIFY((is_substitution_failure
<vfloat
, vf32
<long>>));
114 VERIFY((is_substitution_failure
<vfloat
, vf32
<ulong
>>));
115 VERIFY((is_substitution_failure
<vfloat
, vf32
<llong
>>));
116 VERIFY((is_substitution_failure
<vfloat
, vf32
<ullong
>>));
117 VERIFY((is_substitution_failure
<vfloat
, vf32
<float>>));
119 VERIFY((is_substitution_failure
<vf32
<float>, vfloat
>));
120 VERIFY((is_substitution_failure
<vf32
<float>, uint
>));
121 VERIFY((is_substitution_failure
<vf32
<float>, long>));
122 VERIFY((is_substitution_failure
<vf32
<float>, ulong
>));
123 VERIFY((is_substitution_failure
<vf32
<float>, llong
>));
124 VERIFY((is_substitution_failure
<vf32
<float>, ullong
>));
125 VERIFY((is_substitution_failure
<vf32
<float>, double>));
126 VERIFY((is_substitution_failure
<vf32
<float>, vf32
<int>>));
127 VERIFY((is_substitution_failure
<vf32
<float>, vf32
<uint
>>));
128 VERIFY((is_substitution_failure
<vf32
<float>, vf32
<long>>));
129 VERIFY((is_substitution_failure
<vf32
<float>, vf32
<ulong
>>));
130 VERIFY((is_substitution_failure
<vf32
<float>, vf32
<llong
>>));
131 VERIFY((is_substitution_failure
<vf32
<float>, vf32
<ullong
>>));
133 VERIFY((is_substitution_failure
<vfloat
, vf32
<double>>));
135 else if constexpr (std::is_same_v
<V
, vdouble
>)
137 binary_op_return_type
<vdouble
, float, vdouble
>();
138 binary_op_return_type
<vdouble
, schar
>();
139 binary_op_return_type
<vdouble
, uchar
>();
140 binary_op_return_type
<vdouble
, short>();
141 binary_op_return_type
<vdouble
, ushort
>();
142 binary_op_return_type
<vdouble
, uint
>();
144 binary_op_return_type
<vf64
<double>, schar
>();
145 binary_op_return_type
<vf64
<double>, uchar
>();
146 binary_op_return_type
<vf64
<double>, short>();
147 binary_op_return_type
<vf64
<double>, ushort
>();
148 binary_op_return_type
<vf64
<double>, uint
>();
149 binary_op_return_type
<vf64
<double>, int, vf64
<double>>();
150 binary_op_return_type
<vf64
<double>, float, vf64
<double>>();
151 binary_op_return_type
<vf64
<double>, double, vf64
<double>>();
152 binary_op_return_type
<vf64
<double>, vf64
<double>, vf64
<double>>();
153 binary_op_return_type
<vf32
<double>, schar
>();
154 binary_op_return_type
<vf32
<double>, uchar
>();
155 binary_op_return_type
<vf32
<double>, short>();
156 binary_op_return_type
<vf32
<double>, ushort
>();
157 binary_op_return_type
<vf32
<double>, uint
>();
158 binary_op_return_type
<vf32
<double>, int, vf32
<double>>();
159 binary_op_return_type
<vf32
<double>, float, vf32
<double>>();
160 binary_op_return_type
<vf32
<double>, double, vf32
<double>>();
161 binary_op_return_type
<vf64
<double>, vf64
<schar
>>();
162 binary_op_return_type
<vf64
<double>, vf64
<uchar
>>();
163 binary_op_return_type
<vf64
<double>, vf64
<short>>();
164 binary_op_return_type
<vf64
<double>, vf64
<ushort
>>();
165 binary_op_return_type
<vf64
<double>, vf64
<int>>();
166 binary_op_return_type
<vf64
<double>, vf64
<uint
>>();
167 binary_op_return_type
<vf64
<double>, vf64
<float>>();
169 VERIFY((is_substitution_failure
<vdouble
, llong
>));
170 VERIFY((is_substitution_failure
<vdouble
, ullong
>));
171 VERIFY((is_substitution_failure
<vdouble
, vf64
<schar
>>));
172 VERIFY((is_substitution_failure
<vdouble
, vf64
<uchar
>>));
173 VERIFY((is_substitution_failure
<vdouble
, vf64
<short>>));
174 VERIFY((is_substitution_failure
<vdouble
, vf64
<ushort
>>));
175 VERIFY((is_substitution_failure
<vdouble
, vf64
<int>>));
176 VERIFY((is_substitution_failure
<vdouble
, vf64
<uint
>>));
177 VERIFY((is_substitution_failure
<vdouble
, vf64
<long>>));
178 VERIFY((is_substitution_failure
<vdouble
, vf64
<ulong
>>));
179 VERIFY((is_substitution_failure
<vdouble
, vf64
<llong
>>));
180 VERIFY((is_substitution_failure
<vdouble
, vf64
<ullong
>>));
181 VERIFY((is_substitution_failure
<vdouble
, vf64
<float>>));
182 VERIFY((is_substitution_failure
<vdouble
, vf64
<double>>));
184 VERIFY((is_substitution_failure
<vf64
<double>, vdouble
>));
185 VERIFY((is_substitution_failure
<vf64
<double>, llong
>));
186 VERIFY((is_substitution_failure
<vf64
<double>, ullong
>));
187 VERIFY((is_substitution_failure
<vf64
<double>, vf64
<llong
>>));
188 VERIFY((is_substitution_failure
<vf64
<double>, vf64
<ullong
>>));
190 VERIFY((is_substitution_failure
<vf32
<double>, llong
>));
191 VERIFY((is_substitution_failure
<vf32
<double>, ullong
>));
193 if constexpr (sizeof(long) == sizeof(llong
))
195 VERIFY((is_substitution_failure
<vdouble
, long>));
196 VERIFY((is_substitution_failure
<vdouble
, ulong
>));
197 VERIFY((is_substitution_failure
<vf64
<double>, long>));
198 VERIFY((is_substitution_failure
<vf64
<double>, ulong
>));
199 VERIFY((is_substitution_failure
<vf64
<double>, vf64
<long>>));
200 VERIFY((is_substitution_failure
<vf64
<double>, vf64
<ulong
>>));
201 VERIFY((is_substitution_failure
<vf32
<double>, long>));
202 VERIFY((is_substitution_failure
<vf32
<double>, ulong
>));
206 binary_op_return_type
<vdouble
, long>();
207 binary_op_return_type
<vdouble
, ulong
>();
208 binary_op_return_type
<vf64
<double>, long>();
209 binary_op_return_type
<vf64
<double>, ulong
>();
210 binary_op_return_type
<vf64
<double>, vf64
<long>>();
211 binary_op_return_type
<vf64
<double>, vf64
<ulong
>>();
212 binary_op_return_type
<vf32
<double>, long>();
213 binary_op_return_type
<vf32
<double>, ulong
>();
216 else if constexpr (std::is_same_v
<V
, vldouble
>)
218 binary_op_return_type
<vldouble
, schar
>();
219 binary_op_return_type
<vldouble
, uchar
>();
220 binary_op_return_type
<vldouble
, short>();
221 binary_op_return_type
<vldouble
, ushort
>();
222 binary_op_return_type
<vldouble
, uint
>();
223 binary_op_return_type
<vldouble
, long>();
224 binary_op_return_type
<vldouble
, ulong
>();
225 binary_op_return_type
<vldouble
, float>();
226 binary_op_return_type
<vldouble
, double>();
228 binary_op_return_type
<vf64
<long double>, schar
>();
229 binary_op_return_type
<vf64
<long double>, uchar
>();
230 binary_op_return_type
<vf64
<long double>, short>();
231 binary_op_return_type
<vf64
<long double>, ushort
>();
232 binary_op_return_type
<vf64
<long double>, int>();
233 binary_op_return_type
<vf64
<long double>, uint
>();
234 binary_op_return_type
<vf64
<long double>, long>();
235 binary_op_return_type
<vf64
<long double>, ulong
>();
236 binary_op_return_type
<vf64
<long double>, float>();
237 binary_op_return_type
<vf64
<long double>, double>();
238 binary_op_return_type
<vf64
<long double>, vf64
<long double>>();
240 using std::experimental::simd
;
241 using A
= simd_abi::fixed_size
<vldouble::size()>;
242 binary_op_return_type
<simd
<long double, A
>, schar
>();
243 binary_op_return_type
<simd
<long double, A
>, uchar
>();
244 binary_op_return_type
<simd
<long double, A
>, short>();
245 binary_op_return_type
<simd
<long double, A
>, ushort
>();
246 binary_op_return_type
<simd
<long double, A
>, int>();
247 binary_op_return_type
<simd
<long double, A
>, uint
>();
248 binary_op_return_type
<simd
<long double, A
>, long>();
249 binary_op_return_type
<simd
<long double, A
>, ulong
>();
250 binary_op_return_type
<simd
<long double, A
>, float>();
251 binary_op_return_type
<simd
<long double, A
>, double>();
253 if constexpr (sizeof(ldouble
) == sizeof(double))
255 VERIFY((is_substitution_failure
<vldouble
, llong
>));
256 VERIFY((is_substitution_failure
<vldouble
, ullong
>));
257 VERIFY((is_substitution_failure
<vf64
<ldouble
>, llong
>));
258 VERIFY((is_substitution_failure
<vf64
<ldouble
>, ullong
>));
259 VERIFY((is_substitution_failure
<simd
<ldouble
, A
>, llong
>));
260 VERIFY((is_substitution_failure
<simd
<ldouble
, A
>, ullong
>));
264 binary_op_return_type
<vldouble
, llong
>();
265 binary_op_return_type
<vldouble
, ullong
>();
266 binary_op_return_type
<vf64
<long double>, llong
>();
267 binary_op_return_type
<vf64
<long double>, ullong
>();
268 binary_op_return_type
<simd
<long double, A
>, llong
>();
269 binary_op_return_type
<simd
<long double, A
>, ullong
>();
272 VERIFY((is_substitution_failure
<vf64
<long double>, vldouble
>));
273 COMPARE((is_substitution_failure
<simd
<long double, A
>, vldouble
>),
274 (!std::is_same
<A
, vldouble::abi_type
>::value
));
276 else if constexpr (std::is_same_v
<V
, vlong
>)
278 VERIFY((is_substitution_failure
<vi32
<long>, double>));
279 VERIFY((is_substitution_failure
<vi32
<long>, float>));
280 VERIFY((is_substitution_failure
<vi32
<long>, vi32
<float>>));
281 if constexpr (sizeof(long) == sizeof(llong
))
283 binary_op_return_type
<vlong
, uint
>();
284 binary_op_return_type
<vlong
, llong
>();
285 binary_op_return_type
<vi32
<long>, uint
>();
286 binary_op_return_type
<vi32
<long>, llong
>();
287 binary_op_return_type
<vi64
<long>, uint
>();
288 binary_op_return_type
<vi64
<long>, llong
>();
289 binary_op_return_type
<vi32
<long>, vi32
<uint
>>();
290 binary_op_return_type
<vi64
<long>, vi64
<uint
>>();
291 VERIFY((is_substitution_failure
<vi32
<long>, vi32
<double>>));
292 VERIFY((is_substitution_failure
<vi64
<long>, vi64
<double>>));
296 VERIFY((is_substitution_failure
<vlong
, uint
>));
297 VERIFY((is_substitution_failure
<vlong
, llong
>));
298 VERIFY((is_substitution_failure
<vi32
<long>, uint
>));
299 VERIFY((is_substitution_failure
<vi32
<long>, llong
>));
300 VERIFY((is_substitution_failure
<vi64
<long>, uint
>));
301 VERIFY((is_substitution_failure
<vi64
<long>, llong
>));
302 VERIFY((is_substitution_failure
<vi32
<long>, vi32
<uint
>>));
303 VERIFY((is_substitution_failure
<vi64
<long>, vi64
<uint
>>));
304 binary_op_return_type
<vi32
<double>, vi32
<long>>();
305 binary_op_return_type
<vi64
<double>, vi64
<long>>();
308 binary_op_return_type
<vlong
, schar
, vlong
>();
309 binary_op_return_type
<vlong
, uchar
, vlong
>();
310 binary_op_return_type
<vlong
, short, vlong
>();
311 binary_op_return_type
<vlong
, ushort
, vlong
>();
313 binary_op_return_type
<vi32
<long>, schar
, vi32
<long>>();
314 binary_op_return_type
<vi32
<long>, uchar
, vi32
<long>>();
315 binary_op_return_type
<vi32
<long>, short, vi32
<long>>();
316 binary_op_return_type
<vi32
<long>, ushort
, vi32
<long>>();
317 binary_op_return_type
<vi32
<long>, int, vi32
<long>>();
318 binary_op_return_type
<vi32
<long>, long, vi32
<long>>();
319 binary_op_return_type
<vi32
<long>, vi32
<long>, vi32
<long>>();
320 binary_op_return_type
<vi64
<long>, schar
, vi64
<long>>();
321 binary_op_return_type
<vi64
<long>, uchar
, vi64
<long>>();
322 binary_op_return_type
<vi64
<long>, short, vi64
<long>>();
323 binary_op_return_type
<vi64
<long>, ushort
, vi64
<long>>();
324 binary_op_return_type
<vi64
<long>, int, vi64
<long>>();
325 binary_op_return_type
<vi64
<long>, long, vi64
<long>>();
326 binary_op_return_type
<vi64
<long>, vi64
<long>, vi64
<long>>();
328 VERIFY((is_substitution_failure
<vlong
, vulong
>));
329 VERIFY((is_substitution_failure
<vlong
, ulong
>));
330 VERIFY((is_substitution_failure
<vlong
, ullong
>));
331 VERIFY((is_substitution_failure
<vlong
, float>));
332 VERIFY((is_substitution_failure
<vlong
, double>));
333 VERIFY((is_substitution_failure
<vlong
, vl
<schar
>>));
334 VERIFY((is_substitution_failure
<vlong
, vl
<uchar
>>));
335 VERIFY((is_substitution_failure
<vlong
, vl
<short>>));
336 VERIFY((is_substitution_failure
<vlong
, vl
<ushort
>>));
337 VERIFY((is_substitution_failure
<vlong
, vl
<int>>));
338 VERIFY((is_substitution_failure
<vlong
, vl
<uint
>>));
339 VERIFY((is_substitution_failure
<vlong
, vl
<long>>));
340 VERIFY((is_substitution_failure
<vlong
, vl
<ulong
>>));
341 VERIFY((is_substitution_failure
<vlong
, vl
<llong
>>));
342 VERIFY((is_substitution_failure
<vlong
, vl
<ullong
>>));
343 VERIFY((is_substitution_failure
<vlong
, vl
<float>>));
344 VERIFY((is_substitution_failure
<vlong
, vl
<double>>));
345 VERIFY((is_substitution_failure
<vl
<long>, vlong
>));
346 VERIFY((is_substitution_failure
<vl
<long>, vulong
>));
347 VERIFY((is_substitution_failure
<vi32
<long>, ulong
>));
348 VERIFY((is_substitution_failure
<vi32
<long>, ullong
>));
349 binary_op_return_type
<vi32
<long>, vi32
<schar
>>();
350 binary_op_return_type
<vi32
<long>, vi32
<uchar
>>();
351 binary_op_return_type
<vi32
<long>, vi32
<short>>();
352 binary_op_return_type
<vi32
<long>, vi32
<ushort
>>();
353 binary_op_return_type
<vi32
<long>, vi32
<int>>();
354 VERIFY((is_substitution_failure
<vi32
<long>, vi32
<ulong
>>));
355 VERIFY((is_substitution_failure
<vi32
<long>, vi32
<ullong
>>));
356 VERIFY((is_substitution_failure
<vi64
<long>, ulong
>));
357 VERIFY((is_substitution_failure
<vi64
<long>, ullong
>));
358 VERIFY((is_substitution_failure
<vi64
<long>, float>));
359 VERIFY((is_substitution_failure
<vi64
<long>, double>));
360 binary_op_return_type
<vi64
<long>, vi64
<schar
>>();
361 binary_op_return_type
<vi64
<long>, vi64
<uchar
>>();
362 binary_op_return_type
<vi64
<long>, vi64
<short>>();
363 binary_op_return_type
<vi64
<long>, vi64
<ushort
>>();
364 binary_op_return_type
<vi64
<long>, vi64
<int>>();
365 VERIFY((is_substitution_failure
<vi64
<long>, vi64
<ulong
>>));
366 VERIFY((is_substitution_failure
<vi64
<long>, vi64
<ullong
>>));
367 VERIFY((is_substitution_failure
<vi64
<long>, vi64
<float>>));
369 binary_op_return_type
<vi32
<llong
>, vi32
<long>>();
370 binary_op_return_type
<vi64
<llong
>, vi64
<long>>();
372 else if constexpr (std::is_same_v
<V
, vulong
>)
374 if constexpr (sizeof(long) == sizeof(llong
))
376 binary_op_return_type
<vulong
, ullong
, vulong
>();
377 binary_op_return_type
<vi32
<ulong
>, ullong
, vi32
<ulong
>>();
378 binary_op_return_type
<vi64
<ulong
>, ullong
, vi64
<ulong
>>();
379 VERIFY((is_substitution_failure
<vi32
<ulong
>, vi32
<llong
>>));
380 VERIFY((is_substitution_failure
<vi32
<ulong
>, vi32
<double>>));
381 VERIFY((is_substitution_failure
<vi64
<ulong
>, vi64
<llong
>>));
382 VERIFY((is_substitution_failure
<vi64
<ulong
>, vi64
<double>>));
386 VERIFY((is_substitution_failure
<vulong
, ullong
>));
387 VERIFY((is_substitution_failure
<vi32
<ulong
>, ullong
>));
388 VERIFY((is_substitution_failure
<vi64
<ulong
>, ullong
>));
389 binary_op_return_type
<vi32
<llong
>, vi32
<ulong
>>();
390 binary_op_return_type
<vi32
<double>, vi32
<ulong
>>();
391 binary_op_return_type
<vi64
<llong
>, vi64
<ulong
>>();
392 binary_op_return_type
<vi64
<double>, vi64
<ulong
>>();
395 binary_op_return_type
<vulong
, uchar
, vulong
>();
396 binary_op_return_type
<vulong
, ushort
, vulong
>();
397 binary_op_return_type
<vulong
, uint
, vulong
>();
398 binary_op_return_type
<vi32
<ulong
>, uchar
, vi32
<ulong
>>();
399 binary_op_return_type
<vi32
<ulong
>, ushort
, vi32
<ulong
>>();
400 binary_op_return_type
<vi32
<ulong
>, int, vi32
<ulong
>>();
401 binary_op_return_type
<vi32
<ulong
>, uint
, vi32
<ulong
>>();
402 binary_op_return_type
<vi32
<ulong
>, ulong
, vi32
<ulong
>>();
403 binary_op_return_type
<vi32
<ulong
>, vi32
<ulong
>, vi32
<ulong
>>();
404 binary_op_return_type
<vi64
<ulong
>, uchar
, vi64
<ulong
>>();
405 binary_op_return_type
<vi64
<ulong
>, ushort
, vi64
<ulong
>>();
406 binary_op_return_type
<vi64
<ulong
>, int, vi64
<ulong
>>();
407 binary_op_return_type
<vi64
<ulong
>, uint
, vi64
<ulong
>>();
408 binary_op_return_type
<vi64
<ulong
>, ulong
, vi64
<ulong
>>();
409 binary_op_return_type
<vi64
<ulong
>, vi64
<ulong
>, vi64
<ulong
>>();
411 VERIFY((is_substitution_failure
<vi32
<ulong
>, llong
>));
412 VERIFY((is_substitution_failure
<vi32
<ulong
>, float>));
413 VERIFY((is_substitution_failure
<vi32
<ulong
>, double>));
414 VERIFY((is_substitution_failure
<vi32
<ulong
>, vi32
<float>>));
415 VERIFY((is_substitution_failure
<vi64
<ulong
>, vi64
<float>>));
416 VERIFY((is_substitution_failure
<vulong
, schar
>));
417 VERIFY((is_substitution_failure
<vulong
, short>));
418 VERIFY((is_substitution_failure
<vulong
, vlong
>));
419 VERIFY((is_substitution_failure
<vulong
, long>));
420 VERIFY((is_substitution_failure
<vulong
, llong
>));
421 VERIFY((is_substitution_failure
<vulong
, float>));
422 VERIFY((is_substitution_failure
<vulong
, double>));
423 VERIFY((is_substitution_failure
<vulong
, vl
<schar
>>));
424 VERIFY((is_substitution_failure
<vulong
, vl
<uchar
>>));
425 VERIFY((is_substitution_failure
<vulong
, vl
<short>>));
426 VERIFY((is_substitution_failure
<vulong
, vl
<ushort
>>));
427 VERIFY((is_substitution_failure
<vulong
, vl
<int>>));
428 VERIFY((is_substitution_failure
<vulong
, vl
<uint
>>));
429 VERIFY((is_substitution_failure
<vulong
, vl
<long>>));
430 VERIFY((is_substitution_failure
<vulong
, vl
<ulong
>>));
431 VERIFY((is_substitution_failure
<vulong
, vl
<llong
>>));
432 VERIFY((is_substitution_failure
<vulong
, vl
<ullong
>>));
433 VERIFY((is_substitution_failure
<vulong
, vl
<float>>));
434 VERIFY((is_substitution_failure
<vulong
, vl
<double>>));
435 VERIFY((is_substitution_failure
<vl
<ulong
>, vlong
>));
436 VERIFY((is_substitution_failure
<vl
<ulong
>, vulong
>));
437 VERIFY((is_substitution_failure
<vi32
<ulong
>, schar
>));
438 VERIFY((is_substitution_failure
<vi32
<ulong
>, short>));
439 VERIFY((is_substitution_failure
<vi32
<ulong
>, long>));
440 VERIFY((is_substitution_failure
<vi32
<ulong
>, vi32
<schar
>>));
441 binary_op_return_type
<vi32
<ulong
>, vi32
<uchar
>>();
442 VERIFY((is_substitution_failure
<vi32
<ulong
>, vi32
<short>>));
443 binary_op_return_type
<vi32
<ulong
>, vi32
<ushort
>>();
444 VERIFY((is_substitution_failure
<vi32
<ulong
>, vi32
<int>>));
445 binary_op_return_type
<vi32
<ulong
>, vi32
<uint
>>();
446 VERIFY((is_substitution_failure
<vi32
<ulong
>, vi32
<long>>));
447 binary_op_return_type
<vi32
<ullong
>, vi32
<ulong
>>();
448 VERIFY((is_substitution_failure
<vi64
<ulong
>, schar
>));
449 VERIFY((is_substitution_failure
<vi64
<ulong
>, short>));
450 VERIFY((is_substitution_failure
<vi64
<ulong
>, long>));
451 VERIFY((is_substitution_failure
<vi64
<ulong
>, llong
>));
452 VERIFY((is_substitution_failure
<vi64
<ulong
>, float>));
453 VERIFY((is_substitution_failure
<vi64
<ulong
>, double>));
454 VERIFY((is_substitution_failure
<vi64
<ulong
>, vi64
<schar
>>));
455 binary_op_return_type
<vi64
<ulong
>, vi64
<uchar
>>();
456 VERIFY((is_substitution_failure
<vi64
<ulong
>, vi64
<short>>));
457 binary_op_return_type
<vi64
<ulong
>, vi64
<ushort
>>();
458 VERIFY((is_substitution_failure
<vi64
<ulong
>, vi64
<int>>));
459 binary_op_return_type
<vi64
<ulong
>, vi64
<uint
>>();
460 VERIFY((is_substitution_failure
<vi64
<ulong
>, vi64
<long>>));
461 binary_op_return_type
<vi64
<ullong
>, vi64
<ulong
>>();
463 else if constexpr (std::is_same_v
<V
, vllong
>)
465 binary_op_return_type
<vllong
, schar
, vllong
>();
466 binary_op_return_type
<vllong
, uchar
, vllong
>();
467 binary_op_return_type
<vllong
, short, vllong
>();
468 binary_op_return_type
<vllong
, ushort
, vllong
>();
469 binary_op_return_type
<vllong
, uint
, vllong
>();
470 binary_op_return_type
<vllong
, long, vllong
>();
471 binary_op_return_type
<vi32
<llong
>, schar
, vi32
<llong
>>();
472 binary_op_return_type
<vi32
<llong
>, uchar
, vi32
<llong
>>();
473 binary_op_return_type
<vi32
<llong
>, short, vi32
<llong
>>();
474 binary_op_return_type
<vi32
<llong
>, ushort
, vi32
<llong
>>();
475 binary_op_return_type
<vi32
<llong
>, int, vi32
<llong
>>();
476 binary_op_return_type
<vi32
<llong
>, uint
, vi32
<llong
>>();
477 binary_op_return_type
<vi32
<llong
>, long, vi32
<llong
>>();
478 binary_op_return_type
<vi32
<llong
>, llong
, vi32
<llong
>>();
479 binary_op_return_type
<vi32
<llong
>, vi32
<llong
>, vi32
<llong
>>();
480 binary_op_return_type
<vi64
<llong
>, schar
, vi64
<llong
>>();
481 binary_op_return_type
<vi64
<llong
>, uchar
, vi64
<llong
>>();
482 binary_op_return_type
<vi64
<llong
>, short, vi64
<llong
>>();
483 binary_op_return_type
<vi64
<llong
>, ushort
, vi64
<llong
>>();
484 binary_op_return_type
<vi64
<llong
>, int, vi64
<llong
>>();
485 binary_op_return_type
<vi64
<llong
>, uint
, vi64
<llong
>>();
486 binary_op_return_type
<vi64
<llong
>, long, vi64
<llong
>>();
487 binary_op_return_type
<vi64
<llong
>, llong
, vi64
<llong
>>();
488 binary_op_return_type
<vi64
<llong
>, vi64
<llong
>>();
489 binary_op_return_type
<vi32
<llong
>, vi32
<schar
>>();
490 binary_op_return_type
<vi32
<llong
>, vi32
<uchar
>>();
491 binary_op_return_type
<vi32
<llong
>, vi32
<short>>();
492 binary_op_return_type
<vi32
<llong
>, vi32
<ushort
>>();
493 binary_op_return_type
<vi32
<llong
>, vi32
<int>>();
494 binary_op_return_type
<vi32
<llong
>, vi32
<uint
>>();
495 binary_op_return_type
<vi32
<llong
>, vi32
<long>>();
496 if constexpr (sizeof(long) == sizeof(llong
))
498 VERIFY((is_substitution_failure
<vi32
<llong
>, vi32
<ulong
>>));
499 VERIFY((is_substitution_failure
<vi32
<llong
>, ulong
>));
500 VERIFY((is_substitution_failure
<vi64
<llong
>, ulong
>));
501 VERIFY((is_substitution_failure
<vllong
, ulong
>));
505 binary_op_return_type
<vi32
<llong
>, vi32
<ulong
>>();
506 binary_op_return_type
<vi32
<llong
>, ulong
>();
507 binary_op_return_type
<vi64
<llong
>, ulong
>();
508 binary_op_return_type
<vllong
, ulong
>();
511 VERIFY((is_substitution_failure
<vllong
, vullong
>));
512 VERIFY((is_substitution_failure
<vllong
, ullong
>));
513 VERIFY((is_substitution_failure
<vllong
, float>));
514 VERIFY((is_substitution_failure
<vllong
, double>));
515 VERIFY((is_substitution_failure
<vllong
, vi64
<schar
>>));
516 VERIFY((is_substitution_failure
<vllong
, vi64
<uchar
>>));
517 VERIFY((is_substitution_failure
<vllong
, vi64
<short>>));
518 VERIFY((is_substitution_failure
<vllong
, vi64
<ushort
>>));
519 VERIFY((is_substitution_failure
<vllong
, vi64
<int>>));
520 VERIFY((is_substitution_failure
<vllong
, vi64
<uint
>>));
521 VERIFY((is_substitution_failure
<vllong
, vi64
<long>>));
522 VERIFY((is_substitution_failure
<vllong
, vi64
<ulong
>>));
523 VERIFY((is_substitution_failure
<vllong
, vi64
<llong
>>));
524 VERIFY((is_substitution_failure
<vllong
, vi64
<ullong
>>));
525 VERIFY((is_substitution_failure
<vllong
, vi64
<float>>));
526 VERIFY((is_substitution_failure
<vllong
, vi64
<double>>));
527 VERIFY((is_substitution_failure
<vi32
<llong
>, ullong
>));
528 VERIFY((is_substitution_failure
<vi32
<llong
>, float>));
529 VERIFY((is_substitution_failure
<vi32
<llong
>, double>));
530 VERIFY((is_substitution_failure
<vi32
<llong
>, vi32
<ullong
>>));
531 VERIFY((is_substitution_failure
<vi32
<llong
>, vi32
<float>>));
532 VERIFY((is_substitution_failure
<vi32
<llong
>, vi32
<double>>));
533 VERIFY((is_substitution_failure
<vi64
<llong
>, vllong
>));
534 VERIFY((is_substitution_failure
<vi64
<llong
>, vullong
>));
535 VERIFY((is_substitution_failure
<vi64
<llong
>, ullong
>));
536 VERIFY((is_substitution_failure
<vi64
<llong
>, float>));
537 VERIFY((is_substitution_failure
<vi64
<llong
>, double>));
538 binary_op_return_type
<vi64
<llong
>, vi64
<schar
>>();
539 binary_op_return_type
<vi64
<llong
>, vi64
<uchar
>>();
540 binary_op_return_type
<vi64
<llong
>, vi64
<short>>();
541 binary_op_return_type
<vi64
<llong
>, vi64
<ushort
>>();
542 binary_op_return_type
<vi64
<llong
>, vi64
<int>>();
543 binary_op_return_type
<vi64
<llong
>, vi64
<uint
>>();
544 binary_op_return_type
<vi64
<llong
>, vi64
<long>>();
545 if constexpr (sizeof(long) == sizeof(llong
))
547 VERIFY((is_substitution_failure
<vi64
<llong
>, vi64
<ulong
>>));
551 binary_op_return_type
<vi64
<llong
>, vi64
<ulong
>>();
553 VERIFY((is_substitution_failure
<vi64
<llong
>, vi64
<ullong
>>));
554 VERIFY((is_substitution_failure
<vi64
<llong
>, vi64
<float>>));
555 VERIFY((is_substitution_failure
<vi64
<llong
>, vi64
<double>>));
557 else if constexpr (std::is_same_v
<V
, vullong
>)
559 binary_op_return_type
<vullong
, uchar
, vullong
>();
560 binary_op_return_type
<vullong
, ushort
, vullong
>();
561 binary_op_return_type
<vullong
, uint
, vullong
>();
562 binary_op_return_type
<vullong
, ulong
, vullong
>();
563 binary_op_return_type
<vi32
<ullong
>, uchar
, vi32
<ullong
>>();
564 binary_op_return_type
<vi32
<ullong
>, ushort
, vi32
<ullong
>>();
565 binary_op_return_type
<vi32
<ullong
>, int, vi32
<ullong
>>();
566 binary_op_return_type
<vi32
<ullong
>, uint
, vi32
<ullong
>>();
567 binary_op_return_type
<vi32
<ullong
>, ulong
, vi32
<ullong
>>();
568 binary_op_return_type
<vi32
<ullong
>, ullong
, vi32
<ullong
>>();
569 binary_op_return_type
<vi32
<ullong
>, vi32
<ullong
>, vi32
<ullong
>>();
570 binary_op_return_type
<vi64
<ullong
>, uchar
, vi64
<ullong
>>();
571 binary_op_return_type
<vi64
<ullong
>, ushort
, vi64
<ullong
>>();
572 binary_op_return_type
<vi64
<ullong
>, int, vi64
<ullong
>>();
573 binary_op_return_type
<vi64
<ullong
>, uint
, vi64
<ullong
>>();
574 binary_op_return_type
<vi64
<ullong
>, ulong
, vi64
<ullong
>>();
575 binary_op_return_type
<vi64
<ullong
>, ullong
, vi64
<ullong
>>();
576 binary_op_return_type
<vi64
<ullong
>, vi64
<ullong
>, vi64
<ullong
>>();
578 VERIFY((is_substitution_failure
<vullong
, schar
>));
579 VERIFY((is_substitution_failure
<vullong
, short>));
580 VERIFY((is_substitution_failure
<vullong
, long>));
581 VERIFY((is_substitution_failure
<vullong
, llong
>));
582 VERIFY((is_substitution_failure
<vullong
, vllong
>));
583 VERIFY((is_substitution_failure
<vullong
, float>));
584 VERIFY((is_substitution_failure
<vullong
, double>));
585 VERIFY((is_substitution_failure
<vullong
, vi64
<schar
>>));
586 VERIFY((is_substitution_failure
<vullong
, vi64
<uchar
>>));
587 VERIFY((is_substitution_failure
<vullong
, vi64
<short>>));
588 VERIFY((is_substitution_failure
<vullong
, vi64
<ushort
>>));
589 VERIFY((is_substitution_failure
<vullong
, vi64
<int>>));
590 VERIFY((is_substitution_failure
<vullong
, vi64
<uint
>>));
591 VERIFY((is_substitution_failure
<vullong
, vi64
<long>>));
592 VERIFY((is_substitution_failure
<vullong
, vi64
<ulong
>>));
593 VERIFY((is_substitution_failure
<vullong
, vi64
<llong
>>));
594 VERIFY((is_substitution_failure
<vullong
, vi64
<ullong
>>));
595 VERIFY((is_substitution_failure
<vullong
, vi64
<float>>));
596 VERIFY((is_substitution_failure
<vullong
, vi64
<double>>));
597 VERIFY((is_substitution_failure
<vi32
<ullong
>, schar
>));
598 VERIFY((is_substitution_failure
<vi32
<ullong
>, short>));
599 VERIFY((is_substitution_failure
<vi32
<ullong
>, long>));
600 VERIFY((is_substitution_failure
<vi32
<ullong
>, llong
>));
601 VERIFY((is_substitution_failure
<vi32
<ullong
>, float>));
602 VERIFY((is_substitution_failure
<vi32
<ullong
>, double>));
603 VERIFY((is_substitution_failure
<vi32
<ullong
>, vi32
<schar
>>));
604 binary_op_return_type
<vi32
<ullong
>, vi32
<uchar
>>();
605 VERIFY((is_substitution_failure
<vi32
<ullong
>, vi32
<short>>));
606 binary_op_return_type
<vi32
<ullong
>, vi32
<ushort
>>();
607 VERIFY((is_substitution_failure
<vi32
<ullong
>, vi32
<int>>));
608 binary_op_return_type
<vi32
<ullong
>, vi32
<uint
>>();
609 VERIFY((is_substitution_failure
<vi32
<ullong
>, vi32
<long>>));
610 binary_op_return_type
<vi32
<ullong
>, vi32
<ulong
>>();
611 VERIFY((is_substitution_failure
<vi32
<ullong
>, vi32
<llong
>>));
612 VERIFY((is_substitution_failure
<vi32
<ullong
>, vi32
<float>>));
613 VERIFY((is_substitution_failure
<vi32
<ullong
>, vi32
<double>>));
614 VERIFY((is_substitution_failure
<vi64
<ullong
>, schar
>));
615 VERIFY((is_substitution_failure
<vi64
<ullong
>, short>));
616 VERIFY((is_substitution_failure
<vi64
<ullong
>, long>));
617 VERIFY((is_substitution_failure
<vi64
<ullong
>, llong
>));
618 VERIFY((is_substitution_failure
<vi64
<ullong
>, vllong
>));
619 VERIFY((is_substitution_failure
<vi64
<ullong
>, vullong
>));
620 VERIFY((is_substitution_failure
<vi64
<ullong
>, float>));
621 VERIFY((is_substitution_failure
<vi64
<ullong
>, double>));
622 VERIFY((is_substitution_failure
<vi64
<ullong
>, vi64
<schar
>>));
623 binary_op_return_type
<vi64
<ullong
>, vi64
<uchar
>>();
624 VERIFY((is_substitution_failure
<vi64
<ullong
>, vi64
<short>>));
625 binary_op_return_type
<vi64
<ullong
>, vi64
<ushort
>>();
626 VERIFY((is_substitution_failure
<vi64
<ullong
>, vi64
<int>>));
627 binary_op_return_type
<vi64
<ullong
>, vi64
<uint
>>();
628 VERIFY((is_substitution_failure
<vi64
<ullong
>, vi64
<long>>));
629 binary_op_return_type
<vi64
<ullong
>, vi64
<ulong
>>();
630 VERIFY((is_substitution_failure
<vi64
<ullong
>, vi64
<llong
>>));
631 VERIFY((is_substitution_failure
<vi64
<ullong
>, vi64
<float>>));
632 VERIFY((is_substitution_failure
<vi64
<ullong
>, vi64
<double>>));
634 else if constexpr (std::is_same_v
<V
, vint
>)
636 binary_op_return_type
<vint
, schar
, vint
>();
637 binary_op_return_type
<vint
, uchar
, vint
>();
638 binary_op_return_type
<vint
, short, vint
>();
639 binary_op_return_type
<vint
, ushort
, vint
>();
640 binary_op_return_type
<vi32
<int>, schar
, vi32
<int>>();
641 binary_op_return_type
<vi32
<int>, uchar
, vi32
<int>>();
642 binary_op_return_type
<vi32
<int>, short, vi32
<int>>();
643 binary_op_return_type
<vi32
<int>, ushort
, vi32
<int>>();
644 binary_op_return_type
<vi32
<int>, int, vi32
<int>>();
645 binary_op_return_type
<vi32
<int>, vi32
<int>, vi32
<int>>();
646 binary_op_return_type
<vi32
<int>, vi32
<schar
>>();
647 binary_op_return_type
<vi32
<int>, vi32
<uchar
>>();
648 binary_op_return_type
<vi32
<int>, vi32
<short>>();
649 binary_op_return_type
<vi32
<int>, vi32
<ushort
>>();
651 binary_op_return_type
<vi32
<llong
>, vi32
<int>>();
652 binary_op_return_type
<vi32
<double>, vi32
<int>>();
654 // order is important for MSVC. This compiler is just crazy: It considers
655 // operators from unrelated simd template instantiations as candidates -
656 // but only after they have been tested. So e.g. vi32<int> + llong will
657 // produce a vi32<llong> if a vi32<llong> operator test is done before the
658 // vi32<int> + llong test.
659 VERIFY((is_substitution_failure
<vi32
<int>, double>));
660 VERIFY((is_substitution_failure
<vi32
<int>, float>));
661 VERIFY((is_substitution_failure
<vi32
<int>, llong
>));
662 VERIFY((is_substitution_failure
<vi32
<int>, vi32
<float>>));
663 VERIFY((is_substitution_failure
<vint
, vuint
>));
664 VERIFY((is_substitution_failure
<vint
, uint
>));
665 VERIFY((is_substitution_failure
<vint
, ulong
>));
666 VERIFY((is_substitution_failure
<vint
, llong
>));
667 VERIFY((is_substitution_failure
<vint
, ullong
>));
668 VERIFY((is_substitution_failure
<vint
, float>));
669 VERIFY((is_substitution_failure
<vint
, double>));
670 VERIFY((is_substitution_failure
<vint
, vi32
<schar
>>));
671 VERIFY((is_substitution_failure
<vint
, vi32
<uchar
>>));
672 VERIFY((is_substitution_failure
<vint
, vi32
<short>>));
673 VERIFY((is_substitution_failure
<vint
, vi32
<ushort
>>));
674 VERIFY((is_substitution_failure
<vint
, vi32
<int>>));
675 VERIFY((is_substitution_failure
<vint
, vi32
<uint
>>));
676 VERIFY((is_substitution_failure
<vint
, vi32
<long>>));
677 VERIFY((is_substitution_failure
<vint
, vi32
<ulong
>>));
678 VERIFY((is_substitution_failure
<vint
, vi32
<llong
>>));
679 VERIFY((is_substitution_failure
<vint
, vi32
<ullong
>>));
680 VERIFY((is_substitution_failure
<vint
, vi32
<float>>));
681 VERIFY((is_substitution_failure
<vint
, vi32
<double>>));
682 VERIFY((is_substitution_failure
<vi32
<int>, vint
>));
683 VERIFY((is_substitution_failure
<vi32
<int>, vuint
>));
684 VERIFY((is_substitution_failure
<vi32
<int>, uint
>));
685 VERIFY((is_substitution_failure
<vi32
<int>, ulong
>));
686 VERIFY((is_substitution_failure
<vi32
<int>, ullong
>));
687 VERIFY((is_substitution_failure
<vi32
<int>, vi32
<uint
>>));
688 VERIFY((is_substitution_failure
<vi32
<int>, vi32
<ulong
>>));
689 VERIFY((is_substitution_failure
<vi32
<int>, vi32
<ullong
>>));
691 binary_op_return_type
<vi32
<long>, vi32
<int>>();
692 if constexpr (sizeof(long) == sizeof(llong
))
694 VERIFY((is_substitution_failure
<vint
, long>));
695 VERIFY((is_substitution_failure
<vi32
<int>, long>));
699 binary_op_return_type
<vint
, long>();
700 binary_op_return_type
<vi32
<int>, long>();
703 else if constexpr (std::is_same_v
<V
, vuint
>)
705 VERIFY((is_substitution_failure
<vi32
<uint
>, llong
>));
706 VERIFY((is_substitution_failure
<vi32
<uint
>, ullong
>));
707 VERIFY((is_substitution_failure
<vi32
<uint
>, float>));
708 VERIFY((is_substitution_failure
<vi32
<uint
>, double>));
709 VERIFY((is_substitution_failure
<vi32
<uint
>, vi32
<float>>));
711 binary_op_return_type
<vuint
, uchar
, vuint
>();
712 binary_op_return_type
<vuint
, ushort
, vuint
>();
713 binary_op_return_type
<vi32
<uint
>, uchar
, vi32
<uint
>>();
714 binary_op_return_type
<vi32
<uint
>, ushort
, vi32
<uint
>>();
715 binary_op_return_type
<vi32
<uint
>, int, vi32
<uint
>>();
716 binary_op_return_type
<vi32
<uint
>, uint
, vi32
<uint
>>();
717 binary_op_return_type
<vi32
<uint
>, vi32
<uint
>, vi32
<uint
>>();
718 binary_op_return_type
<vi32
<uint
>, vi32
<uchar
>>();
719 binary_op_return_type
<vi32
<uint
>, vi32
<ushort
>>();
721 binary_op_return_type
<vi32
<llong
>, vi32
<uint
>>();
722 binary_op_return_type
<vi32
<ullong
>, vi32
<uint
>>();
723 binary_op_return_type
<vi32
<double>, vi32
<uint
>>();
725 VERIFY((is_substitution_failure
<vuint
, schar
>));
726 VERIFY((is_substitution_failure
<vuint
, short>));
727 VERIFY((is_substitution_failure
<vuint
, vint
>));
728 VERIFY((is_substitution_failure
<vuint
, long>));
729 VERIFY((is_substitution_failure
<vuint
, llong
>));
730 VERIFY((is_substitution_failure
<vuint
, ullong
>));
731 VERIFY((is_substitution_failure
<vuint
, float>));
732 VERIFY((is_substitution_failure
<vuint
, double>));
733 VERIFY((is_substitution_failure
<vuint
, vi32
<schar
>>));
734 VERIFY((is_substitution_failure
<vuint
, vi32
<uchar
>>));
735 VERIFY((is_substitution_failure
<vuint
, vi32
<short>>));
736 VERIFY((is_substitution_failure
<vuint
, vi32
<ushort
>>));
737 VERIFY((is_substitution_failure
<vuint
, vi32
<int>>));
738 VERIFY((is_substitution_failure
<vuint
, vi32
<uint
>>));
739 VERIFY((is_substitution_failure
<vuint
, vi32
<long>>));
740 VERIFY((is_substitution_failure
<vuint
, vi32
<ulong
>>));
741 VERIFY((is_substitution_failure
<vuint
, vi32
<llong
>>));
742 VERIFY((is_substitution_failure
<vuint
, vi32
<ullong
>>));
743 VERIFY((is_substitution_failure
<vuint
, vi32
<float>>));
744 VERIFY((is_substitution_failure
<vuint
, vi32
<double>>));
745 VERIFY((is_substitution_failure
<vi32
<uint
>, schar
>));
746 VERIFY((is_substitution_failure
<vi32
<uint
>, short>));
747 VERIFY((is_substitution_failure
<vi32
<uint
>, vint
>));
748 VERIFY((is_substitution_failure
<vi32
<uint
>, vuint
>));
749 VERIFY((is_substitution_failure
<vi32
<uint
>, long>));
750 VERIFY((is_substitution_failure
<vi32
<uint
>, vi32
<schar
>>));
751 VERIFY((is_substitution_failure
<vi32
<uint
>, vi32
<short>>));
752 VERIFY((is_substitution_failure
<vi32
<uint
>, vi32
<int>>));
754 binary_op_return_type
<vi32
<ulong
>, vi32
<uint
>>();
755 if constexpr (sizeof(long) == sizeof(llong
))
757 VERIFY((is_substitution_failure
<vuint
, ulong
>));
758 VERIFY((is_substitution_failure
<vi32
<uint
>, ulong
>));
759 binary_op_return_type
<vi32
<long>, vi32
<uint
>>();
763 binary_op_return_type
<vuint
, ulong
>();
764 binary_op_return_type
<vi32
<uint
>, ulong
>();
765 VERIFY((is_substitution_failure
<vi32
<uint
>, vi32
<long>>));
768 else if constexpr (std::is_same_v
<V
, vshort
>)
770 binary_op_return_type
<vshort
, schar
, vshort
>();
771 binary_op_return_type
<vshort
, uchar
, vshort
>();
772 binary_op_return_type
<vi16
<short>, schar
, vi16
<short>>();
773 binary_op_return_type
<vi16
<short>, uchar
, vi16
<short>>();
774 binary_op_return_type
<vi16
<short>, short, vi16
<short>>();
775 binary_op_return_type
<vi16
<short>, int, vi16
<short>>();
776 binary_op_return_type
<vi16
<short>, vi16
<schar
>>();
777 binary_op_return_type
<vi16
<short>, vi16
<uchar
>>();
778 binary_op_return_type
<vi16
<short>, vi16
<short>>();
780 binary_op_return_type
<vi16
<int>, vi16
<short>>();
781 binary_op_return_type
<vi16
<long>, vi16
<short>>();
782 binary_op_return_type
<vi16
<llong
>, vi16
<short>>();
783 binary_op_return_type
<vi16
<float>, vi16
<short>>();
784 binary_op_return_type
<vi16
<double>, vi16
<short>>();
786 VERIFY((is_substitution_failure
<vi16
<short>, double>));
787 VERIFY((is_substitution_failure
<vi16
<short>, llong
>));
788 VERIFY((is_substitution_failure
<vshort
, vushort
>));
789 VERIFY((is_substitution_failure
<vshort
, ushort
>));
790 VERIFY((is_substitution_failure
<vshort
, uint
>));
791 VERIFY((is_substitution_failure
<vshort
, long>));
792 VERIFY((is_substitution_failure
<vshort
, ulong
>));
793 VERIFY((is_substitution_failure
<vshort
, llong
>));
794 VERIFY((is_substitution_failure
<vshort
, ullong
>));
795 VERIFY((is_substitution_failure
<vshort
, float>));
796 VERIFY((is_substitution_failure
<vshort
, double>));
797 VERIFY((is_substitution_failure
<vshort
, vi16
<schar
>>));
798 VERIFY((is_substitution_failure
<vshort
, vi16
<uchar
>>));
799 VERIFY((is_substitution_failure
<vshort
, vi16
<short>>));
800 VERIFY((is_substitution_failure
<vshort
, vi16
<ushort
>>));
801 VERIFY((is_substitution_failure
<vshort
, vi16
<int>>));
802 VERIFY((is_substitution_failure
<vshort
, vi16
<uint
>>));
803 VERIFY((is_substitution_failure
<vshort
, vi16
<long>>));
804 VERIFY((is_substitution_failure
<vshort
, vi16
<ulong
>>));
805 VERIFY((is_substitution_failure
<vshort
, vi16
<llong
>>));
806 VERIFY((is_substitution_failure
<vshort
, vi16
<ullong
>>));
807 VERIFY((is_substitution_failure
<vshort
, vi16
<float>>));
808 VERIFY((is_substitution_failure
<vshort
, vi16
<double>>));
809 VERIFY((is_substitution_failure
<vi16
<short>, vshort
>));
810 VERIFY((is_substitution_failure
<vi16
<short>, vushort
>));
811 VERIFY((is_substitution_failure
<vi16
<short>, ushort
>));
812 VERIFY((is_substitution_failure
<vi16
<short>, uint
>));
813 VERIFY((is_substitution_failure
<vi16
<short>, long>));
814 VERIFY((is_substitution_failure
<vi16
<short>, ulong
>));
815 VERIFY((is_substitution_failure
<vi16
<short>, ullong
>));
816 VERIFY((is_substitution_failure
<vi16
<short>, float>));
817 VERIFY((is_substitution_failure
<vi16
<short>, vi16
<ushort
>>));
818 VERIFY((is_substitution_failure
<vi16
<short>, vi16
<uint
>>));
819 VERIFY((is_substitution_failure
<vi16
<short>, vi16
<ulong
>>));
820 VERIFY((is_substitution_failure
<vi16
<short>, vi16
<ullong
>>));
822 else if constexpr (std::is_same_v
<V
, vushort
>)
824 binary_op_return_type
<vushort
, uchar
, vushort
>();
825 binary_op_return_type
<vushort
, uint
, vushort
>();
826 binary_op_return_type
<vi16
<ushort
>, uchar
, vi16
<ushort
>>();
827 binary_op_return_type
<vi16
<ushort
>, ushort
, vi16
<ushort
>>();
828 binary_op_return_type
<vi16
<ushort
>, int, vi16
<ushort
>>();
829 binary_op_return_type
<vi16
<ushort
>, uint
, vi16
<ushort
>>();
830 binary_op_return_type
<vi16
<ushort
>, vi16
<uchar
>>();
831 binary_op_return_type
<vi16
<ushort
>, vi16
<ushort
>>();
833 binary_op_return_type
<vi16
<int>, vi16
<ushort
>>();
834 binary_op_return_type
<vi16
<long>, vi16
<ushort
>>();
835 binary_op_return_type
<vi16
<llong
>, vi16
<ushort
>>();
836 binary_op_return_type
<vi16
<uint
>, vi16
<ushort
>>();
837 binary_op_return_type
<vi16
<ulong
>, vi16
<ushort
>>();
838 binary_op_return_type
<vi16
<ullong
>, vi16
<ushort
>>();
839 binary_op_return_type
<vi16
<float>, vi16
<ushort
>>();
840 binary_op_return_type
<vi16
<double>, vi16
<ushort
>>();
842 VERIFY((is_substitution_failure
<vi16
<ushort
>, llong
>));
843 VERIFY((is_substitution_failure
<vi16
<ushort
>, ullong
>));
844 VERIFY((is_substitution_failure
<vi16
<ushort
>, double>));
845 VERIFY((is_substitution_failure
<vushort
, schar
>));
846 VERIFY((is_substitution_failure
<vushort
, short>));
847 VERIFY((is_substitution_failure
<vushort
, vshort
>));
848 VERIFY((is_substitution_failure
<vushort
, long>));
849 VERIFY((is_substitution_failure
<vushort
, ulong
>));
850 VERIFY((is_substitution_failure
<vushort
, llong
>));
851 VERIFY((is_substitution_failure
<vushort
, ullong
>));
852 VERIFY((is_substitution_failure
<vushort
, float>));
853 VERIFY((is_substitution_failure
<vushort
, double>));
854 VERIFY((is_substitution_failure
<vushort
, vi16
<schar
>>));
855 VERIFY((is_substitution_failure
<vushort
, vi16
<uchar
>>));
856 VERIFY((is_substitution_failure
<vushort
, vi16
<short>>));
857 VERIFY((is_substitution_failure
<vushort
, vi16
<ushort
>>));
858 VERIFY((is_substitution_failure
<vushort
, vi16
<int>>));
859 VERIFY((is_substitution_failure
<vushort
, vi16
<uint
>>));
860 VERIFY((is_substitution_failure
<vushort
, vi16
<long>>));
861 VERIFY((is_substitution_failure
<vushort
, vi16
<ulong
>>));
862 VERIFY((is_substitution_failure
<vushort
, vi16
<llong
>>));
863 VERIFY((is_substitution_failure
<vushort
, vi16
<ullong
>>));
864 VERIFY((is_substitution_failure
<vushort
, vi16
<float>>));
865 VERIFY((is_substitution_failure
<vushort
, vi16
<double>>));
866 VERIFY((is_substitution_failure
<vi16
<ushort
>, schar
>));
867 VERIFY((is_substitution_failure
<vi16
<ushort
>, short>));
868 VERIFY((is_substitution_failure
<vi16
<ushort
>, vshort
>));
869 VERIFY((is_substitution_failure
<vi16
<ushort
>, vushort
>));
870 VERIFY((is_substitution_failure
<vi16
<ushort
>, long>));
871 VERIFY((is_substitution_failure
<vi16
<ushort
>, ulong
>));
872 VERIFY((is_substitution_failure
<vi16
<ushort
>, float>));
873 VERIFY((is_substitution_failure
<vi16
<ushort
>, vi16
<schar
>>));
874 VERIFY((is_substitution_failure
<vi16
<ushort
>, vi16
<short>>));
876 else if constexpr (std::is_same_v
<V
, vchar
>)
878 binary_op_return_type
<vi8
<char>, char, vi8
<char>>();
879 binary_op_return_type
<vi8
<char>, int, vi8
<char>>();
880 binary_op_return_type
<vi8
<char>, vi8
<char>, vi8
<char>>();
882 if constexpr (vi8
<schar
>::size() <= simd_abi::max_fixed_size
<short>)
884 VERIFY(!(is_substitution_failure
<vi8
<char>, vi8
<short>>));
885 VERIFY(!(is_substitution_failure
<vi8
<char>, vi8
<int>>));
886 VERIFY(!(is_substitution_failure
<vi8
<char>, vi8
<long>>));
887 VERIFY(!(is_substitution_failure
<vi8
<char>, vi8
<llong
>>));
888 COMPARE((is_substitution_failure
<vi8
<char>, vi8
<ushort
>>),
889 std::is_signed_v
<char>);
890 COMPARE((is_substitution_failure
<vi8
<char>, vi8
<uint
>>),
891 std::is_signed_v
<char>);
892 COMPARE((is_substitution_failure
<vi8
<char>, vi8
<ulong
>>),
893 std::is_signed_v
<char>);
894 COMPARE((is_substitution_failure
<vi8
<char>, vi8
<ullong
>>),
895 std::is_signed_v
<char>);
896 if constexpr (std::is_signed_v
<char>)
898 binary_op_return_type
<vi8
<short>, vi8
<char>>();
899 binary_op_return_type
<vi8
<int>, vi8
<char>>();
900 binary_op_return_type
<vi8
<long>, vi8
<char>>();
901 binary_op_return_type
<vi8
<llong
>, vi8
<char>>();
905 binary_op_return_type
<vi8
<ushort
>, vi8
<char>>();
906 binary_op_return_type
<vi8
<uint
>, vi8
<char>>();
907 binary_op_return_type
<vi8
<ulong
>, vi8
<char>>();
908 binary_op_return_type
<vi8
<ullong
>, vi8
<char>>();
910 binary_op_return_type
<vi8
<float>, vi8
<char>>();
911 binary_op_return_type
<vi8
<double>, vi8
<char>>();
914 VERIFY((is_substitution_failure
<vi8
<char>, llong
>));
915 VERIFY((is_substitution_failure
<vi8
<char>, double>));
916 VERIFY((is_substitution_failure
<vchar
, vxchar
>));
917 VERIFY((is_substitution_failure
<vchar
, xchar
>));
918 VERIFY((is_substitution_failure
<vchar
, short>));
919 VERIFY((is_substitution_failure
<vchar
, ushort
>));
920 COMPARE((is_substitution_failure
<vchar
, uint
>), std::is_signed_v
<char>);
921 VERIFY((is_substitution_failure
<vchar
, long>));
922 VERIFY((is_substitution_failure
<vchar
, ulong
>));
923 VERIFY((is_substitution_failure
<vchar
, llong
>));
924 VERIFY((is_substitution_failure
<vchar
, ullong
>));
925 VERIFY((is_substitution_failure
<vchar
, float>));
926 VERIFY((is_substitution_failure
<vchar
, double>));
927 VERIFY((is_substitution_failure
<vchar
, vi8
<char>>));
928 VERIFY((is_substitution_failure
<vchar
, vi8
<uchar
>>));
929 VERIFY((is_substitution_failure
<vchar
, vi8
<schar
>>));
930 VERIFY((is_substitution_failure
<vchar
, vi8
<short>>));
931 VERIFY((is_substitution_failure
<vchar
, vi8
<ushort
>>));
932 VERIFY((is_substitution_failure
<vchar
, vi8
<int>>));
933 VERIFY((is_substitution_failure
<vchar
, vi8
<uint
>>));
934 VERIFY((is_substitution_failure
<vchar
, vi8
<long>>));
935 VERIFY((is_substitution_failure
<vchar
, vi8
<ulong
>>));
936 VERIFY((is_substitution_failure
<vchar
, vi8
<llong
>>));
937 VERIFY((is_substitution_failure
<vchar
, vi8
<ullong
>>));
938 VERIFY((is_substitution_failure
<vchar
, vi8
<float>>));
939 VERIFY((is_substitution_failure
<vchar
, vi8
<double>>));
940 VERIFY((is_substitution_failure
<vi8
<char>, vchar
>));
941 VERIFY((is_substitution_failure
<vi8
<char>, vuchar
>));
942 VERIFY((is_substitution_failure
<vi8
<char>, vschar
>));
943 VERIFY((is_substitution_failure
<vi8
<char>, xchar
>));
944 VERIFY((is_substitution_failure
<vi8
<char>, short>));
945 VERIFY((is_substitution_failure
<vi8
<char>, ushort
>));
946 COMPARE((is_substitution_failure
<vi8
<char>, uint
>),
947 std::is_signed_v
<char>);
948 VERIFY((is_substitution_failure
<vi8
<char>, long>));
949 VERIFY((is_substitution_failure
<vi8
<char>, ulong
>));
950 VERIFY((is_substitution_failure
<vi8
<char>, ullong
>));
951 VERIFY((is_substitution_failure
<vi8
<char>, float>));
953 // conversion between any char types must fail because the dst type's
954 // integer conversion rank isn't greater (as required by 9.6.4p4.3)
955 VERIFY((is_substitution_failure
<vi8
<char>, vi8
<schar
>>));
956 VERIFY((is_substitution_failure
<vi8
<char>, vi8
<uchar
>>));
958 else if constexpr (std::is_same_v
<V
, vschar
>)
960 binary_op_return_type
<vi8
<schar
>, schar
, vi8
<schar
>>();
961 binary_op_return_type
<vi8
<schar
>, int, vi8
<schar
>>();
962 binary_op_return_type
<vi8
<schar
>, vi8
<schar
>, vi8
<schar
>>();
964 if constexpr (vi8
<schar
>::size() <= simd_abi::max_fixed_size
<short>)
966 binary_op_return_type
<vi8
<short>, vi8
<schar
>>();
967 binary_op_return_type
<vi8
<int>, vi8
<schar
>>();
968 binary_op_return_type
<vi8
<long>, vi8
<schar
>>();
969 binary_op_return_type
<vi8
<llong
>, vi8
<schar
>>();
970 binary_op_return_type
<vi8
<float>, vi8
<schar
>>();
971 binary_op_return_type
<vi8
<double>, vi8
<schar
>>();
974 VERIFY((is_substitution_failure
<vi8
<schar
>, llong
>));
975 VERIFY((is_substitution_failure
<vi8
<schar
>, double>));
976 VERIFY((is_substitution_failure
<vschar
, vuchar
>));
977 VERIFY((is_substitution_failure
<vschar
, uchar
>));
978 VERIFY((is_substitution_failure
<vschar
, short>));
979 VERIFY((is_substitution_failure
<vschar
, ushort
>));
980 VERIFY((is_substitution_failure
<vschar
, uint
>));
981 VERIFY((is_substitution_failure
<vschar
, long>));
982 VERIFY((is_substitution_failure
<vschar
, ulong
>));
983 VERIFY((is_substitution_failure
<vschar
, llong
>));
984 VERIFY((is_substitution_failure
<vschar
, ullong
>));
985 VERIFY((is_substitution_failure
<vschar
, float>));
986 VERIFY((is_substitution_failure
<vschar
, double>));
987 VERIFY((is_substitution_failure
<vschar
, vi8
<schar
>>));
988 VERIFY((is_substitution_failure
<vschar
, vi8
<uchar
>>));
989 VERIFY((is_substitution_failure
<vschar
, vi8
<short>>));
990 VERIFY((is_substitution_failure
<vschar
, vi8
<ushort
>>));
991 VERIFY((is_substitution_failure
<vschar
, vi8
<int>>));
992 VERIFY((is_substitution_failure
<vschar
, vi8
<uint
>>));
993 VERIFY((is_substitution_failure
<vschar
, vi8
<long>>));
994 VERIFY((is_substitution_failure
<vschar
, vi8
<ulong
>>));
995 VERIFY((is_substitution_failure
<vschar
, vi8
<llong
>>));
996 VERIFY((is_substitution_failure
<vschar
, vi8
<ullong
>>));
997 VERIFY((is_substitution_failure
<vschar
, vi8
<float>>));
998 VERIFY((is_substitution_failure
<vschar
, vi8
<double>>));
999 VERIFY((is_substitution_failure
<vi8
<schar
>, vschar
>));
1000 VERIFY((is_substitution_failure
<vi8
<schar
>, vuchar
>));
1001 VERIFY((is_substitution_failure
<vi8
<schar
>, uchar
>));
1002 VERIFY((is_substitution_failure
<vi8
<schar
>, short>));
1003 VERIFY((is_substitution_failure
<vi8
<schar
>, ushort
>));
1004 VERIFY((is_substitution_failure
<vi8
<schar
>, uint
>));
1005 VERIFY((is_substitution_failure
<vi8
<schar
>, long>));
1006 VERIFY((is_substitution_failure
<vi8
<schar
>, ulong
>));
1007 VERIFY((is_substitution_failure
<vi8
<schar
>, ullong
>));
1008 VERIFY((is_substitution_failure
<vi8
<schar
>, float>));
1009 VERIFY((is_substitution_failure
<vi8
<schar
>, vi8
<uchar
>>));
1010 VERIFY((is_substitution_failure
<vi8
<schar
>, vi8
<ushort
>>));
1011 VERIFY((is_substitution_failure
<vi8
<schar
>, vi8
<uint
>>));
1012 VERIFY((is_substitution_failure
<vi8
<schar
>, vi8
<ulong
>>));
1013 VERIFY((is_substitution_failure
<vi8
<schar
>, vi8
<ullong
>>));
1015 else if constexpr (std::is_same_v
<V
, vuchar
>)
1017 VERIFY((is_substitution_failure
<vi8
<uchar
>, llong
>));
1019 binary_op_return_type
<vuchar
, uint
, vuchar
>();
1020 binary_op_return_type
<vi8
<uchar
>, uchar
, vi8
<uchar
>>();
1021 binary_op_return_type
<vi8
<uchar
>, int, vi8
<uchar
>>();
1022 binary_op_return_type
<vi8
<uchar
>, uint
, vi8
<uchar
>>();
1023 binary_op_return_type
<vi8
<uchar
>, vi8
<uchar
>, vi8
<uchar
>>();
1025 if constexpr (vi8
<schar
>::size() <= simd_abi::max_fixed_size
<short>)
1027 binary_op_return_type
<vi8
<short>, vi8
<uchar
>>();
1028 binary_op_return_type
<vi8
<ushort
>, vi8
<uchar
>>();
1029 binary_op_return_type
<vi8
<int>, vi8
<uchar
>>();
1030 binary_op_return_type
<vi8
<uint
>, vi8
<uchar
>>();
1031 binary_op_return_type
<vi8
<long>, vi8
<uchar
>>();
1032 binary_op_return_type
<vi8
<ulong
>, vi8
<uchar
>>();
1033 binary_op_return_type
<vi8
<llong
>, vi8
<uchar
>>();
1034 binary_op_return_type
<vi8
<ullong
>, vi8
<uchar
>>();
1035 binary_op_return_type
<vi8
<float>, vi8
<uchar
>>();
1036 binary_op_return_type
<vi8
<double>, vi8
<uchar
>>();
1039 VERIFY((is_substitution_failure
<vi8
<uchar
>, ullong
>));
1040 VERIFY((is_substitution_failure
<vi8
<uchar
>, double>));
1041 VERIFY((is_substitution_failure
<vuchar
, schar
>));
1042 VERIFY((is_substitution_failure
<vuchar
, vschar
>));
1043 VERIFY((is_substitution_failure
<vuchar
, short>));
1044 VERIFY((is_substitution_failure
<vuchar
, ushort
>));
1045 VERIFY((is_substitution_failure
<vuchar
, long>));
1046 VERIFY((is_substitution_failure
<vuchar
, ulong
>));
1047 VERIFY((is_substitution_failure
<vuchar
, llong
>));
1048 VERIFY((is_substitution_failure
<vuchar
, ullong
>));
1049 VERIFY((is_substitution_failure
<vuchar
, float>));
1050 VERIFY((is_substitution_failure
<vuchar
, double>));
1051 VERIFY((is_substitution_failure
<vuchar
, vi8
<schar
>>));
1052 VERIFY((is_substitution_failure
<vuchar
, vi8
<uchar
>>));
1053 VERIFY((is_substitution_failure
<vuchar
, vi8
<short>>));
1054 VERIFY((is_substitution_failure
<vuchar
, vi8
<ushort
>>));
1055 VERIFY((is_substitution_failure
<vuchar
, vi8
<int>>));
1056 VERIFY((is_substitution_failure
<vuchar
, vi8
<uint
>>));
1057 VERIFY((is_substitution_failure
<vuchar
, vi8
<long>>));
1058 VERIFY((is_substitution_failure
<vuchar
, vi8
<ulong
>>));
1059 VERIFY((is_substitution_failure
<vuchar
, vi8
<llong
>>));
1060 VERIFY((is_substitution_failure
<vuchar
, vi8
<ullong
>>));
1061 VERIFY((is_substitution_failure
<vuchar
, vi8
<float>>));
1062 VERIFY((is_substitution_failure
<vuchar
, vi8
<double>>));
1063 VERIFY((is_substitution_failure
<vi8
<uchar
>, schar
>));
1064 VERIFY((is_substitution_failure
<vi8
<uchar
>, vschar
>));
1065 VERIFY((is_substitution_failure
<vi8
<uchar
>, vuchar
>));
1066 VERIFY((is_substitution_failure
<vi8
<uchar
>, short>));
1067 VERIFY((is_substitution_failure
<vi8
<uchar
>, ushort
>));
1068 VERIFY((is_substitution_failure
<vi8
<uchar
>, long>));
1069 VERIFY((is_substitution_failure
<vi8
<uchar
>, ulong
>));
1070 VERIFY((is_substitution_failure
<vi8
<uchar
>, float>));
1071 VERIFY((is_substitution_failure
<vi8
<uchar
>, vi8
<schar
>>));