// 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