Merge "Simplify rd_pick_intra_sby_mode()"
[platform/upstream/libvpx.git] / 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 #include <stdlib.h>
11 #include <new>
12
13 #include "third_party/googletest/src/include/gtest/gtest.h"
14
15 #include "test/clear_system_state.h"
16 #include "test/register_state_check.h"
17
18 #include "vpx/vpx_integer.h"
19 #include "./vpx_config.h"
20 #include "vpx_mem/vpx_mem.h"
21 #if CONFIG_VP8_ENCODER
22 # include "./vp8_rtcd.h"
23 # include "vp8/common/variance.h"
24 #endif
25 #if CONFIG_VP9_ENCODER
26 # include "./vp9_rtcd.h"
27 # include "vp9/encoder/vp9_variance.h"
28 #endif
29 #include "test/acm_random.h"
30
31 namespace {
32
33 using ::std::tr1::get;
34 using ::std::tr1::make_tuple;
35 using ::std::tr1::tuple;
36 using libvpx_test::ACMRandom;
37
38 static unsigned int mb_ss_ref(const int16_t *src) {
39   unsigned int res = 0;
40   for (int i = 0; i < 256; ++i) {
41     res += src[i] * src[i];
42   }
43   return res;
44 }
45
46 static unsigned int variance_ref(const uint8_t *ref, const uint8_t *src,
47                                  int l2w, int l2h, unsigned int *sse_ptr) {
48   int se = 0;
49   unsigned int sse = 0;
50   const int w = 1 << l2w, h = 1 << l2h;
51   for (int y = 0; y < h; y++) {
52     for (int x = 0; x < w; x++) {
53       int diff = ref[w * y + x] - src[w * y + x];
54       se += diff;
55       sse += diff * diff;
56     }
57   }
58   *sse_ptr = sse;
59   return sse - (((int64_t) se * se) >> (l2w + l2h));
60 }
61
62 static unsigned int subpel_variance_ref(const uint8_t *ref, const uint8_t *src,
63                                         int l2w, int l2h, int xoff, int yoff,
64                                         unsigned int *sse_ptr) {
65   int se = 0;
66   unsigned int sse = 0;
67   const int w = 1 << l2w, h = 1 << l2h;
68   for (int y = 0; y < h; y++) {
69     for (int x = 0; x < w; x++) {
70       // bilinear interpolation at a 16th pel step
71       const int a1 = ref[(w + 1) * (y + 0) + x + 0];
72       const int a2 = ref[(w + 1) * (y + 0) + x + 1];
73       const int b1 = ref[(w + 1) * (y + 1) + x + 0];
74       const int b2 = ref[(w + 1) * (y + 1) + x + 1];
75       const int a = a1 + (((a2 - a1) * xoff + 8) >> 4);
76       const int b = b1 + (((b2 - b1) * xoff + 8) >> 4);
77       const int r = a + (((b - a) * yoff + 8) >> 4);
78       int diff = r - src[w * y + x];
79       se += diff;
80       sse += diff * diff;
81     }
82   }
83   *sse_ptr = sse;
84   return sse - (((int64_t) se * se) >> (l2w + l2h));
85 }
86
87 typedef unsigned int (*SumOfSquaresFunction)(const int16_t *src);
88
89 class SumOfSquaresTest : public ::testing::TestWithParam<SumOfSquaresFunction> {
90  public:
91   SumOfSquaresTest() : func_(GetParam()) {}
92
93   virtual ~SumOfSquaresTest() {
94     libvpx_test::ClearSystemState();
95   }
96
97  protected:
98   void ConstTest();
99   void RefTest();
100
101   SumOfSquaresFunction func_;
102   ACMRandom rnd_;
103 };
104
105 void SumOfSquaresTest::ConstTest() {
106   int16_t mem[256];
107   unsigned int res;
108   for (int v = 0; v < 256; ++v) {
109     for (int i = 0; i < 256; ++i) {
110       mem[i] = v;
111     }
112     ASM_REGISTER_STATE_CHECK(res = func_(mem));
113     EXPECT_EQ(256u * (v * v), res);
114   }
115 }
116
117 void SumOfSquaresTest::RefTest() {
118   int16_t mem[256];
119   for (int i = 0; i < 100; ++i) {
120     for (int j = 0; j < 256; ++j) {
121       mem[j] = rnd_.Rand8() - rnd_.Rand8();
122     }
123
124     const unsigned int expected = mb_ss_ref(mem);
125     unsigned int res;
126     ASM_REGISTER_STATE_CHECK(res = func_(mem));
127     EXPECT_EQ(expected, res);
128   }
129 }
130
131 template<typename VarianceFunctionType>
132 class VarianceTest
133     : public ::testing::TestWithParam<tuple<int, int, VarianceFunctionType> > {
134  public:
135   virtual void SetUp() {
136     const tuple<int, int, VarianceFunctionType>& params = this->GetParam();
137     log2width_  = get<0>(params);
138     width_ = 1 << log2width_;
139     log2height_ = get<1>(params);
140     height_ = 1 << log2height_;
141     variance_ = get<2>(params);
142
143     rnd_.Reset(ACMRandom::DeterministicSeed());
144     block_size_ = width_ * height_;
145     src_ = reinterpret_cast<uint8_t *>(vpx_memalign(16, block_size_));
146     ref_ = new uint8_t[block_size_];
147     ASSERT_TRUE(src_ != NULL);
148     ASSERT_TRUE(ref_ != NULL);
149   }
150
151   virtual void TearDown() {
152     vpx_free(src_);
153     delete[] ref_;
154     libvpx_test::ClearSystemState();
155   }
156
157  protected:
158   void ZeroTest();
159   void RefTest();
160   void OneQuarterTest();
161
162   ACMRandom rnd_;
163   uint8_t* src_;
164   uint8_t* ref_;
165   int width_, log2width_;
166   int height_, log2height_;
167   int block_size_;
168   VarianceFunctionType variance_;
169 };
170
171 template<typename VarianceFunctionType>
172 void VarianceTest<VarianceFunctionType>::ZeroTest() {
173   for (int i = 0; i <= 255; ++i) {
174     memset(src_, i, block_size_);
175     for (int j = 0; j <= 255; ++j) {
176       memset(ref_, j, block_size_);
177       unsigned int sse;
178       unsigned int var;
179       ASM_REGISTER_STATE_CHECK(
180           var = variance_(src_, width_, ref_, width_, &sse));
181       EXPECT_EQ(0u, var) << "src values: " << i << "ref values: " << j;
182     }
183   }
184 }
185
186 template<typename VarianceFunctionType>
187 void VarianceTest<VarianceFunctionType>::RefTest() {
188   for (int i = 0; i < 10; ++i) {
189     for (int j = 0; j < block_size_; j++) {
190       src_[j] = rnd_.Rand8();
191       ref_[j] = rnd_.Rand8();
192     }
193     unsigned int sse1, sse2;
194     unsigned int var1;
195     ASM_REGISTER_STATE_CHECK(
196         var1 = variance_(src_, width_, ref_, width_, &sse1));
197     const unsigned int var2 = variance_ref(src_, ref_, log2width_,
198                                            log2height_, &sse2);
199     EXPECT_EQ(sse1, sse2);
200     EXPECT_EQ(var1, var2);
201   }
202 }
203
204 template<typename VarianceFunctionType>
205 void VarianceTest<VarianceFunctionType>::OneQuarterTest() {
206   memset(src_, 255, block_size_);
207   const int half = block_size_ / 2;
208   memset(ref_, 255, half);
209   memset(ref_ + half, 0, half);
210   unsigned int sse;
211   unsigned int var;
212   ASM_REGISTER_STATE_CHECK(var = variance_(src_, width_, ref_, width_, &sse));
213   const unsigned int expected = block_size_ * 255 * 255 / 4;
214   EXPECT_EQ(expected, var);
215 }
216
217 #if CONFIG_VP8_ENCODER
218 template<typename MseFunctionType>
219 class MseTest
220     : public ::testing::TestWithParam<tuple<int, int, MseFunctionType> > {
221  public:
222   virtual void SetUp() {
223     const tuple<int, int, MseFunctionType>& params = this->GetParam();
224     log2width_  = get<0>(params);
225     width_ = 1 << log2width_;
226     log2height_ = get<1>(params);
227     height_ = 1 << log2height_;
228     mse_ = get<2>(params);
229
230     rnd(ACMRandom::DeterministicSeed());
231     block_size_ = width_ * height_;
232     src_ = reinterpret_cast<uint8_t *>(vpx_memalign(16, block_size_));
233     ref_ = new uint8_t[block_size_];
234     ASSERT_TRUE(src_ != NULL);
235     ASSERT_TRUE(ref_ != NULL);
236   }
237
238   virtual void TearDown() {
239     vpx_free(src_);
240     delete[] ref_;
241     libvpx_test::ClearSystemState();
242   }
243
244  protected:
245   void RefTest_mse();
246   void RefTest_sse();
247   void MaxTest_mse();
248   void MaxTest_sse();
249
250   ACMRandom rnd;
251   uint8_t* src_;
252   uint8_t* ref_;
253   int width_, log2width_;
254   int height_, log2height_;
255   int block_size_;
256   MseFunctionType mse_;
257 };
258
259 template<typename MseFunctionType>
260 void MseTest<MseFunctionType>::RefTest_mse() {
261   for (int i = 0; i < 10; ++i) {
262     for (int j = 0; j < block_size_; j++) {
263       src_[j] = rnd.Rand8();
264       ref_[j] = rnd.Rand8();
265     }
266     unsigned int sse1, sse2;
267     ASM_REGISTER_STATE_CHECK(mse_(src_, width_, ref_, width_, &sse1));
268     variance_ref(src_, ref_, log2width_, log2height_, &sse2);
269     EXPECT_EQ(sse1, sse2);
270   }
271 }
272
273 template<typename MseFunctionType>
274 void MseTest<MseFunctionType>::RefTest_sse() {
275   for (int i = 0; i < 10; ++i) {
276     for (int j = 0; j < block_size_; j++) {
277       src_[j] = rnd.Rand8();
278       ref_[j] = rnd.Rand8();
279     }
280     unsigned int sse2;
281     unsigned int var1;
282     ASM_REGISTER_STATE_CHECK(
283         var1 = mse_(src_, width_, ref_, width_));
284     variance_ref(src_, ref_, log2width_, log2height_, &sse2);
285     EXPECT_EQ(var1, sse2);
286   }
287 }
288
289 template<typename MseFunctionType>
290 void MseTest<MseFunctionType>::MaxTest_mse() {
291   memset(src_, 255, block_size_);
292   memset(ref_, 0, block_size_);
293   unsigned int sse;
294   ASM_REGISTER_STATE_CHECK(mse_(src_, width_, ref_, width_, &sse));
295   const unsigned int expected = block_size_ * 255 * 255;
296   EXPECT_EQ(expected, sse);
297 }
298
299 template<typename MseFunctionType>
300 void MseTest<MseFunctionType>::MaxTest_sse() {
301   memset(src_, 255, block_size_);
302   memset(ref_, 0, block_size_);
303   unsigned int var;
304   ASM_REGISTER_STATE_CHECK(var = mse_(src_, width_, ref_, width_));
305   const unsigned int expected = block_size_ * 255 * 255;
306   EXPECT_EQ(expected, var);
307 }
308 #endif
309
310 #if CONFIG_VP9_ENCODER
311
312 unsigned int subpel_avg_variance_ref(const uint8_t *ref,
313                                      const uint8_t *src,
314                                      const uint8_t *second_pred,
315                                      int l2w, int l2h,
316                                      int xoff, int yoff,
317                                      unsigned int *sse_ptr) {
318   int se = 0;
319   unsigned int sse = 0;
320   const int w = 1 << l2w, h = 1 << l2h;
321   for (int y = 0; y < h; y++) {
322     for (int x = 0; x < w; x++) {
323       // bilinear interpolation at a 16th pel step
324       const int a1 = ref[(w + 1) * (y + 0) + x + 0];
325       const int a2 = ref[(w + 1) * (y + 0) + x + 1];
326       const int b1 = ref[(w + 1) * (y + 1) + x + 0];
327       const int b2 = ref[(w + 1) * (y + 1) + x + 1];
328       const int a = a1 + (((a2 - a1) * xoff + 8) >> 4);
329       const int b = b1 + (((b2 - b1) * xoff + 8) >> 4);
330       const int r = a + (((b - a) * yoff + 8) >> 4);
331       int diff = ((r + second_pred[w * y + x] + 1) >> 1) - src[w * y + x];
332       se += diff;
333       sse += diff * diff;
334     }
335   }
336   *sse_ptr = sse;
337   return sse - (((int64_t) se * se) >> (l2w + l2h));
338 }
339
340 template<typename SubpelVarianceFunctionType>
341 class SubpelVarianceTest
342     : public ::testing::TestWithParam<tuple<int, int,
343                                             SubpelVarianceFunctionType> > {
344  public:
345   virtual void SetUp() {
346     const tuple<int, int, SubpelVarianceFunctionType>& params =
347         this->GetParam();
348     log2width_  = get<0>(params);
349     width_ = 1 << log2width_;
350     log2height_ = get<1>(params);
351     height_ = 1 << log2height_;
352     subpel_variance_ = get<2>(params);
353
354     rnd_.Reset(ACMRandom::DeterministicSeed());
355     block_size_ = width_ * height_;
356     src_ = reinterpret_cast<uint8_t *>(vpx_memalign(16, block_size_));
357     sec_ = reinterpret_cast<uint8_t *>(vpx_memalign(16, block_size_));
358     ref_ = new uint8_t[block_size_ + width_ + height_ + 1];
359     ASSERT_TRUE(src_ != NULL);
360     ASSERT_TRUE(sec_ != NULL);
361     ASSERT_TRUE(ref_ != NULL);
362   }
363
364   virtual void TearDown() {
365     vpx_free(src_);
366     delete[] ref_;
367     vpx_free(sec_);
368     libvpx_test::ClearSystemState();
369   }
370
371  protected:
372   void RefTest();
373
374   ACMRandom rnd_;
375   uint8_t *src_;
376   uint8_t *ref_;
377   uint8_t *sec_;
378   int width_, log2width_;
379   int height_, log2height_;
380   int block_size_;
381   SubpelVarianceFunctionType subpel_variance_;
382 };
383
384 template<typename SubpelVarianceFunctionType>
385 void SubpelVarianceTest<SubpelVarianceFunctionType>::RefTest() {
386   for (int x = 0; x < 16; ++x) {
387     for (int y = 0; y < 16; ++y) {
388       for (int j = 0; j < block_size_; j++) {
389         src_[j] = rnd_.Rand8();
390       }
391       for (int j = 0; j < block_size_ + width_ + height_ + 1; j++) {
392         ref_[j] = rnd_.Rand8();
393       }
394       unsigned int sse1, sse2;
395       unsigned int var1;
396       ASM_REGISTER_STATE_CHECK(var1 = subpel_variance_(ref_, width_ + 1, x, y,
397                                                        src_, width_, &sse1));
398       const unsigned int var2 = subpel_variance_ref(ref_, src_, log2width_,
399                                                     log2height_, x, y, &sse2);
400       EXPECT_EQ(sse1, sse2) << "at position " << x << ", " << y;
401       EXPECT_EQ(var1, var2) << "at position " << x << ", " << y;
402     }
403   }
404 }
405
406 template<>
407 void SubpelVarianceTest<vp9_subp_avg_variance_fn_t>::RefTest() {
408   for (int x = 0; x < 16; ++x) {
409     for (int y = 0; y < 16; ++y) {
410       for (int j = 0; j < block_size_; j++) {
411         src_[j] = rnd_.Rand8();
412         sec_[j] = rnd_.Rand8();
413       }
414       for (int j = 0; j < block_size_ + width_ + height_ + 1; j++) {
415         ref_[j] = rnd_.Rand8();
416       }
417       unsigned int sse1, sse2;
418       unsigned int var1;
419       ASM_REGISTER_STATE_CHECK(
420           var1 = subpel_variance_(ref_, width_ + 1, x, y,
421                                   src_, width_, &sse1, sec_));
422       const unsigned int var2 = subpel_avg_variance_ref(ref_, src_, sec_,
423                                                         log2width_, log2height_,
424                                                         x, y, &sse2);
425       EXPECT_EQ(sse1, sse2) << "at position " << x << ", " << y;
426       EXPECT_EQ(var1, var2) << "at position " << x << ", " << y;
427     }
428   }
429 }
430
431 #endif  // CONFIG_VP9_ENCODER
432
433 // -----------------------------------------------------------------------------
434 // VP8 test cases.
435
436 namespace vp8 {
437
438 #if CONFIG_VP8_ENCODER
439 typedef unsigned int (*vp8_sse_fn_t)(const unsigned char *src_ptr,
440     int source_stride, const unsigned char *ref_ptr, int  ref_stride);
441
442 typedef MseTest<vp8_sse_fn_t> VP8SseTest;
443 typedef MseTest<vp8_variance_fn_t> VP8MseTest;
444 typedef VarianceTest<vp8_variance_fn_t> VP8VarianceTest;
445
446 TEST_P(VP8SseTest, Ref_sse) { RefTest_sse(); }
447 TEST_P(VP8SseTest, Max_sse) { MaxTest_sse(); }
448 TEST_P(VP8MseTest, Ref_mse) { RefTest_mse(); }
449 TEST_P(VP8MseTest, Max_mse) { MaxTest_mse(); }
450 TEST_P(VP8VarianceTest, Zero) { ZeroTest(); }
451 TEST_P(VP8VarianceTest, Ref) { RefTest(); }
452 TEST_P(VP8VarianceTest, OneQuarter) { OneQuarterTest(); }
453
454 const vp8_sse_fn_t get4x4sse_cs_c = vp8_get4x4sse_cs_c;
455 INSTANTIATE_TEST_CASE_P(
456     C, VP8SseTest,
457     ::testing::Values(make_tuple(2, 2, get4x4sse_cs_c)));
458
459 const vp8_variance_fn_t mse16x16_c = vp8_mse16x16_c;
460 INSTANTIATE_TEST_CASE_P(
461     C, VP8MseTest,
462     ::testing::Values(make_tuple(4, 4, mse16x16_c)));
463
464 const vp8_variance_fn_t variance4x4_c = vp8_variance4x4_c;
465 const vp8_variance_fn_t variance8x8_c = vp8_variance8x8_c;
466 const vp8_variance_fn_t variance8x16_c = vp8_variance8x16_c;
467 const vp8_variance_fn_t variance16x8_c = vp8_variance16x8_c;
468 const vp8_variance_fn_t variance16x16_c = vp8_variance16x16_c;
469 INSTANTIATE_TEST_CASE_P(
470     C, VP8VarianceTest,
471     ::testing::Values(make_tuple(2, 2, variance4x4_c),
472                       make_tuple(3, 3, variance8x8_c),
473                       make_tuple(3, 4, variance8x16_c),
474                       make_tuple(4, 3, variance16x8_c),
475                       make_tuple(4, 4, variance16x16_c)));
476
477 #if HAVE_NEON
478 const vp8_sse_fn_t get4x4sse_cs_neon = vp8_get4x4sse_cs_neon;
479 INSTANTIATE_TEST_CASE_P(
480     NEON, VP8SseTest,
481     ::testing::Values(make_tuple(2, 2, get4x4sse_cs_neon)));
482
483 const vp8_variance_fn_t mse16x16_neon = vp8_mse16x16_neon;
484 INSTANTIATE_TEST_CASE_P(
485     NEON, VP8MseTest,
486     ::testing::Values(make_tuple(4, 4, mse16x16_neon)));
487
488 const vp8_variance_fn_t variance8x8_neon = vp8_variance8x8_neon;
489 const vp8_variance_fn_t variance8x16_neon = vp8_variance8x16_neon;
490 const vp8_variance_fn_t variance16x8_neon = vp8_variance16x8_neon;
491 const vp8_variance_fn_t variance16x16_neon = vp8_variance16x16_neon;
492 INSTANTIATE_TEST_CASE_P(
493     NEON, VP8VarianceTest,
494     ::testing::Values(make_tuple(3, 3, variance8x8_neon),
495                       make_tuple(3, 4, variance8x16_neon),
496                       make_tuple(4, 3, variance16x8_neon),
497                       make_tuple(4, 4, variance16x16_neon)));
498 #endif
499
500
501 #if HAVE_MMX
502 const vp8_variance_fn_t variance4x4_mmx = vp8_variance4x4_mmx;
503 const vp8_variance_fn_t variance8x8_mmx = vp8_variance8x8_mmx;
504 const vp8_variance_fn_t variance8x16_mmx = vp8_variance8x16_mmx;
505 const vp8_variance_fn_t variance16x8_mmx = vp8_variance16x8_mmx;
506 const vp8_variance_fn_t variance16x16_mmx = vp8_variance16x16_mmx;
507 INSTANTIATE_TEST_CASE_P(
508     MMX, VP8VarianceTest,
509     ::testing::Values(make_tuple(2, 2, variance4x4_mmx),
510                       make_tuple(3, 3, variance8x8_mmx),
511                       make_tuple(3, 4, variance8x16_mmx),
512                       make_tuple(4, 3, variance16x8_mmx),
513                       make_tuple(4, 4, variance16x16_mmx)));
514 #endif
515
516 #if HAVE_SSE2
517 const vp8_variance_fn_t variance4x4_wmt = vp8_variance4x4_wmt;
518 const vp8_variance_fn_t variance8x8_wmt = vp8_variance8x8_wmt;
519 const vp8_variance_fn_t variance8x16_wmt = vp8_variance8x16_wmt;
520 const vp8_variance_fn_t variance16x8_wmt = vp8_variance16x8_wmt;
521 const vp8_variance_fn_t variance16x16_wmt = vp8_variance16x16_wmt;
522 INSTANTIATE_TEST_CASE_P(
523     SSE2, VP8VarianceTest,
524     ::testing::Values(make_tuple(2, 2, variance4x4_wmt),
525                       make_tuple(3, 3, variance8x8_wmt),
526                       make_tuple(3, 4, variance8x16_wmt),
527                       make_tuple(4, 3, variance16x8_wmt),
528                       make_tuple(4, 4, variance16x16_wmt)));
529 #endif
530 #endif  // CONFIG_VP8_ENCODER
531
532 }  // namespace vp8
533
534 // -----------------------------------------------------------------------------
535 // VP9 test cases.
536
537 namespace vp9 {
538
539 #if CONFIG_VP9_ENCODER
540
541 TEST_P(SumOfSquaresTest, Const) { ConstTest(); }
542 TEST_P(SumOfSquaresTest, Ref) { RefTest(); }
543
544 INSTANTIATE_TEST_CASE_P(C, SumOfSquaresTest,
545                         ::testing::Values(vp9_get_mb_ss_c));
546
547 typedef VarianceTest<vp9_variance_fn_t> VP9VarianceTest;
548 typedef SubpelVarianceTest<vp9_subpixvariance_fn_t> VP9SubpelVarianceTest;
549 typedef SubpelVarianceTest<vp9_subp_avg_variance_fn_t> VP9SubpelAvgVarianceTest;
550
551 TEST_P(VP9VarianceTest, Zero) { ZeroTest(); }
552 TEST_P(VP9VarianceTest, Ref) { RefTest(); }
553 TEST_P(VP9SubpelVarianceTest, Ref) { RefTest(); }
554 TEST_P(VP9SubpelAvgVarianceTest, Ref) { RefTest(); }
555 TEST_P(VP9VarianceTest, OneQuarter) { OneQuarterTest(); }
556
557 const vp9_variance_fn_t variance4x4_c = vp9_variance4x4_c;
558 const vp9_variance_fn_t variance4x8_c = vp9_variance4x8_c;
559 const vp9_variance_fn_t variance8x4_c = vp9_variance8x4_c;
560 const vp9_variance_fn_t variance8x8_c = vp9_variance8x8_c;
561 const vp9_variance_fn_t variance8x16_c = vp9_variance8x16_c;
562 const vp9_variance_fn_t variance16x8_c = vp9_variance16x8_c;
563 const vp9_variance_fn_t variance16x16_c = vp9_variance16x16_c;
564 const vp9_variance_fn_t variance16x32_c = vp9_variance16x32_c;
565 const vp9_variance_fn_t variance32x16_c = vp9_variance32x16_c;
566 const vp9_variance_fn_t variance32x32_c = vp9_variance32x32_c;
567 const vp9_variance_fn_t variance32x64_c = vp9_variance32x64_c;
568 const vp9_variance_fn_t variance64x32_c = vp9_variance64x32_c;
569 const vp9_variance_fn_t variance64x64_c = vp9_variance64x64_c;
570 INSTANTIATE_TEST_CASE_P(
571     C, VP9VarianceTest,
572     ::testing::Values(make_tuple(2, 2, variance4x4_c),
573                       make_tuple(2, 3, variance4x8_c),
574                       make_tuple(3, 2, variance8x4_c),
575                       make_tuple(3, 3, variance8x8_c),
576                       make_tuple(3, 4, variance8x16_c),
577                       make_tuple(4, 3, variance16x8_c),
578                       make_tuple(4, 4, variance16x16_c),
579                       make_tuple(4, 5, variance16x32_c),
580                       make_tuple(5, 4, variance32x16_c),
581                       make_tuple(5, 5, variance32x32_c),
582                       make_tuple(5, 6, variance32x64_c),
583                       make_tuple(6, 5, variance64x32_c),
584                       make_tuple(6, 6, variance64x64_c)));
585
586 const vp9_subpixvariance_fn_t subpel_variance4x4_c =
587     vp9_sub_pixel_variance4x4_c;
588 const vp9_subpixvariance_fn_t subpel_variance4x8_c =
589     vp9_sub_pixel_variance4x8_c;
590 const vp9_subpixvariance_fn_t subpel_variance8x4_c =
591     vp9_sub_pixel_variance8x4_c;
592 const vp9_subpixvariance_fn_t subpel_variance8x8_c =
593     vp9_sub_pixel_variance8x8_c;
594 const vp9_subpixvariance_fn_t subpel_variance8x16_c =
595     vp9_sub_pixel_variance8x16_c;
596 const vp9_subpixvariance_fn_t subpel_variance16x8_c =
597     vp9_sub_pixel_variance16x8_c;
598 const vp9_subpixvariance_fn_t subpel_variance16x16_c =
599     vp9_sub_pixel_variance16x16_c;
600 const vp9_subpixvariance_fn_t subpel_variance16x32_c =
601     vp9_sub_pixel_variance16x32_c;
602 const vp9_subpixvariance_fn_t subpel_variance32x16_c =
603     vp9_sub_pixel_variance32x16_c;
604 const vp9_subpixvariance_fn_t subpel_variance32x32_c =
605     vp9_sub_pixel_variance32x32_c;
606 const vp9_subpixvariance_fn_t subpel_variance32x64_c =
607     vp9_sub_pixel_variance32x64_c;
608 const vp9_subpixvariance_fn_t subpel_variance64x32_c =
609     vp9_sub_pixel_variance64x32_c;
610 const vp9_subpixvariance_fn_t subpel_variance64x64_c =
611     vp9_sub_pixel_variance64x64_c;
612 INSTANTIATE_TEST_CASE_P(
613     C, VP9SubpelVarianceTest,
614     ::testing::Values(make_tuple(2, 2, subpel_variance4x4_c),
615                       make_tuple(2, 3, subpel_variance4x8_c),
616                       make_tuple(3, 2, subpel_variance8x4_c),
617                       make_tuple(3, 3, subpel_variance8x8_c),
618                       make_tuple(3, 4, subpel_variance8x16_c),
619                       make_tuple(4, 3, subpel_variance16x8_c),
620                       make_tuple(4, 4, subpel_variance16x16_c),
621                       make_tuple(4, 5, subpel_variance16x32_c),
622                       make_tuple(5, 4, subpel_variance32x16_c),
623                       make_tuple(5, 5, subpel_variance32x32_c),
624                       make_tuple(5, 6, subpel_variance32x64_c),
625                       make_tuple(6, 5, subpel_variance64x32_c),
626                       make_tuple(6, 6, subpel_variance64x64_c)));
627
628 const vp9_subp_avg_variance_fn_t subpel_avg_variance4x4_c =
629     vp9_sub_pixel_avg_variance4x4_c;
630 const vp9_subp_avg_variance_fn_t subpel_avg_variance4x8_c =
631     vp9_sub_pixel_avg_variance4x8_c;
632 const vp9_subp_avg_variance_fn_t subpel_avg_variance8x4_c =
633     vp9_sub_pixel_avg_variance8x4_c;
634 const vp9_subp_avg_variance_fn_t subpel_avg_variance8x8_c =
635     vp9_sub_pixel_avg_variance8x8_c;
636 const vp9_subp_avg_variance_fn_t subpel_avg_variance8x16_c =
637     vp9_sub_pixel_avg_variance8x16_c;
638 const vp9_subp_avg_variance_fn_t subpel_avg_variance16x8_c =
639     vp9_sub_pixel_avg_variance16x8_c;
640 const vp9_subp_avg_variance_fn_t subpel_avg_variance16x16_c =
641     vp9_sub_pixel_avg_variance16x16_c;
642 const vp9_subp_avg_variance_fn_t subpel_avg_variance16x32_c =
643     vp9_sub_pixel_avg_variance16x32_c;
644 const vp9_subp_avg_variance_fn_t subpel_avg_variance32x16_c =
645     vp9_sub_pixel_avg_variance32x16_c;
646 const vp9_subp_avg_variance_fn_t subpel_avg_variance32x32_c =
647     vp9_sub_pixel_avg_variance32x32_c;
648 const vp9_subp_avg_variance_fn_t subpel_avg_variance32x64_c =
649     vp9_sub_pixel_avg_variance32x64_c;
650 const vp9_subp_avg_variance_fn_t subpel_avg_variance64x32_c =
651     vp9_sub_pixel_avg_variance64x32_c;
652 const vp9_subp_avg_variance_fn_t subpel_avg_variance64x64_c =
653     vp9_sub_pixel_avg_variance64x64_c;
654 INSTANTIATE_TEST_CASE_P(
655     C, VP9SubpelAvgVarianceTest,
656     ::testing::Values(make_tuple(2, 2, subpel_avg_variance4x4_c),
657                       make_tuple(2, 3, subpel_avg_variance4x8_c),
658                       make_tuple(3, 2, subpel_avg_variance8x4_c),
659                       make_tuple(3, 3, subpel_avg_variance8x8_c),
660                       make_tuple(3, 4, subpel_avg_variance8x16_c),
661                       make_tuple(4, 3, subpel_avg_variance16x8_c),
662                       make_tuple(4, 4, subpel_avg_variance16x16_c),
663                       make_tuple(4, 5, subpel_avg_variance16x32_c),
664                       make_tuple(5, 4, subpel_avg_variance32x16_c),
665                       make_tuple(5, 5, subpel_avg_variance32x32_c),
666                       make_tuple(5, 6, subpel_avg_variance32x64_c),
667                       make_tuple(6, 5, subpel_avg_variance64x32_c),
668                       make_tuple(6, 6, subpel_avg_variance64x64_c)));
669
670 #if HAVE_SSE2
671 #if CONFIG_USE_X86INC
672
673 INSTANTIATE_TEST_CASE_P(SSE2, SumOfSquaresTest,
674                         ::testing::Values(vp9_get_mb_ss_sse2));
675
676 const vp9_variance_fn_t variance4x4_sse2 = vp9_variance4x4_sse2;
677 const vp9_variance_fn_t variance4x8_sse2 = vp9_variance4x8_sse2;
678 const vp9_variance_fn_t variance8x4_sse2 = vp9_variance8x4_sse2;
679 const vp9_variance_fn_t variance8x8_sse2 = vp9_variance8x8_sse2;
680 const vp9_variance_fn_t variance8x16_sse2 = vp9_variance8x16_sse2;
681 const vp9_variance_fn_t variance16x8_sse2 = vp9_variance16x8_sse2;
682 const vp9_variance_fn_t variance16x16_sse2 = vp9_variance16x16_sse2;
683 const vp9_variance_fn_t variance16x32_sse2 = vp9_variance16x32_sse2;
684 const vp9_variance_fn_t variance32x16_sse2 = vp9_variance32x16_sse2;
685 const vp9_variance_fn_t variance32x32_sse2 = vp9_variance32x32_sse2;
686 const vp9_variance_fn_t variance32x64_sse2 = vp9_variance32x64_sse2;
687 const vp9_variance_fn_t variance64x32_sse2 = vp9_variance64x32_sse2;
688 const vp9_variance_fn_t variance64x64_sse2 = vp9_variance64x64_sse2;
689 INSTANTIATE_TEST_CASE_P(
690     SSE2, VP9VarianceTest,
691     ::testing::Values(make_tuple(2, 2, variance4x4_sse2),
692                       make_tuple(2, 3, variance4x8_sse2),
693                       make_tuple(3, 2, variance8x4_sse2),
694                       make_tuple(3, 3, variance8x8_sse2),
695                       make_tuple(3, 4, variance8x16_sse2),
696                       make_tuple(4, 3, variance16x8_sse2),
697                       make_tuple(4, 4, variance16x16_sse2),
698                       make_tuple(4, 5, variance16x32_sse2),
699                       make_tuple(5, 4, variance32x16_sse2),
700                       make_tuple(5, 5, variance32x32_sse2),
701                       make_tuple(5, 6, variance32x64_sse2),
702                       make_tuple(6, 5, variance64x32_sse2),
703                       make_tuple(6, 6, variance64x64_sse2)));
704
705 const vp9_subpixvariance_fn_t subpel_variance4x4_sse =
706     vp9_sub_pixel_variance4x4_sse;
707 const vp9_subpixvariance_fn_t subpel_variance4x8_sse =
708     vp9_sub_pixel_variance4x8_sse;
709 const vp9_subpixvariance_fn_t subpel_variance8x4_sse2 =
710     vp9_sub_pixel_variance8x4_sse2;
711 const vp9_subpixvariance_fn_t subpel_variance8x8_sse2 =
712     vp9_sub_pixel_variance8x8_sse2;
713 const vp9_subpixvariance_fn_t subpel_variance8x16_sse2 =
714     vp9_sub_pixel_variance8x16_sse2;
715 const vp9_subpixvariance_fn_t subpel_variance16x8_sse2 =
716     vp9_sub_pixel_variance16x8_sse2;
717 const vp9_subpixvariance_fn_t subpel_variance16x16_sse2 =
718     vp9_sub_pixel_variance16x16_sse2;
719 const vp9_subpixvariance_fn_t subpel_variance16x32_sse2 =
720     vp9_sub_pixel_variance16x32_sse2;
721 const vp9_subpixvariance_fn_t subpel_variance32x16_sse2 =
722     vp9_sub_pixel_variance32x16_sse2;
723 const vp9_subpixvariance_fn_t subpel_variance32x32_sse2 =
724     vp9_sub_pixel_variance32x32_sse2;
725 const vp9_subpixvariance_fn_t subpel_variance32x64_sse2 =
726     vp9_sub_pixel_variance32x64_sse2;
727 const vp9_subpixvariance_fn_t subpel_variance64x32_sse2 =
728     vp9_sub_pixel_variance64x32_sse2;
729 const vp9_subpixvariance_fn_t subpel_variance64x64_sse2 =
730     vp9_sub_pixel_variance64x64_sse2;
731 INSTANTIATE_TEST_CASE_P(
732     SSE2, VP9SubpelVarianceTest,
733     ::testing::Values(make_tuple(2, 2, subpel_variance4x4_sse),
734                       make_tuple(2, 3, subpel_variance4x8_sse),
735                       make_tuple(3, 2, subpel_variance8x4_sse2),
736                       make_tuple(3, 3, subpel_variance8x8_sse2),
737                       make_tuple(3, 4, subpel_variance8x16_sse2),
738                       make_tuple(4, 3, subpel_variance16x8_sse2),
739                       make_tuple(4, 4, subpel_variance16x16_sse2),
740                       make_tuple(4, 5, subpel_variance16x32_sse2),
741                       make_tuple(5, 4, subpel_variance32x16_sse2),
742                       make_tuple(5, 5, subpel_variance32x32_sse2),
743                       make_tuple(5, 6, subpel_variance32x64_sse2),
744                       make_tuple(6, 5, subpel_variance64x32_sse2),
745                       make_tuple(6, 6, subpel_variance64x64_sse2)));
746
747 const vp9_subp_avg_variance_fn_t subpel_avg_variance4x4_sse =
748     vp9_sub_pixel_avg_variance4x4_sse;
749 const vp9_subp_avg_variance_fn_t subpel_avg_variance4x8_sse =
750     vp9_sub_pixel_avg_variance4x8_sse;
751 const vp9_subp_avg_variance_fn_t subpel_avg_variance8x4_sse2 =
752     vp9_sub_pixel_avg_variance8x4_sse2;
753 const vp9_subp_avg_variance_fn_t subpel_avg_variance8x8_sse2 =
754     vp9_sub_pixel_avg_variance8x8_sse2;
755 const vp9_subp_avg_variance_fn_t subpel_avg_variance8x16_sse2 =
756     vp9_sub_pixel_avg_variance8x16_sse2;
757 const vp9_subp_avg_variance_fn_t subpel_avg_variance16x8_sse2 =
758     vp9_sub_pixel_avg_variance16x8_sse2;
759 const vp9_subp_avg_variance_fn_t subpel_avg_variance16x16_sse2 =
760     vp9_sub_pixel_avg_variance16x16_sse2;
761 const vp9_subp_avg_variance_fn_t subpel_avg_variance16x32_sse2 =
762     vp9_sub_pixel_avg_variance16x32_sse2;
763 const vp9_subp_avg_variance_fn_t subpel_avg_variance32x16_sse2 =
764     vp9_sub_pixel_avg_variance32x16_sse2;
765 const vp9_subp_avg_variance_fn_t subpel_avg_variance32x32_sse2 =
766     vp9_sub_pixel_avg_variance32x32_sse2;
767 const vp9_subp_avg_variance_fn_t subpel_avg_variance32x64_sse2 =
768     vp9_sub_pixel_avg_variance32x64_sse2;
769 const vp9_subp_avg_variance_fn_t subpel_avg_variance64x32_sse2 =
770     vp9_sub_pixel_avg_variance64x32_sse2;
771 const vp9_subp_avg_variance_fn_t subpel_avg_variance64x64_sse2 =
772     vp9_sub_pixel_avg_variance64x64_sse2;
773 INSTANTIATE_TEST_CASE_P(
774     SSE2, VP9SubpelAvgVarianceTest,
775     ::testing::Values(make_tuple(2, 2, subpel_avg_variance4x4_sse),
776                       make_tuple(2, 3, subpel_avg_variance4x8_sse),
777                       make_tuple(3, 2, subpel_avg_variance8x4_sse2),
778                       make_tuple(3, 3, subpel_avg_variance8x8_sse2),
779                       make_tuple(3, 4, subpel_avg_variance8x16_sse2),
780                       make_tuple(4, 3, subpel_avg_variance16x8_sse2),
781                       make_tuple(4, 4, subpel_avg_variance16x16_sse2),
782                       make_tuple(4, 5, subpel_avg_variance16x32_sse2),
783                       make_tuple(5, 4, subpel_avg_variance32x16_sse2),
784                       make_tuple(5, 5, subpel_avg_variance32x32_sse2),
785                       make_tuple(5, 6, subpel_avg_variance32x64_sse2),
786                       make_tuple(6, 5, subpel_avg_variance64x32_sse2),
787                       make_tuple(6, 6, subpel_avg_variance64x64_sse2)));
788 #endif
789 #endif
790
791 #if HAVE_SSSE3
792 #if CONFIG_USE_X86INC
793
794 const vp9_subpixvariance_fn_t subpel_variance4x4_ssse3 =
795     vp9_sub_pixel_variance4x4_ssse3;
796 const vp9_subpixvariance_fn_t subpel_variance4x8_ssse3 =
797     vp9_sub_pixel_variance4x8_ssse3;
798 const vp9_subpixvariance_fn_t subpel_variance8x4_ssse3 =
799     vp9_sub_pixel_variance8x4_ssse3;
800 const vp9_subpixvariance_fn_t subpel_variance8x8_ssse3 =
801     vp9_sub_pixel_variance8x8_ssse3;
802 const vp9_subpixvariance_fn_t subpel_variance8x16_ssse3 =
803     vp9_sub_pixel_variance8x16_ssse3;
804 const vp9_subpixvariance_fn_t subpel_variance16x8_ssse3 =
805     vp9_sub_pixel_variance16x8_ssse3;
806 const vp9_subpixvariance_fn_t subpel_variance16x16_ssse3 =
807     vp9_sub_pixel_variance16x16_ssse3;
808 const vp9_subpixvariance_fn_t subpel_variance16x32_ssse3 =
809     vp9_sub_pixel_variance16x32_ssse3;
810 const vp9_subpixvariance_fn_t subpel_variance32x16_ssse3 =
811     vp9_sub_pixel_variance32x16_ssse3;
812 const vp9_subpixvariance_fn_t subpel_variance32x32_ssse3 =
813     vp9_sub_pixel_variance32x32_ssse3;
814 const vp9_subpixvariance_fn_t subpel_variance32x64_ssse3 =
815     vp9_sub_pixel_variance32x64_ssse3;
816 const vp9_subpixvariance_fn_t subpel_variance64x32_ssse3 =
817     vp9_sub_pixel_variance64x32_ssse3;
818 const vp9_subpixvariance_fn_t subpel_variance64x64_ssse3 =
819     vp9_sub_pixel_variance64x64_ssse3;
820 INSTANTIATE_TEST_CASE_P(
821     SSSE3, VP9SubpelVarianceTest,
822     ::testing::Values(make_tuple(2, 2, subpel_variance4x4_ssse3),
823                       make_tuple(2, 3, subpel_variance4x8_ssse3),
824                       make_tuple(3, 2, subpel_variance8x4_ssse3),
825                       make_tuple(3, 3, subpel_variance8x8_ssse3),
826                       make_tuple(3, 4, subpel_variance8x16_ssse3),
827                       make_tuple(4, 3, subpel_variance16x8_ssse3),
828                       make_tuple(4, 4, subpel_variance16x16_ssse3),
829                       make_tuple(4, 5, subpel_variance16x32_ssse3),
830                       make_tuple(5, 4, subpel_variance32x16_ssse3),
831                       make_tuple(5, 5, subpel_variance32x32_ssse3),
832                       make_tuple(5, 6, subpel_variance32x64_ssse3),
833                       make_tuple(6, 5, subpel_variance64x32_ssse3),
834                       make_tuple(6, 6, subpel_variance64x64_ssse3)));
835
836 const vp9_subp_avg_variance_fn_t subpel_avg_variance4x4_ssse3 =
837     vp9_sub_pixel_avg_variance4x4_ssse3;
838 const vp9_subp_avg_variance_fn_t subpel_avg_variance4x8_ssse3 =
839     vp9_sub_pixel_avg_variance4x8_ssse3;
840 const vp9_subp_avg_variance_fn_t subpel_avg_variance8x4_ssse3 =
841     vp9_sub_pixel_avg_variance8x4_ssse3;
842 const vp9_subp_avg_variance_fn_t subpel_avg_variance8x8_ssse3 =
843     vp9_sub_pixel_avg_variance8x8_ssse3;
844 const vp9_subp_avg_variance_fn_t subpel_avg_variance8x16_ssse3 =
845     vp9_sub_pixel_avg_variance8x16_ssse3;
846 const vp9_subp_avg_variance_fn_t subpel_avg_variance16x8_ssse3 =
847     vp9_sub_pixel_avg_variance16x8_ssse3;
848 const vp9_subp_avg_variance_fn_t subpel_avg_variance16x16_ssse3 =
849     vp9_sub_pixel_avg_variance16x16_ssse3;
850 const vp9_subp_avg_variance_fn_t subpel_avg_variance16x32_ssse3 =
851     vp9_sub_pixel_avg_variance16x32_ssse3;
852 const vp9_subp_avg_variance_fn_t subpel_avg_variance32x16_ssse3 =
853     vp9_sub_pixel_avg_variance32x16_ssse3;
854 const vp9_subp_avg_variance_fn_t subpel_avg_variance32x32_ssse3 =
855     vp9_sub_pixel_avg_variance32x32_ssse3;
856 const vp9_subp_avg_variance_fn_t subpel_avg_variance32x64_ssse3 =
857     vp9_sub_pixel_avg_variance32x64_ssse3;
858 const vp9_subp_avg_variance_fn_t subpel_avg_variance64x32_ssse3 =
859     vp9_sub_pixel_avg_variance64x32_ssse3;
860 const vp9_subp_avg_variance_fn_t subpel_avg_variance64x64_ssse3 =
861     vp9_sub_pixel_avg_variance64x64_ssse3;
862 INSTANTIATE_TEST_CASE_P(
863     SSSE3, VP9SubpelAvgVarianceTest,
864     ::testing::Values(make_tuple(2, 2, subpel_avg_variance4x4_ssse3),
865                       make_tuple(2, 3, subpel_avg_variance4x8_ssse3),
866                       make_tuple(3, 2, subpel_avg_variance8x4_ssse3),
867                       make_tuple(3, 3, subpel_avg_variance8x8_ssse3),
868                       make_tuple(3, 4, subpel_avg_variance8x16_ssse3),
869                       make_tuple(4, 3, subpel_avg_variance16x8_ssse3),
870                       make_tuple(4, 4, subpel_avg_variance16x16_ssse3),
871                       make_tuple(4, 5, subpel_avg_variance16x32_ssse3),
872                       make_tuple(5, 4, subpel_avg_variance32x16_ssse3),
873                       make_tuple(5, 5, subpel_avg_variance32x32_ssse3),
874                       make_tuple(5, 6, subpel_avg_variance32x64_ssse3),
875                       make_tuple(6, 5, subpel_avg_variance64x32_ssse3),
876                       make_tuple(6, 6, subpel_avg_variance64x64_ssse3)));
877 #endif
878 #endif
879
880 #if HAVE_AVX2
881
882 const vp9_variance_fn_t variance16x16_avx2 = vp9_variance16x16_avx2;
883 const vp9_variance_fn_t variance32x16_avx2 = vp9_variance32x16_avx2;
884 const vp9_variance_fn_t variance32x32_avx2 = vp9_variance32x32_avx2;
885 const vp9_variance_fn_t variance64x32_avx2 = vp9_variance64x32_avx2;
886 const vp9_variance_fn_t variance64x64_avx2 = vp9_variance64x64_avx2;
887 INSTANTIATE_TEST_CASE_P(
888     AVX2, VP9VarianceTest,
889     ::testing::Values(make_tuple(4, 4, variance16x16_avx2),
890                       make_tuple(5, 4, variance32x16_avx2),
891                       make_tuple(5, 5, variance32x32_avx2),
892                       make_tuple(6, 5, variance64x32_avx2),
893                       make_tuple(6, 6, variance64x64_avx2)));
894
895 const vp9_subpixvariance_fn_t subpel_variance32x32_avx2 =
896     vp9_sub_pixel_variance32x32_avx2;
897 const vp9_subpixvariance_fn_t subpel_variance64x64_avx2 =
898     vp9_sub_pixel_variance64x64_avx2;
899 INSTANTIATE_TEST_CASE_P(
900     AVX2, VP9SubpelVarianceTest,
901     ::testing::Values(make_tuple(5, 5, subpel_variance32x32_avx2),
902                       make_tuple(6, 6, subpel_variance64x64_avx2)));
903
904 const vp9_subp_avg_variance_fn_t subpel_avg_variance32x32_avx2 =
905     vp9_sub_pixel_avg_variance32x32_avx2;
906 const vp9_subp_avg_variance_fn_t subpel_avg_variance64x64_avx2 =
907     vp9_sub_pixel_avg_variance64x64_avx2;
908 INSTANTIATE_TEST_CASE_P(
909     AVX2, VP9SubpelAvgVarianceTest,
910     ::testing::Values(make_tuple(5, 5, subpel_avg_variance32x32_avx2),
911                       make_tuple(6, 6, subpel_avg_variance64x64_avx2)));
912 #endif  // HAVE_AVX2
913 #if HAVE_NEON
914 const vp9_variance_fn_t variance8x8_neon = vp9_variance8x8_neon;
915 const vp9_variance_fn_t variance16x16_neon = vp9_variance16x16_neon;
916 const vp9_variance_fn_t variance32x32_neon = vp9_variance32x32_neon;
917 INSTANTIATE_TEST_CASE_P(
918     NEON, VP9VarianceTest,
919     ::testing::Values(make_tuple(3, 3, variance8x8_neon),
920                       make_tuple(4, 4, variance16x16_neon),
921                       make_tuple(5, 5, variance32x32_neon)));
922
923 const vp9_subpixvariance_fn_t subpel_variance8x8_neon =
924     vp9_sub_pixel_variance8x8_neon;
925 const vp9_subpixvariance_fn_t subpel_variance16x16_neon =
926     vp9_sub_pixel_variance16x16_neon;
927 const vp9_subpixvariance_fn_t subpel_variance32x32_neon =
928     vp9_sub_pixel_variance32x32_neon;
929 INSTANTIATE_TEST_CASE_P(
930     NEON, VP9SubpelVarianceTest,
931     ::testing::Values(make_tuple(3, 3, subpel_variance8x8_neon),
932                       make_tuple(4, 4, subpel_variance16x16_neon),
933                       make_tuple(5, 5, subpel_variance32x32_neon)));
934 #endif  // HAVE_NEON
935 #endif  // CONFIG_VP9_ENCODER
936
937 }  // namespace vp9
938
939 }  // namespace