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 ¶ms) : 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