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 <string.h> 12 #include <limits.h> 13 #include <stdio.h> 14 15 #include "third_party/googletest/src/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/clear_system_state.h" 21 #include "test/register_state_check.h" 22 #include "test/util.h" 23 #include "vpx/vpx_codec.h" 24 #include "vpx_mem/vpx_mem.h" 25 #include "vpx_ports/mem.h" 26 27 template <typename Function> 28 struct TestParams { 29 TestParams(int w, int h, Function f, int bd = -1) 30 : width(w), height(h), bit_depth(bd), func(f) {} 31 int width, height, bit_depth; 32 Function func; 33 }; 34 35 typedef unsigned int (*SadMxNFunc)(const uint8_t *src_ptr, int src_stride, 36 const uint8_t *ref_ptr, int ref_stride); 37 typedef TestParams<SadMxNFunc> SadMxNParam; 38 39 typedef unsigned int (*SadMxNAvgFunc)(const uint8_t *src_ptr, int src_stride, 40 const uint8_t *ref_ptr, int ref_stride, 41 const uint8_t *second_pred); 42 typedef TestParams<SadMxNAvgFunc> SadMxNAvgParam; 43 44 typedef void (*SadMxNx4Func)(const uint8_t *src_ptr, int src_stride, 45 const uint8_t *const ref_ptr[], int ref_stride, 46 unsigned int *sad_array); 47 typedef TestParams<SadMxNx4Func> SadMxNx4Param; 48 49 using libvpx_test::ACMRandom; 50 51 namespace { 52 template <typename ParamType> 53 class SADTestBase : public ::testing::TestWithParam<ParamType> { 54 public: 55 explicit SADTestBase(const ParamType ¶ms) : params_(params) {} 56 57 virtual void SetUp() { 58 source_data8_ = reinterpret_cast<uint8_t *>( 59 vpx_memalign(kDataAlignment, kDataBlockSize)); 60 reference_data8_ = reinterpret_cast<uint8_t *>( 61 vpx_memalign(kDataAlignment, kDataBufferSize)); 62 second_pred8_ = 63 reinterpret_cast<uint8_t *>(vpx_memalign(kDataAlignment, 64 * 64)); 64 source_data16_ = reinterpret_cast<uint16_t *>( 65 vpx_memalign(kDataAlignment, kDataBlockSize * sizeof(uint16_t))); 66 reference_data16_ = reinterpret_cast<uint16_t *>( 67 vpx_memalign(kDataAlignment, kDataBufferSize * sizeof(uint16_t))); 68 second_pred16_ = reinterpret_cast<uint16_t *>( 69 vpx_memalign(kDataAlignment, 64 * 64 * sizeof(uint16_t))); 70 71 if (params_.bit_depth == -1) { 72 use_high_bit_depth_ = false; 73 bit_depth_ = VPX_BITS_8; 74 source_data_ = source_data8_; 75 reference_data_ = reference_data8_; 76 second_pred_ = second_pred8_; 77 #if CONFIG_VP9_HIGHBITDEPTH 78 } else { 79 use_high_bit_depth_ = true; 80 bit_depth_ = static_cast<vpx_bit_depth_t>(params_.bit_depth); 81 source_data_ = CONVERT_TO_BYTEPTR(source_data16_); 82 reference_data_ = CONVERT_TO_BYTEPTR(reference_data16_); 83 second_pred_ = CONVERT_TO_BYTEPTR(second_pred16_); 84 #endif // CONFIG_VP9_HIGHBITDEPTH 85 } 86 mask_ = (1 << bit_depth_) - 1; 87 source_stride_ = (params_.width + 31) & ~31; 88 reference_stride_ = params_.width * 2; 89 rnd_.Reset(ACMRandom::DeterministicSeed()); 90 } 91 92 virtual void TearDown() { 93 vpx_free(source_data8_); 94 source_data8_ = NULL; 95 vpx_free(reference_data8_); 96 reference_data8_ = NULL; 97 vpx_free(second_pred8_); 98 second_pred8_ = NULL; 99 vpx_free(source_data16_); 100 source_data16_ = NULL; 101 vpx_free(reference_data16_); 102 reference_data16_ = NULL; 103 vpx_free(second_pred16_); 104 second_pred16_ = NULL; 105 106 libvpx_test::ClearSystemState(); 107 } 108 109 protected: 110 // Handle blocks up to 4 blocks 64x64 with stride up to 128 111 static const int kDataAlignment = 16; 112 static const int kDataBlockSize = 64 * 128; 113 static const int kDataBufferSize = 4 * kDataBlockSize; 114 115 uint8_t *GetReference(int block_idx) const { 116 #if CONFIG_VP9_HIGHBITDEPTH 117 if (use_high_bit_depth_) { 118 return CONVERT_TO_BYTEPTR(CONVERT_TO_SHORTPTR(reference_data_) + 119 block_idx * kDataBlockSize); 120 } 121 #endif // CONFIG_VP9_HIGHBITDEPTH 122 return reference_data_ + block_idx * kDataBlockSize; 123 } 124 125 // Sum of Absolute Differences. Given two blocks, calculate the absolute 126 // difference between two pixels in the same relative location; accumulate. 127 uint32_t ReferenceSAD(int block_idx) const { 128 uint32_t sad = 0; 129 const uint8_t *const reference8 = GetReference(block_idx); 130 const uint8_t *const source8 = source_data_; 131 #if CONFIG_VP9_HIGHBITDEPTH 132 const uint16_t *const reference16 = 133 CONVERT_TO_SHORTPTR(GetReference(block_idx)); 134 const uint16_t *const source16 = CONVERT_TO_SHORTPTR(source_data_); 135 #endif // CONFIG_VP9_HIGHBITDEPTH 136 for (int h = 0; h < params_.height; ++h) { 137 for (int w = 0; w < params_.width; ++w) { 138 if (!use_high_bit_depth_) { 139 sad += abs(source8[h * source_stride_ + w] - 140 reference8[h * reference_stride_ + w]); 141 #if CONFIG_VP9_HIGHBITDEPTH 142 } else { 143 sad += abs(source16[h * source_stride_ + w] - 144 reference16[h * reference_stride_ + w]); 145 #endif // CONFIG_VP9_HIGHBITDEPTH 146 } 147 } 148 } 149 return sad; 150 } 151 152 // Sum of Absolute Differences Average. Given two blocks, and a prediction 153 // calculate the absolute difference between one pixel and average of the 154 // corresponding and predicted pixels; accumulate. 155 unsigned int ReferenceSADavg(int block_idx) const { 156 unsigned int sad = 0; 157 const uint8_t *const reference8 = GetReference(block_idx); 158 const uint8_t *const source8 = source_data_; 159 const uint8_t *const second_pred8 = second_pred_; 160 #if CONFIG_VP9_HIGHBITDEPTH 161 const uint16_t *const reference16 = 162 CONVERT_TO_SHORTPTR(GetReference(block_idx)); 163 const uint16_t *const source16 = CONVERT_TO_SHORTPTR(source_data_); 164 const uint16_t *const second_pred16 = CONVERT_TO_SHORTPTR(second_pred_); 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 const int tmp = second_pred8[h * params_.width + w] + 170 reference8[h * reference_stride_ + w]; 171 const uint8_t comp_pred = ROUND_POWER_OF_TWO(tmp, 1); 172 sad += abs(source8[h * source_stride_ + w] - comp_pred); 173 #if CONFIG_VP9_HIGHBITDEPTH 174 } else { 175 const int tmp = second_pred16[h * params_.width + w] + 176 reference16[h * reference_stride_ + w]; 177 const uint16_t comp_pred = ROUND_POWER_OF_TWO(tmp, 1); 178 sad += abs(source16[h * source_stride_ + w] - comp_pred); 179 #endif // CONFIG_VP9_HIGHBITDEPTH 180 } 181 } 182 } 183 return sad; 184 } 185 186 void FillConstant(uint8_t *data, int stride, uint16_t fill_constant) const { 187 uint8_t *data8 = data; 188 #if CONFIG_VP9_HIGHBITDEPTH 189 uint16_t *data16 = CONVERT_TO_SHORTPTR(data); 190 #endif // CONFIG_VP9_HIGHBITDEPTH 191 for (int h = 0; h < params_.height; ++h) { 192 for (int w = 0; w < params_.width; ++w) { 193 if (!use_high_bit_depth_) { 194 data8[h * stride + w] = static_cast<uint8_t>(fill_constant); 195 #if CONFIG_VP9_HIGHBITDEPTH 196 } else { 197 data16[h * stride + w] = fill_constant; 198 #endif // CONFIG_VP9_HIGHBITDEPTH 199 } 200 } 201 } 202 } 203 204 void FillRandom(uint8_t *data, int stride) { 205 uint8_t *data8 = data; 206 #if CONFIG_VP9_HIGHBITDEPTH 207 uint16_t *data16 = CONVERT_TO_SHORTPTR(data); 208 #endif // CONFIG_VP9_HIGHBITDEPTH 209 for (int h = 0; h < params_.height; ++h) { 210 for (int w = 0; w < params_.width; ++w) { 211 if (!use_high_bit_depth_) { 212 data8[h * stride + w] = rnd_.Rand8(); 213 #if CONFIG_VP9_HIGHBITDEPTH 214 } else { 215 data16[h * stride + w] = rnd_.Rand16() & mask_; 216 #endif // CONFIG_VP9_HIGHBITDEPTH 217 } 218 } 219 } 220 } 221 222 uint32_t mask_; 223 vpx_bit_depth_t bit_depth_; 224 int source_stride_; 225 int reference_stride_; 226 bool use_high_bit_depth_; 227 228 uint8_t *source_data_; 229 uint8_t *reference_data_; 230 uint8_t *second_pred_; 231 uint8_t *source_data8_; 232 uint8_t *reference_data8_; 233 uint8_t *second_pred8_; 234 uint16_t *source_data16_; 235 uint16_t *reference_data16_; 236 uint16_t *second_pred16_; 237 238 ACMRandom rnd_; 239 ParamType params_; 240 }; 241 242 class SADx4Test : public SADTestBase<SadMxNx4Param> { 243 public: 244 SADx4Test() : SADTestBase(GetParam()) {} 245 246 protected: 247 void SADs(unsigned int *results) const { 248 const uint8_t *references[] = { GetReference(0), GetReference(1), 249 GetReference(2), GetReference(3) }; 250 251 ASM_REGISTER_STATE_CHECK(params_.func( 252 source_data_, source_stride_, references, reference_stride_, results)); 253 } 254 255 void CheckSADs() const { 256 uint32_t reference_sad, exp_sad[4]; 257 258 SADs(exp_sad); 259 for (int block = 0; block < 4; ++block) { 260 reference_sad = ReferenceSAD(block); 261 262 EXPECT_EQ(reference_sad, exp_sad[block]) << "block " << block; 263 } 264 } 265 }; 266 267 class SADTest : public SADTestBase<SadMxNParam> { 268 public: 269 SADTest() : SADTestBase(GetParam()) {} 270 271 protected: 272 unsigned int SAD(int block_idx) const { 273 unsigned int ret; 274 const uint8_t *const reference = GetReference(block_idx); 275 276 ASM_REGISTER_STATE_CHECK(ret = params_.func(source_data_, source_stride_, 277 reference, reference_stride_)); 278 return ret; 279 } 280 281 void CheckSAD() const { 282 const unsigned int reference_sad = ReferenceSAD(0); 283 const unsigned int exp_sad = SAD(0); 284 285 ASSERT_EQ(reference_sad, exp_sad); 286 } 287 }; 288 289 class SADavgTest : public SADTestBase<SadMxNAvgParam> { 290 public: 291 SADavgTest() : SADTestBase(GetParam()) {} 292 293 protected: 294 unsigned int SAD_avg(int block_idx) const { 295 unsigned int ret; 296 const uint8_t *const reference = GetReference(block_idx); 297 298 ASM_REGISTER_STATE_CHECK(ret = params_.func(source_data_, source_stride_, 299 reference, reference_stride_, 300 second_pred_)); 301 return ret; 302 } 303 304 void CheckSAD() const { 305 const unsigned int reference_sad = ReferenceSADavg(0); 306 const unsigned int exp_sad = SAD_avg(0); 307 308 ASSERT_EQ(reference_sad, exp_sad); 309 } 310 }; 311 312 TEST_P(SADTest, MaxRef) { 313 FillConstant(source_data_, source_stride_, 0); 314 FillConstant(reference_data_, reference_stride_, mask_); 315 CheckSAD(); 316 } 317 318 TEST_P(SADTest, MaxSrc) { 319 FillConstant(source_data_, source_stride_, mask_); 320 FillConstant(reference_data_, reference_stride_, 0); 321 CheckSAD(); 322 } 323 324 TEST_P(SADTest, ShortRef) { 325 const int tmp_stride = reference_stride_; 326 reference_stride_ >>= 1; 327 FillRandom(source_data_, source_stride_); 328 FillRandom(reference_data_, reference_stride_); 329 CheckSAD(); 330 reference_stride_ = tmp_stride; 331 } 332 333 TEST_P(SADTest, UnalignedRef) { 334 // The reference frame, but not the source frame, may be unaligned for 335 // certain types of searches. 336 const int tmp_stride = reference_stride_; 337 reference_stride_ -= 1; 338 FillRandom(source_data_, source_stride_); 339 FillRandom(reference_data_, reference_stride_); 340 CheckSAD(); 341 reference_stride_ = tmp_stride; 342 } 343 344 TEST_P(SADTest, ShortSrc) { 345 const int tmp_stride = source_stride_; 346 source_stride_ >>= 1; 347 FillRandom(source_data_, source_stride_); 348 FillRandom(reference_data_, reference_stride_); 349 CheckSAD(); 350 source_stride_ = tmp_stride; 351 } 352 353 TEST_P(SADavgTest, MaxRef) { 354 FillConstant(source_data_, source_stride_, 0); 355 FillConstant(reference_data_, reference_stride_, mask_); 356 FillConstant(second_pred_, params_.width, 0); 357 CheckSAD(); 358 } 359 TEST_P(SADavgTest, MaxSrc) { 360 FillConstant(source_data_, source_stride_, mask_); 361 FillConstant(reference_data_, reference_stride_, 0); 362 FillConstant(second_pred_, params_.width, 0); 363 CheckSAD(); 364 } 365 366 TEST_P(SADavgTest, ShortRef) { 367 const int tmp_stride = reference_stride_; 368 reference_stride_ >>= 1; 369 FillRandom(source_data_, source_stride_); 370 FillRandom(reference_data_, reference_stride_); 371 FillRandom(second_pred_, params_.width); 372 CheckSAD(); 373 reference_stride_ = tmp_stride; 374 } 375 376 TEST_P(SADavgTest, UnalignedRef) { 377 // The reference frame, but not the source frame, may be unaligned for 378 // certain types of searches. 379 const int tmp_stride = reference_stride_; 380 reference_stride_ -= 1; 381 FillRandom(source_data_, source_stride_); 382 FillRandom(reference_data_, reference_stride_); 383 FillRandom(second_pred_, params_.width); 384 CheckSAD(); 385 reference_stride_ = tmp_stride; 386 } 387 388 TEST_P(SADavgTest, ShortSrc) { 389 const int tmp_stride = source_stride_; 390 source_stride_ >>= 1; 391 FillRandom(source_data_, source_stride_); 392 FillRandom(reference_data_, reference_stride_); 393 FillRandom(second_pred_, params_.width); 394 CheckSAD(); 395 source_stride_ = tmp_stride; 396 } 397 398 TEST_P(SADx4Test, MaxRef) { 399 FillConstant(source_data_, source_stride_, 0); 400 FillConstant(GetReference(0), reference_stride_, mask_); 401 FillConstant(GetReference(1), reference_stride_, mask_); 402 FillConstant(GetReference(2), reference_stride_, mask_); 403 FillConstant(GetReference(3), reference_stride_, mask_); 404 CheckSADs(); 405 } 406 407 TEST_P(SADx4Test, MaxSrc) { 408 FillConstant(source_data_, source_stride_, mask_); 409 FillConstant(GetReference(0), reference_stride_, 0); 410 FillConstant(GetReference(1), reference_stride_, 0); 411 FillConstant(GetReference(2), reference_stride_, 0); 412 FillConstant(GetReference(3), reference_stride_, 0); 413 CheckSADs(); 414 } 415 416 TEST_P(SADx4Test, ShortRef) { 417 int tmp_stride = reference_stride_; 418 reference_stride_ >>= 1; 419 FillRandom(source_data_, source_stride_); 420 FillRandom(GetReference(0), reference_stride_); 421 FillRandom(GetReference(1), reference_stride_); 422 FillRandom(GetReference(2), reference_stride_); 423 FillRandom(GetReference(3), reference_stride_); 424 CheckSADs(); 425 reference_stride_ = tmp_stride; 426 } 427 428 TEST_P(SADx4Test, UnalignedRef) { 429 // The reference frame, but not the source frame, may be unaligned for 430 // certain types of searches. 431 int tmp_stride = reference_stride_; 432 reference_stride_ -= 1; 433 FillRandom(source_data_, source_stride_); 434 FillRandom(GetReference(0), reference_stride_); 435 FillRandom(GetReference(1), reference_stride_); 436 FillRandom(GetReference(2), reference_stride_); 437 FillRandom(GetReference(3), reference_stride_); 438 CheckSADs(); 439 reference_stride_ = tmp_stride; 440 } 441 442 TEST_P(SADx4Test, ShortSrc) { 443 int tmp_stride = source_stride_; 444 source_stride_ >>= 1; 445 FillRandom(source_data_, source_stride_); 446 FillRandom(GetReference(0), reference_stride_); 447 FillRandom(GetReference(1), reference_stride_); 448 FillRandom(GetReference(2), reference_stride_); 449 FillRandom(GetReference(3), reference_stride_); 450 CheckSADs(); 451 source_stride_ = tmp_stride; 452 } 453 454 TEST_P(SADx4Test, SrcAlignedByWidth) { 455 uint8_t *tmp_source_data = source_data_; 456 source_data_ += params_.width; 457 FillRandom(source_data_, source_stride_); 458 FillRandom(GetReference(0), reference_stride_); 459 FillRandom(GetReference(1), reference_stride_); 460 FillRandom(GetReference(2), reference_stride_); 461 FillRandom(GetReference(3), reference_stride_); 462 CheckSADs(); 463 source_data_ = tmp_source_data; 464 } 465 466 //------------------------------------------------------------------------------ 467 // C functions 468 const SadMxNParam c_tests[] = { 469 SadMxNParam(64, 64, &vpx_sad64x64_c), 470 SadMxNParam(64, 32, &vpx_sad64x32_c), 471 SadMxNParam(32, 64, &vpx_sad32x64_c), 472 SadMxNParam(32, 32, &vpx_sad32x32_c), 473 SadMxNParam(32, 16, &vpx_sad32x16_c), 474 SadMxNParam(16, 32, &vpx_sad16x32_c), 475 SadMxNParam(16, 16, &vpx_sad16x16_c), 476 SadMxNParam(16, 8, &vpx_sad16x8_c), 477 SadMxNParam(8, 16, &vpx_sad8x16_c), 478 SadMxNParam(8, 8, &vpx_sad8x8_c), 479 SadMxNParam(8, 4, &vpx_sad8x4_c), 480 SadMxNParam(4, 8, &vpx_sad4x8_c), 481 SadMxNParam(4, 4, &vpx_sad4x4_c), 482 #if CONFIG_VP9_HIGHBITDEPTH 483 SadMxNParam(64, 64, &vpx_highbd_sad64x64_c, 8), 484 SadMxNParam(64, 32, &vpx_highbd_sad64x32_c, 8), 485 SadMxNParam(32, 64, &vpx_highbd_sad32x64_c, 8), 486 SadMxNParam(32, 32, &vpx_highbd_sad32x32_c, 8), 487 SadMxNParam(32, 16, &vpx_highbd_sad32x16_c, 8), 488 SadMxNParam(16, 32, &vpx_highbd_sad16x32_c, 8), 489 SadMxNParam(16, 16, &vpx_highbd_sad16x16_c, 8), 490 SadMxNParam(16, 8, &vpx_highbd_sad16x8_c, 8), 491 SadMxNParam(8, 16, &vpx_highbd_sad8x16_c, 8), 492 SadMxNParam(8, 8, &vpx_highbd_sad8x8_c, 8), 493 SadMxNParam(8, 4, &vpx_highbd_sad8x4_c, 8), 494 SadMxNParam(4, 8, &vpx_highbd_sad4x8_c, 8), 495 SadMxNParam(4, 4, &vpx_highbd_sad4x4_c, 8), 496 SadMxNParam(64, 64, &vpx_highbd_sad64x64_c, 10), 497 SadMxNParam(64, 32, &vpx_highbd_sad64x32_c, 10), 498 SadMxNParam(32, 64, &vpx_highbd_sad32x64_c, 10), 499 SadMxNParam(32, 32, &vpx_highbd_sad32x32_c, 10), 500 SadMxNParam(32, 16, &vpx_highbd_sad32x16_c, 10), 501 SadMxNParam(16, 32, &vpx_highbd_sad16x32_c, 10), 502 SadMxNParam(16, 16, &vpx_highbd_sad16x16_c, 10), 503 SadMxNParam(16, 8, &vpx_highbd_sad16x8_c, 10), 504 SadMxNParam(8, 16, &vpx_highbd_sad8x16_c, 10), 505 SadMxNParam(8, 8, &vpx_highbd_sad8x8_c, 10), 506 SadMxNParam(8, 4, &vpx_highbd_sad8x4_c, 10), 507 SadMxNParam(4, 8, &vpx_highbd_sad4x8_c, 10), 508 SadMxNParam(4, 4, &vpx_highbd_sad4x4_c, 10), 509 SadMxNParam(64, 64, &vpx_highbd_sad64x64_c, 12), 510 SadMxNParam(64, 32, &vpx_highbd_sad64x32_c, 12), 511 SadMxNParam(32, 64, &vpx_highbd_sad32x64_c, 12), 512 SadMxNParam(32, 32, &vpx_highbd_sad32x32_c, 12), 513 SadMxNParam(32, 16, &vpx_highbd_sad32x16_c, 12), 514 SadMxNParam(16, 32, &vpx_highbd_sad16x32_c, 12), 515 SadMxNParam(16, 16, &vpx_highbd_sad16x16_c, 12), 516 SadMxNParam(16, 8, &vpx_highbd_sad16x8_c, 12), 517 SadMxNParam(8, 16, &vpx_highbd_sad8x16_c, 12), 518 SadMxNParam(8, 8, &vpx_highbd_sad8x8_c, 12), 519 SadMxNParam(8, 4, &vpx_highbd_sad8x4_c, 12), 520 SadMxNParam(4, 8, &vpx_highbd_sad4x8_c, 12), 521 SadMxNParam(4, 4, &vpx_highbd_sad4x4_c, 12), 522 #endif // CONFIG_VP9_HIGHBITDEPTH 523 }; 524 INSTANTIATE_TEST_CASE_P(C, SADTest, ::testing::ValuesIn(c_tests)); 525 526 const SadMxNAvgParam avg_c_tests[] = { 527 SadMxNAvgParam(64, 64, &vpx_sad64x64_avg_c), 528 SadMxNAvgParam(64, 32, &vpx_sad64x32_avg_c), 529 SadMxNAvgParam(32, 64, &vpx_sad32x64_avg_c), 530 SadMxNAvgParam(32, 32, &vpx_sad32x32_avg_c), 531 SadMxNAvgParam(32, 16, &vpx_sad32x16_avg_c), 532 SadMxNAvgParam(16, 32, &vpx_sad16x32_avg_c), 533 SadMxNAvgParam(16, 16, &vpx_sad16x16_avg_c), 534 SadMxNAvgParam(16, 8, &vpx_sad16x8_avg_c), 535 SadMxNAvgParam(8, 16, &vpx_sad8x16_avg_c), 536 SadMxNAvgParam(8, 8, &vpx_sad8x8_avg_c), 537 SadMxNAvgParam(8, 4, &vpx_sad8x4_avg_c), 538 SadMxNAvgParam(4, 8, &vpx_sad4x8_avg_c), 539 SadMxNAvgParam(4, 4, &vpx_sad4x4_avg_c), 540 #if CONFIG_VP9_HIGHBITDEPTH 541 SadMxNAvgParam(64, 64, &vpx_highbd_sad64x64_avg_c, 8), 542 SadMxNAvgParam(64, 32, &vpx_highbd_sad64x32_avg_c, 8), 543 SadMxNAvgParam(32, 64, &vpx_highbd_sad32x64_avg_c, 8), 544 SadMxNAvgParam(32, 32, &vpx_highbd_sad32x32_avg_c, 8), 545 SadMxNAvgParam(32, 16, &vpx_highbd_sad32x16_avg_c, 8), 546 SadMxNAvgParam(16, 32, &vpx_highbd_sad16x32_avg_c, 8), 547 SadMxNAvgParam(16, 16, &vpx_highbd_sad16x16_avg_c, 8), 548 SadMxNAvgParam(16, 8, &vpx_highbd_sad16x8_avg_c, 8), 549 SadMxNAvgParam(8, 16, &vpx_highbd_sad8x16_avg_c, 8), 550 SadMxNAvgParam(8, 8, &vpx_highbd_sad8x8_avg_c, 8), 551 SadMxNAvgParam(8, 4, &vpx_highbd_sad8x4_avg_c, 8), 552 SadMxNAvgParam(4, 8, &vpx_highbd_sad4x8_avg_c, 8), 553 SadMxNAvgParam(4, 4, &vpx_highbd_sad4x4_avg_c, 8), 554 SadMxNAvgParam(64, 64, &vpx_highbd_sad64x64_avg_c, 10), 555 SadMxNAvgParam(64, 32, &vpx_highbd_sad64x32_avg_c, 10), 556 SadMxNAvgParam(32, 64, &vpx_highbd_sad32x64_avg_c, 10), 557 SadMxNAvgParam(32, 32, &vpx_highbd_sad32x32_avg_c, 10), 558 SadMxNAvgParam(32, 16, &vpx_highbd_sad32x16_avg_c, 10), 559 SadMxNAvgParam(16, 32, &vpx_highbd_sad16x32_avg_c, 10), 560 SadMxNAvgParam(16, 16, &vpx_highbd_sad16x16_avg_c, 10), 561 SadMxNAvgParam(16, 8, &vpx_highbd_sad16x8_avg_c, 10), 562 SadMxNAvgParam(8, 16, &vpx_highbd_sad8x16_avg_c, 10), 563 SadMxNAvgParam(8, 8, &vpx_highbd_sad8x8_avg_c, 10), 564 SadMxNAvgParam(8, 4, &vpx_highbd_sad8x4_avg_c, 10), 565 SadMxNAvgParam(4, 8, &vpx_highbd_sad4x8_avg_c, 10), 566 SadMxNAvgParam(4, 4, &vpx_highbd_sad4x4_avg_c, 10), 567 SadMxNAvgParam(64, 64, &vpx_highbd_sad64x64_avg_c, 12), 568 SadMxNAvgParam(64, 32, &vpx_highbd_sad64x32_avg_c, 12), 569 SadMxNAvgParam(32, 64, &vpx_highbd_sad32x64_avg_c, 12), 570 SadMxNAvgParam(32, 32, &vpx_highbd_sad32x32_avg_c, 12), 571 SadMxNAvgParam(32, 16, &vpx_highbd_sad32x16_avg_c, 12), 572 SadMxNAvgParam(16, 32, &vpx_highbd_sad16x32_avg_c, 12), 573 SadMxNAvgParam(16, 16, &vpx_highbd_sad16x16_avg_c, 12), 574 SadMxNAvgParam(16, 8, &vpx_highbd_sad16x8_avg_c, 12), 575 SadMxNAvgParam(8, 16, &vpx_highbd_sad8x16_avg_c, 12), 576 SadMxNAvgParam(8, 8, &vpx_highbd_sad8x8_avg_c, 12), 577 SadMxNAvgParam(8, 4, &vpx_highbd_sad8x4_avg_c, 12), 578 SadMxNAvgParam(4, 8, &vpx_highbd_sad4x8_avg_c, 12), 579 SadMxNAvgParam(4, 4, &vpx_highbd_sad4x4_avg_c, 12), 580 #endif // CONFIG_VP9_HIGHBITDEPTH 581 }; 582 INSTANTIATE_TEST_CASE_P(C, SADavgTest, ::testing::ValuesIn(avg_c_tests)); 583 584 const SadMxNx4Param x4d_c_tests[] = { 585 SadMxNx4Param(64, 64, &vpx_sad64x64x4d_c), 586 SadMxNx4Param(64, 32, &vpx_sad64x32x4d_c), 587 SadMxNx4Param(32, 64, &vpx_sad32x64x4d_c), 588 SadMxNx4Param(32, 32, &vpx_sad32x32x4d_c), 589 SadMxNx4Param(32, 16, &vpx_sad32x16x4d_c), 590 SadMxNx4Param(16, 32, &vpx_sad16x32x4d_c), 591 SadMxNx4Param(16, 16, &vpx_sad16x16x4d_c), 592 SadMxNx4Param(16, 8, &vpx_sad16x8x4d_c), 593 SadMxNx4Param(8, 16, &vpx_sad8x16x4d_c), 594 SadMxNx4Param(8, 8, &vpx_sad8x8x4d_c), 595 SadMxNx4Param(8, 4, &vpx_sad8x4x4d_c), 596 SadMxNx4Param(4, 8, &vpx_sad4x8x4d_c), 597 SadMxNx4Param(4, 4, &vpx_sad4x4x4d_c), 598 #if CONFIG_VP9_HIGHBITDEPTH 599 SadMxNx4Param(64, 64, &vpx_highbd_sad64x64x4d_c, 8), 600 SadMxNx4Param(64, 32, &vpx_highbd_sad64x32x4d_c, 8), 601 SadMxNx4Param(32, 64, &vpx_highbd_sad32x64x4d_c, 8), 602 SadMxNx4Param(32, 32, &vpx_highbd_sad32x32x4d_c, 8), 603 SadMxNx4Param(32, 16, &vpx_highbd_sad32x16x4d_c, 8), 604 SadMxNx4Param(16, 32, &vpx_highbd_sad16x32x4d_c, 8), 605 SadMxNx4Param(16, 16, &vpx_highbd_sad16x16x4d_c, 8), 606 SadMxNx4Param(16, 8, &vpx_highbd_sad16x8x4d_c, 8), 607 SadMxNx4Param(8, 16, &vpx_highbd_sad8x16x4d_c, 8), 608 SadMxNx4Param(8, 8, &vpx_highbd_sad8x8x4d_c, 8), 609 SadMxNx4Param(8, 4, &vpx_highbd_sad8x4x4d_c, 8), 610 SadMxNx4Param(4, 8, &vpx_highbd_sad4x8x4d_c, 8), 611 SadMxNx4Param(4, 4, &vpx_highbd_sad4x4x4d_c, 8), 612 SadMxNx4Param(64, 64, &vpx_highbd_sad64x64x4d_c, 10), 613 SadMxNx4Param(64, 32, &vpx_highbd_sad64x32x4d_c, 10), 614 SadMxNx4Param(32, 64, &vpx_highbd_sad32x64x4d_c, 10), 615 SadMxNx4Param(32, 32, &vpx_highbd_sad32x32x4d_c, 10), 616 SadMxNx4Param(32, 16, &vpx_highbd_sad32x16x4d_c, 10), 617 SadMxNx4Param(16, 32, &vpx_highbd_sad16x32x4d_c, 10), 618 SadMxNx4Param(16, 16, &vpx_highbd_sad16x16x4d_c, 10), 619 SadMxNx4Param(16, 8, &vpx_highbd_sad16x8x4d_c, 10), 620 SadMxNx4Param(8, 16, &vpx_highbd_sad8x16x4d_c, 10), 621 SadMxNx4Param(8, 8, &vpx_highbd_sad8x8x4d_c, 10), 622 SadMxNx4Param(8, 4, &vpx_highbd_sad8x4x4d_c, 10), 623 SadMxNx4Param(4, 8, &vpx_highbd_sad4x8x4d_c, 10), 624 SadMxNx4Param(4, 4, &vpx_highbd_sad4x4x4d_c, 10), 625 SadMxNx4Param(64, 64, &vpx_highbd_sad64x64x4d_c, 12), 626 SadMxNx4Param(64, 32, &vpx_highbd_sad64x32x4d_c, 12), 627 SadMxNx4Param(32, 64, &vpx_highbd_sad32x64x4d_c, 12), 628 SadMxNx4Param(32, 32, &vpx_highbd_sad32x32x4d_c, 12), 629 SadMxNx4Param(32, 16, &vpx_highbd_sad32x16x4d_c, 12), 630 SadMxNx4Param(16, 32, &vpx_highbd_sad16x32x4d_c, 12), 631 SadMxNx4Param(16, 16, &vpx_highbd_sad16x16x4d_c, 12), 632 SadMxNx4Param(16, 8, &vpx_highbd_sad16x8x4d_c, 12), 633 SadMxNx4Param(8, 16, &vpx_highbd_sad8x16x4d_c, 12), 634 SadMxNx4Param(8, 8, &vpx_highbd_sad8x8x4d_c, 12), 635 SadMxNx4Param(8, 4, &vpx_highbd_sad8x4x4d_c, 12), 636 SadMxNx4Param(4, 8, &vpx_highbd_sad4x8x4d_c, 12), 637 SadMxNx4Param(4, 4, &vpx_highbd_sad4x4x4d_c, 12), 638 #endif // CONFIG_VP9_HIGHBITDEPTH 639 }; 640 INSTANTIATE_TEST_CASE_P(C, SADx4Test, ::testing::ValuesIn(x4d_c_tests)); 641 642 //------------------------------------------------------------------------------ 643 // ARM functions 644 #if HAVE_NEON 645 const SadMxNParam neon_tests[] = { 646 SadMxNParam(64, 64, &vpx_sad64x64_neon), 647 SadMxNParam(64, 32, &vpx_sad64x32_neon), 648 SadMxNParam(32, 32, &vpx_sad32x32_neon), 649 SadMxNParam(16, 32, &vpx_sad16x32_neon), 650 SadMxNParam(16, 16, &vpx_sad16x16_neon), 651 SadMxNParam(16, 8, &vpx_sad16x8_neon), 652 SadMxNParam(8, 16, &vpx_sad8x16_neon), 653 SadMxNParam(8, 8, &vpx_sad8x8_neon), 654 SadMxNParam(8, 4, &vpx_sad8x4_neon), 655 SadMxNParam(4, 8, &vpx_sad4x8_neon), 656 SadMxNParam(4, 4, &vpx_sad4x4_neon), 657 }; 658 INSTANTIATE_TEST_CASE_P(NEON, SADTest, ::testing::ValuesIn(neon_tests)); 659 660 const SadMxNAvgParam avg_neon_tests[] = { 661 SadMxNAvgParam(64, 64, &vpx_sad64x64_avg_neon), 662 SadMxNAvgParam(64, 32, &vpx_sad64x32_avg_neon), 663 SadMxNAvgParam(32, 64, &vpx_sad32x64_avg_neon), 664 SadMxNAvgParam(32, 32, &vpx_sad32x32_avg_neon), 665 SadMxNAvgParam(32, 16, &vpx_sad32x16_avg_neon), 666 SadMxNAvgParam(16, 32, &vpx_sad16x32_avg_neon), 667 SadMxNAvgParam(16, 16, &vpx_sad16x16_avg_neon), 668 SadMxNAvgParam(16, 8, &vpx_sad16x8_avg_neon), 669 SadMxNAvgParam(8, 16, &vpx_sad8x16_avg_neon), 670 SadMxNAvgParam(8, 8, &vpx_sad8x8_avg_neon), 671 SadMxNAvgParam(8, 4, &vpx_sad8x4_avg_neon), 672 SadMxNAvgParam(4, 8, &vpx_sad4x8_avg_neon), 673 SadMxNAvgParam(4, 4, &vpx_sad4x4_avg_neon), 674 }; 675 INSTANTIATE_TEST_CASE_P(NEON, SADavgTest, ::testing::ValuesIn(avg_neon_tests)); 676 677 const SadMxNx4Param x4d_neon_tests[] = { 678 SadMxNx4Param(64, 64, &vpx_sad64x64x4d_neon), 679 SadMxNx4Param(64, 32, &vpx_sad64x32x4d_neon), 680 SadMxNx4Param(32, 64, &vpx_sad32x64x4d_neon), 681 SadMxNx4Param(32, 32, &vpx_sad32x32x4d_neon), 682 SadMxNx4Param(32, 16, &vpx_sad32x16x4d_neon), 683 SadMxNx4Param(16, 32, &vpx_sad16x32x4d_neon), 684 SadMxNx4Param(16, 16, &vpx_sad16x16x4d_neon), 685 SadMxNx4Param(16, 8, &vpx_sad16x8x4d_neon), 686 SadMxNx4Param(8, 16, &vpx_sad8x16x4d_neon), 687 SadMxNx4Param(8, 8, &vpx_sad8x8x4d_neon), 688 SadMxNx4Param(8, 4, &vpx_sad8x4x4d_neon), 689 SadMxNx4Param(4, 8, &vpx_sad4x8x4d_neon), 690 SadMxNx4Param(4, 4, &vpx_sad4x4x4d_neon), 691 }; 692 INSTANTIATE_TEST_CASE_P(NEON, SADx4Test, ::testing::ValuesIn(x4d_neon_tests)); 693 #endif // HAVE_NEON 694 695 //------------------------------------------------------------------------------ 696 // x86 functions 697 #if HAVE_SSE2 698 const SadMxNParam sse2_tests[] = { 699 SadMxNParam(64, 64, &vpx_sad64x64_sse2), 700 SadMxNParam(64, 32, &vpx_sad64x32_sse2), 701 SadMxNParam(32, 64, &vpx_sad32x64_sse2), 702 SadMxNParam(32, 32, &vpx_sad32x32_sse2), 703 SadMxNParam(32, 16, &vpx_sad32x16_sse2), 704 SadMxNParam(16, 32, &vpx_sad16x32_sse2), 705 SadMxNParam(16, 16, &vpx_sad16x16_sse2), 706 SadMxNParam(16, 8, &vpx_sad16x8_sse2), 707 SadMxNParam(8, 16, &vpx_sad8x16_sse2), 708 SadMxNParam(8, 8, &vpx_sad8x8_sse2), 709 SadMxNParam(8, 4, &vpx_sad8x4_sse2), 710 SadMxNParam(4, 8, &vpx_sad4x8_sse2), 711 SadMxNParam(4, 4, &vpx_sad4x4_sse2), 712 #if CONFIG_VP9_HIGHBITDEPTH 713 SadMxNParam(64, 64, &vpx_highbd_sad64x64_sse2, 8), 714 SadMxNParam(64, 32, &vpx_highbd_sad64x32_sse2, 8), 715 SadMxNParam(32, 64, &vpx_highbd_sad32x64_sse2, 8), 716 SadMxNParam(32, 32, &vpx_highbd_sad32x32_sse2, 8), 717 SadMxNParam(32, 16, &vpx_highbd_sad32x16_sse2, 8), 718 SadMxNParam(16, 32, &vpx_highbd_sad16x32_sse2, 8), 719 SadMxNParam(16, 16, &vpx_highbd_sad16x16_sse2, 8), 720 SadMxNParam(16, 8, &vpx_highbd_sad16x8_sse2, 8), 721 SadMxNParam(8, 16, &vpx_highbd_sad8x16_sse2, 8), 722 SadMxNParam(8, 8, &vpx_highbd_sad8x8_sse2, 8), 723 SadMxNParam(8, 4, &vpx_highbd_sad8x4_sse2, 8), 724 SadMxNParam(64, 64, &vpx_highbd_sad64x64_sse2, 10), 725 SadMxNParam(64, 32, &vpx_highbd_sad64x32_sse2, 10), 726 SadMxNParam(32, 64, &vpx_highbd_sad32x64_sse2, 10), 727 SadMxNParam(32, 32, &vpx_highbd_sad32x32_sse2, 10), 728 SadMxNParam(32, 16, &vpx_highbd_sad32x16_sse2, 10), 729 SadMxNParam(16, 32, &vpx_highbd_sad16x32_sse2, 10), 730 SadMxNParam(16, 16, &vpx_highbd_sad16x16_sse2, 10), 731 SadMxNParam(16, 8, &vpx_highbd_sad16x8_sse2, 10), 732 SadMxNParam(8, 16, &vpx_highbd_sad8x16_sse2, 10), 733 SadMxNParam(8, 8, &vpx_highbd_sad8x8_sse2, 10), 734 SadMxNParam(8, 4, &vpx_highbd_sad8x4_sse2, 10), 735 SadMxNParam(64, 64, &vpx_highbd_sad64x64_sse2, 12), 736 SadMxNParam(64, 32, &vpx_highbd_sad64x32_sse2, 12), 737 SadMxNParam(32, 64, &vpx_highbd_sad32x64_sse2, 12), 738 SadMxNParam(32, 32, &vpx_highbd_sad32x32_sse2, 12), 739 SadMxNParam(32, 16, &vpx_highbd_sad32x16_sse2, 12), 740 SadMxNParam(16, 32, &vpx_highbd_sad16x32_sse2, 12), 741 SadMxNParam(16, 16, &vpx_highbd_sad16x16_sse2, 12), 742 SadMxNParam(16, 8, &vpx_highbd_sad16x8_sse2, 12), 743 SadMxNParam(8, 16, &vpx_highbd_sad8x16_sse2, 12), 744 SadMxNParam(8, 8, &vpx_highbd_sad8x8_sse2, 12), 745 SadMxNParam(8, 4, &vpx_highbd_sad8x4_sse2, 12), 746 #endif // CONFIG_VP9_HIGHBITDEPTH 747 }; 748 INSTANTIATE_TEST_CASE_P(SSE2, SADTest, ::testing::ValuesIn(sse2_tests)); 749 750 const SadMxNAvgParam avg_sse2_tests[] = { 751 SadMxNAvgParam(64, 64, &vpx_sad64x64_avg_sse2), 752 SadMxNAvgParam(64, 32, &vpx_sad64x32_avg_sse2), 753 SadMxNAvgParam(32, 64, &vpx_sad32x64_avg_sse2), 754 SadMxNAvgParam(32, 32, &vpx_sad32x32_avg_sse2), 755 SadMxNAvgParam(32, 16, &vpx_sad32x16_avg_sse2), 756 SadMxNAvgParam(16, 32, &vpx_sad16x32_avg_sse2), 757 SadMxNAvgParam(16, 16, &vpx_sad16x16_avg_sse2), 758 SadMxNAvgParam(16, 8, &vpx_sad16x8_avg_sse2), 759 SadMxNAvgParam(8, 16, &vpx_sad8x16_avg_sse2), 760 SadMxNAvgParam(8, 8, &vpx_sad8x8_avg_sse2), 761 SadMxNAvgParam(8, 4, &vpx_sad8x4_avg_sse2), 762 SadMxNAvgParam(4, 8, &vpx_sad4x8_avg_sse2), 763 SadMxNAvgParam(4, 4, &vpx_sad4x4_avg_sse2), 764 #if CONFIG_VP9_HIGHBITDEPTH 765 SadMxNAvgParam(64, 64, &vpx_highbd_sad64x64_avg_sse2, 8), 766 SadMxNAvgParam(64, 32, &vpx_highbd_sad64x32_avg_sse2, 8), 767 SadMxNAvgParam(32, 64, &vpx_highbd_sad32x64_avg_sse2, 8), 768 SadMxNAvgParam(32, 32, &vpx_highbd_sad32x32_avg_sse2, 8), 769 SadMxNAvgParam(32, 16, &vpx_highbd_sad32x16_avg_sse2, 8), 770 SadMxNAvgParam(16, 32, &vpx_highbd_sad16x32_avg_sse2, 8), 771 SadMxNAvgParam(16, 16, &vpx_highbd_sad16x16_avg_sse2, 8), 772 SadMxNAvgParam(16, 8, &vpx_highbd_sad16x8_avg_sse2, 8), 773 SadMxNAvgParam(8, 16, &vpx_highbd_sad8x16_avg_sse2, 8), 774 SadMxNAvgParam(8, 8, &vpx_highbd_sad8x8_avg_sse2, 8), 775 SadMxNAvgParam(8, 4, &vpx_highbd_sad8x4_avg_sse2, 8), 776 SadMxNAvgParam(64, 64, &vpx_highbd_sad64x64_avg_sse2, 10), 777 SadMxNAvgParam(64, 32, &vpx_highbd_sad64x32_avg_sse2, 10), 778 SadMxNAvgParam(32, 64, &vpx_highbd_sad32x64_avg_sse2, 10), 779 SadMxNAvgParam(32, 32, &vpx_highbd_sad32x32_avg_sse2, 10), 780 SadMxNAvgParam(32, 16, &vpx_highbd_sad32x16_avg_sse2, 10), 781 SadMxNAvgParam(16, 32, &vpx_highbd_sad16x32_avg_sse2, 10), 782 SadMxNAvgParam(16, 16, &vpx_highbd_sad16x16_avg_sse2, 10), 783 SadMxNAvgParam(16, 8, &vpx_highbd_sad16x8_avg_sse2, 10), 784 SadMxNAvgParam(8, 16, &vpx_highbd_sad8x16_avg_sse2, 10), 785 SadMxNAvgParam(8, 8, &vpx_highbd_sad8x8_avg_sse2, 10), 786 SadMxNAvgParam(8, 4, &vpx_highbd_sad8x4_avg_sse2, 10), 787 SadMxNAvgParam(64, 64, &vpx_highbd_sad64x64_avg_sse2, 12), 788 SadMxNAvgParam(64, 32, &vpx_highbd_sad64x32_avg_sse2, 12), 789 SadMxNAvgParam(32, 64, &vpx_highbd_sad32x64_avg_sse2, 12), 790 SadMxNAvgParam(32, 32, &vpx_highbd_sad32x32_avg_sse2, 12), 791 SadMxNAvgParam(32, 16, &vpx_highbd_sad32x16_avg_sse2, 12), 792 SadMxNAvgParam(16, 32, &vpx_highbd_sad16x32_avg_sse2, 12), 793 SadMxNAvgParam(16, 16, &vpx_highbd_sad16x16_avg_sse2, 12), 794 SadMxNAvgParam(16, 8, &vpx_highbd_sad16x8_avg_sse2, 12), 795 SadMxNAvgParam(8, 16, &vpx_highbd_sad8x16_avg_sse2, 12), 796 SadMxNAvgParam(8, 8, &vpx_highbd_sad8x8_avg_sse2, 12), 797 SadMxNAvgParam(8, 4, &vpx_highbd_sad8x4_avg_sse2, 12), 798 #endif // CONFIG_VP9_HIGHBITDEPTH 799 }; 800 INSTANTIATE_TEST_CASE_P(SSE2, SADavgTest, ::testing::ValuesIn(avg_sse2_tests)); 801 802 const SadMxNx4Param x4d_sse2_tests[] = { 803 SadMxNx4Param(64, 64, &vpx_sad64x64x4d_sse2), 804 SadMxNx4Param(64, 32, &vpx_sad64x32x4d_sse2), 805 SadMxNx4Param(32, 64, &vpx_sad32x64x4d_sse2), 806 SadMxNx4Param(32, 32, &vpx_sad32x32x4d_sse2), 807 SadMxNx4Param(32, 16, &vpx_sad32x16x4d_sse2), 808 SadMxNx4Param(16, 32, &vpx_sad16x32x4d_sse2), 809 SadMxNx4Param(16, 16, &vpx_sad16x16x4d_sse2), 810 SadMxNx4Param(16, 8, &vpx_sad16x8x4d_sse2), 811 SadMxNx4Param(8, 16, &vpx_sad8x16x4d_sse2), 812 SadMxNx4Param(8, 8, &vpx_sad8x8x4d_sse2), 813 SadMxNx4Param(8, 4, &vpx_sad8x4x4d_sse2), 814 SadMxNx4Param(4, 8, &vpx_sad4x8x4d_sse2), 815 SadMxNx4Param(4, 4, &vpx_sad4x4x4d_sse2), 816 #if CONFIG_VP9_HIGHBITDEPTH 817 SadMxNx4Param(64, 64, &vpx_highbd_sad64x64x4d_sse2, 8), 818 SadMxNx4Param(64, 32, &vpx_highbd_sad64x32x4d_sse2, 8), 819 SadMxNx4Param(32, 64, &vpx_highbd_sad32x64x4d_sse2, 8), 820 SadMxNx4Param(32, 32, &vpx_highbd_sad32x32x4d_sse2, 8), 821 SadMxNx4Param(32, 16, &vpx_highbd_sad32x16x4d_sse2, 8), 822 SadMxNx4Param(16, 32, &vpx_highbd_sad16x32x4d_sse2, 8), 823 SadMxNx4Param(16, 16, &vpx_highbd_sad16x16x4d_sse2, 8), 824 SadMxNx4Param(16, 8, &vpx_highbd_sad16x8x4d_sse2, 8), 825 SadMxNx4Param(8, 16, &vpx_highbd_sad8x16x4d_sse2, 8), 826 SadMxNx4Param(8, 8, &vpx_highbd_sad8x8x4d_sse2, 8), 827 SadMxNx4Param(8, 4, &vpx_highbd_sad8x4x4d_sse2, 8), 828 SadMxNx4Param(4, 8, &vpx_highbd_sad4x8x4d_sse2, 8), 829 SadMxNx4Param(4, 4, &vpx_highbd_sad4x4x4d_sse2, 8), 830 SadMxNx4Param(64, 64, &vpx_highbd_sad64x64x4d_sse2, 10), 831 SadMxNx4Param(64, 32, &vpx_highbd_sad64x32x4d_sse2, 10), 832 SadMxNx4Param(32, 64, &vpx_highbd_sad32x64x4d_sse2, 10), 833 SadMxNx4Param(32, 32, &vpx_highbd_sad32x32x4d_sse2, 10), 834 SadMxNx4Param(32, 16, &vpx_highbd_sad32x16x4d_sse2, 10), 835 SadMxNx4Param(16, 32, &vpx_highbd_sad16x32x4d_sse2, 10), 836 SadMxNx4Param(16, 16, &vpx_highbd_sad16x16x4d_sse2, 10), 837 SadMxNx4Param(16, 8, &vpx_highbd_sad16x8x4d_sse2, 10), 838 SadMxNx4Param(8, 16, &vpx_highbd_sad8x16x4d_sse2, 10), 839 SadMxNx4Param(8, 8, &vpx_highbd_sad8x8x4d_sse2, 10), 840 SadMxNx4Param(8, 4, &vpx_highbd_sad8x4x4d_sse2, 10), 841 SadMxNx4Param(4, 8, &vpx_highbd_sad4x8x4d_sse2, 10), 842 SadMxNx4Param(4, 4, &vpx_highbd_sad4x4x4d_sse2, 10), 843 SadMxNx4Param(64, 64, &vpx_highbd_sad64x64x4d_sse2, 12), 844 SadMxNx4Param(64, 32, &vpx_highbd_sad64x32x4d_sse2, 12), 845 SadMxNx4Param(32, 64, &vpx_highbd_sad32x64x4d_sse2, 12), 846 SadMxNx4Param(32, 32, &vpx_highbd_sad32x32x4d_sse2, 12), 847 SadMxNx4Param(32, 16, &vpx_highbd_sad32x16x4d_sse2, 12), 848 SadMxNx4Param(16, 32, &vpx_highbd_sad16x32x4d_sse2, 12), 849 SadMxNx4Param(16, 16, &vpx_highbd_sad16x16x4d_sse2, 12), 850 SadMxNx4Param(16, 8, &vpx_highbd_sad16x8x4d_sse2, 12), 851 SadMxNx4Param(8, 16, &vpx_highbd_sad8x16x4d_sse2, 12), 852 SadMxNx4Param(8, 8, &vpx_highbd_sad8x8x4d_sse2, 12), 853 SadMxNx4Param(8, 4, &vpx_highbd_sad8x4x4d_sse2, 12), 854 SadMxNx4Param(4, 8, &vpx_highbd_sad4x8x4d_sse2, 12), 855 SadMxNx4Param(4, 4, &vpx_highbd_sad4x4x4d_sse2, 12), 856 #endif // CONFIG_VP9_HIGHBITDEPTH 857 }; 858 INSTANTIATE_TEST_CASE_P(SSE2, SADx4Test, ::testing::ValuesIn(x4d_sse2_tests)); 859 #endif // HAVE_SSE2 860 861 #if HAVE_SSE3 862 // Only functions are x3, which do not have tests. 863 #endif // HAVE_SSE3 864 865 #if HAVE_SSSE3 866 // Only functions are x3, which do not have tests. 867 #endif // HAVE_SSSE3 868 869 #if HAVE_SSE4_1 870 // Only functions are x8, which do not have tests. 871 #endif // HAVE_SSE4_1 872 873 #if HAVE_AVX2 874 const SadMxNParam avx2_tests[] = { 875 SadMxNParam(64, 64, &vpx_sad64x64_avx2), 876 SadMxNParam(64, 32, &vpx_sad64x32_avx2), 877 SadMxNParam(32, 64, &vpx_sad32x64_avx2), 878 SadMxNParam(32, 32, &vpx_sad32x32_avx2), 879 SadMxNParam(32, 16, &vpx_sad32x16_avx2), 880 }; 881 INSTANTIATE_TEST_CASE_P(AVX2, SADTest, ::testing::ValuesIn(avx2_tests)); 882 883 const SadMxNAvgParam avg_avx2_tests[] = { 884 SadMxNAvgParam(64, 64, &vpx_sad64x64_avg_avx2), 885 SadMxNAvgParam(64, 32, &vpx_sad64x32_avg_avx2), 886 SadMxNAvgParam(32, 64, &vpx_sad32x64_avg_avx2), 887 SadMxNAvgParam(32, 32, &vpx_sad32x32_avg_avx2), 888 SadMxNAvgParam(32, 16, &vpx_sad32x16_avg_avx2), 889 }; 890 INSTANTIATE_TEST_CASE_P(AVX2, SADavgTest, ::testing::ValuesIn(avg_avx2_tests)); 891 892 const SadMxNx4Param x4d_avx2_tests[] = { 893 SadMxNx4Param(64, 64, &vpx_sad64x64x4d_avx2), 894 SadMxNx4Param(32, 32, &vpx_sad32x32x4d_avx2), 895 }; 896 INSTANTIATE_TEST_CASE_P(AVX2, SADx4Test, ::testing::ValuesIn(x4d_avx2_tests)); 897 #endif // HAVE_AVX2 898 899 #if HAVE_AVX512 900 const SadMxNx4Param x4d_avx512_tests[] = { 901 SadMxNx4Param(64, 64, &vpx_sad64x64x4d_avx512), 902 }; 903 INSTANTIATE_TEST_CASE_P(AVX512, SADx4Test, 904 ::testing::ValuesIn(x4d_avx512_tests)); 905 #endif // HAVE_AVX512 906 907 //------------------------------------------------------------------------------ 908 // MIPS functions 909 #if HAVE_MSA 910 const SadMxNParam msa_tests[] = { 911 SadMxNParam(64, 64, &vpx_sad64x64_msa), 912 SadMxNParam(64, 32, &vpx_sad64x32_msa), 913 SadMxNParam(32, 64, &vpx_sad32x64_msa), 914 SadMxNParam(32, 32, &vpx_sad32x32_msa), 915 SadMxNParam(32, 16, &vpx_sad32x16_msa), 916 SadMxNParam(16, 32, &vpx_sad16x32_msa), 917 SadMxNParam(16, 16, &vpx_sad16x16_msa), 918 SadMxNParam(16, 8, &vpx_sad16x8_msa), 919 SadMxNParam(8, 16, &vpx_sad8x16_msa), 920 SadMxNParam(8, 8, &vpx_sad8x8_msa), 921 SadMxNParam(8, 4, &vpx_sad8x4_msa), 922 SadMxNParam(4, 8, &vpx_sad4x8_msa), 923 SadMxNParam(4, 4, &vpx_sad4x4_msa), 924 }; 925 INSTANTIATE_TEST_CASE_P(MSA, SADTest, ::testing::ValuesIn(msa_tests)); 926 927 const SadMxNAvgParam avg_msa_tests[] = { 928 SadMxNAvgParam(64, 64, &vpx_sad64x64_avg_msa), 929 SadMxNAvgParam(64, 32, &vpx_sad64x32_avg_msa), 930 SadMxNAvgParam(32, 64, &vpx_sad32x64_avg_msa), 931 SadMxNAvgParam(32, 32, &vpx_sad32x32_avg_msa), 932 SadMxNAvgParam(32, 16, &vpx_sad32x16_avg_msa), 933 SadMxNAvgParam(16, 32, &vpx_sad16x32_avg_msa), 934 SadMxNAvgParam(16, 16, &vpx_sad16x16_avg_msa), 935 SadMxNAvgParam(16, 8, &vpx_sad16x8_avg_msa), 936 SadMxNAvgParam(8, 16, &vpx_sad8x16_avg_msa), 937 SadMxNAvgParam(8, 8, &vpx_sad8x8_avg_msa), 938 SadMxNAvgParam(8, 4, &vpx_sad8x4_avg_msa), 939 SadMxNAvgParam(4, 8, &vpx_sad4x8_avg_msa), 940 SadMxNAvgParam(4, 4, &vpx_sad4x4_avg_msa), 941 }; 942 INSTANTIATE_TEST_CASE_P(MSA, SADavgTest, ::testing::ValuesIn(avg_msa_tests)); 943 944 const SadMxNx4Param x4d_msa_tests[] = { 945 SadMxNx4Param(64, 64, &vpx_sad64x64x4d_msa), 946 SadMxNx4Param(64, 32, &vpx_sad64x32x4d_msa), 947 SadMxNx4Param(32, 64, &vpx_sad32x64x4d_msa), 948 SadMxNx4Param(32, 32, &vpx_sad32x32x4d_msa), 949 SadMxNx4Param(32, 16, &vpx_sad32x16x4d_msa), 950 SadMxNx4Param(16, 32, &vpx_sad16x32x4d_msa), 951 SadMxNx4Param(16, 16, &vpx_sad16x16x4d_msa), 952 SadMxNx4Param(16, 8, &vpx_sad16x8x4d_msa), 953 SadMxNx4Param(8, 16, &vpx_sad8x16x4d_msa), 954 SadMxNx4Param(8, 8, &vpx_sad8x8x4d_msa), 955 SadMxNx4Param(8, 4, &vpx_sad8x4x4d_msa), 956 SadMxNx4Param(4, 8, &vpx_sad4x8x4d_msa), 957 SadMxNx4Param(4, 4, &vpx_sad4x4x4d_msa), 958 }; 959 INSTANTIATE_TEST_CASE_P(MSA, SADx4Test, ::testing::ValuesIn(x4d_msa_tests)); 960 #endif // HAVE_MSA 961 962 //------------------------------------------------------------------------------ 963 // VSX functions 964 #if HAVE_VSX 965 const SadMxNParam vsx_tests[] = { 966 SadMxNParam(64, 64, &vpx_sad64x64_vsx), 967 SadMxNParam(64, 32, &vpx_sad64x32_vsx), 968 SadMxNParam(32, 64, &vpx_sad32x64_vsx), 969 SadMxNParam(32, 32, &vpx_sad32x32_vsx), 970 SadMxNParam(32, 16, &vpx_sad32x16_vsx), 971 SadMxNParam(16, 32, &vpx_sad16x32_vsx), 972 SadMxNParam(16, 16, &vpx_sad16x16_vsx), 973 SadMxNParam(16, 8, &vpx_sad16x8_vsx), 974 }; 975 INSTANTIATE_TEST_CASE_P(VSX, SADTest, ::testing::ValuesIn(vsx_tests)); 976 977 const SadMxNAvgParam avg_vsx_tests[] = { 978 SadMxNAvgParam(64, 64, &vpx_sad64x64_avg_vsx), 979 SadMxNAvgParam(64, 32, &vpx_sad64x32_avg_vsx), 980 SadMxNAvgParam(32, 64, &vpx_sad32x64_avg_vsx), 981 SadMxNAvgParam(32, 32, &vpx_sad32x32_avg_vsx), 982 SadMxNAvgParam(32, 16, &vpx_sad32x16_avg_vsx), 983 SadMxNAvgParam(16, 32, &vpx_sad16x32_avg_vsx), 984 SadMxNAvgParam(16, 16, &vpx_sad16x16_avg_vsx), 985 SadMxNAvgParam(16, 8, &vpx_sad16x8_avg_vsx), 986 }; 987 INSTANTIATE_TEST_CASE_P(VSX, SADavgTest, ::testing::ValuesIn(avg_vsx_tests)); 988 989 const SadMxNx4Param x4d_vsx_tests[] = { 990 SadMxNx4Param(64, 64, &vpx_sad64x64x4d_vsx), 991 SadMxNx4Param(64, 32, &vpx_sad64x32x4d_vsx), 992 SadMxNx4Param(32, 64, &vpx_sad32x64x4d_vsx), 993 SadMxNx4Param(32, 32, &vpx_sad32x32x4d_vsx), 994 SadMxNx4Param(32, 16, &vpx_sad32x16x4d_vsx), 995 SadMxNx4Param(16, 32, &vpx_sad16x32x4d_vsx), 996 SadMxNx4Param(16, 16, &vpx_sad16x16x4d_vsx), 997 SadMxNx4Param(16, 8, &vpx_sad16x8x4d_vsx), 998 }; 999 INSTANTIATE_TEST_CASE_P(VSX, SADx4Test, ::testing::ValuesIn(x4d_vsx_tests)); 1000 #endif // HAVE_VSX 1001 1002 //------------------------------------------------------------------------------ 1003 // Loongson functions 1004 #if HAVE_MMI 1005 const SadMxNParam mmi_tests[] = { 1006 SadMxNParam(64, 64, &vpx_sad64x64_mmi), 1007 SadMxNParam(64, 32, &vpx_sad64x32_mmi), 1008 SadMxNParam(32, 64, &vpx_sad32x64_mmi), 1009 SadMxNParam(32, 32, &vpx_sad32x32_mmi), 1010 SadMxNParam(32, 16, &vpx_sad32x16_mmi), 1011 SadMxNParam(16, 32, &vpx_sad16x32_mmi), 1012 SadMxNParam(16, 16, &vpx_sad16x16_mmi), 1013 SadMxNParam(16, 8, &vpx_sad16x8_mmi), 1014 SadMxNParam(8, 16, &vpx_sad8x16_mmi), 1015 SadMxNParam(8, 8, &vpx_sad8x8_mmi), 1016 SadMxNParam(8, 4, &vpx_sad8x4_mmi), 1017 SadMxNParam(4, 8, &vpx_sad4x8_mmi), 1018 SadMxNParam(4, 4, &vpx_sad4x4_mmi), 1019 }; 1020 INSTANTIATE_TEST_CASE_P(MMI, SADTest, ::testing::ValuesIn(mmi_tests)); 1021 1022 const SadMxNAvgParam avg_mmi_tests[] = { 1023 SadMxNAvgParam(64, 64, &vpx_sad64x64_avg_mmi), 1024 SadMxNAvgParam(64, 32, &vpx_sad64x32_avg_mmi), 1025 SadMxNAvgParam(32, 64, &vpx_sad32x64_avg_mmi), 1026 SadMxNAvgParam(32, 32, &vpx_sad32x32_avg_mmi), 1027 SadMxNAvgParam(32, 16, &vpx_sad32x16_avg_mmi), 1028 SadMxNAvgParam(16, 32, &vpx_sad16x32_avg_mmi), 1029 SadMxNAvgParam(16, 16, &vpx_sad16x16_avg_mmi), 1030 SadMxNAvgParam(16, 8, &vpx_sad16x8_avg_mmi), 1031 SadMxNAvgParam(8, 16, &vpx_sad8x16_avg_mmi), 1032 SadMxNAvgParam(8, 8, &vpx_sad8x8_avg_mmi), 1033 SadMxNAvgParam(8, 4, &vpx_sad8x4_avg_mmi), 1034 SadMxNAvgParam(4, 8, &vpx_sad4x8_avg_mmi), 1035 SadMxNAvgParam(4, 4, &vpx_sad4x4_avg_mmi), 1036 }; 1037 INSTANTIATE_TEST_CASE_P(MMI, SADavgTest, ::testing::ValuesIn(avg_mmi_tests)); 1038 1039 const SadMxNx4Param x4d_mmi_tests[] = { 1040 SadMxNx4Param(64, 64, &vpx_sad64x64x4d_mmi), 1041 SadMxNx4Param(64, 32, &vpx_sad64x32x4d_mmi), 1042 SadMxNx4Param(32, 64, &vpx_sad32x64x4d_mmi), 1043 SadMxNx4Param(32, 32, &vpx_sad32x32x4d_mmi), 1044 SadMxNx4Param(32, 16, &vpx_sad32x16x4d_mmi), 1045 SadMxNx4Param(16, 32, &vpx_sad16x32x4d_mmi), 1046 SadMxNx4Param(16, 16, &vpx_sad16x16x4d_mmi), 1047 SadMxNx4Param(16, 8, &vpx_sad16x8x4d_mmi), 1048 SadMxNx4Param(8, 16, &vpx_sad8x16x4d_mmi), 1049 SadMxNx4Param(8, 8, &vpx_sad8x8x4d_mmi), 1050 SadMxNx4Param(8, 4, &vpx_sad8x4x4d_mmi), 1051 SadMxNx4Param(4, 8, &vpx_sad4x8x4d_mmi), 1052 SadMxNx4Param(4, 4, &vpx_sad4x4x4d_mmi), 1053 }; 1054 INSTANTIATE_TEST_CASE_P(MMI, SADx4Test, ::testing::ValuesIn(x4d_mmi_tests)); 1055 #endif // HAVE_MMI 1056 } // namespace 1057