blob: 905c09d6449ddad571f3097f8cdfb50fd417b360 [file] [log] [blame]
// { dg-do run { target c++26 } }
// { dg-require-effective-target x86 }
#include "test_setup.h"
template <typename V>
struct Tests
{
using T = typename V::value_type;
using M = typename V::mask_type;
ADD_TEST(VecCatChunk) {
std::tuple{test_iota<V>, test_iota<V, 1>},
[](auto& t, const V v0, const V v1) {
auto c = cat(v0, v1);
t.verify_equal(c.size(), V::size() * 2);
for (int i = 0; i < V::size(); ++i)
t.verify_equal(c[i], v0[i])(i);
for (int i = 0; i < V::size(); ++i)
t.verify_equal(c[i + V::size()], v1[i])(i);
const auto [c0, c1] = simd::chunk<V>(c);
t.verify_equal(c0, v0);
t.verify_equal(c1, v1);
if constexpr (V::size() <= 35)
{
auto d = cat(v1, c, v0);
for (int i = 0; i < V::size(); ++i)
{
t.verify_equal(d[i], v1[i])(i);
t.verify_equal(d[i + V::size()], v0[i])(i);
t.verify_equal(d[i + 2 * V::size()], v1[i])(i);
t.verify_equal(d[i + 3 * V::size()], v0[i])(i);
}
const auto [...chunked] = simd::chunk<3>(d);
t.verify_equal(cat(chunked...), d);
}
}
};
ADD_TEST(MaskCatChunk) {
std::tuple{M([](int i) { return 1 == (i & 1); }), M([](int i) { return 1 == (i % 3); })},
[](auto& t, const M k0, const M k1) {
auto c = cat(k0, k1);
t.verify_equal(c.size(), V::size() * 2);
for (int i = 0; i < V::size(); ++i)
t.verify_equal(c[i], k0[i])(i);
for (int i = 0; i < V::size(); ++i)
t.verify_equal(c[i + V::size()], k1[i])(i);
const auto [c0, c1] = simd::chunk<M>(c);
t.verify_equal(c0, k0);
t.verify_equal(c1, k1);
if constexpr (V::size() <= 35)
{
auto d = cat(k1, c, k0);
for (int i = 0; i < V::size(); ++i)
{
t.verify_equal(d[i], k1[i])(i);
t.verify_equal(d[i + V::size()], k0[i])(i);
t.verify_equal(d[i + 2 * V::size()], k1[i])(i);
t.verify_equal(d[i + 3 * V::size()], k0[i])(i);
}
const auto [...chunked] = simd::chunk<3>(d);
t.verify_equal(cat(chunked...), d);
}
}
};
};
#include "create_tests.h" // { dg-prune-output "Wpsabi" }