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 12 #include <string.h> 13 #include <limits.h> 14 #include <stdio.h> 15 16 #include "third_party/googletest/src/include/gtest/gtest.h" 17 18 #include "./vpx_config.h" 19 #include "./vpx_dsp_rtcd.h" 20 #include "test/acm_random.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 28 typedef unsigned int (*SadMxNFunc)(const uint8_t *src_ptr, 29 int src_stride, 30 const uint8_t *ref_ptr, 31 int ref_stride); 32 typedef std::tr1::tuple<int, int, SadMxNFunc, int> SadMxNParam; 33 34 typedef uint32_t (*SadMxNAvgFunc)(const uint8_t *src_ptr, 35 int src_stride, 36 const uint8_t *ref_ptr, 37 int ref_stride, 38 const uint8_t *second_pred); 39 typedef std::tr1::tuple<int, int, SadMxNAvgFunc, int> SadMxNAvgParam; 40 41 typedef void (*SadMxNx4Func)(const uint8_t *src_ptr, 42 int src_stride, 43 const uint8_t *const ref_ptr[], 44 int ref_stride, 45 uint32_t *sad_array); 46 typedef std::tr1::tuple<int, int, SadMxNx4Func, int> SadMxNx4Param; 47 48 using libvpx_test::ACMRandom; 49 50 namespace { 51 class SADTestBase : public ::testing::Test { 52 public: 53 SADTestBase(int width, int height, int bit_depth) : 54 width_(width), height_(height), bd_(bit_depth) {} 55 56 static void SetUpTestCase() { 57 source_data8_ = reinterpret_cast<uint8_t*>( 58 vpx_memalign(kDataAlignment, kDataBlockSize)); 59 reference_data8_ = reinterpret_cast<uint8_t*>( 60 vpx_memalign(kDataAlignment, kDataBufferSize)); 61 second_pred8_ = reinterpret_cast<uint8_t*>( 62 vpx_memalign(kDataAlignment, 64*64)); 63 source_data16_ = reinterpret_cast<uint16_t*>( 64 vpx_memalign(kDataAlignment, kDataBlockSize*sizeof(uint16_t))); 65 reference_data16_ = reinterpret_cast<uint16_t*>( 66 vpx_memalign(kDataAlignment, kDataBufferSize*sizeof(uint16_t))); 67 second_pred16_ = reinterpret_cast<uint16_t*>( 68 vpx_memalign(kDataAlignment, 64*64*sizeof(uint16_t))); 69 } 70 71 static void TearDownTestCase() { 72 vpx_free(source_data8_); 73 source_data8_ = NULL; 74 vpx_free(reference_data8_); 75 reference_data8_ = NULL; 76 vpx_free(second_pred8_); 77 second_pred8_ = NULL; 78 vpx_free(source_data16_); 79 source_data16_ = NULL; 80 vpx_free(reference_data16_); 81 reference_data16_ = NULL; 82 vpx_free(second_pred16_); 83 second_pred16_ = NULL; 84 } 85 86 virtual void TearDown() { 87 libvpx_test::ClearSystemState(); 88 } 89 90 protected: 91 // Handle blocks up to 4 blocks 64x64 with stride up to 128 92 static const int kDataAlignment = 16; 93 static const int kDataBlockSize = 64 * 128; 94 static const int kDataBufferSize = 4 * kDataBlockSize; 95 96 virtual void SetUp() { 97 if (bd_ == -1) { 98 use_high_bit_depth_ = false; 99 bit_depth_ = VPX_BITS_8; 100 source_data_ = source_data8_; 101 reference_data_ = reference_data8_; 102 second_pred_ = second_pred8_; 103 #if CONFIG_VP9_HIGHBITDEPTH 104 } else { 105 use_high_bit_depth_ = true; 106 bit_depth_ = static_cast<vpx_bit_depth_t>(bd_); 107 source_data_ = CONVERT_TO_BYTEPTR(source_data16_); 108 reference_data_ = CONVERT_TO_BYTEPTR(reference_data16_); 109 second_pred_ = CONVERT_TO_BYTEPTR(second_pred16_); 110 #endif // CONFIG_VP9_HIGHBITDEPTH 111 } 112 mask_ = (1 << bit_depth_) - 1; 113 source_stride_ = (width_ + 31) & ~31; 114 reference_stride_ = width_ * 2; 115 rnd_.Reset(ACMRandom::DeterministicSeed()); 116 } 117 118 virtual uint8_t *GetReference(int block_idx) { 119 #if CONFIG_VP9_HIGHBITDEPTH 120 if (use_high_bit_depth_) 121 return CONVERT_TO_BYTEPTR(CONVERT_TO_SHORTPTR(reference_data_) + 122 block_idx * kDataBlockSize); 123 #endif // CONFIG_VP9_HIGHBITDEPTH 124 return reference_data_ + block_idx * kDataBlockSize; 125 } 126 127 // Sum of Absolute Differences. Given two blocks, calculate the absolute 128 // difference between two pixels in the same relative location; accumulate. 129 unsigned int ReferenceSAD(int block_idx) { 130 unsigned int sad = 0; 131 const uint8_t *const reference8 = GetReference(block_idx); 132 const uint8_t *const source8 = source_data_; 133 #if CONFIG_VP9_HIGHBITDEPTH 134 const uint16_t *const reference16 = 135 CONVERT_TO_SHORTPTR(GetReference(block_idx)); 136 const uint16_t *const source16 = CONVERT_TO_SHORTPTR(source_data_); 137 #endif // CONFIG_VP9_HIGHBITDEPTH 138 for (int h = 0; h < height_; ++h) { 139 for (int w = 0; w < width_; ++w) { 140 if (!use_high_bit_depth_) { 141 sad += abs(source8[h * source_stride_ + w] - 142 reference8[h * reference_stride_ + w]); 143 #if CONFIG_VP9_HIGHBITDEPTH 144 } else { 145 sad += abs(source16[h * source_stride_ + w] - 146 reference16[h * reference_stride_ + w]); 147 #endif // CONFIG_VP9_HIGHBITDEPTH 148 } 149 } 150 } 151 return sad; 152 } 153 154 // Sum of Absolute Differences Average. Given two blocks, and a prediction 155 // calculate the absolute difference between one pixel and average of the 156 // corresponding and predicted pixels; accumulate. 157 unsigned int ReferenceSADavg(int block_idx) { 158 unsigned int sad = 0; 159 const uint8_t *const reference8 = GetReference(block_idx); 160 const uint8_t *const source8 = source_data_; 161 const uint8_t *const second_pred8 = second_pred_; 162 #if CONFIG_VP9_HIGHBITDEPTH 163 const uint16_t *const reference16 = 164 CONVERT_TO_SHORTPTR(GetReference(block_idx)); 165 const uint16_t *const source16 = CONVERT_TO_SHORTPTR(source_data_); 166 const uint16_t *const second_pred16 = CONVERT_TO_SHORTPTR(second_pred_); 167 #endif // CONFIG_VP9_HIGHBITDEPTH 168 for (int h = 0; h < height_; ++h) { 169 for (int w = 0; w < width_; ++w) { 170 if (!use_high_bit_depth_) { 171 const int tmp = second_pred8[h * width_ + w] + 172 reference8[h * reference_stride_ + w]; 173 const uint8_t comp_pred = ROUND_POWER_OF_TWO(tmp, 1); 174 sad += abs(source8[h * source_stride_ + w] - comp_pred); 175 #if CONFIG_VP9_HIGHBITDEPTH 176 } else { 177 const int tmp = second_pred16[h * width_ + w] + 178 reference16[h * reference_stride_ + w]; 179 const uint16_t comp_pred = ROUND_POWER_OF_TWO(tmp, 1); 180 sad += abs(source16[h * source_stride_ + w] - comp_pred); 181 #endif // CONFIG_VP9_HIGHBITDEPTH 182 } 183 } 184 } 185 return sad; 186 } 187 188 void FillConstant(uint8_t *data, int stride, uint16_t fill_constant) { 189 uint8_t *data8 = data; 190 #if CONFIG_VP9_HIGHBITDEPTH 191 uint16_t *data16 = CONVERT_TO_SHORTPTR(data); 192 #endif // CONFIG_VP9_HIGHBITDEPTH 193 for (int h = 0; h < height_; ++h) { 194 for (int w = 0; w < width_; ++w) { 195 if (!use_high_bit_depth_) { 196 data8[h * stride + w] = static_cast<uint8_t>(fill_constant); 197 #if CONFIG_VP9_HIGHBITDEPTH 198 } else { 199 data16[h * stride + w] = fill_constant; 200 #endif // CONFIG_VP9_HIGHBITDEPTH 201 } 202 } 203 } 204 } 205 206 void FillRandom(uint8_t *data, int stride) { 207 uint8_t *data8 = data; 208 #if CONFIG_VP9_HIGHBITDEPTH 209 uint16_t *data16 = CONVERT_TO_SHORTPTR(data); 210 #endif // CONFIG_VP9_HIGHBITDEPTH 211 for (int h = 0; h < height_; ++h) { 212 for (int w = 0; w < width_; ++w) { 213 if (!use_high_bit_depth_) { 214 data8[h * stride + w] = rnd_.Rand8(); 215 #if CONFIG_VP9_HIGHBITDEPTH 216 } else { 217 data16[h * stride + w] = rnd_.Rand16() & mask_; 218 #endif // CONFIG_VP9_HIGHBITDEPTH 219 } 220 } 221 } 222 } 223 224 int width_, height_, mask_, bd_; 225 vpx_bit_depth_t bit_depth_; 226 static uint8_t *source_data_; 227 static uint8_t *reference_data_; 228 static uint8_t *second_pred_; 229 int source_stride_; 230 bool use_high_bit_depth_; 231 static uint8_t *source_data8_; 232 static uint8_t *reference_data8_; 233 static uint8_t *second_pred8_; 234 static uint16_t *source_data16_; 235 static uint16_t *reference_data16_; 236 static uint16_t *second_pred16_; 237 int reference_stride_; 238 239 ACMRandom rnd_; 240 }; 241 242 class SADx4Test 243 : public SADTestBase, 244 public ::testing::WithParamInterface<SadMxNx4Param> { 245 public: 246 SADx4Test() : SADTestBase(GET_PARAM(0), GET_PARAM(1), GET_PARAM(3)) {} 247 248 protected: 249 void SADs(unsigned int *results) { 250 const uint8_t *references[] = {GetReference(0), GetReference(1), 251 GetReference(2), GetReference(3)}; 252 253 ASM_REGISTER_STATE_CHECK(GET_PARAM(2)(source_data_, source_stride_, 254 references, reference_stride_, 255 results)); 256 } 257 258 void CheckSADs() { 259 unsigned int reference_sad, exp_sad[4]; 260 261 SADs(exp_sad); 262 for (int block = 0; block < 4; ++block) { 263 reference_sad = ReferenceSAD(block); 264 265 EXPECT_EQ(reference_sad, exp_sad[block]) << "block " << block; 266 } 267 } 268 }; 269 270 class SADTest 271 : public SADTestBase, 272 public ::testing::WithParamInterface<SadMxNParam> { 273 public: 274 SADTest() : SADTestBase(GET_PARAM(0), GET_PARAM(1), GET_PARAM(3)) {} 275 276 protected: 277 unsigned int SAD(int block_idx) { 278 unsigned int ret; 279 const uint8_t *const reference = GetReference(block_idx); 280 281 ASM_REGISTER_STATE_CHECK(ret = GET_PARAM(2)(source_data_, source_stride_, 282 reference, reference_stride_)); 283 return ret; 284 } 285 286 void CheckSAD() { 287 const unsigned int reference_sad = ReferenceSAD(0); 288 const unsigned int exp_sad = SAD(0); 289 290 ASSERT_EQ(reference_sad, exp_sad); 291 } 292 }; 293 294 class SADavgTest 295 : public SADTestBase, 296 public ::testing::WithParamInterface<SadMxNAvgParam> { 297 public: 298 SADavgTest() : SADTestBase(GET_PARAM(0), GET_PARAM(1), GET_PARAM(3)) {} 299 300 protected: 301 unsigned int SAD_avg(int block_idx) { 302 unsigned int ret; 303 const uint8_t *const reference = GetReference(block_idx); 304 305 ASM_REGISTER_STATE_CHECK(ret = GET_PARAM(2)(source_data_, source_stride_, 306 reference, reference_stride_, 307 second_pred_)); 308 return ret; 309 } 310 311 void CheckSAD() { 312 const unsigned int reference_sad = ReferenceSADavg(0); 313 const unsigned int exp_sad = SAD_avg(0); 314 315 ASSERT_EQ(reference_sad, exp_sad); 316 } 317 }; 318 319 uint8_t *SADTestBase::source_data_ = NULL; 320 uint8_t *SADTestBase::reference_data_ = NULL; 321 uint8_t *SADTestBase::second_pred_ = NULL; 322 uint8_t *SADTestBase::source_data8_ = NULL; 323 uint8_t *SADTestBase::reference_data8_ = NULL; 324 uint8_t *SADTestBase::second_pred8_ = NULL; 325 uint16_t *SADTestBase::source_data16_ = NULL; 326 uint16_t *SADTestBase::reference_data16_ = NULL; 327 uint16_t *SADTestBase::second_pred16_ = NULL; 328 329 TEST_P(SADTest, MaxRef) { 330 FillConstant(source_data_, source_stride_, 0); 331 FillConstant(reference_data_, reference_stride_, mask_); 332 CheckSAD(); 333 } 334 335 TEST_P(SADTest, MaxSrc) { 336 FillConstant(source_data_, source_stride_, mask_); 337 FillConstant(reference_data_, reference_stride_, 0); 338 CheckSAD(); 339 } 340 341 TEST_P(SADTest, ShortRef) { 342 const int tmp_stride = reference_stride_; 343 reference_stride_ >>= 1; 344 FillRandom(source_data_, source_stride_); 345 FillRandom(reference_data_, reference_stride_); 346 CheckSAD(); 347 reference_stride_ = tmp_stride; 348 } 349 350 TEST_P(SADTest, UnalignedRef) { 351 // The reference frame, but not the source frame, may be unaligned for 352 // certain types of searches. 353 const int tmp_stride = reference_stride_; 354 reference_stride_ -= 1; 355 FillRandom(source_data_, source_stride_); 356 FillRandom(reference_data_, reference_stride_); 357 CheckSAD(); 358 reference_stride_ = tmp_stride; 359 } 360 361 TEST_P(SADTest, ShortSrc) { 362 const int tmp_stride = source_stride_; 363 source_stride_ >>= 1; 364 FillRandom(source_data_, source_stride_); 365 FillRandom(reference_data_, reference_stride_); 366 CheckSAD(); 367 source_stride_ = tmp_stride; 368 } 369 370 TEST_P(SADavgTest, MaxRef) { 371 FillConstant(source_data_, source_stride_, 0); 372 FillConstant(reference_data_, reference_stride_, mask_); 373 FillConstant(second_pred_, width_, 0); 374 CheckSAD(); 375 } 376 TEST_P(SADavgTest, MaxSrc) { 377 FillConstant(source_data_, source_stride_, mask_); 378 FillConstant(reference_data_, reference_stride_, 0); 379 FillConstant(second_pred_, width_, 0); 380 CheckSAD(); 381 } 382 383 TEST_P(SADavgTest, ShortRef) { 384 const int tmp_stride = reference_stride_; 385 reference_stride_ >>= 1; 386 FillRandom(source_data_, source_stride_); 387 FillRandom(reference_data_, reference_stride_); 388 FillRandom(second_pred_, width_); 389 CheckSAD(); 390 reference_stride_ = tmp_stride; 391 } 392 393 TEST_P(SADavgTest, UnalignedRef) { 394 // The reference frame, but not the source frame, may be unaligned for 395 // certain types of searches. 396 const int tmp_stride = reference_stride_; 397 reference_stride_ -= 1; 398 FillRandom(source_data_, source_stride_); 399 FillRandom(reference_data_, reference_stride_); 400 FillRandom(second_pred_, width_); 401 CheckSAD(); 402 reference_stride_ = tmp_stride; 403 } 404 405 TEST_P(SADavgTest, ShortSrc) { 406 const int tmp_stride = source_stride_; 407 source_stride_ >>= 1; 408 FillRandom(source_data_, source_stride_); 409 FillRandom(reference_data_, reference_stride_); 410 FillRandom(second_pred_, width_); 411 CheckSAD(); 412 source_stride_ = tmp_stride; 413 } 414 415 TEST_P(SADx4Test, MaxRef) { 416 FillConstant(source_data_, source_stride_, 0); 417 FillConstant(GetReference(0), reference_stride_, mask_); 418 FillConstant(GetReference(1), reference_stride_, mask_); 419 FillConstant(GetReference(2), reference_stride_, mask_); 420 FillConstant(GetReference(3), reference_stride_, mask_); 421 CheckSADs(); 422 } 423 424 TEST_P(SADx4Test, MaxSrc) { 425 FillConstant(source_data_, source_stride_, mask_); 426 FillConstant(GetReference(0), reference_stride_, 0); 427 FillConstant(GetReference(1), reference_stride_, 0); 428 FillConstant(GetReference(2), reference_stride_, 0); 429 FillConstant(GetReference(3), reference_stride_, 0); 430 CheckSADs(); 431 } 432 433 TEST_P(SADx4Test, ShortRef) { 434 int tmp_stride = reference_stride_; 435 reference_stride_ >>= 1; 436 FillRandom(source_data_, source_stride_); 437 FillRandom(GetReference(0), reference_stride_); 438 FillRandom(GetReference(1), reference_stride_); 439 FillRandom(GetReference(2), reference_stride_); 440 FillRandom(GetReference(3), reference_stride_); 441 CheckSADs(); 442 reference_stride_ = tmp_stride; 443 } 444 445 TEST_P(SADx4Test, UnalignedRef) { 446 // The reference frame, but not the source frame, may be unaligned for 447 // certain types of searches. 448 int tmp_stride = reference_stride_; 449 reference_stride_ -= 1; 450 FillRandom(source_data_, source_stride_); 451 FillRandom(GetReference(0), reference_stride_); 452 FillRandom(GetReference(1), reference_stride_); 453 FillRandom(GetReference(2), reference_stride_); 454 FillRandom(GetReference(3), reference_stride_); 455 CheckSADs(); 456 reference_stride_ = tmp_stride; 457 } 458 459 TEST_P(SADx4Test, ShortSrc) { 460 int tmp_stride = source_stride_; 461 source_stride_ >>= 1; 462 FillRandom(source_data_, source_stride_); 463 FillRandom(GetReference(0), reference_stride_); 464 FillRandom(GetReference(1), reference_stride_); 465 FillRandom(GetReference(2), reference_stride_); 466 FillRandom(GetReference(3), reference_stride_); 467 CheckSADs(); 468 source_stride_ = tmp_stride; 469 } 470 471 TEST_P(SADx4Test, SrcAlignedByWidth) { 472 uint8_t * tmp_source_data = source_data_; 473 source_data_ += width_; 474 FillRandom(source_data_, source_stride_); 475 FillRandom(GetReference(0), reference_stride_); 476 FillRandom(GetReference(1), reference_stride_); 477 FillRandom(GetReference(2), reference_stride_); 478 FillRandom(GetReference(3), reference_stride_); 479 CheckSADs(); 480 source_data_ = tmp_source_data; 481 } 482 483 using std::tr1::make_tuple; 484 485 //------------------------------------------------------------------------------ 486 // C functions 487 const SadMxNFunc sad64x64_c = vpx_sad64x64_c; 488 const SadMxNFunc sad64x32_c = vpx_sad64x32_c; 489 const SadMxNFunc sad32x64_c = vpx_sad32x64_c; 490 const SadMxNFunc sad32x32_c = vpx_sad32x32_c; 491 const SadMxNFunc sad32x16_c = vpx_sad32x16_c; 492 const SadMxNFunc sad16x32_c = vpx_sad16x32_c; 493 const SadMxNFunc sad16x16_c = vpx_sad16x16_c; 494 const SadMxNFunc sad16x8_c = vpx_sad16x8_c; 495 const SadMxNFunc sad8x16_c = vpx_sad8x16_c; 496 const SadMxNFunc sad8x8_c = vpx_sad8x8_c; 497 const SadMxNFunc sad8x4_c = vpx_sad8x4_c; 498 const SadMxNFunc sad4x8_c = vpx_sad4x8_c; 499 const SadMxNFunc sad4x4_c = vpx_sad4x4_c; 500 #if CONFIG_VP9_HIGHBITDEPTH 501 const SadMxNFunc highbd_sad64x64_c = vpx_highbd_sad64x64_c; 502 const SadMxNFunc highbd_sad64x32_c = vpx_highbd_sad64x32_c; 503 const SadMxNFunc highbd_sad32x64_c = vpx_highbd_sad32x64_c; 504 const SadMxNFunc highbd_sad32x32_c = vpx_highbd_sad32x32_c; 505 const SadMxNFunc highbd_sad32x16_c = vpx_highbd_sad32x16_c; 506 const SadMxNFunc highbd_sad16x32_c = vpx_highbd_sad16x32_c; 507 const SadMxNFunc highbd_sad16x16_c = vpx_highbd_sad16x16_c; 508 const SadMxNFunc highbd_sad16x8_c = vpx_highbd_sad16x8_c; 509 const SadMxNFunc highbd_sad8x16_c = vpx_highbd_sad8x16_c; 510 const SadMxNFunc highbd_sad8x8_c = vpx_highbd_sad8x8_c; 511 const SadMxNFunc highbd_sad8x4_c = vpx_highbd_sad8x4_c; 512 const SadMxNFunc highbd_sad4x8_c = vpx_highbd_sad4x8_c; 513 const SadMxNFunc highbd_sad4x4_c = vpx_highbd_sad4x4_c; 514 #endif // CONFIG_VP9_HIGHBITDEPTH 515 const SadMxNParam c_tests[] = { 516 make_tuple(64, 64, sad64x64_c, -1), 517 make_tuple(64, 32, sad64x32_c, -1), 518 make_tuple(32, 64, sad32x64_c, -1), 519 make_tuple(32, 32, sad32x32_c, -1), 520 make_tuple(32, 16, sad32x16_c, -1), 521 make_tuple(16, 32, sad16x32_c, -1), 522 make_tuple(16, 16, sad16x16_c, -1), 523 make_tuple(16, 8, sad16x8_c, -1), 524 make_tuple(8, 16, sad8x16_c, -1), 525 make_tuple(8, 8, sad8x8_c, -1), 526 make_tuple(8, 4, sad8x4_c, -1), 527 make_tuple(4, 8, sad4x8_c, -1), 528 make_tuple(4, 4, sad4x4_c, -1), 529 #if CONFIG_VP9_HIGHBITDEPTH 530 make_tuple(64, 64, highbd_sad64x64_c, 8), 531 make_tuple(64, 32, highbd_sad64x32_c, 8), 532 make_tuple(32, 64, highbd_sad32x64_c, 8), 533 make_tuple(32, 32, highbd_sad32x32_c, 8), 534 make_tuple(32, 16, highbd_sad32x16_c, 8), 535 make_tuple(16, 32, highbd_sad16x32_c, 8), 536 make_tuple(16, 16, highbd_sad16x16_c, 8), 537 make_tuple(16, 8, highbd_sad16x8_c, 8), 538 make_tuple(8, 16, highbd_sad8x16_c, 8), 539 make_tuple(8, 8, highbd_sad8x8_c, 8), 540 make_tuple(8, 4, highbd_sad8x4_c, 8), 541 make_tuple(4, 8, highbd_sad4x8_c, 8), 542 make_tuple(4, 4, highbd_sad4x4_c, 8), 543 make_tuple(64, 64, highbd_sad64x64_c, 10), 544 make_tuple(64, 32, highbd_sad64x32_c, 10), 545 make_tuple(32, 64, highbd_sad32x64_c, 10), 546 make_tuple(32, 32, highbd_sad32x32_c, 10), 547 make_tuple(32, 16, highbd_sad32x16_c, 10), 548 make_tuple(16, 32, highbd_sad16x32_c, 10), 549 make_tuple(16, 16, highbd_sad16x16_c, 10), 550 make_tuple(16, 8, highbd_sad16x8_c, 10), 551 make_tuple(8, 16, highbd_sad8x16_c, 10), 552 make_tuple(8, 8, highbd_sad8x8_c, 10), 553 make_tuple(8, 4, highbd_sad8x4_c, 10), 554 make_tuple(4, 8, highbd_sad4x8_c, 10), 555 make_tuple(4, 4, highbd_sad4x4_c, 10), 556 make_tuple(64, 64, highbd_sad64x64_c, 12), 557 make_tuple(64, 32, highbd_sad64x32_c, 12), 558 make_tuple(32, 64, highbd_sad32x64_c, 12), 559 make_tuple(32, 32, highbd_sad32x32_c, 12), 560 make_tuple(32, 16, highbd_sad32x16_c, 12), 561 make_tuple(16, 32, highbd_sad16x32_c, 12), 562 make_tuple(16, 16, highbd_sad16x16_c, 12), 563 make_tuple(16, 8, highbd_sad16x8_c, 12), 564 make_tuple(8, 16, highbd_sad8x16_c, 12), 565 make_tuple(8, 8, highbd_sad8x8_c, 12), 566 make_tuple(8, 4, highbd_sad8x4_c, 12), 567 make_tuple(4, 8, highbd_sad4x8_c, 12), 568 make_tuple(4, 4, highbd_sad4x4_c, 12), 569 #endif // CONFIG_VP9_HIGHBITDEPTH 570 }; 571 INSTANTIATE_TEST_CASE_P(C, SADTest, ::testing::ValuesIn(c_tests)); 572 573 const SadMxNAvgFunc sad64x64_avg_c = vpx_sad64x64_avg_c; 574 const SadMxNAvgFunc sad64x32_avg_c = vpx_sad64x32_avg_c; 575 const SadMxNAvgFunc sad32x64_avg_c = vpx_sad32x64_avg_c; 576 const SadMxNAvgFunc sad32x32_avg_c = vpx_sad32x32_avg_c; 577 const SadMxNAvgFunc sad32x16_avg_c = vpx_sad32x16_avg_c; 578 const SadMxNAvgFunc sad16x32_avg_c = vpx_sad16x32_avg_c; 579 const SadMxNAvgFunc sad16x16_avg_c = vpx_sad16x16_avg_c; 580 const SadMxNAvgFunc sad16x8_avg_c = vpx_sad16x8_avg_c; 581 const SadMxNAvgFunc sad8x16_avg_c = vpx_sad8x16_avg_c; 582 const SadMxNAvgFunc sad8x8_avg_c = vpx_sad8x8_avg_c; 583 const SadMxNAvgFunc sad8x4_avg_c = vpx_sad8x4_avg_c; 584 const SadMxNAvgFunc sad4x8_avg_c = vpx_sad4x8_avg_c; 585 const SadMxNAvgFunc sad4x4_avg_c = vpx_sad4x4_avg_c; 586 #if CONFIG_VP9_HIGHBITDEPTH 587 const SadMxNAvgFunc highbd_sad64x64_avg_c = vpx_highbd_sad64x64_avg_c; 588 const SadMxNAvgFunc highbd_sad64x32_avg_c = vpx_highbd_sad64x32_avg_c; 589 const SadMxNAvgFunc highbd_sad32x64_avg_c = vpx_highbd_sad32x64_avg_c; 590 const SadMxNAvgFunc highbd_sad32x32_avg_c = vpx_highbd_sad32x32_avg_c; 591 const SadMxNAvgFunc highbd_sad32x16_avg_c = vpx_highbd_sad32x16_avg_c; 592 const SadMxNAvgFunc highbd_sad16x32_avg_c = vpx_highbd_sad16x32_avg_c; 593 const SadMxNAvgFunc highbd_sad16x16_avg_c = vpx_highbd_sad16x16_avg_c; 594 const SadMxNAvgFunc highbd_sad16x8_avg_c = vpx_highbd_sad16x8_avg_c; 595 const SadMxNAvgFunc highbd_sad8x16_avg_c = vpx_highbd_sad8x16_avg_c; 596 const SadMxNAvgFunc highbd_sad8x8_avg_c = vpx_highbd_sad8x8_avg_c; 597 const SadMxNAvgFunc highbd_sad8x4_avg_c = vpx_highbd_sad8x4_avg_c; 598 const SadMxNAvgFunc highbd_sad4x8_avg_c = vpx_highbd_sad4x8_avg_c; 599 const SadMxNAvgFunc highbd_sad4x4_avg_c = vpx_highbd_sad4x4_avg_c; 600 #endif // CONFIG_VP9_HIGHBITDEPTH 601 const SadMxNAvgParam avg_c_tests[] = { 602 make_tuple(64, 64, sad64x64_avg_c, -1), 603 make_tuple(64, 32, sad64x32_avg_c, -1), 604 make_tuple(32, 64, sad32x64_avg_c, -1), 605 make_tuple(32, 32, sad32x32_avg_c, -1), 606 make_tuple(32, 16, sad32x16_avg_c, -1), 607 make_tuple(16, 32, sad16x32_avg_c, -1), 608 make_tuple(16, 16, sad16x16_avg_c, -1), 609 make_tuple(16, 8, sad16x8_avg_c, -1), 610 make_tuple(8, 16, sad8x16_avg_c, -1), 611 make_tuple(8, 8, sad8x8_avg_c, -1), 612 make_tuple(8, 4, sad8x4_avg_c, -1), 613 make_tuple(4, 8, sad4x8_avg_c, -1), 614 make_tuple(4, 4, sad4x4_avg_c, -1), 615 #if CONFIG_VP9_HIGHBITDEPTH 616 make_tuple(64, 64, highbd_sad64x64_avg_c, 8), 617 make_tuple(64, 32, highbd_sad64x32_avg_c, 8), 618 make_tuple(32, 64, highbd_sad32x64_avg_c, 8), 619 make_tuple(32, 32, highbd_sad32x32_avg_c, 8), 620 make_tuple(32, 16, highbd_sad32x16_avg_c, 8), 621 make_tuple(16, 32, highbd_sad16x32_avg_c, 8), 622 make_tuple(16, 16, highbd_sad16x16_avg_c, 8), 623 make_tuple(16, 8, highbd_sad16x8_avg_c, 8), 624 make_tuple(8, 16, highbd_sad8x16_avg_c, 8), 625 make_tuple(8, 8, highbd_sad8x8_avg_c, 8), 626 make_tuple(8, 4, highbd_sad8x4_avg_c, 8), 627 make_tuple(4, 8, highbd_sad4x8_avg_c, 8), 628 make_tuple(4, 4, highbd_sad4x4_avg_c, 8), 629 make_tuple(64, 64, highbd_sad64x64_avg_c, 10), 630 make_tuple(64, 32, highbd_sad64x32_avg_c, 10), 631 make_tuple(32, 64, highbd_sad32x64_avg_c, 10), 632 make_tuple(32, 32, highbd_sad32x32_avg_c, 10), 633 make_tuple(32, 16, highbd_sad32x16_avg_c, 10), 634 make_tuple(16, 32, highbd_sad16x32_avg_c, 10), 635 make_tuple(16, 16, highbd_sad16x16_avg_c, 10), 636 make_tuple(16, 8, highbd_sad16x8_avg_c, 10), 637 make_tuple(8, 16, highbd_sad8x16_avg_c, 10), 638 make_tuple(8, 8, highbd_sad8x8_avg_c, 10), 639 make_tuple(8, 4, highbd_sad8x4_avg_c, 10), 640 make_tuple(4, 8, highbd_sad4x8_avg_c, 10), 641 make_tuple(4, 4, highbd_sad4x4_avg_c, 10), 642 make_tuple(64, 64, highbd_sad64x64_avg_c, 12), 643 make_tuple(64, 32, highbd_sad64x32_avg_c, 12), 644 make_tuple(32, 64, highbd_sad32x64_avg_c, 12), 645 make_tuple(32, 32, highbd_sad32x32_avg_c, 12), 646 make_tuple(32, 16, highbd_sad32x16_avg_c, 12), 647 make_tuple(16, 32, highbd_sad16x32_avg_c, 12), 648 make_tuple(16, 16, highbd_sad16x16_avg_c, 12), 649 make_tuple(16, 8, highbd_sad16x8_avg_c, 12), 650 make_tuple(8, 16, highbd_sad8x16_avg_c, 12), 651 make_tuple(8, 8, highbd_sad8x8_avg_c, 12), 652 make_tuple(8, 4, highbd_sad8x4_avg_c, 12), 653 make_tuple(4, 8, highbd_sad4x8_avg_c, 12), 654 make_tuple(4, 4, highbd_sad4x4_avg_c, 12), 655 #endif // CONFIG_VP9_HIGHBITDEPTH 656 }; 657 INSTANTIATE_TEST_CASE_P(C, SADavgTest, ::testing::ValuesIn(avg_c_tests)); 658 659 const SadMxNx4Func sad64x64x4d_c = vpx_sad64x64x4d_c; 660 const SadMxNx4Func sad64x32x4d_c = vpx_sad64x32x4d_c; 661 const SadMxNx4Func sad32x64x4d_c = vpx_sad32x64x4d_c; 662 const SadMxNx4Func sad32x32x4d_c = vpx_sad32x32x4d_c; 663 const SadMxNx4Func sad32x16x4d_c = vpx_sad32x16x4d_c; 664 const SadMxNx4Func sad16x32x4d_c = vpx_sad16x32x4d_c; 665 const SadMxNx4Func sad16x16x4d_c = vpx_sad16x16x4d_c; 666 const SadMxNx4Func sad16x8x4d_c = vpx_sad16x8x4d_c; 667 const SadMxNx4Func sad8x16x4d_c = vpx_sad8x16x4d_c; 668 const SadMxNx4Func sad8x8x4d_c = vpx_sad8x8x4d_c; 669 const SadMxNx4Func sad8x4x4d_c = vpx_sad8x4x4d_c; 670 const SadMxNx4Func sad4x8x4d_c = vpx_sad4x8x4d_c; 671 const SadMxNx4Func sad4x4x4d_c = vpx_sad4x4x4d_c; 672 #if CONFIG_VP9_HIGHBITDEPTH 673 const SadMxNx4Func highbd_sad64x64x4d_c = vpx_highbd_sad64x64x4d_c; 674 const SadMxNx4Func highbd_sad64x32x4d_c = vpx_highbd_sad64x32x4d_c; 675 const SadMxNx4Func highbd_sad32x64x4d_c = vpx_highbd_sad32x64x4d_c; 676 const SadMxNx4Func highbd_sad32x32x4d_c = vpx_highbd_sad32x32x4d_c; 677 const SadMxNx4Func highbd_sad32x16x4d_c = vpx_highbd_sad32x16x4d_c; 678 const SadMxNx4Func highbd_sad16x32x4d_c = vpx_highbd_sad16x32x4d_c; 679 const SadMxNx4Func highbd_sad16x16x4d_c = vpx_highbd_sad16x16x4d_c; 680 const SadMxNx4Func highbd_sad16x8x4d_c = vpx_highbd_sad16x8x4d_c; 681 const SadMxNx4Func highbd_sad8x16x4d_c = vpx_highbd_sad8x16x4d_c; 682 const SadMxNx4Func highbd_sad8x8x4d_c = vpx_highbd_sad8x8x4d_c; 683 const SadMxNx4Func highbd_sad8x4x4d_c = vpx_highbd_sad8x4x4d_c; 684 const SadMxNx4Func highbd_sad4x8x4d_c = vpx_highbd_sad4x8x4d_c; 685 const SadMxNx4Func highbd_sad4x4x4d_c = vpx_highbd_sad4x4x4d_c; 686 #endif // CONFIG_VP9_HIGHBITDEPTH 687 const SadMxNx4Param x4d_c_tests[] = { 688 make_tuple(64, 64, sad64x64x4d_c, -1), 689 make_tuple(64, 32, sad64x32x4d_c, -1), 690 make_tuple(32, 64, sad32x64x4d_c, -1), 691 make_tuple(32, 32, sad32x32x4d_c, -1), 692 make_tuple(32, 16, sad32x16x4d_c, -1), 693 make_tuple(16, 32, sad16x32x4d_c, -1), 694 make_tuple(16, 16, sad16x16x4d_c, -1), 695 make_tuple(16, 8, sad16x8x4d_c, -1), 696 make_tuple(8, 16, sad8x16x4d_c, -1), 697 make_tuple(8, 8, sad8x8x4d_c, -1), 698 make_tuple(8, 4, sad8x4x4d_c, -1), 699 make_tuple(4, 8, sad4x8x4d_c, -1), 700 make_tuple(4, 4, sad4x4x4d_c, -1), 701 #if CONFIG_VP9_HIGHBITDEPTH 702 make_tuple(64, 64, highbd_sad64x64x4d_c, 8), 703 make_tuple(64, 32, highbd_sad64x32x4d_c, 8), 704 make_tuple(32, 64, highbd_sad32x64x4d_c, 8), 705 make_tuple(32, 32, highbd_sad32x32x4d_c, 8), 706 make_tuple(32, 16, highbd_sad32x16x4d_c, 8), 707 make_tuple(16, 32, highbd_sad16x32x4d_c, 8), 708 make_tuple(16, 16, highbd_sad16x16x4d_c, 8), 709 make_tuple(16, 8, highbd_sad16x8x4d_c, 8), 710 make_tuple(8, 16, highbd_sad8x16x4d_c, 8), 711 make_tuple(8, 8, highbd_sad8x8x4d_c, 8), 712 make_tuple(8, 4, highbd_sad8x4x4d_c, 8), 713 make_tuple(4, 8, highbd_sad4x8x4d_c, 8), 714 make_tuple(4, 4, highbd_sad4x4x4d_c, 8), 715 make_tuple(64, 64, highbd_sad64x64x4d_c, 10), 716 make_tuple(64, 32, highbd_sad64x32x4d_c, 10), 717 make_tuple(32, 64, highbd_sad32x64x4d_c, 10), 718 make_tuple(32, 32, highbd_sad32x32x4d_c, 10), 719 make_tuple(32, 16, highbd_sad32x16x4d_c, 10), 720 make_tuple(16, 32, highbd_sad16x32x4d_c, 10), 721 make_tuple(16, 16, highbd_sad16x16x4d_c, 10), 722 make_tuple(16, 8, highbd_sad16x8x4d_c, 10), 723 make_tuple(8, 16, highbd_sad8x16x4d_c, 10), 724 make_tuple(8, 8, highbd_sad8x8x4d_c, 10), 725 make_tuple(8, 4, highbd_sad8x4x4d_c, 10), 726 make_tuple(4, 8, highbd_sad4x8x4d_c, 10), 727 make_tuple(4, 4, highbd_sad4x4x4d_c, 10), 728 make_tuple(64, 64, highbd_sad64x64x4d_c, 12), 729 make_tuple(64, 32, highbd_sad64x32x4d_c, 12), 730 make_tuple(32, 64, highbd_sad32x64x4d_c, 12), 731 make_tuple(32, 32, highbd_sad32x32x4d_c, 12), 732 make_tuple(32, 16, highbd_sad32x16x4d_c, 12), 733 make_tuple(16, 32, highbd_sad16x32x4d_c, 12), 734 make_tuple(16, 16, highbd_sad16x16x4d_c, 12), 735 make_tuple(16, 8, highbd_sad16x8x4d_c, 12), 736 make_tuple(8, 16, highbd_sad8x16x4d_c, 12), 737 make_tuple(8, 8, highbd_sad8x8x4d_c, 12), 738 make_tuple(8, 4, highbd_sad8x4x4d_c, 12), 739 make_tuple(4, 8, highbd_sad4x8x4d_c, 12), 740 make_tuple(4, 4, highbd_sad4x4x4d_c, 12), 741 #endif // CONFIG_VP9_HIGHBITDEPTH 742 }; 743 INSTANTIATE_TEST_CASE_P(C, SADx4Test, ::testing::ValuesIn(x4d_c_tests)); 744 745 //------------------------------------------------------------------------------ 746 // ARM functions 747 #if HAVE_MEDIA 748 const SadMxNFunc sad16x16_media = vpx_sad16x16_media; 749 const SadMxNParam media_tests[] = { 750 make_tuple(16, 16, sad16x16_media, -1), 751 }; 752 INSTANTIATE_TEST_CASE_P(MEDIA, SADTest, ::testing::ValuesIn(media_tests)); 753 #endif // HAVE_MEDIA 754 755 #if HAVE_NEON 756 const SadMxNFunc sad64x64_neon = vpx_sad64x64_neon; 757 const SadMxNFunc sad32x32_neon = vpx_sad32x32_neon; 758 const SadMxNFunc sad16x16_neon = vpx_sad16x16_neon; 759 const SadMxNFunc sad16x8_neon = vpx_sad16x8_neon; 760 const SadMxNFunc sad8x16_neon = vpx_sad8x16_neon; 761 const SadMxNFunc sad8x8_neon = vpx_sad8x8_neon; 762 const SadMxNFunc sad4x4_neon = vpx_sad4x4_neon; 763 764 const SadMxNParam neon_tests[] = { 765 make_tuple(64, 64, sad64x64_neon, -1), 766 make_tuple(32, 32, sad32x32_neon, -1), 767 make_tuple(16, 16, sad16x16_neon, -1), 768 make_tuple(16, 8, sad16x8_neon, -1), 769 make_tuple(8, 16, sad8x16_neon, -1), 770 make_tuple(8, 8, sad8x8_neon, -1), 771 make_tuple(4, 4, sad4x4_neon, -1), 772 }; 773 INSTANTIATE_TEST_CASE_P(NEON, SADTest, ::testing::ValuesIn(neon_tests)); 774 775 const SadMxNx4Func sad64x64x4d_neon = vpx_sad64x64x4d_neon; 776 const SadMxNx4Func sad32x32x4d_neon = vpx_sad32x32x4d_neon; 777 const SadMxNx4Func sad16x16x4d_neon = vpx_sad16x16x4d_neon; 778 const SadMxNx4Param x4d_neon_tests[] = { 779 make_tuple(64, 64, sad64x64x4d_neon, -1), 780 make_tuple(32, 32, sad32x32x4d_neon, -1), 781 make_tuple(16, 16, sad16x16x4d_neon, -1), 782 }; 783 INSTANTIATE_TEST_CASE_P(NEON, SADx4Test, ::testing::ValuesIn(x4d_neon_tests)); 784 #endif // HAVE_NEON 785 786 //------------------------------------------------------------------------------ 787 // x86 functions 788 #if HAVE_MMX 789 const SadMxNFunc sad16x16_mmx = vpx_sad16x16_mmx; 790 const SadMxNFunc sad16x8_mmx = vpx_sad16x8_mmx; 791 const SadMxNFunc sad8x16_mmx = vpx_sad8x16_mmx; 792 const SadMxNFunc sad8x8_mmx = vpx_sad8x8_mmx; 793 const SadMxNFunc sad4x4_mmx = vpx_sad4x4_mmx; 794 const SadMxNParam mmx_tests[] = { 795 make_tuple(16, 16, sad16x16_mmx, -1), 796 make_tuple(16, 8, sad16x8_mmx, -1), 797 make_tuple(8, 16, sad8x16_mmx, -1), 798 make_tuple(8, 8, sad8x8_mmx, -1), 799 make_tuple(4, 4, sad4x4_mmx, -1), 800 }; 801 INSTANTIATE_TEST_CASE_P(MMX, SADTest, ::testing::ValuesIn(mmx_tests)); 802 #endif // HAVE_MMX 803 804 #if HAVE_SSE 805 #if CONFIG_USE_X86INC 806 const SadMxNFunc sad4x8_sse = vpx_sad4x8_sse; 807 const SadMxNFunc sad4x4_sse = vpx_sad4x4_sse; 808 const SadMxNParam sse_tests[] = { 809 make_tuple(4, 8, sad4x8_sse, -1), 810 make_tuple(4, 4, sad4x4_sse, -1), 811 }; 812 INSTANTIATE_TEST_CASE_P(SSE, SADTest, ::testing::ValuesIn(sse_tests)); 813 814 const SadMxNAvgFunc sad4x8_avg_sse = vpx_sad4x8_avg_sse; 815 const SadMxNAvgFunc sad4x4_avg_sse = vpx_sad4x4_avg_sse; 816 const SadMxNAvgParam avg_sse_tests[] = { 817 make_tuple(4, 8, sad4x8_avg_sse, -1), 818 make_tuple(4, 4, sad4x4_avg_sse, -1), 819 }; 820 INSTANTIATE_TEST_CASE_P(SSE, SADavgTest, ::testing::ValuesIn(avg_sse_tests)); 821 822 const SadMxNx4Func sad4x8x4d_sse = vpx_sad4x8x4d_sse; 823 const SadMxNx4Func sad4x4x4d_sse = vpx_sad4x4x4d_sse; 824 const SadMxNx4Param x4d_sse_tests[] = { 825 make_tuple(4, 8, sad4x8x4d_sse, -1), 826 make_tuple(4, 4, sad4x4x4d_sse, -1), 827 }; 828 INSTANTIATE_TEST_CASE_P(SSE, SADx4Test, ::testing::ValuesIn(x4d_sse_tests)); 829 #endif // CONFIG_USE_X86INC 830 #endif // HAVE_SSE 831 832 #if HAVE_SSE2 833 #if CONFIG_USE_X86INC 834 const SadMxNFunc sad64x64_sse2 = vpx_sad64x64_sse2; 835 const SadMxNFunc sad64x32_sse2 = vpx_sad64x32_sse2; 836 const SadMxNFunc sad32x64_sse2 = vpx_sad32x64_sse2; 837 const SadMxNFunc sad32x32_sse2 = vpx_sad32x32_sse2; 838 const SadMxNFunc sad32x16_sse2 = vpx_sad32x16_sse2; 839 const SadMxNFunc sad16x32_sse2 = vpx_sad16x32_sse2; 840 const SadMxNFunc sad16x16_sse2 = vpx_sad16x16_sse2; 841 const SadMxNFunc sad16x8_sse2 = vpx_sad16x8_sse2; 842 const SadMxNFunc sad8x16_sse2 = vpx_sad8x16_sse2; 843 const SadMxNFunc sad8x8_sse2 = vpx_sad8x8_sse2; 844 const SadMxNFunc sad8x4_sse2 = vpx_sad8x4_sse2; 845 #if CONFIG_VP9_HIGHBITDEPTH 846 const SadMxNFunc highbd_sad64x64_sse2 = vpx_highbd_sad64x64_sse2; 847 const SadMxNFunc highbd_sad64x32_sse2 = vpx_highbd_sad64x32_sse2; 848 const SadMxNFunc highbd_sad32x64_sse2 = vpx_highbd_sad32x64_sse2; 849 const SadMxNFunc highbd_sad32x32_sse2 = vpx_highbd_sad32x32_sse2; 850 const SadMxNFunc highbd_sad32x16_sse2 = vpx_highbd_sad32x16_sse2; 851 const SadMxNFunc highbd_sad16x32_sse2 = vpx_highbd_sad16x32_sse2; 852 const SadMxNFunc highbd_sad16x16_sse2 = vpx_highbd_sad16x16_sse2; 853 const SadMxNFunc highbd_sad16x8_sse2 = vpx_highbd_sad16x8_sse2; 854 const SadMxNFunc highbd_sad8x16_sse2 = vpx_highbd_sad8x16_sse2; 855 const SadMxNFunc highbd_sad8x8_sse2 = vpx_highbd_sad8x8_sse2; 856 const SadMxNFunc highbd_sad8x4_sse2 = vpx_highbd_sad8x4_sse2; 857 #endif // CONFIG_VP9_HIGHBITDEPTH 858 const SadMxNParam sse2_tests[] = { 859 make_tuple(64, 64, sad64x64_sse2, -1), 860 make_tuple(64, 32, sad64x32_sse2, -1), 861 make_tuple(32, 64, sad32x64_sse2, -1), 862 make_tuple(32, 32, sad32x32_sse2, -1), 863 make_tuple(32, 16, sad32x16_sse2, -1), 864 make_tuple(16, 32, sad16x32_sse2, -1), 865 make_tuple(16, 16, sad16x16_sse2, -1), 866 make_tuple(16, 8, sad16x8_sse2, -1), 867 make_tuple(8, 16, sad8x16_sse2, -1), 868 make_tuple(8, 8, sad8x8_sse2, -1), 869 make_tuple(8, 4, sad8x4_sse2, -1), 870 #if CONFIG_VP9_HIGHBITDEPTH 871 make_tuple(64, 64, highbd_sad64x64_sse2, 8), 872 make_tuple(64, 32, highbd_sad64x32_sse2, 8), 873 make_tuple(32, 64, highbd_sad32x64_sse2, 8), 874 make_tuple(32, 32, highbd_sad32x32_sse2, 8), 875 make_tuple(32, 16, highbd_sad32x16_sse2, 8), 876 make_tuple(16, 32, highbd_sad16x32_sse2, 8), 877 make_tuple(16, 16, highbd_sad16x16_sse2, 8), 878 make_tuple(16, 8, highbd_sad16x8_sse2, 8), 879 make_tuple(8, 16, highbd_sad8x16_sse2, 8), 880 make_tuple(8, 8, highbd_sad8x8_sse2, 8), 881 make_tuple(8, 4, highbd_sad8x4_sse2, 8), 882 make_tuple(64, 64, highbd_sad64x64_sse2, 10), 883 make_tuple(64, 32, highbd_sad64x32_sse2, 10), 884 make_tuple(32, 64, highbd_sad32x64_sse2, 10), 885 make_tuple(32, 32, highbd_sad32x32_sse2, 10), 886 make_tuple(32, 16, highbd_sad32x16_sse2, 10), 887 make_tuple(16, 32, highbd_sad16x32_sse2, 10), 888 make_tuple(16, 16, highbd_sad16x16_sse2, 10), 889 make_tuple(16, 8, highbd_sad16x8_sse2, 10), 890 make_tuple(8, 16, highbd_sad8x16_sse2, 10), 891 make_tuple(8, 8, highbd_sad8x8_sse2, 10), 892 make_tuple(8, 4, highbd_sad8x4_sse2, 10), 893 make_tuple(64, 64, highbd_sad64x64_sse2, 12), 894 make_tuple(64, 32, highbd_sad64x32_sse2, 12), 895 make_tuple(32, 64, highbd_sad32x64_sse2, 12), 896 make_tuple(32, 32, highbd_sad32x32_sse2, 12), 897 make_tuple(32, 16, highbd_sad32x16_sse2, 12), 898 make_tuple(16, 32, highbd_sad16x32_sse2, 12), 899 make_tuple(16, 16, highbd_sad16x16_sse2, 12), 900 make_tuple(16, 8, highbd_sad16x8_sse2, 12), 901 make_tuple(8, 16, highbd_sad8x16_sse2, 12), 902 make_tuple(8, 8, highbd_sad8x8_sse2, 12), 903 make_tuple(8, 4, highbd_sad8x4_sse2, 12), 904 #endif // CONFIG_VP9_HIGHBITDEPTH 905 }; 906 INSTANTIATE_TEST_CASE_P(SSE2, SADTest, ::testing::ValuesIn(sse2_tests)); 907 908 const SadMxNAvgFunc sad64x64_avg_sse2 = vpx_sad64x64_avg_sse2; 909 const SadMxNAvgFunc sad64x32_avg_sse2 = vpx_sad64x32_avg_sse2; 910 const SadMxNAvgFunc sad32x64_avg_sse2 = vpx_sad32x64_avg_sse2; 911 const SadMxNAvgFunc sad32x32_avg_sse2 = vpx_sad32x32_avg_sse2; 912 const SadMxNAvgFunc sad32x16_avg_sse2 = vpx_sad32x16_avg_sse2; 913 const SadMxNAvgFunc sad16x32_avg_sse2 = vpx_sad16x32_avg_sse2; 914 const SadMxNAvgFunc sad16x16_avg_sse2 = vpx_sad16x16_avg_sse2; 915 const SadMxNAvgFunc sad16x8_avg_sse2 = vpx_sad16x8_avg_sse2; 916 const SadMxNAvgFunc sad8x16_avg_sse2 = vpx_sad8x16_avg_sse2; 917 const SadMxNAvgFunc sad8x8_avg_sse2 = vpx_sad8x8_avg_sse2; 918 const SadMxNAvgFunc sad8x4_avg_sse2 = vpx_sad8x4_avg_sse2; 919 #if CONFIG_VP9_HIGHBITDEPTH 920 const SadMxNAvgFunc highbd_sad64x64_avg_sse2 = vpx_highbd_sad64x64_avg_sse2; 921 const SadMxNAvgFunc highbd_sad64x32_avg_sse2 = vpx_highbd_sad64x32_avg_sse2; 922 const SadMxNAvgFunc highbd_sad32x64_avg_sse2 = vpx_highbd_sad32x64_avg_sse2; 923 const SadMxNAvgFunc highbd_sad32x32_avg_sse2 = vpx_highbd_sad32x32_avg_sse2; 924 const SadMxNAvgFunc highbd_sad32x16_avg_sse2 = vpx_highbd_sad32x16_avg_sse2; 925 const SadMxNAvgFunc highbd_sad16x32_avg_sse2 = vpx_highbd_sad16x32_avg_sse2; 926 const SadMxNAvgFunc highbd_sad16x16_avg_sse2 = vpx_highbd_sad16x16_avg_sse2; 927 const SadMxNAvgFunc highbd_sad16x8_avg_sse2 = vpx_highbd_sad16x8_avg_sse2; 928 const SadMxNAvgFunc highbd_sad8x16_avg_sse2 = vpx_highbd_sad8x16_avg_sse2; 929 const SadMxNAvgFunc highbd_sad8x8_avg_sse2 = vpx_highbd_sad8x8_avg_sse2; 930 const SadMxNAvgFunc highbd_sad8x4_avg_sse2 = vpx_highbd_sad8x4_avg_sse2; 931 #endif // CONFIG_VP9_HIGHBITDEPTH 932 const SadMxNAvgParam avg_sse2_tests[] = { 933 make_tuple(64, 64, sad64x64_avg_sse2, -1), 934 make_tuple(64, 32, sad64x32_avg_sse2, -1), 935 make_tuple(32, 64, sad32x64_avg_sse2, -1), 936 make_tuple(32, 32, sad32x32_avg_sse2, -1), 937 make_tuple(32, 16, sad32x16_avg_sse2, -1), 938 make_tuple(16, 32, sad16x32_avg_sse2, -1), 939 make_tuple(16, 16, sad16x16_avg_sse2, -1), 940 make_tuple(16, 8, sad16x8_avg_sse2, -1), 941 make_tuple(8, 16, sad8x16_avg_sse2, -1), 942 make_tuple(8, 8, sad8x8_avg_sse2, -1), 943 make_tuple(8, 4, sad8x4_avg_sse2, -1), 944 #if CONFIG_VP9_HIGHBITDEPTH 945 make_tuple(64, 64, highbd_sad64x64_avg_sse2, 8), 946 make_tuple(64, 32, highbd_sad64x32_avg_sse2, 8), 947 make_tuple(32, 64, highbd_sad32x64_avg_sse2, 8), 948 make_tuple(32, 32, highbd_sad32x32_avg_sse2, 8), 949 make_tuple(32, 16, highbd_sad32x16_avg_sse2, 8), 950 make_tuple(16, 32, highbd_sad16x32_avg_sse2, 8), 951 make_tuple(16, 16, highbd_sad16x16_avg_sse2, 8), 952 make_tuple(16, 8, highbd_sad16x8_avg_sse2, 8), 953 make_tuple(8, 16, highbd_sad8x16_avg_sse2, 8), 954 make_tuple(8, 8, highbd_sad8x8_avg_sse2, 8), 955 make_tuple(8, 4, highbd_sad8x4_avg_sse2, 8), 956 make_tuple(64, 64, highbd_sad64x64_avg_sse2, 10), 957 make_tuple(64, 32, highbd_sad64x32_avg_sse2, 10), 958 make_tuple(32, 64, highbd_sad32x64_avg_sse2, 10), 959 make_tuple(32, 32, highbd_sad32x32_avg_sse2, 10), 960 make_tuple(32, 16, highbd_sad32x16_avg_sse2, 10), 961 make_tuple(16, 32, highbd_sad16x32_avg_sse2, 10), 962 make_tuple(16, 16, highbd_sad16x16_avg_sse2, 10), 963 make_tuple(16, 8, highbd_sad16x8_avg_sse2, 10), 964 make_tuple(8, 16, highbd_sad8x16_avg_sse2, 10), 965 make_tuple(8, 8, highbd_sad8x8_avg_sse2, 10), 966 make_tuple(8, 4, highbd_sad8x4_avg_sse2, 10), 967 make_tuple(64, 64, highbd_sad64x64_avg_sse2, 12), 968 make_tuple(64, 32, highbd_sad64x32_avg_sse2, 12), 969 make_tuple(32, 64, highbd_sad32x64_avg_sse2, 12), 970 make_tuple(32, 32, highbd_sad32x32_avg_sse2, 12), 971 make_tuple(32, 16, highbd_sad32x16_avg_sse2, 12), 972 make_tuple(16, 32, highbd_sad16x32_avg_sse2, 12), 973 make_tuple(16, 16, highbd_sad16x16_avg_sse2, 12), 974 make_tuple(16, 8, highbd_sad16x8_avg_sse2, 12), 975 make_tuple(8, 16, highbd_sad8x16_avg_sse2, 12), 976 make_tuple(8, 8, highbd_sad8x8_avg_sse2, 12), 977 make_tuple(8, 4, highbd_sad8x4_avg_sse2, 12), 978 #endif // CONFIG_VP9_HIGHBITDEPTH 979 }; 980 INSTANTIATE_TEST_CASE_P(SSE2, SADavgTest, ::testing::ValuesIn(avg_sse2_tests)); 981 982 const SadMxNx4Func sad64x64x4d_sse2 = vpx_sad64x64x4d_sse2; 983 const SadMxNx4Func sad64x32x4d_sse2 = vpx_sad64x32x4d_sse2; 984 const SadMxNx4Func sad32x64x4d_sse2 = vpx_sad32x64x4d_sse2; 985 const SadMxNx4Func sad32x32x4d_sse2 = vpx_sad32x32x4d_sse2; 986 const SadMxNx4Func sad32x16x4d_sse2 = vpx_sad32x16x4d_sse2; 987 const SadMxNx4Func sad16x32x4d_sse2 = vpx_sad16x32x4d_sse2; 988 const SadMxNx4Func sad16x16x4d_sse2 = vpx_sad16x16x4d_sse2; 989 const SadMxNx4Func sad16x8x4d_sse2 = vpx_sad16x8x4d_sse2; 990 const SadMxNx4Func sad8x16x4d_sse2 = vpx_sad8x16x4d_sse2; 991 const SadMxNx4Func sad8x8x4d_sse2 = vpx_sad8x8x4d_sse2; 992 const SadMxNx4Func sad8x4x4d_sse2 = vpx_sad8x4x4d_sse2; 993 #if CONFIG_VP9_HIGHBITDEPTH 994 const SadMxNx4Func highbd_sad64x64x4d_sse2 = vpx_highbd_sad64x64x4d_sse2; 995 const SadMxNx4Func highbd_sad64x32x4d_sse2 = vpx_highbd_sad64x32x4d_sse2; 996 const SadMxNx4Func highbd_sad32x64x4d_sse2 = vpx_highbd_sad32x64x4d_sse2; 997 const SadMxNx4Func highbd_sad32x32x4d_sse2 = vpx_highbd_sad32x32x4d_sse2; 998 const SadMxNx4Func highbd_sad32x16x4d_sse2 = vpx_highbd_sad32x16x4d_sse2; 999 const SadMxNx4Func highbd_sad16x32x4d_sse2 = vpx_highbd_sad16x32x4d_sse2; 1000 const SadMxNx4Func highbd_sad16x16x4d_sse2 = vpx_highbd_sad16x16x4d_sse2; 1001 const SadMxNx4Func highbd_sad16x8x4d_sse2 = vpx_highbd_sad16x8x4d_sse2; 1002 const SadMxNx4Func highbd_sad8x16x4d_sse2 = vpx_highbd_sad8x16x4d_sse2; 1003 const SadMxNx4Func highbd_sad8x8x4d_sse2 = vpx_highbd_sad8x8x4d_sse2; 1004 const SadMxNx4Func highbd_sad8x4x4d_sse2 = vpx_highbd_sad8x4x4d_sse2; 1005 const SadMxNx4Func highbd_sad4x8x4d_sse2 = vpx_highbd_sad4x8x4d_sse2; 1006 const SadMxNx4Func highbd_sad4x4x4d_sse2 = vpx_highbd_sad4x4x4d_sse2; 1007 #endif // CONFIG_VP9_HIGHBITDEPTH 1008 const SadMxNx4Param x4d_sse2_tests[] = { 1009 make_tuple(64, 64, sad64x64x4d_sse2, -1), 1010 make_tuple(64, 32, sad64x32x4d_sse2, -1), 1011 make_tuple(32, 64, sad32x64x4d_sse2, -1), 1012 make_tuple(32, 32, sad32x32x4d_sse2, -1), 1013 make_tuple(32, 16, sad32x16x4d_sse2, -1), 1014 make_tuple(16, 32, sad16x32x4d_sse2, -1), 1015 make_tuple(16, 16, sad16x16x4d_sse2, -1), 1016 make_tuple(16, 8, sad16x8x4d_sse2, -1), 1017 make_tuple(8, 16, sad8x16x4d_sse2, -1), 1018 make_tuple(8, 8, sad8x8x4d_sse2, -1), 1019 make_tuple(8, 4, sad8x4x4d_sse2, -1), 1020 #if CONFIG_VP9_HIGHBITDEPTH 1021 make_tuple(64, 64, highbd_sad64x64x4d_sse2, 8), 1022 make_tuple(64, 32, highbd_sad64x32x4d_sse2, 8), 1023 make_tuple(32, 64, highbd_sad32x64x4d_sse2, 8), 1024 make_tuple(32, 32, highbd_sad32x32x4d_sse2, 8), 1025 make_tuple(32, 16, highbd_sad32x16x4d_sse2, 8), 1026 make_tuple(16, 32, highbd_sad16x32x4d_sse2, 8), 1027 make_tuple(16, 16, highbd_sad16x16x4d_sse2, 8), 1028 make_tuple(16, 8, highbd_sad16x8x4d_sse2, 8), 1029 make_tuple(8, 16, highbd_sad8x16x4d_sse2, 8), 1030 make_tuple(8, 8, highbd_sad8x8x4d_sse2, 8), 1031 make_tuple(8, 4, highbd_sad8x4x4d_sse2, 8), 1032 make_tuple(4, 8, highbd_sad4x8x4d_sse2, 8), 1033 make_tuple(4, 4, highbd_sad4x4x4d_sse2, 8), 1034 make_tuple(64, 64, highbd_sad64x64x4d_sse2, 10), 1035 make_tuple(64, 32, highbd_sad64x32x4d_sse2, 10), 1036 make_tuple(32, 64, highbd_sad32x64x4d_sse2, 10), 1037 make_tuple(32, 32, highbd_sad32x32x4d_sse2, 10), 1038 make_tuple(32, 16, highbd_sad32x16x4d_sse2, 10), 1039 make_tuple(16, 32, highbd_sad16x32x4d_sse2, 10), 1040 make_tuple(16, 16, highbd_sad16x16x4d_sse2, 10), 1041 make_tuple(16, 8, highbd_sad16x8x4d_sse2, 10), 1042 make_tuple(8, 16, highbd_sad8x16x4d_sse2, 10), 1043 make_tuple(8, 8, highbd_sad8x8x4d_sse2, 10), 1044 make_tuple(8, 4, highbd_sad8x4x4d_sse2, 10), 1045 make_tuple(4, 8, highbd_sad4x8x4d_sse2, 10), 1046 make_tuple(4, 4, highbd_sad4x4x4d_sse2, 10), 1047 make_tuple(64, 64, highbd_sad64x64x4d_sse2, 12), 1048 make_tuple(64, 32, highbd_sad64x32x4d_sse2, 12), 1049 make_tuple(32, 64, highbd_sad32x64x4d_sse2, 12), 1050 make_tuple(32, 32, highbd_sad32x32x4d_sse2, 12), 1051 make_tuple(32, 16, highbd_sad32x16x4d_sse2, 12), 1052 make_tuple(16, 32, highbd_sad16x32x4d_sse2, 12), 1053 make_tuple(16, 16, highbd_sad16x16x4d_sse2, 12), 1054 make_tuple(16, 8, highbd_sad16x8x4d_sse2, 12), 1055 make_tuple(8, 16, highbd_sad8x16x4d_sse2, 12), 1056 make_tuple(8, 8, highbd_sad8x8x4d_sse2, 12), 1057 make_tuple(8, 4, highbd_sad8x4x4d_sse2, 12), 1058 make_tuple(4, 8, highbd_sad4x8x4d_sse2, 12), 1059 make_tuple(4, 4, highbd_sad4x4x4d_sse2, 12), 1060 #endif // CONFIG_VP9_HIGHBITDEPTH 1061 }; 1062 INSTANTIATE_TEST_CASE_P(SSE2, SADx4Test, ::testing::ValuesIn(x4d_sse2_tests)); 1063 #endif // CONFIG_USE_X86INC 1064 #endif // HAVE_SSE2 1065 1066 #if HAVE_SSE3 1067 // Only functions are x3, which do not have tests. 1068 #endif // HAVE_SSE3 1069 1070 #if HAVE_SSSE3 1071 // Only functions are x3, which do not have tests. 1072 #endif // HAVE_SSSE3 1073 1074 #if HAVE_SSE4_1 1075 // Only functions are x8, which do not have tests. 1076 #endif // HAVE_SSE4_1 1077 1078 #if HAVE_AVX2 1079 const SadMxNFunc sad64x64_avx2 = vpx_sad64x64_avx2; 1080 const SadMxNFunc sad64x32_avx2 = vpx_sad64x32_avx2; 1081 const SadMxNFunc sad32x64_avx2 = vpx_sad32x64_avx2; 1082 const SadMxNFunc sad32x32_avx2 = vpx_sad32x32_avx2; 1083 const SadMxNFunc sad32x16_avx2 = vpx_sad32x16_avx2; 1084 const SadMxNParam avx2_tests[] = { 1085 make_tuple(64, 64, sad64x64_avx2, -1), 1086 make_tuple(64, 32, sad64x32_avx2, -1), 1087 make_tuple(32, 64, sad32x64_avx2, -1), 1088 make_tuple(32, 32, sad32x32_avx2, -1), 1089 make_tuple(32, 16, sad32x16_avx2, -1), 1090 }; 1091 INSTANTIATE_TEST_CASE_P(AVX2, SADTest, ::testing::ValuesIn(avx2_tests)); 1092 1093 const SadMxNAvgFunc sad64x64_avg_avx2 = vpx_sad64x64_avg_avx2; 1094 const SadMxNAvgFunc sad64x32_avg_avx2 = vpx_sad64x32_avg_avx2; 1095 const SadMxNAvgFunc sad32x64_avg_avx2 = vpx_sad32x64_avg_avx2; 1096 const SadMxNAvgFunc sad32x32_avg_avx2 = vpx_sad32x32_avg_avx2; 1097 const SadMxNAvgFunc sad32x16_avg_avx2 = vpx_sad32x16_avg_avx2; 1098 const SadMxNAvgParam avg_avx2_tests[] = { 1099 make_tuple(64, 64, sad64x64_avg_avx2, -1), 1100 make_tuple(64, 32, sad64x32_avg_avx2, -1), 1101 make_tuple(32, 64, sad32x64_avg_avx2, -1), 1102 make_tuple(32, 32, sad32x32_avg_avx2, -1), 1103 make_tuple(32, 16, sad32x16_avg_avx2, -1), 1104 }; 1105 INSTANTIATE_TEST_CASE_P(AVX2, SADavgTest, ::testing::ValuesIn(avg_avx2_tests)); 1106 1107 const SadMxNx4Func sad64x64x4d_avx2 = vpx_sad64x64x4d_avx2; 1108 const SadMxNx4Func sad32x32x4d_avx2 = vpx_sad32x32x4d_avx2; 1109 const SadMxNx4Param x4d_avx2_tests[] = { 1110 make_tuple(64, 64, sad64x64x4d_avx2, -1), 1111 make_tuple(32, 32, sad32x32x4d_avx2, -1), 1112 }; 1113 INSTANTIATE_TEST_CASE_P(AVX2, SADx4Test, ::testing::ValuesIn(x4d_avx2_tests)); 1114 #endif // HAVE_AVX2 1115 1116 //------------------------------------------------------------------------------ 1117 // MIPS functions 1118 #if HAVE_MSA 1119 const SadMxNFunc sad64x64_msa = vpx_sad64x64_msa; 1120 const SadMxNFunc sad64x32_msa = vpx_sad64x32_msa; 1121 const SadMxNFunc sad32x64_msa = vpx_sad32x64_msa; 1122 const SadMxNFunc sad32x32_msa = vpx_sad32x32_msa; 1123 const SadMxNFunc sad32x16_msa = vpx_sad32x16_msa; 1124 const SadMxNFunc sad16x32_msa = vpx_sad16x32_msa; 1125 const SadMxNFunc sad16x16_msa = vpx_sad16x16_msa; 1126 const SadMxNFunc sad16x8_msa = vpx_sad16x8_msa; 1127 const SadMxNFunc sad8x16_msa = vpx_sad8x16_msa; 1128 const SadMxNFunc sad8x8_msa = vpx_sad8x8_msa; 1129 const SadMxNFunc sad8x4_msa = vpx_sad8x4_msa; 1130 const SadMxNFunc sad4x8_msa = vpx_sad4x8_msa; 1131 const SadMxNFunc sad4x4_msa = vpx_sad4x4_msa; 1132 const SadMxNParam msa_tests[] = { 1133 make_tuple(64, 64, sad64x64_msa, -1), 1134 make_tuple(64, 32, sad64x32_msa, -1), 1135 make_tuple(32, 64, sad32x64_msa, -1), 1136 make_tuple(32, 32, sad32x32_msa, -1), 1137 make_tuple(32, 16, sad32x16_msa, -1), 1138 make_tuple(16, 32, sad16x32_msa, -1), 1139 make_tuple(16, 16, sad16x16_msa, -1), 1140 make_tuple(16, 8, sad16x8_msa, -1), 1141 make_tuple(8, 16, sad8x16_msa, -1), 1142 make_tuple(8, 8, sad8x8_msa, -1), 1143 make_tuple(8, 4, sad8x4_msa, -1), 1144 make_tuple(4, 8, sad4x8_msa, -1), 1145 make_tuple(4, 4, sad4x4_msa, -1), 1146 }; 1147 INSTANTIATE_TEST_CASE_P(MSA, SADTest, ::testing::ValuesIn(msa_tests)); 1148 1149 const SadMxNAvgFunc sad64x64_avg_msa = vpx_sad64x64_avg_msa; 1150 const SadMxNAvgFunc sad64x32_avg_msa = vpx_sad64x32_avg_msa; 1151 const SadMxNAvgFunc sad32x64_avg_msa = vpx_sad32x64_avg_msa; 1152 const SadMxNAvgFunc sad32x32_avg_msa = vpx_sad32x32_avg_msa; 1153 const SadMxNAvgFunc sad32x16_avg_msa = vpx_sad32x16_avg_msa; 1154 const SadMxNAvgFunc sad16x32_avg_msa = vpx_sad16x32_avg_msa; 1155 const SadMxNAvgFunc sad16x16_avg_msa = vpx_sad16x16_avg_msa; 1156 const SadMxNAvgFunc sad16x8_avg_msa = vpx_sad16x8_avg_msa; 1157 const SadMxNAvgFunc sad8x16_avg_msa = vpx_sad8x16_avg_msa; 1158 const SadMxNAvgFunc sad8x8_avg_msa = vpx_sad8x8_avg_msa; 1159 const SadMxNAvgFunc sad8x4_avg_msa = vpx_sad8x4_avg_msa; 1160 const SadMxNAvgFunc sad4x8_avg_msa = vpx_sad4x8_avg_msa; 1161 const SadMxNAvgFunc sad4x4_avg_msa = vpx_sad4x4_avg_msa; 1162 const SadMxNAvgParam avg_msa_tests[] = { 1163 make_tuple(64, 64, sad64x64_avg_msa, -1), 1164 make_tuple(64, 32, sad64x32_avg_msa, -1), 1165 make_tuple(32, 64, sad32x64_avg_msa, -1), 1166 make_tuple(32, 32, sad32x32_avg_msa, -1), 1167 make_tuple(32, 16, sad32x16_avg_msa, -1), 1168 make_tuple(16, 32, sad16x32_avg_msa, -1), 1169 make_tuple(16, 16, sad16x16_avg_msa, -1), 1170 make_tuple(16, 8, sad16x8_avg_msa, -1), 1171 make_tuple(8, 16, sad8x16_avg_msa, -1), 1172 make_tuple(8, 8, sad8x8_avg_msa, -1), 1173 make_tuple(8, 4, sad8x4_avg_msa, -1), 1174 make_tuple(4, 8, sad4x8_avg_msa, -1), 1175 make_tuple(4, 4, sad4x4_avg_msa, -1), 1176 }; 1177 INSTANTIATE_TEST_CASE_P(MSA, SADavgTest, ::testing::ValuesIn(avg_msa_tests)); 1178 1179 const SadMxNx4Func sad64x64x4d_msa = vpx_sad64x64x4d_msa; 1180 const SadMxNx4Func sad64x32x4d_msa = vpx_sad64x32x4d_msa; 1181 const SadMxNx4Func sad32x64x4d_msa = vpx_sad32x64x4d_msa; 1182 const SadMxNx4Func sad32x32x4d_msa = vpx_sad32x32x4d_msa; 1183 const SadMxNx4Func sad32x16x4d_msa = vpx_sad32x16x4d_msa; 1184 const SadMxNx4Func sad16x32x4d_msa = vpx_sad16x32x4d_msa; 1185 const SadMxNx4Func sad16x16x4d_msa = vpx_sad16x16x4d_msa; 1186 const SadMxNx4Func sad16x8x4d_msa = vpx_sad16x8x4d_msa; 1187 const SadMxNx4Func sad8x16x4d_msa = vpx_sad8x16x4d_msa; 1188 const SadMxNx4Func sad8x8x4d_msa = vpx_sad8x8x4d_msa; 1189 const SadMxNx4Func sad8x4x4d_msa = vpx_sad8x4x4d_msa; 1190 const SadMxNx4Func sad4x8x4d_msa = vpx_sad4x8x4d_msa; 1191 const SadMxNx4Func sad4x4x4d_msa = vpx_sad4x4x4d_msa; 1192 const SadMxNx4Param x4d_msa_tests[] = { 1193 make_tuple(64, 64, sad64x64x4d_msa, -1), 1194 make_tuple(64, 32, sad64x32x4d_msa, -1), 1195 make_tuple(32, 64, sad32x64x4d_msa, -1), 1196 make_tuple(32, 32, sad32x32x4d_msa, -1), 1197 make_tuple(32, 16, sad32x16x4d_msa, -1), 1198 make_tuple(16, 32, sad16x32x4d_msa, -1), 1199 make_tuple(16, 16, sad16x16x4d_msa, -1), 1200 make_tuple(16, 8, sad16x8x4d_msa, -1), 1201 make_tuple(8, 16, sad8x16x4d_msa, -1), 1202 make_tuple(8, 8, sad8x8x4d_msa, -1), 1203 make_tuple(8, 4, sad8x4x4d_msa, -1), 1204 make_tuple(4, 8, sad4x8x4d_msa, -1), 1205 make_tuple(4, 4, sad4x4x4d_msa, -1), 1206 }; 1207 INSTANTIATE_TEST_CASE_P(MSA, SADx4Test, ::testing::ValuesIn(x4d_msa_tests)); 1208 #endif // HAVE_MSA 1209 1210 } // namespace 1211