xref: /aosp_15_r20/external/libvpx/test/sad_test.cc (revision fb1b10ab9aebc7c7068eedab379b749d7e3900be)
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 <stdio.h>
12 #include <string.h>
13 #include <limits.h>
14 
15 #include "gtest/gtest.h"
16 
17 #include "./vpx_config.h"
18 #include "./vpx_dsp_rtcd.h"
19 #include "test/acm_random.h"
20 #include "test/bench.h"
21 #include "test/clear_system_state.h"
22 #include "test/register_state_check.h"
23 #include "test/util.h"
24 #include "vpx/vpx_codec.h"
25 #include "vpx_mem/vpx_mem.h"
26 #include "vpx_ports/mem.h"
27 #include "vpx_ports/vpx_timer.h"
28 
29 // const[expr] should be sufficient for DECLARE_ALIGNED but early
30 // implementations of c++11 appear to have some issues with it.
31 #define kDataAlignment 32
32 
33 template <typename Function>
34 struct TestParams {
TestParamsTestParams35   TestParams(int w, int h, Function f, int bd = -1)
36       : width(w), height(h), bit_depth(bd), func(f) {}
37   int width, height, bit_depth;
38   Function func;
39 };
40 
41 typedef unsigned int (*SadMxNFunc)(const uint8_t *src_ptr, int src_stride,
42                                    const uint8_t *ref_ptr, int ref_stride);
43 typedef TestParams<SadMxNFunc> SadMxNParam;
44 
45 typedef unsigned int (*SadSkipMxNFunc)(const uint8_t *src_ptr, int src_stride,
46                                        const uint8_t *ref_ptr, int ref_stride);
47 typedef TestParams<SadSkipMxNFunc> SadSkipMxNParam;
48 
49 typedef unsigned int (*SadMxNAvgFunc)(const uint8_t *src_ptr, int src_stride,
50                                       const uint8_t *ref_ptr, int ref_stride,
51                                       const uint8_t *second_pred);
52 typedef TestParams<SadMxNAvgFunc> SadMxNAvgParam;
53 
54 typedef void (*SadMxNx4Func)(const uint8_t *src_ptr, int src_stride,
55                              const uint8_t *const ref_ptr[], int ref_stride,
56                              unsigned int *sad_array);
57 typedef TestParams<SadMxNx4Func> SadMxNx4Param;
58 
59 typedef void (*SadSkipMxNx4Func)(const uint8_t *src_ptr, int src_stride,
60                                  const uint8_t *const ref_ptr[], int ref_stride,
61                                  unsigned int *sad_array);
62 typedef TestParams<SadSkipMxNx4Func> SadSkipMxNx4Param;
63 
64 typedef void (*SadMxNx8Func)(const uint8_t *src_ptr, int src_stride,
65                              const uint8_t *ref_ptr, int ref_stride,
66                              unsigned int *sad_array);
67 
68 using libvpx_test::ACMRandom;
69 
70 namespace {
71 template <typename ParamType>
72 class SADTestBase : public ::testing::TestWithParam<ParamType> {
73  public:
SADTestBase(const ParamType & params)74   explicit SADTestBase(const ParamType &params) : params_(params) {}
75 
SetUp()76   void SetUp() override {
77     source_data8_ = reinterpret_cast<uint8_t *>(
78         vpx_memalign(kDataAlignment, kDataBlockSize));
79     reference_data8_ = reinterpret_cast<uint8_t *>(
80         vpx_memalign(kDataAlignment, kDataBufferSize));
81     second_pred8_ =
82         reinterpret_cast<uint8_t *>(vpx_memalign(kDataAlignment, 64 * 64));
83     source_data16_ = reinterpret_cast<uint16_t *>(
84         vpx_memalign(kDataAlignment, kDataBlockSize * sizeof(uint16_t)));
85     reference_data16_ = reinterpret_cast<uint16_t *>(
86         vpx_memalign(kDataAlignment, kDataBufferSize * sizeof(uint16_t)));
87     second_pred16_ = reinterpret_cast<uint16_t *>(
88         vpx_memalign(kDataAlignment, 64 * 64 * sizeof(uint16_t)));
89 
90     if (params_.bit_depth == -1) {
91       use_high_bit_depth_ = false;
92       bit_depth_ = VPX_BITS_8;
93       source_data_ = source_data8_;
94       reference_data_ = reference_data8_;
95       second_pred_ = second_pred8_;
96 #if CONFIG_VP9_HIGHBITDEPTH
97     } else {
98       use_high_bit_depth_ = true;
99       bit_depth_ = static_cast<vpx_bit_depth_t>(params_.bit_depth);
100       source_data_ = CONVERT_TO_BYTEPTR(source_data16_);
101       reference_data_ = CONVERT_TO_BYTEPTR(reference_data16_);
102       second_pred_ = CONVERT_TO_BYTEPTR(second_pred16_);
103 #endif  // CONFIG_VP9_HIGHBITDEPTH
104     }
105     mask_ = (1 << bit_depth_) - 1;
106     source_stride_ = (params_.width + 63) & ~63;
107     reference_stride_ = params_.width * 2;
108     rnd_.Reset(ACMRandom::DeterministicSeed());
109   }
110 
TearDown()111   void TearDown() override {
112     vpx_free(source_data8_);
113     source_data8_ = nullptr;
114     vpx_free(reference_data8_);
115     reference_data8_ = nullptr;
116     vpx_free(second_pred8_);
117     second_pred8_ = nullptr;
118     vpx_free(source_data16_);
119     source_data16_ = nullptr;
120     vpx_free(reference_data16_);
121     reference_data16_ = nullptr;
122     vpx_free(second_pred16_);
123     second_pred16_ = nullptr;
124 
125     libvpx_test::ClearSystemState();
126   }
127 
128  protected:
129   // Handle blocks up to 4 blocks 64x64 with stride up to 128
130   // crbug.com/webm/1660
131   static const int kDataBlockSize = 64 * 128;
132   static const int kDataBufferSize = 4 * kDataBlockSize;
133 
GetBlockRefOffset(int block_idx) const134   int GetBlockRefOffset(int block_idx) const {
135     return block_idx * kDataBlockSize;
136   }
137 
GetReferenceFromOffset(int ref_offset) const138   uint8_t *GetReferenceFromOffset(int ref_offset) const {
139     assert((params_.height - 1) * reference_stride_ + params_.width - 1 +
140                ref_offset <
141            kDataBufferSize);
142 #if CONFIG_VP9_HIGHBITDEPTH
143     if (use_high_bit_depth_) {
144       return CONVERT_TO_BYTEPTR(CONVERT_TO_SHORTPTR(reference_data_) +
145                                 ref_offset);
146     }
147 #endif  // CONFIG_VP9_HIGHBITDEPTH
148     return reference_data_ + ref_offset;
149   }
150 
GetReference(int block_idx) const151   uint8_t *GetReference(int block_idx) const {
152     return GetReferenceFromOffset(GetBlockRefOffset(block_idx));
153   }
154 
155   // Sum of Absolute Differences. Given two blocks, calculate the absolute
156   // difference between two pixels in the same relative location; accumulate.
ReferenceSAD(int ref_offset) const157   uint32_t ReferenceSAD(int ref_offset) const {
158     uint32_t sad = 0;
159     const uint8_t *const reference8 = GetReferenceFromOffset(ref_offset);
160     const uint8_t *const source8 = source_data_;
161 #if CONFIG_VP9_HIGHBITDEPTH
162     const uint16_t *const reference16 =
163         CONVERT_TO_SHORTPTR(GetReferenceFromOffset(ref_offset));
164     const uint16_t *const source16 = CONVERT_TO_SHORTPTR(source_data_);
165 #endif  // CONFIG_VP9_HIGHBITDEPTH
166     for (int h = 0; h < params_.height; ++h) {
167       for (int w = 0; w < params_.width; ++w) {
168         if (!use_high_bit_depth_) {
169           sad += abs(source8[h * source_stride_ + w] -
170                      reference8[h * reference_stride_ + w]);
171 #if CONFIG_VP9_HIGHBITDEPTH
172         } else {
173           sad += abs(source16[h * source_stride_ + w] -
174                      reference16[h * reference_stride_ + w]);
175 #endif  // CONFIG_VP9_HIGHBITDEPTH
176         }
177       }
178     }
179     return sad;
180   }
181 
182   // Sum of Absolute Differences Skip rows. Given two blocks, calculate the
183   // absolute difference between two pixels in the same relative location every
184   // other row; accumulate and double the result at the end.
ReferenceSADSkip(int ref_offset) const185   uint32_t ReferenceSADSkip(int ref_offset) const {
186     uint32_t sad = 0;
187     const uint8_t *const reference8 = GetReferenceFromOffset(ref_offset);
188     const uint8_t *const source8 = source_data_;
189 #if CONFIG_VP9_HIGHBITDEPTH
190     const uint16_t *const reference16 =
191         CONVERT_TO_SHORTPTR(GetReferenceFromOffset(ref_offset));
192     const uint16_t *const source16 = CONVERT_TO_SHORTPTR(source_data_);
193 #endif  // CONFIG_VP9_HIGHBITDEPTH
194     for (int h = 0; h < params_.height; h += 2) {
195       for (int w = 0; w < params_.width; ++w) {
196         if (!use_high_bit_depth_) {
197           sad += abs(source8[h * source_stride_ + w] -
198                      reference8[h * reference_stride_ + w]);
199 #if CONFIG_VP9_HIGHBITDEPTH
200         } else {
201           sad += abs(source16[h * source_stride_ + w] -
202                      reference16[h * reference_stride_ + w]);
203 #endif  // CONFIG_VP9_HIGHBITDEPTH
204         }
205       }
206     }
207     return sad * 2;
208   }
209 
210   // Sum of Absolute Differences Average. Given two blocks, and a prediction
211   // calculate the absolute difference between one pixel and average of the
212   // corresponding and predicted pixels; accumulate.
ReferenceSADavg(int block_idx) const213   unsigned int ReferenceSADavg(int block_idx) const {
214     unsigned int sad = 0;
215     const uint8_t *const reference8 = GetReference(block_idx);
216     const uint8_t *const source8 = source_data_;
217     const uint8_t *const second_pred8 = second_pred_;
218 #if CONFIG_VP9_HIGHBITDEPTH
219     const uint16_t *const reference16 =
220         CONVERT_TO_SHORTPTR(GetReference(block_idx));
221     const uint16_t *const source16 = CONVERT_TO_SHORTPTR(source_data_);
222     const uint16_t *const second_pred16 = CONVERT_TO_SHORTPTR(second_pred_);
223 #endif  // CONFIG_VP9_HIGHBITDEPTH
224     for (int h = 0; h < params_.height; ++h) {
225       for (int w = 0; w < params_.width; ++w) {
226         if (!use_high_bit_depth_) {
227           const int tmp = second_pred8[h * params_.width + w] +
228                           reference8[h * reference_stride_ + w];
229           const uint8_t comp_pred = ROUND_POWER_OF_TWO(tmp, 1);
230           sad += abs(source8[h * source_stride_ + w] - comp_pred);
231 #if CONFIG_VP9_HIGHBITDEPTH
232         } else {
233           const int tmp = second_pred16[h * params_.width + w] +
234                           reference16[h * reference_stride_ + w];
235           const uint16_t comp_pred = ROUND_POWER_OF_TWO(tmp, 1);
236           sad += abs(source16[h * source_stride_ + w] - comp_pred);
237 #endif  // CONFIG_VP9_HIGHBITDEPTH
238         }
239       }
240     }
241     return sad;
242   }
243 
FillConstant(uint8_t * data,int stride,uint16_t fill_constant) const244   void FillConstant(uint8_t *data, int stride, uint16_t fill_constant) const {
245     uint8_t *data8 = data;
246 #if CONFIG_VP9_HIGHBITDEPTH
247     uint16_t *data16 = CONVERT_TO_SHORTPTR(data);
248 #endif  // CONFIG_VP9_HIGHBITDEPTH
249     for (int h = 0; h < params_.height; ++h) {
250       for (int w = 0; w < params_.width; ++w) {
251         if (!use_high_bit_depth_) {
252           data8[h * stride + w] = static_cast<uint8_t>(fill_constant);
253 #if CONFIG_VP9_HIGHBITDEPTH
254         } else {
255           data16[h * stride + w] = fill_constant;
256 #endif  // CONFIG_VP9_HIGHBITDEPTH
257         }
258       }
259     }
260   }
261 
FillRandomWH(uint8_t * data,int stride,int w,int h)262   void FillRandomWH(uint8_t *data, int stride, int w, int h) {
263     uint8_t *data8 = data;
264 #if CONFIG_VP9_HIGHBITDEPTH
265     uint16_t *data16 = CONVERT_TO_SHORTPTR(data);
266 #endif  // CONFIG_VP9_HIGHBITDEPTH
267     for (int r = 0; r < h; ++r) {
268       for (int c = 0; c < w; ++c) {
269         if (!use_high_bit_depth_) {
270           data8[r * stride + c] = rnd_.Rand8();
271 #if CONFIG_VP9_HIGHBITDEPTH
272         } else {
273           data16[r * stride + c] = rnd_.Rand16() & mask_;
274 #endif  // CONFIG_VP9_HIGHBITDEPTH
275         }
276       }
277     }
278   }
279 
FillRandom(uint8_t * data,int stride)280   void FillRandom(uint8_t *data, int stride) {
281     FillRandomWH(data, stride, params_.width, params_.height);
282   }
283 
284   uint32_t mask_;
285   vpx_bit_depth_t bit_depth_;
286   int source_stride_;
287   int reference_stride_;
288   bool use_high_bit_depth_;
289 
290   uint8_t *source_data_;
291   uint8_t *reference_data_;
292   uint8_t *second_pred_;
293   uint8_t *source_data8_;
294   uint8_t *reference_data8_;
295   uint8_t *second_pred8_;
296   uint16_t *source_data16_;
297   uint16_t *reference_data16_;
298   uint16_t *second_pred16_;
299 
300   ACMRandom rnd_;
301   ParamType params_;
302 };
303 
304 class SADx4Test : public SADTestBase<SadMxNx4Param> {
305  public:
SADx4Test()306   SADx4Test() : SADTestBase(GetParam()) {}
307 
308  protected:
SADs(unsigned int * results) const309   void SADs(unsigned int *results) const {
310     const uint8_t *references[] = { GetReference(0), GetReference(1),
311                                     GetReference(2), GetReference(3) };
312 
313     ASM_REGISTER_STATE_CHECK(params_.func(
314         source_data_, source_stride_, references, reference_stride_, results));
315   }
316 
CheckSADs() const317   void CheckSADs() const {
318     uint32_t reference_sad;
319     DECLARE_ALIGNED(kDataAlignment, uint32_t, exp_sad[4]);
320 
321     SADs(exp_sad);
322     for (int block = 0; block < 4; ++block) {
323       reference_sad = ReferenceSAD(GetBlockRefOffset(block));
324 
325       EXPECT_EQ(reference_sad, exp_sad[block]) << "block " << block;
326     }
327   }
328 };
329 
330 class SADSkipx4Test : public SADTestBase<SadMxNx4Param> {
331  public:
SADSkipx4Test()332   SADSkipx4Test() : SADTestBase(GetParam()) {}
333 
334  protected:
SADs(unsigned int * results) const335   void SADs(unsigned int *results) const {
336     const uint8_t *references[] = { GetReference(0), GetReference(1),
337                                     GetReference(2), GetReference(3) };
338 
339     ASM_REGISTER_STATE_CHECK(params_.func(
340         source_data_, source_stride_, references, reference_stride_, results));
341   }
342 
CheckSADs() const343   void CheckSADs() const {
344     uint32_t reference_sad;
345     DECLARE_ALIGNED(kDataAlignment, uint32_t, exp_sad[4]);
346 
347     SADs(exp_sad);
348     for (int block = 0; block < 4; ++block) {
349       reference_sad = ReferenceSADSkip(GetBlockRefOffset(block));
350 
351       EXPECT_EQ(reference_sad, exp_sad[block]) << "block " << block;
352     }
353   }
354 };
355 
356 class SADTest : public AbstractBench, public SADTestBase<SadMxNParam> {
357  public:
SADTest()358   SADTest() : SADTestBase(GetParam()) {}
359 
360  protected:
SAD(int block_idx) const361   unsigned int SAD(int block_idx) const {
362     unsigned int ret;
363     const uint8_t *const reference = GetReference(block_idx);
364 
365     ASM_REGISTER_STATE_CHECK(ret = params_.func(source_data_, source_stride_,
366                                                 reference, reference_stride_));
367     return ret;
368   }
369 
CheckSAD() const370   void CheckSAD() const {
371     const unsigned int reference_sad = ReferenceSAD(GetBlockRefOffset(0));
372     const unsigned int exp_sad = SAD(0);
373 
374     ASSERT_EQ(reference_sad, exp_sad);
375   }
376 
Run()377   void Run() override {
378     params_.func(source_data_, source_stride_, reference_data_,
379                  reference_stride_);
380   }
381 };
382 
383 class SADSkipTest : public AbstractBench, public SADTestBase<SadMxNParam> {
384  public:
SADSkipTest()385   SADSkipTest() : SADTestBase(GetParam()) {}
386 
387  protected:
SAD(int block_idx) const388   unsigned int SAD(int block_idx) const {
389     unsigned int ret;
390     const uint8_t *const reference = GetReference(block_idx);
391 
392     ASM_REGISTER_STATE_CHECK(ret = params_.func(source_data_, source_stride_,
393                                                 reference, reference_stride_));
394     return ret;
395   }
396 
CheckSAD() const397   void CheckSAD() const {
398     const unsigned int reference_sad = ReferenceSADSkip(GetBlockRefOffset(0));
399     const unsigned int exp_sad = SAD(0);
400 
401     ASSERT_EQ(reference_sad, exp_sad);
402   }
403 
Run()404   void Run() override {
405     params_.func(source_data_, source_stride_, reference_data_,
406                  reference_stride_);
407   }
408 };
409 
410 class SADavgTest : public AbstractBench, public SADTestBase<SadMxNAvgParam> {
411  public:
SADavgTest()412   SADavgTest() : SADTestBase(GetParam()) {}
413 
414  protected:
SAD_avg(int block_idx) const415   unsigned int SAD_avg(int block_idx) const {
416     unsigned int ret;
417     const uint8_t *const reference = GetReference(block_idx);
418 
419     ASM_REGISTER_STATE_CHECK(ret = params_.func(source_data_, source_stride_,
420                                                 reference, reference_stride_,
421                                                 second_pred_));
422     return ret;
423   }
424 
CheckSAD() const425   void CheckSAD() const {
426     const unsigned int reference_sad = ReferenceSADavg(0);
427     const unsigned int exp_sad = SAD_avg(0);
428 
429     ASSERT_EQ(reference_sad, exp_sad);
430   }
431 
Run()432   void Run() override {
433     params_.func(source_data_, source_stride_, reference_data_,
434                  reference_stride_, second_pred_);
435   }
436 };
437 
TEST_P(SADTest,MaxRef)438 TEST_P(SADTest, MaxRef) {
439   FillConstant(source_data_, source_stride_, 0);
440   FillConstant(reference_data_, reference_stride_, mask_);
441   CheckSAD();
442 }
443 
TEST_P(SADTest,MaxSrc)444 TEST_P(SADTest, MaxSrc) {
445   FillConstant(source_data_, source_stride_, mask_);
446   FillConstant(reference_data_, reference_stride_, 0);
447   CheckSAD();
448 }
449 
TEST_P(SADTest,ShortRef)450 TEST_P(SADTest, ShortRef) {
451   const int tmp_stride = reference_stride_;
452   reference_stride_ >>= 1;
453   FillRandom(source_data_, source_stride_);
454   FillRandom(reference_data_, reference_stride_);
455   CheckSAD();
456   reference_stride_ = tmp_stride;
457 }
458 
TEST_P(SADTest,UnalignedRef)459 TEST_P(SADTest, UnalignedRef) {
460   // The reference frame, but not the source frame, may be unaligned for
461   // certain types of searches.
462   const int tmp_stride = reference_stride_;
463   reference_stride_ -= 1;
464   FillRandom(source_data_, source_stride_);
465   FillRandom(reference_data_, reference_stride_);
466   CheckSAD();
467   reference_stride_ = tmp_stride;
468 }
469 
TEST_P(SADTest,ShortSrc)470 TEST_P(SADTest, ShortSrc) {
471   const int tmp_stride = source_stride_;
472   source_stride_ >>= 1;
473   FillRandom(source_data_, source_stride_);
474   FillRandom(reference_data_, reference_stride_);
475   CheckSAD();
476   source_stride_ = tmp_stride;
477 }
478 
TEST_P(SADTest,DISABLED_Speed)479 TEST_P(SADTest, DISABLED_Speed) {
480   const int kCountSpeedTestBlock = 50000000 / (params_.width * params_.height);
481   FillRandom(source_data_, source_stride_);
482 
483   RunNTimes(kCountSpeedTestBlock);
484 
485   char title[16];
486   snprintf(title, sizeof(title), "%dx%d", params_.width, params_.height);
487   PrintMedian(title);
488 }
489 
TEST_P(SADSkipTest,MaxRef)490 TEST_P(SADSkipTest, MaxRef) {
491   FillConstant(source_data_, source_stride_, 0);
492   FillConstant(reference_data_, reference_stride_, mask_);
493   CheckSAD();
494 }
495 
TEST_P(SADSkipTest,MaxSrc)496 TEST_P(SADSkipTest, MaxSrc) {
497   FillConstant(source_data_, source_stride_, mask_);
498   FillConstant(reference_data_, reference_stride_, 0);
499   CheckSAD();
500 }
501 
TEST_P(SADSkipTest,ShortRef)502 TEST_P(SADSkipTest, ShortRef) {
503   const int tmp_stride = reference_stride_;
504   reference_stride_ >>= 1;
505   FillRandom(source_data_, source_stride_);
506   FillRandom(reference_data_, reference_stride_);
507   CheckSAD();
508   reference_stride_ = tmp_stride;
509 }
510 
TEST_P(SADSkipTest,UnalignedRef)511 TEST_P(SADSkipTest, UnalignedRef) {
512   // The reference frame, but not the source frame, may be unaligned for
513   // certain types of searches.
514   const int tmp_stride = reference_stride_;
515   reference_stride_ -= 1;
516   FillRandom(source_data_, source_stride_);
517   FillRandom(reference_data_, reference_stride_);
518   CheckSAD();
519   reference_stride_ = tmp_stride;
520 }
521 
TEST_P(SADSkipTest,ShortSrc)522 TEST_P(SADSkipTest, ShortSrc) {
523   const int tmp_stride = source_stride_;
524   source_stride_ >>= 1;
525   FillRandom(source_data_, source_stride_);
526   FillRandom(reference_data_, reference_stride_);
527   CheckSAD();
528   source_stride_ = tmp_stride;
529 }
530 
TEST_P(SADSkipTest,DISABLED_Speed)531 TEST_P(SADSkipTest, DISABLED_Speed) {
532   const int kCountSpeedTestBlock = 50000000 / (params_.width * params_.height);
533   FillRandom(source_data_, source_stride_);
534 
535   RunNTimes(kCountSpeedTestBlock);
536 
537   char title[16];
538   snprintf(title, sizeof(title), "%dx%d", params_.width, params_.height);
539   PrintMedian(title);
540 }
541 
TEST_P(SADavgTest,MaxRef)542 TEST_P(SADavgTest, MaxRef) {
543   FillConstant(source_data_, source_stride_, 0);
544   FillConstant(reference_data_, reference_stride_, mask_);
545   FillConstant(second_pred_, params_.width, 0);
546   CheckSAD();
547 }
TEST_P(SADavgTest,MaxSrc)548 TEST_P(SADavgTest, MaxSrc) {
549   FillConstant(source_data_, source_stride_, mask_);
550   FillConstant(reference_data_, reference_stride_, 0);
551   FillConstant(second_pred_, params_.width, 0);
552   CheckSAD();
553 }
554 
TEST_P(SADavgTest,ShortRef)555 TEST_P(SADavgTest, ShortRef) {
556   const int tmp_stride = reference_stride_;
557   reference_stride_ >>= 1;
558   FillRandom(source_data_, source_stride_);
559   FillRandom(reference_data_, reference_stride_);
560   FillRandom(second_pred_, params_.width);
561   CheckSAD();
562   reference_stride_ = tmp_stride;
563 }
564 
TEST_P(SADavgTest,UnalignedRef)565 TEST_P(SADavgTest, UnalignedRef) {
566   // The reference frame, but not the source frame, may be unaligned for
567   // certain types of searches.
568   const int tmp_stride = reference_stride_;
569   reference_stride_ -= 1;
570   FillRandom(source_data_, source_stride_);
571   FillRandom(reference_data_, reference_stride_);
572   FillRandom(second_pred_, params_.width);
573   CheckSAD();
574   reference_stride_ = tmp_stride;
575 }
576 
TEST_P(SADavgTest,ShortSrc)577 TEST_P(SADavgTest, ShortSrc) {
578   const int tmp_stride = source_stride_;
579   source_stride_ >>= 1;
580   FillRandom(source_data_, source_stride_);
581   FillRandom(reference_data_, reference_stride_);
582   FillRandom(second_pred_, params_.width);
583   CheckSAD();
584   source_stride_ = tmp_stride;
585 }
586 
TEST_P(SADavgTest,DISABLED_Speed)587 TEST_P(SADavgTest, DISABLED_Speed) {
588   const int kCountSpeedTestBlock = 50000000 / (params_.width * params_.height);
589   FillRandom(source_data_, source_stride_);
590   FillRandom(reference_data_, reference_stride_);
591   FillRandom(second_pred_, params_.width);
592 
593   RunNTimes(kCountSpeedTestBlock);
594 
595   char title[16];
596   snprintf(title, sizeof(title), "%dx%d", params_.width, params_.height);
597   PrintMedian(title);
598 }
599 
TEST_P(SADx4Test,MaxRef)600 TEST_P(SADx4Test, MaxRef) {
601   FillConstant(source_data_, source_stride_, 0);
602   FillConstant(GetReference(0), reference_stride_, mask_);
603   FillConstant(GetReference(1), reference_stride_, mask_);
604   FillConstant(GetReference(2), reference_stride_, mask_);
605   FillConstant(GetReference(3), reference_stride_, mask_);
606   CheckSADs();
607 }
608 
TEST_P(SADx4Test,MaxSrc)609 TEST_P(SADx4Test, MaxSrc) {
610   FillConstant(source_data_, source_stride_, mask_);
611   FillConstant(GetReference(0), reference_stride_, 0);
612   FillConstant(GetReference(1), reference_stride_, 0);
613   FillConstant(GetReference(2), reference_stride_, 0);
614   FillConstant(GetReference(3), reference_stride_, 0);
615   CheckSADs();
616 }
617 
TEST_P(SADx4Test,ShortRef)618 TEST_P(SADx4Test, ShortRef) {
619   int tmp_stride = reference_stride_;
620   reference_stride_ >>= 1;
621   FillRandom(source_data_, source_stride_);
622   FillRandom(GetReference(0), reference_stride_);
623   FillRandom(GetReference(1), reference_stride_);
624   FillRandom(GetReference(2), reference_stride_);
625   FillRandom(GetReference(3), reference_stride_);
626   CheckSADs();
627   reference_stride_ = tmp_stride;
628 }
629 
TEST_P(SADx4Test,UnalignedRef)630 TEST_P(SADx4Test, UnalignedRef) {
631   // The reference frame, but not the source frame, may be unaligned for
632   // certain types of searches.
633   int tmp_stride = reference_stride_;
634   reference_stride_ -= 1;
635   FillRandom(source_data_, source_stride_);
636   FillRandom(GetReference(0), reference_stride_);
637   FillRandom(GetReference(1), reference_stride_);
638   FillRandom(GetReference(2), reference_stride_);
639   FillRandom(GetReference(3), reference_stride_);
640   CheckSADs();
641   reference_stride_ = tmp_stride;
642 }
643 
TEST_P(SADx4Test,ShortSrc)644 TEST_P(SADx4Test, ShortSrc) {
645   int tmp_stride = source_stride_;
646   source_stride_ >>= 1;
647   FillRandom(source_data_, source_stride_);
648   FillRandom(GetReference(0), reference_stride_);
649   FillRandom(GetReference(1), reference_stride_);
650   FillRandom(GetReference(2), reference_stride_);
651   FillRandom(GetReference(3), reference_stride_);
652   CheckSADs();
653   source_stride_ = tmp_stride;
654 }
655 
TEST_P(SADx4Test,SrcAlignedByWidth)656 TEST_P(SADx4Test, SrcAlignedByWidth) {
657   uint8_t *tmp_source_data = source_data_;
658   source_data_ += params_.width;
659   FillRandom(source_data_, source_stride_);
660   FillRandom(GetReference(0), reference_stride_);
661   FillRandom(GetReference(1), reference_stride_);
662   FillRandom(GetReference(2), reference_stride_);
663   FillRandom(GetReference(3), reference_stride_);
664   CheckSADs();
665   source_data_ = tmp_source_data;
666 }
667 
TEST_P(SADx4Test,DISABLED_Speed)668 TEST_P(SADx4Test, DISABLED_Speed) {
669   int tmp_stride = reference_stride_;
670   reference_stride_ -= 1;
671   FillRandom(source_data_, source_stride_);
672   FillRandom(GetReference(0), reference_stride_);
673   FillRandom(GetReference(1), reference_stride_);
674   FillRandom(GetReference(2), reference_stride_);
675   FillRandom(GetReference(3), reference_stride_);
676   const int kCountSpeedTestBlock = 500000000 / (params_.width * params_.height);
677   uint32_t reference_sad[4];
678   DECLARE_ALIGNED(kDataAlignment, uint32_t, exp_sad[4]);
679   vpx_usec_timer timer;
680   for (int block = 0; block < 4; ++block) {
681     reference_sad[block] = ReferenceSAD(GetBlockRefOffset(block));
682   }
683   vpx_usec_timer_start(&timer);
684   for (int i = 0; i < kCountSpeedTestBlock; ++i) {
685     SADs(exp_sad);
686   }
687   vpx_usec_timer_mark(&timer);
688   for (int block = 0; block < 4; ++block) {
689     EXPECT_EQ(reference_sad[block], exp_sad[block]) << "block " << block;
690   }
691   const int elapsed_time =
692       static_cast<int>(vpx_usec_timer_elapsed(&timer) / 1000);
693   printf("sad%dx%dx4 (%2dbit) time: %5d ms\n", params_.width, params_.height,
694          bit_depth_, elapsed_time);
695 
696   reference_stride_ = tmp_stride;
697 }
698 
TEST_P(SADSkipx4Test,MaxRef)699 TEST_P(SADSkipx4Test, MaxRef) {
700   FillConstant(source_data_, source_stride_, 0);
701   FillConstant(GetReference(0), reference_stride_, mask_);
702   FillConstant(GetReference(1), reference_stride_, mask_);
703   FillConstant(GetReference(2), reference_stride_, mask_);
704   FillConstant(GetReference(3), reference_stride_, mask_);
705   CheckSADs();
706 }
707 
TEST_P(SADSkipx4Test,MaxSrc)708 TEST_P(SADSkipx4Test, MaxSrc) {
709   FillConstant(source_data_, source_stride_, mask_);
710   FillConstant(GetReference(0), reference_stride_, 0);
711   FillConstant(GetReference(1), reference_stride_, 0);
712   FillConstant(GetReference(2), reference_stride_, 0);
713   FillConstant(GetReference(3), reference_stride_, 0);
714   CheckSADs();
715 }
716 
TEST_P(SADSkipx4Test,ShortRef)717 TEST_P(SADSkipx4Test, ShortRef) {
718   int tmp_stride = reference_stride_;
719   reference_stride_ >>= 1;
720   FillRandom(source_data_, source_stride_);
721   FillRandom(GetReference(0), reference_stride_);
722   FillRandom(GetReference(1), reference_stride_);
723   FillRandom(GetReference(2), reference_stride_);
724   FillRandom(GetReference(3), reference_stride_);
725   CheckSADs();
726   reference_stride_ = tmp_stride;
727 }
728 
TEST_P(SADSkipx4Test,UnalignedRef)729 TEST_P(SADSkipx4Test, UnalignedRef) {
730   // The reference frame, but not the source frame, may be unaligned for
731   // certain types of searches.
732   int tmp_stride = reference_stride_;
733   reference_stride_ -= 1;
734   FillRandom(source_data_, source_stride_);
735   FillRandom(GetReference(0), reference_stride_);
736   FillRandom(GetReference(1), reference_stride_);
737   FillRandom(GetReference(2), reference_stride_);
738   FillRandom(GetReference(3), reference_stride_);
739   CheckSADs();
740   reference_stride_ = tmp_stride;
741 }
742 
TEST_P(SADSkipx4Test,ShortSrc)743 TEST_P(SADSkipx4Test, ShortSrc) {
744   int tmp_stride = source_stride_;
745   source_stride_ >>= 1;
746   FillRandom(source_data_, source_stride_);
747   FillRandom(GetReference(0), reference_stride_);
748   FillRandom(GetReference(1), reference_stride_);
749   FillRandom(GetReference(2), reference_stride_);
750   FillRandom(GetReference(3), reference_stride_);
751   CheckSADs();
752   source_stride_ = tmp_stride;
753 }
754 
TEST_P(SADSkipx4Test,SrcAlignedByWidth)755 TEST_P(SADSkipx4Test, SrcAlignedByWidth) {
756   uint8_t *tmp_source_data = source_data_;
757   source_data_ += params_.width;
758   FillRandom(source_data_, source_stride_);
759   FillRandom(GetReference(0), reference_stride_);
760   FillRandom(GetReference(1), reference_stride_);
761   FillRandom(GetReference(2), reference_stride_);
762   FillRandom(GetReference(3), reference_stride_);
763   CheckSADs();
764   source_data_ = tmp_source_data;
765 }
766 
TEST_P(SADSkipx4Test,DISABLED_Speed)767 TEST_P(SADSkipx4Test, DISABLED_Speed) {
768   int tmp_stride = reference_stride_;
769   reference_stride_ -= 1;
770   FillRandom(source_data_, source_stride_);
771   FillRandom(GetReference(0), reference_stride_);
772   FillRandom(GetReference(1), reference_stride_);
773   FillRandom(GetReference(2), reference_stride_);
774   FillRandom(GetReference(3), reference_stride_);
775   const int kCountSpeedTestBlock = 500000000 / (params_.width * params_.height);
776   uint32_t reference_sad[4];
777   DECLARE_ALIGNED(kDataAlignment, uint32_t, exp_sad[4]);
778   vpx_usec_timer timer;
779   for (int block = 0; block < 4; ++block) {
780     reference_sad[block] = ReferenceSADSkip(GetBlockRefOffset(block));
781   }
782   vpx_usec_timer_start(&timer);
783   for (int i = 0; i < kCountSpeedTestBlock; ++i) {
784     SADs(exp_sad);
785   }
786   vpx_usec_timer_mark(&timer);
787   for (int block = 0; block < 4; ++block) {
788     EXPECT_EQ(reference_sad[block], exp_sad[block]) << "block " << block;
789   }
790   const int elapsed_time =
791       static_cast<int>(vpx_usec_timer_elapsed(&timer) / 1000);
792   printf("sad%dx%dx4 (%2dbit) time: %5d ms\n", params_.width, params_.height,
793          bit_depth_, elapsed_time);
794 
795   reference_stride_ = tmp_stride;
796 }
797 
798 //------------------------------------------------------------------------------
799 // C functions
800 const SadMxNParam c_tests[] = {
801   SadMxNParam(64, 64, &vpx_sad64x64_c),
802   SadMxNParam(64, 32, &vpx_sad64x32_c),
803   SadMxNParam(32, 64, &vpx_sad32x64_c),
804   SadMxNParam(32, 32, &vpx_sad32x32_c),
805   SadMxNParam(32, 16, &vpx_sad32x16_c),
806   SadMxNParam(16, 32, &vpx_sad16x32_c),
807   SadMxNParam(16, 16, &vpx_sad16x16_c),
808   SadMxNParam(16, 8, &vpx_sad16x8_c),
809   SadMxNParam(8, 16, &vpx_sad8x16_c),
810   SadMxNParam(8, 8, &vpx_sad8x8_c),
811   SadMxNParam(8, 4, &vpx_sad8x4_c),
812   SadMxNParam(4, 8, &vpx_sad4x8_c),
813   SadMxNParam(4, 4, &vpx_sad4x4_c),
814 #if CONFIG_VP9_HIGHBITDEPTH
815   SadMxNParam(64, 64, &vpx_highbd_sad64x64_c, 8),
816   SadMxNParam(64, 32, &vpx_highbd_sad64x32_c, 8),
817   SadMxNParam(32, 64, &vpx_highbd_sad32x64_c, 8),
818   SadMxNParam(32, 32, &vpx_highbd_sad32x32_c, 8),
819   SadMxNParam(32, 16, &vpx_highbd_sad32x16_c, 8),
820   SadMxNParam(16, 32, &vpx_highbd_sad16x32_c, 8),
821   SadMxNParam(16, 16, &vpx_highbd_sad16x16_c, 8),
822   SadMxNParam(16, 8, &vpx_highbd_sad16x8_c, 8),
823   SadMxNParam(8, 16, &vpx_highbd_sad8x16_c, 8),
824   SadMxNParam(8, 8, &vpx_highbd_sad8x8_c, 8),
825   SadMxNParam(8, 4, &vpx_highbd_sad8x4_c, 8),
826   SadMxNParam(4, 8, &vpx_highbd_sad4x8_c, 8),
827   SadMxNParam(4, 4, &vpx_highbd_sad4x4_c, 8),
828   SadMxNParam(64, 64, &vpx_highbd_sad64x64_c, 10),
829   SadMxNParam(64, 32, &vpx_highbd_sad64x32_c, 10),
830   SadMxNParam(32, 64, &vpx_highbd_sad32x64_c, 10),
831   SadMxNParam(32, 32, &vpx_highbd_sad32x32_c, 10),
832   SadMxNParam(32, 16, &vpx_highbd_sad32x16_c, 10),
833   SadMxNParam(16, 32, &vpx_highbd_sad16x32_c, 10),
834   SadMxNParam(16, 16, &vpx_highbd_sad16x16_c, 10),
835   SadMxNParam(16, 8, &vpx_highbd_sad16x8_c, 10),
836   SadMxNParam(8, 16, &vpx_highbd_sad8x16_c, 10),
837   SadMxNParam(8, 8, &vpx_highbd_sad8x8_c, 10),
838   SadMxNParam(8, 4, &vpx_highbd_sad8x4_c, 10),
839   SadMxNParam(4, 8, &vpx_highbd_sad4x8_c, 10),
840   SadMxNParam(4, 4, &vpx_highbd_sad4x4_c, 10),
841   SadMxNParam(64, 64, &vpx_highbd_sad64x64_c, 12),
842   SadMxNParam(64, 32, &vpx_highbd_sad64x32_c, 12),
843   SadMxNParam(32, 64, &vpx_highbd_sad32x64_c, 12),
844   SadMxNParam(32, 32, &vpx_highbd_sad32x32_c, 12),
845   SadMxNParam(32, 16, &vpx_highbd_sad32x16_c, 12),
846   SadMxNParam(16, 32, &vpx_highbd_sad16x32_c, 12),
847   SadMxNParam(16, 16, &vpx_highbd_sad16x16_c, 12),
848   SadMxNParam(16, 8, &vpx_highbd_sad16x8_c, 12),
849   SadMxNParam(8, 16, &vpx_highbd_sad8x16_c, 12),
850   SadMxNParam(8, 8, &vpx_highbd_sad8x8_c, 12),
851   SadMxNParam(8, 4, &vpx_highbd_sad8x4_c, 12),
852   SadMxNParam(4, 8, &vpx_highbd_sad4x8_c, 12),
853   SadMxNParam(4, 4, &vpx_highbd_sad4x4_c, 12),
854 #endif  // CONFIG_VP9_HIGHBITDEPTH
855 };
856 INSTANTIATE_TEST_SUITE_P(C, SADTest, ::testing::ValuesIn(c_tests));
857 
858 const SadSkipMxNParam skip_c_tests[] = {
859   SadSkipMxNParam(64, 64, &vpx_sad_skip_64x64_c),
860   SadSkipMxNParam(64, 32, &vpx_sad_skip_64x32_c),
861   SadSkipMxNParam(32, 64, &vpx_sad_skip_32x64_c),
862   SadSkipMxNParam(32, 32, &vpx_sad_skip_32x32_c),
863   SadSkipMxNParam(32, 16, &vpx_sad_skip_32x16_c),
864   SadSkipMxNParam(16, 32, &vpx_sad_skip_16x32_c),
865   SadSkipMxNParam(16, 16, &vpx_sad_skip_16x16_c),
866   SadSkipMxNParam(16, 8, &vpx_sad_skip_16x8_c),
867   SadSkipMxNParam(8, 16, &vpx_sad_skip_8x16_c),
868   SadSkipMxNParam(8, 8, &vpx_sad_skip_8x8_c),
869   SadSkipMxNParam(4, 8, &vpx_sad_skip_4x8_c),
870 #if CONFIG_VP9_HIGHBITDEPTH
871   SadSkipMxNParam(64, 64, &vpx_highbd_sad_skip_64x64_c, 8),
872   SadSkipMxNParam(64, 32, &vpx_highbd_sad_skip_64x32_c, 8),
873   SadSkipMxNParam(32, 64, &vpx_highbd_sad_skip_32x64_c, 8),
874   SadSkipMxNParam(32, 32, &vpx_highbd_sad_skip_32x32_c, 8),
875   SadSkipMxNParam(32, 16, &vpx_highbd_sad_skip_32x16_c, 8),
876   SadSkipMxNParam(16, 32, &vpx_highbd_sad_skip_16x32_c, 8),
877   SadSkipMxNParam(16, 16, &vpx_highbd_sad_skip_16x16_c, 8),
878   SadSkipMxNParam(16, 8, &vpx_highbd_sad_skip_16x8_c, 8),
879   SadSkipMxNParam(8, 16, &vpx_highbd_sad_skip_8x16_c, 8),
880   SadSkipMxNParam(8, 8, &vpx_highbd_sad_skip_8x8_c, 8),
881   SadSkipMxNParam(4, 8, &vpx_highbd_sad_skip_4x8_c, 8),
882   SadSkipMxNParam(64, 64, &vpx_highbd_sad_skip_64x64_c, 10),
883   SadSkipMxNParam(64, 32, &vpx_highbd_sad_skip_64x32_c, 10),
884   SadSkipMxNParam(32, 64, &vpx_highbd_sad_skip_32x64_c, 10),
885   SadSkipMxNParam(32, 32, &vpx_highbd_sad_skip_32x32_c, 10),
886   SadSkipMxNParam(32, 16, &vpx_highbd_sad_skip_32x16_c, 10),
887   SadSkipMxNParam(16, 32, &vpx_highbd_sad_skip_16x32_c, 10),
888   SadSkipMxNParam(16, 16, &vpx_highbd_sad_skip_16x16_c, 10),
889   SadSkipMxNParam(16, 8, &vpx_highbd_sad_skip_16x8_c, 10),
890   SadSkipMxNParam(8, 16, &vpx_highbd_sad_skip_8x16_c, 10),
891   SadSkipMxNParam(8, 8, &vpx_highbd_sad_skip_8x8_c, 10),
892   SadSkipMxNParam(4, 8, &vpx_highbd_sad_skip_4x8_c, 10),
893   SadSkipMxNParam(64, 64, &vpx_highbd_sad_skip_64x64_c, 12),
894   SadSkipMxNParam(64, 32, &vpx_highbd_sad_skip_64x32_c, 12),
895   SadSkipMxNParam(32, 64, &vpx_highbd_sad_skip_32x64_c, 12),
896   SadSkipMxNParam(32, 32, &vpx_highbd_sad_skip_32x32_c, 12),
897   SadSkipMxNParam(32, 16, &vpx_highbd_sad_skip_32x16_c, 12),
898   SadSkipMxNParam(16, 32, &vpx_highbd_sad_skip_16x32_c, 12),
899   SadSkipMxNParam(16, 16, &vpx_highbd_sad_skip_16x16_c, 12),
900   SadSkipMxNParam(16, 8, &vpx_highbd_sad_skip_16x8_c, 12),
901   SadSkipMxNParam(8, 16, &vpx_highbd_sad_skip_8x16_c, 12),
902   SadSkipMxNParam(8, 8, &vpx_highbd_sad_skip_8x8_c, 12),
903   SadSkipMxNParam(4, 8, &vpx_highbd_sad_skip_4x8_c, 12),
904 #endif  // CONFIG_VP9_HIGHBITDEPTH
905 };
906 INSTANTIATE_TEST_SUITE_P(C, SADSkipTest, ::testing::ValuesIn(skip_c_tests));
907 
908 const SadMxNAvgParam avg_c_tests[] = {
909   SadMxNAvgParam(64, 64, &vpx_sad64x64_avg_c),
910   SadMxNAvgParam(64, 32, &vpx_sad64x32_avg_c),
911   SadMxNAvgParam(32, 64, &vpx_sad32x64_avg_c),
912   SadMxNAvgParam(32, 32, &vpx_sad32x32_avg_c),
913   SadMxNAvgParam(32, 16, &vpx_sad32x16_avg_c),
914   SadMxNAvgParam(16, 32, &vpx_sad16x32_avg_c),
915   SadMxNAvgParam(16, 16, &vpx_sad16x16_avg_c),
916   SadMxNAvgParam(16, 8, &vpx_sad16x8_avg_c),
917   SadMxNAvgParam(8, 16, &vpx_sad8x16_avg_c),
918   SadMxNAvgParam(8, 8, &vpx_sad8x8_avg_c),
919   SadMxNAvgParam(8, 4, &vpx_sad8x4_avg_c),
920   SadMxNAvgParam(4, 8, &vpx_sad4x8_avg_c),
921   SadMxNAvgParam(4, 4, &vpx_sad4x4_avg_c),
922 #if CONFIG_VP9_HIGHBITDEPTH
923   SadMxNAvgParam(64, 64, &vpx_highbd_sad64x64_avg_c, 8),
924   SadMxNAvgParam(64, 32, &vpx_highbd_sad64x32_avg_c, 8),
925   SadMxNAvgParam(32, 64, &vpx_highbd_sad32x64_avg_c, 8),
926   SadMxNAvgParam(32, 32, &vpx_highbd_sad32x32_avg_c, 8),
927   SadMxNAvgParam(32, 16, &vpx_highbd_sad32x16_avg_c, 8),
928   SadMxNAvgParam(16, 32, &vpx_highbd_sad16x32_avg_c, 8),
929   SadMxNAvgParam(16, 16, &vpx_highbd_sad16x16_avg_c, 8),
930   SadMxNAvgParam(16, 8, &vpx_highbd_sad16x8_avg_c, 8),
931   SadMxNAvgParam(8, 16, &vpx_highbd_sad8x16_avg_c, 8),
932   SadMxNAvgParam(8, 8, &vpx_highbd_sad8x8_avg_c, 8),
933   SadMxNAvgParam(8, 4, &vpx_highbd_sad8x4_avg_c, 8),
934   SadMxNAvgParam(4, 8, &vpx_highbd_sad4x8_avg_c, 8),
935   SadMxNAvgParam(4, 4, &vpx_highbd_sad4x4_avg_c, 8),
936   SadMxNAvgParam(64, 64, &vpx_highbd_sad64x64_avg_c, 10),
937   SadMxNAvgParam(64, 32, &vpx_highbd_sad64x32_avg_c, 10),
938   SadMxNAvgParam(32, 64, &vpx_highbd_sad32x64_avg_c, 10),
939   SadMxNAvgParam(32, 32, &vpx_highbd_sad32x32_avg_c, 10),
940   SadMxNAvgParam(32, 16, &vpx_highbd_sad32x16_avg_c, 10),
941   SadMxNAvgParam(16, 32, &vpx_highbd_sad16x32_avg_c, 10),
942   SadMxNAvgParam(16, 16, &vpx_highbd_sad16x16_avg_c, 10),
943   SadMxNAvgParam(16, 8, &vpx_highbd_sad16x8_avg_c, 10),
944   SadMxNAvgParam(8, 16, &vpx_highbd_sad8x16_avg_c, 10),
945   SadMxNAvgParam(8, 8, &vpx_highbd_sad8x8_avg_c, 10),
946   SadMxNAvgParam(8, 4, &vpx_highbd_sad8x4_avg_c, 10),
947   SadMxNAvgParam(4, 8, &vpx_highbd_sad4x8_avg_c, 10),
948   SadMxNAvgParam(4, 4, &vpx_highbd_sad4x4_avg_c, 10),
949   SadMxNAvgParam(64, 64, &vpx_highbd_sad64x64_avg_c, 12),
950   SadMxNAvgParam(64, 32, &vpx_highbd_sad64x32_avg_c, 12),
951   SadMxNAvgParam(32, 64, &vpx_highbd_sad32x64_avg_c, 12),
952   SadMxNAvgParam(32, 32, &vpx_highbd_sad32x32_avg_c, 12),
953   SadMxNAvgParam(32, 16, &vpx_highbd_sad32x16_avg_c, 12),
954   SadMxNAvgParam(16, 32, &vpx_highbd_sad16x32_avg_c, 12),
955   SadMxNAvgParam(16, 16, &vpx_highbd_sad16x16_avg_c, 12),
956   SadMxNAvgParam(16, 8, &vpx_highbd_sad16x8_avg_c, 12),
957   SadMxNAvgParam(8, 16, &vpx_highbd_sad8x16_avg_c, 12),
958   SadMxNAvgParam(8, 8, &vpx_highbd_sad8x8_avg_c, 12),
959   SadMxNAvgParam(8, 4, &vpx_highbd_sad8x4_avg_c, 12),
960   SadMxNAvgParam(4, 8, &vpx_highbd_sad4x8_avg_c, 12),
961   SadMxNAvgParam(4, 4, &vpx_highbd_sad4x4_avg_c, 12),
962 #endif  // CONFIG_VP9_HIGHBITDEPTH
963 };
964 INSTANTIATE_TEST_SUITE_P(C, SADavgTest, ::testing::ValuesIn(avg_c_tests));
965 
966 const SadMxNx4Param x4d_c_tests[] = {
967   SadMxNx4Param(64, 64, &vpx_sad64x64x4d_c),
968   SadMxNx4Param(64, 32, &vpx_sad64x32x4d_c),
969   SadMxNx4Param(32, 64, &vpx_sad32x64x4d_c),
970   SadMxNx4Param(32, 32, &vpx_sad32x32x4d_c),
971   SadMxNx4Param(32, 16, &vpx_sad32x16x4d_c),
972   SadMxNx4Param(16, 32, &vpx_sad16x32x4d_c),
973   SadMxNx4Param(16, 16, &vpx_sad16x16x4d_c),
974   SadMxNx4Param(16, 8, &vpx_sad16x8x4d_c),
975   SadMxNx4Param(8, 16, &vpx_sad8x16x4d_c),
976   SadMxNx4Param(8, 8, &vpx_sad8x8x4d_c),
977   SadMxNx4Param(8, 4, &vpx_sad8x4x4d_c),
978   SadMxNx4Param(4, 8, &vpx_sad4x8x4d_c),
979   SadMxNx4Param(4, 4, &vpx_sad4x4x4d_c),
980 #if CONFIG_VP9_HIGHBITDEPTH
981   SadMxNx4Param(64, 64, &vpx_highbd_sad64x64x4d_c, 8),
982   SadMxNx4Param(64, 32, &vpx_highbd_sad64x32x4d_c, 8),
983   SadMxNx4Param(32, 64, &vpx_highbd_sad32x64x4d_c, 8),
984   SadMxNx4Param(32, 32, &vpx_highbd_sad32x32x4d_c, 8),
985   SadMxNx4Param(32, 16, &vpx_highbd_sad32x16x4d_c, 8),
986   SadMxNx4Param(16, 32, &vpx_highbd_sad16x32x4d_c, 8),
987   SadMxNx4Param(16, 16, &vpx_highbd_sad16x16x4d_c, 8),
988   SadMxNx4Param(16, 8, &vpx_highbd_sad16x8x4d_c, 8),
989   SadMxNx4Param(8, 16, &vpx_highbd_sad8x16x4d_c, 8),
990   SadMxNx4Param(8, 8, &vpx_highbd_sad8x8x4d_c, 8),
991   SadMxNx4Param(8, 4, &vpx_highbd_sad8x4x4d_c, 8),
992   SadMxNx4Param(4, 8, &vpx_highbd_sad4x8x4d_c, 8),
993   SadMxNx4Param(4, 4, &vpx_highbd_sad4x4x4d_c, 8),
994   SadMxNx4Param(64, 64, &vpx_highbd_sad64x64x4d_c, 10),
995   SadMxNx4Param(64, 32, &vpx_highbd_sad64x32x4d_c, 10),
996   SadMxNx4Param(32, 64, &vpx_highbd_sad32x64x4d_c, 10),
997   SadMxNx4Param(32, 32, &vpx_highbd_sad32x32x4d_c, 10),
998   SadMxNx4Param(32, 16, &vpx_highbd_sad32x16x4d_c, 10),
999   SadMxNx4Param(16, 32, &vpx_highbd_sad16x32x4d_c, 10),
1000   SadMxNx4Param(16, 16, &vpx_highbd_sad16x16x4d_c, 10),
1001   SadMxNx4Param(16, 8, &vpx_highbd_sad16x8x4d_c, 10),
1002   SadMxNx4Param(8, 16, &vpx_highbd_sad8x16x4d_c, 10),
1003   SadMxNx4Param(8, 8, &vpx_highbd_sad8x8x4d_c, 10),
1004   SadMxNx4Param(8, 4, &vpx_highbd_sad8x4x4d_c, 10),
1005   SadMxNx4Param(4, 8, &vpx_highbd_sad4x8x4d_c, 10),
1006   SadMxNx4Param(4, 4, &vpx_highbd_sad4x4x4d_c, 10),
1007   SadMxNx4Param(64, 64, &vpx_highbd_sad64x64x4d_c, 12),
1008   SadMxNx4Param(64, 32, &vpx_highbd_sad64x32x4d_c, 12),
1009   SadMxNx4Param(32, 64, &vpx_highbd_sad32x64x4d_c, 12),
1010   SadMxNx4Param(32, 32, &vpx_highbd_sad32x32x4d_c, 12),
1011   SadMxNx4Param(32, 16, &vpx_highbd_sad32x16x4d_c, 12),
1012   SadMxNx4Param(16, 32, &vpx_highbd_sad16x32x4d_c, 12),
1013   SadMxNx4Param(16, 16, &vpx_highbd_sad16x16x4d_c, 12),
1014   SadMxNx4Param(16, 8, &vpx_highbd_sad16x8x4d_c, 12),
1015   SadMxNx4Param(8, 16, &vpx_highbd_sad8x16x4d_c, 12),
1016   SadMxNx4Param(8, 8, &vpx_highbd_sad8x8x4d_c, 12),
1017   SadMxNx4Param(8, 4, &vpx_highbd_sad8x4x4d_c, 12),
1018   SadMxNx4Param(4, 8, &vpx_highbd_sad4x8x4d_c, 12),
1019   SadMxNx4Param(4, 4, &vpx_highbd_sad4x4x4d_c, 12),
1020 #endif  // CONFIG_VP9_HIGHBITDEPTH
1021 };
1022 INSTANTIATE_TEST_SUITE_P(C, SADx4Test, ::testing::ValuesIn(x4d_c_tests));
1023 
1024 const SadSkipMxNx4Param skip_x4d_c_tests[] = {
1025   SadSkipMxNx4Param(64, 64, &vpx_sad_skip_64x64x4d_c),
1026   SadSkipMxNx4Param(64, 32, &vpx_sad_skip_64x32x4d_c),
1027   SadSkipMxNx4Param(32, 64, &vpx_sad_skip_32x64x4d_c),
1028   SadSkipMxNx4Param(32, 32, &vpx_sad_skip_32x32x4d_c),
1029   SadSkipMxNx4Param(32, 16, &vpx_sad_skip_32x16x4d_c),
1030   SadSkipMxNx4Param(16, 32, &vpx_sad_skip_16x32x4d_c),
1031   SadSkipMxNx4Param(16, 16, &vpx_sad_skip_16x16x4d_c),
1032   SadSkipMxNx4Param(16, 8, &vpx_sad_skip_16x8x4d_c),
1033   SadSkipMxNx4Param(8, 16, &vpx_sad_skip_8x16x4d_c),
1034   SadSkipMxNx4Param(8, 8, &vpx_sad_skip_8x8x4d_c),
1035   SadSkipMxNx4Param(4, 8, &vpx_sad_skip_4x8x4d_c),
1036 #if CONFIG_VP9_HIGHBITDEPTH
1037   SadSkipMxNx4Param(64, 64, &vpx_highbd_sad_skip_64x64x4d_c, 8),
1038   SadSkipMxNx4Param(64, 32, &vpx_highbd_sad_skip_64x32x4d_c, 8),
1039   SadSkipMxNx4Param(32, 64, &vpx_highbd_sad_skip_32x64x4d_c, 8),
1040   SadSkipMxNx4Param(32, 32, &vpx_highbd_sad_skip_32x32x4d_c, 8),
1041   SadSkipMxNx4Param(32, 16, &vpx_highbd_sad_skip_32x16x4d_c, 8),
1042   SadSkipMxNx4Param(16, 32, &vpx_highbd_sad_skip_16x32x4d_c, 8),
1043   SadSkipMxNx4Param(16, 16, &vpx_highbd_sad_skip_16x16x4d_c, 8),
1044   SadSkipMxNx4Param(16, 8, &vpx_highbd_sad_skip_16x8x4d_c, 8),
1045   SadSkipMxNx4Param(8, 16, &vpx_highbd_sad_skip_8x16x4d_c, 8),
1046   SadSkipMxNx4Param(8, 8, &vpx_highbd_sad_skip_8x8x4d_c, 8),
1047   SadSkipMxNx4Param(4, 8, &vpx_highbd_sad_skip_4x8x4d_c, 8),
1048   SadSkipMxNx4Param(64, 64, &vpx_highbd_sad_skip_64x64x4d_c, 10),
1049   SadSkipMxNx4Param(64, 32, &vpx_highbd_sad_skip_64x32x4d_c, 10),
1050   SadSkipMxNx4Param(32, 64, &vpx_highbd_sad_skip_32x64x4d_c, 10),
1051   SadSkipMxNx4Param(32, 32, &vpx_highbd_sad_skip_32x32x4d_c, 10),
1052   SadSkipMxNx4Param(32, 16, &vpx_highbd_sad_skip_32x16x4d_c, 10),
1053   SadSkipMxNx4Param(16, 32, &vpx_highbd_sad_skip_16x32x4d_c, 10),
1054   SadSkipMxNx4Param(16, 16, &vpx_highbd_sad_skip_16x16x4d_c, 10),
1055   SadSkipMxNx4Param(16, 8, &vpx_highbd_sad_skip_16x8x4d_c, 10),
1056   SadSkipMxNx4Param(8, 16, &vpx_highbd_sad_skip_8x16x4d_c, 10),
1057   SadSkipMxNx4Param(8, 8, &vpx_highbd_sad_skip_8x8x4d_c, 10),
1058   SadSkipMxNx4Param(4, 8, &vpx_highbd_sad_skip_4x8x4d_c, 10),
1059   SadSkipMxNx4Param(64, 64, &vpx_highbd_sad_skip_64x64x4d_c, 12),
1060   SadSkipMxNx4Param(64, 32, &vpx_highbd_sad_skip_64x32x4d_c, 12),
1061   SadSkipMxNx4Param(32, 64, &vpx_highbd_sad_skip_32x64x4d_c, 12),
1062   SadSkipMxNx4Param(32, 32, &vpx_highbd_sad_skip_32x32x4d_c, 12),
1063   SadSkipMxNx4Param(32, 16, &vpx_highbd_sad_skip_32x16x4d_c, 12),
1064   SadSkipMxNx4Param(16, 32, &vpx_highbd_sad_skip_16x32x4d_c, 12),
1065   SadSkipMxNx4Param(16, 16, &vpx_highbd_sad_skip_16x16x4d_c, 12),
1066   SadSkipMxNx4Param(16, 8, &vpx_highbd_sad_skip_16x8x4d_c, 12),
1067   SadSkipMxNx4Param(8, 16, &vpx_highbd_sad_skip_8x16x4d_c, 12),
1068   SadSkipMxNx4Param(8, 8, &vpx_highbd_sad_skip_8x8x4d_c, 12),
1069   SadSkipMxNx4Param(4, 8, &vpx_highbd_sad_skip_4x8x4d_c, 12),
1070 #endif  // CONFIG_VP9_HIGHBITDEPTH
1071 };
1072 INSTANTIATE_TEST_SUITE_P(C, SADSkipx4Test,
1073                          ::testing::ValuesIn(skip_x4d_c_tests));
1074 
1075 //------------------------------------------------------------------------------
1076 // ARM functions
1077 #if HAVE_NEON
1078 const SadMxNParam neon_tests[] = {
1079   SadMxNParam(64, 64, &vpx_sad64x64_neon),
1080   SadMxNParam(64, 32, &vpx_sad64x32_neon),
1081   SadMxNParam(32, 32, &vpx_sad32x32_neon),
1082   SadMxNParam(16, 32, &vpx_sad16x32_neon),
1083   SadMxNParam(16, 16, &vpx_sad16x16_neon),
1084   SadMxNParam(16, 8, &vpx_sad16x8_neon),
1085   SadMxNParam(8, 16, &vpx_sad8x16_neon),
1086   SadMxNParam(8, 8, &vpx_sad8x8_neon),
1087   SadMxNParam(8, 4, &vpx_sad8x4_neon),
1088   SadMxNParam(4, 8, &vpx_sad4x8_neon),
1089   SadMxNParam(4, 4, &vpx_sad4x4_neon),
1090 #if CONFIG_VP9_HIGHBITDEPTH
1091   SadMxNParam(4, 4, &vpx_highbd_sad4x4_neon, 8),
1092   SadMxNParam(4, 8, &vpx_highbd_sad4x8_neon, 8),
1093   SadMxNParam(8, 4, &vpx_highbd_sad8x4_neon, 8),
1094   SadMxNParam(8, 8, &vpx_highbd_sad8x8_neon, 8),
1095   SadMxNParam(8, 16, &vpx_highbd_sad8x16_neon, 8),
1096   SadMxNParam(16, 8, &vpx_highbd_sad16x8_neon, 8),
1097   SadMxNParam(16, 16, &vpx_highbd_sad16x16_neon, 8),
1098   SadMxNParam(16, 32, &vpx_highbd_sad16x32_neon, 8),
1099   SadMxNParam(32, 32, &vpx_highbd_sad32x32_neon, 8),
1100   SadMxNParam(32, 64, &vpx_highbd_sad32x64_neon, 8),
1101   SadMxNParam(64, 32, &vpx_highbd_sad64x32_neon, 8),
1102   SadMxNParam(64, 64, &vpx_highbd_sad64x64_neon, 8),
1103   SadMxNParam(4, 4, &vpx_highbd_sad4x4_neon, 10),
1104   SadMxNParam(4, 8, &vpx_highbd_sad4x8_neon, 10),
1105   SadMxNParam(8, 4, &vpx_highbd_sad8x4_neon, 10),
1106   SadMxNParam(8, 8, &vpx_highbd_sad8x8_neon, 10),
1107   SadMxNParam(8, 16, &vpx_highbd_sad8x16_neon, 10),
1108   SadMxNParam(16, 8, &vpx_highbd_sad16x8_neon, 10),
1109   SadMxNParam(16, 16, &vpx_highbd_sad16x16_neon, 10),
1110   SadMxNParam(16, 32, &vpx_highbd_sad16x32_neon, 10),
1111   SadMxNParam(32, 32, &vpx_highbd_sad32x32_neon, 10),
1112   SadMxNParam(32, 64, &vpx_highbd_sad32x64_neon, 10),
1113   SadMxNParam(64, 32, &vpx_highbd_sad64x32_neon, 10),
1114   SadMxNParam(64, 64, &vpx_highbd_sad64x64_neon, 10),
1115   SadMxNParam(4, 4, &vpx_highbd_sad4x4_neon, 12),
1116   SadMxNParam(4, 8, &vpx_highbd_sad4x8_neon, 12),
1117   SadMxNParam(8, 4, &vpx_highbd_sad8x4_neon, 12),
1118   SadMxNParam(8, 8, &vpx_highbd_sad8x8_neon, 12),
1119   SadMxNParam(8, 16, &vpx_highbd_sad8x16_neon, 12),
1120   SadMxNParam(16, 8, &vpx_highbd_sad16x8_neon, 12),
1121   SadMxNParam(16, 16, &vpx_highbd_sad16x16_neon, 12),
1122   SadMxNParam(16, 32, &vpx_highbd_sad16x32_neon, 12),
1123   SadMxNParam(32, 32, &vpx_highbd_sad32x32_neon, 12),
1124   SadMxNParam(32, 64, &vpx_highbd_sad32x64_neon, 12),
1125   SadMxNParam(64, 32, &vpx_highbd_sad64x32_neon, 12),
1126   SadMxNParam(64, 64, &vpx_highbd_sad64x64_neon, 12),
1127 #endif  // CONFIG_VP9_HIGHBITDEPTH
1128 
1129 };
1130 INSTANTIATE_TEST_SUITE_P(NEON, SADTest, ::testing::ValuesIn(neon_tests));
1131 
1132 #if HAVE_NEON_DOTPROD
1133 const SadMxNParam neon_dotprod_tests[] = {
1134   SadMxNParam(64, 64, &vpx_sad64x64_neon_dotprod),
1135   SadMxNParam(64, 32, &vpx_sad64x32_neon_dotprod),
1136   SadMxNParam(32, 64, &vpx_sad32x64_neon_dotprod),
1137   SadMxNParam(32, 32, &vpx_sad32x32_neon_dotprod),
1138   SadMxNParam(32, 16, &vpx_sad32x16_neon_dotprod),
1139   SadMxNParam(16, 32, &vpx_sad16x32_neon_dotprod),
1140   SadMxNParam(16, 16, &vpx_sad16x16_neon_dotprod),
1141   SadMxNParam(16, 8, &vpx_sad16x8_neon_dotprod),
1142 };
1143 INSTANTIATE_TEST_SUITE_P(NEON_DOTPROD, SADTest,
1144                          ::testing::ValuesIn(neon_dotprod_tests));
1145 #endif  // HAVE_NEON_DOTPROD
1146 
1147 const SadSkipMxNParam skip_neon_tests[] = {
1148   SadSkipMxNParam(64, 64, &vpx_sad_skip_64x64_neon),
1149   SadSkipMxNParam(64, 32, &vpx_sad_skip_64x32_neon),
1150   SadSkipMxNParam(32, 64, &vpx_sad_skip_32x64_neon),
1151   SadSkipMxNParam(32, 32, &vpx_sad_skip_32x32_neon),
1152   SadSkipMxNParam(32, 16, &vpx_sad_skip_32x16_neon),
1153   SadSkipMxNParam(16, 32, &vpx_sad_skip_16x32_neon),
1154   SadSkipMxNParam(16, 16, &vpx_sad_skip_16x16_neon),
1155   SadSkipMxNParam(16, 8, &vpx_sad_skip_16x8_neon),
1156   SadSkipMxNParam(8, 16, &vpx_sad_skip_8x16_neon),
1157   SadSkipMxNParam(8, 8, &vpx_sad_skip_8x8_neon),
1158   SadSkipMxNParam(8, 4, &vpx_sad_skip_8x4_neon),
1159   SadSkipMxNParam(4, 8, &vpx_sad_skip_4x8_neon),
1160   SadSkipMxNParam(4, 4, &vpx_sad_skip_4x4_neon),
1161 #if CONFIG_VP9_HIGHBITDEPTH
1162   SadSkipMxNParam(4, 4, &vpx_highbd_sad_skip_4x4_neon, 8),
1163   SadSkipMxNParam(4, 8, &vpx_highbd_sad_skip_4x8_neon, 8),
1164   SadSkipMxNParam(8, 4, &vpx_highbd_sad_skip_8x4_neon, 8),
1165   SadSkipMxNParam(8, 8, &vpx_highbd_sad_skip_8x8_neon, 8),
1166   SadSkipMxNParam(8, 16, &vpx_highbd_sad_skip_8x16_neon, 8),
1167   SadSkipMxNParam(16, 8, &vpx_highbd_sad_skip_16x8_neon, 8),
1168   SadSkipMxNParam(16, 16, &vpx_highbd_sad_skip_16x16_neon, 8),
1169   SadSkipMxNParam(16, 32, &vpx_highbd_sad_skip_16x32_neon, 8),
1170   SadSkipMxNParam(32, 16, &vpx_highbd_sad_skip_32x16_neon, 8),
1171   SadSkipMxNParam(32, 32, &vpx_highbd_sad_skip_32x32_neon, 8),
1172   SadSkipMxNParam(32, 64, &vpx_highbd_sad_skip_32x64_neon, 8),
1173   SadSkipMxNParam(64, 32, &vpx_highbd_sad_skip_64x32_neon, 8),
1174   SadSkipMxNParam(64, 64, &vpx_highbd_sad_skip_64x64_neon, 8),
1175   SadSkipMxNParam(4, 4, &vpx_highbd_sad_skip_4x4_neon, 10),
1176   SadSkipMxNParam(4, 8, &vpx_highbd_sad_skip_4x8_neon, 10),
1177   SadSkipMxNParam(8, 4, &vpx_highbd_sad_skip_8x4_neon, 10),
1178   SadSkipMxNParam(8, 8, &vpx_highbd_sad_skip_8x8_neon, 10),
1179   SadSkipMxNParam(8, 16, &vpx_highbd_sad_skip_8x16_neon, 10),
1180   SadSkipMxNParam(16, 8, &vpx_highbd_sad_skip_16x8_neon, 10),
1181   SadSkipMxNParam(16, 16, &vpx_highbd_sad_skip_16x16_neon, 10),
1182   SadSkipMxNParam(16, 32, &vpx_highbd_sad_skip_16x32_neon, 10),
1183   SadSkipMxNParam(32, 16, &vpx_highbd_sad_skip_32x16_neon, 10),
1184   SadSkipMxNParam(32, 32, &vpx_highbd_sad_skip_32x32_neon, 10),
1185   SadSkipMxNParam(32, 64, &vpx_highbd_sad_skip_32x64_neon, 10),
1186   SadSkipMxNParam(64, 32, &vpx_highbd_sad_skip_64x32_neon, 10),
1187   SadSkipMxNParam(64, 64, &vpx_highbd_sad_skip_64x64_neon, 10),
1188   SadSkipMxNParam(4, 4, &vpx_highbd_sad_skip_4x4_neon, 12),
1189   SadSkipMxNParam(4, 8, &vpx_highbd_sad_skip_4x8_neon, 12),
1190   SadSkipMxNParam(8, 4, &vpx_highbd_sad_skip_8x4_neon, 12),
1191   SadSkipMxNParam(8, 8, &vpx_highbd_sad_skip_8x8_neon, 12),
1192   SadSkipMxNParam(8, 16, &vpx_highbd_sad_skip_8x16_neon, 12),
1193   SadSkipMxNParam(16, 8, &vpx_highbd_sad_skip_16x8_neon, 12),
1194   SadSkipMxNParam(16, 16, &vpx_highbd_sad_skip_16x16_neon, 12),
1195   SadSkipMxNParam(16, 32, &vpx_highbd_sad_skip_16x32_neon, 12),
1196   SadSkipMxNParam(32, 16, &vpx_highbd_sad_skip_32x16_neon, 12),
1197   SadSkipMxNParam(32, 32, &vpx_highbd_sad_skip_32x32_neon, 12),
1198   SadSkipMxNParam(32, 64, &vpx_highbd_sad_skip_32x64_neon, 12),
1199   SadSkipMxNParam(64, 32, &vpx_highbd_sad_skip_64x32_neon, 12),
1200   SadSkipMxNParam(64, 64, &vpx_highbd_sad_skip_64x64_neon, 12),
1201 #endif  // CONFIG_VP9_HIGHBITDEPTH
1202 };
1203 INSTANTIATE_TEST_SUITE_P(NEON, SADSkipTest,
1204                          ::testing::ValuesIn(skip_neon_tests));
1205 
1206 #if HAVE_NEON_DOTPROD
1207 const SadSkipMxNParam skip_neon_dotprod_tests[] = {
1208   SadSkipMxNParam(64, 64, &vpx_sad_skip_64x64_neon_dotprod),
1209   SadSkipMxNParam(64, 32, &vpx_sad_skip_64x32_neon_dotprod),
1210   SadSkipMxNParam(32, 64, &vpx_sad_skip_32x64_neon_dotprod),
1211   SadSkipMxNParam(32, 32, &vpx_sad_skip_32x32_neon_dotprod),
1212   SadSkipMxNParam(32, 16, &vpx_sad_skip_32x16_neon_dotprod),
1213   SadSkipMxNParam(16, 32, &vpx_sad_skip_16x32_neon_dotprod),
1214   SadSkipMxNParam(16, 16, &vpx_sad_skip_16x16_neon_dotprod),
1215   SadSkipMxNParam(16, 8, &vpx_sad_skip_16x8_neon_dotprod),
1216 };
1217 INSTANTIATE_TEST_SUITE_P(NEON_DOTPROD, SADSkipTest,
1218                          ::testing::ValuesIn(skip_neon_dotprod_tests));
1219 #endif  // HAVE_NEON_DOTPROD
1220 
1221 const SadMxNAvgParam avg_neon_tests[] = {
1222   SadMxNAvgParam(64, 64, &vpx_sad64x64_avg_neon),
1223   SadMxNAvgParam(64, 32, &vpx_sad64x32_avg_neon),
1224   SadMxNAvgParam(32, 64, &vpx_sad32x64_avg_neon),
1225   SadMxNAvgParam(32, 32, &vpx_sad32x32_avg_neon),
1226   SadMxNAvgParam(32, 16, &vpx_sad32x16_avg_neon),
1227   SadMxNAvgParam(16, 32, &vpx_sad16x32_avg_neon),
1228   SadMxNAvgParam(16, 16, &vpx_sad16x16_avg_neon),
1229   SadMxNAvgParam(16, 8, &vpx_sad16x8_avg_neon),
1230   SadMxNAvgParam(8, 16, &vpx_sad8x16_avg_neon),
1231   SadMxNAvgParam(8, 8, &vpx_sad8x8_avg_neon),
1232   SadMxNAvgParam(8, 4, &vpx_sad8x4_avg_neon),
1233   SadMxNAvgParam(4, 8, &vpx_sad4x8_avg_neon),
1234   SadMxNAvgParam(4, 4, &vpx_sad4x4_avg_neon),
1235 #if CONFIG_VP9_HIGHBITDEPTH
1236   SadMxNAvgParam(4, 4, &vpx_highbd_sad4x4_avg_neon, 8),
1237   SadMxNAvgParam(4, 8, &vpx_highbd_sad4x8_avg_neon, 8),
1238   SadMxNAvgParam(8, 4, &vpx_highbd_sad8x4_avg_neon, 8),
1239   SadMxNAvgParam(8, 8, &vpx_highbd_sad8x8_avg_neon, 8),
1240   SadMxNAvgParam(8, 16, &vpx_highbd_sad8x16_avg_neon, 8),
1241   SadMxNAvgParam(16, 8, &vpx_highbd_sad16x8_avg_neon, 8),
1242   SadMxNAvgParam(16, 16, &vpx_highbd_sad16x16_avg_neon, 8),
1243   SadMxNAvgParam(16, 32, &vpx_highbd_sad16x32_avg_neon, 8),
1244   SadMxNAvgParam(32, 16, &vpx_highbd_sad32x16_avg_neon, 8),
1245   SadMxNAvgParam(32, 32, &vpx_highbd_sad32x32_avg_neon, 8),
1246   SadMxNAvgParam(32, 64, &vpx_highbd_sad32x64_avg_neon, 8),
1247   SadMxNAvgParam(64, 32, &vpx_highbd_sad64x32_avg_neon, 8),
1248   SadMxNAvgParam(64, 64, &vpx_highbd_sad64x64_avg_neon, 8),
1249   SadMxNAvgParam(4, 4, &vpx_highbd_sad4x4_avg_neon, 10),
1250   SadMxNAvgParam(4, 8, &vpx_highbd_sad4x8_avg_neon, 10),
1251   SadMxNAvgParam(8, 4, &vpx_highbd_sad8x4_avg_neon, 10),
1252   SadMxNAvgParam(8, 8, &vpx_highbd_sad8x8_avg_neon, 10),
1253   SadMxNAvgParam(8, 16, &vpx_highbd_sad8x16_avg_neon, 10),
1254   SadMxNAvgParam(16, 8, &vpx_highbd_sad16x8_avg_neon, 10),
1255   SadMxNAvgParam(16, 16, &vpx_highbd_sad16x16_avg_neon, 10),
1256   SadMxNAvgParam(16, 32, &vpx_highbd_sad16x32_avg_neon, 10),
1257   SadMxNAvgParam(32, 16, &vpx_highbd_sad32x16_avg_neon, 10),
1258   SadMxNAvgParam(32, 32, &vpx_highbd_sad32x32_avg_neon, 10),
1259   SadMxNAvgParam(32, 64, &vpx_highbd_sad32x64_avg_neon, 10),
1260   SadMxNAvgParam(64, 32, &vpx_highbd_sad64x32_avg_neon, 10),
1261   SadMxNAvgParam(64, 64, &vpx_highbd_sad64x64_avg_neon, 10),
1262   SadMxNAvgParam(4, 4, &vpx_highbd_sad4x4_avg_neon, 12),
1263   SadMxNAvgParam(4, 8, &vpx_highbd_sad4x8_avg_neon, 12),
1264   SadMxNAvgParam(8, 4, &vpx_highbd_sad8x4_avg_neon, 12),
1265   SadMxNAvgParam(8, 8, &vpx_highbd_sad8x8_avg_neon, 12),
1266   SadMxNAvgParam(8, 16, &vpx_highbd_sad8x16_avg_neon, 12),
1267   SadMxNAvgParam(16, 8, &vpx_highbd_sad16x8_avg_neon, 12),
1268   SadMxNAvgParam(16, 16, &vpx_highbd_sad16x16_avg_neon, 12),
1269   SadMxNAvgParam(16, 32, &vpx_highbd_sad16x32_avg_neon, 12),
1270   SadMxNAvgParam(32, 16, &vpx_highbd_sad32x16_avg_neon, 12),
1271   SadMxNAvgParam(32, 32, &vpx_highbd_sad32x32_avg_neon, 12),
1272   SadMxNAvgParam(32, 64, &vpx_highbd_sad32x64_avg_neon, 12),
1273   SadMxNAvgParam(64, 32, &vpx_highbd_sad64x32_avg_neon, 12),
1274   SadMxNAvgParam(64, 64, &vpx_highbd_sad64x64_avg_neon, 12),
1275 #endif  // CONFIG_VP9_HIGHBITDEPTH
1276 };
1277 INSTANTIATE_TEST_SUITE_P(NEON, SADavgTest, ::testing::ValuesIn(avg_neon_tests));
1278 
1279 #if HAVE_NEON_DOTPROD
1280 const SadMxNAvgParam avg_neon_dotprod_tests[] = {
1281   SadMxNAvgParam(64, 64, &vpx_sad64x64_avg_neon_dotprod),
1282   SadMxNAvgParam(64, 32, &vpx_sad64x32_avg_neon_dotprod),
1283   SadMxNAvgParam(32, 64, &vpx_sad32x64_avg_neon_dotprod),
1284   SadMxNAvgParam(32, 32, &vpx_sad32x32_avg_neon_dotprod),
1285   SadMxNAvgParam(32, 16, &vpx_sad32x16_avg_neon_dotprod),
1286   SadMxNAvgParam(16, 32, &vpx_sad16x32_avg_neon_dotprod),
1287   SadMxNAvgParam(16, 16, &vpx_sad16x16_avg_neon_dotprod),
1288   SadMxNAvgParam(16, 8, &vpx_sad16x8_avg_neon_dotprod),
1289 };
1290 INSTANTIATE_TEST_SUITE_P(NEON_DOTPROD, SADavgTest,
1291                          ::testing::ValuesIn(avg_neon_dotprod_tests));
1292 #endif  // HAVE_NEON_DOTPROD
1293 
1294 const SadMxNx4Param x4d_neon_tests[] = {
1295   SadMxNx4Param(64, 64, &vpx_sad64x64x4d_neon),
1296   SadMxNx4Param(64, 32, &vpx_sad64x32x4d_neon),
1297   SadMxNx4Param(32, 64, &vpx_sad32x64x4d_neon),
1298   SadMxNx4Param(32, 32, &vpx_sad32x32x4d_neon),
1299   SadMxNx4Param(32, 16, &vpx_sad32x16x4d_neon),
1300   SadMxNx4Param(16, 32, &vpx_sad16x32x4d_neon),
1301   SadMxNx4Param(16, 16, &vpx_sad16x16x4d_neon),
1302   SadMxNx4Param(16, 8, &vpx_sad16x8x4d_neon),
1303   SadMxNx4Param(8, 16, &vpx_sad8x16x4d_neon),
1304   SadMxNx4Param(8, 8, &vpx_sad8x8x4d_neon),
1305   SadMxNx4Param(8, 4, &vpx_sad8x4x4d_neon),
1306   SadMxNx4Param(4, 8, &vpx_sad4x8x4d_neon),
1307   SadMxNx4Param(4, 4, &vpx_sad4x4x4d_neon),
1308 #if CONFIG_VP9_HIGHBITDEPTH
1309   SadMxNx4Param(4, 4, &vpx_highbd_sad4x4x4d_neon, 8),
1310   SadMxNx4Param(4, 8, &vpx_highbd_sad4x8x4d_neon, 8),
1311   SadMxNx4Param(8, 4, &vpx_highbd_sad8x4x4d_neon, 8),
1312   SadMxNx4Param(8, 8, &vpx_highbd_sad8x8x4d_neon, 8),
1313   SadMxNx4Param(8, 16, &vpx_highbd_sad8x16x4d_neon, 8),
1314   SadMxNx4Param(16, 8, &vpx_highbd_sad16x8x4d_neon, 8),
1315   SadMxNx4Param(16, 16, &vpx_highbd_sad16x16x4d_neon, 8),
1316   SadMxNx4Param(16, 32, &vpx_highbd_sad16x32x4d_neon, 8),
1317   SadMxNx4Param(32, 32, &vpx_highbd_sad32x32x4d_neon, 8),
1318   SadMxNx4Param(32, 64, &vpx_highbd_sad32x64x4d_neon, 8),
1319   SadMxNx4Param(64, 32, &vpx_highbd_sad64x32x4d_neon, 8),
1320   SadMxNx4Param(64, 64, &vpx_highbd_sad64x64x4d_neon, 8),
1321   SadMxNx4Param(4, 4, &vpx_highbd_sad4x4x4d_neon, 10),
1322   SadMxNx4Param(4, 8, &vpx_highbd_sad4x8x4d_neon, 10),
1323   SadMxNx4Param(8, 4, &vpx_highbd_sad8x4x4d_neon, 10),
1324   SadMxNx4Param(8, 8, &vpx_highbd_sad8x8x4d_neon, 10),
1325   SadMxNx4Param(8, 16, &vpx_highbd_sad8x16x4d_neon, 10),
1326   SadMxNx4Param(16, 8, &vpx_highbd_sad16x8x4d_neon, 10),
1327   SadMxNx4Param(16, 16, &vpx_highbd_sad16x16x4d_neon, 10),
1328   SadMxNx4Param(16, 32, &vpx_highbd_sad16x32x4d_neon, 10),
1329   SadMxNx4Param(32, 32, &vpx_highbd_sad32x32x4d_neon, 10),
1330   SadMxNx4Param(32, 64, &vpx_highbd_sad32x64x4d_neon, 10),
1331   SadMxNx4Param(64, 32, &vpx_highbd_sad64x32x4d_neon, 10),
1332   SadMxNx4Param(64, 64, &vpx_highbd_sad64x64x4d_neon, 10),
1333   SadMxNx4Param(4, 4, &vpx_highbd_sad4x4x4d_neon, 12),
1334   SadMxNx4Param(4, 8, &vpx_highbd_sad4x8x4d_neon, 12),
1335   SadMxNx4Param(8, 4, &vpx_highbd_sad8x4x4d_neon, 12),
1336   SadMxNx4Param(8, 8, &vpx_highbd_sad8x8x4d_neon, 12),
1337   SadMxNx4Param(8, 16, &vpx_highbd_sad8x16x4d_neon, 12),
1338   SadMxNx4Param(16, 8, &vpx_highbd_sad16x8x4d_neon, 12),
1339   SadMxNx4Param(16, 16, &vpx_highbd_sad16x16x4d_neon, 12),
1340   SadMxNx4Param(16, 32, &vpx_highbd_sad16x32x4d_neon, 12),
1341   SadMxNx4Param(32, 32, &vpx_highbd_sad32x32x4d_neon, 12),
1342   SadMxNx4Param(32, 64, &vpx_highbd_sad32x64x4d_neon, 12),
1343   SadMxNx4Param(64, 32, &vpx_highbd_sad64x32x4d_neon, 12),
1344   SadMxNx4Param(64, 64, &vpx_highbd_sad64x64x4d_neon, 12),
1345 #endif  // CONFIG_VP9_HIGHBITDEPTH
1346 };
1347 INSTANTIATE_TEST_SUITE_P(NEON, SADx4Test, ::testing::ValuesIn(x4d_neon_tests));
1348 
1349 #if HAVE_NEON_DOTPROD
1350 const SadMxNx4Param x4d_neon_dotprod_tests[] = {
1351   SadMxNx4Param(64, 64, &vpx_sad64x64x4d_neon_dotprod),
1352   SadMxNx4Param(64, 32, &vpx_sad64x32x4d_neon_dotprod),
1353   SadMxNx4Param(32, 64, &vpx_sad32x64x4d_neon_dotprod),
1354   SadMxNx4Param(32, 32, &vpx_sad32x32x4d_neon_dotprod),
1355   SadMxNx4Param(32, 16, &vpx_sad32x16x4d_neon_dotprod),
1356   SadMxNx4Param(16, 32, &vpx_sad16x32x4d_neon_dotprod),
1357   SadMxNx4Param(16, 16, &vpx_sad16x16x4d_neon_dotprod),
1358   SadMxNx4Param(16, 8, &vpx_sad16x8x4d_neon_dotprod),
1359 };
1360 INSTANTIATE_TEST_SUITE_P(NEON_DOTPROD, SADx4Test,
1361                          ::testing::ValuesIn(x4d_neon_dotprod_tests));
1362 #endif  // HAVE_NEON_DOTPROD
1363 
1364 const SadSkipMxNx4Param skip_x4d_neon_tests[] = {
1365   SadSkipMxNx4Param(64, 64, &vpx_sad_skip_64x64x4d_neon),
1366   SadSkipMxNx4Param(64, 32, &vpx_sad_skip_64x32x4d_neon),
1367   SadSkipMxNx4Param(32, 64, &vpx_sad_skip_32x64x4d_neon),
1368   SadSkipMxNx4Param(32, 32, &vpx_sad_skip_32x32x4d_neon),
1369   SadSkipMxNx4Param(32, 16, &vpx_sad_skip_32x16x4d_neon),
1370   SadSkipMxNx4Param(16, 32, &vpx_sad_skip_16x32x4d_neon),
1371   SadSkipMxNx4Param(16, 16, &vpx_sad_skip_16x16x4d_neon),
1372   SadSkipMxNx4Param(16, 8, &vpx_sad_skip_16x8x4d_neon),
1373   SadSkipMxNx4Param(8, 16, &vpx_sad_skip_8x16x4d_neon),
1374   SadSkipMxNx4Param(8, 8, &vpx_sad_skip_8x8x4d_neon),
1375   SadSkipMxNx4Param(8, 4, &vpx_sad_skip_8x4x4d_neon),
1376   SadSkipMxNx4Param(4, 8, &vpx_sad_skip_4x8x4d_neon),
1377   SadSkipMxNx4Param(4, 4, &vpx_sad_skip_4x4x4d_neon),
1378 #if CONFIG_VP9_HIGHBITDEPTH
1379   SadSkipMxNx4Param(4, 4, &vpx_highbd_sad_skip_4x4x4d_neon, 8),
1380   SadSkipMxNx4Param(4, 8, &vpx_highbd_sad_skip_4x8x4d_neon, 8),
1381   SadSkipMxNx4Param(8, 4, &vpx_highbd_sad_skip_8x4x4d_neon, 8),
1382   SadSkipMxNx4Param(8, 8, &vpx_highbd_sad_skip_8x8x4d_neon, 8),
1383   SadSkipMxNx4Param(8, 16, &vpx_highbd_sad_skip_8x16x4d_neon, 8),
1384   SadSkipMxNx4Param(16, 8, &vpx_highbd_sad_skip_16x8x4d_neon, 8),
1385   SadSkipMxNx4Param(16, 16, &vpx_highbd_sad_skip_16x16x4d_neon, 8),
1386   SadSkipMxNx4Param(16, 32, &vpx_highbd_sad_skip_16x32x4d_neon, 8),
1387   SadSkipMxNx4Param(32, 32, &vpx_highbd_sad_skip_32x32x4d_neon, 8),
1388   SadSkipMxNx4Param(32, 64, &vpx_highbd_sad_skip_32x64x4d_neon, 8),
1389   SadSkipMxNx4Param(64, 32, &vpx_highbd_sad_skip_64x32x4d_neon, 8),
1390   SadSkipMxNx4Param(64, 64, &vpx_highbd_sad_skip_64x64x4d_neon, 8),
1391   SadSkipMxNx4Param(4, 4, &vpx_highbd_sad_skip_4x4x4d_neon, 10),
1392   SadSkipMxNx4Param(4, 8, &vpx_highbd_sad_skip_4x8x4d_neon, 10),
1393   SadSkipMxNx4Param(8, 4, &vpx_highbd_sad_skip_8x4x4d_neon, 10),
1394   SadSkipMxNx4Param(8, 8, &vpx_highbd_sad_skip_8x8x4d_neon, 10),
1395   SadSkipMxNx4Param(8, 16, &vpx_highbd_sad_skip_8x16x4d_neon, 10),
1396   SadSkipMxNx4Param(16, 8, &vpx_highbd_sad_skip_16x8x4d_neon, 10),
1397   SadSkipMxNx4Param(16, 16, &vpx_highbd_sad_skip_16x16x4d_neon, 10),
1398   SadSkipMxNx4Param(16, 32, &vpx_highbd_sad_skip_16x32x4d_neon, 10),
1399   SadSkipMxNx4Param(32, 32, &vpx_highbd_sad_skip_32x32x4d_neon, 10),
1400   SadSkipMxNx4Param(32, 64, &vpx_highbd_sad_skip_32x64x4d_neon, 10),
1401   SadSkipMxNx4Param(64, 32, &vpx_highbd_sad_skip_64x32x4d_neon, 10),
1402   SadSkipMxNx4Param(64, 64, &vpx_highbd_sad_skip_64x64x4d_neon, 10),
1403   SadSkipMxNx4Param(4, 4, &vpx_highbd_sad_skip_4x4x4d_neon, 12),
1404   SadSkipMxNx4Param(4, 8, &vpx_highbd_sad_skip_4x8x4d_neon, 12),
1405   SadSkipMxNx4Param(8, 4, &vpx_highbd_sad_skip_8x4x4d_neon, 12),
1406   SadSkipMxNx4Param(8, 8, &vpx_highbd_sad_skip_8x8x4d_neon, 12),
1407   SadSkipMxNx4Param(8, 16, &vpx_highbd_sad_skip_8x16x4d_neon, 12),
1408   SadSkipMxNx4Param(16, 8, &vpx_highbd_sad_skip_16x8x4d_neon, 12),
1409   SadSkipMxNx4Param(16, 16, &vpx_highbd_sad_skip_16x16x4d_neon, 12),
1410   SadSkipMxNx4Param(16, 32, &vpx_highbd_sad_skip_16x32x4d_neon, 12),
1411   SadSkipMxNx4Param(32, 32, &vpx_highbd_sad_skip_32x32x4d_neon, 12),
1412   SadSkipMxNx4Param(32, 64, &vpx_highbd_sad_skip_32x64x4d_neon, 12),
1413   SadSkipMxNx4Param(64, 32, &vpx_highbd_sad_skip_64x32x4d_neon, 12),
1414   SadSkipMxNx4Param(64, 64, &vpx_highbd_sad_skip_64x64x4d_neon, 12),
1415 #endif  // CONFIG_VP9_HIGHBITDEPTH
1416 };
1417 INSTANTIATE_TEST_SUITE_P(NEON, SADSkipx4Test,
1418                          ::testing::ValuesIn(skip_x4d_neon_tests));
1419 
1420 #if HAVE_NEONE_DOTPROD
1421 const SadSkipMxNx4Param skip_x4d_neon_dotprod_tests[] = {
1422   SadSkipMxNx4Param(64, 64, &vpx_sad_skip_64x64x4d_neon_dotprod),
1423   SadSkipMxNx4Param(64, 32, &vpx_sad_skip_64x32x4d_neon_dotprod),
1424   SadSkipMxNx4Param(32, 64, &vpx_sad_skip_32x64x4d_neon_dotprod),
1425   SadSkipMxNx4Param(32, 32, &vpx_sad_skip_32x32x4d_neon_dotprod),
1426   SadSkipMxNx4Param(32, 16, &vpx_sad_skip_32x16x4d_neon_dotprod),
1427   SadSkipMxNx4Param(16, 32, &vpx_sad_skip_16x32x4d_neon_dotprod),
1428   SadSkipMxNx4Param(16, 16, &vpx_sad_skip_16x16x4d_neon_dotprod),
1429   SadSkipMxNx4Param(16, 8, &vpx_sad_skip_16x8x4d_neon_dotprod),
1430 };
1431 INSTANTIATE_TEST_SUITE_P(NEON_DOTPROD, SADSkipx4Test,
1432                          ::testing::ValuesIn(skip_x4d_neon_dotprod_tests));
1433 #endif  // HAVE_NEON_DOTPROD
1434 #endif  // HAVE_NEON
1435 
1436 //------------------------------------------------------------------------------
1437 // x86 functions
1438 #if HAVE_SSE2
1439 const SadMxNParam sse2_tests[] = {
1440   SadMxNParam(64, 64, &vpx_sad64x64_sse2),
1441   SadMxNParam(64, 32, &vpx_sad64x32_sse2),
1442   SadMxNParam(32, 64, &vpx_sad32x64_sse2),
1443   SadMxNParam(32, 32, &vpx_sad32x32_sse2),
1444   SadMxNParam(32, 16, &vpx_sad32x16_sse2),
1445   SadMxNParam(16, 32, &vpx_sad16x32_sse2),
1446   SadMxNParam(16, 16, &vpx_sad16x16_sse2),
1447   SadMxNParam(16, 8, &vpx_sad16x8_sse2),
1448   SadMxNParam(8, 16, &vpx_sad8x16_sse2),
1449   SadMxNParam(8, 8, &vpx_sad8x8_sse2),
1450   SadMxNParam(8, 4, &vpx_sad8x4_sse2),
1451   SadMxNParam(4, 8, &vpx_sad4x8_sse2),
1452   SadMxNParam(4, 4, &vpx_sad4x4_sse2),
1453 #if CONFIG_VP9_HIGHBITDEPTH
1454   SadMxNParam(64, 64, &vpx_highbd_sad64x64_sse2, 8),
1455   SadMxNParam(64, 32, &vpx_highbd_sad64x32_sse2, 8),
1456   SadMxNParam(32, 64, &vpx_highbd_sad32x64_sse2, 8),
1457   SadMxNParam(32, 32, &vpx_highbd_sad32x32_sse2, 8),
1458   SadMxNParam(32, 16, &vpx_highbd_sad32x16_sse2, 8),
1459   SadMxNParam(16, 32, &vpx_highbd_sad16x32_sse2, 8),
1460   SadMxNParam(16, 16, &vpx_highbd_sad16x16_sse2, 8),
1461   SadMxNParam(16, 8, &vpx_highbd_sad16x8_sse2, 8),
1462   SadMxNParam(8, 16, &vpx_highbd_sad8x16_sse2, 8),
1463   SadMxNParam(8, 8, &vpx_highbd_sad8x8_sse2, 8),
1464   SadMxNParam(8, 4, &vpx_highbd_sad8x4_sse2, 8),
1465   SadMxNParam(64, 64, &vpx_highbd_sad64x64_sse2, 10),
1466   SadMxNParam(64, 32, &vpx_highbd_sad64x32_sse2, 10),
1467   SadMxNParam(32, 64, &vpx_highbd_sad32x64_sse2, 10),
1468   SadMxNParam(32, 32, &vpx_highbd_sad32x32_sse2, 10),
1469   SadMxNParam(32, 16, &vpx_highbd_sad32x16_sse2, 10),
1470   SadMxNParam(16, 32, &vpx_highbd_sad16x32_sse2, 10),
1471   SadMxNParam(16, 16, &vpx_highbd_sad16x16_sse2, 10),
1472   SadMxNParam(16, 8, &vpx_highbd_sad16x8_sse2, 10),
1473   SadMxNParam(8, 16, &vpx_highbd_sad8x16_sse2, 10),
1474   SadMxNParam(8, 8, &vpx_highbd_sad8x8_sse2, 10),
1475   SadMxNParam(8, 4, &vpx_highbd_sad8x4_sse2, 10),
1476   SadMxNParam(64, 64, &vpx_highbd_sad64x64_sse2, 12),
1477   SadMxNParam(64, 32, &vpx_highbd_sad64x32_sse2, 12),
1478   SadMxNParam(32, 64, &vpx_highbd_sad32x64_sse2, 12),
1479   SadMxNParam(32, 32, &vpx_highbd_sad32x32_sse2, 12),
1480   SadMxNParam(32, 16, &vpx_highbd_sad32x16_sse2, 12),
1481   SadMxNParam(16, 32, &vpx_highbd_sad16x32_sse2, 12),
1482   SadMxNParam(16, 16, &vpx_highbd_sad16x16_sse2, 12),
1483   SadMxNParam(16, 8, &vpx_highbd_sad16x8_sse2, 12),
1484   SadMxNParam(8, 16, &vpx_highbd_sad8x16_sse2, 12),
1485   SadMxNParam(8, 8, &vpx_highbd_sad8x8_sse2, 12),
1486   SadMxNParam(8, 4, &vpx_highbd_sad8x4_sse2, 12),
1487 #endif  // CONFIG_VP9_HIGHBITDEPTH
1488 };
1489 INSTANTIATE_TEST_SUITE_P(SSE2, SADTest, ::testing::ValuesIn(sse2_tests));
1490 
1491 const SadSkipMxNParam skip_sse2_tests[] = {
1492   SadSkipMxNParam(64, 64, &vpx_sad_skip_64x64_sse2),
1493   SadSkipMxNParam(64, 32, &vpx_sad_skip_64x32_sse2),
1494   SadSkipMxNParam(32, 64, &vpx_sad_skip_32x64_sse2),
1495   SadSkipMxNParam(32, 32, &vpx_sad_skip_32x32_sse2),
1496   SadSkipMxNParam(32, 16, &vpx_sad_skip_32x16_sse2),
1497   SadSkipMxNParam(16, 32, &vpx_sad_skip_16x32_sse2),
1498   SadSkipMxNParam(16, 16, &vpx_sad_skip_16x16_sse2),
1499   SadSkipMxNParam(16, 8, &vpx_sad_skip_16x8_sse2),
1500   SadSkipMxNParam(8, 16, &vpx_sad_skip_8x16_sse2),
1501   SadSkipMxNParam(8, 8, &vpx_sad_skip_8x8_sse2),
1502   SadSkipMxNParam(4, 8, &vpx_sad_skip_4x8_sse2),
1503 #if CONFIG_VP9_HIGHBITDEPTH
1504   SadSkipMxNParam(64, 64, &vpx_highbd_sad_skip_64x64_sse2, 8),
1505   SadSkipMxNParam(64, 32, &vpx_highbd_sad_skip_64x32_sse2, 8),
1506   SadSkipMxNParam(32, 64, &vpx_highbd_sad_skip_32x64_sse2, 8),
1507   SadSkipMxNParam(32, 32, &vpx_highbd_sad_skip_32x32_sse2, 8),
1508   SadSkipMxNParam(32, 16, &vpx_highbd_sad_skip_32x16_sse2, 8),
1509   SadSkipMxNParam(16, 32, &vpx_highbd_sad_skip_16x32_sse2, 8),
1510   SadSkipMxNParam(16, 16, &vpx_highbd_sad_skip_16x16_sse2, 8),
1511   SadSkipMxNParam(16, 8, &vpx_highbd_sad_skip_16x8_sse2, 8),
1512   SadSkipMxNParam(8, 16, &vpx_highbd_sad_skip_8x16_sse2, 8),
1513   SadSkipMxNParam(8, 8, &vpx_highbd_sad_skip_8x8_sse2, 8),
1514   SadSkipMxNParam(64, 64, &vpx_highbd_sad_skip_64x64_sse2, 10),
1515   SadSkipMxNParam(64, 32, &vpx_highbd_sad_skip_64x32_sse2, 10),
1516   SadSkipMxNParam(32, 64, &vpx_highbd_sad_skip_32x64_sse2, 10),
1517   SadSkipMxNParam(32, 32, &vpx_highbd_sad_skip_32x32_sse2, 10),
1518   SadSkipMxNParam(32, 16, &vpx_highbd_sad_skip_32x16_sse2, 10),
1519   SadSkipMxNParam(16, 32, &vpx_highbd_sad_skip_16x32_sse2, 10),
1520   SadSkipMxNParam(16, 16, &vpx_highbd_sad_skip_16x16_sse2, 10),
1521   SadSkipMxNParam(16, 8, &vpx_highbd_sad_skip_16x8_sse2, 10),
1522   SadSkipMxNParam(8, 16, &vpx_highbd_sad_skip_8x16_sse2, 10),
1523   SadSkipMxNParam(8, 8, &vpx_highbd_sad_skip_8x8_sse2, 10),
1524   SadSkipMxNParam(64, 64, &vpx_highbd_sad_skip_64x64_sse2, 12),
1525   SadSkipMxNParam(64, 32, &vpx_highbd_sad_skip_64x32_sse2, 12),
1526   SadSkipMxNParam(32, 64, &vpx_highbd_sad_skip_32x64_sse2, 12),
1527   SadSkipMxNParam(32, 32, &vpx_highbd_sad_skip_32x32_sse2, 12),
1528   SadSkipMxNParam(32, 16, &vpx_highbd_sad_skip_32x16_sse2, 12),
1529   SadSkipMxNParam(16, 32, &vpx_highbd_sad_skip_16x32_sse2, 12),
1530   SadSkipMxNParam(16, 16, &vpx_highbd_sad_skip_16x16_sse2, 12),
1531   SadSkipMxNParam(16, 8, &vpx_highbd_sad_skip_16x8_sse2, 12),
1532   SadSkipMxNParam(8, 16, &vpx_highbd_sad_skip_8x16_sse2, 12),
1533   SadSkipMxNParam(8, 8, &vpx_highbd_sad_skip_8x8_sse2, 12),
1534 #endif  // CONFIG_VP9_HIGHBITDEPTH
1535 };
1536 INSTANTIATE_TEST_SUITE_P(SSE2, SADSkipTest,
1537                          ::testing::ValuesIn(skip_sse2_tests));
1538 
1539 const SadMxNAvgParam avg_sse2_tests[] = {
1540   SadMxNAvgParam(64, 64, &vpx_sad64x64_avg_sse2),
1541   SadMxNAvgParam(64, 32, &vpx_sad64x32_avg_sse2),
1542   SadMxNAvgParam(32, 64, &vpx_sad32x64_avg_sse2),
1543   SadMxNAvgParam(32, 32, &vpx_sad32x32_avg_sse2),
1544   SadMxNAvgParam(32, 16, &vpx_sad32x16_avg_sse2),
1545   SadMxNAvgParam(16, 32, &vpx_sad16x32_avg_sse2),
1546   SadMxNAvgParam(16, 16, &vpx_sad16x16_avg_sse2),
1547   SadMxNAvgParam(16, 8, &vpx_sad16x8_avg_sse2),
1548   SadMxNAvgParam(8, 16, &vpx_sad8x16_avg_sse2),
1549   SadMxNAvgParam(8, 8, &vpx_sad8x8_avg_sse2),
1550   SadMxNAvgParam(8, 4, &vpx_sad8x4_avg_sse2),
1551   SadMxNAvgParam(4, 8, &vpx_sad4x8_avg_sse2),
1552   SadMxNAvgParam(4, 4, &vpx_sad4x4_avg_sse2),
1553 #if CONFIG_VP9_HIGHBITDEPTH
1554   SadMxNAvgParam(64, 64, &vpx_highbd_sad64x64_avg_sse2, 8),
1555   SadMxNAvgParam(64, 32, &vpx_highbd_sad64x32_avg_sse2, 8),
1556   SadMxNAvgParam(32, 64, &vpx_highbd_sad32x64_avg_sse2, 8),
1557   SadMxNAvgParam(32, 32, &vpx_highbd_sad32x32_avg_sse2, 8),
1558   SadMxNAvgParam(32, 16, &vpx_highbd_sad32x16_avg_sse2, 8),
1559   SadMxNAvgParam(16, 32, &vpx_highbd_sad16x32_avg_sse2, 8),
1560   SadMxNAvgParam(16, 16, &vpx_highbd_sad16x16_avg_sse2, 8),
1561   SadMxNAvgParam(16, 8, &vpx_highbd_sad16x8_avg_sse2, 8),
1562   SadMxNAvgParam(8, 16, &vpx_highbd_sad8x16_avg_sse2, 8),
1563   SadMxNAvgParam(8, 8, &vpx_highbd_sad8x8_avg_sse2, 8),
1564   SadMxNAvgParam(8, 4, &vpx_highbd_sad8x4_avg_sse2, 8),
1565   SadMxNAvgParam(64, 64, &vpx_highbd_sad64x64_avg_sse2, 10),
1566   SadMxNAvgParam(64, 32, &vpx_highbd_sad64x32_avg_sse2, 10),
1567   SadMxNAvgParam(32, 64, &vpx_highbd_sad32x64_avg_sse2, 10),
1568   SadMxNAvgParam(32, 32, &vpx_highbd_sad32x32_avg_sse2, 10),
1569   SadMxNAvgParam(32, 16, &vpx_highbd_sad32x16_avg_sse2, 10),
1570   SadMxNAvgParam(16, 32, &vpx_highbd_sad16x32_avg_sse2, 10),
1571   SadMxNAvgParam(16, 16, &vpx_highbd_sad16x16_avg_sse2, 10),
1572   SadMxNAvgParam(16, 8, &vpx_highbd_sad16x8_avg_sse2, 10),
1573   SadMxNAvgParam(8, 16, &vpx_highbd_sad8x16_avg_sse2, 10),
1574   SadMxNAvgParam(8, 8, &vpx_highbd_sad8x8_avg_sse2, 10),
1575   SadMxNAvgParam(8, 4, &vpx_highbd_sad8x4_avg_sse2, 10),
1576   SadMxNAvgParam(64, 64, &vpx_highbd_sad64x64_avg_sse2, 12),
1577   SadMxNAvgParam(64, 32, &vpx_highbd_sad64x32_avg_sse2, 12),
1578   SadMxNAvgParam(32, 64, &vpx_highbd_sad32x64_avg_sse2, 12),
1579   SadMxNAvgParam(32, 32, &vpx_highbd_sad32x32_avg_sse2, 12),
1580   SadMxNAvgParam(32, 16, &vpx_highbd_sad32x16_avg_sse2, 12),
1581   SadMxNAvgParam(16, 32, &vpx_highbd_sad16x32_avg_sse2, 12),
1582   SadMxNAvgParam(16, 16, &vpx_highbd_sad16x16_avg_sse2, 12),
1583   SadMxNAvgParam(16, 8, &vpx_highbd_sad16x8_avg_sse2, 12),
1584   SadMxNAvgParam(8, 16, &vpx_highbd_sad8x16_avg_sse2, 12),
1585   SadMxNAvgParam(8, 8, &vpx_highbd_sad8x8_avg_sse2, 12),
1586   SadMxNAvgParam(8, 4, &vpx_highbd_sad8x4_avg_sse2, 12),
1587 #endif  // CONFIG_VP9_HIGHBITDEPTH
1588 };
1589 INSTANTIATE_TEST_SUITE_P(SSE2, SADavgTest, ::testing::ValuesIn(avg_sse2_tests));
1590 
1591 const SadMxNx4Param x4d_sse2_tests[] = {
1592   SadMxNx4Param(64, 64, &vpx_sad64x64x4d_sse2),
1593   SadMxNx4Param(64, 32, &vpx_sad64x32x4d_sse2),
1594   SadMxNx4Param(32, 64, &vpx_sad32x64x4d_sse2),
1595   SadMxNx4Param(32, 32, &vpx_sad32x32x4d_sse2),
1596   SadMxNx4Param(32, 16, &vpx_sad32x16x4d_sse2),
1597   SadMxNx4Param(16, 32, &vpx_sad16x32x4d_sse2),
1598   SadMxNx4Param(16, 16, &vpx_sad16x16x4d_sse2),
1599   SadMxNx4Param(16, 8, &vpx_sad16x8x4d_sse2),
1600   SadMxNx4Param(8, 16, &vpx_sad8x16x4d_sse2),
1601   SadMxNx4Param(8, 8, &vpx_sad8x8x4d_sse2),
1602   SadMxNx4Param(8, 4, &vpx_sad8x4x4d_sse2),
1603   SadMxNx4Param(4, 8, &vpx_sad4x8x4d_sse2),
1604   SadMxNx4Param(4, 4, &vpx_sad4x4x4d_sse2),
1605 #if CONFIG_VP9_HIGHBITDEPTH
1606   SadMxNx4Param(64, 64, &vpx_highbd_sad64x64x4d_sse2, 8),
1607   SadMxNx4Param(64, 32, &vpx_highbd_sad64x32x4d_sse2, 8),
1608   SadMxNx4Param(32, 64, &vpx_highbd_sad32x64x4d_sse2, 8),
1609   SadMxNx4Param(32, 32, &vpx_highbd_sad32x32x4d_sse2, 8),
1610   SadMxNx4Param(32, 16, &vpx_highbd_sad32x16x4d_sse2, 8),
1611   SadMxNx4Param(16, 32, &vpx_highbd_sad16x32x4d_sse2, 8),
1612   SadMxNx4Param(16, 16, &vpx_highbd_sad16x16x4d_sse2, 8),
1613   SadMxNx4Param(16, 8, &vpx_highbd_sad16x8x4d_sse2, 8),
1614   SadMxNx4Param(8, 16, &vpx_highbd_sad8x16x4d_sse2, 8),
1615   SadMxNx4Param(8, 8, &vpx_highbd_sad8x8x4d_sse2, 8),
1616   SadMxNx4Param(8, 4, &vpx_highbd_sad8x4x4d_sse2, 8),
1617   SadMxNx4Param(4, 8, &vpx_highbd_sad4x8x4d_sse2, 8),
1618   SadMxNx4Param(4, 4, &vpx_highbd_sad4x4x4d_sse2, 8),
1619   SadMxNx4Param(64, 64, &vpx_highbd_sad64x64x4d_sse2, 10),
1620   SadMxNx4Param(64, 32, &vpx_highbd_sad64x32x4d_sse2, 10),
1621   SadMxNx4Param(32, 64, &vpx_highbd_sad32x64x4d_sse2, 10),
1622   SadMxNx4Param(32, 32, &vpx_highbd_sad32x32x4d_sse2, 10),
1623   SadMxNx4Param(32, 16, &vpx_highbd_sad32x16x4d_sse2, 10),
1624   SadMxNx4Param(16, 32, &vpx_highbd_sad16x32x4d_sse2, 10),
1625   SadMxNx4Param(16, 16, &vpx_highbd_sad16x16x4d_sse2, 10),
1626   SadMxNx4Param(16, 8, &vpx_highbd_sad16x8x4d_sse2, 10),
1627   SadMxNx4Param(8, 16, &vpx_highbd_sad8x16x4d_sse2, 10),
1628   SadMxNx4Param(8, 8, &vpx_highbd_sad8x8x4d_sse2, 10),
1629   SadMxNx4Param(8, 4, &vpx_highbd_sad8x4x4d_sse2, 10),
1630   SadMxNx4Param(4, 8, &vpx_highbd_sad4x8x4d_sse2, 10),
1631   SadMxNx4Param(4, 4, &vpx_highbd_sad4x4x4d_sse2, 10),
1632   SadMxNx4Param(64, 64, &vpx_highbd_sad64x64x4d_sse2, 12),
1633   SadMxNx4Param(64, 32, &vpx_highbd_sad64x32x4d_sse2, 12),
1634   SadMxNx4Param(32, 64, &vpx_highbd_sad32x64x4d_sse2, 12),
1635   SadMxNx4Param(32, 32, &vpx_highbd_sad32x32x4d_sse2, 12),
1636   SadMxNx4Param(32, 16, &vpx_highbd_sad32x16x4d_sse2, 12),
1637   SadMxNx4Param(16, 32, &vpx_highbd_sad16x32x4d_sse2, 12),
1638   SadMxNx4Param(16, 16, &vpx_highbd_sad16x16x4d_sse2, 12),
1639   SadMxNx4Param(16, 8, &vpx_highbd_sad16x8x4d_sse2, 12),
1640   SadMxNx4Param(8, 16, &vpx_highbd_sad8x16x4d_sse2, 12),
1641   SadMxNx4Param(8, 8, &vpx_highbd_sad8x8x4d_sse2, 12),
1642   SadMxNx4Param(8, 4, &vpx_highbd_sad8x4x4d_sse2, 12),
1643   SadMxNx4Param(4, 8, &vpx_highbd_sad4x8x4d_sse2, 12),
1644   SadMxNx4Param(4, 4, &vpx_highbd_sad4x4x4d_sse2, 12),
1645 #endif  // CONFIG_VP9_HIGHBITDEPTH
1646 };
1647 INSTANTIATE_TEST_SUITE_P(SSE2, SADx4Test, ::testing::ValuesIn(x4d_sse2_tests));
1648 
1649 const SadSkipMxNx4Param skip_x4d_sse2_tests[] = {
1650   SadSkipMxNx4Param(64, 64, &vpx_sad_skip_64x64x4d_sse2),
1651   SadSkipMxNx4Param(64, 32, &vpx_sad_skip_64x32x4d_sse2),
1652   SadSkipMxNx4Param(32, 64, &vpx_sad_skip_32x64x4d_sse2),
1653   SadSkipMxNx4Param(32, 32, &vpx_sad_skip_32x32x4d_sse2),
1654   SadSkipMxNx4Param(32, 16, &vpx_sad_skip_32x16x4d_sse2),
1655   SadSkipMxNx4Param(16, 32, &vpx_sad_skip_16x32x4d_sse2),
1656   SadSkipMxNx4Param(16, 16, &vpx_sad_skip_16x16x4d_sse2),
1657   SadSkipMxNx4Param(16, 8, &vpx_sad_skip_16x8x4d_sse2),
1658   SadSkipMxNx4Param(8, 16, &vpx_sad_skip_8x16x4d_sse2),
1659   SadSkipMxNx4Param(8, 8, &vpx_sad_skip_8x8x4d_sse2),
1660   SadSkipMxNx4Param(4, 8, &vpx_sad_skip_4x8x4d_sse2),
1661 #if CONFIG_VP9_HIGHBITDEPTH
1662   SadSkipMxNx4Param(64, 64, &vpx_highbd_sad_skip_64x64x4d_sse2, 8),
1663   SadSkipMxNx4Param(64, 32, &vpx_highbd_sad_skip_64x32x4d_sse2, 8),
1664   SadSkipMxNx4Param(32, 64, &vpx_highbd_sad_skip_32x64x4d_sse2, 8),
1665   SadSkipMxNx4Param(32, 32, &vpx_highbd_sad_skip_32x32x4d_sse2, 8),
1666   SadSkipMxNx4Param(32, 16, &vpx_highbd_sad_skip_32x16x4d_sse2, 8),
1667   SadSkipMxNx4Param(16, 32, &vpx_highbd_sad_skip_16x32x4d_sse2, 8),
1668   SadSkipMxNx4Param(16, 16, &vpx_highbd_sad_skip_16x16x4d_sse2, 8),
1669   SadSkipMxNx4Param(16, 8, &vpx_highbd_sad_skip_16x8x4d_sse2, 8),
1670   SadSkipMxNx4Param(8, 16, &vpx_highbd_sad_skip_8x16x4d_sse2, 8),
1671   SadSkipMxNx4Param(8, 8, &vpx_highbd_sad_skip_8x8x4d_sse2, 8),
1672   SadSkipMxNx4Param(4, 8, &vpx_highbd_sad_skip_4x8x4d_sse2, 8),
1673   SadSkipMxNx4Param(64, 64, &vpx_highbd_sad_skip_64x64x4d_sse2, 10),
1674   SadSkipMxNx4Param(64, 32, &vpx_highbd_sad_skip_64x32x4d_sse2, 10),
1675   SadSkipMxNx4Param(32, 64, &vpx_highbd_sad_skip_32x64x4d_sse2, 10),
1676   SadSkipMxNx4Param(32, 32, &vpx_highbd_sad_skip_32x32x4d_sse2, 10),
1677   SadSkipMxNx4Param(32, 16, &vpx_highbd_sad_skip_32x16x4d_sse2, 10),
1678   SadSkipMxNx4Param(16, 32, &vpx_highbd_sad_skip_16x32x4d_sse2, 10),
1679   SadSkipMxNx4Param(16, 16, &vpx_highbd_sad_skip_16x16x4d_sse2, 10),
1680   SadSkipMxNx4Param(16, 8, &vpx_highbd_sad_skip_16x8x4d_sse2, 10),
1681   SadSkipMxNx4Param(8, 16, &vpx_highbd_sad_skip_8x16x4d_sse2, 10),
1682   SadSkipMxNx4Param(8, 8, &vpx_highbd_sad_skip_8x8x4d_sse2, 10),
1683   SadSkipMxNx4Param(4, 8, &vpx_highbd_sad_skip_4x8x4d_sse2, 10),
1684   SadSkipMxNx4Param(64, 64, &vpx_highbd_sad_skip_64x64x4d_sse2, 12),
1685   SadSkipMxNx4Param(64, 32, &vpx_highbd_sad_skip_64x32x4d_sse2, 12),
1686   SadSkipMxNx4Param(32, 64, &vpx_highbd_sad_skip_32x64x4d_sse2, 12),
1687   SadSkipMxNx4Param(32, 32, &vpx_highbd_sad_skip_32x32x4d_sse2, 12),
1688   SadSkipMxNx4Param(32, 16, &vpx_highbd_sad_skip_32x16x4d_sse2, 12),
1689   SadSkipMxNx4Param(16, 32, &vpx_highbd_sad_skip_16x32x4d_sse2, 12),
1690   SadSkipMxNx4Param(16, 16, &vpx_highbd_sad_skip_16x16x4d_sse2, 12),
1691   SadSkipMxNx4Param(16, 8, &vpx_highbd_sad_skip_16x8x4d_sse2, 12),
1692   SadSkipMxNx4Param(8, 16, &vpx_highbd_sad_skip_8x16x4d_sse2, 12),
1693   SadSkipMxNx4Param(8, 8, &vpx_highbd_sad_skip_8x8x4d_sse2, 12),
1694   SadSkipMxNx4Param(4, 8, &vpx_highbd_sad_skip_4x8x4d_sse2, 12),
1695 #endif  // CONFIG_VP9_HIGHBITDEPTH
1696 };
1697 INSTANTIATE_TEST_SUITE_P(SSE2, SADSkipx4Test,
1698                          ::testing::ValuesIn(skip_x4d_sse2_tests));
1699 #endif  // HAVE_SSE2
1700 
1701 #if HAVE_SSE3
1702 // Only functions are x3, which do not have tests.
1703 #endif  // HAVE_SSE3
1704 
1705 #if HAVE_SSSE3
1706 // Only functions are x3, which do not have tests.
1707 #endif  // HAVE_SSSE3
1708 
1709 #if HAVE_AVX2
1710 const SadMxNParam avx2_tests[] = {
1711   SadMxNParam(64, 64, &vpx_sad64x64_avx2),
1712   SadMxNParam(64, 32, &vpx_sad64x32_avx2),
1713   SadMxNParam(32, 64, &vpx_sad32x64_avx2),
1714   SadMxNParam(32, 32, &vpx_sad32x32_avx2),
1715   SadMxNParam(32, 16, &vpx_sad32x16_avx2),
1716 #if CONFIG_VP9_HIGHBITDEPTH
1717   SadMxNParam(64, 64, &vpx_highbd_sad64x64_avx2, 8),
1718   SadMxNParam(64, 32, &vpx_highbd_sad64x32_avx2, 8),
1719   SadMxNParam(32, 64, &vpx_highbd_sad32x64_avx2, 8),
1720   SadMxNParam(32, 32, &vpx_highbd_sad32x32_avx2, 8),
1721   SadMxNParam(32, 16, &vpx_highbd_sad32x16_avx2, 8),
1722   SadMxNParam(16, 32, &vpx_highbd_sad16x32_avx2, 8),
1723   SadMxNParam(16, 16, &vpx_highbd_sad16x16_avx2, 8),
1724   SadMxNParam(16, 8, &vpx_highbd_sad16x8_avx2, 8),
1725 
1726   SadMxNParam(64, 64, &vpx_highbd_sad64x64_avx2, 10),
1727   SadMxNParam(64, 32, &vpx_highbd_sad64x32_avx2, 10),
1728   SadMxNParam(32, 64, &vpx_highbd_sad32x64_avx2, 10),
1729   SadMxNParam(32, 32, &vpx_highbd_sad32x32_avx2, 10),
1730   SadMxNParam(32, 16, &vpx_highbd_sad32x16_avx2, 10),
1731   SadMxNParam(16, 32, &vpx_highbd_sad16x32_avx2, 10),
1732   SadMxNParam(16, 16, &vpx_highbd_sad16x16_avx2, 10),
1733   SadMxNParam(16, 8, &vpx_highbd_sad16x8_avx2, 10),
1734 
1735   SadMxNParam(64, 64, &vpx_highbd_sad64x64_avx2, 12),
1736   SadMxNParam(64, 32, &vpx_highbd_sad64x32_avx2, 12),
1737   SadMxNParam(32, 64, &vpx_highbd_sad32x64_avx2, 12),
1738   SadMxNParam(32, 32, &vpx_highbd_sad32x32_avx2, 12),
1739   SadMxNParam(32, 16, &vpx_highbd_sad32x16_avx2, 12),
1740   SadMxNParam(16, 32, &vpx_highbd_sad16x32_avx2, 12),
1741   SadMxNParam(16, 16, &vpx_highbd_sad16x16_avx2, 12),
1742   SadMxNParam(16, 8, &vpx_highbd_sad16x8_avx2, 12),
1743 #endif  // CONFIG_VP9_HIGHBITDEPTH
1744 };
1745 INSTANTIATE_TEST_SUITE_P(AVX2, SADTest, ::testing::ValuesIn(avx2_tests));
1746 
1747 const SadSkipMxNParam skip_avx2_tests[] = {
1748   SadSkipMxNParam(64, 64, &vpx_sad_skip_64x64_avx2),
1749   SadSkipMxNParam(64, 32, &vpx_sad_skip_64x32_avx2),
1750   SadSkipMxNParam(32, 64, &vpx_sad_skip_32x64_avx2),
1751   SadSkipMxNParam(32, 32, &vpx_sad_skip_32x32_avx2),
1752   SadSkipMxNParam(32, 16, &vpx_sad_skip_32x16_avx2),
1753 #if CONFIG_VP9_HIGHBITDEPTH
1754   SadSkipMxNParam(64, 64, &vpx_highbd_sad_skip_64x64_avx2, 8),
1755   SadSkipMxNParam(64, 32, &vpx_highbd_sad_skip_64x32_avx2, 8),
1756   SadSkipMxNParam(32, 64, &vpx_highbd_sad_skip_32x64_avx2, 8),
1757   SadSkipMxNParam(32, 32, &vpx_highbd_sad_skip_32x32_avx2, 8),
1758   SadSkipMxNParam(32, 16, &vpx_highbd_sad_skip_32x16_avx2, 8),
1759   SadSkipMxNParam(16, 32, &vpx_highbd_sad_skip_16x32_avx2, 8),
1760   SadSkipMxNParam(16, 16, &vpx_highbd_sad_skip_16x16_avx2, 8),
1761   SadSkipMxNParam(16, 8, &vpx_highbd_sad_skip_16x8_avx2, 8),
1762 
1763   SadSkipMxNParam(64, 64, &vpx_highbd_sad_skip_64x64_avx2, 10),
1764   SadSkipMxNParam(64, 32, &vpx_highbd_sad_skip_64x32_avx2, 10),
1765   SadSkipMxNParam(32, 64, &vpx_highbd_sad_skip_32x64_avx2, 10),
1766   SadSkipMxNParam(32, 32, &vpx_highbd_sad_skip_32x32_avx2, 10),
1767   SadSkipMxNParam(32, 16, &vpx_highbd_sad_skip_32x16_avx2, 10),
1768   SadSkipMxNParam(16, 32, &vpx_highbd_sad_skip_16x32_avx2, 10),
1769   SadSkipMxNParam(16, 16, &vpx_highbd_sad_skip_16x16_avx2, 10),
1770   SadSkipMxNParam(16, 8, &vpx_highbd_sad_skip_16x8_avx2, 10),
1771 
1772   SadSkipMxNParam(64, 64, &vpx_highbd_sad_skip_64x64_avx2, 12),
1773   SadSkipMxNParam(64, 32, &vpx_highbd_sad_skip_64x32_avx2, 12),
1774   SadSkipMxNParam(32, 64, &vpx_highbd_sad_skip_32x64_avx2, 12),
1775   SadSkipMxNParam(32, 32, &vpx_highbd_sad_skip_32x32_avx2, 12),
1776   SadSkipMxNParam(32, 16, &vpx_highbd_sad_skip_32x16_avx2, 12),
1777   SadSkipMxNParam(16, 32, &vpx_highbd_sad_skip_16x32_avx2, 12),
1778   SadSkipMxNParam(16, 16, &vpx_highbd_sad_skip_16x16_avx2, 12),
1779   SadSkipMxNParam(16, 8, &vpx_highbd_sad_skip_16x8_avx2, 12),
1780 #endif  // CONFIG_VP9_HIGHBITDEPTH
1781 };
1782 INSTANTIATE_TEST_SUITE_P(AVX2, SADSkipTest,
1783                          ::testing::ValuesIn(skip_avx2_tests));
1784 
1785 const SadMxNAvgParam avg_avx2_tests[] = {
1786   SadMxNAvgParam(64, 64, &vpx_sad64x64_avg_avx2),
1787   SadMxNAvgParam(64, 32, &vpx_sad64x32_avg_avx2),
1788   SadMxNAvgParam(32, 64, &vpx_sad32x64_avg_avx2),
1789   SadMxNAvgParam(32, 32, &vpx_sad32x32_avg_avx2),
1790   SadMxNAvgParam(32, 16, &vpx_sad32x16_avg_avx2),
1791 #if CONFIG_VP9_HIGHBITDEPTH
1792   SadMxNAvgParam(64, 64, &vpx_highbd_sad64x64_avg_avx2, 8),
1793   SadMxNAvgParam(64, 32, &vpx_highbd_sad64x32_avg_avx2, 8),
1794   SadMxNAvgParam(32, 64, &vpx_highbd_sad32x64_avg_avx2, 8),
1795   SadMxNAvgParam(32, 32, &vpx_highbd_sad32x32_avg_avx2, 8),
1796   SadMxNAvgParam(32, 16, &vpx_highbd_sad32x16_avg_avx2, 8),
1797   SadMxNAvgParam(16, 32, &vpx_highbd_sad16x32_avg_avx2, 8),
1798   SadMxNAvgParam(16, 16, &vpx_highbd_sad16x16_avg_avx2, 8),
1799   SadMxNAvgParam(16, 8, &vpx_highbd_sad16x8_avg_avx2, 8),
1800   SadMxNAvgParam(64, 64, &vpx_highbd_sad64x64_avg_avx2, 10),
1801   SadMxNAvgParam(64, 32, &vpx_highbd_sad64x32_avg_avx2, 10),
1802   SadMxNAvgParam(32, 64, &vpx_highbd_sad32x64_avg_avx2, 10),
1803   SadMxNAvgParam(32, 32, &vpx_highbd_sad32x32_avg_avx2, 10),
1804   SadMxNAvgParam(32, 16, &vpx_highbd_sad32x16_avg_avx2, 10),
1805   SadMxNAvgParam(16, 32, &vpx_highbd_sad16x32_avg_avx2, 10),
1806   SadMxNAvgParam(16, 16, &vpx_highbd_sad16x16_avg_avx2, 10),
1807   SadMxNAvgParam(16, 8, &vpx_highbd_sad16x8_avg_avx2, 10),
1808   SadMxNAvgParam(64, 64, &vpx_highbd_sad64x64_avg_avx2, 12),
1809   SadMxNAvgParam(64, 32, &vpx_highbd_sad64x32_avg_avx2, 12),
1810   SadMxNAvgParam(32, 64, &vpx_highbd_sad32x64_avg_avx2, 12),
1811   SadMxNAvgParam(32, 32, &vpx_highbd_sad32x32_avg_avx2, 12),
1812   SadMxNAvgParam(32, 16, &vpx_highbd_sad32x16_avg_avx2, 12),
1813   SadMxNAvgParam(16, 32, &vpx_highbd_sad16x32_avg_avx2, 12),
1814   SadMxNAvgParam(16, 16, &vpx_highbd_sad16x16_avg_avx2, 12),
1815   SadMxNAvgParam(16, 8, &vpx_highbd_sad16x8_avg_avx2, 12),
1816 #endif  // CONFIG_VP9_HIGHBITDEPTH
1817 };
1818 INSTANTIATE_TEST_SUITE_P(AVX2, SADavgTest, ::testing::ValuesIn(avg_avx2_tests));
1819 
1820 const SadMxNx4Param x4d_avx2_tests[] = {
1821   SadMxNx4Param(64, 64, &vpx_sad64x64x4d_avx2),
1822   SadMxNx4Param(32, 32, &vpx_sad32x32x4d_avx2),
1823 #if CONFIG_VP9_HIGHBITDEPTH
1824   SadMxNx4Param(64, 64, &vpx_highbd_sad64x64x4d_avx2, 8),
1825   SadMxNx4Param(64, 32, &vpx_highbd_sad64x32x4d_avx2, 8),
1826   SadMxNx4Param(32, 64, &vpx_highbd_sad32x64x4d_avx2, 8),
1827   SadMxNx4Param(32, 32, &vpx_highbd_sad32x32x4d_avx2, 8),
1828   SadMxNx4Param(32, 16, &vpx_highbd_sad32x16x4d_avx2, 8),
1829   SadMxNx4Param(16, 32, &vpx_highbd_sad16x32x4d_avx2, 8),
1830   SadMxNx4Param(16, 16, &vpx_highbd_sad16x16x4d_avx2, 8),
1831   SadMxNx4Param(16, 8, &vpx_highbd_sad16x8x4d_avx2, 8),
1832   SadMxNx4Param(64, 64, &vpx_highbd_sad64x64x4d_avx2, 10),
1833   SadMxNx4Param(64, 32, &vpx_highbd_sad64x32x4d_avx2, 10),
1834   SadMxNx4Param(32, 64, &vpx_highbd_sad32x64x4d_avx2, 10),
1835   SadMxNx4Param(32, 32, &vpx_highbd_sad32x32x4d_avx2, 10),
1836   SadMxNx4Param(32, 16, &vpx_highbd_sad32x16x4d_avx2, 10),
1837   SadMxNx4Param(16, 32, &vpx_highbd_sad16x32x4d_avx2, 10),
1838   SadMxNx4Param(16, 16, &vpx_highbd_sad16x16x4d_avx2, 10),
1839   SadMxNx4Param(16, 8, &vpx_highbd_sad16x8x4d_avx2, 10),
1840   SadMxNx4Param(64, 64, &vpx_highbd_sad64x64x4d_avx2, 12),
1841   SadMxNx4Param(64, 32, &vpx_highbd_sad64x32x4d_avx2, 12),
1842   SadMxNx4Param(32, 64, &vpx_highbd_sad32x64x4d_avx2, 12),
1843   SadMxNx4Param(32, 32, &vpx_highbd_sad32x32x4d_avx2, 12),
1844   SadMxNx4Param(32, 16, &vpx_highbd_sad32x16x4d_avx2, 12),
1845   SadMxNx4Param(16, 32, &vpx_highbd_sad16x32x4d_avx2, 12),
1846   SadMxNx4Param(16, 16, &vpx_highbd_sad16x16x4d_avx2, 12),
1847   SadMxNx4Param(16, 8, &vpx_highbd_sad16x8x4d_avx2, 12),
1848 #endif  // CONFIG_VP9_HIGHBITDEPTH
1849 };
1850 INSTANTIATE_TEST_SUITE_P(AVX2, SADx4Test, ::testing::ValuesIn(x4d_avx2_tests));
1851 
1852 const SadSkipMxNx4Param skip_x4d_avx2_tests[] = {
1853   SadSkipMxNx4Param(64, 64, &vpx_sad_skip_64x64x4d_avx2),
1854   SadSkipMxNx4Param(64, 32, &vpx_sad_skip_64x32x4d_avx2),
1855   SadSkipMxNx4Param(32, 64, &vpx_sad_skip_32x64x4d_avx2),
1856   SadSkipMxNx4Param(32, 32, &vpx_sad_skip_32x32x4d_avx2),
1857   SadSkipMxNx4Param(32, 16, &vpx_sad_skip_32x16x4d_avx2),
1858 #if CONFIG_VP9_HIGHBITDEPTH
1859   SadSkipMxNx4Param(64, 64, &vpx_highbd_sad_skip_64x64x4d_avx2, 8),
1860   SadSkipMxNx4Param(64, 32, &vpx_highbd_sad_skip_64x32x4d_avx2, 8),
1861   SadSkipMxNx4Param(32, 64, &vpx_highbd_sad_skip_32x64x4d_avx2, 8),
1862   SadSkipMxNx4Param(32, 32, &vpx_highbd_sad_skip_32x32x4d_avx2, 8),
1863   SadSkipMxNx4Param(32, 16, &vpx_highbd_sad_skip_32x16x4d_avx2, 8),
1864   SadSkipMxNx4Param(16, 32, &vpx_highbd_sad_skip_16x32x4d_avx2, 8),
1865   SadSkipMxNx4Param(16, 16, &vpx_highbd_sad_skip_16x16x4d_avx2, 8),
1866   SadSkipMxNx4Param(16, 8, &vpx_highbd_sad_skip_16x8x4d_avx2, 8),
1867   SadSkipMxNx4Param(64, 64, &vpx_highbd_sad_skip_64x64x4d_avx2, 10),
1868   SadSkipMxNx4Param(64, 32, &vpx_highbd_sad_skip_64x32x4d_avx2, 10),
1869   SadSkipMxNx4Param(32, 64, &vpx_highbd_sad_skip_32x64x4d_avx2, 10),
1870   SadSkipMxNx4Param(32, 32, &vpx_highbd_sad_skip_32x32x4d_avx2, 10),
1871   SadSkipMxNx4Param(32, 16, &vpx_highbd_sad_skip_32x16x4d_avx2, 10),
1872   SadSkipMxNx4Param(16, 32, &vpx_highbd_sad_skip_16x32x4d_avx2, 10),
1873   SadSkipMxNx4Param(16, 16, &vpx_highbd_sad_skip_16x16x4d_avx2, 10),
1874   SadSkipMxNx4Param(16, 8, &vpx_highbd_sad_skip_16x8x4d_avx2, 10),
1875   SadSkipMxNx4Param(64, 64, &vpx_highbd_sad_skip_64x64x4d_avx2, 12),
1876   SadSkipMxNx4Param(64, 32, &vpx_highbd_sad_skip_64x32x4d_avx2, 12),
1877   SadSkipMxNx4Param(32, 64, &vpx_highbd_sad_skip_32x64x4d_avx2, 12),
1878   SadSkipMxNx4Param(32, 32, &vpx_highbd_sad_skip_32x32x4d_avx2, 12),
1879   SadSkipMxNx4Param(32, 16, &vpx_highbd_sad_skip_32x16x4d_avx2, 12),
1880   SadSkipMxNx4Param(16, 32, &vpx_highbd_sad_skip_16x32x4d_avx2, 12),
1881   SadSkipMxNx4Param(16, 16, &vpx_highbd_sad_skip_16x16x4d_avx2, 12),
1882   SadSkipMxNx4Param(16, 8, &vpx_highbd_sad_skip_16x8x4d_avx2, 12),
1883 #endif  // CONFIG_VP9_HIGHBITDEPTH
1884 };
1885 INSTANTIATE_TEST_SUITE_P(AVX2, SADSkipx4Test,
1886                          ::testing::ValuesIn(skip_x4d_avx2_tests));
1887 
1888 #endif  // HAVE_AVX2
1889 
1890 #if HAVE_AVX512
1891 const SadMxNx4Param x4d_avx512_tests[] = {
1892   SadMxNx4Param(64, 64, &vpx_sad64x64x4d_avx512),
1893 };
1894 INSTANTIATE_TEST_SUITE_P(AVX512, SADx4Test,
1895                          ::testing::ValuesIn(x4d_avx512_tests));
1896 #endif  // HAVE_AVX512
1897 
1898 //------------------------------------------------------------------------------
1899 // MIPS functions
1900 #if HAVE_MSA
1901 const SadMxNParam msa_tests[] = {
1902   SadMxNParam(64, 64, &vpx_sad64x64_msa),
1903   SadMxNParam(64, 32, &vpx_sad64x32_msa),
1904   SadMxNParam(32, 64, &vpx_sad32x64_msa),
1905   SadMxNParam(32, 32, &vpx_sad32x32_msa),
1906   SadMxNParam(32, 16, &vpx_sad32x16_msa),
1907   SadMxNParam(16, 32, &vpx_sad16x32_msa),
1908   SadMxNParam(16, 16, &vpx_sad16x16_msa),
1909   SadMxNParam(16, 8, &vpx_sad16x8_msa),
1910   SadMxNParam(8, 16, &vpx_sad8x16_msa),
1911   SadMxNParam(8, 8, &vpx_sad8x8_msa),
1912   SadMxNParam(8, 4, &vpx_sad8x4_msa),
1913   SadMxNParam(4, 8, &vpx_sad4x8_msa),
1914   SadMxNParam(4, 4, &vpx_sad4x4_msa),
1915 };
1916 INSTANTIATE_TEST_SUITE_P(MSA, SADTest, ::testing::ValuesIn(msa_tests));
1917 
1918 const SadMxNAvgParam avg_msa_tests[] = {
1919   SadMxNAvgParam(64, 64, &vpx_sad64x64_avg_msa),
1920   SadMxNAvgParam(64, 32, &vpx_sad64x32_avg_msa),
1921   SadMxNAvgParam(32, 64, &vpx_sad32x64_avg_msa),
1922   SadMxNAvgParam(32, 32, &vpx_sad32x32_avg_msa),
1923   SadMxNAvgParam(32, 16, &vpx_sad32x16_avg_msa),
1924   SadMxNAvgParam(16, 32, &vpx_sad16x32_avg_msa),
1925   SadMxNAvgParam(16, 16, &vpx_sad16x16_avg_msa),
1926   SadMxNAvgParam(16, 8, &vpx_sad16x8_avg_msa),
1927   SadMxNAvgParam(8, 16, &vpx_sad8x16_avg_msa),
1928   SadMxNAvgParam(8, 8, &vpx_sad8x8_avg_msa),
1929   SadMxNAvgParam(8, 4, &vpx_sad8x4_avg_msa),
1930   SadMxNAvgParam(4, 8, &vpx_sad4x8_avg_msa),
1931   SadMxNAvgParam(4, 4, &vpx_sad4x4_avg_msa),
1932 };
1933 INSTANTIATE_TEST_SUITE_P(MSA, SADavgTest, ::testing::ValuesIn(avg_msa_tests));
1934 
1935 const SadMxNx4Param x4d_msa_tests[] = {
1936   SadMxNx4Param(64, 64, &vpx_sad64x64x4d_msa),
1937   SadMxNx4Param(64, 32, &vpx_sad64x32x4d_msa),
1938   SadMxNx4Param(32, 64, &vpx_sad32x64x4d_msa),
1939   SadMxNx4Param(32, 32, &vpx_sad32x32x4d_msa),
1940   SadMxNx4Param(32, 16, &vpx_sad32x16x4d_msa),
1941   SadMxNx4Param(16, 32, &vpx_sad16x32x4d_msa),
1942   SadMxNx4Param(16, 16, &vpx_sad16x16x4d_msa),
1943   SadMxNx4Param(16, 8, &vpx_sad16x8x4d_msa),
1944   SadMxNx4Param(8, 16, &vpx_sad8x16x4d_msa),
1945   SadMxNx4Param(8, 8, &vpx_sad8x8x4d_msa),
1946   SadMxNx4Param(8, 4, &vpx_sad8x4x4d_msa),
1947   SadMxNx4Param(4, 8, &vpx_sad4x8x4d_msa),
1948   SadMxNx4Param(4, 4, &vpx_sad4x4x4d_msa),
1949 };
1950 INSTANTIATE_TEST_SUITE_P(MSA, SADx4Test, ::testing::ValuesIn(x4d_msa_tests));
1951 #endif  // HAVE_MSA
1952 
1953 //------------------------------------------------------------------------------
1954 // VSX functions
1955 #if HAVE_VSX
1956 const SadMxNParam vsx_tests[] = {
1957   SadMxNParam(64, 64, &vpx_sad64x64_vsx),
1958   SadMxNParam(64, 32, &vpx_sad64x32_vsx),
1959   SadMxNParam(32, 64, &vpx_sad32x64_vsx),
1960   SadMxNParam(32, 32, &vpx_sad32x32_vsx),
1961   SadMxNParam(32, 16, &vpx_sad32x16_vsx),
1962   SadMxNParam(16, 32, &vpx_sad16x32_vsx),
1963   SadMxNParam(16, 16, &vpx_sad16x16_vsx),
1964   SadMxNParam(16, 8, &vpx_sad16x8_vsx),
1965   SadMxNParam(8, 16, &vpx_sad8x16_vsx),
1966   SadMxNParam(8, 8, &vpx_sad8x8_vsx),
1967   SadMxNParam(8, 4, &vpx_sad8x4_vsx),
1968 };
1969 INSTANTIATE_TEST_SUITE_P(VSX, SADTest, ::testing::ValuesIn(vsx_tests));
1970 
1971 const SadMxNAvgParam avg_vsx_tests[] = {
1972   SadMxNAvgParam(64, 64, &vpx_sad64x64_avg_vsx),
1973   SadMxNAvgParam(64, 32, &vpx_sad64x32_avg_vsx),
1974   SadMxNAvgParam(32, 64, &vpx_sad32x64_avg_vsx),
1975   SadMxNAvgParam(32, 32, &vpx_sad32x32_avg_vsx),
1976   SadMxNAvgParam(32, 16, &vpx_sad32x16_avg_vsx),
1977   SadMxNAvgParam(16, 32, &vpx_sad16x32_avg_vsx),
1978   SadMxNAvgParam(16, 16, &vpx_sad16x16_avg_vsx),
1979   SadMxNAvgParam(16, 8, &vpx_sad16x8_avg_vsx),
1980 };
1981 INSTANTIATE_TEST_SUITE_P(VSX, SADavgTest, ::testing::ValuesIn(avg_vsx_tests));
1982 
1983 const SadMxNx4Param x4d_vsx_tests[] = {
1984   SadMxNx4Param(64, 64, &vpx_sad64x64x4d_vsx),
1985   SadMxNx4Param(64, 32, &vpx_sad64x32x4d_vsx),
1986   SadMxNx4Param(32, 64, &vpx_sad32x64x4d_vsx),
1987   SadMxNx4Param(32, 32, &vpx_sad32x32x4d_vsx),
1988   SadMxNx4Param(32, 16, &vpx_sad32x16x4d_vsx),
1989   SadMxNx4Param(16, 32, &vpx_sad16x32x4d_vsx),
1990   SadMxNx4Param(16, 16, &vpx_sad16x16x4d_vsx),
1991   SadMxNx4Param(16, 8, &vpx_sad16x8x4d_vsx),
1992 };
1993 INSTANTIATE_TEST_SUITE_P(VSX, SADx4Test, ::testing::ValuesIn(x4d_vsx_tests));
1994 #endif  // HAVE_VSX
1995 
1996 //------------------------------------------------------------------------------
1997 // Loongson functions
1998 #if HAVE_MMI
1999 const SadMxNParam mmi_tests[] = {
2000   SadMxNParam(64, 64, &vpx_sad64x64_mmi),
2001   SadMxNParam(64, 32, &vpx_sad64x32_mmi),
2002   SadMxNParam(32, 64, &vpx_sad32x64_mmi),
2003   SadMxNParam(32, 32, &vpx_sad32x32_mmi),
2004   SadMxNParam(32, 16, &vpx_sad32x16_mmi),
2005   SadMxNParam(16, 32, &vpx_sad16x32_mmi),
2006   SadMxNParam(16, 16, &vpx_sad16x16_mmi),
2007   SadMxNParam(16, 8, &vpx_sad16x8_mmi),
2008   SadMxNParam(8, 16, &vpx_sad8x16_mmi),
2009   SadMxNParam(8, 8, &vpx_sad8x8_mmi),
2010   SadMxNParam(8, 4, &vpx_sad8x4_mmi),
2011   SadMxNParam(4, 8, &vpx_sad4x8_mmi),
2012   SadMxNParam(4, 4, &vpx_sad4x4_mmi),
2013 };
2014 INSTANTIATE_TEST_SUITE_P(MMI, SADTest, ::testing::ValuesIn(mmi_tests));
2015 
2016 const SadMxNAvgParam avg_mmi_tests[] = {
2017   SadMxNAvgParam(64, 64, &vpx_sad64x64_avg_mmi),
2018   SadMxNAvgParam(64, 32, &vpx_sad64x32_avg_mmi),
2019   SadMxNAvgParam(32, 64, &vpx_sad32x64_avg_mmi),
2020   SadMxNAvgParam(32, 32, &vpx_sad32x32_avg_mmi),
2021   SadMxNAvgParam(32, 16, &vpx_sad32x16_avg_mmi),
2022   SadMxNAvgParam(16, 32, &vpx_sad16x32_avg_mmi),
2023   SadMxNAvgParam(16, 16, &vpx_sad16x16_avg_mmi),
2024   SadMxNAvgParam(16, 8, &vpx_sad16x8_avg_mmi),
2025   SadMxNAvgParam(8, 16, &vpx_sad8x16_avg_mmi),
2026   SadMxNAvgParam(8, 8, &vpx_sad8x8_avg_mmi),
2027   SadMxNAvgParam(8, 4, &vpx_sad8x4_avg_mmi),
2028   SadMxNAvgParam(4, 8, &vpx_sad4x8_avg_mmi),
2029   SadMxNAvgParam(4, 4, &vpx_sad4x4_avg_mmi),
2030 };
2031 INSTANTIATE_TEST_SUITE_P(MMI, SADavgTest, ::testing::ValuesIn(avg_mmi_tests));
2032 
2033 const SadMxNx4Param x4d_mmi_tests[] = {
2034   SadMxNx4Param(64, 64, &vpx_sad64x64x4d_mmi),
2035   SadMxNx4Param(64, 32, &vpx_sad64x32x4d_mmi),
2036   SadMxNx4Param(32, 64, &vpx_sad32x64x4d_mmi),
2037   SadMxNx4Param(32, 32, &vpx_sad32x32x4d_mmi),
2038   SadMxNx4Param(32, 16, &vpx_sad32x16x4d_mmi),
2039   SadMxNx4Param(16, 32, &vpx_sad16x32x4d_mmi),
2040   SadMxNx4Param(16, 16, &vpx_sad16x16x4d_mmi),
2041   SadMxNx4Param(16, 8, &vpx_sad16x8x4d_mmi),
2042   SadMxNx4Param(8, 16, &vpx_sad8x16x4d_mmi),
2043   SadMxNx4Param(8, 8, &vpx_sad8x8x4d_mmi),
2044   SadMxNx4Param(8, 4, &vpx_sad8x4x4d_mmi),
2045   SadMxNx4Param(4, 8, &vpx_sad4x8x4d_mmi),
2046   SadMxNx4Param(4, 4, &vpx_sad4x4x4d_mmi),
2047 };
2048 INSTANTIATE_TEST_SUITE_P(MMI, SADx4Test, ::testing::ValuesIn(x4d_mmi_tests));
2049 #endif  // HAVE_MMI
2050 
2051 //------------------------------------------------------------------------------
2052 // loongarch functions
2053 #if HAVE_LSX
2054 const SadMxNParam lsx_tests[] = {
2055   SadMxNParam(64, 64, &vpx_sad64x64_lsx),
2056   SadMxNParam(32, 32, &vpx_sad32x32_lsx),
2057   SadMxNParam(16, 16, &vpx_sad16x16_lsx),
2058   SadMxNParam(8, 8, &vpx_sad8x8_lsx),
2059 };
2060 INSTANTIATE_TEST_SUITE_P(LSX, SADTest, ::testing::ValuesIn(lsx_tests));
2061 
2062 const SadMxNAvgParam avg_lsx_tests[] = {
2063   SadMxNAvgParam(64, 64, &vpx_sad64x64_avg_lsx),
2064   SadMxNAvgParam(32, 32, &vpx_sad32x32_avg_lsx),
2065 };
2066 INSTANTIATE_TEST_SUITE_P(LSX, SADavgTest, ::testing::ValuesIn(avg_lsx_tests));
2067 
2068 const SadMxNx4Param x4d_lsx_tests[] = {
2069   SadMxNx4Param(64, 64, &vpx_sad64x64x4d_lsx),
2070   SadMxNx4Param(64, 32, &vpx_sad64x32x4d_lsx),
2071   SadMxNx4Param(32, 64, &vpx_sad32x64x4d_lsx),
2072   SadMxNx4Param(32, 32, &vpx_sad32x32x4d_lsx),
2073   SadMxNx4Param(16, 16, &vpx_sad16x16x4d_lsx),
2074   SadMxNx4Param(8, 8, &vpx_sad8x8x4d_lsx),
2075 };
2076 INSTANTIATE_TEST_SUITE_P(LSX, SADx4Test, ::testing::ValuesIn(x4d_lsx_tests));
2077 #endif  // HAVE_LSX
2078 
2079 }  // namespace
2080