/*
 * Copyright (c) 2016, Alliance for Open Media. All rights reserved
 *
 * This source code is subject to the terms of the BSD 2 Clause License and
 * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
 * was not distributed with this source code in the LICENSE file, you can
 * obtain it at www.aomedia.org/license/software. If the Alliance for Open
 * Media Patent License 1.0 was not distributed with this source code in the
 * PATENTS file, you can obtain it at www.aomedia.org/license/patent.
*/

#include <math.h>
#include <stdlib.h>
#include <string.h>
#include <limits>

#include "third_party/googletest/src/googletest/include/gtest/gtest.h"

#include "./av1_rtcd.h"
#include "./aom_dsp_rtcd.h"
#include "test/acm_random.h"
#include "test/clear_system_state.h"
#include "test/register_state_check.h"
#include "test/util.h"
#include "av1/common/blockd.h"
#include "av1/common/scan.h"
#include "aom/aom_integer.h"
#include "aom_ports/aom_timer.h"

using libaom_test::ACMRandom;

namespace {
typedef void (*FwdTxfmFunc)(const int16_t *in, tran_low_t *out, int stride);
typedef void (*InvTxfmFunc)(const tran_low_t *in, uint8_t *out, int stride);
typedef void (*InvTxfmWithBdFunc)(const tran_low_t *in, uint8_t *out,
                                  int stride, int bd);

template <InvTxfmFunc fn>
void wrapper(const tran_low_t *in, uint8_t *out, int stride, int bd) {
  (void)bd;
  fn(in, out, stride);
}

#if CONFIG_HIGHBITDEPTH
template <InvTxfmWithBdFunc fn>
void highbd_wrapper(const tran_low_t *in, uint8_t *out, int stride, int bd) {
  fn(in, CONVERT_TO_BYTEPTR(out), stride, bd);
}
#endif

typedef std::tr1::tuple<FwdTxfmFunc, InvTxfmWithBdFunc, InvTxfmWithBdFunc,
                        TX_SIZE, int, int, int>
    PartialInvTxfmParam;
const int kMaxNumCoeffs = 1024;
const int kCountTestBlock = 1000;

class PartialIDctTest : public ::testing::TestWithParam<PartialInvTxfmParam> {
 public:
  virtual ~PartialIDctTest() {}
  virtual void SetUp() {
    rnd_.Reset(ACMRandom::DeterministicSeed());
    ftxfm_ = GET_PARAM(0);
    full_itxfm_ = GET_PARAM(1);
    partial_itxfm_ = GET_PARAM(2);
    tx_size_ = GET_PARAM(3);
    last_nonzero_ = GET_PARAM(4);
    bit_depth_ = GET_PARAM(5);
    pixel_size_ = GET_PARAM(6);
    mask_ = (1 << bit_depth_) - 1;

    switch (tx_size_) {
      case TX_4X4: size_ = 4; break;
      case TX_8X8: size_ = 8; break;
      case TX_16X16: size_ = 16; break;
      case TX_32X32: size_ = 32; break;
      default: FAIL() << "Wrong Size!"; break;
    }

    // Randomize stride_ to a value less than or equal to 1024
    stride_ = rnd_(1024) + 1;
    if (stride_ < size_) {
      stride_ = size_;
    }
    // Align stride_ to 16 if it's bigger than 16.
    if (stride_ > 16) {
      stride_ &= ~15;
    }

    input_block_size_ = size_ * size_;
    output_block_size_ = size_ * stride_;

    input_block_ = reinterpret_cast<tran_low_t *>(
        aom_memalign(16, sizeof(*input_block_) * input_block_size_));
    output_block_ = reinterpret_cast<uint8_t *>(
        aom_memalign(16, pixel_size_ * output_block_size_));
    output_block_ref_ = reinterpret_cast<uint8_t *>(
        aom_memalign(16, pixel_size_ * output_block_size_));
  }

  virtual void TearDown() {
    aom_free(input_block_);
    input_block_ = NULL;
    aom_free(output_block_);
    output_block_ = NULL;
    aom_free(output_block_ref_);
    output_block_ref_ = NULL;
    libaom_test::ClearSystemState();
  }

  void InitMem() {
    memset(input_block_, 0, sizeof(*input_block_) * input_block_size_);
    if (pixel_size_ == 1) {
      for (int j = 0; j < output_block_size_; ++j) {
        output_block_[j] = output_block_ref_[j] = rnd_.Rand16() & mask_;
      }
    } else {
      ASSERT_EQ(2, pixel_size_);
      uint16_t *const output = reinterpret_cast<uint16_t *>(output_block_);
      uint16_t *const output_ref =
          reinterpret_cast<uint16_t *>(output_block_ref_);
      for (int j = 0; j < output_block_size_; ++j) {
        output[j] = output_ref[j] = rnd_.Rand16() & mask_;
      }
    }
  }

  void InitInput() {
    const int max_coeff = 32766 / 4;
    int max_energy_leftover = max_coeff * max_coeff;
    for (int j = 0; j < last_nonzero_; ++j) {
      int16_t coeff = static_cast<int16_t>(sqrt(1.0 * max_energy_leftover) *
                                           (rnd_.Rand16() - 32768) / 65536);
      max_energy_leftover -= coeff * coeff;
      if (max_energy_leftover < 0) {
        max_energy_leftover = 0;
        coeff = 0;
      }
      input_block_[av1_default_scan_orders[tx_size_].scan[j]] = coeff;
    }
  }

 protected:
  int last_nonzero_;
  TX_SIZE tx_size_;
  tran_low_t *input_block_;
  uint8_t *output_block_;
  uint8_t *output_block_ref_;
  int size_;
  int stride_;
  int pixel_size_;
  int input_block_size_;
  int output_block_size_;
  int bit_depth_;
  int mask_;
  FwdTxfmFunc ftxfm_;
  InvTxfmWithBdFunc full_itxfm_;
  InvTxfmWithBdFunc partial_itxfm_;
  ACMRandom rnd_;
};

TEST_P(PartialIDctTest, RunQuantCheck) {
  DECLARE_ALIGNED(16, int16_t, input_extreme_block[kMaxNumCoeffs]);
  DECLARE_ALIGNED(16, tran_low_t, output_ref_block[kMaxNumCoeffs]);

  InitMem();
  for (int i = 0; i < kCountTestBlock; ++i) {
    // Initialize a test block with input range [-mask_, mask_].
    if (i == 0) {
      for (int k = 0; k < input_block_size_; ++k) {
        input_extreme_block[k] = mask_;
      }
    } else if (i == 1) {
      for (int k = 0; k < input_block_size_; ++k) {
        input_extreme_block[k] = -mask_;
      }
    } else {
      for (int k = 0; k < input_block_size_; ++k) {
        input_extreme_block[k] = rnd_.Rand8() % 2 ? mask_ : -mask_;
      }
    }

    ftxfm_(input_extreme_block, output_ref_block, size_);

    // quantization with minimum allowed step sizes
    input_block_[0] = (output_ref_block[0] / 4) * 4;
    for (int k = 1; k < last_nonzero_; ++k) {
      const int pos = av1_default_scan_orders[tx_size_].scan[k];
      input_block_[pos] = (output_ref_block[pos] / 4) * 4;
    }

    ASM_REGISTER_STATE_CHECK(
        full_itxfm_(input_block_, output_block_ref_, stride_, bit_depth_));
    ASM_REGISTER_STATE_CHECK(
        partial_itxfm_(input_block_, output_block_, stride_, bit_depth_));
    ASSERT_EQ(0, memcmp(output_block_ref_, output_block_,
                        pixel_size_ * output_block_size_))
        << "Error: partial inverse transform produces different results";
  }
}

TEST_P(PartialIDctTest, ResultsMatch) {
  for (int i = 0; i < kCountTestBlock; ++i) {
    InitMem();
    InitInput();

    ASM_REGISTER_STATE_CHECK(
        full_itxfm_(input_block_, output_block_ref_, stride_, bit_depth_));
    ASM_REGISTER_STATE_CHECK(
        partial_itxfm_(input_block_, output_block_, stride_, bit_depth_));
    ASSERT_EQ(0, memcmp(output_block_ref_, output_block_,
                        pixel_size_ * output_block_size_))
        << "Error: partial inverse transform produces different results";
  }
}

TEST_P(PartialIDctTest, AddOutputBlock) {
  for (int i = 0; i < kCountTestBlock; ++i) {
    InitMem();
    for (int j = 0; j < last_nonzero_; ++j) {
      input_block_[av1_default_scan_orders[tx_size_].scan[j]] = 10;
    }

    ASM_REGISTER_STATE_CHECK(
        full_itxfm_(input_block_, output_block_ref_, stride_, bit_depth_));
    ASM_REGISTER_STATE_CHECK(
        partial_itxfm_(input_block_, output_block_, stride_, bit_depth_));
    ASSERT_EQ(0, memcmp(output_block_ref_, output_block_,
                        pixel_size_ * output_block_size_))
        << "Error: Transform results are not correctly added to output.";
  }
}

TEST_P(PartialIDctTest, SingleExtremeCoeff) {
  const int16_t max_coeff = std::numeric_limits<int16_t>::max();
  const int16_t min_coeff = std::numeric_limits<int16_t>::min();
  for (int i = 0; i < last_nonzero_; ++i) {
    memset(input_block_, 0, sizeof(*input_block_) * input_block_size_);
    // Run once for min and once for max.
    for (int j = 0; j < 2; ++j) {
      const int coeff = j ? min_coeff : max_coeff;

      memset(output_block_, 0, pixel_size_ * output_block_size_);
      memset(output_block_ref_, 0, pixel_size_ * output_block_size_);
      input_block_[av1_default_scan_orders[tx_size_].scan[i]] = coeff;

      ASM_REGISTER_STATE_CHECK(
          full_itxfm_(input_block_, output_block_ref_, stride_, bit_depth_));
      ASM_REGISTER_STATE_CHECK(
          partial_itxfm_(input_block_, output_block_, stride_, bit_depth_));
      ASSERT_EQ(0, memcmp(output_block_ref_, output_block_,
                          pixel_size_ * output_block_size_))
          << "Error: Fails with single coeff of " << coeff << " at " << i
          << ".";
    }
  }
}

TEST_P(PartialIDctTest, DISABLED_Speed) {
  // Keep runtime stable with transform size.
  const int kCountSpeedTestBlock = 500000000 / input_block_size_;
  InitMem();
  InitInput();

  for (int i = 0; i < kCountSpeedTestBlock; ++i) {
    ASM_REGISTER_STATE_CHECK(
        full_itxfm_(input_block_, output_block_ref_, stride_, bit_depth_));
  }
  aom_usec_timer timer;
  aom_usec_timer_start(&timer);
  for (int i = 0; i < kCountSpeedTestBlock; ++i) {
    partial_itxfm_(input_block_, output_block_, stride_, bit_depth_);
  }
  libaom_test::ClearSystemState();
  aom_usec_timer_mark(&timer);
  const int elapsed_time =
      static_cast<int>(aom_usec_timer_elapsed(&timer) / 1000);
  printf("idct%dx%d_%d (bitdepth %d) time: %5d ms\n", size_, size_,
         last_nonzero_, bit_depth_, elapsed_time);

  ASSERT_EQ(0, memcmp(output_block_ref_, output_block_,
                      pixel_size_ * output_block_size_))
      << "Error: partial inverse transform produces different results";
}

using std::tr1::make_tuple;

const PartialInvTxfmParam c_partial_idct_tests[] = {
#if CONFIG_HIGHBITDEPTH
  make_tuple(&aom_highbd_fdct4x4_c,
             &highbd_wrapper<aom_highbd_idct4x4_16_add_c>,
             &highbd_wrapper<aom_highbd_idct4x4_16_add_c>, TX_4X4, 16, 8, 2),
  make_tuple(&aom_highbd_fdct4x4_c,
             &highbd_wrapper<aom_highbd_idct4x4_16_add_c>,
             &highbd_wrapper<aom_highbd_idct4x4_16_add_c>, TX_4X4, 16, 10, 2),
  make_tuple(&aom_highbd_fdct4x4_c,
             &highbd_wrapper<aom_highbd_idct4x4_16_add_c>,
             &highbd_wrapper<aom_highbd_idct4x4_16_add_c>, TX_4X4, 16, 12, 2),
  make_tuple(&aom_highbd_fdct4x4_c,
             &highbd_wrapper<aom_highbd_idct4x4_16_add_c>,
             &highbd_wrapper<aom_highbd_idct4x4_1_add_c>, TX_4X4, 1, 8, 2),
  make_tuple(&aom_highbd_fdct4x4_c,
             &highbd_wrapper<aom_highbd_idct4x4_16_add_c>,
             &highbd_wrapper<aom_highbd_idct4x4_1_add_c>, TX_4X4, 1, 10, 2),
  make_tuple(&aom_highbd_fdct4x4_c,
             &highbd_wrapper<aom_highbd_idct4x4_16_add_c>,
             &highbd_wrapper<aom_highbd_idct4x4_1_add_c>, TX_4X4, 1, 12, 2),
#endif  // CONFIG_HIGHBITDEPTH
  make_tuple(&aom_fdct32x32_c, &wrapper<aom_idct32x32_1024_add_c>,
             &wrapper<aom_idct32x32_1024_add_c>, TX_32X32, 1024, 8, 1),
  make_tuple(&aom_fdct32x32_c, &wrapper<aom_idct32x32_1024_add_c>,
             &wrapper<aom_idct32x32_135_add_c>, TX_32X32, 135, 8, 1),
  make_tuple(&aom_fdct32x32_c, &wrapper<aom_idct32x32_1024_add_c>,
             &wrapper<aom_idct32x32_34_add_c>, TX_32X32, 34, 8, 1),
  make_tuple(&aom_fdct32x32_c, &wrapper<aom_idct32x32_1024_add_c>,
             &wrapper<aom_idct32x32_1_add_c>, TX_32X32, 1, 8, 1),
  make_tuple(&aom_fdct16x16_c, &wrapper<aom_idct16x16_256_add_c>,
             &wrapper<aom_idct16x16_256_add_c>, TX_16X16, 256, 8, 1),
  make_tuple(&aom_fdct16x16_c, &wrapper<aom_idct16x16_256_add_c>,
             &wrapper<aom_idct16x16_38_add_c>, TX_16X16, 38, 8, 1),
  make_tuple(&aom_fdct16x16_c, &wrapper<aom_idct16x16_256_add_c>,
             &wrapper<aom_idct16x16_10_add_c>, TX_16X16, 10, 8, 1),
  make_tuple(&aom_fdct16x16_c, &wrapper<aom_idct16x16_256_add_c>,
             &wrapper<aom_idct16x16_1_add_c>, TX_16X16, 1, 8, 1),
  make_tuple(&aom_fdct8x8_c, &wrapper<aom_idct8x8_64_add_c>,
             &wrapper<aom_idct8x8_64_add_c>, TX_8X8, 64, 8, 1),
  make_tuple(&aom_fdct8x8_c, &wrapper<aom_idct8x8_64_add_c>,
             &wrapper<aom_idct8x8_12_add_c>, TX_8X8, 12, 8, 1),
  make_tuple(&aom_fdct8x8_c, &wrapper<aom_idct8x8_64_add_c>,
             &wrapper<aom_idct8x8_1_add_c>, TX_8X8, 1, 8, 1),
  make_tuple(&aom_fdct4x4_c, &wrapper<aom_idct4x4_16_add_c>,
             &wrapper<aom_idct4x4_16_add_c>, TX_4X4, 16, 8, 1),
  make_tuple(&aom_fdct4x4_c, &wrapper<aom_idct4x4_16_add_c>,
             &wrapper<aom_idct4x4_1_add_c>, TX_4X4, 1, 8, 1)
};

INSTANTIATE_TEST_CASE_P(C, PartialIDctTest,
                        ::testing::ValuesIn(c_partial_idct_tests));

#if HAVE_NEON && !CONFIG_HIGHBITDEPTH
const PartialInvTxfmParam neon_partial_idct_tests[] = {
  make_tuple(&aom_fdct32x32_c, &wrapper<aom_idct32x32_1024_add_c>,
             &wrapper<aom_idct32x32_1_add_neon>, TX_32X32, 1, 8, 1),
  make_tuple(&aom_fdct16x16_c, &wrapper<aom_idct16x16_256_add_c>,
             &wrapper<aom_idct16x16_10_add_neon>, TX_16X16, 10, 8, 1),
  make_tuple(&aom_fdct16x16_c, &wrapper<aom_idct16x16_256_add_c>,
             &wrapper<aom_idct16x16_1_add_neon>, TX_16X16, 1, 8, 1),
  make_tuple(&aom_fdct8x8_c, &wrapper<aom_idct8x8_64_add_c>,
             &wrapper<aom_idct8x8_12_add_neon>, TX_8X8, 12, 8, 1),
  make_tuple(&aom_fdct8x8_c, &wrapper<aom_idct8x8_64_add_c>,
             &wrapper<aom_idct8x8_1_add_neon>, TX_8X8, 1, 8, 1),
  make_tuple(&aom_fdct4x4_c, &wrapper<aom_idct4x4_16_add_c>,
             &wrapper<aom_idct4x4_1_add_neon>, TX_4X4, 1, 8, 1)
};

INSTANTIATE_TEST_CASE_P(NEON, PartialIDctTest,
                        ::testing::ValuesIn(neon_partial_idct_tests));
#endif  // HAVE_NEON && !CONFIG_HIGHBITDEPTH

#if HAVE_SSE2
const PartialInvTxfmParam sse2_partial_idct_tests[] = {
#if CONFIG_HIGHBITDEPTH
  make_tuple(&aom_highbd_fdct4x4_c,
             &highbd_wrapper<aom_highbd_idct4x4_16_add_c>,
             &highbd_wrapper<aom_highbd_idct4x4_16_add_sse2>, TX_4X4, 16, 8, 2),
  make_tuple(
      &aom_highbd_fdct4x4_c, &highbd_wrapper<aom_highbd_idct4x4_16_add_c>,
      &highbd_wrapper<aom_highbd_idct4x4_16_add_sse2>, TX_4X4, 16, 10, 2),
  make_tuple(
      &aom_highbd_fdct4x4_c, &highbd_wrapper<aom_highbd_idct4x4_16_add_c>,
      &highbd_wrapper<aom_highbd_idct4x4_16_add_sse2>, TX_4X4, 16, 12, 2),
#endif  // CONFIG_HIGHBITDEPTH
  make_tuple(&aom_fdct32x32_c, &wrapper<aom_idct32x32_1024_add_c>,
             &wrapper<aom_idct32x32_1024_add_sse2>, TX_32X32, 1024, 8, 1),
  make_tuple(&aom_fdct32x32_c, &wrapper<aom_idct32x32_1024_add_c>,
             &wrapper<aom_idct32x32_1024_add_sse2>, TX_32X32, 135, 8, 1),
  make_tuple(&aom_fdct32x32_c, &wrapper<aom_idct32x32_1024_add_c>,
             &wrapper<aom_idct32x32_34_add_sse2>, TX_32X32, 34, 8, 1),
  make_tuple(&aom_fdct32x32_c, &wrapper<aom_idct32x32_1024_add_c>,
             &wrapper<aom_idct32x32_1_add_sse2>, TX_32X32, 1, 8, 1),
  make_tuple(&aom_fdct16x16_c, &wrapper<aom_idct16x16_256_add_c>,
             &wrapper<aom_idct16x16_256_add_sse2>, TX_16X16, 256, 8, 1),
  make_tuple(&aom_fdct16x16_c, &wrapper<aom_idct16x16_256_add_c>,
             &wrapper<aom_idct16x16_10_add_sse2>, TX_16X16, 10, 8, 1),
  make_tuple(&aom_fdct16x16_c, &wrapper<aom_idct16x16_256_add_c>,
             &wrapper<aom_idct16x16_1_add_sse2>, TX_16X16, 1, 8, 1),
  make_tuple(&aom_fdct8x8_c, &wrapper<aom_idct8x8_64_add_c>,
             &wrapper<aom_idct8x8_64_add_sse2>, TX_8X8, 64, 8, 1),
  make_tuple(&aom_fdct8x8_c, &wrapper<aom_idct8x8_64_add_c>,
             &wrapper<aom_idct8x8_12_add_sse2>, TX_8X8, 12, 8, 1),
  make_tuple(&aom_fdct8x8_c, &wrapper<aom_idct8x8_64_add_c>,
             &wrapper<aom_idct8x8_1_add_sse2>, TX_8X8, 1, 8, 1),
  make_tuple(&aom_fdct4x4_c, &wrapper<aom_idct4x4_16_add_c>,
             &wrapper<aom_idct4x4_16_add_sse2>, TX_4X4, 16, 8, 1),
  make_tuple(&aom_fdct4x4_c, &wrapper<aom_idct4x4_16_add_c>,
             &wrapper<aom_idct4x4_1_add_sse2>, TX_4X4, 1, 8, 1)
};

INSTANTIATE_TEST_CASE_P(SSE2, PartialIDctTest,
                        ::testing::ValuesIn(sse2_partial_idct_tests));

#endif  // HAVE_SSE2

#if HAVE_SSSE3
const PartialInvTxfmParam ssse3_partial_idct_tests[] = {
  make_tuple(&aom_fdct32x32_c, &wrapper<aom_idct32x32_1024_add_c>,
             &wrapper<aom_idct32x32_1024_add_ssse3>, TX_32X32, 1024, 8, 1),
  make_tuple(&aom_fdct32x32_c, &wrapper<aom_idct32x32_1024_add_c>,
             &wrapper<aom_idct32x32_135_add_ssse3>, TX_32X32, 135, 8, 1),
  make_tuple(&aom_fdct32x32_c, &wrapper<aom_idct32x32_1024_add_c>,
             &wrapper<aom_idct32x32_34_add_ssse3>, TX_32X32, 34, 8, 1),
  make_tuple(&aom_fdct8x8_c, &wrapper<aom_idct8x8_64_add_c>,
             &wrapper<aom_idct8x8_64_add_ssse3>, TX_8X8, 64, 8, 1),
  make_tuple(&aom_fdct8x8_c, &wrapper<aom_idct8x8_64_add_c>,
             &wrapper<aom_idct8x8_12_add_ssse3>, TX_8X8, 12, 8, 1)
};

INSTANTIATE_TEST_CASE_P(SSSE3, PartialIDctTest,
                        ::testing::ValuesIn(ssse3_partial_idct_tests));
#endif  // HAVE_SSSE3

#if HAVE_DSPR2 && !CONFIG_HIGHBITDEPTH
const PartialInvTxfmParam dspr2_partial_idct_tests[] = {
  make_tuple(&aom_fdct32x32_c, &wrapper<aom_idct32x32_1024_add_c>,
             &wrapper<aom_idct32x32_1024_add_dspr2>, TX_32X32, 1024, 8, 1),
  make_tuple(&aom_fdct32x32_c, &wrapper<aom_idct32x32_1024_add_c>,
             &wrapper<aom_idct32x32_1024_add_dspr2>, TX_32X32, 135, 8, 1),
  make_tuple(&aom_fdct32x32_c, &wrapper<aom_idct32x32_1024_add_c>,
             &wrapper<aom_idct32x32_34_add_dspr2>, TX_32X32, 34, 8, 1),
  make_tuple(&aom_fdct32x32_c, &wrapper<aom_idct32x32_1024_add_c>,
             &wrapper<aom_idct32x32_1_add_dspr2>, TX_32X32, 1, 8, 1),
  make_tuple(&aom_fdct16x16_c, &wrapper<aom_idct16x16_256_add_c>,
             &wrapper<aom_idct16x16_256_add_dspr2>, TX_16X16, 256, 8, 1),
  make_tuple(&aom_fdct16x16_c, &wrapper<aom_idct16x16_256_add_c>,
             &wrapper<aom_idct16x16_10_add_dspr2>, TX_16X16, 10, 8, 1),
  make_tuple(&aom_fdct16x16_c, &wrapper<aom_idct16x16_256_add_c>,
             &wrapper<aom_idct16x16_1_add_dspr2>, TX_16X16, 1, 8, 1),
  make_tuple(&aom_fdct8x8_c, &wrapper<aom_idct8x8_64_add_c>,
             &wrapper<aom_idct8x8_64_add_dspr2>, TX_8X8, 64, 8, 1),
  make_tuple(&aom_fdct8x8_c, &wrapper<aom_idct8x8_64_add_c>,
             &wrapper<aom_idct8x8_12_add_dspr2>, TX_8X8, 12, 8, 1),
  make_tuple(&aom_fdct8x8_c, &wrapper<aom_idct8x8_64_add_c>,
             &wrapper<aom_idct8x8_1_add_dspr2>, TX_8X8, 1, 8, 1),
  make_tuple(&aom_fdct4x4_c, &wrapper<aom_idct4x4_16_add_c>,
             &wrapper<aom_idct4x4_16_add_dspr2>, TX_4X4, 16, 8, 1),
  make_tuple(&aom_fdct4x4_c, &wrapper<aom_idct4x4_16_add_c>,
             &wrapper<aom_idct4x4_1_add_dspr2>, TX_4X4, 1, 8, 1)
};

INSTANTIATE_TEST_CASE_P(DSPR2, PartialIDctTest,
                        ::testing::ValuesIn(dspr2_partial_idct_tests));
#endif  // HAVE_DSPR2 && !CONFIG_HIGHBITDEPTH

#if HAVE_MSA && !CONFIG_HIGHBITDEPTH
const PartialInvTxfmParam msa_partial_idct_tests[] = {
  make_tuple(&aom_fdct32x32_c, &wrapper<aom_idct32x32_1024_add_c>,
             &wrapper<aom_idct32x32_1024_add_msa>, TX_32X32, 1024, 8, 1),
  make_tuple(&aom_fdct32x32_c, &wrapper<aom_idct32x32_1024_add_c>,
             &wrapper<aom_idct32x32_1024_add_msa>, TX_32X32, 135, 8, 1),
  make_tuple(&aom_fdct32x32_c, &wrapper<aom_idct32x32_1024_add_c>,
             &wrapper<aom_idct32x32_34_add_msa>, TX_32X32, 34, 8, 1),
  make_tuple(&aom_fdct32x32_c, &wrapper<aom_idct32x32_1024_add_c>,
             &wrapper<aom_idct32x32_1_add_msa>, TX_32X32, 1, 8, 1),
  make_tuple(&aom_fdct16x16_c, &wrapper<aom_idct16x16_256_add_c>,
             &wrapper<aom_idct16x16_256_add_msa>, TX_16X16, 256, 8, 1),
  make_tuple(&aom_fdct16x16_c, &wrapper<aom_idct16x16_256_add_c>,
             &wrapper<aom_idct16x16_10_add_msa>, TX_16X16, 10, 8, 1),
  make_tuple(&aom_fdct16x16_c, &wrapper<aom_idct16x16_256_add_c>,
             &wrapper<aom_idct16x16_1_add_msa>, TX_16X16, 1, 8, 1),
  make_tuple(&aom_fdct8x8_c, &wrapper<aom_idct8x8_64_add_c>,
             &wrapper<aom_idct8x8_64_add_msa>, TX_8X8, 64, 8, 1),
  make_tuple(&aom_fdct8x8_c, &wrapper<aom_idct8x8_64_add_c>,
             &wrapper<aom_idct8x8_12_add_msa>, TX_8X8, 12, 8, 1),
  make_tuple(&aom_fdct8x8_c, &wrapper<aom_idct8x8_64_add_c>,
             &wrapper<aom_idct8x8_1_add_msa>, TX_8X8, 1, 8, 1),
  make_tuple(&aom_fdct4x4_c, &wrapper<aom_idct4x4_16_add_c>,
             &wrapper<aom_idct4x4_16_add_msa>, TX_4X4, 16, 8, 1),
  make_tuple(&aom_fdct4x4_c, &wrapper<aom_idct4x4_16_add_c>,
             &wrapper<aom_idct4x4_1_add_msa>, TX_4X4, 1, 8, 1)
};

INSTANTIATE_TEST_CASE_P(MSA, PartialIDctTest,
                        ::testing::ValuesIn(msa_partial_idct_tests));
#endif  // HAVE_MSA && !CONFIG_HIGHBITDEPTH

}  // namespace
