| // { dg-do run { target c++26 } } | |
| // { dg-require-effective-target x86 } | |
| // { dg-additional-options "-msse2" } | |
| #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" } |