// Copyright (C) 2020-2023 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 // . // expensive: * [1-9] * * #include "bits/main.h" // type with sizeof(char) but different signedness using xchar = std::conditional_t, schar, uchar>; using vschar = std::experimental::native_simd; using vuchar = std::experimental::native_simd; using vshort = std::experimental::native_simd; using vushort = std::experimental::native_simd; using vint = std::experimental::native_simd; using vuint = std::experimental::native_simd; using vlong = std::experimental::native_simd; using vulong = std::experimental::native_simd; using vllong = std::experimental::native_simd; using vullong = std::experimental::native_simd; using vfloat = std::experimental::native_simd; using vdouble = std::experimental::native_simd; using vldouble = std::experimental::native_simd; using vchar = std::experimental::native_simd; using vxchar = std::experimental::native_simd; template using vi8 = std::experimental::fixed_size_simd; template using vi16 = std::experimental::fixed_size_simd; template using vf32 = std::experimental::fixed_size_simd; template using vi32 = std::experimental::fixed_size_simd; template using vf64 = std::experimental::fixed_size_simd; template using vi64 = std::experimental::fixed_size_simd; template using vl = typename std::conditional, vi32>::type; template void binary_op_return_type() { using namespace vir::test; static_assert(std::is_same::value, ""); using AC = std::add_const_t; using BC = std::add_const_t; 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 void test() { using T = typename V::value_type; namespace simd_abi = std::experimental::simd_abi; binary_op_return_type(); binary_op_return_type(); binary_op_return_type(); if constexpr (std::is_same_v) { binary_op_return_type(); binary_op_return_type(); binary_op_return_type(); binary_op_return_type(); binary_op_return_type, schar>(); binary_op_return_type, uchar>(); binary_op_return_type, short>(); binary_op_return_type, ushort>(); binary_op_return_type, int>(); binary_op_return_type, float>(); binary_op_return_type, vf32>(); binary_op_return_type, vf32>(); binary_op_return_type, vf32>(); binary_op_return_type, vf32>(); binary_op_return_type, vf32>(); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure, vfloat>)); VERIFY((is_substitution_failure, uint>)); VERIFY((is_substitution_failure, long>)); VERIFY((is_substitution_failure, ulong>)); VERIFY((is_substitution_failure, llong>)); VERIFY((is_substitution_failure, ullong>)); VERIFY((is_substitution_failure, double>)); VERIFY((is_substitution_failure, vf32>)); VERIFY((is_substitution_failure, vf32>)); VERIFY((is_substitution_failure, vf32>)); VERIFY((is_substitution_failure, vf32>)); VERIFY((is_substitution_failure, vf32>)); VERIFY((is_substitution_failure, vf32>)); VERIFY((is_substitution_failure>)); } else if constexpr (std::is_same_v) { binary_op_return_type(); binary_op_return_type(); binary_op_return_type(); binary_op_return_type(); binary_op_return_type(); binary_op_return_type(); binary_op_return_type, schar>(); binary_op_return_type, uchar>(); binary_op_return_type, short>(); binary_op_return_type, ushort>(); binary_op_return_type, uint>(); binary_op_return_type, int, vf64>(); binary_op_return_type, float, vf64>(); binary_op_return_type, double, vf64>(); binary_op_return_type, vf64, vf64>(); binary_op_return_type, schar>(); binary_op_return_type, uchar>(); binary_op_return_type, short>(); binary_op_return_type, ushort>(); binary_op_return_type, uint>(); binary_op_return_type, int, vf32>(); binary_op_return_type, float, vf32>(); binary_op_return_type, double, vf32>(); binary_op_return_type, vf64>(); binary_op_return_type, vf64>(); binary_op_return_type, vf64>(); binary_op_return_type, vf64>(); binary_op_return_type, vf64>(); binary_op_return_type, vf64>(); binary_op_return_type, vf64>(); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure, vdouble>)); VERIFY((is_substitution_failure, llong>)); VERIFY((is_substitution_failure, ullong>)); VERIFY((is_substitution_failure, vf64>)); VERIFY((is_substitution_failure, vf64>)); VERIFY((is_substitution_failure, llong>)); VERIFY((is_substitution_failure, ullong>)); if constexpr (sizeof(long) == sizeof(llong)) { VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure, long>)); VERIFY((is_substitution_failure, ulong>)); VERIFY((is_substitution_failure, vf64>)); VERIFY((is_substitution_failure, vf64>)); VERIFY((is_substitution_failure, long>)); VERIFY((is_substitution_failure, ulong>)); } else { binary_op_return_type(); binary_op_return_type(); binary_op_return_type, long>(); binary_op_return_type, ulong>(); binary_op_return_type, vf64>(); binary_op_return_type, vf64>(); binary_op_return_type, long>(); binary_op_return_type, ulong>(); } } else if constexpr (std::is_same_v) { binary_op_return_type(); binary_op_return_type(); binary_op_return_type(); binary_op_return_type(); binary_op_return_type(); binary_op_return_type(); binary_op_return_type(); binary_op_return_type(); binary_op_return_type(); binary_op_return_type, schar>(); binary_op_return_type, uchar>(); binary_op_return_type, short>(); binary_op_return_type, ushort>(); binary_op_return_type, int>(); binary_op_return_type, uint>(); binary_op_return_type, long>(); binary_op_return_type, ulong>(); binary_op_return_type, float>(); binary_op_return_type, double>(); binary_op_return_type, vf64>(); using std::experimental::simd; using A = simd_abi::fixed_size; binary_op_return_type, schar>(); binary_op_return_type, uchar>(); binary_op_return_type, short>(); binary_op_return_type, ushort>(); binary_op_return_type, int>(); binary_op_return_type, uint>(); binary_op_return_type, long>(); binary_op_return_type, ulong>(); binary_op_return_type, float>(); binary_op_return_type, double>(); if constexpr (sizeof(ldouble) == sizeof(double)) { VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure, llong>)); VERIFY((is_substitution_failure, ullong>)); VERIFY((is_substitution_failure, llong>)); VERIFY((is_substitution_failure, ullong>)); } else { binary_op_return_type(); binary_op_return_type(); binary_op_return_type, llong>(); binary_op_return_type, ullong>(); binary_op_return_type, llong>(); binary_op_return_type, ullong>(); } VERIFY((is_substitution_failure, vldouble>)); COMPARE((is_substitution_failure, vldouble>), (!std::is_same::value)); } else if constexpr (std::is_same_v) { VERIFY((is_substitution_failure, double>)); VERIFY((is_substitution_failure, float>)); VERIFY((is_substitution_failure, vi32>)); if constexpr (sizeof(long) == sizeof(llong)) { binary_op_return_type(); binary_op_return_type(); binary_op_return_type, uint>(); binary_op_return_type, llong>(); binary_op_return_type, uint>(); binary_op_return_type, llong>(); binary_op_return_type, vi32>(); binary_op_return_type, vi64>(); VERIFY((is_substitution_failure, vi32>)); VERIFY((is_substitution_failure, vi64>)); } else { VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure, uint>)); VERIFY((is_substitution_failure, llong>)); VERIFY((is_substitution_failure, uint>)); VERIFY((is_substitution_failure, llong>)); VERIFY((is_substitution_failure, vi32>)); VERIFY((is_substitution_failure, vi64>)); binary_op_return_type, vi32>(); binary_op_return_type, vi64>(); } binary_op_return_type(); binary_op_return_type(); binary_op_return_type(); binary_op_return_type(); binary_op_return_type, schar, vi32>(); binary_op_return_type, uchar, vi32>(); binary_op_return_type, short, vi32>(); binary_op_return_type, ushort, vi32>(); binary_op_return_type, int, vi32>(); binary_op_return_type, long, vi32>(); binary_op_return_type, vi32, vi32>(); binary_op_return_type, schar, vi64>(); binary_op_return_type, uchar, vi64>(); binary_op_return_type, short, vi64>(); binary_op_return_type, ushort, vi64>(); binary_op_return_type, int, vi64>(); binary_op_return_type, long, vi64>(); binary_op_return_type, vi64, vi64>(); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure, vlong>)); VERIFY((is_substitution_failure, vulong>)); VERIFY((is_substitution_failure, ulong>)); VERIFY((is_substitution_failure, ullong>)); binary_op_return_type, vi32>(); binary_op_return_type, vi32>(); binary_op_return_type, vi32>(); binary_op_return_type, vi32>(); binary_op_return_type, vi32>(); VERIFY((is_substitution_failure, vi32>)); VERIFY((is_substitution_failure, vi32>)); VERIFY((is_substitution_failure, ulong>)); VERIFY((is_substitution_failure, ullong>)); VERIFY((is_substitution_failure, float>)); VERIFY((is_substitution_failure, double>)); binary_op_return_type, vi64>(); binary_op_return_type, vi64>(); binary_op_return_type, vi64>(); binary_op_return_type, vi64>(); binary_op_return_type, vi64>(); VERIFY((is_substitution_failure, vi64>)); VERIFY((is_substitution_failure, vi64>)); VERIFY((is_substitution_failure, vi64>)); binary_op_return_type, vi32>(); binary_op_return_type, vi64>(); } else if constexpr (std::is_same_v) { if constexpr (sizeof(long) == sizeof(llong)) { binary_op_return_type(); binary_op_return_type, ullong, vi32>(); binary_op_return_type, ullong, vi64>(); VERIFY((is_substitution_failure, vi32>)); VERIFY((is_substitution_failure, vi32>)); VERIFY((is_substitution_failure, vi64>)); VERIFY((is_substitution_failure, vi64>)); } else { VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure, ullong>)); VERIFY((is_substitution_failure, ullong>)); binary_op_return_type, vi32>(); binary_op_return_type, vi32>(); binary_op_return_type, vi64>(); binary_op_return_type, vi64>(); } binary_op_return_type(); binary_op_return_type(); binary_op_return_type(); binary_op_return_type, uchar, vi32>(); binary_op_return_type, ushort, vi32>(); binary_op_return_type, int, vi32>(); binary_op_return_type, uint, vi32>(); binary_op_return_type, ulong, vi32>(); binary_op_return_type, vi32, vi32>(); binary_op_return_type, uchar, vi64>(); binary_op_return_type, ushort, vi64>(); binary_op_return_type, int, vi64>(); binary_op_return_type, uint, vi64>(); binary_op_return_type, ulong, vi64>(); binary_op_return_type, vi64, vi64>(); VERIFY((is_substitution_failure, llong>)); VERIFY((is_substitution_failure, float>)); VERIFY((is_substitution_failure, double>)); VERIFY((is_substitution_failure, vi32>)); VERIFY((is_substitution_failure, vi64>)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure, vlong>)); VERIFY((is_substitution_failure, vulong>)); VERIFY((is_substitution_failure, schar>)); VERIFY((is_substitution_failure, short>)); VERIFY((is_substitution_failure, long>)); VERIFY((is_substitution_failure, vi32>)); binary_op_return_type, vi32>(); VERIFY((is_substitution_failure, vi32>)); binary_op_return_type, vi32>(); VERIFY((is_substitution_failure, vi32>)); binary_op_return_type, vi32>(); VERIFY((is_substitution_failure, vi32>)); binary_op_return_type, vi32>(); VERIFY((is_substitution_failure, schar>)); VERIFY((is_substitution_failure, short>)); VERIFY((is_substitution_failure, long>)); VERIFY((is_substitution_failure, llong>)); VERIFY((is_substitution_failure, float>)); VERIFY((is_substitution_failure, double>)); VERIFY((is_substitution_failure, vi64>)); binary_op_return_type, vi64>(); VERIFY((is_substitution_failure, vi64>)); binary_op_return_type, vi64>(); VERIFY((is_substitution_failure, vi64>)); binary_op_return_type, vi64>(); VERIFY((is_substitution_failure, vi64>)); binary_op_return_type, vi64>(); } else if constexpr (std::is_same_v) { binary_op_return_type(); binary_op_return_type(); binary_op_return_type(); binary_op_return_type(); binary_op_return_type(); binary_op_return_type(); binary_op_return_type, schar, vi32>(); binary_op_return_type, uchar, vi32>(); binary_op_return_type, short, vi32>(); binary_op_return_type, ushort, vi32>(); binary_op_return_type, int, vi32>(); binary_op_return_type, uint, vi32>(); binary_op_return_type, long, vi32>(); binary_op_return_type, llong, vi32>(); binary_op_return_type, vi32, vi32>(); binary_op_return_type, schar, vi64>(); binary_op_return_type, uchar, vi64>(); binary_op_return_type, short, vi64>(); binary_op_return_type, ushort, vi64>(); binary_op_return_type, int, vi64>(); binary_op_return_type, uint, vi64>(); binary_op_return_type, long, vi64>(); binary_op_return_type, llong, vi64>(); binary_op_return_type, vi64>(); binary_op_return_type, vi32>(); binary_op_return_type, vi32>(); binary_op_return_type, vi32>(); binary_op_return_type, vi32>(); binary_op_return_type, vi32>(); binary_op_return_type, vi32>(); binary_op_return_type, vi32>(); if constexpr (sizeof(long) == sizeof(llong)) { VERIFY((is_substitution_failure, vi32>)); VERIFY((is_substitution_failure, ulong>)); VERIFY((is_substitution_failure, ulong>)); VERIFY((is_substitution_failure)); } else { binary_op_return_type, vi32>(); binary_op_return_type, ulong>(); binary_op_return_type, ulong>(); binary_op_return_type(); } VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure, ullong>)); VERIFY((is_substitution_failure, float>)); VERIFY((is_substitution_failure, double>)); VERIFY((is_substitution_failure, vi32>)); VERIFY((is_substitution_failure, vi32>)); VERIFY((is_substitution_failure, vi32>)); VERIFY((is_substitution_failure, vllong>)); VERIFY((is_substitution_failure, vullong>)); VERIFY((is_substitution_failure, ullong>)); VERIFY((is_substitution_failure, float>)); VERIFY((is_substitution_failure, double>)); binary_op_return_type, vi64>(); binary_op_return_type, vi64>(); binary_op_return_type, vi64>(); binary_op_return_type, vi64>(); binary_op_return_type, vi64>(); binary_op_return_type, vi64>(); binary_op_return_type, vi64>(); if constexpr (sizeof(long) == sizeof(llong)) { VERIFY((is_substitution_failure, vi64>)); } else { binary_op_return_type, vi64>(); } VERIFY((is_substitution_failure, vi64>)); VERIFY((is_substitution_failure, vi64>)); VERIFY((is_substitution_failure, vi64>)); } else if constexpr (std::is_same_v) { binary_op_return_type(); binary_op_return_type(); binary_op_return_type(); binary_op_return_type(); binary_op_return_type, uchar, vi32>(); binary_op_return_type, ushort, vi32>(); binary_op_return_type, int, vi32>(); binary_op_return_type, uint, vi32>(); binary_op_return_type, ulong, vi32>(); binary_op_return_type, ullong, vi32>(); binary_op_return_type, vi32, vi32>(); binary_op_return_type, uchar, vi64>(); binary_op_return_type, ushort, vi64>(); binary_op_return_type, int, vi64>(); binary_op_return_type, uint, vi64>(); binary_op_return_type, ulong, vi64>(); binary_op_return_type, ullong, vi64>(); binary_op_return_type, vi64, vi64>(); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure, schar>)); VERIFY((is_substitution_failure, short>)); VERIFY((is_substitution_failure, long>)); VERIFY((is_substitution_failure, llong>)); VERIFY((is_substitution_failure, float>)); VERIFY((is_substitution_failure, double>)); VERIFY((is_substitution_failure, vi32>)); binary_op_return_type, vi32>(); VERIFY((is_substitution_failure, vi32>)); binary_op_return_type, vi32>(); VERIFY((is_substitution_failure, vi32>)); binary_op_return_type, vi32>(); VERIFY((is_substitution_failure, vi32>)); binary_op_return_type, vi32>(); VERIFY((is_substitution_failure, vi32>)); VERIFY((is_substitution_failure, vi32>)); VERIFY((is_substitution_failure, vi32>)); VERIFY((is_substitution_failure, schar>)); VERIFY((is_substitution_failure, short>)); VERIFY((is_substitution_failure, long>)); VERIFY((is_substitution_failure, llong>)); VERIFY((is_substitution_failure, vllong>)); VERIFY((is_substitution_failure, vullong>)); VERIFY((is_substitution_failure, float>)); VERIFY((is_substitution_failure, double>)); VERIFY((is_substitution_failure, vi64>)); binary_op_return_type, vi64>(); VERIFY((is_substitution_failure, vi64>)); binary_op_return_type, vi64>(); VERIFY((is_substitution_failure, vi64>)); binary_op_return_type, vi64>(); VERIFY((is_substitution_failure, vi64>)); binary_op_return_type, vi64>(); VERIFY((is_substitution_failure, vi64>)); VERIFY((is_substitution_failure, vi64>)); VERIFY((is_substitution_failure, vi64>)); } else if constexpr (std::is_same_v) { binary_op_return_type(); binary_op_return_type(); binary_op_return_type(); binary_op_return_type(); binary_op_return_type, schar, vi32>(); binary_op_return_type, uchar, vi32>(); binary_op_return_type, short, vi32>(); binary_op_return_type, ushort, vi32>(); binary_op_return_type, int, vi32>(); binary_op_return_type, vi32, vi32>(); binary_op_return_type, vi32>(); binary_op_return_type, vi32>(); binary_op_return_type, vi32>(); binary_op_return_type, vi32>(); binary_op_return_type, vi32>(); binary_op_return_type, vi32>(); // 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 + llong will // produce a vi32 if a vi32 operator test is done before the // vi32 + llong test. VERIFY((is_substitution_failure, double>)); VERIFY((is_substitution_failure, float>)); VERIFY((is_substitution_failure, llong>)); VERIFY((is_substitution_failure, vi32>)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure, vint>)); VERIFY((is_substitution_failure, vuint>)); VERIFY((is_substitution_failure, uint>)); VERIFY((is_substitution_failure, ulong>)); VERIFY((is_substitution_failure, ullong>)); VERIFY((is_substitution_failure, vi32>)); VERIFY((is_substitution_failure, vi32>)); VERIFY((is_substitution_failure, vi32>)); binary_op_return_type, vi32>(); if constexpr (sizeof(long) == sizeof(llong)) { VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure, long>)); } else { binary_op_return_type(); binary_op_return_type, long>(); } } else if constexpr (std::is_same_v) { VERIFY((is_substitution_failure, llong>)); VERIFY((is_substitution_failure, ullong>)); VERIFY((is_substitution_failure, float>)); VERIFY((is_substitution_failure, double>)); VERIFY((is_substitution_failure, vi32>)); binary_op_return_type(); binary_op_return_type(); binary_op_return_type, uchar, vi32>(); binary_op_return_type, ushort, vi32>(); binary_op_return_type, int, vi32>(); binary_op_return_type, uint, vi32>(); binary_op_return_type, vi32, vi32>(); binary_op_return_type, vi32>(); binary_op_return_type, vi32>(); binary_op_return_type, vi32>(); binary_op_return_type, vi32>(); binary_op_return_type, vi32>(); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure, schar>)); VERIFY((is_substitution_failure, short>)); VERIFY((is_substitution_failure, vint>)); VERIFY((is_substitution_failure, vuint>)); VERIFY((is_substitution_failure, long>)); VERIFY((is_substitution_failure, vi32>)); VERIFY((is_substitution_failure, vi32>)); VERIFY((is_substitution_failure, vi32>)); binary_op_return_type, vi32>(); if constexpr (sizeof(long) == sizeof(llong)) { VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure, ulong>)); binary_op_return_type, vi32>(); } else { binary_op_return_type(); binary_op_return_type, ulong>(); VERIFY((is_substitution_failure, vi32>)); } } else if constexpr (std::is_same_v) { binary_op_return_type(); binary_op_return_type(); binary_op_return_type, schar, vi16>(); binary_op_return_type, uchar, vi16>(); binary_op_return_type, short, vi16>(); binary_op_return_type, int, vi16>(); binary_op_return_type, vi16>(); binary_op_return_type, vi16>(); binary_op_return_type, vi16>(); binary_op_return_type, vi16>(); binary_op_return_type, vi16>(); binary_op_return_type, vi16>(); binary_op_return_type, vi16>(); binary_op_return_type, vi16>(); VERIFY((is_substitution_failure, double>)); VERIFY((is_substitution_failure, llong>)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure, vshort>)); VERIFY((is_substitution_failure, vushort>)); VERIFY((is_substitution_failure, ushort>)); VERIFY((is_substitution_failure, uint>)); VERIFY((is_substitution_failure, long>)); VERIFY((is_substitution_failure, ulong>)); VERIFY((is_substitution_failure, ullong>)); VERIFY((is_substitution_failure, float>)); VERIFY((is_substitution_failure, vi16>)); VERIFY((is_substitution_failure, vi16>)); VERIFY((is_substitution_failure, vi16>)); VERIFY((is_substitution_failure, vi16>)); } else if constexpr (std::is_same_v) { binary_op_return_type(); binary_op_return_type(); binary_op_return_type, uchar, vi16>(); binary_op_return_type, ushort, vi16>(); binary_op_return_type, int, vi16>(); binary_op_return_type, uint, vi16>(); binary_op_return_type, vi16>(); binary_op_return_type, vi16>(); binary_op_return_type, vi16>(); binary_op_return_type, vi16>(); binary_op_return_type, vi16>(); binary_op_return_type, vi16>(); binary_op_return_type, vi16>(); binary_op_return_type, vi16>(); binary_op_return_type, vi16>(); binary_op_return_type, vi16>(); VERIFY((is_substitution_failure, llong>)); VERIFY((is_substitution_failure, ullong>)); VERIFY((is_substitution_failure, double>)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure, schar>)); VERIFY((is_substitution_failure, short>)); VERIFY((is_substitution_failure, vshort>)); VERIFY((is_substitution_failure, vushort>)); VERIFY((is_substitution_failure, long>)); VERIFY((is_substitution_failure, ulong>)); VERIFY((is_substitution_failure, float>)); VERIFY((is_substitution_failure, vi16>)); VERIFY((is_substitution_failure, vi16>)); } else if constexpr (std::is_same_v) { binary_op_return_type, char, vi8>(); binary_op_return_type, int, vi8>(); binary_op_return_type, vi8, vi8>(); if constexpr (vi8::size() <= simd_abi::max_fixed_size) { VERIFY(!(is_substitution_failure, vi8>)); VERIFY(!(is_substitution_failure, vi8>)); VERIFY(!(is_substitution_failure, vi8>)); VERIFY(!(is_substitution_failure, vi8>)); COMPARE((is_substitution_failure, vi8>), std::is_signed_v); COMPARE((is_substitution_failure, vi8>), std::is_signed_v); COMPARE((is_substitution_failure, vi8>), std::is_signed_v); COMPARE((is_substitution_failure, vi8>), std::is_signed_v); if constexpr (std::is_signed_v) { binary_op_return_type, vi8>(); binary_op_return_type, vi8>(); binary_op_return_type, vi8>(); binary_op_return_type, vi8>(); } else { binary_op_return_type, vi8>(); binary_op_return_type, vi8>(); binary_op_return_type, vi8>(); binary_op_return_type, vi8>(); } binary_op_return_type, vi8>(); binary_op_return_type, vi8>(); } VERIFY((is_substitution_failure, llong>)); VERIFY((is_substitution_failure, double>)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); COMPARE((is_substitution_failure), std::is_signed_v); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure, vchar>)); VERIFY((is_substitution_failure, vuchar>)); VERIFY((is_substitution_failure, vschar>)); VERIFY((is_substitution_failure, xchar>)); VERIFY((is_substitution_failure, short>)); VERIFY((is_substitution_failure, ushort>)); COMPARE((is_substitution_failure, uint>), std::is_signed_v); VERIFY((is_substitution_failure, long>)); VERIFY((is_substitution_failure, ulong>)); VERIFY((is_substitution_failure, ullong>)); VERIFY((is_substitution_failure, 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>)); VERIFY((is_substitution_failure, vi8>)); } else if constexpr (std::is_same_v) { binary_op_return_type, schar, vi8>(); binary_op_return_type, int, vi8>(); binary_op_return_type, vi8, vi8>(); if constexpr (vi8::size() <= simd_abi::max_fixed_size) { binary_op_return_type, vi8>(); binary_op_return_type, vi8>(); binary_op_return_type, vi8>(); binary_op_return_type, vi8>(); binary_op_return_type, vi8>(); binary_op_return_type, vi8>(); } VERIFY((is_substitution_failure, llong>)); VERIFY((is_substitution_failure, double>)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure, vschar>)); VERIFY((is_substitution_failure, vuchar>)); VERIFY((is_substitution_failure, uchar>)); VERIFY((is_substitution_failure, short>)); VERIFY((is_substitution_failure, ushort>)); VERIFY((is_substitution_failure, uint>)); VERIFY((is_substitution_failure, long>)); VERIFY((is_substitution_failure, ulong>)); VERIFY((is_substitution_failure, ullong>)); VERIFY((is_substitution_failure, float>)); VERIFY((is_substitution_failure, vi8>)); VERIFY((is_substitution_failure, vi8>)); VERIFY((is_substitution_failure, vi8>)); VERIFY((is_substitution_failure, vi8>)); VERIFY((is_substitution_failure, vi8>)); } else if constexpr (std::is_same_v) { VERIFY((is_substitution_failure, llong>)); binary_op_return_type(); binary_op_return_type, uchar, vi8>(); binary_op_return_type, int, vi8>(); binary_op_return_type, uint, vi8>(); binary_op_return_type, vi8, vi8>(); if constexpr (vi8::size() <= simd_abi::max_fixed_size) { binary_op_return_type, vi8>(); binary_op_return_type, vi8>(); binary_op_return_type, vi8>(); binary_op_return_type, vi8>(); binary_op_return_type, vi8>(); binary_op_return_type, vi8>(); binary_op_return_type, vi8>(); binary_op_return_type, vi8>(); binary_op_return_type, vi8>(); binary_op_return_type, vi8>(); } VERIFY((is_substitution_failure, ullong>)); VERIFY((is_substitution_failure, double>)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure>)); VERIFY((is_substitution_failure, schar>)); VERIFY((is_substitution_failure, vschar>)); VERIFY((is_substitution_failure, vuchar>)); VERIFY((is_substitution_failure, short>)); VERIFY((is_substitution_failure, ushort>)); VERIFY((is_substitution_failure, long>)); VERIFY((is_substitution_failure, ulong>)); VERIFY((is_substitution_failure, float>)); VERIFY((is_substitution_failure, vi8>)); } }