16fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org/*
26fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org *  Copyright (c) 2012 The WebM project authors. All Rights Reserved.
36fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org *
46fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org *  Use of this source code is governed by a BSD-style license
56fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org *  that can be found in the LICENSE file in the root of the source
66fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org *  tree. An additional intellectual property rights grant can be found
76fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org *  in the file PATENTS.  All contributing project authors may
86fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org *  be found in the AUTHORS file in the root of the source tree.
96fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org */
106fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
116fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org#include <math.h>
126fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org#include <stdlib.h>
136fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org#include <string.h>
146fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
156fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org#include "third_party/googletest/src/include/gtest/gtest.h"
160d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org#include "test/acm_random.h"
17f9586bb54d74c97d07b09eb2512f8569c9c1c025fgalligan@chromium.org#include "test/clear_system_state.h"
18f9586bb54d74c97d07b09eb2512f8569c9c1c025fgalligan@chromium.org#include "test/register_state_check.h"
190d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org#include "test/util.h"
206fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
21f9586bb54d74c97d07b09eb2512f8569c9c1c025fgalligan@chromium.org#include "./vp9_rtcd.h"
22dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org#include "vp9/common/vp9_entropy.h"
2387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#include "vpx/vpx_codec.h"
24dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org#include "vpx/vpx_integer.h"
25dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org
2687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgconst int kNumCoeffs = 64;
2787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgconst double kPi = 3.141592653589793238462643383279502884;
2887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgvoid reference_8x8_dct_1d(const double in[8], double out[8], int stride) {
2987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  const double kInvSqrt2 = 0.707106781186547524400844362104;
3087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  for (int k = 0; k < 8; k++) {
3187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    out[k] = 0.0;
3287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    for (int n = 0; n < 8; n++)
3387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      out[k] += in[n] * cos(kPi * (2 * n + 1) * k / 16.0);
3487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    if (k == 0)
3587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      out[k] = out[k] * kInvSqrt2;
3687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  }
3787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org}
3887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
3987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgvoid reference_8x8_dct_2d(const int16_t input[kNumCoeffs],
4087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                          double output[kNumCoeffs]) {
4187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  // First transform columns
4287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  for (int i = 0; i < 8; ++i) {
4387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    double temp_in[8], temp_out[8];
4487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    for (int j = 0; j < 8; ++j)
4587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      temp_in[j] = input[j*8 + i];
4687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    reference_8x8_dct_1d(temp_in, temp_out, 1);
4787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    for (int j = 0; j < 8; ++j)
4887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      output[j * 8 + i] = temp_out[j];
4987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  }
5087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  // Then transform rows
5187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  for (int i = 0; i < 8; ++i) {
5287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    double temp_in[8], temp_out[8];
5387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    for (int j = 0; j < 8; ++j)
5487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      temp_in[j] = output[j + i*8];
5587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    reference_8x8_dct_1d(temp_in, temp_out, 1);
5687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    // Scale by some magic number
5787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    for (int j = 0; j < 8; ++j)
5887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      output[j + i * 8] = temp_out[j] * 2;
5987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  }
606fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org}
616fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
626fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.orgusing libvpx_test::ACMRandom;
636fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
646fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.orgnamespace {
6587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgtypedef void (*FdctFunc)(const int16_t *in, tran_low_t *out, int stride);
6687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgtypedef void (*IdctFunc)(const tran_low_t *in, uint8_t *out, int stride);
6787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgtypedef void (*FhtFunc)(const int16_t *in, tran_low_t *out, int stride,
68ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org                        int tx_type);
6987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgtypedef void (*IhtFunc)(const tran_low_t *in, uint8_t *out, int stride,
70ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org                        int tx_type);
710d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org
7287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgtypedef std::tr1::tuple<FdctFunc, IdctFunc, int, vpx_bit_depth_t> Dct8x8Param;
7387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgtypedef std::tr1::tuple<FhtFunc, IhtFunc, int, vpx_bit_depth_t> Ht8x8Param;
74d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org
7587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgvoid fdct8x8_ref(const int16_t *in, tran_low_t *out, int stride, int tx_type) {
760d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org  vp9_fdct8x8_c(in, out, stride);
77ee2f97e8e0aed42dc736a058a7e8b580eef36d8djohannkoenig@chromium.org}
780d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org
7987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgvoid fht8x8_ref(const int16_t *in, tran_low_t *out, int stride, int tx_type) {
8076e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org  vp9_fht8x8_c(in, out, stride, tx_type);
8147265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org}
8247265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org
8387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#if CONFIG_VP9_HIGHBITDEPTH
8487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgvoid idct8x8_10(const tran_low_t *in, uint8_t *out, int stride) {
8587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  vp9_high_idct8x8_64_add_c(in, out, stride, 10);
8687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org}
8787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
8887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgvoid idct8x8_12(const tran_low_t *in, uint8_t *out, int stride) {
8987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  vp9_high_idct8x8_64_add_c(in, out, stride, 12);
9087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org}
9187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
9287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgvoid iht8x8_10(const tran_low_t *in, uint8_t *out, int stride, int tx_type) {
9387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  vp9_high_iht8x8_64_add_c(in, out, stride, tx_type, 10);
9487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org}
9587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
9687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgvoid iht8x8_12(const tran_low_t *in, uint8_t *out, int stride, int tx_type) {
9787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  vp9_high_iht8x8_64_add_c(in, out, stride, tx_type, 12);
9887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org}
9987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#endif
10087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
1010d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.orgclass FwdTrans8x8TestBase {
10247265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org public:
1030d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org  virtual ~FwdTrans8x8TestBase() {}
10447265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org
10547265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org protected:
10687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  virtual void RunFwdTxfm(int16_t *in, tran_low_t *out, int stride) = 0;
10787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  virtual void RunInvTxfm(tran_low_t *out, uint8_t *dst, int stride) = 0;
10847265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org
1090d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org  void RunSignBiasCheck() {
1100d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org    ACMRandom rnd(ACMRandom::DeterministicSeed());
1110d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org    DECLARE_ALIGNED_ARRAY(16, int16_t, test_input_block, 64);
11287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    DECLARE_ALIGNED_ARRAY(16, tran_low_t, test_output_block, 64);
1130d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org    int count_sign_block[64][2];
1140d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org    const int count_test_block = 100000;
1156fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1160d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org    memset(count_sign_block, 0, sizeof(count_sign_block));
1176fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1180d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org    for (int i = 0; i < count_test_block; ++i) {
1190d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org      // Initialize a test block with input range [-255, 255].
1200d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org      for (int j = 0; j < 64; ++j)
12187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        test_input_block[j] = ((rnd.Rand16() >> (16 - bit_depth_)) & mask_) -
12287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                              ((rnd.Rand16() >> (16 - bit_depth_)) & mask_);
12395aa45d73048f952dcaad0037429cc6751b34f2fjohannkoenig@google.com      ASM_REGISTER_STATE_CHECK(
1240d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org          RunFwdTxfm(test_input_block, test_output_block, pitch_));
1256fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1260d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org      for (int j = 0; j < 64; ++j) {
1270d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org        if (test_output_block[j] < 0)
1280d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org          ++count_sign_block[j][0];
1290d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org        else if (test_output_block[j] > 0)
1300d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org          ++count_sign_block[j][1];
1310d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org      }
1320d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org    }
1336fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1346fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    for (int j = 0; j < 64; ++j) {
1350d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org      const int diff = abs(count_sign_block[j][0] - count_sign_block[j][1]);
1360d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org      const int max_diff = 1125;
13787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      EXPECT_LT(diff, max_diff << (bit_depth_ - 8))
1380d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org          << "Error: 8x8 FDCT/FHT has a sign bias > "
1390d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org          << 1. * max_diff / count_test_block * 100 << "%"
1400d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org          << " for input range [-255, 255] at index " << j
1410d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org          << " count0: " << count_sign_block[j][0]
1420d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org          << " count1: " << count_sign_block[j][1]
1430d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org          << " diff: " << diff;
1446fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    }
1456fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1460d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org    memset(count_sign_block, 0, sizeof(count_sign_block));
1476fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1480d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org    for (int i = 0; i < count_test_block; ++i) {
1490d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org      // Initialize a test block with input range [-15, 15].
1500d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org      for (int j = 0; j < 64; ++j)
1510d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org        test_input_block[j] = (rnd.Rand8() >> 4) - (rnd.Rand8() >> 4);
15295aa45d73048f952dcaad0037429cc6751b34f2fjohannkoenig@google.com      ASM_REGISTER_STATE_CHECK(
1530d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org          RunFwdTxfm(test_input_block, test_output_block, pitch_));
1546fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1550d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org      for (int j = 0; j < 64; ++j) {
1560d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org        if (test_output_block[j] < 0)
1570d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org          ++count_sign_block[j][0];
1580d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org        else if (test_output_block[j] > 0)
1590d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org          ++count_sign_block[j][1];
1600d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org      }
1610d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org    }
1626fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1636fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    for (int j = 0; j < 64; ++j) {
1640d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org      const int diff = abs(count_sign_block[j][0] - count_sign_block[j][1]);
1650d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org      const int max_diff = 10000;
16687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      EXPECT_LT(diff, max_diff << (bit_depth_ - 8))
1670d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org          << "Error: 4x4 FDCT/FHT has a sign bias > "
1680d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org          << 1. * max_diff / count_test_block * 100 << "%"
1690d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org          << " for input range [-15, 15] at index " << j
1700d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org          << " count0: " << count_sign_block[j][0]
1710d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org          << " count1: " << count_sign_block[j][1]
1720d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org          << " diff: " << diff;
1736fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    }
1746fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  }
1756fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1760d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org  void RunRoundTripErrorCheck() {
1770d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org    ACMRandom rnd(ACMRandom::DeterministicSeed());
1780d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org    int max_error = 0;
1790d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org    int total_error = 0;
1800d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org    const int count_test_block = 100000;
18147265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org    DECLARE_ALIGNED_ARRAY(16, int16_t, test_input_block, 64);
18287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    DECLARE_ALIGNED_ARRAY(16, tran_low_t, test_temp_block, 64);
18347265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org    DECLARE_ALIGNED_ARRAY(16, uint8_t, dst, 64);
18447265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org    DECLARE_ALIGNED_ARRAY(16, uint8_t, src, 64);
18587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#if CONFIG_VP9_HIGHBITDEPTH
18687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    DECLARE_ALIGNED_ARRAY(16, uint16_t, dst16, 64);
18787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    DECLARE_ALIGNED_ARRAY(16, uint16_t, src16, 64);
18887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#endif
1896fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1900d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org    for (int i = 0; i < count_test_block; ++i) {
1910d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org      // Initialize a test block with input range [-255, 255].
1920d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org      for (int j = 0; j < 64; ++j) {
19387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        if (bit_depth_ == VPX_BITS_8) {
19487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org          src[j] = rnd.Rand8();
19587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org          dst[j] = rnd.Rand8();
19687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org          test_input_block[j] = src[j] - dst[j];
19787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#if CONFIG_VP9_HIGHBITDEPTH
19887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        } else {
19987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org          src16[j] = rnd.Rand16() & mask_;
20087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org          dst16[j] = rnd.Rand16() & mask_;
20187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org          test_input_block[j] = src16[j] - dst16[j];
20287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#endif
20387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        }
2040d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org      }
2053c315c7cf74983e7cc6a5290265081bb64ddfeb3fgalligan@chromium.org
20695aa45d73048f952dcaad0037429cc6751b34f2fjohannkoenig@google.com      ASM_REGISTER_STATE_CHECK(
2070d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org          RunFwdTxfm(test_input_block, test_temp_block, pitch_));
2080d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org      for (int j = 0; j < 64; ++j) {
2090d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org          if (test_temp_block[j] > 0) {
2100d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org            test_temp_block[j] += 2;
2110d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org            test_temp_block[j] /= 4;
2120d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org            test_temp_block[j] *= 4;
2130d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org          } else {
2140d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org            test_temp_block[j] -= 2;
2150d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org            test_temp_block[j] /= 4;
2160d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org            test_temp_block[j] *= 4;
2170d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org          }
2180d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org      }
21987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      if (bit_depth_ == VPX_BITS_8) {
22087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        ASM_REGISTER_STATE_CHECK(
22187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org            RunInvTxfm(test_temp_block, dst, pitch_));
22287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#if CONFIG_VP9_HIGHBITDEPTH
22387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      } else {
22487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        ASM_REGISTER_STATE_CHECK(
22587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org            RunInvTxfm(test_temp_block, CONVERT_TO_BYTEPTR(dst16), pitch_));
22687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#endif
22787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      }
2280d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org
2290d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org      for (int j = 0; j < 64; ++j) {
23087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#if CONFIG_VP9_HIGHBITDEPTH
23187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        const int diff =
23287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org            bit_depth_ == VPX_BITS_8 ? dst[j] - src[j] : dst16[j] - src16[j];
23387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#else
2340d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org        const int diff = dst[j] - src[j];
23587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#endif
2360d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org        const int error = diff * diff;
2370d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org        if (max_error < error)
2380d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org          max_error = error;
2390d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org        total_error += error;
2400d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org      }
2416fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    }
2426fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
24387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    EXPECT_GE(1 << 2 * (bit_depth_ - 8), max_error)
2440d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org      << "Error: 8x8 FDCT/IDCT or FHT/IHT has an individual"
2450d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org      << " roundtrip error > 1";
2466fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
24787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    EXPECT_GE((count_test_block << 2 * (bit_depth_ - 8))/5, total_error)
2480d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org      << "Error: 8x8 FDCT/IDCT or FHT/IHT has average roundtrip "
2490d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org      << "error > 1/5 per block";
2500d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org  }
2516fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
2520d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org  void RunExtremalCheck() {
2530d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org    ACMRandom rnd(ACMRandom::DeterministicSeed());
2540d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org    int max_error = 0;
2550d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org    int total_error = 0;
25688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    int total_coeff_error = 0;
2570d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org    const int count_test_block = 100000;
25847265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org    DECLARE_ALIGNED_ARRAY(16, int16_t, test_input_block, 64);
25987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    DECLARE_ALIGNED_ARRAY(16, tran_low_t, test_temp_block, 64);
26087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    DECLARE_ALIGNED_ARRAY(16, tran_low_t, ref_temp_block, 64);
26147265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org    DECLARE_ALIGNED_ARRAY(16, uint8_t, dst, 64);
26247265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org    DECLARE_ALIGNED_ARRAY(16, uint8_t, src, 64);
26387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#if CONFIG_VP9_HIGHBITDEPTH
26487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    DECLARE_ALIGNED_ARRAY(16, uint16_t, dst16, 64);
26587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    DECLARE_ALIGNED_ARRAY(16, uint16_t, src16, 64);
26687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#endif
2676fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
2680d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org    for (int i = 0; i < count_test_block; ++i) {
26987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      // Initialize a test block with input range [-mask_, mask_].
2700d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org      for (int j = 0; j < 64; ++j) {
27187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        if (bit_depth_ == VPX_BITS_8) {
27287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org          if (i == 0) {
27387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org            src[j] = 255;
27487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org            dst[j] = 0;
27587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org          } else if (i == 1) {
27687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org            src[j] = 0;
27787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org            dst[j] = 255;
27887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org          } else {
27987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org            src[j] = rnd.Rand8() % 2 ? 255 : 0;
28087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org            dst[j] = rnd.Rand8() % 2 ? 255 : 0;
28187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org          }
28287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org          test_input_block[j] = src[j] - dst[j];
28387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#if CONFIG_VP9_HIGHBITDEPTH
28488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org        } else {
28587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org          if (i == 0) {
28687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org            src16[j] = mask_;
28787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org            dst16[j] = 0;
28887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org          } else if (i == 1) {
28987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org            src16[j] = 0;
29087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org            dst16[j] = mask_;
29187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org          } else {
29287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org            src16[j] = rnd.Rand8() % 2 ? mask_ : 0;
29387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org            dst16[j] = rnd.Rand8() % 2 ? mask_ : 0;
29487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org          }
29587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org          test_input_block[j] = src16[j] - dst16[j];
29687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#endif
29788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org        }
2980d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org      }
2996fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
30095aa45d73048f952dcaad0037429cc6751b34f2fjohannkoenig@google.com      ASM_REGISTER_STATE_CHECK(
3010d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org          RunFwdTxfm(test_input_block, test_temp_block, pitch_));
30295aa45d73048f952dcaad0037429cc6751b34f2fjohannkoenig@google.com      ASM_REGISTER_STATE_CHECK(
30388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org          fwd_txfm_ref(test_input_block, ref_temp_block, pitch_, tx_type_));
30487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      if (bit_depth_ == VPX_BITS_8) {
30587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        ASM_REGISTER_STATE_CHECK(
30687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org            RunInvTxfm(test_temp_block, dst, pitch_));
30787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#if CONFIG_VP9_HIGHBITDEPTH
30887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      } else {
30987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        ASM_REGISTER_STATE_CHECK(
31087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org            RunInvTxfm(test_temp_block, CONVERT_TO_BYTEPTR(dst16), pitch_));
31187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#endif
31287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      }
3130d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org
3140d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org      for (int j = 0; j < 64; ++j) {
31587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#if CONFIG_VP9_HIGHBITDEPTH
31687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        const int diff =
31787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org            bit_depth_ == VPX_BITS_8 ? dst[j] - src[j] : dst16[j] - src16[j];
31887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#else
3190d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org        const int diff = dst[j] - src[j];
32087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#endif
3210d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org        const int error = diff * diff;
3220d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org        if (max_error < error)
3230d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org          max_error = error;
3240d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org        total_error += error;
32588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
32688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org        const int coeff_diff = test_temp_block[j] - ref_temp_block[j];
32788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org        total_coeff_error += abs(coeff_diff);
3280d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org      }
3290d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org
33087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      EXPECT_GE(1 << 2 * (bit_depth_ - 8), max_error)
3310d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org          << "Error: Extremal 8x8 FDCT/IDCT or FHT/IHT has"
3320d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org          << "an individual roundtrip error > 1";
3330d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org
33487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      EXPECT_GE((count_test_block << 2 * (bit_depth_ - 8))/5, total_error)
3350d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org          << "Error: Extremal 8x8 FDCT/IDCT or FHT/IHT has average"
3360d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org          << " roundtrip error > 1/5 per block";
33788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
33888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      EXPECT_EQ(0, total_coeff_error)
33988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org          << "Error: Extremal 8x8 FDCT/FHT has"
34088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org          << "overflow issues in the intermediate steps > 1";
341ee2f97e8e0aed42dc736a058a7e8b580eef36d8djohannkoenig@chromium.org    }
3420d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org  }
3433c315c7cf74983e7cc6a5290265081bb64ddfeb3fgalligan@chromium.org
34487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  void RunInvAccuracyCheck() {
34587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    ACMRandom rnd(ACMRandom::DeterministicSeed());
34687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    const int count_test_block = 1000;
34787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    DECLARE_ALIGNED_ARRAY(16, int16_t, in, kNumCoeffs);
34887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    DECLARE_ALIGNED_ARRAY(16, tran_low_t, coeff, kNumCoeffs);
34987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    DECLARE_ALIGNED_ARRAY(16, uint8_t, dst, kNumCoeffs);
35087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    DECLARE_ALIGNED_ARRAY(16, uint8_t, src, kNumCoeffs);
35187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#if CONFIG_VP9_HIGHBITDEPTH
35287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    DECLARE_ALIGNED_ARRAY(16, uint16_t, src16, kNumCoeffs);
35387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    DECLARE_ALIGNED_ARRAY(16, uint16_t, dst16, kNumCoeffs);
35487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#endif
35587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
35687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    for (int i = 0; i < count_test_block; ++i) {
35787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      double out_r[kNumCoeffs];
35887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
35987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      // Initialize a test block with input range [-255, 255].
36087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      for (int j = 0; j < kNumCoeffs; ++j) {
36187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        if (bit_depth_ == VPX_BITS_8) {
36287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org          src[j] = rnd.Rand8() % 2 ? 255 : 0;
36387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org          dst[j] = src[j] > 0 ? 0 : 255;
36487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org          in[j] = src[j] - dst[j];
36587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#if CONFIG_VP9_HIGHBITDEPTH
36687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        } else {
36787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org          src16[j] = rnd.Rand8() % 2 ? mask_ : 0;
36887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org          dst16[j] = src16[j] > 0 ? 0 : mask_;
36987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org          in[j] = src16[j] - dst16[j];
37087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#endif
37187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        }
37287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      }
37387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
37487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      reference_8x8_dct_2d(in, out_r);
37587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      for (int j = 0; j < kNumCoeffs; ++j)
37687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        coeff[j] = static_cast<tran_low_t>(round(out_r[j]));
37787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
37887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      if (bit_depth_ == VPX_BITS_8) {
37987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        ASM_REGISTER_STATE_CHECK(RunInvTxfm(coeff, dst, pitch_));
38087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#if CONFIG_VP9_HIGHBITDEPTH
38187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      } else {
38287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        ASM_REGISTER_STATE_CHECK(RunInvTxfm(coeff, CONVERT_TO_BYTEPTR(dst16),
38387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                            pitch_));
38487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#endif
38587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      }
38687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
38787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      for (int j = 0; j < kNumCoeffs; ++j) {
38887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#if CONFIG_VP9_HIGHBITDEPTH
38987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        const uint32_t diff =
39087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org            bit_depth_ == VPX_BITS_8 ? dst[j] - src[j] : dst16[j] - src16[j];
39187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#else
39287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        const uint32_t diff = dst[j] - src[j];
39387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#endif
39487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        const uint32_t error = diff * diff;
39587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        EXPECT_GE(1u << 2 * (bit_depth_ - 8), error)
39687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org            << "Error: 8x8 IDCT has error " << error
39787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org            << " at index " << j;
39887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      }
39987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    }
40087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  }
40187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
40287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  void RunFwdAccuracyCheck() {
40387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    ACMRandom rnd(ACMRandom::DeterministicSeed());
40487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    const int count_test_block = 1000;
40587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    DECLARE_ALIGNED_ARRAY(16, int16_t, in, kNumCoeffs);
40687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    DECLARE_ALIGNED_ARRAY(16, tran_low_t, coeff_r, kNumCoeffs);
40787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    DECLARE_ALIGNED_ARRAY(16, tran_low_t, coeff, kNumCoeffs);
40887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
40987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    for (int i = 0; i < count_test_block; ++i) {
41087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      double out_r[kNumCoeffs];
41187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
41287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      // Initialize a test block with input range [-mask_, mask_].
41387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      for (int j = 0; j < kNumCoeffs; ++j)
41487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        in[j] = rnd.Rand8() % 2 == 0 ? mask_ : -mask_;
41587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
41687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      RunFwdTxfm(in, coeff, pitch_);
41787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      reference_8x8_dct_2d(in, out_r);
41887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      for (int j = 0; j < kNumCoeffs; ++j)
41987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        coeff_r[j] = static_cast<tran_low_t>(round(out_r[j]));
42087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
42187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      for (int j = 0; j < kNumCoeffs; ++j) {
42287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        const uint32_t diff = coeff[j] - coeff_r[j];
42387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        const uint32_t error = diff * diff;
42487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        EXPECT_GE(9u << 2 * (bit_depth_ - 8), error)
42587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org            << "Error: 8x8 DCT has error " << error
42687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org            << " at index " << j;
42787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      }
42887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    }
42987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  }
4300d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org  int pitch_;
4310d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org  int tx_type_;
432ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org  FhtFunc fwd_txfm_ref;
43387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  vpx_bit_depth_t bit_depth_;
43487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  int mask_;
4350d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org};
4363c315c7cf74983e7cc6a5290265081bb64ddfeb3fgalligan@chromium.org
437d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.orgclass FwdTrans8x8DCT
438d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org    : public FwdTrans8x8TestBase,
439ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org      public ::testing::TestWithParam<Dct8x8Param> {
4400d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org public:
4410d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org  virtual ~FwdTrans8x8DCT() {}
4420d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org
4430d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org  virtual void SetUp() {
4440d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org    fwd_txfm_ = GET_PARAM(0);
4450d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org    inv_txfm_ = GET_PARAM(1);
4460d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org    tx_type_  = GET_PARAM(2);
4470d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org    pitch_    = 8;
4480d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org    fwd_txfm_ref = fdct8x8_ref;
44987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    bit_depth_ = GET_PARAM(3);
45087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    mask_ = (1 << bit_depth_) - 1;
4510d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org  }
4520d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org
4530d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org  virtual void TearDown() { libvpx_test::ClearSystemState(); }
4540d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org
4550d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org protected:
45687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  void RunFwdTxfm(int16_t *in, tran_low_t *out, int stride) {
4570d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org    fwd_txfm_(in, out, stride);
4580d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org  }
45987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  void RunInvTxfm(tran_low_t *out, uint8_t *dst, int stride) {
4600d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org    inv_txfm_(out, dst, stride);
4613c315c7cf74983e7cc6a5290265081bb64ddfeb3fgalligan@chromium.org  }
4620d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org
463ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org  FdctFunc fwd_txfm_;
464ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org  IdctFunc inv_txfm_;
4650d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org};
4660d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org
4670d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.orgTEST_P(FwdTrans8x8DCT, SignBiasCheck) {
4680d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org  RunSignBiasCheck();
4693c315c7cf74983e7cc6a5290265081bb64ddfeb3fgalligan@chromium.org}
4703c315c7cf74983e7cc6a5290265081bb64ddfeb3fgalligan@chromium.org
4710d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.orgTEST_P(FwdTrans8x8DCT, RoundTripErrorCheck) {
4720d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org  RunRoundTripErrorCheck();
4730d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org}
4740d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org
4750d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.orgTEST_P(FwdTrans8x8DCT, ExtremalCheck) {
4760d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org  RunExtremalCheck();
4770d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org}
4780d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org
47987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgTEST_P(FwdTrans8x8DCT, FwdAccuracyCheck) {
48087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  RunFwdAccuracyCheck();
48187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org}
48287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
48387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgTEST_P(FwdTrans8x8DCT, InvAccuracyCheck) {
48487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  RunInvAccuracyCheck();
48587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org}
48687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
487d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.orgclass FwdTrans8x8HT
488d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org    : public FwdTrans8x8TestBase,
489ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org      public ::testing::TestWithParam<Ht8x8Param> {
4900d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org public:
4910d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org  virtual ~FwdTrans8x8HT() {}
4920d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org
4930d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org  virtual void SetUp() {
4940d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org    fwd_txfm_ = GET_PARAM(0);
4950d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org    inv_txfm_ = GET_PARAM(1);
4960d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org    tx_type_  = GET_PARAM(2);
4970d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org    pitch_    = 8;
4980d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org    fwd_txfm_ref = fht8x8_ref;
49987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    bit_depth_ = GET_PARAM(3);
50087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    mask_ = (1 << bit_depth_) - 1;
5010d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org  }
5020d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org
5030d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org  virtual void TearDown() { libvpx_test::ClearSystemState(); }
5040d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org
5050d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org protected:
50687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  void RunFwdTxfm(int16_t *in, tran_low_t *out, int stride) {
5070d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org    fwd_txfm_(in, out, stride, tx_type_);
5080d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org  }
50987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  void RunInvTxfm(tran_low_t *out, uint8_t *dst, int stride) {
5100d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org    inv_txfm_(out, dst, stride, tx_type_);
5110d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org  }
5120d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org
513ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org  FhtFunc fwd_txfm_;
514ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org  IhtFunc inv_txfm_;
5150d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org};
5160d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org
5170d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.orgTEST_P(FwdTrans8x8HT, SignBiasCheck) {
5180d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org  RunSignBiasCheck();
5190d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org}
5200d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org
5210d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.orgTEST_P(FwdTrans8x8HT, RoundTripErrorCheck) {
5220d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org  RunRoundTripErrorCheck();
5230d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org}
5240d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org
5250d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.orgTEST_P(FwdTrans8x8HT, ExtremalCheck) {
5260d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org  RunExtremalCheck();
5270d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org}
5280d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org
5290d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.orgusing std::tr1::make_tuple;
5300d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org
53187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#if CONFIG_VP9_HIGHBITDEPTH
5320d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.orgINSTANTIATE_TEST_CASE_P(
5330d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org    C, FwdTrans8x8DCT,
5340d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org    ::testing::Values(
53587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        make_tuple(&vp9_high_fdct8x8_c, &idct8x8_10, 0, VPX_BITS_10),
53687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        make_tuple(&vp9_high_fdct8x8_c, &idct8x8_12, 0, VPX_BITS_12),
53787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        make_tuple(&vp9_fdct8x8_c, &vp9_idct8x8_64_add_c, 0, VPX_BITS_8)));
53887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#else
53987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgINSTANTIATE_TEST_CASE_P(
54087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    C, FwdTrans8x8DCT,
54187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    ::testing::Values(
54287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        make_tuple(&vp9_fdct8x8_c, &vp9_idct8x8_64_add_c, 0, VPX_BITS_8)));
54387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#endif
54487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
54587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#if CONFIG_VP9_HIGHBITDEPTH
5460d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.orgINSTANTIATE_TEST_CASE_P(
5470d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org    C, FwdTrans8x8HT,
5480d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org    ::testing::Values(
54987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        make_tuple(&vp9_high_fht8x8_c, &iht8x8_10, 0, VPX_BITS_10),
55087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        make_tuple(&vp9_high_fht8x8_c, &iht8x8_10, 1, VPX_BITS_10),
55187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        make_tuple(&vp9_high_fht8x8_c, &iht8x8_10, 2, VPX_BITS_10),
55287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        make_tuple(&vp9_high_fht8x8_c, &iht8x8_10, 3, VPX_BITS_10),
55387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        make_tuple(&vp9_high_fht8x8_c, &iht8x8_12, 0, VPX_BITS_12),
55487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        make_tuple(&vp9_high_fht8x8_c, &iht8x8_12, 1, VPX_BITS_12),
55587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        make_tuple(&vp9_high_fht8x8_c, &iht8x8_12, 2, VPX_BITS_12),
55687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        make_tuple(&vp9_high_fht8x8_c, &iht8x8_12, 3, VPX_BITS_12),
55787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        make_tuple(&vp9_fht8x8_c, &vp9_iht8x8_64_add_c, 0, VPX_BITS_8),
55887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        make_tuple(&vp9_fht8x8_c, &vp9_iht8x8_64_add_c, 1, VPX_BITS_8),
55987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        make_tuple(&vp9_fht8x8_c, &vp9_iht8x8_64_add_c, 2, VPX_BITS_8),
56087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        make_tuple(&vp9_fht8x8_c, &vp9_iht8x8_64_add_c, 3, VPX_BITS_8)));
56187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#else
56287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgINSTANTIATE_TEST_CASE_P(
56387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    C, FwdTrans8x8HT,
56487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    ::testing::Values(
56587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        make_tuple(&vp9_fht8x8_c, &vp9_iht8x8_64_add_c, 0, VPX_BITS_8),
56687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        make_tuple(&vp9_fht8x8_c, &vp9_iht8x8_64_add_c, 1, VPX_BITS_8),
56787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        make_tuple(&vp9_fht8x8_c, &vp9_iht8x8_64_add_c, 2, VPX_BITS_8),
56887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        make_tuple(&vp9_fht8x8_c, &vp9_iht8x8_64_add_c, 3, VPX_BITS_8)));
56987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#endif
5700d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org
57187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#if HAVE_NEON_ASM && !CONFIG_VP9_HIGHBITDEPTH
572411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.orgINSTANTIATE_TEST_CASE_P(
573411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org    NEON, FwdTrans8x8DCT,
574411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org    ::testing::Values(
57587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        make_tuple(&vp9_fdct8x8_neon, &vp9_idct8x8_64_add_neon, 0,
57687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                   VPX_BITS_8)));
577411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.orgINSTANTIATE_TEST_CASE_P(
578411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org    DISABLED_NEON, FwdTrans8x8HT,
579411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org    ::testing::Values(
58087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        make_tuple(&vp9_fht8x8_c, &vp9_iht8x8_64_add_neon, 0, VPX_BITS_8),
58187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        make_tuple(&vp9_fht8x8_c, &vp9_iht8x8_64_add_neon, 1, VPX_BITS_8),
58287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        make_tuple(&vp9_fht8x8_c, &vp9_iht8x8_64_add_neon, 2, VPX_BITS_8),
58387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        make_tuple(&vp9_fht8x8_c, &vp9_iht8x8_64_add_neon, 3, VPX_BITS_8)));
584411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org#endif
585411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org
58687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#if HAVE_SSE2 && !CONFIG_VP9_HIGHBITDEPTH
5870d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.orgINSTANTIATE_TEST_CASE_P(
5880d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org    SSE2, FwdTrans8x8DCT,
5890d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org    ::testing::Values(
59087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        make_tuple(&vp9_fdct8x8_sse2, &vp9_idct8x8_64_add_sse2, 0,
59187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                   VPX_BITS_8)));
5920d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.orgINSTANTIATE_TEST_CASE_P(
5930d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org    SSE2, FwdTrans8x8HT,
5940d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org    ::testing::Values(
59587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        make_tuple(&vp9_fht8x8_sse2, &vp9_iht8x8_64_add_sse2, 0, VPX_BITS_8),
59687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        make_tuple(&vp9_fht8x8_sse2, &vp9_iht8x8_64_add_sse2, 1, VPX_BITS_8),
59787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        make_tuple(&vp9_fht8x8_sse2, &vp9_iht8x8_64_add_sse2, 2, VPX_BITS_8),
59887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        make_tuple(&vp9_fht8x8_sse2, &vp9_iht8x8_64_add_sse2, 3, VPX_BITS_8)));
5990d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org#endif
6007765c078fa920ba6c949c15f16b6cc979d8bb95bjohannkoenig@chromium.org
60187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#if HAVE_SSSE3 && ARCH_X86_64 && !CONFIG_VP9_HIGHBITDEPTH
6027765c078fa920ba6c949c15f16b6cc979d8bb95bjohannkoenig@chromium.orgINSTANTIATE_TEST_CASE_P(
6037765c078fa920ba6c949c15f16b6cc979d8bb95bjohannkoenig@chromium.org    SSSE3, FwdTrans8x8DCT,
6047765c078fa920ba6c949c15f16b6cc979d8bb95bjohannkoenig@chromium.org    ::testing::Values(
60587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        make_tuple(&vp9_fdct8x8_ssse3, &vp9_idct8x8_64_add_ssse3, 0,
60687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                   VPX_BITS_8)));
6077765c078fa920ba6c949c15f16b6cc979d8bb95bjohannkoenig@chromium.org#endif
6086fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org}  // namespace
609