blob: d1bfea7a7946e6fd5399c9d5359c07de1cffc874 [file] [log] [blame]
// { dg-options "-std=gnu++17" }
// { dg-do compile { target c++17 } }
// { dg-require-cmath "" }
#include <experimental/simd>
namespace stdx = std::experimental;
template <typename T, typename V>
void
test01()
{
constexpr T data[V::size()] = {};
constexpr auto a = V(data, stdx::element_aligned);
constexpr auto b = []() constexpr {
V x = T(1);
where(x > T(), x) = T();
where(x < T(), x) += T();
where(x >= T(), x) -= T();
where(x <= T(), x) *= T();
where(x == T(), x) /= T(1);
where(x != T(), x) += T(1);
return x;
}();
constexpr T c = V()[0];
constexpr auto d = !V() && !!V() || !V() & !V() | !V() ^ !V();
constexpr auto e = []() constexpr {
T data[V::size()] = {};
V(T(1)).copy_to(data, stdx::element_aligned);
V x = T();
x[0] = T(1);
x.copy_from(data, stdx::element_aligned);
bool mask[V::size()] = {};
auto k = hmin(x + x - x * x) == x / x;
k.copy_to(mask, stdx::element_aligned);
mask[0] = false;
using M = typename V::mask_type;
return M(mask, stdx::element_aligned);
}();
static_assert(not e[0]);
static_assert(popcount(e) == V::size() - 1);
static_assert(all_of(V(T(1)) == []() constexpr {
float data[V::size()] = {};
V(T(1)).copy_to(data, stdx::element_aligned);
V x = T();
x.copy_from(data, stdx::element_aligned);
return x;
}()));
static_assert(hmin(V()) == T());
static_assert(hmax(V()) == T());
static_assert(reduce(V(1)) == T(V::size()));
}
template <typename T>
void
iterate_abis()
{
test01<T, stdx::simd<T, stdx::simd_abi::scalar>>();
test01<T, stdx::simd<T>>();
test01<T, stdx::native_simd<T>>();
test01<T, stdx::fixed_size_simd<T, 3>>();
test01<T, stdx::fixed_size_simd<T, stdx::simd_abi::max_fixed_size<T> - 4>>();
}
int main()
{
iterate_abis<char>();
iterate_abis<wchar_t>();
iterate_abis<char16_t>();
iterate_abis<char32_t>();
iterate_abis<signed char>();
iterate_abis<unsigned char>();
iterate_abis<short>();
iterate_abis<unsigned short>();
iterate_abis<int>();
iterate_abis<unsigned int>();
iterate_abis<long>();
iterate_abis<unsigned long>();
iterate_abis<long long>();
iterate_abis<unsigned long long>();
iterate_abis<float>();
iterate_abis<double>();
iterate_abis<long double>();
}