diff options
author | Dmitry Kovalev <dkovalev@google.com> | 2014-09-06 00:10:25 -0700 |
---|---|---|
committer | Dmitry Kovalev <dkovalev@google.com> | 2014-09-06 00:10:25 -0700 |
commit | 1f19ebbab612c2a382b98787a85f2825279ef42a (patch) | |
tree | 0908bd4134a38898e8f0b6fdf30beee2119e86d5 /test/variance_test.cc | |
parent | 89963bf586d818be20be21b27772af0768e15121 (diff) | |
download | libvpx-1f19ebbab612c2a382b98787a85f2825279ef42a.tar libvpx-1f19ebbab612c2a382b98787a85f2825279ef42a.tar.gz libvpx-1f19ebbab612c2a382b98787a85f2825279ef42a.tar.bz2 libvpx-1f19ebbab612c2a382b98787a85f2825279ef42a.zip |
Replacing vp9_get_mb_ss_sse2 asm implementation with intrinsics.
Change-Id: Ib4f5dd733eb2939b108070a01e83da5d9990bac0
Diffstat (limited to 'test/variance_test.cc')
-rw-r--r-- | test/variance_test.cc | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/test/variance_test.cc b/test/variance_test.cc index b1354703d..f76402e4b 100644 --- a/test/variance_test.cc +++ b/test/variance_test.cc @@ -35,6 +35,14 @@ using ::std::tr1::make_tuple; using ::std::tr1::tuple; using libvpx_test::ACMRandom; +static unsigned int mb_ss_ref(const int16_t *src) { + unsigned int res = 0; + for (int i = 0; i < 256; ++i) { + res += src[i] * src[i]; + } + return res; +} + static unsigned int variance_ref(const uint8_t *ref, const uint8_t *src, int l2w, int l2h, unsigned int *sse_ptr) { int se = 0; @@ -76,6 +84,50 @@ static unsigned int subpel_variance_ref(const uint8_t *ref, const uint8_t *src, return sse - (((int64_t) se * se) >> (l2w + l2h)); } +typedef unsigned int (*SumOfSquaresFunction)(const int16_t *src); + +class SumOfSquaresTest : public ::testing::TestWithParam<SumOfSquaresFunction> { + public: + SumOfSquaresTest() : func_(GetParam()) {} + + virtual ~SumOfSquaresTest() { + libvpx_test::ClearSystemState(); + } + + protected: + void ConstTest(); + void RefTest(); + + SumOfSquaresFunction func_; + ACMRandom rnd_; +}; + +void SumOfSquaresTest::ConstTest() { + int16_t mem[256]; + unsigned int res; + for (int v = 0; v < 256; ++v) { + for (int i = 0; i < 256; ++i) { + mem[i] = v; + } + ASM_REGISTER_STATE_CHECK(res = func_(mem)); + EXPECT_EQ(256u * (v * v), res); + } +} + +void SumOfSquaresTest::RefTest() { + int16_t mem[256]; + for (int i = 0; i < 100; ++i) { + for (int j = 0; j < 256; ++j) { + mem[j] = rnd_.Rand8() - rnd_.Rand8(); + } + + const unsigned int expected = mb_ss_ref(mem); + unsigned int res; + ASM_REGISTER_STATE_CHECK(res = func_(mem)); + EXPECT_EQ(expected, res); + } +} + template<typename VarianceFunctionType> class VarianceTest : public ::testing::TestWithParam<tuple<int, int, VarianceFunctionType> > { @@ -362,6 +414,13 @@ INSTANTIATE_TEST_CASE_P( namespace vp9 { #if CONFIG_VP9_ENCODER + +TEST_P(SumOfSquaresTest, Const) { ConstTest(); } +TEST_P(SumOfSquaresTest, Ref) { RefTest(); } + +INSTANTIATE_TEST_CASE_P(C, SumOfSquaresTest, + ::testing::Values(vp9_get_mb_ss_c)); + typedef VarianceTest<vp9_variance_fn_t> VP9VarianceTest; typedef SubpelVarianceTest<vp9_subpixvariance_fn_t> VP9SubpelVarianceTest; typedef SubpelVarianceTest<vp9_subp_avg_variance_fn_t> VP9SubpelAvgVarianceTest; @@ -487,6 +546,10 @@ INSTANTIATE_TEST_CASE_P( #if HAVE_SSE2 #if CONFIG_USE_X86INC + +INSTANTIATE_TEST_CASE_P(SSE2, SumOfSquaresTest, + ::testing::Values(vp9_get_mb_ss_sse2)); + const vp9_variance_fn_t variance4x4_sse2 = vp9_variance4x4_sse2; const vp9_variance_fn_t variance4x8_sse2 = vp9_variance4x8_sse2; const vp9_variance_fn_t variance8x4_sse2 = vp9_variance8x4_sse2; |