diff --git a/test/sum_squares_test.cc b/test/sum_squares_test.cc index 7de7a814f97581d361079788580bf3faaa741398..5186c851ad035c7c71b61923e658c0d96a7a5947 100644 --- a/test/sum_squares_test.cc +++ b/test/sum_squares_test.cc @@ -21,13 +21,16 @@ #include "test/clear_system_state.h" #include "test/register_state_check.h" #include "test/util.h" - +#include "test/function_equivalence_test.h" using libvpx_test::ACMRandom; +using libvpx_test::FunctionEquivalenceTest; namespace { const int kNumIterations = 10000; +static const int16_t kInt13Max = (1 << 12) - 1; + typedef uint64_t (*SSI16Func)(const int16_t *src, int stride , int size); @@ -130,4 +133,70 @@ INSTANTIATE_TEST_CASE_P( ) ); #endif // HAVE_SSE2 + +////////////////////////////////////////////////////////////////////////////// +// 1D version +////////////////////////////////////////////////////////////////////////////// + +typedef uint64_t (*F1D)(const int16_t *src, uint32_t N); + +class SumSquares1DTest : public FunctionEquivalenceTest<F1D> { + protected: + SumSquares1DTest() : rng_(ACMRandom::DeterministicSeed()) {} + + static const int kIterations = 1000; + static const int kMaxSize = 256; + + ACMRandom rng_; +}; + +TEST_P(SumSquares1DTest, RandomValues) { + DECLARE_ALIGNED(16, int16_t, src[kMaxSize * kMaxSize]); + + for (int iter = 0 ; iter < kIterations && !HasFatalFailure(); ++iter) { + for (int i = 0 ; i < kMaxSize * kMaxSize ; ++i) + src[i] = rng_(kInt13Max * 2 + 1) - kInt13Max; + + const int N = rng_(2) ? rng_(kMaxSize * kMaxSize + 1 - kMaxSize) + kMaxSize + : rng_(kMaxSize) + 1; + + const uint64_t ref_res = ref_func_(src, N); + const uint64_t tst_res = tst_func_(src, N); + + ASSERT_EQ(ref_res, tst_res); + } +} + +TEST_P(SumSquares1DTest, ExtremeValues) { + DECLARE_ALIGNED(16, int16_t, src[kMaxSize * kMaxSize]); + + for (int iter = 0 ; iter < kIterations && !HasFatalFailure(); ++iter) { + if (rng_(2)) { + for (int i = 0 ; i < kMaxSize * kMaxSize ; ++i) + src[i] = kInt13Max; + } else { + for (int i = 0 ; i < kMaxSize * kMaxSize ; ++i) + src[i] = -kInt13Max; + } + + const int N = rng_(2) ? rng_(kMaxSize * kMaxSize + 1 - kMaxSize) + kMaxSize + : rng_(kMaxSize) + 1; + + const uint64_t ref_res = ref_func_(src, N); + const uint64_t tst_res = tst_func_(src, N); + + ASSERT_EQ(ref_res, tst_res); + } +} + +using std::tr1::make_tuple; + +#if HAVE_SSE2 +INSTANTIATE_TEST_CASE_P( + SSE2, SumSquares1DTest, + ::testing::Values( + make_tuple(&vpx_sum_squares_i16_c, &vpx_sum_squares_i16_sse2) + ) +); +#endif // HAVE_SSE2 } // namespace