blob: 4c4744b77bcdeaab8fbd9954e5e741b92a6e135c [file] [log] [blame]
// Copyright (C) 2020-2026 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
// terms of the GNU General Public License as published by the
// Free Software Foundation; either version 3, or (at your option)
// any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License along
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
// expensive: * [1-9] * *
#include "bits/main.h"
// type with sizeof(char) but different signedness
using xchar = std::conditional_t<std::is_unsigned_v<char>, schar, uchar>;
using vschar = std::experimental::native_simd<schar>;
using vuchar = std::experimental::native_simd<uchar>;
using vshort = std::experimental::native_simd<short>;
using vushort = std::experimental::native_simd<ushort>;
using vint = std::experimental::native_simd<int>;
using vuint = std::experimental::native_simd<uint>;
using vlong = std::experimental::native_simd<long>;
using vulong = std::experimental::native_simd<ulong>;
using vllong = std::experimental::native_simd<llong>;
using vullong = std::experimental::native_simd<ullong>;
using vfloat = std::experimental::native_simd<float>;
using vdouble = std::experimental::native_simd<double>;
using vldouble = std::experimental::native_simd<long double>;
using vchar = std::experimental::native_simd<char>;
using vxchar = std::experimental::native_simd<xchar>;
template <typename T>
using vi8 = std::experimental::fixed_size_simd<T, vschar::size()>;
template <typename T>
using vi16 = std::experimental::fixed_size_simd<T, vshort::size()>;
template <typename T>
using vf32 = std::experimental::fixed_size_simd<T, vfloat::size()>;
template <typename T>
using vi32 = std::experimental::fixed_size_simd<T, vint::size()>;
template <typename T>
using vf64 = std::experimental::fixed_size_simd<T, vdouble::size()>;
template <typename T>
using vi64 = std::experimental::fixed_size_simd<T, vllong::size()>;
template <typename T>
using vl = typename std::conditional<sizeof(long) == sizeof(llong), vi64<T>,
vi32<T>>::type;
template <class A, class B, class Expected = A>
void
binary_op_return_type()
{
using namespace vir::test;
static_assert(std::is_same<A, Expected>::value, "");
using AC = std::add_const_t<A>;
using BC = std::add_const_t<B>;
COMPARE(typeid(A() + B()), typeid(Expected));
COMPARE(typeid(B() + A()), typeid(Expected));
COMPARE(typeid(AC() + BC()), typeid(Expected));
COMPARE(typeid(BC() + AC()), typeid(Expected));
}
template <typename V>
void
test()
{
using T = typename V::value_type;
namespace simd_abi = std::experimental::simd_abi;
binary_op_return_type<V, V, V>();
binary_op_return_type<V, T, V>();
binary_op_return_type<V, int, V>();
if constexpr (std::is_same_v<V, vfloat>)
{
binary_op_return_type<vfloat, schar>();
binary_op_return_type<vfloat, uchar>();
binary_op_return_type<vfloat, short>();
binary_op_return_type<vfloat, ushort>();
binary_op_return_type<vf32<float>, schar>();
binary_op_return_type<vf32<float>, uchar>();
binary_op_return_type<vf32<float>, short>();
binary_op_return_type<vf32<float>, ushort>();
binary_op_return_type<vf32<float>, int>();
binary_op_return_type<vf32<float>, float>();
binary_op_return_type<vf32<float>, vf32<schar>>();
binary_op_return_type<vf32<float>, vf32<uchar>>();
binary_op_return_type<vf32<float>, vf32<short>>();
binary_op_return_type<vf32<float>, vf32<ushort>>();
binary_op_return_type<vf32<float>, vf32<float>>();
VERIFY((is_substitution_failure<vfloat, uint>));
VERIFY((is_substitution_failure<vfloat, long>));
VERIFY((is_substitution_failure<vfloat, ulong>));
VERIFY((is_substitution_failure<vfloat, llong>));
VERIFY((is_substitution_failure<vfloat, ullong>));
VERIFY((is_substitution_failure<vfloat, double>));
VERIFY((is_substitution_failure<vfloat, vf32<schar>>));
VERIFY((is_substitution_failure<vfloat, vf32<uchar>>));
VERIFY((is_substitution_failure<vfloat, vf32<short>>));
VERIFY((is_substitution_failure<vfloat, vf32<ushort>>));
VERIFY((is_substitution_failure<vfloat, vf32<int>>));
VERIFY((is_substitution_failure<vfloat, vf32<uint>>));
VERIFY((is_substitution_failure<vfloat, vf32<long>>));
VERIFY((is_substitution_failure<vfloat, vf32<ulong>>));
VERIFY((is_substitution_failure<vfloat, vf32<llong>>));
VERIFY((is_substitution_failure<vfloat, vf32<ullong>>));
VERIFY((is_substitution_failure<vfloat, vf32<float>>));
VERIFY((is_substitution_failure<vf32<float>, vfloat>));
VERIFY((is_substitution_failure<vf32<float>, uint>));
VERIFY((is_substitution_failure<vf32<float>, long>));
VERIFY((is_substitution_failure<vf32<float>, ulong>));
VERIFY((is_substitution_failure<vf32<float>, llong>));
VERIFY((is_substitution_failure<vf32<float>, ullong>));
VERIFY((is_substitution_failure<vf32<float>, double>));
VERIFY((is_substitution_failure<vf32<float>, vf32<int>>));
VERIFY((is_substitution_failure<vf32<float>, vf32<uint>>));
VERIFY((is_substitution_failure<vf32<float>, vf32<long>>));
VERIFY((is_substitution_failure<vf32<float>, vf32<ulong>>));
VERIFY((is_substitution_failure<vf32<float>, vf32<llong>>));
VERIFY((is_substitution_failure<vf32<float>, vf32<ullong>>));
VERIFY((is_substitution_failure<vfloat, vf32<double>>));
}
else if constexpr (std::is_same_v<V, vdouble>)
{
binary_op_return_type<vdouble, float, vdouble>();
binary_op_return_type<vdouble, schar>();
binary_op_return_type<vdouble, uchar>();
binary_op_return_type<vdouble, short>();
binary_op_return_type<vdouble, ushort>();
binary_op_return_type<vdouble, uint>();
binary_op_return_type<vf64<double>, schar>();
binary_op_return_type<vf64<double>, uchar>();
binary_op_return_type<vf64<double>, short>();
binary_op_return_type<vf64<double>, ushort>();
binary_op_return_type<vf64<double>, uint>();
binary_op_return_type<vf64<double>, int, vf64<double>>();
binary_op_return_type<vf64<double>, float, vf64<double>>();
binary_op_return_type<vf64<double>, double, vf64<double>>();
binary_op_return_type<vf64<double>, vf64<double>, vf64<double>>();
binary_op_return_type<vf32<double>, schar>();
binary_op_return_type<vf32<double>, uchar>();
binary_op_return_type<vf32<double>, short>();
binary_op_return_type<vf32<double>, ushort>();
binary_op_return_type<vf32<double>, uint>();
binary_op_return_type<vf32<double>, int, vf32<double>>();
binary_op_return_type<vf32<double>, float, vf32<double>>();
binary_op_return_type<vf32<double>, double, vf32<double>>();
binary_op_return_type<vf64<double>, vf64<schar>>();
binary_op_return_type<vf64<double>, vf64<uchar>>();
binary_op_return_type<vf64<double>, vf64<short>>();
binary_op_return_type<vf64<double>, vf64<ushort>>();
binary_op_return_type<vf64<double>, vf64<int>>();
binary_op_return_type<vf64<double>, vf64<uint>>();
binary_op_return_type<vf64<double>, vf64<float>>();
VERIFY((is_substitution_failure<vdouble, llong>));
VERIFY((is_substitution_failure<vdouble, ullong>));
VERIFY((is_substitution_failure<vdouble, vf64<schar>>));
VERIFY((is_substitution_failure<vdouble, vf64<uchar>>));
VERIFY((is_substitution_failure<vdouble, vf64<short>>));
VERIFY((is_substitution_failure<vdouble, vf64<ushort>>));
VERIFY((is_substitution_failure<vdouble, vf64<int>>));
VERIFY((is_substitution_failure<vdouble, vf64<uint>>));
VERIFY((is_substitution_failure<vdouble, vf64<long>>));
VERIFY((is_substitution_failure<vdouble, vf64<ulong>>));
VERIFY((is_substitution_failure<vdouble, vf64<llong>>));
VERIFY((is_substitution_failure<vdouble, vf64<ullong>>));
VERIFY((is_substitution_failure<vdouble, vf64<float>>));
VERIFY((is_substitution_failure<vdouble, vf64<double>>));
VERIFY((is_substitution_failure<vf64<double>, vdouble>));
VERIFY((is_substitution_failure<vf64<double>, llong>));
VERIFY((is_substitution_failure<vf64<double>, ullong>));
VERIFY((is_substitution_failure<vf64<double>, vf64<llong>>));
VERIFY((is_substitution_failure<vf64<double>, vf64<ullong>>));
VERIFY((is_substitution_failure<vf32<double>, llong>));
VERIFY((is_substitution_failure<vf32<double>, ullong>));
if constexpr (sizeof(long) == sizeof(llong))
{
VERIFY((is_substitution_failure<vdouble, long>));
VERIFY((is_substitution_failure<vdouble, ulong>));
VERIFY((is_substitution_failure<vf64<double>, long>));
VERIFY((is_substitution_failure<vf64<double>, ulong>));
VERIFY((is_substitution_failure<vf64<double>, vf64<long>>));
VERIFY((is_substitution_failure<vf64<double>, vf64<ulong>>));
VERIFY((is_substitution_failure<vf32<double>, long>));
VERIFY((is_substitution_failure<vf32<double>, ulong>));
}
else
{
binary_op_return_type<vdouble, long>();
binary_op_return_type<vdouble, ulong>();
binary_op_return_type<vf64<double>, long>();
binary_op_return_type<vf64<double>, ulong>();
binary_op_return_type<vf64<double>, vf64<long>>();
binary_op_return_type<vf64<double>, vf64<ulong>>();
binary_op_return_type<vf32<double>, long>();
binary_op_return_type<vf32<double>, ulong>();
}
}
else if constexpr (std::is_same_v<V, vldouble>)
{
binary_op_return_type<vldouble, schar>();
binary_op_return_type<vldouble, uchar>();
binary_op_return_type<vldouble, short>();
binary_op_return_type<vldouble, ushort>();
binary_op_return_type<vldouble, uint>();
binary_op_return_type<vldouble, float>();
binary_op_return_type<vldouble, double>();
binary_op_return_type<vf64<long double>, schar>();
binary_op_return_type<vf64<long double>, uchar>();
binary_op_return_type<vf64<long double>, short>();
binary_op_return_type<vf64<long double>, ushort>();
binary_op_return_type<vf64<long double>, int>();
binary_op_return_type<vf64<long double>, uint>();
binary_op_return_type<vf64<long double>, float>();
binary_op_return_type<vf64<long double>, double>();
binary_op_return_type<vf64<long double>, vf64<long double>>();
using std::experimental::simd;
using A = simd_abi::fixed_size<vldouble::size()>;
binary_op_return_type<simd<long double, A>, schar>();
binary_op_return_type<simd<long double, A>, uchar>();
binary_op_return_type<simd<long double, A>, short>();
binary_op_return_type<simd<long double, A>, ushort>();
binary_op_return_type<simd<long double, A>, int>();
binary_op_return_type<simd<long double, A>, uint>();
binary_op_return_type<simd<long double, A>, float>();
binary_op_return_type<simd<long double, A>, double>();
if constexpr (sizeof(ldouble) == sizeof(double))
{
VERIFY((is_substitution_failure<vldouble, llong>));
VERIFY((is_substitution_failure<vldouble, ullong>));
VERIFY((is_substitution_failure<vf64<ldouble>, llong>));
VERIFY((is_substitution_failure<vf64<ldouble>, ullong>));
VERIFY((is_substitution_failure<simd<ldouble, A>, llong>));
VERIFY((is_substitution_failure<simd<ldouble, A>, ullong>));
if constexpr (sizeof(long) == sizeof(llong))
{
VERIFY((is_substitution_failure<vldouble, long>));
VERIFY((is_substitution_failure<vldouble, ulong>));
VERIFY((is_substitution_failure<vf64<ldouble>, long>));
VERIFY((is_substitution_failure<vf64<ldouble>, ulong>));
VERIFY((is_substitution_failure<simd<ldouble, A>, long>));
VERIFY((is_substitution_failure<simd<ldouble, A>, ulong>));
}
else
{
binary_op_return_type<vldouble, long>();
binary_op_return_type<vldouble, ulong>();
binary_op_return_type<vf64<long double>, long>();
binary_op_return_type<vf64<long double>, ulong>();
binary_op_return_type<simd<long double, A>, long>();
binary_op_return_type<simd<long double, A>, ulong>();
}
}
else
{
binary_op_return_type<vldouble, llong>();
binary_op_return_type<vldouble, ullong>();
binary_op_return_type<vf64<long double>, llong>();
binary_op_return_type<vf64<long double>, ullong>();
binary_op_return_type<simd<long double, A>, llong>();
binary_op_return_type<simd<long double, A>, ullong>();
binary_op_return_type<vldouble, long>();
binary_op_return_type<vldouble, ulong>();
binary_op_return_type<vf64<long double>, long>();
binary_op_return_type<vf64<long double>, ulong>();
binary_op_return_type<simd<long double, A>, long>();
binary_op_return_type<simd<long double, A>, ulong>();
}
VERIFY((is_substitution_failure<vf64<long double>, vldouble>));
COMPARE((is_substitution_failure<simd<long double, A>, vldouble>),
(!std::is_same<A, vldouble::abi_type>::value));
}
else if constexpr (std::is_same_v<V, vlong>)
{
VERIFY((is_substitution_failure<vi32<long>, double>));
VERIFY((is_substitution_failure<vi32<long>, float>));
VERIFY((is_substitution_failure<vi32<long>, vi32<float>>));
if constexpr (sizeof(long) == sizeof(llong))
{
binary_op_return_type<vlong, uint>();
binary_op_return_type<vlong, llong>();
binary_op_return_type<vi32<long>, uint>();
binary_op_return_type<vi32<long>, llong>();
binary_op_return_type<vi64<long>, uint>();
binary_op_return_type<vi64<long>, llong>();
binary_op_return_type<vi32<long>, vi32<uint>>();
binary_op_return_type<vi64<long>, vi64<uint>>();
VERIFY((is_substitution_failure<vi32<long>, vi32<double>>));
VERIFY((is_substitution_failure<vi64<long>, vi64<double>>));
}
else
{
VERIFY((is_substitution_failure<vlong, uint>));
VERIFY((is_substitution_failure<vlong, llong>));
VERIFY((is_substitution_failure<vi32<long>, uint>));
VERIFY((is_substitution_failure<vi32<long>, llong>));
VERIFY((is_substitution_failure<vi64<long>, uint>));
VERIFY((is_substitution_failure<vi64<long>, llong>));
VERIFY((is_substitution_failure<vi32<long>, vi32<uint>>));
VERIFY((is_substitution_failure<vi64<long>, vi64<uint>>));
binary_op_return_type<vi32<double>, vi32<long>>();
binary_op_return_type<vi64<double>, vi64<long>>();
}
binary_op_return_type<vlong, schar, vlong>();
binary_op_return_type<vlong, uchar, vlong>();
binary_op_return_type<vlong, short, vlong>();
binary_op_return_type<vlong, ushort, vlong>();
binary_op_return_type<vi32<long>, schar, vi32<long>>();
binary_op_return_type<vi32<long>, uchar, vi32<long>>();
binary_op_return_type<vi32<long>, short, vi32<long>>();
binary_op_return_type<vi32<long>, ushort, vi32<long>>();
binary_op_return_type<vi32<long>, int, vi32<long>>();
binary_op_return_type<vi32<long>, long, vi32<long>>();
binary_op_return_type<vi32<long>, vi32<long>, vi32<long>>();
binary_op_return_type<vi64<long>, schar, vi64<long>>();
binary_op_return_type<vi64<long>, uchar, vi64<long>>();
binary_op_return_type<vi64<long>, short, vi64<long>>();
binary_op_return_type<vi64<long>, ushort, vi64<long>>();
binary_op_return_type<vi64<long>, int, vi64<long>>();
binary_op_return_type<vi64<long>, long, vi64<long>>();
binary_op_return_type<vi64<long>, vi64<long>, vi64<long>>();
VERIFY((is_substitution_failure<vlong, vulong>));
VERIFY((is_substitution_failure<vlong, ulong>));
VERIFY((is_substitution_failure<vlong, ullong>));
VERIFY((is_substitution_failure<vlong, float>));
VERIFY((is_substitution_failure<vlong, double>));
VERIFY((is_substitution_failure<vlong, vl<schar>>));
VERIFY((is_substitution_failure<vlong, vl<uchar>>));
VERIFY((is_substitution_failure<vlong, vl<short>>));
VERIFY((is_substitution_failure<vlong, vl<ushort>>));
VERIFY((is_substitution_failure<vlong, vl<int>>));
VERIFY((is_substitution_failure<vlong, vl<uint>>));
VERIFY((is_substitution_failure<vlong, vl<long>>));
VERIFY((is_substitution_failure<vlong, vl<ulong>>));
VERIFY((is_substitution_failure<vlong, vl<llong>>));
VERIFY((is_substitution_failure<vlong, vl<ullong>>));
VERIFY((is_substitution_failure<vlong, vl<float>>));
VERIFY((is_substitution_failure<vlong, vl<double>>));
VERIFY((is_substitution_failure<vl<long>, vlong>));
VERIFY((is_substitution_failure<vl<long>, vulong>));
VERIFY((is_substitution_failure<vi32<long>, ulong>));
VERIFY((is_substitution_failure<vi32<long>, ullong>));
binary_op_return_type<vi32<long>, vi32<schar>>();
binary_op_return_type<vi32<long>, vi32<uchar>>();
binary_op_return_type<vi32<long>, vi32<short>>();
binary_op_return_type<vi32<long>, vi32<ushort>>();
binary_op_return_type<vi32<long>, vi32<int>>();
VERIFY((is_substitution_failure<vi32<long>, vi32<ulong>>));
VERIFY((is_substitution_failure<vi32<long>, vi32<ullong>>));
VERIFY((is_substitution_failure<vi64<long>, ulong>));
VERIFY((is_substitution_failure<vi64<long>, ullong>));
VERIFY((is_substitution_failure<vi64<long>, float>));
VERIFY((is_substitution_failure<vi64<long>, double>));
binary_op_return_type<vi64<long>, vi64<schar>>();
binary_op_return_type<vi64<long>, vi64<uchar>>();
binary_op_return_type<vi64<long>, vi64<short>>();
binary_op_return_type<vi64<long>, vi64<ushort>>();
binary_op_return_type<vi64<long>, vi64<int>>();
VERIFY((is_substitution_failure<vi64<long>, vi64<ulong>>));
VERIFY((is_substitution_failure<vi64<long>, vi64<ullong>>));
VERIFY((is_substitution_failure<vi64<long>, vi64<float>>));
binary_op_return_type<vi32<llong>, vi32<long>>();
binary_op_return_type<vi64<llong>, vi64<long>>();
}
else if constexpr (std::is_same_v<V, vulong>)
{
if constexpr (sizeof(long) == sizeof(llong))
{
binary_op_return_type<vulong, ullong, vulong>();
binary_op_return_type<vi32<ulong>, ullong, vi32<ulong>>();
binary_op_return_type<vi64<ulong>, ullong, vi64<ulong>>();
VERIFY((is_substitution_failure<vi32<ulong>, vi32<llong>>));
VERIFY((is_substitution_failure<vi32<ulong>, vi32<double>>));
VERIFY((is_substitution_failure<vi64<ulong>, vi64<llong>>));
VERIFY((is_substitution_failure<vi64<ulong>, vi64<double>>));
}
else
{
VERIFY((is_substitution_failure<vulong, ullong>));
VERIFY((is_substitution_failure<vi32<ulong>, ullong>));
VERIFY((is_substitution_failure<vi64<ulong>, ullong>));
binary_op_return_type<vi32<llong>, vi32<ulong>>();
binary_op_return_type<vi32<double>, vi32<ulong>>();
binary_op_return_type<vi64<llong>, vi64<ulong>>();
binary_op_return_type<vi64<double>, vi64<ulong>>();
}
binary_op_return_type<vulong, uchar, vulong>();
binary_op_return_type<vulong, ushort, vulong>();
binary_op_return_type<vulong, uint, vulong>();
binary_op_return_type<vi32<ulong>, uchar, vi32<ulong>>();
binary_op_return_type<vi32<ulong>, ushort, vi32<ulong>>();
binary_op_return_type<vi32<ulong>, int, vi32<ulong>>();
binary_op_return_type<vi32<ulong>, uint, vi32<ulong>>();
binary_op_return_type<vi32<ulong>, ulong, vi32<ulong>>();
binary_op_return_type<vi32<ulong>, vi32<ulong>, vi32<ulong>>();
binary_op_return_type<vi64<ulong>, uchar, vi64<ulong>>();
binary_op_return_type<vi64<ulong>, ushort, vi64<ulong>>();
binary_op_return_type<vi64<ulong>, int, vi64<ulong>>();
binary_op_return_type<vi64<ulong>, uint, vi64<ulong>>();
binary_op_return_type<vi64<ulong>, ulong, vi64<ulong>>();
binary_op_return_type<vi64<ulong>, vi64<ulong>, vi64<ulong>>();
VERIFY((is_substitution_failure<vi32<ulong>, llong>));
VERIFY((is_substitution_failure<vi32<ulong>, float>));
VERIFY((is_substitution_failure<vi32<ulong>, double>));
VERIFY((is_substitution_failure<vi32<ulong>, vi32<float>>));
VERIFY((is_substitution_failure<vi64<ulong>, vi64<float>>));
VERIFY((is_substitution_failure<vulong, schar>));
VERIFY((is_substitution_failure<vulong, short>));
VERIFY((is_substitution_failure<vulong, vlong>));
VERIFY((is_substitution_failure<vulong, long>));
VERIFY((is_substitution_failure<vulong, llong>));
VERIFY((is_substitution_failure<vulong, float>));
VERIFY((is_substitution_failure<vulong, double>));
VERIFY((is_substitution_failure<vulong, vl<schar>>));
VERIFY((is_substitution_failure<vulong, vl<uchar>>));
VERIFY((is_substitution_failure<vulong, vl<short>>));
VERIFY((is_substitution_failure<vulong, vl<ushort>>));
VERIFY((is_substitution_failure<vulong, vl<int>>));
VERIFY((is_substitution_failure<vulong, vl<uint>>));
VERIFY((is_substitution_failure<vulong, vl<long>>));
VERIFY((is_substitution_failure<vulong, vl<ulong>>));
VERIFY((is_substitution_failure<vulong, vl<llong>>));
VERIFY((is_substitution_failure<vulong, vl<ullong>>));
VERIFY((is_substitution_failure<vulong, vl<float>>));
VERIFY((is_substitution_failure<vulong, vl<double>>));
VERIFY((is_substitution_failure<vl<ulong>, vlong>));
VERIFY((is_substitution_failure<vl<ulong>, vulong>));
VERIFY((is_substitution_failure<vi32<ulong>, schar>));
VERIFY((is_substitution_failure<vi32<ulong>, short>));
VERIFY((is_substitution_failure<vi32<ulong>, long>));
VERIFY((is_substitution_failure<vi32<ulong>, vi32<schar>>));
binary_op_return_type<vi32<ulong>, vi32<uchar>>();
VERIFY((is_substitution_failure<vi32<ulong>, vi32<short>>));
binary_op_return_type<vi32<ulong>, vi32<ushort>>();
VERIFY((is_substitution_failure<vi32<ulong>, vi32<int>>));
binary_op_return_type<vi32<ulong>, vi32<uint>>();
VERIFY((is_substitution_failure<vi32<ulong>, vi32<long>>));
binary_op_return_type<vi32<ullong>, vi32<ulong>>();
VERIFY((is_substitution_failure<vi64<ulong>, schar>));
VERIFY((is_substitution_failure<vi64<ulong>, short>));
VERIFY((is_substitution_failure<vi64<ulong>, long>));
VERIFY((is_substitution_failure<vi64<ulong>, llong>));
VERIFY((is_substitution_failure<vi64<ulong>, float>));
VERIFY((is_substitution_failure<vi64<ulong>, double>));
VERIFY((is_substitution_failure<vi64<ulong>, vi64<schar>>));
binary_op_return_type<vi64<ulong>, vi64<uchar>>();
VERIFY((is_substitution_failure<vi64<ulong>, vi64<short>>));
binary_op_return_type<vi64<ulong>, vi64<ushort>>();
VERIFY((is_substitution_failure<vi64<ulong>, vi64<int>>));
binary_op_return_type<vi64<ulong>, vi64<uint>>();
VERIFY((is_substitution_failure<vi64<ulong>, vi64<long>>));
binary_op_return_type<vi64<ullong>, vi64<ulong>>();
}
else if constexpr (std::is_same_v<V, vllong>)
{
binary_op_return_type<vllong, schar, vllong>();
binary_op_return_type<vllong, uchar, vllong>();
binary_op_return_type<vllong, short, vllong>();
binary_op_return_type<vllong, ushort, vllong>();
binary_op_return_type<vllong, uint, vllong>();
binary_op_return_type<vllong, long, vllong>();
binary_op_return_type<vi32<llong>, schar, vi32<llong>>();
binary_op_return_type<vi32<llong>, uchar, vi32<llong>>();
binary_op_return_type<vi32<llong>, short, vi32<llong>>();
binary_op_return_type<vi32<llong>, ushort, vi32<llong>>();
binary_op_return_type<vi32<llong>, int, vi32<llong>>();
binary_op_return_type<vi32<llong>, uint, vi32<llong>>();
binary_op_return_type<vi32<llong>, long, vi32<llong>>();
binary_op_return_type<vi32<llong>, llong, vi32<llong>>();
binary_op_return_type<vi32<llong>, vi32<llong>, vi32<llong>>();
binary_op_return_type<vi64<llong>, schar, vi64<llong>>();
binary_op_return_type<vi64<llong>, uchar, vi64<llong>>();
binary_op_return_type<vi64<llong>, short, vi64<llong>>();
binary_op_return_type<vi64<llong>, ushort, vi64<llong>>();
binary_op_return_type<vi64<llong>, int, vi64<llong>>();
binary_op_return_type<vi64<llong>, uint, vi64<llong>>();
binary_op_return_type<vi64<llong>, long, vi64<llong>>();
binary_op_return_type<vi64<llong>, llong, vi64<llong>>();
binary_op_return_type<vi64<llong>, vi64<llong>>();
binary_op_return_type<vi32<llong>, vi32<schar>>();
binary_op_return_type<vi32<llong>, vi32<uchar>>();
binary_op_return_type<vi32<llong>, vi32<short>>();
binary_op_return_type<vi32<llong>, vi32<ushort>>();
binary_op_return_type<vi32<llong>, vi32<int>>();
binary_op_return_type<vi32<llong>, vi32<uint>>();
binary_op_return_type<vi32<llong>, vi32<long>>();
if constexpr (sizeof(long) == sizeof(llong))
{
VERIFY((is_substitution_failure<vi32<llong>, vi32<ulong>>));
VERIFY((is_substitution_failure<vi32<llong>, ulong>));
VERIFY((is_substitution_failure<vi64<llong>, ulong>));
VERIFY((is_substitution_failure<vllong, ulong>));
}
else
{
binary_op_return_type<vi32<llong>, vi32<ulong>>();
binary_op_return_type<vi32<llong>, ulong>();
binary_op_return_type<vi64<llong>, ulong>();
binary_op_return_type<vllong, ulong>();
}
VERIFY((is_substitution_failure<vllong, vullong>));
VERIFY((is_substitution_failure<vllong, ullong>));
VERIFY((is_substitution_failure<vllong, float>));
VERIFY((is_substitution_failure<vllong, double>));
VERIFY((is_substitution_failure<vllong, vi64<schar>>));
VERIFY((is_substitution_failure<vllong, vi64<uchar>>));
VERIFY((is_substitution_failure<vllong, vi64<short>>));
VERIFY((is_substitution_failure<vllong, vi64<ushort>>));
VERIFY((is_substitution_failure<vllong, vi64<int>>));
VERIFY((is_substitution_failure<vllong, vi64<uint>>));
VERIFY((is_substitution_failure<vllong, vi64<long>>));
VERIFY((is_substitution_failure<vllong, vi64<ulong>>));
VERIFY((is_substitution_failure<vllong, vi64<llong>>));
VERIFY((is_substitution_failure<vllong, vi64<ullong>>));
VERIFY((is_substitution_failure<vllong, vi64<float>>));
VERIFY((is_substitution_failure<vllong, vi64<double>>));
VERIFY((is_substitution_failure<vi32<llong>, ullong>));
VERIFY((is_substitution_failure<vi32<llong>, float>));
VERIFY((is_substitution_failure<vi32<llong>, double>));
VERIFY((is_substitution_failure<vi32<llong>, vi32<ullong>>));
VERIFY((is_substitution_failure<vi32<llong>, vi32<float>>));
VERIFY((is_substitution_failure<vi32<llong>, vi32<double>>));
VERIFY((is_substitution_failure<vi64<llong>, vllong>));
VERIFY((is_substitution_failure<vi64<llong>, vullong>));
VERIFY((is_substitution_failure<vi64<llong>, ullong>));
VERIFY((is_substitution_failure<vi64<llong>, float>));
VERIFY((is_substitution_failure<vi64<llong>, double>));
binary_op_return_type<vi64<llong>, vi64<schar>>();
binary_op_return_type<vi64<llong>, vi64<uchar>>();
binary_op_return_type<vi64<llong>, vi64<short>>();
binary_op_return_type<vi64<llong>, vi64<ushort>>();
binary_op_return_type<vi64<llong>, vi64<int>>();
binary_op_return_type<vi64<llong>, vi64<uint>>();
binary_op_return_type<vi64<llong>, vi64<long>>();
if constexpr (sizeof(long) == sizeof(llong))
{
VERIFY((is_substitution_failure<vi64<llong>, vi64<ulong>>));
}
else
{
binary_op_return_type<vi64<llong>, vi64<ulong>>();
}
VERIFY((is_substitution_failure<vi64<llong>, vi64<ullong>>));
VERIFY((is_substitution_failure<vi64<llong>, vi64<float>>));
VERIFY((is_substitution_failure<vi64<llong>, vi64<double>>));
}
else if constexpr (std::is_same_v<V, vullong>)
{
binary_op_return_type<vullong, uchar, vullong>();
binary_op_return_type<vullong, ushort, vullong>();
binary_op_return_type<vullong, uint, vullong>();
binary_op_return_type<vullong, ulong, vullong>();
binary_op_return_type<vi32<ullong>, uchar, vi32<ullong>>();
binary_op_return_type<vi32<ullong>, ushort, vi32<ullong>>();
binary_op_return_type<vi32<ullong>, int, vi32<ullong>>();
binary_op_return_type<vi32<ullong>, uint, vi32<ullong>>();
binary_op_return_type<vi32<ullong>, ulong, vi32<ullong>>();
binary_op_return_type<vi32<ullong>, ullong, vi32<ullong>>();
binary_op_return_type<vi32<ullong>, vi32<ullong>, vi32<ullong>>();
binary_op_return_type<vi64<ullong>, uchar, vi64<ullong>>();
binary_op_return_type<vi64<ullong>, ushort, vi64<ullong>>();
binary_op_return_type<vi64<ullong>, int, vi64<ullong>>();
binary_op_return_type<vi64<ullong>, uint, vi64<ullong>>();
binary_op_return_type<vi64<ullong>, ulong, vi64<ullong>>();
binary_op_return_type<vi64<ullong>, ullong, vi64<ullong>>();
binary_op_return_type<vi64<ullong>, vi64<ullong>, vi64<ullong>>();
VERIFY((is_substitution_failure<vullong, schar>));
VERIFY((is_substitution_failure<vullong, short>));
VERIFY((is_substitution_failure<vullong, long>));
VERIFY((is_substitution_failure<vullong, llong>));
VERIFY((is_substitution_failure<vullong, vllong>));
VERIFY((is_substitution_failure<vullong, float>));
VERIFY((is_substitution_failure<vullong, double>));
VERIFY((is_substitution_failure<vullong, vi64<schar>>));
VERIFY((is_substitution_failure<vullong, vi64<uchar>>));
VERIFY((is_substitution_failure<vullong, vi64<short>>));
VERIFY((is_substitution_failure<vullong, vi64<ushort>>));
VERIFY((is_substitution_failure<vullong, vi64<int>>));
VERIFY((is_substitution_failure<vullong, vi64<uint>>));
VERIFY((is_substitution_failure<vullong, vi64<long>>));
VERIFY((is_substitution_failure<vullong, vi64<ulong>>));
VERIFY((is_substitution_failure<vullong, vi64<llong>>));
VERIFY((is_substitution_failure<vullong, vi64<ullong>>));
VERIFY((is_substitution_failure<vullong, vi64<float>>));
VERIFY((is_substitution_failure<vullong, vi64<double>>));
VERIFY((is_substitution_failure<vi32<ullong>, schar>));
VERIFY((is_substitution_failure<vi32<ullong>, short>));
VERIFY((is_substitution_failure<vi32<ullong>, long>));
VERIFY((is_substitution_failure<vi32<ullong>, llong>));
VERIFY((is_substitution_failure<vi32<ullong>, float>));
VERIFY((is_substitution_failure<vi32<ullong>, double>));
VERIFY((is_substitution_failure<vi32<ullong>, vi32<schar>>));
binary_op_return_type<vi32<ullong>, vi32<uchar>>();
VERIFY((is_substitution_failure<vi32<ullong>, vi32<short>>));
binary_op_return_type<vi32<ullong>, vi32<ushort>>();
VERIFY((is_substitution_failure<vi32<ullong>, vi32<int>>));
binary_op_return_type<vi32<ullong>, vi32<uint>>();
VERIFY((is_substitution_failure<vi32<ullong>, vi32<long>>));
binary_op_return_type<vi32<ullong>, vi32<ulong>>();
VERIFY((is_substitution_failure<vi32<ullong>, vi32<llong>>));
VERIFY((is_substitution_failure<vi32<ullong>, vi32<float>>));
VERIFY((is_substitution_failure<vi32<ullong>, vi32<double>>));
VERIFY((is_substitution_failure<vi64<ullong>, schar>));
VERIFY((is_substitution_failure<vi64<ullong>, short>));
VERIFY((is_substitution_failure<vi64<ullong>, long>));
VERIFY((is_substitution_failure<vi64<ullong>, llong>));
VERIFY((is_substitution_failure<vi64<ullong>, vllong>));
VERIFY((is_substitution_failure<vi64<ullong>, vullong>));
VERIFY((is_substitution_failure<vi64<ullong>, float>));
VERIFY((is_substitution_failure<vi64<ullong>, double>));
VERIFY((is_substitution_failure<vi64<ullong>, vi64<schar>>));
binary_op_return_type<vi64<ullong>, vi64<uchar>>();
VERIFY((is_substitution_failure<vi64<ullong>, vi64<short>>));
binary_op_return_type<vi64<ullong>, vi64<ushort>>();
VERIFY((is_substitution_failure<vi64<ullong>, vi64<int>>));
binary_op_return_type<vi64<ullong>, vi64<uint>>();
VERIFY((is_substitution_failure<vi64<ullong>, vi64<long>>));
binary_op_return_type<vi64<ullong>, vi64<ulong>>();
VERIFY((is_substitution_failure<vi64<ullong>, vi64<llong>>));
VERIFY((is_substitution_failure<vi64<ullong>, vi64<float>>));
VERIFY((is_substitution_failure<vi64<ullong>, vi64<double>>));
}
else if constexpr (std::is_same_v<V, vint>)
{
binary_op_return_type<vint, schar, vint>();
binary_op_return_type<vint, uchar, vint>();
binary_op_return_type<vint, short, vint>();
binary_op_return_type<vint, ushort, vint>();
binary_op_return_type<vi32<int>, schar, vi32<int>>();
binary_op_return_type<vi32<int>, uchar, vi32<int>>();
binary_op_return_type<vi32<int>, short, vi32<int>>();
binary_op_return_type<vi32<int>, ushort, vi32<int>>();
binary_op_return_type<vi32<int>, int, vi32<int>>();
binary_op_return_type<vi32<int>, vi32<int>, vi32<int>>();
binary_op_return_type<vi32<int>, vi32<schar>>();
binary_op_return_type<vi32<int>, vi32<uchar>>();
binary_op_return_type<vi32<int>, vi32<short>>();
binary_op_return_type<vi32<int>, vi32<ushort>>();
binary_op_return_type<vi32<llong>, vi32<int>>();
binary_op_return_type<vi32<double>, vi32<int>>();
// order is important for MSVC. This compiler is just crazy: It considers
// operators from unrelated simd template instantiations as candidates -
// but only after they have been tested. So e.g. vi32<int> + llong will
// produce a vi32<llong> if a vi32<llong> operator test is done before the
// vi32<int> + llong test.
VERIFY((is_substitution_failure<vi32<int>, double>));
VERIFY((is_substitution_failure<vi32<int>, float>));
VERIFY((is_substitution_failure<vi32<int>, llong>));
VERIFY((is_substitution_failure<vi32<int>, vi32<float>>));
VERIFY((is_substitution_failure<vint, vuint>));
VERIFY((is_substitution_failure<vint, uint>));
VERIFY((is_substitution_failure<vint, ulong>));
VERIFY((is_substitution_failure<vint, llong>));
VERIFY((is_substitution_failure<vint, ullong>));
VERIFY((is_substitution_failure<vint, float>));
VERIFY((is_substitution_failure<vint, double>));
VERIFY((is_substitution_failure<vint, vi32<schar>>));
VERIFY((is_substitution_failure<vint, vi32<uchar>>));
VERIFY((is_substitution_failure<vint, vi32<short>>));
VERIFY((is_substitution_failure<vint, vi32<ushort>>));
VERIFY((is_substitution_failure<vint, vi32<int>>));
VERIFY((is_substitution_failure<vint, vi32<uint>>));
VERIFY((is_substitution_failure<vint, vi32<long>>));
VERIFY((is_substitution_failure<vint, vi32<ulong>>));
VERIFY((is_substitution_failure<vint, vi32<llong>>));
VERIFY((is_substitution_failure<vint, vi32<ullong>>));
VERIFY((is_substitution_failure<vint, vi32<float>>));
VERIFY((is_substitution_failure<vint, vi32<double>>));
VERIFY((is_substitution_failure<vi32<int>, vint>));
VERIFY((is_substitution_failure<vi32<int>, vuint>));
VERIFY((is_substitution_failure<vi32<int>, uint>));
VERIFY((is_substitution_failure<vi32<int>, ulong>));
VERIFY((is_substitution_failure<vi32<int>, ullong>));
VERIFY((is_substitution_failure<vi32<int>, vi32<uint>>));
VERIFY((is_substitution_failure<vi32<int>, vi32<ulong>>));
VERIFY((is_substitution_failure<vi32<int>, vi32<ullong>>));
binary_op_return_type<vi32<long>, vi32<int>>();
if constexpr (sizeof(long) == sizeof(llong))
{
VERIFY((is_substitution_failure<vint, long>));
VERIFY((is_substitution_failure<vi32<int>, long>));
}
else
{
binary_op_return_type<vint, long>();
binary_op_return_type<vi32<int>, long>();
}
}
else if constexpr (std::is_same_v<V, vuint>)
{
VERIFY((is_substitution_failure<vi32<uint>, llong>));
VERIFY((is_substitution_failure<vi32<uint>, ullong>));
VERIFY((is_substitution_failure<vi32<uint>, float>));
VERIFY((is_substitution_failure<vi32<uint>, double>));
VERIFY((is_substitution_failure<vi32<uint>, vi32<float>>));
binary_op_return_type<vuint, uchar, vuint>();
binary_op_return_type<vuint, ushort, vuint>();
binary_op_return_type<vi32<uint>, uchar, vi32<uint>>();
binary_op_return_type<vi32<uint>, ushort, vi32<uint>>();
binary_op_return_type<vi32<uint>, int, vi32<uint>>();
binary_op_return_type<vi32<uint>, uint, vi32<uint>>();
binary_op_return_type<vi32<uint>, vi32<uint>, vi32<uint>>();
binary_op_return_type<vi32<uint>, vi32<uchar>>();
binary_op_return_type<vi32<uint>, vi32<ushort>>();
binary_op_return_type<vi32<llong>, vi32<uint>>();
binary_op_return_type<vi32<ullong>, vi32<uint>>();
binary_op_return_type<vi32<double>, vi32<uint>>();
VERIFY((is_substitution_failure<vuint, schar>));
VERIFY((is_substitution_failure<vuint, short>));
VERIFY((is_substitution_failure<vuint, vint>));
VERIFY((is_substitution_failure<vuint, long>));
VERIFY((is_substitution_failure<vuint, llong>));
VERIFY((is_substitution_failure<vuint, ullong>));
VERIFY((is_substitution_failure<vuint, float>));
VERIFY((is_substitution_failure<vuint, double>));
VERIFY((is_substitution_failure<vuint, vi32<schar>>));
VERIFY((is_substitution_failure<vuint, vi32<uchar>>));
VERIFY((is_substitution_failure<vuint, vi32<short>>));
VERIFY((is_substitution_failure<vuint, vi32<ushort>>));
VERIFY((is_substitution_failure<vuint, vi32<int>>));
VERIFY((is_substitution_failure<vuint, vi32<uint>>));
VERIFY((is_substitution_failure<vuint, vi32<long>>));
VERIFY((is_substitution_failure<vuint, vi32<ulong>>));
VERIFY((is_substitution_failure<vuint, vi32<llong>>));
VERIFY((is_substitution_failure<vuint, vi32<ullong>>));
VERIFY((is_substitution_failure<vuint, vi32<float>>));
VERIFY((is_substitution_failure<vuint, vi32<double>>));
VERIFY((is_substitution_failure<vi32<uint>, schar>));
VERIFY((is_substitution_failure<vi32<uint>, short>));
VERIFY((is_substitution_failure<vi32<uint>, vint>));
VERIFY((is_substitution_failure<vi32<uint>, vuint>));
VERIFY((is_substitution_failure<vi32<uint>, long>));
VERIFY((is_substitution_failure<vi32<uint>, vi32<schar>>));
VERIFY((is_substitution_failure<vi32<uint>, vi32<short>>));
VERIFY((is_substitution_failure<vi32<uint>, vi32<int>>));
binary_op_return_type<vi32<ulong>, vi32<uint>>();
if constexpr (sizeof(long) == sizeof(llong))
{
VERIFY((is_substitution_failure<vuint, ulong>));
VERIFY((is_substitution_failure<vi32<uint>, ulong>));
binary_op_return_type<vi32<long>, vi32<uint>>();
}
else
{
binary_op_return_type<vuint, ulong>();
binary_op_return_type<vi32<uint>, ulong>();
VERIFY((is_substitution_failure<vi32<uint>, vi32<long>>));
}
}
else if constexpr (std::is_same_v<V, vshort>)
{
binary_op_return_type<vshort, schar, vshort>();
binary_op_return_type<vshort, uchar, vshort>();
binary_op_return_type<vi16<short>, schar, vi16<short>>();
binary_op_return_type<vi16<short>, uchar, vi16<short>>();
binary_op_return_type<vi16<short>, short, vi16<short>>();
binary_op_return_type<vi16<short>, int, vi16<short>>();
binary_op_return_type<vi16<short>, vi16<schar>>();
binary_op_return_type<vi16<short>, vi16<uchar>>();
binary_op_return_type<vi16<short>, vi16<short>>();
binary_op_return_type<vi16<int>, vi16<short>>();
binary_op_return_type<vi16<long>, vi16<short>>();
binary_op_return_type<vi16<llong>, vi16<short>>();
binary_op_return_type<vi16<float>, vi16<short>>();
binary_op_return_type<vi16<double>, vi16<short>>();
VERIFY((is_substitution_failure<vi16<short>, double>));
VERIFY((is_substitution_failure<vi16<short>, llong>));
VERIFY((is_substitution_failure<vshort, vushort>));
VERIFY((is_substitution_failure<vshort, ushort>));
VERIFY((is_substitution_failure<vshort, uint>));
VERIFY((is_substitution_failure<vshort, long>));
VERIFY((is_substitution_failure<vshort, ulong>));
VERIFY((is_substitution_failure<vshort, llong>));
VERIFY((is_substitution_failure<vshort, ullong>));
VERIFY((is_substitution_failure<vshort, float>));
VERIFY((is_substitution_failure<vshort, double>));
VERIFY((is_substitution_failure<vshort, vi16<schar>>));
VERIFY((is_substitution_failure<vshort, vi16<uchar>>));
VERIFY((is_substitution_failure<vshort, vi16<short>>));
VERIFY((is_substitution_failure<vshort, vi16<ushort>>));
VERIFY((is_substitution_failure<vshort, vi16<int>>));
VERIFY((is_substitution_failure<vshort, vi16<uint>>));
VERIFY((is_substitution_failure<vshort, vi16<long>>));
VERIFY((is_substitution_failure<vshort, vi16<ulong>>));
VERIFY((is_substitution_failure<vshort, vi16<llong>>));
VERIFY((is_substitution_failure<vshort, vi16<ullong>>));
VERIFY((is_substitution_failure<vshort, vi16<float>>));
VERIFY((is_substitution_failure<vshort, vi16<double>>));
VERIFY((is_substitution_failure<vi16<short>, vshort>));
VERIFY((is_substitution_failure<vi16<short>, vushort>));
VERIFY((is_substitution_failure<vi16<short>, ushort>));
VERIFY((is_substitution_failure<vi16<short>, uint>));
VERIFY((is_substitution_failure<vi16<short>, long>));
VERIFY((is_substitution_failure<vi16<short>, ulong>));
VERIFY((is_substitution_failure<vi16<short>, ullong>));
VERIFY((is_substitution_failure<vi16<short>, float>));
VERIFY((is_substitution_failure<vi16<short>, vi16<ushort>>));
VERIFY((is_substitution_failure<vi16<short>, vi16<uint>>));
VERIFY((is_substitution_failure<vi16<short>, vi16<ulong>>));
VERIFY((is_substitution_failure<vi16<short>, vi16<ullong>>));
}
else if constexpr (std::is_same_v<V, vushort>)
{
binary_op_return_type<vushort, uchar, vushort>();
binary_op_return_type<vushort, uint, vushort>();
binary_op_return_type<vi16<ushort>, uchar, vi16<ushort>>();
binary_op_return_type<vi16<ushort>, ushort, vi16<ushort>>();
binary_op_return_type<vi16<ushort>, int, vi16<ushort>>();
binary_op_return_type<vi16<ushort>, uint, vi16<ushort>>();
binary_op_return_type<vi16<ushort>, vi16<uchar>>();
binary_op_return_type<vi16<ushort>, vi16<ushort>>();
binary_op_return_type<vi16<int>, vi16<ushort>>();
binary_op_return_type<vi16<long>, vi16<ushort>>();
binary_op_return_type<vi16<llong>, vi16<ushort>>();
binary_op_return_type<vi16<uint>, vi16<ushort>>();
binary_op_return_type<vi16<ulong>, vi16<ushort>>();
binary_op_return_type<vi16<ullong>, vi16<ushort>>();
binary_op_return_type<vi16<float>, vi16<ushort>>();
binary_op_return_type<vi16<double>, vi16<ushort>>();
VERIFY((is_substitution_failure<vi16<ushort>, llong>));
VERIFY((is_substitution_failure<vi16<ushort>, ullong>));
VERIFY((is_substitution_failure<vi16<ushort>, double>));
VERIFY((is_substitution_failure<vushort, schar>));
VERIFY((is_substitution_failure<vushort, short>));
VERIFY((is_substitution_failure<vushort, vshort>));
VERIFY((is_substitution_failure<vushort, long>));
VERIFY((is_substitution_failure<vushort, ulong>));
VERIFY((is_substitution_failure<vushort, llong>));
VERIFY((is_substitution_failure<vushort, ullong>));
VERIFY((is_substitution_failure<vushort, float>));
VERIFY((is_substitution_failure<vushort, double>));
VERIFY((is_substitution_failure<vushort, vi16<schar>>));
VERIFY((is_substitution_failure<vushort, vi16<uchar>>));
VERIFY((is_substitution_failure<vushort, vi16<short>>));
VERIFY((is_substitution_failure<vushort, vi16<ushort>>));
VERIFY((is_substitution_failure<vushort, vi16<int>>));
VERIFY((is_substitution_failure<vushort, vi16<uint>>));
VERIFY((is_substitution_failure<vushort, vi16<long>>));
VERIFY((is_substitution_failure<vushort, vi16<ulong>>));
VERIFY((is_substitution_failure<vushort, vi16<llong>>));
VERIFY((is_substitution_failure<vushort, vi16<ullong>>));
VERIFY((is_substitution_failure<vushort, vi16<float>>));
VERIFY((is_substitution_failure<vushort, vi16<double>>));
VERIFY((is_substitution_failure<vi16<ushort>, schar>));
VERIFY((is_substitution_failure<vi16<ushort>, short>));
VERIFY((is_substitution_failure<vi16<ushort>, vshort>));
VERIFY((is_substitution_failure<vi16<ushort>, vushort>));
VERIFY((is_substitution_failure<vi16<ushort>, long>));
VERIFY((is_substitution_failure<vi16<ushort>, ulong>));
VERIFY((is_substitution_failure<vi16<ushort>, float>));
VERIFY((is_substitution_failure<vi16<ushort>, vi16<schar>>));
VERIFY((is_substitution_failure<vi16<ushort>, vi16<short>>));
}
else if constexpr (std::is_same_v<V, vchar>)
{
binary_op_return_type<vi8<char>, char, vi8<char>>();
binary_op_return_type<vi8<char>, int, vi8<char>>();
binary_op_return_type<vi8<char>, vi8<char>, vi8<char>>();
if constexpr (vi8<schar>::size() <= simd_abi::max_fixed_size<short>)
{
VERIFY(!(is_substitution_failure<vi8<char>, vi8<short>>));
VERIFY(!(is_substitution_failure<vi8<char>, vi8<int>>));
VERIFY(!(is_substitution_failure<vi8<char>, vi8<long>>));
VERIFY(!(is_substitution_failure<vi8<char>, vi8<llong>>));
COMPARE((is_substitution_failure<vi8<char>, vi8<ushort>>),
std::is_signed_v<char>);
COMPARE((is_substitution_failure<vi8<char>, vi8<uint>>),
std::is_signed_v<char>);
COMPARE((is_substitution_failure<vi8<char>, vi8<ulong>>),
std::is_signed_v<char>);
COMPARE((is_substitution_failure<vi8<char>, vi8<ullong>>),
std::is_signed_v<char>);
if constexpr (std::is_signed_v<char>)
{
binary_op_return_type<vi8<short>, vi8<char>>();
binary_op_return_type<vi8<int>, vi8<char>>();
binary_op_return_type<vi8<long>, vi8<char>>();
binary_op_return_type<vi8<llong>, vi8<char>>();
}
else
{
binary_op_return_type<vi8<ushort>, vi8<char>>();
binary_op_return_type<vi8<uint>, vi8<char>>();
binary_op_return_type<vi8<ulong>, vi8<char>>();
binary_op_return_type<vi8<ullong>, vi8<char>>();
}
binary_op_return_type<vi8<float>, vi8<char>>();
binary_op_return_type<vi8<double>, vi8<char>>();
}
VERIFY((is_substitution_failure<vi8<char>, llong>));
VERIFY((is_substitution_failure<vi8<char>, double>));
VERIFY((is_substitution_failure<vchar, vxchar>));
VERIFY((is_substitution_failure<vchar, xchar>));
VERIFY((is_substitution_failure<vchar, short>));
VERIFY((is_substitution_failure<vchar, ushort>));
COMPARE((is_substitution_failure<vchar, uint>), std::is_signed_v<char>);
VERIFY((is_substitution_failure<vchar, long>));
VERIFY((is_substitution_failure<vchar, ulong>));
VERIFY((is_substitution_failure<vchar, llong>));
VERIFY((is_substitution_failure<vchar, ullong>));
VERIFY((is_substitution_failure<vchar, float>));
VERIFY((is_substitution_failure<vchar, double>));
VERIFY((is_substitution_failure<vchar, vi8<char>>));
VERIFY((is_substitution_failure<vchar, vi8<uchar>>));
VERIFY((is_substitution_failure<vchar, vi8<schar>>));
VERIFY((is_substitution_failure<vchar, vi8<short>>));
VERIFY((is_substitution_failure<vchar, vi8<ushort>>));
VERIFY((is_substitution_failure<vchar, vi8<int>>));
VERIFY((is_substitution_failure<vchar, vi8<uint>>));
VERIFY((is_substitution_failure<vchar, vi8<long>>));
VERIFY((is_substitution_failure<vchar, vi8<ulong>>));
VERIFY((is_substitution_failure<vchar, vi8<llong>>));
VERIFY((is_substitution_failure<vchar, vi8<ullong>>));
VERIFY((is_substitution_failure<vchar, vi8<float>>));
VERIFY((is_substitution_failure<vchar, vi8<double>>));
VERIFY((is_substitution_failure<vi8<char>, vchar>));
VERIFY((is_substitution_failure<vi8<char>, vuchar>));
VERIFY((is_substitution_failure<vi8<char>, vschar>));
VERIFY((is_substitution_failure<vi8<char>, xchar>));
VERIFY((is_substitution_failure<vi8<char>, short>));
VERIFY((is_substitution_failure<vi8<char>, ushort>));
COMPARE((is_substitution_failure<vi8<char>, uint>),
std::is_signed_v<char>);
VERIFY((is_substitution_failure<vi8<char>, long>));
VERIFY((is_substitution_failure<vi8<char>, ulong>));
VERIFY((is_substitution_failure<vi8<char>, ullong>));
VERIFY((is_substitution_failure<vi8<char>, float>));
// conversion between any char types must fail because the dst type's
// integer conversion rank isn't greater (as required by 9.6.4p4.3)
VERIFY((is_substitution_failure<vi8<char>, vi8<schar>>));
VERIFY((is_substitution_failure<vi8<char>, vi8<uchar>>));
}
else if constexpr (std::is_same_v<V, vschar>)
{
binary_op_return_type<vi8<schar>, schar, vi8<schar>>();
binary_op_return_type<vi8<schar>, int, vi8<schar>>();
binary_op_return_type<vi8<schar>, vi8<schar>, vi8<schar>>();
if constexpr (vi8<schar>::size() <= simd_abi::max_fixed_size<short>)
{
binary_op_return_type<vi8<short>, vi8<schar>>();
binary_op_return_type<vi8<int>, vi8<schar>>();
binary_op_return_type<vi8<long>, vi8<schar>>();
binary_op_return_type<vi8<llong>, vi8<schar>>();
binary_op_return_type<vi8<float>, vi8<schar>>();
binary_op_return_type<vi8<double>, vi8<schar>>();
}
VERIFY((is_substitution_failure<vi8<schar>, llong>));
VERIFY((is_substitution_failure<vi8<schar>, double>));
VERIFY((is_substitution_failure<vschar, vuchar>));
VERIFY((is_substitution_failure<vschar, uchar>));
VERIFY((is_substitution_failure<vschar, short>));
VERIFY((is_substitution_failure<vschar, ushort>));
VERIFY((is_substitution_failure<vschar, uint>));
VERIFY((is_substitution_failure<vschar, long>));
VERIFY((is_substitution_failure<vschar, ulong>));
VERIFY((is_substitution_failure<vschar, llong>));
VERIFY((is_substitution_failure<vschar, ullong>));
VERIFY((is_substitution_failure<vschar, float>));
VERIFY((is_substitution_failure<vschar, double>));
VERIFY((is_substitution_failure<vschar, vi8<schar>>));
VERIFY((is_substitution_failure<vschar, vi8<uchar>>));
VERIFY((is_substitution_failure<vschar, vi8<short>>));
VERIFY((is_substitution_failure<vschar, vi8<ushort>>));
VERIFY((is_substitution_failure<vschar, vi8<int>>));
VERIFY((is_substitution_failure<vschar, vi8<uint>>));
VERIFY((is_substitution_failure<vschar, vi8<long>>));
VERIFY((is_substitution_failure<vschar, vi8<ulong>>));
VERIFY((is_substitution_failure<vschar, vi8<llong>>));
VERIFY((is_substitution_failure<vschar, vi8<ullong>>));
VERIFY((is_substitution_failure<vschar, vi8<float>>));
VERIFY((is_substitution_failure<vschar, vi8<double>>));
VERIFY((is_substitution_failure<vi8<schar>, vschar>));
VERIFY((is_substitution_failure<vi8<schar>, vuchar>));
VERIFY((is_substitution_failure<vi8<schar>, uchar>));
VERIFY((is_substitution_failure<vi8<schar>, short>));
VERIFY((is_substitution_failure<vi8<schar>, ushort>));
VERIFY((is_substitution_failure<vi8<schar>, uint>));
VERIFY((is_substitution_failure<vi8<schar>, long>));
VERIFY((is_substitution_failure<vi8<schar>, ulong>));
VERIFY((is_substitution_failure<vi8<schar>, ullong>));
VERIFY((is_substitution_failure<vi8<schar>, float>));
VERIFY((is_substitution_failure<vi8<schar>, vi8<uchar>>));
VERIFY((is_substitution_failure<vi8<schar>, vi8<ushort>>));
VERIFY((is_substitution_failure<vi8<schar>, vi8<uint>>));
VERIFY((is_substitution_failure<vi8<schar>, vi8<ulong>>));
VERIFY((is_substitution_failure<vi8<schar>, vi8<ullong>>));
}
else if constexpr (std::is_same_v<V, vuchar>)
{
VERIFY((is_substitution_failure<vi8<uchar>, llong>));
binary_op_return_type<vuchar, uint, vuchar>();
binary_op_return_type<vi8<uchar>, uchar, vi8<uchar>>();
binary_op_return_type<vi8<uchar>, int, vi8<uchar>>();
binary_op_return_type<vi8<uchar>, uint, vi8<uchar>>();
binary_op_return_type<vi8<uchar>, vi8<uchar>, vi8<uchar>>();
if constexpr (vi8<schar>::size() <= simd_abi::max_fixed_size<short>)
{
binary_op_return_type<vi8<short>, vi8<uchar>>();
binary_op_return_type<vi8<ushort>, vi8<uchar>>();
binary_op_return_type<vi8<int>, vi8<uchar>>();
binary_op_return_type<vi8<uint>, vi8<uchar>>();
binary_op_return_type<vi8<long>, vi8<uchar>>();
binary_op_return_type<vi8<ulong>, vi8<uchar>>();
binary_op_return_type<vi8<llong>, vi8<uchar>>();
binary_op_return_type<vi8<ullong>, vi8<uchar>>();
binary_op_return_type<vi8<float>, vi8<uchar>>();
binary_op_return_type<vi8<double>, vi8<uchar>>();
}
VERIFY((is_substitution_failure<vi8<uchar>, ullong>));
VERIFY((is_substitution_failure<vi8<uchar>, double>));
VERIFY((is_substitution_failure<vuchar, schar>));
VERIFY((is_substitution_failure<vuchar, vschar>));
VERIFY((is_substitution_failure<vuchar, short>));
VERIFY((is_substitution_failure<vuchar, ushort>));
VERIFY((is_substitution_failure<vuchar, long>));
VERIFY((is_substitution_failure<vuchar, ulong>));
VERIFY((is_substitution_failure<vuchar, llong>));
VERIFY((is_substitution_failure<vuchar, ullong>));
VERIFY((is_substitution_failure<vuchar, float>));
VERIFY((is_substitution_failure<vuchar, double>));
VERIFY((is_substitution_failure<vuchar, vi8<schar>>));
VERIFY((is_substitution_failure<vuchar, vi8<uchar>>));
VERIFY((is_substitution_failure<vuchar, vi8<short>>));
VERIFY((is_substitution_failure<vuchar, vi8<ushort>>));
VERIFY((is_substitution_failure<vuchar, vi8<int>>));
VERIFY((is_substitution_failure<vuchar, vi8<uint>>));
VERIFY((is_substitution_failure<vuchar, vi8<long>>));
VERIFY((is_substitution_failure<vuchar, vi8<ulong>>));
VERIFY((is_substitution_failure<vuchar, vi8<llong>>));
VERIFY((is_substitution_failure<vuchar, vi8<ullong>>));
VERIFY((is_substitution_failure<vuchar, vi8<float>>));
VERIFY((is_substitution_failure<vuchar, vi8<double>>));
VERIFY((is_substitution_failure<vi8<uchar>, schar>));
VERIFY((is_substitution_failure<vi8<uchar>, vschar>));
VERIFY((is_substitution_failure<vi8<uchar>, vuchar>));
VERIFY((is_substitution_failure<vi8<uchar>, short>));
VERIFY((is_substitution_failure<vi8<uchar>, ushort>));
VERIFY((is_substitution_failure<vi8<uchar>, long>));
VERIFY((is_substitution_failure<vi8<uchar>, ulong>));
VERIFY((is_substitution_failure<vi8<uchar>, float>));
VERIFY((is_substitution_failure<vi8<uchar>, vi8<schar>>));
}
}