blob: 1a7cc195851b0ffb2c0f10a3bd7065ba53c31f92 [file] [log] [blame]
// { dg-do run { target c++26 } }
// { dg-require-effective-target x86 }
#include "test_setup.h"
template <typename V>
requires (V::size() * sizeof(typename V::value_type) <= 70 * 4) // avoid exploding RAM usage
struct Tests<V>
{
using T = typename V::value_type;
using M = typename V::mask_type;
static constexpr int max = sizeof(T) == 8 ? 64 : 32;
ADD_TEST_N(known_shift, 4, std::is_integral_v<T>) {
std::tuple {test_iota<V, 0, 0>},
[]<int N>(auto& t, const V x) {
constexpr int shift = max * (N + 1) / 4 - 1;
constexpr V vshift = T(shift);
const V vshiftx = vshift ^ (x & std::cw<1>);
V ref([](T i) -> T { return i << shift; });
V refx([](T i) -> T { return i << (shift ^ (i & 1)); });
t.verify_equal(x << shift, ref)("{:d} << {:d}", x, shift);
t.verify_equal(x << vshift, ref)("{:d} << {:d}", x, vshift);
t.verify_equal(x << vshiftx, refx)("{:d} << {:d}", x, vshiftx);
const auto y = ~x;
ref = V([](T i) -> T { return T(~i) << shift; });
refx = V([](T i) -> T { return T(~i) << (shift ^ (i & 1)); });
t.verify_equal(y << shift, ref)("{:d} << {:d}", y, shift);
t.verify_equal(y << vshift, ref)("{:d} << {:d}", y, vshift);
t.verify_equal(y << vshiftx, refx)("{:d} << {:d}", y, vshiftx);
}
};
ADD_TEST(unknown_shift, std::is_integral_v<T>) {
std::tuple {test_iota<V, 0, 0>},
[](auto& t, const V x) {
if !consteval
{
for (int shift = 0; shift < max; ++shift)
{
const auto y = ~x;
shift = make_value_unknown(shift);
const V vshift = T(shift);
V ref([=](T i) -> T { return i << shift; });
t.verify_equal(x << shift, ref)("{:d} << {:d}", y, shift);
t.verify_equal(x << vshift, ref)("{:d} << {:d}", y, vshift);
ref = V([=](T i) -> T { return T(~i) << shift; });
t.verify_equal(y << shift, ref)("{:d} << {:d}", y, shift);
t.verify_equal(y << vshift, ref)("{:d} << {:d}", y, vshift);
}
}
}
};
};
template <typename V>
struct Tests
{};
void create_tests()
{
template for (auto t : {char(), short(), unsigned(), 0l, 0ull})
[[maybe_unused]] Tests<simd::vec<decltype(t)>> test;
template for (constexpr int n : {1, 3, 17})
[[maybe_unused]] Tests<simd::vec<int, n>> test;
}