Upstream version 5.34.104.0
[platform/framework/web/crosswalk.git] / src / third_party / libvpx / source / libvpx / test / sad_test.cc
1 /*
2  *  Copyright (c) 2012 The WebM project authors. All Rights Reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10
11
12 #include <string.h>
13 #include <limits.h>
14 #include <stdio.h>
15
16 #include "./vpx_config.h"
17 #if CONFIG_VP8_ENCODER
18 #include "./vp8_rtcd.h"
19 #endif
20 #if CONFIG_VP9_ENCODER
21 #include "./vp9_rtcd.h"
22 #endif
23 #include "vpx_mem/vpx_mem.h"
24
25 #include "test/acm_random.h"
26 #include "test/clear_system_state.h"
27 #include "test/register_state_check.h"
28 #include "test/util.h"
29 #include "third_party/googletest/src/include/gtest/gtest.h"
30
31
32 typedef unsigned int (*sad_m_by_n_fn_t)(const unsigned char *source_ptr,
33                                         int source_stride,
34                                         const unsigned char *reference_ptr,
35                                         int reference_stride,
36                                         unsigned int max_sad);
37 typedef std::tr1::tuple<int, int, sad_m_by_n_fn_t> sad_m_by_n_test_param_t;
38
39 typedef void (*sad_n_by_n_by_4_fn_t)(const uint8_t *src_ptr,
40                                      int src_stride,
41                                      const unsigned char * const ref_ptr[],
42                                      int ref_stride,
43                                      unsigned int *sad_array);
44 typedef std::tr1::tuple<int, int, sad_n_by_n_by_4_fn_t>
45         sad_n_by_n_by_4_test_param_t;
46
47 using libvpx_test::ACMRandom;
48
49 namespace {
50 class SADTestBase : public ::testing::Test {
51  public:
52   SADTestBase(int width, int height) : width_(width), height_(height) {}
53
54   static void SetUpTestCase() {
55     source_data_ = reinterpret_cast<uint8_t*>(
56         vpx_memalign(kDataAlignment, kDataBlockSize));
57     reference_data_ = reinterpret_cast<uint8_t*>(
58         vpx_memalign(kDataAlignment, kDataBufferSize));
59   }
60
61   static void TearDownTestCase() {
62     vpx_free(source_data_);
63     source_data_ = NULL;
64     vpx_free(reference_data_);
65     reference_data_ = NULL;
66   }
67
68   virtual void TearDown() {
69     libvpx_test::ClearSystemState();
70   }
71
72  protected:
73   // Handle blocks up to 4 blocks 64x64 with stride up to 128
74   static const int kDataAlignment = 16;
75   static const int kDataBlockSize = 64 * 128;
76   static const int kDataBufferSize = 4 * kDataBlockSize;
77
78   virtual void SetUp() {
79     source_stride_ = (width_ + 31) & ~31;
80     reference_stride_ = width_ * 2;
81     rnd_.Reset(ACMRandom::DeterministicSeed());
82   }
83
84   virtual uint8_t* GetReference(int block_idx) {
85     return reference_data_ + block_idx * kDataBlockSize;
86   }
87
88   // Sum of Absolute Differences. Given two blocks, calculate the absolute
89   // difference between two pixels in the same relative location; accumulate.
90   unsigned int ReferenceSAD(unsigned int max_sad, int block_idx = 0) {
91     unsigned int sad = 0;
92     const uint8_t* const reference = GetReference(block_idx);
93
94     for (int h = 0; h < height_; ++h) {
95       for (int w = 0; w < width_; ++w) {
96         sad += abs(source_data_[h * source_stride_ + w]
97                - reference[h * reference_stride_ + w]);
98       }
99       if (sad > max_sad) {
100         break;
101       }
102     }
103     return sad;
104   }
105
106   void FillConstant(uint8_t *data, int stride, uint8_t fill_constant) {
107     for (int h = 0; h < height_; ++h) {
108       for (int w = 0; w < width_; ++w) {
109         data[h * stride + w] = fill_constant;
110       }
111     }
112   }
113
114   void FillRandom(uint8_t *data, int stride) {
115     for (int h = 0; h < height_; ++h) {
116       for (int w = 0; w < width_; ++w) {
117         data[h * stride + w] = rnd_.Rand8();
118       }
119     }
120   }
121
122   int width_, height_;
123   static uint8_t* source_data_;
124   int source_stride_;
125   static uint8_t* reference_data_;
126   int reference_stride_;
127
128   ACMRandom rnd_;
129 };
130
131 class SADTest : public SADTestBase,
132     public ::testing::WithParamInterface<sad_m_by_n_test_param_t> {
133  public:
134   SADTest() : SADTestBase(GET_PARAM(0), GET_PARAM(1)) {}
135
136  protected:
137   unsigned int SAD(unsigned int max_sad, int block_idx = 0) {
138     unsigned int ret;
139     const uint8_t* const reference = GetReference(block_idx);
140
141     REGISTER_STATE_CHECK(ret = GET_PARAM(2)(source_data_, source_stride_,
142                                             reference, reference_stride_,
143                                             max_sad));
144     return ret;
145   }
146
147   void CheckSad(unsigned int max_sad) {
148     unsigned int reference_sad, exp_sad;
149
150     reference_sad = ReferenceSAD(max_sad);
151     exp_sad = SAD(max_sad);
152
153     if (reference_sad <= max_sad) {
154       ASSERT_EQ(exp_sad, reference_sad);
155     } else {
156       // Alternative implementations are not required to check max_sad
157       ASSERT_GE(exp_sad, reference_sad);
158     }
159   }
160 };
161
162 class SADx4Test : public SADTestBase,
163     public ::testing::WithParamInterface<sad_n_by_n_by_4_test_param_t> {
164  public:
165   SADx4Test() : SADTestBase(GET_PARAM(0), GET_PARAM(1)) {}
166
167  protected:
168   void SADs(unsigned int *results) {
169     const uint8_t* refs[] = {GetReference(0), GetReference(1),
170                              GetReference(2), GetReference(3)};
171
172     REGISTER_STATE_CHECK(GET_PARAM(2)(source_data_, source_stride_,
173                                       refs, reference_stride_,
174                                       results));
175   }
176
177   void CheckSADs() {
178     unsigned int reference_sad, exp_sad[4];
179
180     SADs(exp_sad);
181     for (int block = 0; block < 4; block++) {
182       reference_sad = ReferenceSAD(UINT_MAX, block);
183
184       EXPECT_EQ(exp_sad[block], reference_sad) << "block " << block;
185     }
186   }
187 };
188
189 uint8_t* SADTestBase::source_data_ = NULL;
190 uint8_t* SADTestBase::reference_data_ = NULL;
191
192 TEST_P(SADTest, MaxRef) {
193   FillConstant(source_data_, source_stride_, 0);
194   FillConstant(reference_data_, reference_stride_, 255);
195   CheckSad(UINT_MAX);
196 }
197
198 TEST_P(SADx4Test, MaxRef) {
199   FillConstant(source_data_, source_stride_, 0);
200   FillConstant(GetReference(0), reference_stride_, 255);
201   FillConstant(GetReference(1), reference_stride_, 255);
202   FillConstant(GetReference(2), reference_stride_, 255);
203   FillConstant(GetReference(3), reference_stride_, 255);
204   CheckSADs();
205 }
206
207 TEST_P(SADTest, MaxSrc) {
208   FillConstant(source_data_, source_stride_, 255);
209   FillConstant(reference_data_, reference_stride_, 0);
210   CheckSad(UINT_MAX);
211 }
212
213 TEST_P(SADx4Test, MaxSrc) {
214   FillConstant(source_data_, source_stride_, 255);
215   FillConstant(GetReference(0), reference_stride_, 0);
216   FillConstant(GetReference(1), reference_stride_, 0);
217   FillConstant(GetReference(2), reference_stride_, 0);
218   FillConstant(GetReference(3), reference_stride_, 0);
219   CheckSADs();
220 }
221
222 TEST_P(SADTest, ShortRef) {
223   int tmp_stride = reference_stride_;
224   reference_stride_ >>= 1;
225   FillRandom(source_data_, source_stride_);
226   FillRandom(reference_data_, reference_stride_);
227   CheckSad(UINT_MAX);
228   reference_stride_ = tmp_stride;
229 }
230
231 TEST_P(SADx4Test, ShortRef) {
232   int tmp_stride = reference_stride_;
233   reference_stride_ >>= 1;
234   FillRandom(source_data_, source_stride_);
235   FillRandom(GetReference(0), reference_stride_);
236   FillRandom(GetReference(1), reference_stride_);
237   FillRandom(GetReference(2), reference_stride_);
238   FillRandom(GetReference(3), reference_stride_);
239   CheckSADs();
240   reference_stride_ = tmp_stride;
241 }
242
243 TEST_P(SADTest, UnalignedRef) {
244   // The reference frame, but not the source frame, may be unaligned for
245   // certain types of searches.
246   int tmp_stride = reference_stride_;
247   reference_stride_ -= 1;
248   FillRandom(source_data_, source_stride_);
249   FillRandom(reference_data_, reference_stride_);
250   CheckSad(UINT_MAX);
251   reference_stride_ = tmp_stride;
252 }
253
254 TEST_P(SADx4Test, UnalignedRef) {
255   // The reference frame, but not the source frame, may be unaligned for
256   // certain types of searches.
257   int tmp_stride = reference_stride_;
258   reference_stride_ -= 1;
259   FillRandom(source_data_, source_stride_);
260   FillRandom(GetReference(0), reference_stride_);
261   FillRandom(GetReference(1), reference_stride_);
262   FillRandom(GetReference(2), reference_stride_);
263   FillRandom(GetReference(3), reference_stride_);
264   CheckSADs();
265   reference_stride_ = tmp_stride;
266 }
267
268 TEST_P(SADTest, ShortSrc) {
269   int tmp_stride = source_stride_;
270   source_stride_ >>= 1;
271   FillRandom(source_data_, source_stride_);
272   FillRandom(reference_data_, reference_stride_);
273   CheckSad(UINT_MAX);
274   source_stride_ = tmp_stride;
275 }
276
277 TEST_P(SADx4Test, ShortSrc) {
278   int tmp_stride = source_stride_;
279   source_stride_ >>= 1;
280   FillRandom(source_data_, source_stride_);
281   FillRandom(GetReference(0), reference_stride_);
282   FillRandom(GetReference(1), reference_stride_);
283   FillRandom(GetReference(2), reference_stride_);
284   FillRandom(GetReference(3), reference_stride_);
285   CheckSADs();
286   source_stride_ = tmp_stride;
287 }
288
289 TEST_P(SADTest, MaxSAD) {
290   // Verify that, when max_sad is set, the implementation does not return a
291   // value lower than the reference.
292   FillConstant(source_data_, source_stride_, 255);
293   FillConstant(reference_data_, reference_stride_, 0);
294   CheckSad(128);
295 }
296
297 using std::tr1::make_tuple;
298
299 #if CONFIG_VP8_ENCODER
300 const sad_m_by_n_fn_t sad_16x16_c = vp8_sad16x16_c;
301 const sad_m_by_n_fn_t sad_8x16_c = vp8_sad8x16_c;
302 const sad_m_by_n_fn_t sad_16x8_c = vp8_sad16x8_c;
303 const sad_m_by_n_fn_t sad_8x8_c = vp8_sad8x8_c;
304 const sad_m_by_n_fn_t sad_4x4_c = vp8_sad4x4_c;
305 #endif
306 #if CONFIG_VP9_ENCODER
307 const sad_m_by_n_fn_t sad_64x64_c_vp9 = vp9_sad64x64_c;
308 const sad_m_by_n_fn_t sad_32x32_c_vp9 = vp9_sad32x32_c;
309 const sad_m_by_n_fn_t sad_16x16_c_vp9 = vp9_sad16x16_c;
310 const sad_m_by_n_fn_t sad_8x16_c_vp9 = vp9_sad8x16_c;
311 const sad_m_by_n_fn_t sad_16x8_c_vp9 = vp9_sad16x8_c;
312 const sad_m_by_n_fn_t sad_8x8_c_vp9 = vp9_sad8x8_c;
313 const sad_m_by_n_fn_t sad_8x4_c_vp9 = vp9_sad8x4_c;
314 const sad_m_by_n_fn_t sad_4x8_c_vp9 = vp9_sad4x8_c;
315 const sad_m_by_n_fn_t sad_4x4_c_vp9 = vp9_sad4x4_c;
316 #endif
317 const sad_m_by_n_test_param_t c_tests[] = {
318 #if CONFIG_VP8_ENCODER
319   make_tuple(16, 16, sad_16x16_c),
320   make_tuple(8, 16, sad_8x16_c),
321   make_tuple(16, 8, sad_16x8_c),
322   make_tuple(8, 8, sad_8x8_c),
323   make_tuple(4, 4, sad_4x4_c),
324 #endif
325 #if CONFIG_VP9_ENCODER
326   make_tuple(64, 64, sad_64x64_c_vp9),
327   make_tuple(32, 32, sad_32x32_c_vp9),
328   make_tuple(16, 16, sad_16x16_c_vp9),
329   make_tuple(8, 16, sad_8x16_c_vp9),
330   make_tuple(16, 8, sad_16x8_c_vp9),
331   make_tuple(8, 8, sad_8x8_c_vp9),
332   make_tuple(8, 4, sad_8x4_c_vp9),
333   make_tuple(4, 8, sad_4x8_c_vp9),
334   make_tuple(4, 4, sad_4x4_c_vp9),
335 #endif
336 };
337 INSTANTIATE_TEST_CASE_P(C, SADTest, ::testing::ValuesIn(c_tests));
338
339 #if CONFIG_VP9_ENCODER
340 const sad_n_by_n_by_4_fn_t sad_64x64x4d_c = vp9_sad64x64x4d_c;
341 const sad_n_by_n_by_4_fn_t sad_64x32x4d_c = vp9_sad64x32x4d_c;
342 const sad_n_by_n_by_4_fn_t sad_32x64x4d_c = vp9_sad32x64x4d_c;
343 const sad_n_by_n_by_4_fn_t sad_32x32x4d_c = vp9_sad32x32x4d_c;
344 const sad_n_by_n_by_4_fn_t sad_32x16x4d_c = vp9_sad32x16x4d_c;
345 const sad_n_by_n_by_4_fn_t sad_16x32x4d_c = vp9_sad16x32x4d_c;
346 const sad_n_by_n_by_4_fn_t sad_16x16x4d_c = vp9_sad16x16x4d_c;
347 const sad_n_by_n_by_4_fn_t sad_16x8x4d_c = vp9_sad16x8x4d_c;
348 const sad_n_by_n_by_4_fn_t sad_8x16x4d_c = vp9_sad8x16x4d_c;
349 const sad_n_by_n_by_4_fn_t sad_8x8x4d_c = vp9_sad8x8x4d_c;
350 const sad_n_by_n_by_4_fn_t sad_8x4x4d_c = vp9_sad8x4x4d_c;
351 const sad_n_by_n_by_4_fn_t sad_4x8x4d_c = vp9_sad4x8x4d_c;
352 const sad_n_by_n_by_4_fn_t sad_4x4x4d_c = vp9_sad4x4x4d_c;
353 INSTANTIATE_TEST_CASE_P(C, SADx4Test, ::testing::Values(
354                         make_tuple(64, 64, sad_64x64x4d_c),
355                         make_tuple(64, 32, sad_64x32x4d_c),
356                         make_tuple(32, 64, sad_32x64x4d_c),
357                         make_tuple(32, 32, sad_32x32x4d_c),
358                         make_tuple(32, 16, sad_32x16x4d_c),
359                         make_tuple(16, 32, sad_16x32x4d_c),
360                         make_tuple(16, 16, sad_16x16x4d_c),
361                         make_tuple(16, 8, sad_16x8x4d_c),
362                         make_tuple(8, 16, sad_8x16x4d_c),
363                         make_tuple(8, 8, sad_8x8x4d_c),
364                         make_tuple(8, 4, sad_8x4x4d_c),
365                         make_tuple(4, 8, sad_4x8x4d_c),
366                         make_tuple(4, 4, sad_4x4x4d_c)));
367 #endif
368
369 // ARM tests
370 #if HAVE_MEDIA
371 const sad_m_by_n_fn_t sad_16x16_armv6 = vp8_sad16x16_armv6;
372 INSTANTIATE_TEST_CASE_P(MEDIA, SADTest, ::testing::Values(
373                         make_tuple(16, 16, sad_16x16_armv6)));
374
375 #endif
376 #if HAVE_NEON
377 const sad_m_by_n_fn_t sad_16x16_neon = vp8_sad16x16_neon;
378 const sad_m_by_n_fn_t sad_8x16_neon = vp8_sad8x16_neon;
379 const sad_m_by_n_fn_t sad_16x8_neon = vp8_sad16x8_neon;
380 const sad_m_by_n_fn_t sad_8x8_neon = vp8_sad8x8_neon;
381 const sad_m_by_n_fn_t sad_4x4_neon = vp8_sad4x4_neon;
382 INSTANTIATE_TEST_CASE_P(NEON, SADTest, ::testing::Values(
383                         make_tuple(16, 16, sad_16x16_neon),
384                         make_tuple(8, 16, sad_8x16_neon),
385                         make_tuple(16, 8, sad_16x8_neon),
386                         make_tuple(8, 8, sad_8x8_neon),
387                         make_tuple(4, 4, sad_4x4_neon)));
388 #endif
389
390 // X86 tests
391 #if HAVE_MMX
392 #if CONFIG_VP8_ENCODER
393 const sad_m_by_n_fn_t sad_16x16_mmx = vp8_sad16x16_mmx;
394 const sad_m_by_n_fn_t sad_8x16_mmx = vp8_sad8x16_mmx;
395 const sad_m_by_n_fn_t sad_16x8_mmx = vp8_sad16x8_mmx;
396 const sad_m_by_n_fn_t sad_8x8_mmx = vp8_sad8x8_mmx;
397 const sad_m_by_n_fn_t sad_4x4_mmx = vp8_sad4x4_mmx;
398 #endif
399 #if CONFIG_VP9_ENCODER
400 const sad_m_by_n_fn_t sad_16x16_mmx_vp9 = vp9_sad16x16_mmx;
401 const sad_m_by_n_fn_t sad_8x16_mmx_vp9 = vp9_sad8x16_mmx;
402 const sad_m_by_n_fn_t sad_16x8_mmx_vp9 = vp9_sad16x8_mmx;
403 const sad_m_by_n_fn_t sad_8x8_mmx_vp9 = vp9_sad8x8_mmx;
404 const sad_m_by_n_fn_t sad_4x4_mmx_vp9 = vp9_sad4x4_mmx;
405 #endif
406
407 const sad_m_by_n_test_param_t mmx_tests[] = {
408 #if CONFIG_VP8_ENCODER
409   make_tuple(16, 16, sad_16x16_mmx),
410   make_tuple(8, 16, sad_8x16_mmx),
411   make_tuple(16, 8, sad_16x8_mmx),
412   make_tuple(8, 8, sad_8x8_mmx),
413   make_tuple(4, 4, sad_4x4_mmx),
414 #endif
415 #if CONFIG_VP9_ENCODER
416   make_tuple(16, 16, sad_16x16_mmx_vp9),
417   make_tuple(8, 16, sad_8x16_mmx_vp9),
418   make_tuple(16, 8, sad_16x8_mmx_vp9),
419   make_tuple(8, 8, sad_8x8_mmx_vp9),
420   make_tuple(4, 4, sad_4x4_mmx_vp9),
421 #endif
422 };
423 INSTANTIATE_TEST_CASE_P(MMX, SADTest, ::testing::ValuesIn(mmx_tests));
424 #endif
425
426 #if HAVE_SSE
427 #if CONFIG_VP9_ENCODER
428 #if CONFIG_USE_X86INC
429 const sad_m_by_n_fn_t sad_4x4_sse_vp9 = vp9_sad4x4_sse;
430 const sad_m_by_n_fn_t sad_4x8_sse_vp9 = vp9_sad4x8_sse;
431 INSTANTIATE_TEST_CASE_P(SSE, SADTest, ::testing::Values(
432                         make_tuple(4, 4, sad_4x4_sse_vp9),
433                         make_tuple(4, 8, sad_4x8_sse_vp9)));
434
435 const sad_n_by_n_by_4_fn_t sad_4x8x4d_sse = vp9_sad4x8x4d_sse;
436 const sad_n_by_n_by_4_fn_t sad_4x4x4d_sse = vp9_sad4x4x4d_sse;
437 INSTANTIATE_TEST_CASE_P(SSE, SADx4Test, ::testing::Values(
438                         make_tuple(4, 8, sad_4x8x4d_sse),
439                         make_tuple(4, 4, sad_4x4x4d_sse)));
440 #endif
441 #endif
442 #endif
443
444 #if HAVE_SSE2
445 #if CONFIG_VP8_ENCODER
446 const sad_m_by_n_fn_t sad_16x16_wmt = vp8_sad16x16_wmt;
447 const sad_m_by_n_fn_t sad_8x16_wmt = vp8_sad8x16_wmt;
448 const sad_m_by_n_fn_t sad_16x8_wmt = vp8_sad16x8_wmt;
449 const sad_m_by_n_fn_t sad_8x8_wmt = vp8_sad8x8_wmt;
450 const sad_m_by_n_fn_t sad_4x4_wmt = vp8_sad4x4_wmt;
451 #endif
452 #if CONFIG_VP9_ENCODER
453 #if CONFIG_USE_X86INC
454 const sad_m_by_n_fn_t sad_64x64_sse2_vp9 = vp9_sad64x64_sse2;
455 const sad_m_by_n_fn_t sad_64x32_sse2_vp9 = vp9_sad64x32_sse2;
456 const sad_m_by_n_fn_t sad_32x64_sse2_vp9 = vp9_sad32x64_sse2;
457 const sad_m_by_n_fn_t sad_32x32_sse2_vp9 = vp9_sad32x32_sse2;
458 const sad_m_by_n_fn_t sad_32x16_sse2_vp9 = vp9_sad32x16_sse2;
459 const sad_m_by_n_fn_t sad_16x32_sse2_vp9 = vp9_sad16x32_sse2;
460 const sad_m_by_n_fn_t sad_16x16_sse2_vp9 = vp9_sad16x16_sse2;
461 const sad_m_by_n_fn_t sad_16x8_sse2_vp9 = vp9_sad16x8_sse2;
462 const sad_m_by_n_fn_t sad_8x16_sse2_vp9 = vp9_sad8x16_sse2;
463 const sad_m_by_n_fn_t sad_8x8_sse2_vp9 = vp9_sad8x8_sse2;
464 const sad_m_by_n_fn_t sad_8x4_sse2_vp9 = vp9_sad8x4_sse2;
465 #endif
466 #endif
467 const sad_m_by_n_test_param_t sse2_tests[] = {
468 #if CONFIG_VP8_ENCODER
469   make_tuple(16, 16, sad_16x16_wmt),
470   make_tuple(8, 16, sad_8x16_wmt),
471   make_tuple(16, 8, sad_16x8_wmt),
472   make_tuple(8, 8, sad_8x8_wmt),
473   make_tuple(4, 4, sad_4x4_wmt),
474 #endif
475 #if CONFIG_VP9_ENCODER
476 #if CONFIG_USE_X86INC
477   make_tuple(64, 64, sad_64x64_sse2_vp9),
478   make_tuple(64, 32, sad_64x32_sse2_vp9),
479   make_tuple(32, 64, sad_32x64_sse2_vp9),
480   make_tuple(32, 32, sad_32x32_sse2_vp9),
481   make_tuple(32, 16, sad_32x16_sse2_vp9),
482   make_tuple(16, 32, sad_16x32_sse2_vp9),
483   make_tuple(16, 16, sad_16x16_sse2_vp9),
484   make_tuple(16, 8, sad_16x8_sse2_vp9),
485   make_tuple(8, 16, sad_8x16_sse2_vp9),
486   make_tuple(8, 8, sad_8x8_sse2_vp9),
487   make_tuple(8, 4, sad_8x4_sse2_vp9),
488 #endif
489 #endif
490 };
491 INSTANTIATE_TEST_CASE_P(SSE2, SADTest, ::testing::ValuesIn(sse2_tests));
492
493 #if CONFIG_VP9_ENCODER
494 #if CONFIG_USE_X86INC
495 const sad_n_by_n_by_4_fn_t sad_64x64x4d_sse2 = vp9_sad64x64x4d_sse2;
496 const sad_n_by_n_by_4_fn_t sad_64x32x4d_sse2 = vp9_sad64x32x4d_sse2;
497 const sad_n_by_n_by_4_fn_t sad_32x64x4d_sse2 = vp9_sad32x64x4d_sse2;
498 const sad_n_by_n_by_4_fn_t sad_32x32x4d_sse2 = vp9_sad32x32x4d_sse2;
499 const sad_n_by_n_by_4_fn_t sad_32x16x4d_sse2 = vp9_sad32x16x4d_sse2;
500 const sad_n_by_n_by_4_fn_t sad_16x32x4d_sse2 = vp9_sad16x32x4d_sse2;
501 const sad_n_by_n_by_4_fn_t sad_16x16x4d_sse2 = vp9_sad16x16x4d_sse2;
502 const sad_n_by_n_by_4_fn_t sad_16x8x4d_sse2 = vp9_sad16x8x4d_sse2;
503 const sad_n_by_n_by_4_fn_t sad_8x16x4d_sse2 = vp9_sad8x16x4d_sse2;
504 const sad_n_by_n_by_4_fn_t sad_8x8x4d_sse2 = vp9_sad8x8x4d_sse2;
505 const sad_n_by_n_by_4_fn_t sad_8x4x4d_sse2 = vp9_sad8x4x4d_sse2;
506 INSTANTIATE_TEST_CASE_P(SSE2, SADx4Test, ::testing::Values(
507                         make_tuple(64, 64, sad_64x64x4d_sse2),
508                         make_tuple(64, 32, sad_64x32x4d_sse2),
509                         make_tuple(32, 64, sad_32x64x4d_sse2),
510                         make_tuple(32, 32, sad_32x32x4d_sse2),
511                         make_tuple(32, 16, sad_32x16x4d_sse2),
512                         make_tuple(16, 32, sad_16x32x4d_sse2),
513                         make_tuple(16, 16, sad_16x16x4d_sse2),
514                         make_tuple(16, 8, sad_16x8x4d_sse2),
515                         make_tuple(8, 16, sad_8x16x4d_sse2),
516                         make_tuple(8, 8, sad_8x8x4d_sse2),
517                         make_tuple(8, 4, sad_8x4x4d_sse2)));
518 #endif
519 #endif
520 #endif
521
522 #if HAVE_SSE3
523 #if CONFIG_VP8_ENCODER
524 const sad_n_by_n_by_4_fn_t sad_16x16x4d_sse3 = vp8_sad16x16x4d_sse3;
525 const sad_n_by_n_by_4_fn_t sad_16x8x4d_sse3 = vp8_sad16x8x4d_sse3;
526 const sad_n_by_n_by_4_fn_t sad_8x16x4d_sse3 = vp8_sad8x16x4d_sse3;
527 const sad_n_by_n_by_4_fn_t sad_8x8x4d_sse3 = vp8_sad8x8x4d_sse3;
528 const sad_n_by_n_by_4_fn_t sad_4x4x4d_sse3 = vp8_sad4x4x4d_sse3;
529 INSTANTIATE_TEST_CASE_P(SSE3, SADx4Test, ::testing::Values(
530                         make_tuple(16, 16, sad_16x16x4d_sse3),
531                         make_tuple(16, 8, sad_16x8x4d_sse3),
532                         make_tuple(8, 16, sad_8x16x4d_sse3),
533                         make_tuple(8, 8, sad_8x8x4d_sse3),
534                         make_tuple(4, 4, sad_4x4x4d_sse3)));
535 #endif
536 #endif
537
538 #if HAVE_SSSE3
539 #if CONFIG_USE_X86INC
540 const sad_m_by_n_fn_t sad_16x16_sse3 = vp8_sad16x16_sse3;
541 INSTANTIATE_TEST_CASE_P(SSE3, SADTest, ::testing::Values(
542                         make_tuple(16, 16, sad_16x16_sse3)));
543 #endif
544 #endif
545
546 }  // namespace