1 /*
2  *  Copyright (c) 2013 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 <math.h>
12 #include <stdlib.h>
13 #include <string.h>
14 #include <limits>
15 #include <tuple>
16 
17 #include "third_party/googletest/src/include/gtest/gtest.h"
18 
19 #include "./vp9_rtcd.h"
20 #include "./vpx_dsp_rtcd.h"
21 #include "test/acm_random.h"
22 #include "test/clear_system_state.h"
23 #include "test/register_state_check.h"
24 #include "test/util.h"
25 #include "vp9/common/vp9_blockd.h"
26 #include "vp9/common/vp9_scan.h"
27 #include "vpx/vpx_integer.h"
28 #include "vpx_ports/vpx_timer.h"
29 
30 using libvpx_test::ACMRandom;
31 
32 namespace {
33 
34 typedef void (*FwdTxfmFunc)(const int16_t *in, tran_low_t *out, int stride);
35 typedef void (*InvTxfmFunc)(const tran_low_t *in, uint8_t *out, int stride);
36 typedef void (*InvTxfmWithBdFunc)(const tran_low_t *in, uint8_t *out,
37                                   int stride, int bd);
38 
39 template <InvTxfmFunc fn>
wrapper(const tran_low_t * in,uint8_t * out,int stride,int bd)40 void wrapper(const tran_low_t *in, uint8_t *out, int stride, int bd) {
41   (void)bd;
42   fn(in, out, stride);
43 }
44 
45 #if CONFIG_VP9_HIGHBITDEPTH
46 typedef void (*InvTxfmHighbdFunc)(const tran_low_t *in, uint16_t *out,
47                                   int stride, int bd);
48 template <InvTxfmHighbdFunc fn>
highbd_wrapper(const tran_low_t * in,uint8_t * out,int stride,int bd)49 void highbd_wrapper(const tran_low_t *in, uint8_t *out, int stride, int bd) {
50   fn(in, CAST_TO_SHORTPTR(out), stride, bd);
51 }
52 #endif
53 
54 typedef std::tuple<FwdTxfmFunc, InvTxfmWithBdFunc, InvTxfmWithBdFunc, TX_SIZE,
55                    int, int, int>
56     PartialInvTxfmParam;
57 const int kMaxNumCoeffs = 1024;
58 const int kCountTestBlock = 1000;
59 
60 class PartialIDctTest : public ::testing::TestWithParam<PartialInvTxfmParam> {
61  public:
~PartialIDctTest()62   virtual ~PartialIDctTest() {}
SetUp()63   virtual void SetUp() {
64     rnd_.Reset(ACMRandom::DeterministicSeed());
65     fwd_txfm_ = GET_PARAM(0);
66     full_inv_txfm_ = GET_PARAM(1);
67     partial_inv_txfm_ = GET_PARAM(2);
68     tx_size_ = GET_PARAM(3);
69     last_nonzero_ = GET_PARAM(4);
70     bit_depth_ = GET_PARAM(5);
71     pixel_size_ = GET_PARAM(6);
72     mask_ = (1 << bit_depth_) - 1;
73 
74     switch (tx_size_) {
75       case TX_4X4: size_ = 4; break;
76       case TX_8X8: size_ = 8; break;
77       case TX_16X16: size_ = 16; break;
78       case TX_32X32: size_ = 32; break;
79       default: FAIL() << "Wrong Size!"; break;
80     }
81 
82     // Randomize stride_ to a value less than or equal to 1024
83     stride_ = rnd_(1024) + 1;
84     if (stride_ < size_) {
85       stride_ = size_;
86     }
87     // Align stride_ to 16 if it's bigger than 16.
88     if (stride_ > 16) {
89       stride_ &= ~15;
90     }
91 
92     input_block_size_ = size_ * size_;
93     output_block_size_ = size_ * stride_;
94 
95     input_block_ = reinterpret_cast<tran_low_t *>(
96         vpx_memalign(16, sizeof(*input_block_) * input_block_size_));
97     output_block_ = reinterpret_cast<uint8_t *>(
98         vpx_memalign(16, pixel_size_ * output_block_size_));
99     output_block_ref_ = reinterpret_cast<uint8_t *>(
100         vpx_memalign(16, pixel_size_ * output_block_size_));
101   }
102 
TearDown()103   virtual void TearDown() {
104     vpx_free(input_block_);
105     input_block_ = NULL;
106     vpx_free(output_block_);
107     output_block_ = NULL;
108     vpx_free(output_block_ref_);
109     output_block_ref_ = NULL;
110     libvpx_test::ClearSystemState();
111   }
112 
InitMem()113   void InitMem() {
114     memset(input_block_, 0, sizeof(*input_block_) * input_block_size_);
115     if (pixel_size_ == 1) {
116       for (int j = 0; j < output_block_size_; ++j) {
117         output_block_[j] = output_block_ref_[j] = rnd_.Rand16() & mask_;
118       }
119     } else {
120       ASSERT_EQ(2, pixel_size_);
121       uint16_t *const output = reinterpret_cast<uint16_t *>(output_block_);
122       uint16_t *const output_ref =
123           reinterpret_cast<uint16_t *>(output_block_ref_);
124       for (int j = 0; j < output_block_size_; ++j) {
125         output[j] = output_ref[j] = rnd_.Rand16() & mask_;
126       }
127     }
128   }
129 
InitInput()130   void InitInput() {
131     const int64_t max_coeff = (32766 << (bit_depth_ - 8)) / 4;
132     int64_t max_energy_leftover = max_coeff * max_coeff;
133     for (int j = 0; j < last_nonzero_; ++j) {
134       tran_low_t coeff = static_cast<tran_low_t>(
135           sqrt(1.0 * max_energy_leftover) * (rnd_.Rand16() - 32768) / 65536);
136       max_energy_leftover -= static_cast<int64_t>(coeff) * coeff;
137       if (max_energy_leftover < 0) {
138         max_energy_leftover = 0;
139         coeff = 0;
140       }
141       input_block_[vp9_default_scan_orders[tx_size_].scan[j]] = coeff;
142     }
143   }
144 
PrintDiff()145   void PrintDiff() {
146     if (memcmp(output_block_ref_, output_block_,
147                pixel_size_ * output_block_size_)) {
148       uint16_t ref, opt;
149       for (int y = 0; y < size_; y++) {
150         for (int x = 0; x < size_; x++) {
151           if (pixel_size_ == 1) {
152             ref = output_block_ref_[y * stride_ + x];
153             opt = output_block_[y * stride_ + x];
154           } else {
155             ref = reinterpret_cast<uint16_t *>(
156                 output_block_ref_)[y * stride_ + x];
157             opt = reinterpret_cast<uint16_t *>(output_block_)[y * stride_ + x];
158           }
159           if (ref != opt) {
160             printf("dest[%d][%d] diff:%6d (ref),%6d (opt)\n", y, x, ref, opt);
161           }
162         }
163       }
164 
165       printf("\ninput_block_:\n");
166       for (int y = 0; y < size_; y++) {
167         for (int x = 0; x < size_; x++) {
168           printf("%6d,", input_block_[y * size_ + x]);
169         }
170         printf("\n");
171       }
172     }
173   }
174 
175  protected:
176   int last_nonzero_;
177   TX_SIZE tx_size_;
178   tran_low_t *input_block_;
179   uint8_t *output_block_;
180   uint8_t *output_block_ref_;
181   int size_;
182   int stride_;
183   int pixel_size_;
184   int input_block_size_;
185   int output_block_size_;
186   int bit_depth_;
187   int mask_;
188   FwdTxfmFunc fwd_txfm_;
189   InvTxfmWithBdFunc full_inv_txfm_;
190   InvTxfmWithBdFunc partial_inv_txfm_;
191   ACMRandom rnd_;
192 };
193 
TEST_P(PartialIDctTest,RunQuantCheck)194 TEST_P(PartialIDctTest, RunQuantCheck) {
195   const int count_test_block = (size_ != 4) ? kCountTestBlock : 65536;
196   DECLARE_ALIGNED(16, int16_t, input_extreme_block[kMaxNumCoeffs]);
197   DECLARE_ALIGNED(16, tran_low_t, output_ref_block[kMaxNumCoeffs]);
198 
199   InitMem();
200 
201   for (int i = 0; i < count_test_block; ++i) {
202     // Initialize a test block with input range [-mask_, mask_].
203     if (size_ != 4) {
204       if (i == 0) {
205         for (int k = 0; k < input_block_size_; ++k) {
206           input_extreme_block[k] = mask_;
207         }
208       } else if (i == 1) {
209         for (int k = 0; k < input_block_size_; ++k) {
210           input_extreme_block[k] = -mask_;
211         }
212       } else {
213         for (int k = 0; k < input_block_size_; ++k) {
214           input_extreme_block[k] = rnd_.Rand8() % 2 ? mask_ : -mask_;
215         }
216       }
217     } else {
218       // Try all possible combinations.
219       for (int k = 0; k < input_block_size_; ++k) {
220         input_extreme_block[k] = (i & (1 << k)) ? mask_ : -mask_;
221       }
222     }
223 
224     fwd_txfm_(input_extreme_block, output_ref_block, size_);
225 
226     // quantization with minimum allowed step sizes
227     input_block_[0] = (output_ref_block[0] / 4) * 4;
228     for (int k = 1; k < last_nonzero_; ++k) {
229       const int pos = vp9_default_scan_orders[tx_size_].scan[k];
230       input_block_[pos] = (output_ref_block[pos] / 4) * 4;
231     }
232 
233     ASM_REGISTER_STATE_CHECK(
234         full_inv_txfm_(input_block_, output_block_ref_, stride_, bit_depth_));
235     ASM_REGISTER_STATE_CHECK(
236         partial_inv_txfm_(input_block_, output_block_, stride_, bit_depth_));
237     ASSERT_EQ(0, memcmp(output_block_ref_, output_block_,
238                         pixel_size_ * output_block_size_))
239         << "Error: partial inverse transform produces different results";
240   }
241 }
242 
TEST_P(PartialIDctTest,ResultsMatch)243 TEST_P(PartialIDctTest, ResultsMatch) {
244   for (int i = 0; i < kCountTestBlock; ++i) {
245     InitMem();
246     InitInput();
247 
248     ASM_REGISTER_STATE_CHECK(
249         full_inv_txfm_(input_block_, output_block_ref_, stride_, bit_depth_));
250     ASM_REGISTER_STATE_CHECK(
251         partial_inv_txfm_(input_block_, output_block_, stride_, bit_depth_));
252     ASSERT_EQ(0, memcmp(output_block_ref_, output_block_,
253                         pixel_size_ * output_block_size_))
254         << "Error: partial inverse transform produces different results";
255   }
256 }
257 
TEST_P(PartialIDctTest,AddOutputBlock)258 TEST_P(PartialIDctTest, AddOutputBlock) {
259   for (int i = 0; i < kCountTestBlock; ++i) {
260     InitMem();
261     for (int j = 0; j < last_nonzero_; ++j) {
262       input_block_[vp9_default_scan_orders[tx_size_].scan[j]] = 10;
263     }
264 
265     ASM_REGISTER_STATE_CHECK(
266         full_inv_txfm_(input_block_, output_block_ref_, stride_, bit_depth_));
267     ASM_REGISTER_STATE_CHECK(
268         partial_inv_txfm_(input_block_, output_block_, stride_, bit_depth_));
269     ASSERT_EQ(0, memcmp(output_block_ref_, output_block_,
270                         pixel_size_ * output_block_size_))
271         << "Error: Transform results are not correctly added to output.";
272   }
273 }
274 
TEST_P(PartialIDctTest,SingleExtremeCoeff)275 TEST_P(PartialIDctTest, SingleExtremeCoeff) {
276   const int16_t max_coeff = std::numeric_limits<int16_t>::max();
277   const int16_t min_coeff = std::numeric_limits<int16_t>::min();
278   for (int i = 0; i < last_nonzero_; ++i) {
279     memset(input_block_, 0, sizeof(*input_block_) * input_block_size_);
280     // Run once for min and once for max.
281     for (int j = 0; j < 2; ++j) {
282       const int coeff = j ? min_coeff : max_coeff;
283 
284       memset(output_block_, 0, pixel_size_ * output_block_size_);
285       memset(output_block_ref_, 0, pixel_size_ * output_block_size_);
286       input_block_[vp9_default_scan_orders[tx_size_].scan[i]] = coeff;
287 
288       ASM_REGISTER_STATE_CHECK(
289           full_inv_txfm_(input_block_, output_block_ref_, stride_, bit_depth_));
290       ASM_REGISTER_STATE_CHECK(
291           partial_inv_txfm_(input_block_, output_block_, stride_, bit_depth_));
292       ASSERT_EQ(0, memcmp(output_block_ref_, output_block_,
293                           pixel_size_ * output_block_size_))
294           << "Error: Fails with single coeff of " << coeff << " at " << i
295           << ".";
296     }
297   }
298 }
299 
TEST_P(PartialIDctTest,DISABLED_Speed)300 TEST_P(PartialIDctTest, DISABLED_Speed) {
301   // Keep runtime stable with transform size.
302   const int kCountSpeedTestBlock = 500000000 / input_block_size_;
303   InitMem();
304   InitInput();
305 
306   for (int i = 0; i < kCountSpeedTestBlock; ++i) {
307     ASM_REGISTER_STATE_CHECK(
308         full_inv_txfm_(input_block_, output_block_ref_, stride_, bit_depth_));
309   }
310   vpx_usec_timer timer;
311   vpx_usec_timer_start(&timer);
312   for (int i = 0; i < kCountSpeedTestBlock; ++i) {
313     partial_inv_txfm_(input_block_, output_block_, stride_, bit_depth_);
314   }
315   libvpx_test::ClearSystemState();
316   vpx_usec_timer_mark(&timer);
317   const int elapsed_time =
318       static_cast<int>(vpx_usec_timer_elapsed(&timer) / 1000);
319   printf("idct%dx%d_%d (%s %d) time: %5d ms\n", size_, size_, last_nonzero_,
320          (pixel_size_ == 1) ? "bitdepth" : "high bitdepth", bit_depth_,
321          elapsed_time);
322   ASSERT_EQ(0, memcmp(output_block_ref_, output_block_,
323                       pixel_size_ * output_block_size_))
324       << "Error: partial inverse transform produces different results";
325 }
326 
327 using std::make_tuple;
328 
329 const PartialInvTxfmParam c_partial_idct_tests[] = {
330 #if CONFIG_VP9_HIGHBITDEPTH
331   make_tuple(
332       &vpx_highbd_fdct32x32_c, &highbd_wrapper<vpx_highbd_idct32x32_1024_add_c>,
333       &highbd_wrapper<vpx_highbd_idct32x32_1024_add_c>, TX_32X32, 1024, 8, 2),
334   make_tuple(
335       &vpx_highbd_fdct32x32_c, &highbd_wrapper<vpx_highbd_idct32x32_1024_add_c>,
336       &highbd_wrapper<vpx_highbd_idct32x32_1024_add_c>, TX_32X32, 1024, 10, 2),
337   make_tuple(
338       &vpx_highbd_fdct32x32_c, &highbd_wrapper<vpx_highbd_idct32x32_1024_add_c>,
339       &highbd_wrapper<vpx_highbd_idct32x32_1024_add_c>, TX_32X32, 1024, 12, 2),
340   make_tuple(
341       &vpx_highbd_fdct32x32_c, &highbd_wrapper<vpx_highbd_idct32x32_1024_add_c>,
342       &highbd_wrapper<vpx_highbd_idct32x32_135_add_c>, TX_32X32, 135, 8, 2),
343   make_tuple(
344       &vpx_highbd_fdct32x32_c, &highbd_wrapper<vpx_highbd_idct32x32_1024_add_c>,
345       &highbd_wrapper<vpx_highbd_idct32x32_135_add_c>, TX_32X32, 135, 10, 2),
346   make_tuple(
347       &vpx_highbd_fdct32x32_c, &highbd_wrapper<vpx_highbd_idct32x32_1024_add_c>,
348       &highbd_wrapper<vpx_highbd_idct32x32_135_add_c>, TX_32X32, 135, 12, 2),
349   make_tuple(
350       &vpx_highbd_fdct32x32_c, &highbd_wrapper<vpx_highbd_idct32x32_1024_add_c>,
351       &highbd_wrapper<vpx_highbd_idct32x32_34_add_c>, TX_32X32, 34, 8, 2),
352   make_tuple(
353       &vpx_highbd_fdct32x32_c, &highbd_wrapper<vpx_highbd_idct32x32_1024_add_c>,
354       &highbd_wrapper<vpx_highbd_idct32x32_34_add_c>, TX_32X32, 34, 10, 2),
355   make_tuple(
356       &vpx_highbd_fdct32x32_c, &highbd_wrapper<vpx_highbd_idct32x32_1024_add_c>,
357       &highbd_wrapper<vpx_highbd_idct32x32_34_add_c>, TX_32X32, 34, 12, 2),
358   make_tuple(&vpx_highbd_fdct32x32_c,
359              &highbd_wrapper<vpx_highbd_idct32x32_1024_add_c>,
360              &highbd_wrapper<vpx_highbd_idct32x32_1_add_c>, TX_32X32, 1, 8, 2),
361   make_tuple(&vpx_highbd_fdct32x32_c,
362              &highbd_wrapper<vpx_highbd_idct32x32_1024_add_c>,
363              &highbd_wrapper<vpx_highbd_idct32x32_1_add_c>, TX_32X32, 1, 10, 2),
364   make_tuple(&vpx_highbd_fdct32x32_c,
365              &highbd_wrapper<vpx_highbd_idct32x32_1024_add_c>,
366              &highbd_wrapper<vpx_highbd_idct32x32_1_add_c>, TX_32X32, 1, 12, 2),
367   make_tuple(
368       &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_256_add_c>,
369       &highbd_wrapper<vpx_highbd_idct16x16_256_add_c>, TX_16X16, 256, 8, 2),
370   make_tuple(
371       &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_256_add_c>,
372       &highbd_wrapper<vpx_highbd_idct16x16_256_add_c>, TX_16X16, 256, 10, 2),
373   make_tuple(
374       &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_256_add_c>,
375       &highbd_wrapper<vpx_highbd_idct16x16_256_add_c>, TX_16X16, 256, 12, 2),
376   make_tuple(
377       &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_256_add_c>,
378       &highbd_wrapper<vpx_highbd_idct16x16_38_add_c>, TX_16X16, 38, 8, 2),
379   make_tuple(
380       &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_256_add_c>,
381       &highbd_wrapper<vpx_highbd_idct16x16_38_add_c>, TX_16X16, 38, 10, 2),
382   make_tuple(
383       &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_256_add_c>,
384       &highbd_wrapper<vpx_highbd_idct16x16_38_add_c>, TX_16X16, 38, 12, 2),
385   make_tuple(
386       &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_256_add_c>,
387       &highbd_wrapper<vpx_highbd_idct16x16_10_add_c>, TX_16X16, 10, 8, 2),
388   make_tuple(
389       &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_256_add_c>,
390       &highbd_wrapper<vpx_highbd_idct16x16_10_add_c>, TX_16X16, 10, 10, 2),
391   make_tuple(
392       &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_256_add_c>,
393       &highbd_wrapper<vpx_highbd_idct16x16_10_add_c>, TX_16X16, 10, 12, 2),
394   make_tuple(&vpx_highbd_fdct16x16_c,
395              &highbd_wrapper<vpx_highbd_idct16x16_256_add_c>,
396              &highbd_wrapper<vpx_highbd_idct16x16_1_add_c>, TX_16X16, 1, 8, 2),
397   make_tuple(&vpx_highbd_fdct16x16_c,
398              &highbd_wrapper<vpx_highbd_idct16x16_256_add_c>,
399              &highbd_wrapper<vpx_highbd_idct16x16_1_add_c>, TX_16X16, 1, 10, 2),
400   make_tuple(&vpx_highbd_fdct16x16_c,
401              &highbd_wrapper<vpx_highbd_idct16x16_256_add_c>,
402              &highbd_wrapper<vpx_highbd_idct16x16_1_add_c>, TX_16X16, 1, 12, 2),
403   make_tuple(&vpx_highbd_fdct8x8_c,
404              &highbd_wrapper<vpx_highbd_idct8x8_64_add_c>,
405              &highbd_wrapper<vpx_highbd_idct8x8_64_add_c>, TX_8X8, 64, 8, 2),
406   make_tuple(&vpx_highbd_fdct8x8_c,
407              &highbd_wrapper<vpx_highbd_idct8x8_64_add_c>,
408              &highbd_wrapper<vpx_highbd_idct8x8_64_add_c>, TX_8X8, 64, 10, 2),
409   make_tuple(&vpx_highbd_fdct8x8_c,
410              &highbd_wrapper<vpx_highbd_idct8x8_64_add_c>,
411              &highbd_wrapper<vpx_highbd_idct8x8_64_add_c>, TX_8X8, 64, 12, 2),
412   make_tuple(&vpx_highbd_fdct8x8_c,
413              &highbd_wrapper<vpx_highbd_idct8x8_64_add_c>,
414              &highbd_wrapper<vpx_highbd_idct8x8_12_add_c>, TX_8X8, 12, 8, 2),
415   make_tuple(&vpx_highbd_fdct8x8_c,
416              &highbd_wrapper<vpx_highbd_idct8x8_64_add_c>,
417              &highbd_wrapper<vpx_highbd_idct8x8_12_add_c>, TX_8X8, 12, 10, 2),
418   make_tuple(&vpx_highbd_fdct8x8_c,
419              &highbd_wrapper<vpx_highbd_idct8x8_64_add_c>,
420              &highbd_wrapper<vpx_highbd_idct8x8_12_add_c>, TX_8X8, 12, 12, 2),
421   make_tuple(&vpx_highbd_fdct8x8_c,
422              &highbd_wrapper<vpx_highbd_idct8x8_64_add_c>,
423              &highbd_wrapper<vpx_highbd_idct8x8_1_add_c>, TX_8X8, 1, 8, 2),
424   make_tuple(&vpx_highbd_fdct8x8_c,
425              &highbd_wrapper<vpx_highbd_idct8x8_64_add_c>,
426              &highbd_wrapper<vpx_highbd_idct8x8_1_add_c>, TX_8X8, 1, 10, 2),
427   make_tuple(&vpx_highbd_fdct8x8_c,
428              &highbd_wrapper<vpx_highbd_idct8x8_64_add_c>,
429              &highbd_wrapper<vpx_highbd_idct8x8_1_add_c>, TX_8X8, 1, 12, 2),
430   make_tuple(&vpx_highbd_fdct4x4_c,
431              &highbd_wrapper<vpx_highbd_idct4x4_16_add_c>,
432              &highbd_wrapper<vpx_highbd_idct4x4_16_add_c>, TX_4X4, 16, 8, 2),
433   make_tuple(&vpx_highbd_fdct4x4_c,
434              &highbd_wrapper<vpx_highbd_idct4x4_16_add_c>,
435              &highbd_wrapper<vpx_highbd_idct4x4_16_add_c>, TX_4X4, 16, 10, 2),
436   make_tuple(&vpx_highbd_fdct4x4_c,
437              &highbd_wrapper<vpx_highbd_idct4x4_16_add_c>,
438              &highbd_wrapper<vpx_highbd_idct4x4_16_add_c>, TX_4X4, 16, 12, 2),
439   make_tuple(&vpx_highbd_fdct4x4_c,
440              &highbd_wrapper<vpx_highbd_idct4x4_16_add_c>,
441              &highbd_wrapper<vpx_highbd_idct4x4_1_add_c>, TX_4X4, 1, 8, 2),
442   make_tuple(&vpx_highbd_fdct4x4_c,
443              &highbd_wrapper<vpx_highbd_idct4x4_16_add_c>,
444              &highbd_wrapper<vpx_highbd_idct4x4_1_add_c>, TX_4X4, 1, 10, 2),
445   make_tuple(&vpx_highbd_fdct4x4_c,
446              &highbd_wrapper<vpx_highbd_idct4x4_16_add_c>,
447              &highbd_wrapper<vpx_highbd_idct4x4_1_add_c>, TX_4X4, 1, 12, 2),
448 #endif  // CONFIG_VP9_HIGHBITDEPTH
449   make_tuple(&vpx_fdct32x32_c, &wrapper<vpx_idct32x32_1024_add_c>,
450              &wrapper<vpx_idct32x32_1024_add_c>, TX_32X32, 1024, 8, 1),
451   make_tuple(&vpx_fdct32x32_c, &wrapper<vpx_idct32x32_1024_add_c>,
452              &wrapper<vpx_idct32x32_135_add_c>, TX_32X32, 135, 8, 1),
453   make_tuple(&vpx_fdct32x32_c, &wrapper<vpx_idct32x32_1024_add_c>,
454              &wrapper<vpx_idct32x32_34_add_c>, TX_32X32, 34, 8, 1),
455   make_tuple(&vpx_fdct32x32_c, &wrapper<vpx_idct32x32_1024_add_c>,
456              &wrapper<vpx_idct32x32_1_add_c>, TX_32X32, 1, 8, 1),
457   make_tuple(&vpx_fdct16x16_c, &wrapper<vpx_idct16x16_256_add_c>,
458              &wrapper<vpx_idct16x16_256_add_c>, TX_16X16, 256, 8, 1),
459   make_tuple(&vpx_fdct16x16_c, &wrapper<vpx_idct16x16_256_add_c>,
460              &wrapper<vpx_idct16x16_38_add_c>, TX_16X16, 38, 8, 1),
461   make_tuple(&vpx_fdct16x16_c, &wrapper<vpx_idct16x16_256_add_c>,
462              &wrapper<vpx_idct16x16_10_add_c>, TX_16X16, 10, 8, 1),
463   make_tuple(&vpx_fdct16x16_c, &wrapper<vpx_idct16x16_256_add_c>,
464              &wrapper<vpx_idct16x16_1_add_c>, TX_16X16, 1, 8, 1),
465   make_tuple(&vpx_fdct8x8_c, &wrapper<vpx_idct8x8_64_add_c>,
466              &wrapper<vpx_idct8x8_64_add_c>, TX_8X8, 64, 8, 1),
467   make_tuple(&vpx_fdct8x8_c, &wrapper<vpx_idct8x8_64_add_c>,
468              &wrapper<vpx_idct8x8_12_add_c>, TX_8X8, 12, 8, 1),
469   make_tuple(&vpx_fdct8x8_c, &wrapper<vpx_idct8x8_64_add_c>,
470              &wrapper<vpx_idct8x8_1_add_c>, TX_8X8, 1, 8, 1),
471   make_tuple(&vpx_fdct4x4_c, &wrapper<vpx_idct4x4_16_add_c>,
472              &wrapper<vpx_idct4x4_16_add_c>, TX_4X4, 16, 8, 1),
473   make_tuple(&vpx_fdct4x4_c, &wrapper<vpx_idct4x4_16_add_c>,
474              &wrapper<vpx_idct4x4_1_add_c>, TX_4X4, 1, 8, 1)
475 };
476 
477 INSTANTIATE_TEST_CASE_P(C, PartialIDctTest,
478                         ::testing::ValuesIn(c_partial_idct_tests));
479 
480 #if !CONFIG_EMULATE_HARDWARE
481 
482 #if HAVE_NEON
483 const PartialInvTxfmParam neon_partial_idct_tests[] = {
484 #if CONFIG_VP9_HIGHBITDEPTH
485   make_tuple(&vpx_highbd_fdct32x32_c,
486              &highbd_wrapper<vpx_highbd_idct32x32_1024_add_c>,
487              &highbd_wrapper<vpx_highbd_idct32x32_1024_add_neon>, TX_32X32,
488              1024, 8, 2),
489   make_tuple(&vpx_highbd_fdct32x32_c,
490              &highbd_wrapper<vpx_highbd_idct32x32_1024_add_c>,
491              &highbd_wrapper<vpx_highbd_idct32x32_1024_add_neon>, TX_32X32,
492              1024, 10, 2),
493   make_tuple(&vpx_highbd_fdct32x32_c,
494              &highbd_wrapper<vpx_highbd_idct32x32_1024_add_c>,
495              &highbd_wrapper<vpx_highbd_idct32x32_1024_add_neon>, TX_32X32,
496              1024, 12, 2),
497   make_tuple(
498       &vpx_highbd_fdct32x32_c, &highbd_wrapper<vpx_highbd_idct32x32_135_add_c>,
499       &highbd_wrapper<vpx_highbd_idct32x32_135_add_neon>, TX_32X32, 135, 8, 2),
500   make_tuple(
501       &vpx_highbd_fdct32x32_c, &highbd_wrapper<vpx_highbd_idct32x32_135_add_c>,
502       &highbd_wrapper<vpx_highbd_idct32x32_135_add_neon>, TX_32X32, 135, 10, 2),
503   make_tuple(
504       &vpx_highbd_fdct32x32_c, &highbd_wrapper<vpx_highbd_idct32x32_135_add_c>,
505       &highbd_wrapper<vpx_highbd_idct32x32_135_add_neon>, TX_32X32, 135, 12, 2),
506   make_tuple(
507       &vpx_highbd_fdct32x32_c, &highbd_wrapper<vpx_highbd_idct32x32_34_add_c>,
508       &highbd_wrapper<vpx_highbd_idct32x32_34_add_neon>, TX_32X32, 34, 8, 2),
509   make_tuple(
510       &vpx_highbd_fdct32x32_c, &highbd_wrapper<vpx_highbd_idct32x32_34_add_c>,
511       &highbd_wrapper<vpx_highbd_idct32x32_34_add_neon>, TX_32X32, 34, 10, 2),
512   make_tuple(
513       &vpx_highbd_fdct32x32_c, &highbd_wrapper<vpx_highbd_idct32x32_34_add_c>,
514       &highbd_wrapper<vpx_highbd_idct32x32_34_add_neon>, TX_32X32, 34, 12, 2),
515   make_tuple(
516       &vpx_highbd_fdct32x32_c, &highbd_wrapper<vpx_highbd_idct32x32_1_add_c>,
517       &highbd_wrapper<vpx_highbd_idct32x32_1_add_neon>, TX_32X32, 1, 8, 2),
518   make_tuple(
519       &vpx_highbd_fdct32x32_c, &highbd_wrapper<vpx_highbd_idct32x32_1_add_c>,
520       &highbd_wrapper<vpx_highbd_idct32x32_1_add_neon>, TX_32X32, 1, 10, 2),
521   make_tuple(
522       &vpx_highbd_fdct32x32_c, &highbd_wrapper<vpx_highbd_idct32x32_1_add_c>,
523       &highbd_wrapper<vpx_highbd_idct32x32_1_add_neon>, TX_32X32, 1, 12, 2),
524   make_tuple(
525       &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_256_add_c>,
526       &highbd_wrapper<vpx_highbd_idct16x16_256_add_neon>, TX_16X16, 256, 8, 2),
527   make_tuple(
528       &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_256_add_c>,
529       &highbd_wrapper<vpx_highbd_idct16x16_256_add_neon>, TX_16X16, 256, 10, 2),
530   make_tuple(
531       &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_256_add_c>,
532       &highbd_wrapper<vpx_highbd_idct16x16_256_add_neon>, TX_16X16, 256, 12, 2),
533   make_tuple(
534       &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_38_add_c>,
535       &highbd_wrapper<vpx_highbd_idct16x16_38_add_neon>, TX_16X16, 38, 8, 2),
536   make_tuple(
537       &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_38_add_c>,
538       &highbd_wrapper<vpx_highbd_idct16x16_38_add_neon>, TX_16X16, 38, 10, 2),
539   make_tuple(
540       &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_38_add_c>,
541       &highbd_wrapper<vpx_highbd_idct16x16_38_add_neon>, TX_16X16, 38, 12, 2),
542   make_tuple(
543       &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_10_add_c>,
544       &highbd_wrapper<vpx_highbd_idct16x16_10_add_neon>, TX_16X16, 10, 8, 2),
545   make_tuple(
546       &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_10_add_c>,
547       &highbd_wrapper<vpx_highbd_idct16x16_10_add_neon>, TX_16X16, 10, 10, 2),
548   make_tuple(
549       &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_10_add_c>,
550       &highbd_wrapper<vpx_highbd_idct16x16_10_add_neon>, TX_16X16, 10, 12, 2),
551   make_tuple(
552       &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_1_add_c>,
553       &highbd_wrapper<vpx_highbd_idct16x16_1_add_neon>, TX_16X16, 1, 8, 2),
554   make_tuple(
555       &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_1_add_c>,
556       &highbd_wrapper<vpx_highbd_idct16x16_1_add_neon>, TX_16X16, 1, 10, 2),
557   make_tuple(
558       &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_1_add_c>,
559       &highbd_wrapper<vpx_highbd_idct16x16_1_add_neon>, TX_16X16, 1, 12, 2),
560   make_tuple(&vpx_highbd_fdct8x8_c,
561              &highbd_wrapper<vpx_highbd_idct8x8_64_add_c>,
562              &highbd_wrapper<vpx_highbd_idct8x8_64_add_neon>, TX_8X8, 64, 8, 2),
563   make_tuple(
564       &vpx_highbd_fdct8x8_c, &highbd_wrapper<vpx_highbd_idct8x8_64_add_c>,
565       &highbd_wrapper<vpx_highbd_idct8x8_64_add_neon>, TX_8X8, 64, 10, 2),
566   make_tuple(
567       &vpx_highbd_fdct8x8_c, &highbd_wrapper<vpx_highbd_idct8x8_64_add_c>,
568       &highbd_wrapper<vpx_highbd_idct8x8_64_add_neon>, TX_8X8, 64, 12, 2),
569   make_tuple(&vpx_highbd_fdct8x8_c,
570              &highbd_wrapper<vpx_highbd_idct8x8_12_add_c>,
571              &highbd_wrapper<vpx_highbd_idct8x8_12_add_neon>, TX_8X8, 12, 8, 2),
572   make_tuple(
573       &vpx_highbd_fdct8x8_c, &highbd_wrapper<vpx_highbd_idct8x8_12_add_c>,
574       &highbd_wrapper<vpx_highbd_idct8x8_12_add_neon>, TX_8X8, 12, 10, 2),
575   make_tuple(
576       &vpx_highbd_fdct8x8_c, &highbd_wrapper<vpx_highbd_idct8x8_12_add_c>,
577       &highbd_wrapper<vpx_highbd_idct8x8_12_add_neon>, TX_8X8, 12, 12, 2),
578   make_tuple(&vpx_highbd_fdct8x8_c, &highbd_wrapper<vpx_highbd_idct8x8_1_add_c>,
579              &highbd_wrapper<vpx_highbd_idct8x8_1_add_neon>, TX_8X8, 1, 8, 2),
580   make_tuple(&vpx_highbd_fdct8x8_c, &highbd_wrapper<vpx_highbd_idct8x8_1_add_c>,
581              &highbd_wrapper<vpx_highbd_idct8x8_1_add_neon>, TX_8X8, 1, 10, 2),
582   make_tuple(&vpx_highbd_fdct8x8_c, &highbd_wrapper<vpx_highbd_idct8x8_1_add_c>,
583              &highbd_wrapper<vpx_highbd_idct8x8_1_add_neon>, TX_8X8, 1, 12, 2),
584   make_tuple(&vpx_highbd_fdct4x4_c,
585              &highbd_wrapper<vpx_highbd_idct4x4_16_add_c>,
586              &highbd_wrapper<vpx_highbd_idct4x4_16_add_neon>, TX_4X4, 16, 8, 2),
587   make_tuple(
588       &vpx_highbd_fdct4x4_c, &highbd_wrapper<vpx_highbd_idct4x4_16_add_c>,
589       &highbd_wrapper<vpx_highbd_idct4x4_16_add_neon>, TX_4X4, 16, 10, 2),
590   make_tuple(
591       &vpx_highbd_fdct4x4_c, &highbd_wrapper<vpx_highbd_idct4x4_16_add_c>,
592       &highbd_wrapper<vpx_highbd_idct4x4_16_add_neon>, TX_4X4, 16, 12, 2),
593   make_tuple(&vpx_highbd_fdct4x4_c, &highbd_wrapper<vpx_highbd_idct4x4_1_add_c>,
594              &highbd_wrapper<vpx_highbd_idct4x4_1_add_neon>, TX_4X4, 1, 8, 2),
595   make_tuple(&vpx_highbd_fdct4x4_c, &highbd_wrapper<vpx_highbd_idct4x4_1_add_c>,
596              &highbd_wrapper<vpx_highbd_idct4x4_1_add_neon>, TX_4X4, 1, 10, 2),
597   make_tuple(&vpx_highbd_fdct4x4_c, &highbd_wrapper<vpx_highbd_idct4x4_1_add_c>,
598              &highbd_wrapper<vpx_highbd_idct4x4_1_add_neon>, TX_4X4, 1, 12, 2),
599 #endif  // CONFIG_VP9_HIGHBITDEPTH
600   make_tuple(&vpx_fdct32x32_c, &wrapper<vpx_idct32x32_1024_add_c>,
601              &wrapper<vpx_idct32x32_1024_add_neon>, TX_32X32, 1024, 8, 1),
602   make_tuple(&vpx_fdct32x32_c, &wrapper<vpx_idct32x32_135_add_c>,
603              &wrapper<vpx_idct32x32_135_add_neon>, TX_32X32, 135, 8, 1),
604   make_tuple(&vpx_fdct32x32_c, &wrapper<vpx_idct32x32_34_add_c>,
605              &wrapper<vpx_idct32x32_34_add_neon>, TX_32X32, 34, 8, 1),
606   make_tuple(&vpx_fdct32x32_c, &wrapper<vpx_idct32x32_1_add_c>,
607              &wrapper<vpx_idct32x32_1_add_neon>, TX_32X32, 1, 8, 1),
608   make_tuple(&vpx_fdct16x16_c, &wrapper<vpx_idct16x16_256_add_c>,
609              &wrapper<vpx_idct16x16_256_add_neon>, TX_16X16, 256, 8, 1),
610   make_tuple(&vpx_fdct16x16_c, &wrapper<vpx_idct16x16_38_add_c>,
611              &wrapper<vpx_idct16x16_38_add_neon>, TX_16X16, 38, 8, 1),
612   make_tuple(&vpx_fdct16x16_c, &wrapper<vpx_idct16x16_10_add_c>,
613              &wrapper<vpx_idct16x16_10_add_neon>, TX_16X16, 10, 8, 1),
614   make_tuple(&vpx_fdct16x16_c, &wrapper<vpx_idct16x16_1_add_c>,
615              &wrapper<vpx_idct16x16_1_add_neon>, TX_16X16, 1, 8, 1),
616   make_tuple(&vpx_fdct8x8_c, &wrapper<vpx_idct8x8_64_add_c>,
617              &wrapper<vpx_idct8x8_64_add_neon>, TX_8X8, 64, 8, 1),
618   make_tuple(&vpx_fdct8x8_c, &wrapper<vpx_idct8x8_12_add_c>,
619              &wrapper<vpx_idct8x8_12_add_neon>, TX_8X8, 12, 8, 1),
620   make_tuple(&vpx_fdct8x8_c, &wrapper<vpx_idct8x8_1_add_c>,
621              &wrapper<vpx_idct8x8_1_add_neon>, TX_8X8, 1, 8, 1),
622   make_tuple(&vpx_fdct4x4_c, &wrapper<vpx_idct4x4_16_add_c>,
623              &wrapper<vpx_idct4x4_16_add_neon>, TX_4X4, 16, 8, 1),
624   make_tuple(&vpx_fdct4x4_c, &wrapper<vpx_idct4x4_1_add_c>,
625              &wrapper<vpx_idct4x4_1_add_neon>, TX_4X4, 1, 8, 1)
626 };
627 
628 INSTANTIATE_TEST_CASE_P(NEON, PartialIDctTest,
629                         ::testing::ValuesIn(neon_partial_idct_tests));
630 #endif  // HAVE_NEON
631 
632 #if HAVE_SSE2
633 // 32x32_135_ is implemented using the 1024 version.
634 const PartialInvTxfmParam sse2_partial_idct_tests[] = {
635 #if CONFIG_VP9_HIGHBITDEPTH
636   make_tuple(&vpx_highbd_fdct32x32_c,
637              &highbd_wrapper<vpx_highbd_idct32x32_1024_add_c>,
638              &highbd_wrapper<vpx_highbd_idct32x32_1024_add_sse2>, TX_32X32,
639              1024, 8, 2),
640   make_tuple(&vpx_highbd_fdct32x32_c,
641              &highbd_wrapper<vpx_highbd_idct32x32_1024_add_c>,
642              &highbd_wrapper<vpx_highbd_idct32x32_1024_add_sse2>, TX_32X32,
643              1024, 10, 2),
644   make_tuple(&vpx_highbd_fdct32x32_c,
645              &highbd_wrapper<vpx_highbd_idct32x32_1024_add_c>,
646              &highbd_wrapper<vpx_highbd_idct32x32_1024_add_sse2>, TX_32X32,
647              1024, 12, 2),
648   make_tuple(
649       &vpx_highbd_fdct32x32_c, &highbd_wrapper<vpx_highbd_idct32x32_135_add_c>,
650       &highbd_wrapper<vpx_highbd_idct32x32_135_add_sse2>, TX_32X32, 135, 8, 2),
651   make_tuple(
652       &vpx_highbd_fdct32x32_c, &highbd_wrapper<vpx_highbd_idct32x32_135_add_c>,
653       &highbd_wrapper<vpx_highbd_idct32x32_135_add_sse2>, TX_32X32, 135, 10, 2),
654   make_tuple(
655       &vpx_highbd_fdct32x32_c, &highbd_wrapper<vpx_highbd_idct32x32_135_add_c>,
656       &highbd_wrapper<vpx_highbd_idct32x32_135_add_sse2>, TX_32X32, 135, 12, 2),
657   make_tuple(
658       &vpx_highbd_fdct32x32_c, &highbd_wrapper<vpx_highbd_idct32x32_34_add_c>,
659       &highbd_wrapper<vpx_highbd_idct32x32_34_add_sse2>, TX_32X32, 34, 8, 2),
660   make_tuple(
661       &vpx_highbd_fdct32x32_c, &highbd_wrapper<vpx_highbd_idct32x32_34_add_c>,
662       &highbd_wrapper<vpx_highbd_idct32x32_34_add_sse2>, TX_32X32, 34, 10, 2),
663   make_tuple(
664       &vpx_highbd_fdct32x32_c, &highbd_wrapper<vpx_highbd_idct32x32_34_add_c>,
665       &highbd_wrapper<vpx_highbd_idct32x32_34_add_sse2>, TX_32X32, 34, 12, 2),
666   make_tuple(
667       &vpx_highbd_fdct32x32_c, &highbd_wrapper<vpx_highbd_idct32x32_1_add_c>,
668       &highbd_wrapper<vpx_highbd_idct32x32_1_add_sse2>, TX_32X32, 1, 8, 2),
669   make_tuple(
670       &vpx_highbd_fdct32x32_c, &highbd_wrapper<vpx_highbd_idct32x32_1_add_c>,
671       &highbd_wrapper<vpx_highbd_idct32x32_1_add_sse2>, TX_32X32, 1, 10, 2),
672   make_tuple(
673       &vpx_highbd_fdct32x32_c, &highbd_wrapper<vpx_highbd_idct32x32_1_add_c>,
674       &highbd_wrapper<vpx_highbd_idct32x32_1_add_sse2>, TX_32X32, 1, 12, 2),
675   make_tuple(
676       &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_256_add_c>,
677       &highbd_wrapper<vpx_highbd_idct16x16_256_add_sse2>, TX_16X16, 256, 8, 2),
678   make_tuple(
679       &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_256_add_c>,
680       &highbd_wrapper<vpx_highbd_idct16x16_256_add_sse2>, TX_16X16, 256, 10, 2),
681   make_tuple(
682       &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_256_add_c>,
683       &highbd_wrapper<vpx_highbd_idct16x16_256_add_sse2>, TX_16X16, 256, 12, 2),
684   make_tuple(
685       &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_38_add_c>,
686       &highbd_wrapper<vpx_highbd_idct16x16_38_add_sse2>, TX_16X16, 38, 8, 2),
687   make_tuple(
688       &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_38_add_c>,
689       &highbd_wrapper<vpx_highbd_idct16x16_38_add_sse2>, TX_16X16, 38, 10, 2),
690   make_tuple(
691       &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_38_add_c>,
692       &highbd_wrapper<vpx_highbd_idct16x16_38_add_sse2>, TX_16X16, 38, 12, 2),
693   make_tuple(
694       &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_10_add_c>,
695       &highbd_wrapper<vpx_highbd_idct16x16_10_add_sse2>, TX_16X16, 10, 8, 2),
696   make_tuple(
697       &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_10_add_c>,
698       &highbd_wrapper<vpx_highbd_idct16x16_10_add_sse2>, TX_16X16, 10, 10, 2),
699   make_tuple(
700       &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_10_add_c>,
701       &highbd_wrapper<vpx_highbd_idct16x16_10_add_sse2>, TX_16X16, 10, 12, 2),
702   make_tuple(
703       &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_1_add_c>,
704       &highbd_wrapper<vpx_highbd_idct16x16_1_add_sse2>, TX_16X16, 1, 8, 2),
705   make_tuple(
706       &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_1_add_c>,
707       &highbd_wrapper<vpx_highbd_idct16x16_1_add_sse2>, TX_16X16, 1, 10, 2),
708   make_tuple(
709       &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_1_add_c>,
710       &highbd_wrapper<vpx_highbd_idct16x16_1_add_sse2>, TX_16X16, 1, 12, 2),
711   make_tuple(&vpx_highbd_fdct8x8_c,
712              &highbd_wrapper<vpx_highbd_idct8x8_64_add_c>,
713              &highbd_wrapper<vpx_highbd_idct8x8_64_add_sse2>, TX_8X8, 64, 8, 2),
714   make_tuple(
715       &vpx_highbd_fdct8x8_c, &highbd_wrapper<vpx_highbd_idct8x8_64_add_c>,
716       &highbd_wrapper<vpx_highbd_idct8x8_64_add_sse2>, TX_8X8, 64, 10, 2),
717   make_tuple(
718       &vpx_highbd_fdct8x8_c, &highbd_wrapper<vpx_highbd_idct8x8_64_add_c>,
719       &highbd_wrapper<vpx_highbd_idct8x8_64_add_sse2>, TX_8X8, 64, 12, 2),
720   make_tuple(&vpx_highbd_fdct8x8_c,
721              &highbd_wrapper<vpx_highbd_idct8x8_12_add_c>,
722              &highbd_wrapper<vpx_highbd_idct8x8_12_add_sse2>, TX_8X8, 12, 8, 2),
723   make_tuple(
724       &vpx_highbd_fdct8x8_c, &highbd_wrapper<vpx_highbd_idct8x8_12_add_c>,
725       &highbd_wrapper<vpx_highbd_idct8x8_12_add_sse2>, TX_8X8, 12, 10, 2),
726   make_tuple(
727       &vpx_highbd_fdct8x8_c, &highbd_wrapper<vpx_highbd_idct8x8_12_add_c>,
728       &highbd_wrapper<vpx_highbd_idct8x8_12_add_sse2>, TX_8X8, 12, 12, 2),
729   make_tuple(&vpx_highbd_fdct8x8_c, &highbd_wrapper<vpx_highbd_idct8x8_1_add_c>,
730              &highbd_wrapper<vpx_highbd_idct8x8_1_add_sse2>, TX_8X8, 1, 8, 2),
731   make_tuple(&vpx_highbd_fdct8x8_c, &highbd_wrapper<vpx_highbd_idct8x8_1_add_c>,
732              &highbd_wrapper<vpx_highbd_idct8x8_1_add_sse2>, TX_8X8, 1, 10, 2),
733   make_tuple(&vpx_highbd_fdct8x8_c, &highbd_wrapper<vpx_highbd_idct8x8_1_add_c>,
734              &highbd_wrapper<vpx_highbd_idct8x8_1_add_sse2>, TX_8X8, 1, 12, 2),
735   make_tuple(&vpx_highbd_fdct4x4_c,
736              &highbd_wrapper<vpx_highbd_idct4x4_16_add_c>,
737              &highbd_wrapper<vpx_highbd_idct4x4_16_add_sse2>, TX_4X4, 16, 8, 2),
738   make_tuple(
739       &vpx_highbd_fdct4x4_c, &highbd_wrapper<vpx_highbd_idct4x4_16_add_c>,
740       &highbd_wrapper<vpx_highbd_idct4x4_16_add_sse2>, TX_4X4, 16, 10, 2),
741   make_tuple(
742       &vpx_highbd_fdct4x4_c, &highbd_wrapper<vpx_highbd_idct4x4_16_add_c>,
743       &highbd_wrapper<vpx_highbd_idct4x4_16_add_sse2>, TX_4X4, 16, 12, 2),
744   make_tuple(&vpx_highbd_fdct4x4_c, &highbd_wrapper<vpx_highbd_idct4x4_1_add_c>,
745              &highbd_wrapper<vpx_highbd_idct4x4_1_add_sse2>, TX_4X4, 1, 8, 2),
746   make_tuple(&vpx_highbd_fdct4x4_c, &highbd_wrapper<vpx_highbd_idct4x4_1_add_c>,
747              &highbd_wrapper<vpx_highbd_idct4x4_1_add_sse2>, TX_4X4, 1, 10, 2),
748   make_tuple(&vpx_highbd_fdct4x4_c, &highbd_wrapper<vpx_highbd_idct4x4_1_add_c>,
749              &highbd_wrapper<vpx_highbd_idct4x4_1_add_sse2>, TX_4X4, 1, 12, 2),
750 #endif  // CONFIG_VP9_HIGHBITDEPTH
751   make_tuple(&vpx_fdct32x32_c, &wrapper<vpx_idct32x32_1024_add_c>,
752              &wrapper<vpx_idct32x32_1024_add_sse2>, TX_32X32, 1024, 8, 1),
753   make_tuple(&vpx_fdct32x32_c, &wrapper<vpx_idct32x32_135_add_c>,
754              &wrapper<vpx_idct32x32_135_add_sse2>, TX_32X32, 135, 8, 1),
755   make_tuple(&vpx_fdct32x32_c, &wrapper<vpx_idct32x32_34_add_c>,
756              &wrapper<vpx_idct32x32_34_add_sse2>, TX_32X32, 34, 8, 1),
757   make_tuple(&vpx_fdct32x32_c, &wrapper<vpx_idct32x32_1_add_c>,
758              &wrapper<vpx_idct32x32_1_add_sse2>, TX_32X32, 1, 8, 1),
759   make_tuple(&vpx_fdct16x16_c, &wrapper<vpx_idct16x16_256_add_c>,
760              &wrapper<vpx_idct16x16_256_add_sse2>, TX_16X16, 256, 8, 1),
761   make_tuple(&vpx_fdct16x16_c, &wrapper<vpx_idct16x16_38_add_c>,
762              &wrapper<vpx_idct16x16_38_add_sse2>, TX_16X16, 38, 8, 1),
763   make_tuple(&vpx_fdct16x16_c, &wrapper<vpx_idct16x16_10_add_c>,
764              &wrapper<vpx_idct16x16_10_add_sse2>, TX_16X16, 10, 8, 1),
765   make_tuple(&vpx_fdct16x16_c, &wrapper<vpx_idct16x16_1_add_c>,
766              &wrapper<vpx_idct16x16_1_add_sse2>, TX_16X16, 1, 8, 1),
767   make_tuple(&vpx_fdct8x8_c, &wrapper<vpx_idct8x8_64_add_c>,
768              &wrapper<vpx_idct8x8_64_add_sse2>, TX_8X8, 64, 8, 1),
769   make_tuple(&vpx_fdct8x8_c, &wrapper<vpx_idct8x8_12_add_c>,
770              &wrapper<vpx_idct8x8_12_add_sse2>, TX_8X8, 12, 8, 1),
771   make_tuple(&vpx_fdct8x8_c, &wrapper<vpx_idct8x8_1_add_c>,
772              &wrapper<vpx_idct8x8_1_add_sse2>, TX_8X8, 1, 8, 1),
773   make_tuple(&vpx_fdct4x4_c, &wrapper<vpx_idct4x4_16_add_c>,
774              &wrapper<vpx_idct4x4_16_add_sse2>, TX_4X4, 16, 8, 1),
775   make_tuple(&vpx_fdct4x4_c, &wrapper<vpx_idct4x4_1_add_c>,
776              &wrapper<vpx_idct4x4_1_add_sse2>, TX_4X4, 1, 8, 1)
777 };
778 
779 INSTANTIATE_TEST_CASE_P(SSE2, PartialIDctTest,
780                         ::testing::ValuesIn(sse2_partial_idct_tests));
781 
782 #endif  // HAVE_SSE2
783 
784 #if HAVE_SSSE3
785 const PartialInvTxfmParam ssse3_partial_idct_tests[] = {
786   make_tuple(&vpx_fdct32x32_c, &wrapper<vpx_idct32x32_135_add_c>,
787              &wrapper<vpx_idct32x32_135_add_ssse3>, TX_32X32, 135, 8, 1),
788   make_tuple(&vpx_fdct32x32_c, &wrapper<vpx_idct32x32_34_add_c>,
789              &wrapper<vpx_idct32x32_34_add_ssse3>, TX_32X32, 34, 8, 1),
790   make_tuple(&vpx_fdct8x8_c, &wrapper<vpx_idct8x8_12_add_c>,
791              &wrapper<vpx_idct8x8_12_add_ssse3>, TX_8X8, 12, 8, 1)
792 };
793 
794 INSTANTIATE_TEST_CASE_P(SSSE3, PartialIDctTest,
795                         ::testing::ValuesIn(ssse3_partial_idct_tests));
796 #endif  // HAVE_SSSE3
797 
798 #if HAVE_SSE4_1 && CONFIG_VP9_HIGHBITDEPTH
799 const PartialInvTxfmParam sse4_1_partial_idct_tests[] = {
800   make_tuple(&vpx_highbd_fdct32x32_c,
801              &highbd_wrapper<vpx_highbd_idct32x32_1024_add_c>,
802              &highbd_wrapper<vpx_highbd_idct32x32_1024_add_sse4_1>, TX_32X32,
803              1024, 8, 2),
804   make_tuple(&vpx_highbd_fdct32x32_c,
805              &highbd_wrapper<vpx_highbd_idct32x32_1024_add_c>,
806              &highbd_wrapper<vpx_highbd_idct32x32_1024_add_sse4_1>, TX_32X32,
807              1024, 10, 2),
808   make_tuple(&vpx_highbd_fdct32x32_c,
809              &highbd_wrapper<vpx_highbd_idct32x32_1024_add_c>,
810              &highbd_wrapper<vpx_highbd_idct32x32_1024_add_sse4_1>, TX_32X32,
811              1024, 12, 2),
812   make_tuple(&vpx_highbd_fdct32x32_c,
813              &highbd_wrapper<vpx_highbd_idct32x32_135_add_c>,
814              &highbd_wrapper<vpx_highbd_idct32x32_135_add_sse4_1>, TX_32X32,
815              135, 8, 2),
816   make_tuple(&vpx_highbd_fdct32x32_c,
817              &highbd_wrapper<vpx_highbd_idct32x32_135_add_c>,
818              &highbd_wrapper<vpx_highbd_idct32x32_135_add_sse4_1>, TX_32X32,
819              135, 10, 2),
820   make_tuple(&vpx_highbd_fdct32x32_c,
821              &highbd_wrapper<vpx_highbd_idct32x32_135_add_c>,
822              &highbd_wrapper<vpx_highbd_idct32x32_135_add_sse4_1>, TX_32X32,
823              135, 12, 2),
824   make_tuple(
825       &vpx_highbd_fdct32x32_c, &highbd_wrapper<vpx_highbd_idct32x32_34_add_c>,
826       &highbd_wrapper<vpx_highbd_idct32x32_34_add_sse4_1>, TX_32X32, 34, 8, 2),
827   make_tuple(
828       &vpx_highbd_fdct32x32_c, &highbd_wrapper<vpx_highbd_idct32x32_34_add_c>,
829       &highbd_wrapper<vpx_highbd_idct32x32_34_add_sse4_1>, TX_32X32, 34, 10, 2),
830   make_tuple(
831       &vpx_highbd_fdct32x32_c, &highbd_wrapper<vpx_highbd_idct32x32_34_add_c>,
832       &highbd_wrapper<vpx_highbd_idct32x32_34_add_sse4_1>, TX_32X32, 34, 12, 2),
833   make_tuple(&vpx_highbd_fdct16x16_c,
834              &highbd_wrapper<vpx_highbd_idct16x16_256_add_c>,
835              &highbd_wrapper<vpx_highbd_idct16x16_256_add_sse4_1>, TX_16X16,
836              256, 8, 2),
837   make_tuple(&vpx_highbd_fdct16x16_c,
838              &highbd_wrapper<vpx_highbd_idct16x16_256_add_c>,
839              &highbd_wrapper<vpx_highbd_idct16x16_256_add_sse4_1>, TX_16X16,
840              256, 10, 2),
841   make_tuple(&vpx_highbd_fdct16x16_c,
842              &highbd_wrapper<vpx_highbd_idct16x16_256_add_c>,
843              &highbd_wrapper<vpx_highbd_idct16x16_256_add_sse4_1>, TX_16X16,
844              256, 12, 2),
845   make_tuple(
846       &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_38_add_c>,
847       &highbd_wrapper<vpx_highbd_idct16x16_38_add_sse4_1>, TX_16X16, 38, 8, 2),
848   make_tuple(
849       &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_38_add_c>,
850       &highbd_wrapper<vpx_highbd_idct16x16_38_add_sse4_1>, TX_16X16, 38, 10, 2),
851   make_tuple(
852       &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_38_add_c>,
853       &highbd_wrapper<vpx_highbd_idct16x16_38_add_sse4_1>, TX_16X16, 38, 12, 2),
854   make_tuple(
855       &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_10_add_c>,
856       &highbd_wrapper<vpx_highbd_idct16x16_10_add_sse4_1>, TX_16X16, 10, 8, 2),
857   make_tuple(
858       &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_10_add_c>,
859       &highbd_wrapper<vpx_highbd_idct16x16_10_add_sse4_1>, TX_16X16, 10, 10, 2),
860   make_tuple(
861       &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_10_add_c>,
862       &highbd_wrapper<vpx_highbd_idct16x16_10_add_sse4_1>, TX_16X16, 10, 12, 2),
863   make_tuple(
864       &vpx_highbd_fdct8x8_c, &highbd_wrapper<vpx_highbd_idct8x8_64_add_c>,
865       &highbd_wrapper<vpx_highbd_idct8x8_64_add_sse4_1>, TX_8X8, 64, 8, 2),
866   make_tuple(
867       &vpx_highbd_fdct8x8_c, &highbd_wrapper<vpx_highbd_idct8x8_64_add_c>,
868       &highbd_wrapper<vpx_highbd_idct8x8_64_add_sse4_1>, TX_8X8, 64, 10, 2),
869   make_tuple(
870       &vpx_highbd_fdct8x8_c, &highbd_wrapper<vpx_highbd_idct8x8_64_add_c>,
871       &highbd_wrapper<vpx_highbd_idct8x8_64_add_sse4_1>, TX_8X8, 64, 12, 2),
872   make_tuple(
873       &vpx_highbd_fdct8x8_c, &highbd_wrapper<vpx_highbd_idct8x8_12_add_c>,
874       &highbd_wrapper<vpx_highbd_idct8x8_12_add_sse4_1>, TX_8X8, 12, 8, 2),
875   make_tuple(
876       &vpx_highbd_fdct8x8_c, &highbd_wrapper<vpx_highbd_idct8x8_12_add_c>,
877       &highbd_wrapper<vpx_highbd_idct8x8_12_add_sse4_1>, TX_8X8, 12, 10, 2),
878   make_tuple(
879       &vpx_highbd_fdct8x8_c, &highbd_wrapper<vpx_highbd_idct8x8_12_add_c>,
880       &highbd_wrapper<vpx_highbd_idct8x8_12_add_sse4_1>, TX_8X8, 12, 12, 2),
881   make_tuple(
882       &vpx_highbd_fdct4x4_c, &highbd_wrapper<vpx_highbd_idct4x4_16_add_c>,
883       &highbd_wrapper<vpx_highbd_idct4x4_16_add_sse4_1>, TX_4X4, 16, 8, 2),
884   make_tuple(
885       &vpx_highbd_fdct4x4_c, &highbd_wrapper<vpx_highbd_idct4x4_16_add_c>,
886       &highbd_wrapper<vpx_highbd_idct4x4_16_add_sse4_1>, TX_4X4, 16, 10, 2),
887   make_tuple(
888       &vpx_highbd_fdct4x4_c, &highbd_wrapper<vpx_highbd_idct4x4_16_add_c>,
889       &highbd_wrapper<vpx_highbd_idct4x4_16_add_sse4_1>, TX_4X4, 16, 12, 2)
890 };
891 
892 INSTANTIATE_TEST_CASE_P(SSE4_1, PartialIDctTest,
893                         ::testing::ValuesIn(sse4_1_partial_idct_tests));
894 #endif  // HAVE_SSE4_1 && CONFIG_VP9_HIGHBITDEPTH
895 
896 #if HAVE_DSPR2 && !CONFIG_VP9_HIGHBITDEPTH
897 const PartialInvTxfmParam dspr2_partial_idct_tests[] = {
898   make_tuple(&vpx_fdct32x32_c, &wrapper<vpx_idct32x32_1024_add_c>,
899              &wrapper<vpx_idct32x32_1024_add_dspr2>, TX_32X32, 1024, 8, 1),
900   make_tuple(&vpx_fdct32x32_c, &wrapper<vpx_idct32x32_34_add_c>,
901              &wrapper<vpx_idct32x32_34_add_dspr2>, TX_32X32, 34, 8, 1),
902   make_tuple(&vpx_fdct32x32_c, &wrapper<vpx_idct32x32_1_add_c>,
903              &wrapper<vpx_idct32x32_1_add_dspr2>, TX_32X32, 1, 8, 1),
904   make_tuple(&vpx_fdct16x16_c, &wrapper<vpx_idct16x16_256_add_c>,
905              &wrapper<vpx_idct16x16_256_add_dspr2>, TX_16X16, 256, 8, 1),
906   make_tuple(&vpx_fdct16x16_c, &wrapper<vpx_idct16x16_10_add_c>,
907              &wrapper<vpx_idct16x16_10_add_dspr2>, TX_16X16, 10, 8, 1),
908   make_tuple(&vpx_fdct16x16_c, &wrapper<vpx_idct16x16_1_add_c>,
909              &wrapper<vpx_idct16x16_1_add_dspr2>, TX_16X16, 1, 8, 1),
910   make_tuple(&vpx_fdct8x8_c, &wrapper<vpx_idct8x8_64_add_c>,
911              &wrapper<vpx_idct8x8_64_add_dspr2>, TX_8X8, 64, 8, 1),
912   make_tuple(&vpx_fdct8x8_c, &wrapper<vpx_idct8x8_12_add_c>,
913              &wrapper<vpx_idct8x8_12_add_dspr2>, TX_8X8, 12, 8, 1),
914   make_tuple(&vpx_fdct8x8_c, &wrapper<vpx_idct8x8_1_add_c>,
915              &wrapper<vpx_idct8x8_1_add_dspr2>, TX_8X8, 1, 8, 1),
916   make_tuple(&vpx_fdct4x4_c, &wrapper<vpx_idct4x4_16_add_c>,
917              &wrapper<vpx_idct4x4_16_add_dspr2>, TX_4X4, 16, 8, 1),
918   make_tuple(&vpx_fdct4x4_c, &wrapper<vpx_idct4x4_1_add_c>,
919              &wrapper<vpx_idct4x4_1_add_dspr2>, TX_4X4, 1, 8, 1)
920 };
921 
922 INSTANTIATE_TEST_CASE_P(DSPR2, PartialIDctTest,
923                         ::testing::ValuesIn(dspr2_partial_idct_tests));
924 #endif  // HAVE_DSPR2 && !CONFIG_VP9_HIGHBITDEPTH
925 
926 #if HAVE_MSA && !CONFIG_VP9_HIGHBITDEPTH
927 // 32x32_135_ is implemented using the 1024 version.
928 const PartialInvTxfmParam msa_partial_idct_tests[] = {
929   make_tuple(&vpx_fdct32x32_c, &wrapper<vpx_idct32x32_1024_add_c>,
930              &wrapper<vpx_idct32x32_1024_add_msa>, TX_32X32, 1024, 8, 1),
931   make_tuple(&vpx_fdct32x32_c, &wrapper<vpx_idct32x32_34_add_c>,
932              &wrapper<vpx_idct32x32_34_add_msa>, TX_32X32, 34, 8, 1),
933   make_tuple(&vpx_fdct32x32_c, &wrapper<vpx_idct32x32_1_add_c>,
934              &wrapper<vpx_idct32x32_1_add_msa>, TX_32X32, 1, 8, 1),
935   make_tuple(&vpx_fdct16x16_c, &wrapper<vpx_idct16x16_256_add_c>,
936              &wrapper<vpx_idct16x16_256_add_msa>, TX_16X16, 256, 8, 1),
937   make_tuple(&vpx_fdct16x16_c, &wrapper<vpx_idct16x16_10_add_c>,
938              &wrapper<vpx_idct16x16_10_add_msa>, TX_16X16, 10, 8, 1),
939   make_tuple(&vpx_fdct16x16_c, &wrapper<vpx_idct16x16_1_add_c>,
940              &wrapper<vpx_idct16x16_1_add_msa>, TX_16X16, 1, 8, 1),
941   make_tuple(&vpx_fdct8x8_c, &wrapper<vpx_idct8x8_64_add_c>,
942              &wrapper<vpx_idct8x8_64_add_msa>, TX_8X8, 64, 8, 1),
943   make_tuple(&vpx_fdct8x8_c, &wrapper<vpx_idct8x8_12_add_c>,
944              &wrapper<vpx_idct8x8_12_add_msa>, TX_8X8, 12, 8, 1),
945   make_tuple(&vpx_fdct8x8_c, &wrapper<vpx_idct8x8_1_add_c>,
946              &wrapper<vpx_idct8x8_1_add_msa>, TX_8X8, 1, 8, 1),
947   make_tuple(&vpx_fdct4x4_c, &wrapper<vpx_idct4x4_16_add_c>,
948              &wrapper<vpx_idct4x4_16_add_msa>, TX_4X4, 16, 8, 1),
949   make_tuple(&vpx_fdct4x4_c, &wrapper<vpx_idct4x4_1_add_c>,
950              &wrapper<vpx_idct4x4_1_add_msa>, TX_4X4, 1, 8, 1)
951 };
952 
953 INSTANTIATE_TEST_CASE_P(MSA, PartialIDctTest,
954                         ::testing::ValuesIn(msa_partial_idct_tests));
955 #endif  // HAVE_MSA && !CONFIG_VP9_HIGHBITDEPTH
956 
957 #endif  // !CONFIG_EMULATE_HARDWARE
958 
959 }  // namespace
960