| // Copyright 2019 Google LLC |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| #include <stddef.h> |
| #include <stdint.h> |
| #include <string.h> // memset |
| |
| #undef HWY_TARGET_INCLUDE |
| #define HWY_TARGET_INCLUDE "tests/compare_test.cc" |
| #include "hwy/foreach_target.h" |
| #include "hwy/highway.h" |
| #include "hwy/tests/test_util-inl.h" |
| |
| HWY_BEFORE_NAMESPACE(); |
| namespace hwy { |
| namespace HWY_NAMESPACE { |
| |
| // All types. |
| struct TestEquality { |
| template <typename T, class D> |
| HWY_NOINLINE void operator()(T /*unused*/, D d) { |
| const auto v2 = Iota(d, 2); |
| const auto v2b = Iota(d, 2); |
| const auto v3 = Iota(d, 3); |
| |
| const size_t N = Lanes(d); |
| auto all_false = AllocateAligned<T>(N); |
| auto all_true = AllocateAligned<T>(N); |
| std::fill(all_false.get(), all_false.get() + N, T(0)); |
| memset(all_true.get(), 0xFF, N * sizeof(T)); |
| |
| HWY_ASSERT_VEC_EQ(d, all_false.get(), VecFromMask(v2 == v3)); |
| HWY_ASSERT_VEC_EQ(d, all_true.get(), VecFromMask(v2 == v2)); |
| HWY_ASSERT_VEC_EQ(d, all_true.get(), VecFromMask(v2 == v2b)); |
| } |
| }; |
| |
| // Integer and floating-point. |
| struct TestStrictT { |
| template <typename T, class D> |
| HWY_NOINLINE void operator()(T /*unused*/, D d) { |
| const auto v2 = Iota(d, 2); |
| const auto vn = Iota(d, -T(Lanes(d))); |
| |
| const size_t N = Lanes(d); |
| auto all_false = AllocateAligned<T>(N); |
| auto all_true = AllocateAligned<T>(N); |
| std::fill(all_false.get(), all_false.get() + N, T(0)); |
| memset(all_true.get(), 0xFF, N * sizeof(T)); |
| |
| HWY_ASSERT_VEC_EQ(d, all_true.get(), VecFromMask(v2 > vn)); |
| HWY_ASSERT_VEC_EQ(d, all_true.get(), VecFromMask(vn < v2)); |
| HWY_ASSERT_VEC_EQ(d, all_false.get(), VecFromMask(v2 < vn)); |
| HWY_ASSERT_VEC_EQ(d, all_false.get(), VecFromMask(vn > v2)); |
| } |
| }; |
| |
| HWY_NOINLINE void TestStrict() { |
| const ForPartialVectors<TestStrictT> test; |
| |
| // Cannot use ForSignedTypes - need to check HWY_COMPARE64_LANES. |
| test(int8_t()); |
| test(int16_t()); |
| test(int32_t()); |
| #if HWY_COMPARE64_LANES > 1 |
| test(int64_t()); |
| #endif |
| |
| ForFloatTypes(test); |
| } |
| |
| // Floating-point. |
| struct TestWeak { |
| template <typename T, class D> |
| HWY_NOINLINE void operator()(T /*unused*/, D d) { |
| const auto v2 = Iota(d, 2); |
| const auto vn = Iota(d, -T(Lanes(d))); |
| |
| const size_t N = Lanes(d); |
| auto all_false = AllocateAligned<T>(N); |
| auto all_true = AllocateAligned<T>(N); |
| std::fill(all_false.get(), all_false.get() + N, T(0)); |
| memset(all_true.get(), 0xFF, N * sizeof(T)); |
| |
| HWY_ASSERT_VEC_EQ(d, all_true.get(), VecFromMask(v2 >= v2)); |
| HWY_ASSERT_VEC_EQ(d, all_true.get(), VecFromMask(vn <= vn)); |
| |
| HWY_ASSERT_VEC_EQ(d, all_true.get(), VecFromMask(v2 >= vn)); |
| HWY_ASSERT_VEC_EQ(d, all_true.get(), VecFromMask(vn <= v2)); |
| |
| HWY_ASSERT_VEC_EQ(d, all_false.get(), VecFromMask(v2 <= vn)); |
| HWY_ASSERT_VEC_EQ(d, all_false.get(), VecFromMask(vn >= v2)); |
| } |
| }; |
| |
| HWY_NOINLINE void TestAllEquality() { |
| ForAllTypes(ForPartialVectors<TestEquality>()); |
| } |
| |
| HWY_NOINLINE void TestAllWeak() { |
| ForFloatTypes(ForPartialVectors<TestWeak>()); |
| } |
| |
| // NOLINTNEXTLINE(google-readability-namespace-comments) |
| } // namespace HWY_NAMESPACE |
| } // namespace hwy |
| HWY_AFTER_NAMESPACE(); |
| |
| #if HWY_ONCE |
| namespace hwy { |
| |
| class HwyCompareTest : public hwy::TestWithParamTarget {}; |
| |
| HWY_TARGET_INSTANTIATE_TEST_SUITE_P(HwyCompareTest); |
| |
| HWY_EXPORT_AND_TEST_P(HwyCompareTest, TestAllEquality); |
| HWY_EXPORT_AND_TEST_P(HwyCompareTest, TestStrict); |
| HWY_EXPORT_AND_TEST_P(HwyCompareTest, TestAllWeak); |
| |
| } // namespace hwy |
| #endif |