| Index: source/libvpx/test/variance_test.cc
 | 
| ===================================================================
 | 
| --- source/libvpx/test/variance_test.cc	(revision 291857)
 | 
| +++ source/libvpx/test/variance_test.cc	(working copy)
 | 
| @@ -35,6 +35,14 @@
 | 
|  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 @@
 | 
|    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> > {
 | 
| @@ -88,7 +140,7 @@
 | 
|      height_ = 1 << log2height_;
 | 
|      variance_ = get<2>(params);
 | 
|  
 | 
| -    rnd(ACMRandom::DeterministicSeed());
 | 
| +    rnd_.Reset(ACMRandom::DeterministicSeed());
 | 
|      block_size_ = width_ * height_;
 | 
|      src_ = reinterpret_cast<uint8_t *>(vpx_memalign(16, block_size_));
 | 
|      ref_ = new uint8_t[block_size_];
 | 
| @@ -107,7 +159,7 @@
 | 
|    void RefTest();
 | 
|    void OneQuarterTest();
 | 
|  
 | 
| -  ACMRandom rnd;
 | 
| +  ACMRandom rnd_;
 | 
|    uint8_t* src_;
 | 
|    uint8_t* ref_;
 | 
|    int width_, log2width_;
 | 
| @@ -135,8 +187,8 @@
 | 
|  void VarianceTest<VarianceFunctionType>::RefTest() {
 | 
|    for (int i = 0; i < 10; ++i) {
 | 
|      for (int j = 0; j < block_size_; j++) {
 | 
| -      src_[j] = rnd.Rand8();
 | 
| -      ref_[j] = rnd.Rand8();
 | 
| +      src_[j] = rnd_.Rand8();
 | 
| +      ref_[j] = rnd_.Rand8();
 | 
|      }
 | 
|      unsigned int sse1, sse2;
 | 
|      unsigned int var1;
 | 
| @@ -206,7 +258,7 @@
 | 
|      height_ = 1 << log2height_;
 | 
|      subpel_variance_ = get<2>(params);
 | 
|  
 | 
| -    rnd(ACMRandom::DeterministicSeed());
 | 
| +    rnd_.Reset(ACMRandom::DeterministicSeed());
 | 
|      block_size_ = width_ * height_;
 | 
|      src_ = reinterpret_cast<uint8_t *>(vpx_memalign(16, block_size_));
 | 
|      sec_ = reinterpret_cast<uint8_t *>(vpx_memalign(16, block_size_));
 | 
| @@ -226,7 +278,7 @@
 | 
|   protected:
 | 
|    void RefTest();
 | 
|  
 | 
| -  ACMRandom rnd;
 | 
| +  ACMRandom rnd_;
 | 
|    uint8_t *src_;
 | 
|    uint8_t *ref_;
 | 
|    uint8_t *sec_;
 | 
| @@ -241,10 +293,10 @@
 | 
|    for (int x = 0; x < 16; ++x) {
 | 
|      for (int y = 0; y < 16; ++y) {
 | 
|        for (int j = 0; j < block_size_; j++) {
 | 
| -        src_[j] = rnd.Rand8();
 | 
| +        src_[j] = rnd_.Rand8();
 | 
|        }
 | 
|        for (int j = 0; j < block_size_ + width_ + height_ + 1; j++) {
 | 
| -        ref_[j] = rnd.Rand8();
 | 
| +        ref_[j] = rnd_.Rand8();
 | 
|        }
 | 
|        unsigned int sse1, sse2;
 | 
|        unsigned int var1;
 | 
| @@ -263,11 +315,11 @@
 | 
|    for (int x = 0; x < 16; ++x) {
 | 
|      for (int y = 0; y < 16; ++y) {
 | 
|        for (int j = 0; j < block_size_; j++) {
 | 
| -        src_[j] = rnd.Rand8();
 | 
| -        sec_[j] = rnd.Rand8();
 | 
| +        src_[j] = rnd_.Rand8();
 | 
| +        sec_[j] = rnd_.Rand8();
 | 
|        }
 | 
|        for (int j = 0; j < block_size_ + width_ + height_ + 1; j++) {
 | 
| -        ref_[j] = rnd.Rand8();
 | 
| +        ref_[j] = rnd_.Rand8();
 | 
|        }
 | 
|        unsigned int sse1, sse2;
 | 
|        unsigned int var1;
 | 
| @@ -362,6 +414,13 @@
 | 
|  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;
 | 
| @@ -485,23 +544,12 @@
 | 
|                        make_tuple(6, 5, subpel_avg_variance64x32_c),
 | 
|                        make_tuple(6, 6, subpel_avg_variance64x64_c)));
 | 
|  
 | 
| -#if HAVE_MMX
 | 
| -const vp9_variance_fn_t variance4x4_mmx = vp9_variance4x4_mmx;
 | 
| -const vp9_variance_fn_t variance8x8_mmx = vp9_variance8x8_mmx;
 | 
| -const vp9_variance_fn_t variance8x16_mmx = vp9_variance8x16_mmx;
 | 
| -const vp9_variance_fn_t variance16x8_mmx = vp9_variance16x8_mmx;
 | 
| -const vp9_variance_fn_t variance16x16_mmx = vp9_variance16x16_mmx;
 | 
| -INSTANTIATE_TEST_CASE_P(
 | 
| -    MMX, VP9VarianceTest,
 | 
| -    ::testing::Values(make_tuple(2, 2, variance4x4_mmx),
 | 
| -                      make_tuple(3, 3, variance8x8_mmx),
 | 
| -                      make_tuple(3, 4, variance8x16_mmx),
 | 
| -                      make_tuple(4, 3, variance16x8_mmx),
 | 
| -                      make_tuple(4, 4, variance16x16_mmx)));
 | 
| -#endif
 | 
| -
 | 
|  #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;
 | 
| 
 |