]> granicus.if.org Git - libvpx/blob - test/variance_test.cc
Optimize AVX2 get16x16var and get32x16var functions
[libvpx] / test / variance_test.cc
1 /*
2  *  Copyright (c) 2012 The WebM project authors. All Rights Reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10
11 #include <cstdlib>
12 #include <new>
13
14 #include "third_party/googletest/src/include/gtest/gtest.h"
15
16 #include "./vpx_config.h"
17 #include "./vpx_dsp_rtcd.h"
18 #include "test/acm_random.h"
19 #include "test/clear_system_state.h"
20 #include "test/register_state_check.h"
21 #include "vpx/vpx_codec.h"
22 #include "vpx/vpx_integer.h"
23 #include "vpx_mem/vpx_mem.h"
24 #include "vpx_ports/mem.h"
25 #include "vpx_ports/vpx_timer.h"
26
27 namespace {
28
29 typedef unsigned int (*VarianceMxNFunc)(const uint8_t *a, int a_stride,
30                                         const uint8_t *b, int b_stride,
31                                         unsigned int *sse);
32 typedef unsigned int (*SubpixVarMxNFunc)(const uint8_t *a, int a_stride,
33                                          int xoffset, int yoffset,
34                                          const uint8_t *b, int b_stride,
35                                          unsigned int *sse);
36 typedef unsigned int (*SubpixAvgVarMxNFunc)(const uint8_t *a, int a_stride,
37                                             int xoffset, int yoffset,
38                                             const uint8_t *b, int b_stride,
39                                             uint32_t *sse,
40                                             const uint8_t *second_pred);
41 typedef unsigned int (*Get4x4SseFunc)(const uint8_t *a, int a_stride,
42                                       const uint8_t *b, int b_stride);
43 typedef unsigned int (*SumOfSquaresFunction)(const int16_t *src);
44
45 using libvpx_test::ACMRandom;
46
47 // Truncate high bit depth results by downshifting (with rounding) by:
48 // 2 * (bit_depth - 8) for sse
49 // (bit_depth - 8) for se
50 static void RoundHighBitDepth(int bit_depth, int64_t *se, uint64_t *sse) {
51   switch (bit_depth) {
52     case VPX_BITS_12:
53       *sse = (*sse + 128) >> 8;
54       *se = (*se + 8) >> 4;
55       break;
56     case VPX_BITS_10:
57       *sse = (*sse + 8) >> 4;
58       *se = (*se + 2) >> 2;
59       break;
60     case VPX_BITS_8:
61     default: break;
62   }
63 }
64
65 static unsigned int mb_ss_ref(const int16_t *src) {
66   unsigned int res = 0;
67   for (int i = 0; i < 256; ++i) {
68     res += src[i] * src[i];
69   }
70   return res;
71 }
72
73 /* Note:
74  *  Our codebase calculates the "diff" value in the variance algorithm by
75  *  (src - ref).
76  */
77 static uint32_t variance_ref(const uint8_t *src, const uint8_t *ref, int l2w,
78                              int l2h, int src_stride, int ref_stride,
79                              uint32_t *sse_ptr, bool use_high_bit_depth_,
80                              vpx_bit_depth_t bit_depth) {
81   int64_t se = 0;
82   uint64_t sse = 0;
83   const int w = 1 << l2w;
84   const int h = 1 << l2h;
85   for (int y = 0; y < h; y++) {
86     for (int x = 0; x < w; x++) {
87       int diff;
88       if (!use_high_bit_depth_) {
89         diff = src[y * src_stride + x] - ref[y * ref_stride + x];
90         se += diff;
91         sse += diff * diff;
92 #if CONFIG_VP9_HIGHBITDEPTH
93       } else {
94         diff = CONVERT_TO_SHORTPTR(src)[y * src_stride + x] -
95                CONVERT_TO_SHORTPTR(ref)[y * ref_stride + x];
96         se += diff;
97         sse += diff * diff;
98 #endif  // CONFIG_VP9_HIGHBITDEPTH
99       }
100     }
101   }
102   RoundHighBitDepth(bit_depth, &se, &sse);
103   *sse_ptr = static_cast<uint32_t>(sse);
104   return static_cast<uint32_t>(
105       sse - ((static_cast<int64_t>(se) * se) >> (l2w + l2h)));
106 }
107
108 /* The subpel reference functions differ from the codec version in one aspect:
109  * they calculate the bilinear factors directly instead of using a lookup table
110  * and therefore upshift xoff and yoff by 1. Only every other calculated value
111  * is used so the codec version shrinks the table to save space and maintain
112  * compatibility with vp8.
113  */
114 static uint32_t subpel_variance_ref(const uint8_t *ref, const uint8_t *src,
115                                     int l2w, int l2h, int xoff, int yoff,
116                                     uint32_t *sse_ptr, bool use_high_bit_depth_,
117                                     vpx_bit_depth_t bit_depth) {
118   int64_t se = 0;
119   uint64_t sse = 0;
120   const int w = 1 << l2w;
121   const int h = 1 << l2h;
122
123   xoff <<= 1;
124   yoff <<= 1;
125
126   for (int y = 0; y < h; y++) {
127     for (int x = 0; x < w; x++) {
128       // Bilinear interpolation at a 16th pel step.
129       if (!use_high_bit_depth_) {
130         const int a1 = ref[(w + 1) * (y + 0) + x + 0];
131         const int a2 = ref[(w + 1) * (y + 0) + x + 1];
132         const int b1 = ref[(w + 1) * (y + 1) + x + 0];
133         const int b2 = ref[(w + 1) * (y + 1) + x + 1];
134         const int a = a1 + (((a2 - a1) * xoff + 8) >> 4);
135         const int b = b1 + (((b2 - b1) * xoff + 8) >> 4);
136         const int r = a + (((b - a) * yoff + 8) >> 4);
137         const int diff = r - src[w * y + x];
138         se += diff;
139         sse += diff * diff;
140 #if CONFIG_VP9_HIGHBITDEPTH
141       } else {
142         uint16_t *ref16 = CONVERT_TO_SHORTPTR(ref);
143         uint16_t *src16 = CONVERT_TO_SHORTPTR(src);
144         const int a1 = ref16[(w + 1) * (y + 0) + x + 0];
145         const int a2 = ref16[(w + 1) * (y + 0) + x + 1];
146         const int b1 = ref16[(w + 1) * (y + 1) + x + 0];
147         const int b2 = ref16[(w + 1) * (y + 1) + x + 1];
148         const int a = a1 + (((a2 - a1) * xoff + 8) >> 4);
149         const int b = b1 + (((b2 - b1) * xoff + 8) >> 4);
150         const int r = a + (((b - a) * yoff + 8) >> 4);
151         const int diff = r - src16[w * y + x];
152         se += diff;
153         sse += diff * diff;
154 #endif  // CONFIG_VP9_HIGHBITDEPTH
155       }
156     }
157   }
158   RoundHighBitDepth(bit_depth, &se, &sse);
159   *sse_ptr = static_cast<uint32_t>(sse);
160   return static_cast<uint32_t>(
161       sse - ((static_cast<int64_t>(se) * se) >> (l2w + l2h)));
162 }
163
164 static uint32_t subpel_avg_variance_ref(const uint8_t *ref, const uint8_t *src,
165                                         const uint8_t *second_pred, int l2w,
166                                         int l2h, int xoff, int yoff,
167                                         uint32_t *sse_ptr,
168                                         bool use_high_bit_depth,
169                                         vpx_bit_depth_t bit_depth) {
170   int64_t se = 0;
171   uint64_t sse = 0;
172   const int w = 1 << l2w;
173   const int h = 1 << l2h;
174
175   xoff <<= 1;
176   yoff <<= 1;
177
178   for (int y = 0; y < h; y++) {
179     for (int x = 0; x < w; x++) {
180       // bilinear interpolation at a 16th pel step
181       if (!use_high_bit_depth) {
182         const int a1 = ref[(w + 1) * (y + 0) + x + 0];
183         const int a2 = ref[(w + 1) * (y + 0) + x + 1];
184         const int b1 = ref[(w + 1) * (y + 1) + x + 0];
185         const int b2 = ref[(w + 1) * (y + 1) + x + 1];
186         const int a = a1 + (((a2 - a1) * xoff + 8) >> 4);
187         const int b = b1 + (((b2 - b1) * xoff + 8) >> 4);
188         const int r = a + (((b - a) * yoff + 8) >> 4);
189         const int diff =
190             ((r + second_pred[w * y + x] + 1) >> 1) - src[w * y + x];
191         se += diff;
192         sse += diff * diff;
193 #if CONFIG_VP9_HIGHBITDEPTH
194       } else {
195         const uint16_t *ref16 = CONVERT_TO_SHORTPTR(ref);
196         const uint16_t *src16 = CONVERT_TO_SHORTPTR(src);
197         const uint16_t *sec16 = CONVERT_TO_SHORTPTR(second_pred);
198         const int a1 = ref16[(w + 1) * (y + 0) + x + 0];
199         const int a2 = ref16[(w + 1) * (y + 0) + x + 1];
200         const int b1 = ref16[(w + 1) * (y + 1) + x + 0];
201         const int b2 = ref16[(w + 1) * (y + 1) + x + 1];
202         const int a = a1 + (((a2 - a1) * xoff + 8) >> 4);
203         const int b = b1 + (((b2 - b1) * xoff + 8) >> 4);
204         const int r = a + (((b - a) * yoff + 8) >> 4);
205         const int diff = ((r + sec16[w * y + x] + 1) >> 1) - src16[w * y + x];
206         se += diff;
207         sse += diff * diff;
208 #endif  // CONFIG_VP9_HIGHBITDEPTH
209       }
210     }
211   }
212   RoundHighBitDepth(bit_depth, &se, &sse);
213   *sse_ptr = static_cast<uint32_t>(sse);
214   return static_cast<uint32_t>(
215       sse - ((static_cast<int64_t>(se) * se) >> (l2w + l2h)));
216 }
217
218 ////////////////////////////////////////////////////////////////////////////////
219
220 class SumOfSquaresTest : public ::testing::TestWithParam<SumOfSquaresFunction> {
221  public:
222   SumOfSquaresTest() : func_(GetParam()) {}
223
224   virtual ~SumOfSquaresTest() { libvpx_test::ClearSystemState(); }
225
226  protected:
227   void ConstTest();
228   void RefTest();
229
230   SumOfSquaresFunction func_;
231   ACMRandom rnd_;
232 };
233
234 void SumOfSquaresTest::ConstTest() {
235   int16_t mem[256];
236   unsigned int res;
237   for (int v = 0; v < 256; ++v) {
238     for (int i = 0; i < 256; ++i) {
239       mem[i] = v;
240     }
241     ASM_REGISTER_STATE_CHECK(res = func_(mem));
242     EXPECT_EQ(256u * (v * v), res);
243   }
244 }
245
246 void SumOfSquaresTest::RefTest() {
247   int16_t mem[256];
248   for (int i = 0; i < 100; ++i) {
249     for (int j = 0; j < 256; ++j) {
250       mem[j] = rnd_.Rand8() - rnd_.Rand8();
251     }
252
253     const unsigned int expected = mb_ss_ref(mem);
254     unsigned int res;
255     ASM_REGISTER_STATE_CHECK(res = func_(mem));
256     EXPECT_EQ(expected, res);
257   }
258 }
259
260 ////////////////////////////////////////////////////////////////////////////////
261 // Encapsulating struct to store the function to test along with
262 // some testing context.
263 // Can be used for MSE, SSE, Variance, etc.
264
265 template <typename Func>
266 struct TestParams {
267   TestParams(int log2w = 0, int log2h = 0, Func function = NULL,
268              int bit_depth_value = 0)
269       : log2width(log2w), log2height(log2h), func(function) {
270     use_high_bit_depth = (bit_depth_value > 0);
271     if (use_high_bit_depth) {
272       bit_depth = static_cast<vpx_bit_depth_t>(bit_depth_value);
273     } else {
274       bit_depth = VPX_BITS_8;
275     }
276     width = 1 << log2width;
277     height = 1 << log2height;
278     block_size = width * height;
279     mask = (1u << bit_depth) - 1;
280   }
281
282   int log2width, log2height;
283   int width, height;
284   int block_size;
285   Func func;
286   vpx_bit_depth_t bit_depth;
287   bool use_high_bit_depth;
288   uint32_t mask;
289 };
290
291 template <typename Func>
292 std::ostream &operator<<(std::ostream &os, const TestParams<Func> &p) {
293   return os << "log2width/height:" << p.log2width << "/" << p.log2height
294             << " function:" << reinterpret_cast<const void *>(p.func)
295             << " bit-depth:" << p.bit_depth;
296 }
297
298 // Main class for testing a function type
299 template <typename FunctionType>
300 class MainTestClass
301     : public ::testing::TestWithParam<TestParams<FunctionType> > {
302  public:
303   virtual void SetUp() {
304     params_ = this->GetParam();
305
306     rnd_.Reset(ACMRandom::DeterministicSeed());
307     const size_t unit =
308         use_high_bit_depth() ? sizeof(uint16_t) : sizeof(uint8_t);
309     src_ = reinterpret_cast<uint8_t *>(vpx_memalign(16, block_size() * unit));
310     ref_ = new uint8_t[block_size() * unit];
311     ASSERT_TRUE(src_ != NULL);
312     ASSERT_TRUE(ref_ != NULL);
313 #if CONFIG_VP9_HIGHBITDEPTH
314     if (use_high_bit_depth()) {
315       // TODO(skal): remove!
316       src_ = CONVERT_TO_BYTEPTR(src_);
317       ref_ = CONVERT_TO_BYTEPTR(ref_);
318     }
319 #endif
320   }
321
322   virtual void TearDown() {
323 #if CONFIG_VP9_HIGHBITDEPTH
324     if (use_high_bit_depth()) {
325       // TODO(skal): remove!
326       src_ = reinterpret_cast<uint8_t *>(CONVERT_TO_SHORTPTR(src_));
327       ref_ = reinterpret_cast<uint8_t *>(CONVERT_TO_SHORTPTR(ref_));
328     }
329 #endif
330
331     vpx_free(src_);
332     delete[] ref_;
333     src_ = NULL;
334     ref_ = NULL;
335     libvpx_test::ClearSystemState();
336   }
337
338  protected:
339   // We could sub-class MainTestClass into dedicated class for Variance
340   // and MSE/SSE, but it involves a lot of 'this->xxx' dereferencing
341   // to access top class fields xxx. That's cumbersome, so for now we'll just
342   // implement the testing methods here:
343
344   // Variance tests
345   void ZeroTest();
346   void RefTest();
347   void RefStrideTest();
348   void OneQuarterTest();
349   void SpeedTest();
350
351   // MSE/SSE tests
352   void RefTestMse();
353   void RefTestSse();
354   void MaxTestMse();
355   void MaxTestSse();
356
357  protected:
358   ACMRandom rnd_;
359   uint8_t *src_;
360   uint8_t *ref_;
361   TestParams<FunctionType> params_;
362
363   // some relay helpers
364   bool use_high_bit_depth() const { return params_.use_high_bit_depth; }
365   int byte_shift() const { return params_.bit_depth - 8; }
366   int block_size() const { return params_.block_size; }
367   int width() const { return params_.width; }
368   int height() const { return params_.height; }
369   uint32_t mask() const { return params_.mask; }
370 };
371
372 ////////////////////////////////////////////////////////////////////////////////
373 // Tests related to variance.
374
375 template <typename VarianceFunctionType>
376 void MainTestClass<VarianceFunctionType>::ZeroTest() {
377   for (int i = 0; i <= 255; ++i) {
378     if (!use_high_bit_depth()) {
379       memset(src_, i, block_size());
380     } else {
381       uint16_t *const src16 = CONVERT_TO_SHORTPTR(src_);
382       for (int k = 0; k < block_size(); ++k) src16[k] = i << byte_shift();
383     }
384     for (int j = 0; j <= 255; ++j) {
385       if (!use_high_bit_depth()) {
386         memset(ref_, j, block_size());
387       } else {
388         uint16_t *const ref16 = CONVERT_TO_SHORTPTR(ref_);
389         for (int k = 0; k < block_size(); ++k) ref16[k] = j << byte_shift();
390       }
391       unsigned int sse, var;
392       ASM_REGISTER_STATE_CHECK(
393           var = params_.func(src_, width(), ref_, width(), &sse));
394       EXPECT_EQ(0u, var) << "src values: " << i << " ref values: " << j;
395     }
396   }
397 }
398
399 template <typename VarianceFunctionType>
400 void MainTestClass<VarianceFunctionType>::RefTest() {
401   for (int i = 0; i < 10; ++i) {
402     for (int j = 0; j < block_size(); j++) {
403       if (!use_high_bit_depth()) {
404         src_[j] = rnd_.Rand8();
405         ref_[j] = rnd_.Rand8();
406 #if CONFIG_VP9_HIGHBITDEPTH
407       } else {
408         CONVERT_TO_SHORTPTR(src_)[j] = rnd_.Rand16() & mask();
409         CONVERT_TO_SHORTPTR(ref_)[j] = rnd_.Rand16() & mask();
410 #endif  // CONFIG_VP9_HIGHBITDEPTH
411       }
412     }
413     unsigned int sse1, sse2, var1, var2;
414     const int stride = width();
415     ASM_REGISTER_STATE_CHECK(
416         var1 = params_.func(src_, stride, ref_, stride, &sse1));
417     var2 =
418         variance_ref(src_, ref_, params_.log2width, params_.log2height, stride,
419                      stride, &sse2, use_high_bit_depth(), params_.bit_depth);
420     EXPECT_EQ(sse1, sse2) << "Error at test index: " << i;
421     EXPECT_EQ(var1, var2) << "Error at test index: " << i;
422   }
423 }
424
425 template <typename VarianceFunctionType>
426 void MainTestClass<VarianceFunctionType>::RefStrideTest() {
427   for (int i = 0; i < 10; ++i) {
428     const int ref_stride = (i & 1) * width();
429     const int src_stride = ((i >> 1) & 1) * width();
430     for (int j = 0; j < block_size(); j++) {
431       const int ref_ind = (j / width()) * ref_stride + j % width();
432       const int src_ind = (j / width()) * src_stride + j % width();
433       if (!use_high_bit_depth()) {
434         src_[src_ind] = rnd_.Rand8();
435         ref_[ref_ind] = rnd_.Rand8();
436 #if CONFIG_VP9_HIGHBITDEPTH
437       } else {
438         CONVERT_TO_SHORTPTR(src_)[src_ind] = rnd_.Rand16() & mask();
439         CONVERT_TO_SHORTPTR(ref_)[ref_ind] = rnd_.Rand16() & mask();
440 #endif  // CONFIG_VP9_HIGHBITDEPTH
441       }
442     }
443     unsigned int sse1, sse2;
444     unsigned int var1, var2;
445
446     ASM_REGISTER_STATE_CHECK(
447         var1 = params_.func(src_, src_stride, ref_, ref_stride, &sse1));
448     var2 = variance_ref(src_, ref_, params_.log2width, params_.log2height,
449                         src_stride, ref_stride, &sse2, use_high_bit_depth(),
450                         params_.bit_depth);
451     EXPECT_EQ(sse1, sse2) << "Error at test index: " << i;
452     EXPECT_EQ(var1, var2) << "Error at test index: " << i;
453   }
454 }
455
456 template <typename VarianceFunctionType>
457 void MainTestClass<VarianceFunctionType>::OneQuarterTest() {
458   const int half = block_size() / 2;
459   if (!use_high_bit_depth()) {
460     memset(src_, 255, block_size());
461     memset(ref_, 255, half);
462     memset(ref_ + half, 0, half);
463 #if CONFIG_VP9_HIGHBITDEPTH
464   } else {
465     vpx_memset16(CONVERT_TO_SHORTPTR(src_), 255 << byte_shift(), block_size());
466     vpx_memset16(CONVERT_TO_SHORTPTR(ref_), 255 << byte_shift(), half);
467     vpx_memset16(CONVERT_TO_SHORTPTR(ref_) + half, 0, half);
468 #endif  // CONFIG_VP9_HIGHBITDEPTH
469   }
470   unsigned int sse, var, expected;
471   ASM_REGISTER_STATE_CHECK(
472       var = params_.func(src_, width(), ref_, width(), &sse));
473   expected = block_size() * 255 * 255 / 4;
474   EXPECT_EQ(expected, var);
475 }
476
477 template <typename VarianceFunctionType>
478 void MainTestClass<VarianceFunctionType>::SpeedTest() {
479   const int half = block_size() / 2;
480   if (!use_high_bit_depth()) {
481     memset(src_, 255, block_size());
482     memset(ref_, 255, half);
483     memset(ref_ + half, 0, half);
484 #if CONFIG_VP9_HIGHBITDEPTH
485   } else {
486     vpx_memset16(CONVERT_TO_SHORTPTR(src_), 255 << byte_shift(), block_size());
487     vpx_memset16(CONVERT_TO_SHORTPTR(ref_), 255 << byte_shift(), half);
488     vpx_memset16(CONVERT_TO_SHORTPTR(ref_) + half, 0, half);
489 #endif  // CONFIG_VP9_HIGHBITDEPTH
490   }
491   unsigned int sse;
492
493   vpx_usec_timer timer;
494   vpx_usec_timer_start(&timer);
495   for (int i = 0; i < (1 << 30) / block_size(); ++i) {
496     const uint32_t variance = params_.func(src_, width(), ref_, width(), &sse);
497     // Ignore return value.
498     (void)variance;
499   }
500   vpx_usec_timer_mark(&timer);
501   const int elapsed_time = static_cast<int>(vpx_usec_timer_elapsed(&timer));
502   printf("Variance %dx%d time: %5d ms\n", width(), height(),
503          elapsed_time / 1000);
504 }
505
506 ////////////////////////////////////////////////////////////////////////////////
507 // Tests related to MSE / SSE.
508
509 template <typename FunctionType>
510 void MainTestClass<FunctionType>::RefTestMse() {
511   for (int i = 0; i < 10; ++i) {
512     for (int j = 0; j < block_size(); ++j) {
513       src_[j] = rnd_.Rand8();
514       ref_[j] = rnd_.Rand8();
515     }
516     unsigned int sse1, sse2;
517     const int stride = width();
518     ASM_REGISTER_STATE_CHECK(params_.func(src_, stride, ref_, stride, &sse1));
519     variance_ref(src_, ref_, params_.log2width, params_.log2height, stride,
520                  stride, &sse2, false, VPX_BITS_8);
521     EXPECT_EQ(sse1, sse2);
522   }
523 }
524
525 template <typename FunctionType>
526 void MainTestClass<FunctionType>::RefTestSse() {
527   for (int i = 0; i < 10; ++i) {
528     for (int j = 0; j < block_size(); ++j) {
529       src_[j] = rnd_.Rand8();
530       ref_[j] = rnd_.Rand8();
531     }
532     unsigned int sse2;
533     unsigned int var1;
534     const int stride = width();
535     ASM_REGISTER_STATE_CHECK(var1 = params_.func(src_, stride, ref_, stride));
536     variance_ref(src_, ref_, params_.log2width, params_.log2height, stride,
537                  stride, &sse2, false, VPX_BITS_8);
538     EXPECT_EQ(var1, sse2);
539   }
540 }
541
542 template <typename FunctionType>
543 void MainTestClass<FunctionType>::MaxTestMse() {
544   memset(src_, 255, block_size());
545   memset(ref_, 0, block_size());
546   unsigned int sse;
547   ASM_REGISTER_STATE_CHECK(params_.func(src_, width(), ref_, width(), &sse));
548   const unsigned int expected = block_size() * 255 * 255;
549   EXPECT_EQ(expected, sse);
550 }
551
552 template <typename FunctionType>
553 void MainTestClass<FunctionType>::MaxTestSse() {
554   memset(src_, 255, block_size());
555   memset(ref_, 0, block_size());
556   unsigned int var;
557   ASM_REGISTER_STATE_CHECK(var = params_.func(src_, width(), ref_, width()));
558   const unsigned int expected = block_size() * 255 * 255;
559   EXPECT_EQ(expected, var);
560 }
561
562 ////////////////////////////////////////////////////////////////////////////////
563
564 template <typename FunctionType>
565 class SubpelVarianceTest
566     : public ::testing::TestWithParam<TestParams<FunctionType> > {
567  public:
568   virtual void SetUp() {
569     params_ = this->GetParam();
570
571     rnd_.Reset(ACMRandom::DeterministicSeed());
572     if (!use_high_bit_depth()) {
573       src_ = reinterpret_cast<uint8_t *>(vpx_memalign(16, block_size()));
574       sec_ = reinterpret_cast<uint8_t *>(vpx_memalign(16, block_size()));
575       ref_ = new uint8_t[block_size() + width() + height() + 1];
576 #if CONFIG_VP9_HIGHBITDEPTH
577     } else {
578       src_ = CONVERT_TO_BYTEPTR(reinterpret_cast<uint16_t *>(
579           vpx_memalign(16, block_size() * sizeof(uint16_t))));
580       sec_ = CONVERT_TO_BYTEPTR(reinterpret_cast<uint16_t *>(
581           vpx_memalign(16, block_size() * sizeof(uint16_t))));
582       ref_ = CONVERT_TO_BYTEPTR(
583           new uint16_t[block_size() + width() + height() + 1]);
584 #endif  // CONFIG_VP9_HIGHBITDEPTH
585     }
586     ASSERT_TRUE(src_ != NULL);
587     ASSERT_TRUE(sec_ != NULL);
588     ASSERT_TRUE(ref_ != NULL);
589   }
590
591   virtual void TearDown() {
592     if (!use_high_bit_depth()) {
593       vpx_free(src_);
594       delete[] ref_;
595       vpx_free(sec_);
596 #if CONFIG_VP9_HIGHBITDEPTH
597     } else {
598       vpx_free(CONVERT_TO_SHORTPTR(src_));
599       delete[] CONVERT_TO_SHORTPTR(ref_);
600       vpx_free(CONVERT_TO_SHORTPTR(sec_));
601 #endif  // CONFIG_VP9_HIGHBITDEPTH
602     }
603     libvpx_test::ClearSystemState();
604   }
605
606  protected:
607   void RefTest();
608   void ExtremeRefTest();
609
610   ACMRandom rnd_;
611   uint8_t *src_;
612   uint8_t *ref_;
613   uint8_t *sec_;
614   TestParams<FunctionType> params_;
615
616   // some relay helpers
617   bool use_high_bit_depth() const { return params_.use_high_bit_depth; }
618   int byte_shift() const { return params_.bit_depth - 8; }
619   int block_size() const { return params_.block_size; }
620   int width() const { return params_.width; }
621   int height() const { return params_.height; }
622   uint32_t mask() const { return params_.mask; }
623 };
624
625 template <typename SubpelVarianceFunctionType>
626 void SubpelVarianceTest<SubpelVarianceFunctionType>::RefTest() {
627   for (int x = 0; x < 8; ++x) {
628     for (int y = 0; y < 8; ++y) {
629       if (!use_high_bit_depth()) {
630         for (int j = 0; j < block_size(); j++) {
631           src_[j] = rnd_.Rand8();
632         }
633         for (int j = 0; j < block_size() + width() + height() + 1; j++) {
634           ref_[j] = rnd_.Rand8();
635         }
636 #if CONFIG_VP9_HIGHBITDEPTH
637       } else {
638         for (int j = 0; j < block_size(); j++) {
639           CONVERT_TO_SHORTPTR(src_)[j] = rnd_.Rand16() & mask();
640         }
641         for (int j = 0; j < block_size() + width() + height() + 1; j++) {
642           CONVERT_TO_SHORTPTR(ref_)[j] = rnd_.Rand16() & mask();
643         }
644 #endif  // CONFIG_VP9_HIGHBITDEPTH
645       }
646       unsigned int sse1, sse2;
647       unsigned int var1;
648       ASM_REGISTER_STATE_CHECK(
649           var1 = params_.func(ref_, width() + 1, x, y, src_, width(), &sse1));
650       const unsigned int var2 = subpel_variance_ref(
651           ref_, src_, params_.log2width, params_.log2height, x, y, &sse2,
652           use_high_bit_depth(), params_.bit_depth);
653       EXPECT_EQ(sse1, sse2) << "at position " << x << ", " << y;
654       EXPECT_EQ(var1, var2) << "at position " << x << ", " << y;
655     }
656   }
657 }
658
659 template <typename SubpelVarianceFunctionType>
660 void SubpelVarianceTest<SubpelVarianceFunctionType>::ExtremeRefTest() {
661   // Compare against reference.
662   // Src: Set the first half of values to 0, the second half to the maximum.
663   // Ref: Set the first half of values to the maximum, the second half to 0.
664   for (int x = 0; x < 8; ++x) {
665     for (int y = 0; y < 8; ++y) {
666       const int half = block_size() / 2;
667       if (!use_high_bit_depth()) {
668         memset(src_, 0, half);
669         memset(src_ + half, 255, half);
670         memset(ref_, 255, half);
671         memset(ref_ + half, 0, half + width() + height() + 1);
672 #if CONFIG_VP9_HIGHBITDEPTH
673       } else {
674         vpx_memset16(CONVERT_TO_SHORTPTR(src_), mask(), half);
675         vpx_memset16(CONVERT_TO_SHORTPTR(src_) + half, 0, half);
676         vpx_memset16(CONVERT_TO_SHORTPTR(ref_), 0, half);
677         vpx_memset16(CONVERT_TO_SHORTPTR(ref_) + half, mask(),
678                      half + width() + height() + 1);
679 #endif  // CONFIG_VP9_HIGHBITDEPTH
680       }
681       unsigned int sse1, sse2;
682       unsigned int var1;
683       ASM_REGISTER_STATE_CHECK(
684           var1 = params_.func(ref_, width() + 1, x, y, src_, width(), &sse1));
685       const unsigned int var2 = subpel_variance_ref(
686           ref_, src_, params_.log2width, params_.log2height, x, y, &sse2,
687           use_high_bit_depth(), params_.bit_depth);
688       EXPECT_EQ(sse1, sse2) << "for xoffset " << x << " and yoffset " << y;
689       EXPECT_EQ(var1, var2) << "for xoffset " << x << " and yoffset " << y;
690     }
691   }
692 }
693
694 template <>
695 void SubpelVarianceTest<SubpixAvgVarMxNFunc>::RefTest() {
696   for (int x = 0; x < 8; ++x) {
697     for (int y = 0; y < 8; ++y) {
698       if (!use_high_bit_depth()) {
699         for (int j = 0; j < block_size(); j++) {
700           src_[j] = rnd_.Rand8();
701           sec_[j] = rnd_.Rand8();
702         }
703         for (int j = 0; j < block_size() + width() + height() + 1; j++) {
704           ref_[j] = rnd_.Rand8();
705         }
706 #if CONFIG_VP9_HIGHBITDEPTH
707       } else {
708         for (int j = 0; j < block_size(); j++) {
709           CONVERT_TO_SHORTPTR(src_)[j] = rnd_.Rand16() & mask();
710           CONVERT_TO_SHORTPTR(sec_)[j] = rnd_.Rand16() & mask();
711         }
712         for (int j = 0; j < block_size() + width() + height() + 1; j++) {
713           CONVERT_TO_SHORTPTR(ref_)[j] = rnd_.Rand16() & mask();
714         }
715 #endif  // CONFIG_VP9_HIGHBITDEPTH
716       }
717       uint32_t sse1, sse2;
718       uint32_t var1, var2;
719       ASM_REGISTER_STATE_CHECK(var1 = params_.func(ref_, width() + 1, x, y,
720                                                    src_, width(), &sse1, sec_));
721       var2 = subpel_avg_variance_ref(ref_, src_, sec_, params_.log2width,
722                                      params_.log2height, x, y, &sse2,
723                                      use_high_bit_depth(), params_.bit_depth);
724       EXPECT_EQ(sse1, sse2) << "at position " << x << ", " << y;
725       EXPECT_EQ(var1, var2) << "at position " << x << ", " << y;
726     }
727   }
728 }
729
730 typedef MainTestClass<Get4x4SseFunc> VpxSseTest;
731 typedef MainTestClass<VarianceMxNFunc> VpxMseTest;
732 typedef MainTestClass<VarianceMxNFunc> VpxVarianceTest;
733 typedef SubpelVarianceTest<SubpixVarMxNFunc> VpxSubpelVarianceTest;
734 typedef SubpelVarianceTest<SubpixAvgVarMxNFunc> VpxSubpelAvgVarianceTest;
735
736 TEST_P(VpxSseTest, RefSse) { RefTestSse(); }
737 TEST_P(VpxSseTest, MaxSse) { MaxTestSse(); }
738 TEST_P(VpxMseTest, RefMse) { RefTestMse(); }
739 TEST_P(VpxMseTest, MaxMse) { MaxTestMse(); }
740 TEST_P(VpxVarianceTest, Zero) { ZeroTest(); }
741 TEST_P(VpxVarianceTest, Ref) { RefTest(); }
742 TEST_P(VpxVarianceTest, RefStride) { RefStrideTest(); }
743 TEST_P(VpxVarianceTest, OneQuarter) { OneQuarterTest(); }
744 TEST_P(VpxVarianceTest, DISABLED_Speed) { SpeedTest(); }
745 TEST_P(SumOfSquaresTest, Const) { ConstTest(); }
746 TEST_P(SumOfSquaresTest, Ref) { RefTest(); }
747 TEST_P(VpxSubpelVarianceTest, Ref) { RefTest(); }
748 TEST_P(VpxSubpelVarianceTest, ExtremeRef) { ExtremeRefTest(); }
749 TEST_P(VpxSubpelAvgVarianceTest, Ref) { RefTest(); }
750
751 INSTANTIATE_TEST_CASE_P(C, SumOfSquaresTest,
752                         ::testing::Values(vpx_get_mb_ss_c));
753
754 typedef TestParams<Get4x4SseFunc> SseParams;
755 INSTANTIATE_TEST_CASE_P(C, VpxSseTest,
756                         ::testing::Values(SseParams(2, 2,
757                                                     &vpx_get4x4sse_cs_c)));
758
759 typedef TestParams<VarianceMxNFunc> MseParams;
760 INSTANTIATE_TEST_CASE_P(C, VpxMseTest,
761                         ::testing::Values(MseParams(4, 4, &vpx_mse16x16_c),
762                                           MseParams(4, 3, &vpx_mse16x8_c),
763                                           MseParams(3, 4, &vpx_mse8x16_c),
764                                           MseParams(3, 3, &vpx_mse8x8_c)));
765
766 typedef TestParams<VarianceMxNFunc> VarianceParams;
767 INSTANTIATE_TEST_CASE_P(
768     C, VpxVarianceTest,
769     ::testing::Values(VarianceParams(6, 6, &vpx_variance64x64_c),
770                       VarianceParams(6, 5, &vpx_variance64x32_c),
771                       VarianceParams(5, 6, &vpx_variance32x64_c),
772                       VarianceParams(5, 5, &vpx_variance32x32_c),
773                       VarianceParams(5, 4, &vpx_variance32x16_c),
774                       VarianceParams(4, 5, &vpx_variance16x32_c),
775                       VarianceParams(4, 4, &vpx_variance16x16_c),
776                       VarianceParams(4, 3, &vpx_variance16x8_c),
777                       VarianceParams(3, 4, &vpx_variance8x16_c),
778                       VarianceParams(3, 3, &vpx_variance8x8_c),
779                       VarianceParams(3, 2, &vpx_variance8x4_c),
780                       VarianceParams(2, 3, &vpx_variance4x8_c),
781                       VarianceParams(2, 2, &vpx_variance4x4_c)));
782
783 typedef TestParams<SubpixVarMxNFunc> SubpelVarianceParams;
784 INSTANTIATE_TEST_CASE_P(
785     C, VpxSubpelVarianceTest,
786     ::testing::Values(
787         SubpelVarianceParams(6, 6, &vpx_sub_pixel_variance64x64_c, 0),
788         SubpelVarianceParams(6, 5, &vpx_sub_pixel_variance64x32_c, 0),
789         SubpelVarianceParams(5, 6, &vpx_sub_pixel_variance32x64_c, 0),
790         SubpelVarianceParams(5, 5, &vpx_sub_pixel_variance32x32_c, 0),
791         SubpelVarianceParams(5, 4, &vpx_sub_pixel_variance32x16_c, 0),
792         SubpelVarianceParams(4, 5, &vpx_sub_pixel_variance16x32_c, 0),
793         SubpelVarianceParams(4, 4, &vpx_sub_pixel_variance16x16_c, 0),
794         SubpelVarianceParams(4, 3, &vpx_sub_pixel_variance16x8_c, 0),
795         SubpelVarianceParams(3, 4, &vpx_sub_pixel_variance8x16_c, 0),
796         SubpelVarianceParams(3, 3, &vpx_sub_pixel_variance8x8_c, 0),
797         SubpelVarianceParams(3, 2, &vpx_sub_pixel_variance8x4_c, 0),
798         SubpelVarianceParams(2, 3, &vpx_sub_pixel_variance4x8_c, 0),
799         SubpelVarianceParams(2, 2, &vpx_sub_pixel_variance4x4_c, 0)));
800
801 typedef TestParams<SubpixAvgVarMxNFunc> SubpelAvgVarianceParams;
802 INSTANTIATE_TEST_CASE_P(
803     C, VpxSubpelAvgVarianceTest,
804     ::testing::Values(
805         SubpelAvgVarianceParams(6, 6, &vpx_sub_pixel_avg_variance64x64_c, 0),
806         SubpelAvgVarianceParams(6, 5, &vpx_sub_pixel_avg_variance64x32_c, 0),
807         SubpelAvgVarianceParams(5, 6, &vpx_sub_pixel_avg_variance32x64_c, 0),
808         SubpelAvgVarianceParams(5, 5, &vpx_sub_pixel_avg_variance32x32_c, 0),
809         SubpelAvgVarianceParams(5, 4, &vpx_sub_pixel_avg_variance32x16_c, 0),
810         SubpelAvgVarianceParams(4, 5, &vpx_sub_pixel_avg_variance16x32_c, 0),
811         SubpelAvgVarianceParams(4, 4, &vpx_sub_pixel_avg_variance16x16_c, 0),
812         SubpelAvgVarianceParams(4, 3, &vpx_sub_pixel_avg_variance16x8_c, 0),
813         SubpelAvgVarianceParams(3, 4, &vpx_sub_pixel_avg_variance8x16_c, 0),
814         SubpelAvgVarianceParams(3, 3, &vpx_sub_pixel_avg_variance8x8_c, 0),
815         SubpelAvgVarianceParams(3, 2, &vpx_sub_pixel_avg_variance8x4_c, 0),
816         SubpelAvgVarianceParams(2, 3, &vpx_sub_pixel_avg_variance4x8_c, 0),
817         SubpelAvgVarianceParams(2, 2, &vpx_sub_pixel_avg_variance4x4_c, 0)));
818
819 #if CONFIG_VP9_HIGHBITDEPTH
820 typedef MainTestClass<VarianceMxNFunc> VpxHBDMseTest;
821 typedef MainTestClass<VarianceMxNFunc> VpxHBDVarianceTest;
822 typedef SubpelVarianceTest<SubpixVarMxNFunc> VpxHBDSubpelVarianceTest;
823 typedef SubpelVarianceTest<SubpixAvgVarMxNFunc> VpxHBDSubpelAvgVarianceTest;
824
825 TEST_P(VpxHBDMseTest, RefMse) { RefTestMse(); }
826 TEST_P(VpxHBDMseTest, MaxMse) { MaxTestMse(); }
827 TEST_P(VpxHBDVarianceTest, Zero) { ZeroTest(); }
828 TEST_P(VpxHBDVarianceTest, Ref) { RefTest(); }
829 TEST_P(VpxHBDVarianceTest, RefStride) { RefStrideTest(); }
830 TEST_P(VpxHBDVarianceTest, OneQuarter) { OneQuarterTest(); }
831 TEST_P(VpxHBDVarianceTest, DISABLED_Speed) { SpeedTest(); }
832 TEST_P(VpxHBDSubpelVarianceTest, Ref) { RefTest(); }
833 TEST_P(VpxHBDSubpelVarianceTest, ExtremeRef) { ExtremeRefTest(); }
834 TEST_P(VpxHBDSubpelAvgVarianceTest, Ref) { RefTest(); }
835
836 /* TODO(debargha): This test does not support the highbd version
837 INSTANTIATE_TEST_CASE_P(
838     C, VpxHBDMseTest,
839     ::testing::Values(MseParams(4, 4, &vpx_highbd_12_mse16x16_c),
840                       MseParams(4, 4, &vpx_highbd_12_mse16x8_c),
841                       MseParams(4, 4, &vpx_highbd_12_mse8x16_c),
842                       MseParams(4, 4, &vpx_highbd_12_mse8x8_c),
843                       MseParams(4, 4, &vpx_highbd_10_mse16x16_c),
844                       MseParams(4, 4, &vpx_highbd_10_mse16x8_c),
845                       MseParams(4, 4, &vpx_highbd_10_mse8x16_c),
846                       MseParams(4, 4, &vpx_highbd_10_mse8x8_c),
847                       MseParams(4, 4, &vpx_highbd_8_mse16x16_c),
848                       MseParams(4, 4, &vpx_highbd_8_mse16x8_c),
849                       MseParams(4, 4, &vpx_highbd_8_mse8x16_c),
850                       MseParams(4, 4, &vpx_highbd_8_mse8x8_c)));
851 */
852
853 INSTANTIATE_TEST_CASE_P(
854     C, VpxHBDVarianceTest,
855     ::testing::Values(VarianceParams(6, 6, &vpx_highbd_12_variance64x64_c, 12),
856                       VarianceParams(6, 5, &vpx_highbd_12_variance64x32_c, 12),
857                       VarianceParams(5, 6, &vpx_highbd_12_variance32x64_c, 12),
858                       VarianceParams(5, 5, &vpx_highbd_12_variance32x32_c, 12),
859                       VarianceParams(5, 4, &vpx_highbd_12_variance32x16_c, 12),
860                       VarianceParams(4, 5, &vpx_highbd_12_variance16x32_c, 12),
861                       VarianceParams(4, 4, &vpx_highbd_12_variance16x16_c, 12),
862                       VarianceParams(4, 3, &vpx_highbd_12_variance16x8_c, 12),
863                       VarianceParams(3, 4, &vpx_highbd_12_variance8x16_c, 12),
864                       VarianceParams(3, 3, &vpx_highbd_12_variance8x8_c, 12),
865                       VarianceParams(3, 2, &vpx_highbd_12_variance8x4_c, 12),
866                       VarianceParams(2, 3, &vpx_highbd_12_variance4x8_c, 12),
867                       VarianceParams(2, 2, &vpx_highbd_12_variance4x4_c, 12),
868                       VarianceParams(6, 6, &vpx_highbd_10_variance64x64_c, 10),
869                       VarianceParams(6, 5, &vpx_highbd_10_variance64x32_c, 10),
870                       VarianceParams(5, 6, &vpx_highbd_10_variance32x64_c, 10),
871                       VarianceParams(5, 5, &vpx_highbd_10_variance32x32_c, 10),
872                       VarianceParams(5, 4, &vpx_highbd_10_variance32x16_c, 10),
873                       VarianceParams(4, 5, &vpx_highbd_10_variance16x32_c, 10),
874                       VarianceParams(4, 4, &vpx_highbd_10_variance16x16_c, 10),
875                       VarianceParams(4, 3, &vpx_highbd_10_variance16x8_c, 10),
876                       VarianceParams(3, 4, &vpx_highbd_10_variance8x16_c, 10),
877                       VarianceParams(3, 3, &vpx_highbd_10_variance8x8_c, 10),
878                       VarianceParams(3, 2, &vpx_highbd_10_variance8x4_c, 10),
879                       VarianceParams(2, 3, &vpx_highbd_10_variance4x8_c, 10),
880                       VarianceParams(2, 2, &vpx_highbd_10_variance4x4_c, 10),
881                       VarianceParams(6, 6, &vpx_highbd_8_variance64x64_c, 8),
882                       VarianceParams(6, 5, &vpx_highbd_8_variance64x32_c, 8),
883                       VarianceParams(5, 6, &vpx_highbd_8_variance32x64_c, 8),
884                       VarianceParams(5, 5, &vpx_highbd_8_variance32x32_c, 8),
885                       VarianceParams(5, 4, &vpx_highbd_8_variance32x16_c, 8),
886                       VarianceParams(4, 5, &vpx_highbd_8_variance16x32_c, 8),
887                       VarianceParams(4, 4, &vpx_highbd_8_variance16x16_c, 8),
888                       VarianceParams(4, 3, &vpx_highbd_8_variance16x8_c, 8),
889                       VarianceParams(3, 4, &vpx_highbd_8_variance8x16_c, 8),
890                       VarianceParams(3, 3, &vpx_highbd_8_variance8x8_c, 8),
891                       VarianceParams(3, 2, &vpx_highbd_8_variance8x4_c, 8),
892                       VarianceParams(2, 3, &vpx_highbd_8_variance4x8_c, 8),
893                       VarianceParams(2, 2, &vpx_highbd_8_variance4x4_c, 8)));
894
895 INSTANTIATE_TEST_CASE_P(
896     C, VpxHBDSubpelVarianceTest,
897     ::testing::Values(
898         SubpelVarianceParams(6, 6, &vpx_highbd_8_sub_pixel_variance64x64_c, 8),
899         SubpelVarianceParams(6, 5, &vpx_highbd_8_sub_pixel_variance64x32_c, 8),
900         SubpelVarianceParams(5, 6, &vpx_highbd_8_sub_pixel_variance32x64_c, 8),
901         SubpelVarianceParams(5, 5, &vpx_highbd_8_sub_pixel_variance32x32_c, 8),
902         SubpelVarianceParams(5, 4, &vpx_highbd_8_sub_pixel_variance32x16_c, 8),
903         SubpelVarianceParams(4, 5, &vpx_highbd_8_sub_pixel_variance16x32_c, 8),
904         SubpelVarianceParams(4, 4, &vpx_highbd_8_sub_pixel_variance16x16_c, 8),
905         SubpelVarianceParams(4, 3, &vpx_highbd_8_sub_pixel_variance16x8_c, 8),
906         SubpelVarianceParams(3, 4, &vpx_highbd_8_sub_pixel_variance8x16_c, 8),
907         SubpelVarianceParams(3, 3, &vpx_highbd_8_sub_pixel_variance8x8_c, 8),
908         SubpelVarianceParams(3, 2, &vpx_highbd_8_sub_pixel_variance8x4_c, 8),
909         SubpelVarianceParams(2, 3, &vpx_highbd_8_sub_pixel_variance4x8_c, 8),
910         SubpelVarianceParams(2, 2, &vpx_highbd_8_sub_pixel_variance4x4_c, 8),
911         SubpelVarianceParams(6, 6, &vpx_highbd_10_sub_pixel_variance64x64_c,
912                              10),
913         SubpelVarianceParams(6, 5, &vpx_highbd_10_sub_pixel_variance64x32_c,
914                              10),
915         SubpelVarianceParams(5, 6, &vpx_highbd_10_sub_pixel_variance32x64_c,
916                              10),
917         SubpelVarianceParams(5, 5, &vpx_highbd_10_sub_pixel_variance32x32_c,
918                              10),
919         SubpelVarianceParams(5, 4, &vpx_highbd_10_sub_pixel_variance32x16_c,
920                              10),
921         SubpelVarianceParams(4, 5, &vpx_highbd_10_sub_pixel_variance16x32_c,
922                              10),
923         SubpelVarianceParams(4, 4, &vpx_highbd_10_sub_pixel_variance16x16_c,
924                              10),
925         SubpelVarianceParams(4, 3, &vpx_highbd_10_sub_pixel_variance16x8_c, 10),
926         SubpelVarianceParams(3, 4, &vpx_highbd_10_sub_pixel_variance8x16_c, 10),
927         SubpelVarianceParams(3, 3, &vpx_highbd_10_sub_pixel_variance8x8_c, 10),
928         SubpelVarianceParams(3, 2, &vpx_highbd_10_sub_pixel_variance8x4_c, 10),
929         SubpelVarianceParams(2, 3, &vpx_highbd_10_sub_pixel_variance4x8_c, 10),
930         SubpelVarianceParams(2, 2, &vpx_highbd_10_sub_pixel_variance4x4_c, 10),
931         SubpelVarianceParams(6, 6, &vpx_highbd_12_sub_pixel_variance64x64_c,
932                              12),
933         SubpelVarianceParams(6, 5, &vpx_highbd_12_sub_pixel_variance64x32_c,
934                              12),
935         SubpelVarianceParams(5, 6, &vpx_highbd_12_sub_pixel_variance32x64_c,
936                              12),
937         SubpelVarianceParams(5, 5, &vpx_highbd_12_sub_pixel_variance32x32_c,
938                              12),
939         SubpelVarianceParams(5, 4, &vpx_highbd_12_sub_pixel_variance32x16_c,
940                              12),
941         SubpelVarianceParams(4, 5, &vpx_highbd_12_sub_pixel_variance16x32_c,
942                              12),
943         SubpelVarianceParams(4, 4, &vpx_highbd_12_sub_pixel_variance16x16_c,
944                              12),
945         SubpelVarianceParams(4, 3, &vpx_highbd_12_sub_pixel_variance16x8_c, 12),
946         SubpelVarianceParams(3, 4, &vpx_highbd_12_sub_pixel_variance8x16_c, 12),
947         SubpelVarianceParams(3, 3, &vpx_highbd_12_sub_pixel_variance8x8_c, 12),
948         SubpelVarianceParams(3, 2, &vpx_highbd_12_sub_pixel_variance8x4_c, 12),
949         SubpelVarianceParams(2, 3, &vpx_highbd_12_sub_pixel_variance4x8_c, 12),
950         SubpelVarianceParams(2, 2, &vpx_highbd_12_sub_pixel_variance4x4_c,
951                              12)));
952
953 INSTANTIATE_TEST_CASE_P(
954     C, VpxHBDSubpelAvgVarianceTest,
955     ::testing::Values(
956         SubpelAvgVarianceParams(6, 6,
957                                 &vpx_highbd_8_sub_pixel_avg_variance64x64_c, 8),
958         SubpelAvgVarianceParams(6, 5,
959                                 &vpx_highbd_8_sub_pixel_avg_variance64x32_c, 8),
960         SubpelAvgVarianceParams(5, 6,
961                                 &vpx_highbd_8_sub_pixel_avg_variance32x64_c, 8),
962         SubpelAvgVarianceParams(5, 5,
963                                 &vpx_highbd_8_sub_pixel_avg_variance32x32_c, 8),
964         SubpelAvgVarianceParams(5, 4,
965                                 &vpx_highbd_8_sub_pixel_avg_variance32x16_c, 8),
966         SubpelAvgVarianceParams(4, 5,
967                                 &vpx_highbd_8_sub_pixel_avg_variance16x32_c, 8),
968         SubpelAvgVarianceParams(4, 4,
969                                 &vpx_highbd_8_sub_pixel_avg_variance16x16_c, 8),
970         SubpelAvgVarianceParams(4, 3,
971                                 &vpx_highbd_8_sub_pixel_avg_variance16x8_c, 8),
972         SubpelAvgVarianceParams(3, 4,
973                                 &vpx_highbd_8_sub_pixel_avg_variance8x16_c, 8),
974         SubpelAvgVarianceParams(3, 3, &vpx_highbd_8_sub_pixel_avg_variance8x8_c,
975                                 8),
976         SubpelAvgVarianceParams(3, 2, &vpx_highbd_8_sub_pixel_avg_variance8x4_c,
977                                 8),
978         SubpelAvgVarianceParams(2, 3, &vpx_highbd_8_sub_pixel_avg_variance4x8_c,
979                                 8),
980         SubpelAvgVarianceParams(2, 2, &vpx_highbd_8_sub_pixel_avg_variance4x4_c,
981                                 8),
982         SubpelAvgVarianceParams(6, 6,
983                                 &vpx_highbd_10_sub_pixel_avg_variance64x64_c,
984                                 10),
985         SubpelAvgVarianceParams(6, 5,
986                                 &vpx_highbd_10_sub_pixel_avg_variance64x32_c,
987                                 10),
988         SubpelAvgVarianceParams(5, 6,
989                                 &vpx_highbd_10_sub_pixel_avg_variance32x64_c,
990                                 10),
991         SubpelAvgVarianceParams(5, 5,
992                                 &vpx_highbd_10_sub_pixel_avg_variance32x32_c,
993                                 10),
994         SubpelAvgVarianceParams(5, 4,
995                                 &vpx_highbd_10_sub_pixel_avg_variance32x16_c,
996                                 10),
997         SubpelAvgVarianceParams(4, 5,
998                                 &vpx_highbd_10_sub_pixel_avg_variance16x32_c,
999                                 10),
1000         SubpelAvgVarianceParams(4, 4,
1001                                 &vpx_highbd_10_sub_pixel_avg_variance16x16_c,
1002                                 10),
1003         SubpelAvgVarianceParams(4, 3,
1004                                 &vpx_highbd_10_sub_pixel_avg_variance16x8_c,
1005                                 10),
1006         SubpelAvgVarianceParams(3, 4,
1007                                 &vpx_highbd_10_sub_pixel_avg_variance8x16_c,
1008                                 10),
1009         SubpelAvgVarianceParams(3, 3,
1010                                 &vpx_highbd_10_sub_pixel_avg_variance8x8_c, 10),
1011         SubpelAvgVarianceParams(3, 2,
1012                                 &vpx_highbd_10_sub_pixel_avg_variance8x4_c, 10),
1013         SubpelAvgVarianceParams(2, 3,
1014                                 &vpx_highbd_10_sub_pixel_avg_variance4x8_c, 10),
1015         SubpelAvgVarianceParams(2, 2,
1016                                 &vpx_highbd_10_sub_pixel_avg_variance4x4_c, 10),
1017         SubpelAvgVarianceParams(6, 6,
1018                                 &vpx_highbd_12_sub_pixel_avg_variance64x64_c,
1019                                 12),
1020         SubpelAvgVarianceParams(6, 5,
1021                                 &vpx_highbd_12_sub_pixel_avg_variance64x32_c,
1022                                 12),
1023         SubpelAvgVarianceParams(5, 6,
1024                                 &vpx_highbd_12_sub_pixel_avg_variance32x64_c,
1025                                 12),
1026         SubpelAvgVarianceParams(5, 5,
1027                                 &vpx_highbd_12_sub_pixel_avg_variance32x32_c,
1028                                 12),
1029         SubpelAvgVarianceParams(5, 4,
1030                                 &vpx_highbd_12_sub_pixel_avg_variance32x16_c,
1031                                 12),
1032         SubpelAvgVarianceParams(4, 5,
1033                                 &vpx_highbd_12_sub_pixel_avg_variance16x32_c,
1034                                 12),
1035         SubpelAvgVarianceParams(4, 4,
1036                                 &vpx_highbd_12_sub_pixel_avg_variance16x16_c,
1037                                 12),
1038         SubpelAvgVarianceParams(4, 3,
1039                                 &vpx_highbd_12_sub_pixel_avg_variance16x8_c,
1040                                 12),
1041         SubpelAvgVarianceParams(3, 4,
1042                                 &vpx_highbd_12_sub_pixel_avg_variance8x16_c,
1043                                 12),
1044         SubpelAvgVarianceParams(3, 3,
1045                                 &vpx_highbd_12_sub_pixel_avg_variance8x8_c, 12),
1046         SubpelAvgVarianceParams(3, 2,
1047                                 &vpx_highbd_12_sub_pixel_avg_variance8x4_c, 12),
1048         SubpelAvgVarianceParams(2, 3,
1049                                 &vpx_highbd_12_sub_pixel_avg_variance4x8_c, 12),
1050         SubpelAvgVarianceParams(2, 2,
1051                                 &vpx_highbd_12_sub_pixel_avg_variance4x4_c,
1052                                 12)));
1053 #endif  // CONFIG_VP9_HIGHBITDEPTH
1054
1055 #if HAVE_SSE2
1056 INSTANTIATE_TEST_CASE_P(SSE2, SumOfSquaresTest,
1057                         ::testing::Values(vpx_get_mb_ss_sse2));
1058
1059 INSTANTIATE_TEST_CASE_P(SSE2, VpxMseTest,
1060                         ::testing::Values(MseParams(4, 4, &vpx_mse16x16_sse2),
1061                                           MseParams(4, 3, &vpx_mse16x8_sse2),
1062                                           MseParams(3, 4, &vpx_mse8x16_sse2),
1063                                           MseParams(3, 3, &vpx_mse8x8_sse2)));
1064
1065 INSTANTIATE_TEST_CASE_P(
1066     SSE2, VpxVarianceTest,
1067     ::testing::Values(VarianceParams(6, 6, &vpx_variance64x64_sse2),
1068                       VarianceParams(6, 5, &vpx_variance64x32_sse2),
1069                       VarianceParams(5, 6, &vpx_variance32x64_sse2),
1070                       VarianceParams(5, 5, &vpx_variance32x32_sse2),
1071                       VarianceParams(5, 4, &vpx_variance32x16_sse2),
1072                       VarianceParams(4, 5, &vpx_variance16x32_sse2),
1073                       VarianceParams(4, 4, &vpx_variance16x16_sse2),
1074                       VarianceParams(4, 3, &vpx_variance16x8_sse2),
1075                       VarianceParams(3, 4, &vpx_variance8x16_sse2),
1076                       VarianceParams(3, 3, &vpx_variance8x8_sse2),
1077                       VarianceParams(3, 2, &vpx_variance8x4_sse2),
1078                       VarianceParams(2, 3, &vpx_variance4x8_sse2),
1079                       VarianceParams(2, 2, &vpx_variance4x4_sse2)));
1080
1081 INSTANTIATE_TEST_CASE_P(
1082     SSE2, VpxSubpelVarianceTest,
1083     ::testing::Values(
1084         SubpelVarianceParams(6, 6, &vpx_sub_pixel_variance64x64_sse2, 0),
1085         SubpelVarianceParams(6, 5, &vpx_sub_pixel_variance64x32_sse2, 0),
1086         SubpelVarianceParams(5, 6, &vpx_sub_pixel_variance32x64_sse2, 0),
1087         SubpelVarianceParams(5, 5, &vpx_sub_pixel_variance32x32_sse2, 0),
1088         SubpelVarianceParams(5, 4, &vpx_sub_pixel_variance32x16_sse2, 0),
1089         SubpelVarianceParams(4, 5, &vpx_sub_pixel_variance16x32_sse2, 0),
1090         SubpelVarianceParams(4, 4, &vpx_sub_pixel_variance16x16_sse2, 0),
1091         SubpelVarianceParams(4, 3, &vpx_sub_pixel_variance16x8_sse2, 0),
1092         SubpelVarianceParams(3, 4, &vpx_sub_pixel_variance8x16_sse2, 0),
1093         SubpelVarianceParams(3, 3, &vpx_sub_pixel_variance8x8_sse2, 0),
1094         SubpelVarianceParams(3, 2, &vpx_sub_pixel_variance8x4_sse2, 0),
1095         SubpelVarianceParams(2, 3, &vpx_sub_pixel_variance4x8_sse2, 0),
1096         SubpelVarianceParams(2, 2, &vpx_sub_pixel_variance4x4_sse2, 0)));
1097
1098 INSTANTIATE_TEST_CASE_P(
1099     SSE2, VpxSubpelAvgVarianceTest,
1100     ::testing::Values(
1101         SubpelAvgVarianceParams(6, 6, &vpx_sub_pixel_avg_variance64x64_sse2, 0),
1102         SubpelAvgVarianceParams(6, 5, &vpx_sub_pixel_avg_variance64x32_sse2, 0),
1103         SubpelAvgVarianceParams(5, 6, &vpx_sub_pixel_avg_variance32x64_sse2, 0),
1104         SubpelAvgVarianceParams(5, 5, &vpx_sub_pixel_avg_variance32x32_sse2, 0),
1105         SubpelAvgVarianceParams(5, 4, &vpx_sub_pixel_avg_variance32x16_sse2, 0),
1106         SubpelAvgVarianceParams(4, 5, &vpx_sub_pixel_avg_variance16x32_sse2, 0),
1107         SubpelAvgVarianceParams(4, 4, &vpx_sub_pixel_avg_variance16x16_sse2, 0),
1108         SubpelAvgVarianceParams(4, 3, &vpx_sub_pixel_avg_variance16x8_sse2, 0),
1109         SubpelAvgVarianceParams(3, 4, &vpx_sub_pixel_avg_variance8x16_sse2, 0),
1110         SubpelAvgVarianceParams(3, 3, &vpx_sub_pixel_avg_variance8x8_sse2, 0),
1111         SubpelAvgVarianceParams(3, 2, &vpx_sub_pixel_avg_variance8x4_sse2, 0),
1112         SubpelAvgVarianceParams(2, 3, &vpx_sub_pixel_avg_variance4x8_sse2, 0),
1113         SubpelAvgVarianceParams(2, 2, &vpx_sub_pixel_avg_variance4x4_sse2, 0)));
1114
1115 #if CONFIG_VP9_HIGHBITDEPTH
1116 /* TODO(debargha): This test does not support the highbd version
1117 INSTANTIATE_TEST_CASE_P(
1118     SSE2, VpxHBDMseTest,
1119     ::testing::Values(MseParams(4, 4, &vpx_highbd_12_mse16x16_sse2),
1120                       MseParams(4, 3, &vpx_highbd_12_mse16x8_sse2),
1121                       MseParams(3, 4, &vpx_highbd_12_mse8x16_sse2),
1122                       MseParams(3, 3, &vpx_highbd_12_mse8x8_sse2),
1123                       MseParams(4, 4, &vpx_highbd_10_mse16x16_sse2),
1124                       MseParams(4, 3, &vpx_highbd_10_mse16x8_sse2),
1125                       MseParams(3, 4, &vpx_highbd_10_mse8x16_sse2),
1126                       MseParams(3, 3, &vpx_highbd_10_mse8x8_sse2),
1127                       MseParams(4, 4, &vpx_highbd_8_mse16x16_sse2),
1128                       MseParams(4, 3, &vpx_highbd_8_mse16x8_sse2),
1129                       MseParams(3, 4, &vpx_highbd_8_mse8x16_sse2),
1130                       MseParams(3, 3, &vpx_highbd_8_mse8x8_sse2)));
1131 */
1132
1133 INSTANTIATE_TEST_CASE_P(
1134     SSE2, VpxHBDVarianceTest,
1135     ::testing::Values(
1136         VarianceParams(6, 6, &vpx_highbd_12_variance64x64_sse2, 12),
1137         VarianceParams(6, 5, &vpx_highbd_12_variance64x32_sse2, 12),
1138         VarianceParams(5, 6, &vpx_highbd_12_variance32x64_sse2, 12),
1139         VarianceParams(5, 5, &vpx_highbd_12_variance32x32_sse2, 12),
1140         VarianceParams(5, 4, &vpx_highbd_12_variance32x16_sse2, 12),
1141         VarianceParams(4, 5, &vpx_highbd_12_variance16x32_sse2, 12),
1142         VarianceParams(4, 4, &vpx_highbd_12_variance16x16_sse2, 12),
1143         VarianceParams(4, 3, &vpx_highbd_12_variance16x8_sse2, 12),
1144         VarianceParams(3, 4, &vpx_highbd_12_variance8x16_sse2, 12),
1145         VarianceParams(3, 3, &vpx_highbd_12_variance8x8_sse2, 12),
1146         VarianceParams(6, 6, &vpx_highbd_10_variance64x64_sse2, 10),
1147         VarianceParams(6, 5, &vpx_highbd_10_variance64x32_sse2, 10),
1148         VarianceParams(5, 6, &vpx_highbd_10_variance32x64_sse2, 10),
1149         VarianceParams(5, 5, &vpx_highbd_10_variance32x32_sse2, 10),
1150         VarianceParams(5, 4, &vpx_highbd_10_variance32x16_sse2, 10),
1151         VarianceParams(4, 5, &vpx_highbd_10_variance16x32_sse2, 10),
1152         VarianceParams(4, 4, &vpx_highbd_10_variance16x16_sse2, 10),
1153         VarianceParams(4, 3, &vpx_highbd_10_variance16x8_sse2, 10),
1154         VarianceParams(3, 4, &vpx_highbd_10_variance8x16_sse2, 10),
1155         VarianceParams(3, 3, &vpx_highbd_10_variance8x8_sse2, 10),
1156         VarianceParams(6, 6, &vpx_highbd_8_variance64x64_sse2, 8),
1157         VarianceParams(6, 5, &vpx_highbd_8_variance64x32_sse2, 8),
1158         VarianceParams(5, 6, &vpx_highbd_8_variance32x64_sse2, 8),
1159         VarianceParams(5, 5, &vpx_highbd_8_variance32x32_sse2, 8),
1160         VarianceParams(5, 4, &vpx_highbd_8_variance32x16_sse2, 8),
1161         VarianceParams(4, 5, &vpx_highbd_8_variance16x32_sse2, 8),
1162         VarianceParams(4, 4, &vpx_highbd_8_variance16x16_sse2, 8),
1163         VarianceParams(4, 3, &vpx_highbd_8_variance16x8_sse2, 8),
1164         VarianceParams(3, 4, &vpx_highbd_8_variance8x16_sse2, 8),
1165         VarianceParams(3, 3, &vpx_highbd_8_variance8x8_sse2, 8)));
1166
1167 INSTANTIATE_TEST_CASE_P(
1168     SSE2, VpxHBDSubpelVarianceTest,
1169     ::testing::Values(
1170         SubpelVarianceParams(6, 6, &vpx_highbd_12_sub_pixel_variance64x64_sse2,
1171                              12),
1172         SubpelVarianceParams(6, 5, &vpx_highbd_12_sub_pixel_variance64x32_sse2,
1173                              12),
1174         SubpelVarianceParams(5, 6, &vpx_highbd_12_sub_pixel_variance32x64_sse2,
1175                              12),
1176         SubpelVarianceParams(5, 5, &vpx_highbd_12_sub_pixel_variance32x32_sse2,
1177                              12),
1178         SubpelVarianceParams(5, 4, &vpx_highbd_12_sub_pixel_variance32x16_sse2,
1179                              12),
1180         SubpelVarianceParams(4, 5, &vpx_highbd_12_sub_pixel_variance16x32_sse2,
1181                              12),
1182         SubpelVarianceParams(4, 4, &vpx_highbd_12_sub_pixel_variance16x16_sse2,
1183                              12),
1184         SubpelVarianceParams(4, 3, &vpx_highbd_12_sub_pixel_variance16x8_sse2,
1185                              12),
1186         SubpelVarianceParams(3, 4, &vpx_highbd_12_sub_pixel_variance8x16_sse2,
1187                              12),
1188         SubpelVarianceParams(3, 3, &vpx_highbd_12_sub_pixel_variance8x8_sse2,
1189                              12),
1190         SubpelVarianceParams(3, 2, &vpx_highbd_12_sub_pixel_variance8x4_sse2,
1191                              12),
1192         SubpelVarianceParams(6, 6, &vpx_highbd_10_sub_pixel_variance64x64_sse2,
1193                              10),
1194         SubpelVarianceParams(6, 5, &vpx_highbd_10_sub_pixel_variance64x32_sse2,
1195                              10),
1196         SubpelVarianceParams(5, 6, &vpx_highbd_10_sub_pixel_variance32x64_sse2,
1197                              10),
1198         SubpelVarianceParams(5, 5, &vpx_highbd_10_sub_pixel_variance32x32_sse2,
1199                              10),
1200         SubpelVarianceParams(5, 4, &vpx_highbd_10_sub_pixel_variance32x16_sse2,
1201                              10),
1202         SubpelVarianceParams(4, 5, &vpx_highbd_10_sub_pixel_variance16x32_sse2,
1203                              10),
1204         SubpelVarianceParams(4, 4, &vpx_highbd_10_sub_pixel_variance16x16_sse2,
1205                              10),
1206         SubpelVarianceParams(4, 3, &vpx_highbd_10_sub_pixel_variance16x8_sse2,
1207                              10),
1208         SubpelVarianceParams(3, 4, &vpx_highbd_10_sub_pixel_variance8x16_sse2,
1209                              10),
1210         SubpelVarianceParams(3, 3, &vpx_highbd_10_sub_pixel_variance8x8_sse2,
1211                              10),
1212         SubpelVarianceParams(3, 2, &vpx_highbd_10_sub_pixel_variance8x4_sse2,
1213                              10),
1214         SubpelVarianceParams(6, 6, &vpx_highbd_8_sub_pixel_variance64x64_sse2,
1215                              8),
1216         SubpelVarianceParams(6, 5, &vpx_highbd_8_sub_pixel_variance64x32_sse2,
1217                              8),
1218         SubpelVarianceParams(5, 6, &vpx_highbd_8_sub_pixel_variance32x64_sse2,
1219                              8),
1220         SubpelVarianceParams(5, 5, &vpx_highbd_8_sub_pixel_variance32x32_sse2,
1221                              8),
1222         SubpelVarianceParams(5, 4, &vpx_highbd_8_sub_pixel_variance32x16_sse2,
1223                              8),
1224         SubpelVarianceParams(4, 5, &vpx_highbd_8_sub_pixel_variance16x32_sse2,
1225                              8),
1226         SubpelVarianceParams(4, 4, &vpx_highbd_8_sub_pixel_variance16x16_sse2,
1227                              8),
1228         SubpelVarianceParams(4, 3, &vpx_highbd_8_sub_pixel_variance16x8_sse2,
1229                              8),
1230         SubpelVarianceParams(3, 4, &vpx_highbd_8_sub_pixel_variance8x16_sse2,
1231                              8),
1232         SubpelVarianceParams(3, 3, &vpx_highbd_8_sub_pixel_variance8x8_sse2, 8),
1233         SubpelVarianceParams(3, 2, &vpx_highbd_8_sub_pixel_variance8x4_sse2,
1234                              8)));
1235
1236 INSTANTIATE_TEST_CASE_P(
1237     SSE2, VpxHBDSubpelAvgVarianceTest,
1238     ::testing::Values(
1239         SubpelAvgVarianceParams(6, 6,
1240                                 &vpx_highbd_12_sub_pixel_avg_variance64x64_sse2,
1241                                 12),
1242         SubpelAvgVarianceParams(6, 5,
1243                                 &vpx_highbd_12_sub_pixel_avg_variance64x32_sse2,
1244                                 12),
1245         SubpelAvgVarianceParams(5, 6,
1246                                 &vpx_highbd_12_sub_pixel_avg_variance32x64_sse2,
1247                                 12),
1248         SubpelAvgVarianceParams(5, 5,
1249                                 &vpx_highbd_12_sub_pixel_avg_variance32x32_sse2,
1250                                 12),
1251         SubpelAvgVarianceParams(5, 4,
1252                                 &vpx_highbd_12_sub_pixel_avg_variance32x16_sse2,
1253                                 12),
1254         SubpelAvgVarianceParams(4, 5,
1255                                 &vpx_highbd_12_sub_pixel_avg_variance16x32_sse2,
1256                                 12),
1257         SubpelAvgVarianceParams(4, 4,
1258                                 &vpx_highbd_12_sub_pixel_avg_variance16x16_sse2,
1259                                 12),
1260         SubpelAvgVarianceParams(4, 3,
1261                                 &vpx_highbd_12_sub_pixel_avg_variance16x8_sse2,
1262                                 12),
1263         SubpelAvgVarianceParams(3, 4,
1264                                 &vpx_highbd_12_sub_pixel_avg_variance8x16_sse2,
1265                                 12),
1266         SubpelAvgVarianceParams(3, 3,
1267                                 &vpx_highbd_12_sub_pixel_avg_variance8x8_sse2,
1268                                 12),
1269         SubpelAvgVarianceParams(3, 2,
1270                                 &vpx_highbd_12_sub_pixel_avg_variance8x4_sse2,
1271                                 12),
1272         SubpelAvgVarianceParams(6, 6,
1273                                 &vpx_highbd_10_sub_pixel_avg_variance64x64_sse2,
1274                                 10),
1275         SubpelAvgVarianceParams(6, 5,
1276                                 &vpx_highbd_10_sub_pixel_avg_variance64x32_sse2,
1277                                 10),
1278         SubpelAvgVarianceParams(5, 6,
1279                                 &vpx_highbd_10_sub_pixel_avg_variance32x64_sse2,
1280                                 10),
1281         SubpelAvgVarianceParams(5, 5,
1282                                 &vpx_highbd_10_sub_pixel_avg_variance32x32_sse2,
1283                                 10),
1284         SubpelAvgVarianceParams(5, 4,
1285                                 &vpx_highbd_10_sub_pixel_avg_variance32x16_sse2,
1286                                 10),
1287         SubpelAvgVarianceParams(4, 5,
1288                                 &vpx_highbd_10_sub_pixel_avg_variance16x32_sse2,
1289                                 10),
1290         SubpelAvgVarianceParams(4, 4,
1291                                 &vpx_highbd_10_sub_pixel_avg_variance16x16_sse2,
1292                                 10),
1293         SubpelAvgVarianceParams(4, 3,
1294                                 &vpx_highbd_10_sub_pixel_avg_variance16x8_sse2,
1295                                 10),
1296         SubpelAvgVarianceParams(3, 4,
1297                                 &vpx_highbd_10_sub_pixel_avg_variance8x16_sse2,
1298                                 10),
1299         SubpelAvgVarianceParams(3, 3,
1300                                 &vpx_highbd_10_sub_pixel_avg_variance8x8_sse2,
1301                                 10),
1302         SubpelAvgVarianceParams(3, 2,
1303                                 &vpx_highbd_10_sub_pixel_avg_variance8x4_sse2,
1304                                 10),
1305         SubpelAvgVarianceParams(6, 6,
1306                                 &vpx_highbd_8_sub_pixel_avg_variance64x64_sse2,
1307                                 8),
1308         SubpelAvgVarianceParams(6, 5,
1309                                 &vpx_highbd_8_sub_pixel_avg_variance64x32_sse2,
1310                                 8),
1311         SubpelAvgVarianceParams(5, 6,
1312                                 &vpx_highbd_8_sub_pixel_avg_variance32x64_sse2,
1313                                 8),
1314         SubpelAvgVarianceParams(5, 5,
1315                                 &vpx_highbd_8_sub_pixel_avg_variance32x32_sse2,
1316                                 8),
1317         SubpelAvgVarianceParams(5, 4,
1318                                 &vpx_highbd_8_sub_pixel_avg_variance32x16_sse2,
1319                                 8),
1320         SubpelAvgVarianceParams(4, 5,
1321                                 &vpx_highbd_8_sub_pixel_avg_variance16x32_sse2,
1322                                 8),
1323         SubpelAvgVarianceParams(4, 4,
1324                                 &vpx_highbd_8_sub_pixel_avg_variance16x16_sse2,
1325                                 8),
1326         SubpelAvgVarianceParams(4, 3,
1327                                 &vpx_highbd_8_sub_pixel_avg_variance16x8_sse2,
1328                                 8),
1329         SubpelAvgVarianceParams(3, 4,
1330                                 &vpx_highbd_8_sub_pixel_avg_variance8x16_sse2,
1331                                 8),
1332         SubpelAvgVarianceParams(3, 3,
1333                                 &vpx_highbd_8_sub_pixel_avg_variance8x8_sse2,
1334                                 8),
1335         SubpelAvgVarianceParams(3, 2,
1336                                 &vpx_highbd_8_sub_pixel_avg_variance8x4_sse2,
1337                                 8)));
1338 #endif  // CONFIG_VP9_HIGHBITDEPTH
1339 #endif  // HAVE_SSE2
1340
1341 #if HAVE_SSSE3
1342 INSTANTIATE_TEST_CASE_P(
1343     SSSE3, VpxSubpelVarianceTest,
1344     ::testing::Values(
1345         SubpelVarianceParams(6, 6, &vpx_sub_pixel_variance64x64_ssse3, 0),
1346         SubpelVarianceParams(6, 5, &vpx_sub_pixel_variance64x32_ssse3, 0),
1347         SubpelVarianceParams(5, 6, &vpx_sub_pixel_variance32x64_ssse3, 0),
1348         SubpelVarianceParams(5, 5, &vpx_sub_pixel_variance32x32_ssse3, 0),
1349         SubpelVarianceParams(5, 4, &vpx_sub_pixel_variance32x16_ssse3, 0),
1350         SubpelVarianceParams(4, 5, &vpx_sub_pixel_variance16x32_ssse3, 0),
1351         SubpelVarianceParams(4, 4, &vpx_sub_pixel_variance16x16_ssse3, 0),
1352         SubpelVarianceParams(4, 3, &vpx_sub_pixel_variance16x8_ssse3, 0),
1353         SubpelVarianceParams(3, 4, &vpx_sub_pixel_variance8x16_ssse3, 0),
1354         SubpelVarianceParams(3, 3, &vpx_sub_pixel_variance8x8_ssse3, 0),
1355         SubpelVarianceParams(3, 2, &vpx_sub_pixel_variance8x4_ssse3, 0),
1356         SubpelVarianceParams(2, 3, &vpx_sub_pixel_variance4x8_ssse3, 0),
1357         SubpelVarianceParams(2, 2, &vpx_sub_pixel_variance4x4_ssse3, 0)));
1358
1359 INSTANTIATE_TEST_CASE_P(
1360     SSSE3, VpxSubpelAvgVarianceTest,
1361     ::testing::Values(
1362         SubpelAvgVarianceParams(6, 6, &vpx_sub_pixel_avg_variance64x64_ssse3,
1363                                 0),
1364         SubpelAvgVarianceParams(6, 5, &vpx_sub_pixel_avg_variance64x32_ssse3,
1365                                 0),
1366         SubpelAvgVarianceParams(5, 6, &vpx_sub_pixel_avg_variance32x64_ssse3,
1367                                 0),
1368         SubpelAvgVarianceParams(5, 5, &vpx_sub_pixel_avg_variance32x32_ssse3,
1369                                 0),
1370         SubpelAvgVarianceParams(5, 4, &vpx_sub_pixel_avg_variance32x16_ssse3,
1371                                 0),
1372         SubpelAvgVarianceParams(4, 5, &vpx_sub_pixel_avg_variance16x32_ssse3,
1373                                 0),
1374         SubpelAvgVarianceParams(4, 4, &vpx_sub_pixel_avg_variance16x16_ssse3,
1375                                 0),
1376         SubpelAvgVarianceParams(4, 3, &vpx_sub_pixel_avg_variance16x8_ssse3, 0),
1377         SubpelAvgVarianceParams(3, 4, &vpx_sub_pixel_avg_variance8x16_ssse3, 0),
1378         SubpelAvgVarianceParams(3, 3, &vpx_sub_pixel_avg_variance8x8_ssse3, 0),
1379         SubpelAvgVarianceParams(3, 2, &vpx_sub_pixel_avg_variance8x4_ssse3, 0),
1380         SubpelAvgVarianceParams(2, 3, &vpx_sub_pixel_avg_variance4x8_ssse3, 0),
1381         SubpelAvgVarianceParams(2, 2, &vpx_sub_pixel_avg_variance4x4_ssse3,
1382                                 0)));
1383 #endif  // HAVE_SSSE3
1384
1385 #if HAVE_AVX2
1386 INSTANTIATE_TEST_CASE_P(AVX2, VpxMseTest,
1387                         ::testing::Values(MseParams(4, 4, &vpx_mse16x16_avx2)));
1388
1389 INSTANTIATE_TEST_CASE_P(
1390     AVX2, VpxVarianceTest,
1391     ::testing::Values(VarianceParams(6, 6, &vpx_variance64x64_avx2),
1392                       VarianceParams(6, 5, &vpx_variance64x32_avx2),
1393                       VarianceParams(5, 5, &vpx_variance32x32_avx2),
1394                       VarianceParams(5, 4, &vpx_variance32x16_avx2),
1395                       VarianceParams(4, 4, &vpx_variance16x16_avx2)));
1396
1397 INSTANTIATE_TEST_CASE_P(
1398     AVX2, VpxSubpelVarianceTest,
1399     ::testing::Values(
1400         SubpelVarianceParams(6, 6, &vpx_sub_pixel_variance64x64_avx2, 0),
1401         SubpelVarianceParams(5, 5, &vpx_sub_pixel_variance32x32_avx2, 0)));
1402
1403 INSTANTIATE_TEST_CASE_P(
1404     AVX2, VpxSubpelAvgVarianceTest,
1405     ::testing::Values(
1406         SubpelAvgVarianceParams(6, 6, &vpx_sub_pixel_avg_variance64x64_avx2, 0),
1407         SubpelAvgVarianceParams(5, 5, &vpx_sub_pixel_avg_variance32x32_avx2,
1408                                 0)));
1409 #endif  // HAVE_AVX2
1410
1411 #if HAVE_NEON
1412 INSTANTIATE_TEST_CASE_P(NEON, VpxSseTest,
1413                         ::testing::Values(SseParams(2, 2,
1414                                                     &vpx_get4x4sse_cs_neon)));
1415
1416 INSTANTIATE_TEST_CASE_P(NEON, VpxMseTest,
1417                         ::testing::Values(MseParams(4, 4, &vpx_mse16x16_neon)));
1418
1419 INSTANTIATE_TEST_CASE_P(
1420     NEON, VpxVarianceTest,
1421     ::testing::Values(VarianceParams(6, 6, &vpx_variance64x64_neon),
1422                       VarianceParams(6, 5, &vpx_variance64x32_neon),
1423                       VarianceParams(5, 6, &vpx_variance32x64_neon),
1424                       VarianceParams(5, 5, &vpx_variance32x32_neon),
1425                       VarianceParams(5, 4, &vpx_variance32x16_neon),
1426                       VarianceParams(4, 5, &vpx_variance16x32_neon),
1427                       VarianceParams(4, 4, &vpx_variance16x16_neon),
1428                       VarianceParams(4, 3, &vpx_variance16x8_neon),
1429                       VarianceParams(3, 4, &vpx_variance8x16_neon),
1430                       VarianceParams(3, 3, &vpx_variance8x8_neon),
1431                       VarianceParams(3, 2, &vpx_variance8x4_neon),
1432                       VarianceParams(2, 3, &vpx_variance4x8_neon),
1433                       VarianceParams(2, 2, &vpx_variance4x4_neon)));
1434
1435 INSTANTIATE_TEST_CASE_P(
1436     NEON, VpxSubpelVarianceTest,
1437     ::testing::Values(
1438         SubpelVarianceParams(6, 6, &vpx_sub_pixel_variance64x64_neon, 0),
1439         SubpelVarianceParams(6, 5, &vpx_sub_pixel_variance64x32_neon, 0),
1440         SubpelVarianceParams(5, 6, &vpx_sub_pixel_variance32x64_neon, 0),
1441         SubpelVarianceParams(5, 5, &vpx_sub_pixel_variance32x32_neon, 0),
1442         SubpelVarianceParams(5, 4, &vpx_sub_pixel_variance32x16_neon, 0),
1443         SubpelVarianceParams(4, 5, &vpx_sub_pixel_variance16x32_neon, 0),
1444         SubpelVarianceParams(4, 4, &vpx_sub_pixel_variance16x16_neon, 0),
1445         SubpelVarianceParams(4, 3, &vpx_sub_pixel_variance16x8_neon, 0),
1446         SubpelVarianceParams(3, 4, &vpx_sub_pixel_variance8x16_neon, 0),
1447         SubpelVarianceParams(3, 3, &vpx_sub_pixel_variance8x8_neon, 0),
1448         SubpelVarianceParams(3, 2, &vpx_sub_pixel_variance8x4_neon, 0),
1449         SubpelVarianceParams(2, 3, &vpx_sub_pixel_variance4x8_neon, 0),
1450         SubpelVarianceParams(2, 2, &vpx_sub_pixel_variance4x4_neon, 0)));
1451
1452 INSTANTIATE_TEST_CASE_P(
1453     NEON, VpxSubpelAvgVarianceTest,
1454     ::testing::Values(
1455         SubpelAvgVarianceParams(6, 6, &vpx_sub_pixel_avg_variance64x64_neon, 0),
1456         SubpelAvgVarianceParams(6, 5, &vpx_sub_pixel_avg_variance64x32_neon, 0),
1457         SubpelAvgVarianceParams(5, 6, &vpx_sub_pixel_avg_variance32x64_neon, 0),
1458         SubpelAvgVarianceParams(5, 5, &vpx_sub_pixel_avg_variance32x32_neon, 0),
1459         SubpelAvgVarianceParams(5, 4, &vpx_sub_pixel_avg_variance32x16_neon, 0),
1460         SubpelAvgVarianceParams(4, 5, &vpx_sub_pixel_avg_variance16x32_neon, 0),
1461         SubpelAvgVarianceParams(4, 4, &vpx_sub_pixel_avg_variance16x16_neon, 0),
1462         SubpelAvgVarianceParams(4, 3, &vpx_sub_pixel_avg_variance16x8_neon, 0),
1463         SubpelAvgVarianceParams(3, 4, &vpx_sub_pixel_avg_variance8x16_neon, 0),
1464         SubpelAvgVarianceParams(3, 3, &vpx_sub_pixel_avg_variance8x8_neon, 0),
1465         SubpelAvgVarianceParams(3, 2, &vpx_sub_pixel_avg_variance8x4_neon, 0),
1466         SubpelAvgVarianceParams(2, 3, &vpx_sub_pixel_avg_variance4x8_neon, 0),
1467         SubpelAvgVarianceParams(2, 2, &vpx_sub_pixel_avg_variance4x4_neon, 0)));
1468 #endif  // HAVE_NEON
1469
1470 #if HAVE_MSA
1471 INSTANTIATE_TEST_CASE_P(MSA, SumOfSquaresTest,
1472                         ::testing::Values(vpx_get_mb_ss_msa));
1473
1474 INSTANTIATE_TEST_CASE_P(MSA, VpxSseTest,
1475                         ::testing::Values(SseParams(2, 2,
1476                                                     &vpx_get4x4sse_cs_msa)));
1477
1478 INSTANTIATE_TEST_CASE_P(MSA, VpxMseTest,
1479                         ::testing::Values(MseParams(4, 4, &vpx_mse16x16_msa),
1480                                           MseParams(4, 3, &vpx_mse16x8_msa),
1481                                           MseParams(3, 4, &vpx_mse8x16_msa),
1482                                           MseParams(3, 3, &vpx_mse8x8_msa)));
1483
1484 INSTANTIATE_TEST_CASE_P(
1485     MSA, VpxVarianceTest,
1486     ::testing::Values(VarianceParams(6, 6, &vpx_variance64x64_msa),
1487                       VarianceParams(6, 5, &vpx_variance64x32_msa),
1488                       VarianceParams(5, 6, &vpx_variance32x64_msa),
1489                       VarianceParams(5, 5, &vpx_variance32x32_msa),
1490                       VarianceParams(5, 4, &vpx_variance32x16_msa),
1491                       VarianceParams(4, 5, &vpx_variance16x32_msa),
1492                       VarianceParams(4, 4, &vpx_variance16x16_msa),
1493                       VarianceParams(4, 3, &vpx_variance16x8_msa),
1494                       VarianceParams(3, 4, &vpx_variance8x16_msa),
1495                       VarianceParams(3, 3, &vpx_variance8x8_msa),
1496                       VarianceParams(3, 2, &vpx_variance8x4_msa),
1497                       VarianceParams(2, 3, &vpx_variance4x8_msa),
1498                       VarianceParams(2, 2, &vpx_variance4x4_msa)));
1499
1500 INSTANTIATE_TEST_CASE_P(
1501     MSA, VpxSubpelVarianceTest,
1502     ::testing::Values(
1503         SubpelVarianceParams(2, 2, &vpx_sub_pixel_variance4x4_msa, 0),
1504         SubpelVarianceParams(2, 3, &vpx_sub_pixel_variance4x8_msa, 0),
1505         SubpelVarianceParams(3, 2, &vpx_sub_pixel_variance8x4_msa, 0),
1506         SubpelVarianceParams(3, 3, &vpx_sub_pixel_variance8x8_msa, 0),
1507         SubpelVarianceParams(3, 4, &vpx_sub_pixel_variance8x16_msa, 0),
1508         SubpelVarianceParams(4, 3, &vpx_sub_pixel_variance16x8_msa, 0),
1509         SubpelVarianceParams(4, 4, &vpx_sub_pixel_variance16x16_msa, 0),
1510         SubpelVarianceParams(4, 5, &vpx_sub_pixel_variance16x32_msa, 0),
1511         SubpelVarianceParams(5, 4, &vpx_sub_pixel_variance32x16_msa, 0),
1512         SubpelVarianceParams(5, 5, &vpx_sub_pixel_variance32x32_msa, 0),
1513         SubpelVarianceParams(5, 6, &vpx_sub_pixel_variance32x64_msa, 0),
1514         SubpelVarianceParams(6, 5, &vpx_sub_pixel_variance64x32_msa, 0),
1515         SubpelVarianceParams(6, 6, &vpx_sub_pixel_variance64x64_msa, 0)));
1516
1517 INSTANTIATE_TEST_CASE_P(
1518     MSA, VpxSubpelAvgVarianceTest,
1519     ::testing::Values(
1520         SubpelAvgVarianceParams(6, 6, &vpx_sub_pixel_avg_variance64x64_msa, 0),
1521         SubpelAvgVarianceParams(6, 5, &vpx_sub_pixel_avg_variance64x32_msa, 0),
1522         SubpelAvgVarianceParams(5, 6, &vpx_sub_pixel_avg_variance32x64_msa, 0),
1523         SubpelAvgVarianceParams(5, 5, &vpx_sub_pixel_avg_variance32x32_msa, 0),
1524         SubpelAvgVarianceParams(5, 4, &vpx_sub_pixel_avg_variance32x16_msa, 0),
1525         SubpelAvgVarianceParams(4, 5, &vpx_sub_pixel_avg_variance16x32_msa, 0),
1526         SubpelAvgVarianceParams(4, 4, &vpx_sub_pixel_avg_variance16x16_msa, 0),
1527         SubpelAvgVarianceParams(4, 3, &vpx_sub_pixel_avg_variance16x8_msa, 0),
1528         SubpelAvgVarianceParams(3, 4, &vpx_sub_pixel_avg_variance8x16_msa, 0),
1529         SubpelAvgVarianceParams(3, 3, &vpx_sub_pixel_avg_variance8x8_msa, 0),
1530         SubpelAvgVarianceParams(3, 2, &vpx_sub_pixel_avg_variance8x4_msa, 0),
1531         SubpelAvgVarianceParams(2, 3, &vpx_sub_pixel_avg_variance4x8_msa, 0),
1532         SubpelAvgVarianceParams(2, 2, &vpx_sub_pixel_avg_variance4x4_msa, 0)));
1533 #endif  // HAVE_MSA
1534
1535 #if HAVE_VSX
1536 INSTANTIATE_TEST_CASE_P(VSX, SumOfSquaresTest,
1537                         ::testing::Values(vpx_get_mb_ss_vsx));
1538
1539 INSTANTIATE_TEST_CASE_P(VSX, VpxSseTest,
1540                         ::testing::Values(SseParams(2, 2,
1541                                                     &vpx_get4x4sse_cs_vsx)));
1542 #endif  // HAVE_VSX
1543
1544 #if HAVE_MMI
1545 INSTANTIATE_TEST_CASE_P(MMI, VpxMseTest,
1546                         ::testing::Values(MseParams(4, 4, &vpx_mse16x16_mmi),
1547                                           MseParams(4, 3, &vpx_mse16x8_mmi),
1548                                           MseParams(3, 4, &vpx_mse8x16_mmi),
1549                                           MseParams(3, 3, &vpx_mse8x8_mmi)));
1550
1551 INSTANTIATE_TEST_CASE_P(
1552     MMI, VpxVarianceTest,
1553     ::testing::Values(VarianceParams(6, 6, &vpx_variance64x64_mmi),
1554                       VarianceParams(6, 5, &vpx_variance64x32_mmi),
1555                       VarianceParams(5, 6, &vpx_variance32x64_mmi),
1556                       VarianceParams(5, 5, &vpx_variance32x32_mmi),
1557                       VarianceParams(5, 4, &vpx_variance32x16_mmi),
1558                       VarianceParams(4, 5, &vpx_variance16x32_mmi),
1559                       VarianceParams(4, 4, &vpx_variance16x16_mmi),
1560                       VarianceParams(4, 3, &vpx_variance16x8_mmi),
1561                       VarianceParams(3, 4, &vpx_variance8x16_mmi),
1562                       VarianceParams(3, 3, &vpx_variance8x8_mmi),
1563                       VarianceParams(3, 2, &vpx_variance8x4_mmi),
1564                       VarianceParams(2, 3, &vpx_variance4x8_mmi),
1565                       VarianceParams(2, 2, &vpx_variance4x4_mmi)));
1566
1567 INSTANTIATE_TEST_CASE_P(
1568     MMI, VpxSubpelVarianceTest,
1569     ::testing::Values(
1570         SubpelVarianceParams(6, 6, &vpx_sub_pixel_variance64x64_mmi, 0),
1571         SubpelVarianceParams(6, 5, &vpx_sub_pixel_variance64x32_mmi, 0),
1572         SubpelVarianceParams(5, 6, &vpx_sub_pixel_variance32x64_mmi, 0),
1573         SubpelVarianceParams(5, 5, &vpx_sub_pixel_variance32x32_mmi, 0),
1574         SubpelVarianceParams(5, 4, &vpx_sub_pixel_variance32x16_mmi, 0),
1575         SubpelVarianceParams(4, 5, &vpx_sub_pixel_variance16x32_mmi, 0),
1576         SubpelVarianceParams(4, 4, &vpx_sub_pixel_variance16x16_mmi, 0),
1577         SubpelVarianceParams(4, 3, &vpx_sub_pixel_variance16x8_mmi, 0),
1578         SubpelVarianceParams(3, 4, &vpx_sub_pixel_variance8x16_mmi, 0),
1579         SubpelVarianceParams(3, 3, &vpx_sub_pixel_variance8x8_mmi, 0),
1580         SubpelVarianceParams(3, 2, &vpx_sub_pixel_variance8x4_mmi, 0),
1581         SubpelVarianceParams(2, 3, &vpx_sub_pixel_variance4x8_mmi, 0),
1582         SubpelVarianceParams(2, 2, &vpx_sub_pixel_variance4x4_mmi, 0)));
1583
1584 INSTANTIATE_TEST_CASE_P(
1585     MMI, VpxSubpelAvgVarianceTest,
1586     ::testing::Values(
1587         SubpelAvgVarianceParams(6, 6, &vpx_sub_pixel_avg_variance64x64_mmi, 0),
1588         SubpelAvgVarianceParams(6, 5, &vpx_sub_pixel_avg_variance64x32_mmi, 0),
1589         SubpelAvgVarianceParams(5, 6, &vpx_sub_pixel_avg_variance32x64_mmi, 0),
1590         SubpelAvgVarianceParams(5, 5, &vpx_sub_pixel_avg_variance32x32_mmi, 0),
1591         SubpelAvgVarianceParams(5, 4, &vpx_sub_pixel_avg_variance32x16_mmi, 0),
1592         SubpelAvgVarianceParams(4, 5, &vpx_sub_pixel_avg_variance16x32_mmi, 0),
1593         SubpelAvgVarianceParams(4, 4, &vpx_sub_pixel_avg_variance16x16_mmi, 0),
1594         SubpelAvgVarianceParams(4, 3, &vpx_sub_pixel_avg_variance16x8_mmi, 0),
1595         SubpelAvgVarianceParams(3, 4, &vpx_sub_pixel_avg_variance8x16_mmi, 0),
1596         SubpelAvgVarianceParams(3, 3, &vpx_sub_pixel_avg_variance8x8_mmi, 0),
1597         SubpelAvgVarianceParams(3, 2, &vpx_sub_pixel_avg_variance8x4_mmi, 0),
1598         SubpelAvgVarianceParams(2, 3, &vpx_sub_pixel_avg_variance4x8_mmi, 0),
1599         SubpelAvgVarianceParams(2, 2, &vpx_sub_pixel_avg_variance4x4_mmi, 0)));
1600 #endif  // HAVE_MMI
1601 }  // namespace