xref: /aosp_15_r20/external/libvpx/test/vp9_quantize_test.cc (revision fb1b10ab9aebc7c7068eedab379b749d7e3900be)
1*fb1b10abSAndroid Build Coastguard Worker /*
2*fb1b10abSAndroid Build Coastguard Worker  *  Copyright (c) 2014 The WebM project authors. All Rights Reserved.
3*fb1b10abSAndroid Build Coastguard Worker  *
4*fb1b10abSAndroid Build Coastguard Worker  *  Use of this source code is governed by a BSD-style license
5*fb1b10abSAndroid Build Coastguard Worker  *  that can be found in the LICENSE file in the root of the source
6*fb1b10abSAndroid Build Coastguard Worker  *  tree. An additional intellectual property rights grant can be found
7*fb1b10abSAndroid Build Coastguard Worker  *  in the file PATENTS.  All contributing project authors may
8*fb1b10abSAndroid Build Coastguard Worker  *  be found in the AUTHORS file in the root of the source tree.
9*fb1b10abSAndroid Build Coastguard Worker  */
10*fb1b10abSAndroid Build Coastguard Worker 
11*fb1b10abSAndroid Build Coastguard Worker #include <math.h>
12*fb1b10abSAndroid Build Coastguard Worker #include <stdio.h>
13*fb1b10abSAndroid Build Coastguard Worker #include <stdlib.h>
14*fb1b10abSAndroid Build Coastguard Worker #include <string.h>
15*fb1b10abSAndroid Build Coastguard Worker #include <tuple>
16*fb1b10abSAndroid Build Coastguard Worker 
17*fb1b10abSAndroid Build Coastguard Worker #include "gtest/gtest.h"
18*fb1b10abSAndroid Build Coastguard Worker 
19*fb1b10abSAndroid Build Coastguard Worker #include "./vp9_rtcd.h"
20*fb1b10abSAndroid Build Coastguard Worker #include "./vpx_config.h"
21*fb1b10abSAndroid Build Coastguard Worker #include "./vpx_dsp_rtcd.h"
22*fb1b10abSAndroid Build Coastguard Worker #include "test/acm_random.h"
23*fb1b10abSAndroid Build Coastguard Worker #include "test/bench.h"
24*fb1b10abSAndroid Build Coastguard Worker #include "test/buffer.h"
25*fb1b10abSAndroid Build Coastguard Worker #include "test/clear_system_state.h"
26*fb1b10abSAndroid Build Coastguard Worker #include "test/register_state_check.h"
27*fb1b10abSAndroid Build Coastguard Worker #include "test/util.h"
28*fb1b10abSAndroid Build Coastguard Worker #include "vp9/common/vp9_entropy.h"
29*fb1b10abSAndroid Build Coastguard Worker #include "vp9/common/vp9_scan.h"
30*fb1b10abSAndroid Build Coastguard Worker #include "vp9/encoder/vp9_block.h"
31*fb1b10abSAndroid Build Coastguard Worker #include "vpx/vpx_codec.h"
32*fb1b10abSAndroid Build Coastguard Worker #include "vpx/vpx_integer.h"
33*fb1b10abSAndroid Build Coastguard Worker #include "vpx_ports/vpx_timer.h"
34*fb1b10abSAndroid Build Coastguard Worker 
35*fb1b10abSAndroid Build Coastguard Worker using libvpx_test::ACMRandom;
36*fb1b10abSAndroid Build Coastguard Worker using libvpx_test::Buffer;
37*fb1b10abSAndroid Build Coastguard Worker 
38*fb1b10abSAndroid Build Coastguard Worker namespace {
39*fb1b10abSAndroid Build Coastguard Worker const int number_of_iterations = 100;
40*fb1b10abSAndroid Build Coastguard Worker 
41*fb1b10abSAndroid Build Coastguard Worker typedef void (*QuantizeFunc)(const tran_low_t *coeff, intptr_t count,
42*fb1b10abSAndroid Build Coastguard Worker                              const macroblock_plane *mb_plane,
43*fb1b10abSAndroid Build Coastguard Worker                              tran_low_t *qcoeff, tran_low_t *dqcoeff,
44*fb1b10abSAndroid Build Coastguard Worker                              const int16_t *dequant, uint16_t *eob,
45*fb1b10abSAndroid Build Coastguard Worker                              const struct ScanOrder *const scan_order);
46*fb1b10abSAndroid Build Coastguard Worker typedef std::tuple<QuantizeFunc, QuantizeFunc, vpx_bit_depth_t,
47*fb1b10abSAndroid Build Coastguard Worker                    int /*max_size*/, bool /*is_fp*/>
48*fb1b10abSAndroid Build Coastguard Worker     QuantizeParam;
49*fb1b10abSAndroid Build Coastguard Worker 
50*fb1b10abSAndroid Build Coastguard Worker // Wrapper for 32x32 version which does not use count
51*fb1b10abSAndroid Build Coastguard Worker typedef void (*Quantize32x32Func)(const tran_low_t *coeff,
52*fb1b10abSAndroid Build Coastguard Worker                                   const macroblock_plane *const mb_plane,
53*fb1b10abSAndroid Build Coastguard Worker                                   tran_low_t *qcoeff, tran_low_t *dqcoeff,
54*fb1b10abSAndroid Build Coastguard Worker                                   const int16_t *dequant, uint16_t *eob,
55*fb1b10abSAndroid Build Coastguard Worker                                   const struct ScanOrder *const scan_order);
56*fb1b10abSAndroid Build Coastguard Worker 
57*fb1b10abSAndroid Build Coastguard Worker template <Quantize32x32Func fn>
Quant32x32Wrapper(const tran_low_t * coeff,intptr_t count,const macroblock_plane * const mb_plane,tran_low_t * qcoeff,tran_low_t * dqcoeff,const int16_t * dequant,uint16_t * eob,const struct ScanOrder * const scan_order)58*fb1b10abSAndroid Build Coastguard Worker void Quant32x32Wrapper(const tran_low_t *coeff, intptr_t count,
59*fb1b10abSAndroid Build Coastguard Worker                        const macroblock_plane *const mb_plane,
60*fb1b10abSAndroid Build Coastguard Worker                        tran_low_t *qcoeff, tran_low_t *dqcoeff,
61*fb1b10abSAndroid Build Coastguard Worker                        const int16_t *dequant, uint16_t *eob,
62*fb1b10abSAndroid Build Coastguard Worker                        const struct ScanOrder *const scan_order) {
63*fb1b10abSAndroid Build Coastguard Worker   (void)count;
64*fb1b10abSAndroid Build Coastguard Worker   fn(coeff, mb_plane, qcoeff, dqcoeff, dequant, eob, scan_order);
65*fb1b10abSAndroid Build Coastguard Worker }
66*fb1b10abSAndroid Build Coastguard Worker 
67*fb1b10abSAndroid Build Coastguard Worker // Wrapper for FP version which does not use zbin or quant_shift.
68*fb1b10abSAndroid Build Coastguard Worker typedef void (*QuantizeFPFunc)(const tran_low_t *coeff, intptr_t count,
69*fb1b10abSAndroid Build Coastguard Worker                                const macroblock_plane *const mb_plane,
70*fb1b10abSAndroid Build Coastguard Worker                                tran_low_t *qcoeff, tran_low_t *dqcoeff,
71*fb1b10abSAndroid Build Coastguard Worker                                const int16_t *dequant, uint16_t *eob,
72*fb1b10abSAndroid Build Coastguard Worker                                const struct ScanOrder *const scan_order);
73*fb1b10abSAndroid Build Coastguard Worker 
74*fb1b10abSAndroid Build Coastguard Worker template <QuantizeFPFunc fn>
QuantFPWrapper(const tran_low_t * coeff,intptr_t count,const macroblock_plane * const mb_plane,tran_low_t * qcoeff,tran_low_t * dqcoeff,const int16_t * dequant,uint16_t * eob,const struct ScanOrder * const scan_order)75*fb1b10abSAndroid Build Coastguard Worker void QuantFPWrapper(const tran_low_t *coeff, intptr_t count,
76*fb1b10abSAndroid Build Coastguard Worker                     const macroblock_plane *const mb_plane, tran_low_t *qcoeff,
77*fb1b10abSAndroid Build Coastguard Worker                     tran_low_t *dqcoeff, const int16_t *dequant, uint16_t *eob,
78*fb1b10abSAndroid Build Coastguard Worker                     const struct ScanOrder *const scan_order) {
79*fb1b10abSAndroid Build Coastguard Worker   fn(coeff, count, mb_plane, qcoeff, dqcoeff, dequant, eob, scan_order);
80*fb1b10abSAndroid Build Coastguard Worker }
81*fb1b10abSAndroid Build Coastguard Worker 
GenerateHelperArrays(ACMRandom * rnd,int16_t * zbin,int16_t * round,int16_t * quant,int16_t * quant_shift,int16_t * dequant,int16_t * round_fp,int16_t * quant_fp)82*fb1b10abSAndroid Build Coastguard Worker void GenerateHelperArrays(ACMRandom *rnd, int16_t *zbin, int16_t *round,
83*fb1b10abSAndroid Build Coastguard Worker                           int16_t *quant, int16_t *quant_shift,
84*fb1b10abSAndroid Build Coastguard Worker                           int16_t *dequant, int16_t *round_fp,
85*fb1b10abSAndroid Build Coastguard Worker                           int16_t *quant_fp) {
86*fb1b10abSAndroid Build Coastguard Worker   // Max when q == 0. Otherwise, it is 48 for Y and 42 for U/V.
87*fb1b10abSAndroid Build Coastguard Worker   constexpr int kMaxQRoundingFactorFp = 64;
88*fb1b10abSAndroid Build Coastguard Worker 
89*fb1b10abSAndroid Build Coastguard Worker   for (int j = 0; j < 2; j++) {
90*fb1b10abSAndroid Build Coastguard Worker     // The range is 4 to 1828 in the VP9 tables.
91*fb1b10abSAndroid Build Coastguard Worker     const int qlookup = rnd->RandRange(1825) + 4;
92*fb1b10abSAndroid Build Coastguard Worker     round_fp[j] = (kMaxQRoundingFactorFp * qlookup) >> 7;
93*fb1b10abSAndroid Build Coastguard Worker     quant_fp[j] = (1 << 16) / qlookup;
94*fb1b10abSAndroid Build Coastguard Worker 
95*fb1b10abSAndroid Build Coastguard Worker     // Values determined by deconstructing vp9_init_quantizer().
96*fb1b10abSAndroid Build Coastguard Worker     // zbin may be up to 1143 for 8 and 10 bit Y values, or 1200 for 12 bit Y
97*fb1b10abSAndroid Build Coastguard Worker     // values or U/V values of any bit depth. This is because y_delta is not
98*fb1b10abSAndroid Build Coastguard Worker     // factored into the vp9_ac_quant() call.
99*fb1b10abSAndroid Build Coastguard Worker     zbin[j] = rnd->RandRange(1200);
100*fb1b10abSAndroid Build Coastguard Worker 
101*fb1b10abSAndroid Build Coastguard Worker     // round may be up to 685 for Y values or 914 for U/V.
102*fb1b10abSAndroid Build Coastguard Worker     round[j] = rnd->RandRange(914);
103*fb1b10abSAndroid Build Coastguard Worker     // quant ranges from 1 to -32703
104*fb1b10abSAndroid Build Coastguard Worker     quant[j] = static_cast<int>(rnd->RandRange(32704)) - 32703;
105*fb1b10abSAndroid Build Coastguard Worker     // quant_shift goes up to 1 << 16.
106*fb1b10abSAndroid Build Coastguard Worker     quant_shift[j] = rnd->RandRange(16384);
107*fb1b10abSAndroid Build Coastguard Worker     // dequant maxes out at 1828 for all cases.
108*fb1b10abSAndroid Build Coastguard Worker     dequant[j] = rnd->RandRange(1828);
109*fb1b10abSAndroid Build Coastguard Worker   }
110*fb1b10abSAndroid Build Coastguard Worker   for (int j = 2; j < 8; j++) {
111*fb1b10abSAndroid Build Coastguard Worker     zbin[j] = zbin[1];
112*fb1b10abSAndroid Build Coastguard Worker     round_fp[j] = round_fp[1];
113*fb1b10abSAndroid Build Coastguard Worker     quant_fp[j] = quant_fp[1];
114*fb1b10abSAndroid Build Coastguard Worker     round[j] = round[1];
115*fb1b10abSAndroid Build Coastguard Worker     quant[j] = quant[1];
116*fb1b10abSAndroid Build Coastguard Worker     quant_shift[j] = quant_shift[1];
117*fb1b10abSAndroid Build Coastguard Worker     dequant[j] = dequant[1];
118*fb1b10abSAndroid Build Coastguard Worker   }
119*fb1b10abSAndroid Build Coastguard Worker }
120*fb1b10abSAndroid Build Coastguard Worker 
121*fb1b10abSAndroid Build Coastguard Worker class VP9QuantizeBase : public AbstractBench {
122*fb1b10abSAndroid Build Coastguard Worker  public:
VP9QuantizeBase(vpx_bit_depth_t bit_depth,int max_size,bool is_fp)123*fb1b10abSAndroid Build Coastguard Worker   VP9QuantizeBase(vpx_bit_depth_t bit_depth, int max_size, bool is_fp)
124*fb1b10abSAndroid Build Coastguard Worker       : bit_depth_(bit_depth), max_size_(max_size), is_fp_(is_fp),
125*fb1b10abSAndroid Build Coastguard Worker         coeff_(Buffer<tran_low_t>(max_size_, max_size_, 0, 16)),
126*fb1b10abSAndroid Build Coastguard Worker         qcoeff_(Buffer<tran_low_t>(max_size_, max_size_, 0, 32)),
127*fb1b10abSAndroid Build Coastguard Worker         dqcoeff_(Buffer<tran_low_t>(max_size_, max_size_, 0, 32)) {
128*fb1b10abSAndroid Build Coastguard Worker     // TODO(jianj): SSSE3 and AVX2 tests fail on extreme values.
129*fb1b10abSAndroid Build Coastguard Worker #if HAVE_NEON
130*fb1b10abSAndroid Build Coastguard Worker     max_value_ = (1 << (7 + bit_depth_)) - 1;
131*fb1b10abSAndroid Build Coastguard Worker #else
132*fb1b10abSAndroid Build Coastguard Worker     max_value_ = (1 << bit_depth_) - 1;
133*fb1b10abSAndroid Build Coastguard Worker #endif
134*fb1b10abSAndroid Build Coastguard Worker 
135*fb1b10abSAndroid Build Coastguard Worker     mb_plane_ = reinterpret_cast<macroblock_plane *>(
136*fb1b10abSAndroid Build Coastguard Worker         vpx_memalign(16, sizeof(macroblock_plane)));
137*fb1b10abSAndroid Build Coastguard Worker 
138*fb1b10abSAndroid Build Coastguard Worker     zbin_ptr_ = mb_plane_->zbin =
139*fb1b10abSAndroid Build Coastguard Worker         reinterpret_cast<int16_t *>(vpx_memalign(16, 8 * sizeof(*zbin_ptr_)));
140*fb1b10abSAndroid Build Coastguard Worker     round_fp_ptr_ = mb_plane_->round_fp = reinterpret_cast<int16_t *>(
141*fb1b10abSAndroid Build Coastguard Worker         vpx_memalign(16, 8 * sizeof(*round_fp_ptr_)));
142*fb1b10abSAndroid Build Coastguard Worker     quant_fp_ptr_ = mb_plane_->quant_fp = reinterpret_cast<int16_t *>(
143*fb1b10abSAndroid Build Coastguard Worker         vpx_memalign(16, 8 * sizeof(*quant_fp_ptr_)));
144*fb1b10abSAndroid Build Coastguard Worker     round_ptr_ = mb_plane_->round =
145*fb1b10abSAndroid Build Coastguard Worker         reinterpret_cast<int16_t *>(vpx_memalign(16, 8 * sizeof(*round_ptr_)));
146*fb1b10abSAndroid Build Coastguard Worker     quant_ptr_ = mb_plane_->quant =
147*fb1b10abSAndroid Build Coastguard Worker         reinterpret_cast<int16_t *>(vpx_memalign(16, 8 * sizeof(*quant_ptr_)));
148*fb1b10abSAndroid Build Coastguard Worker     quant_shift_ptr_ = mb_plane_->quant_shift = reinterpret_cast<int16_t *>(
149*fb1b10abSAndroid Build Coastguard Worker         vpx_memalign(16, 8 * sizeof(*quant_shift_ptr_)));
150*fb1b10abSAndroid Build Coastguard Worker     dequant_ptr_ = reinterpret_cast<int16_t *>(
151*fb1b10abSAndroid Build Coastguard Worker         vpx_memalign(16, 8 * sizeof(*dequant_ptr_)));
152*fb1b10abSAndroid Build Coastguard Worker 
153*fb1b10abSAndroid Build Coastguard Worker     r_ptr_ = (is_fp_) ? round_fp_ptr_ : round_ptr_;
154*fb1b10abSAndroid Build Coastguard Worker     q_ptr_ = (is_fp_) ? quant_fp_ptr_ : quant_ptr_;
155*fb1b10abSAndroid Build Coastguard Worker   }
156*fb1b10abSAndroid Build Coastguard Worker 
~VP9QuantizeBase()157*fb1b10abSAndroid Build Coastguard Worker   ~VP9QuantizeBase() override {
158*fb1b10abSAndroid Build Coastguard Worker     vpx_free(mb_plane_);
159*fb1b10abSAndroid Build Coastguard Worker     vpx_free(zbin_ptr_);
160*fb1b10abSAndroid Build Coastguard Worker     vpx_free(round_fp_ptr_);
161*fb1b10abSAndroid Build Coastguard Worker     vpx_free(quant_fp_ptr_);
162*fb1b10abSAndroid Build Coastguard Worker     vpx_free(round_ptr_);
163*fb1b10abSAndroid Build Coastguard Worker     vpx_free(quant_ptr_);
164*fb1b10abSAndroid Build Coastguard Worker     vpx_free(quant_shift_ptr_);
165*fb1b10abSAndroid Build Coastguard Worker     vpx_free(dequant_ptr_);
166*fb1b10abSAndroid Build Coastguard Worker     mb_plane_ = nullptr;
167*fb1b10abSAndroid Build Coastguard Worker     zbin_ptr_ = nullptr;
168*fb1b10abSAndroid Build Coastguard Worker     round_fp_ptr_ = nullptr;
169*fb1b10abSAndroid Build Coastguard Worker     quant_fp_ptr_ = nullptr;
170*fb1b10abSAndroid Build Coastguard Worker     round_ptr_ = nullptr;
171*fb1b10abSAndroid Build Coastguard Worker     quant_ptr_ = nullptr;
172*fb1b10abSAndroid Build Coastguard Worker     quant_shift_ptr_ = nullptr;
173*fb1b10abSAndroid Build Coastguard Worker     dequant_ptr_ = nullptr;
174*fb1b10abSAndroid Build Coastguard Worker     libvpx_test::ClearSystemState();
175*fb1b10abSAndroid Build Coastguard Worker   }
176*fb1b10abSAndroid Build Coastguard Worker 
177*fb1b10abSAndroid Build Coastguard Worker  protected:
178*fb1b10abSAndroid Build Coastguard Worker   macroblock_plane *mb_plane_;
179*fb1b10abSAndroid Build Coastguard Worker   int16_t *zbin_ptr_;
180*fb1b10abSAndroid Build Coastguard Worker   int16_t *quant_fp_ptr_;
181*fb1b10abSAndroid Build Coastguard Worker   int16_t *round_fp_ptr_;
182*fb1b10abSAndroid Build Coastguard Worker   int16_t *round_ptr_;
183*fb1b10abSAndroid Build Coastguard Worker   int16_t *quant_ptr_;
184*fb1b10abSAndroid Build Coastguard Worker   int16_t *quant_shift_ptr_;
185*fb1b10abSAndroid Build Coastguard Worker   int16_t *dequant_ptr_;
186*fb1b10abSAndroid Build Coastguard Worker   const vpx_bit_depth_t bit_depth_;
187*fb1b10abSAndroid Build Coastguard Worker   int max_value_;
188*fb1b10abSAndroid Build Coastguard Worker   const int max_size_;
189*fb1b10abSAndroid Build Coastguard Worker   const bool is_fp_;
190*fb1b10abSAndroid Build Coastguard Worker   Buffer<tran_low_t> coeff_;
191*fb1b10abSAndroid Build Coastguard Worker   Buffer<tran_low_t> qcoeff_;
192*fb1b10abSAndroid Build Coastguard Worker   Buffer<tran_low_t> dqcoeff_;
193*fb1b10abSAndroid Build Coastguard Worker   int16_t *r_ptr_;
194*fb1b10abSAndroid Build Coastguard Worker   int16_t *q_ptr_;
195*fb1b10abSAndroid Build Coastguard Worker   int count_;
196*fb1b10abSAndroid Build Coastguard Worker   const ScanOrder *scan_;
197*fb1b10abSAndroid Build Coastguard Worker   uint16_t eob_;
198*fb1b10abSAndroid Build Coastguard Worker };
199*fb1b10abSAndroid Build Coastguard Worker 
200*fb1b10abSAndroid Build Coastguard Worker class VP9QuantizeTest : public VP9QuantizeBase,
201*fb1b10abSAndroid Build Coastguard Worker                         public ::testing::TestWithParam<QuantizeParam> {
202*fb1b10abSAndroid Build Coastguard Worker  public:
VP9QuantizeTest()203*fb1b10abSAndroid Build Coastguard Worker   VP9QuantizeTest()
204*fb1b10abSAndroid Build Coastguard Worker       : VP9QuantizeBase(GET_PARAM(2), GET_PARAM(3), GET_PARAM(4)),
205*fb1b10abSAndroid Build Coastguard Worker         quantize_op_(GET_PARAM(0)), ref_quantize_op_(GET_PARAM(1)) {}
206*fb1b10abSAndroid Build Coastguard Worker 
207*fb1b10abSAndroid Build Coastguard Worker  protected:
208*fb1b10abSAndroid Build Coastguard Worker   void Run() override;
209*fb1b10abSAndroid Build Coastguard Worker   void Speed(bool is_median);
210*fb1b10abSAndroid Build Coastguard Worker   const QuantizeFunc quantize_op_;
211*fb1b10abSAndroid Build Coastguard Worker   const QuantizeFunc ref_quantize_op_;
212*fb1b10abSAndroid Build Coastguard Worker };
213*fb1b10abSAndroid Build Coastguard Worker 
Run()214*fb1b10abSAndroid Build Coastguard Worker void VP9QuantizeTest::Run() {
215*fb1b10abSAndroid Build Coastguard Worker   quantize_op_(coeff_.TopLeftPixel(), count_, mb_plane_, qcoeff_.TopLeftPixel(),
216*fb1b10abSAndroid Build Coastguard Worker                dqcoeff_.TopLeftPixel(), dequant_ptr_, &eob_, scan_);
217*fb1b10abSAndroid Build Coastguard Worker }
218*fb1b10abSAndroid Build Coastguard Worker 
Speed(bool is_median)219*fb1b10abSAndroid Build Coastguard Worker void VP9QuantizeTest::Speed(bool is_median) {
220*fb1b10abSAndroid Build Coastguard Worker   ACMRandom rnd(ACMRandom::DeterministicSeed());
221*fb1b10abSAndroid Build Coastguard Worker   ASSERT_TRUE(coeff_.Init());
222*fb1b10abSAndroid Build Coastguard Worker   ASSERT_TRUE(qcoeff_.Init());
223*fb1b10abSAndroid Build Coastguard Worker   ASSERT_TRUE(dqcoeff_.Init());
224*fb1b10abSAndroid Build Coastguard Worker   TX_SIZE starting_sz, ending_sz;
225*fb1b10abSAndroid Build Coastguard Worker 
226*fb1b10abSAndroid Build Coastguard Worker   if (max_size_ == 16) {
227*fb1b10abSAndroid Build Coastguard Worker     starting_sz = TX_4X4;
228*fb1b10abSAndroid Build Coastguard Worker     ending_sz = TX_16X16;
229*fb1b10abSAndroid Build Coastguard Worker   } else {
230*fb1b10abSAndroid Build Coastguard Worker     starting_sz = TX_32X32;
231*fb1b10abSAndroid Build Coastguard Worker     ending_sz = TX_32X32;
232*fb1b10abSAndroid Build Coastguard Worker   }
233*fb1b10abSAndroid Build Coastguard Worker 
234*fb1b10abSAndroid Build Coastguard Worker   for (TX_SIZE sz = starting_sz; sz <= ending_sz; ++sz) {
235*fb1b10abSAndroid Build Coastguard Worker     // zbin > coeff, zbin < coeff.
236*fb1b10abSAndroid Build Coastguard Worker     for (int i = 0; i < 2; ++i) {
237*fb1b10abSAndroid Build Coastguard Worker       // TX_TYPE defines the scan order. That is not relevant to the speed test.
238*fb1b10abSAndroid Build Coastguard Worker       // Pick the first one.
239*fb1b10abSAndroid Build Coastguard Worker       const TX_TYPE tx_type = DCT_DCT;
240*fb1b10abSAndroid Build Coastguard Worker       count_ = (4 << sz) * (4 << sz);
241*fb1b10abSAndroid Build Coastguard Worker       scan_ = &vp9_scan_orders[sz][tx_type];
242*fb1b10abSAndroid Build Coastguard Worker 
243*fb1b10abSAndroid Build Coastguard Worker       GenerateHelperArrays(&rnd, zbin_ptr_, round_ptr_, quant_ptr_,
244*fb1b10abSAndroid Build Coastguard Worker                            quant_shift_ptr_, dequant_ptr_, round_fp_ptr_,
245*fb1b10abSAndroid Build Coastguard Worker                            quant_fp_ptr_);
246*fb1b10abSAndroid Build Coastguard Worker 
247*fb1b10abSAndroid Build Coastguard Worker       if (i == 0) {
248*fb1b10abSAndroid Build Coastguard Worker         // When |coeff values| are less than zbin the results are 0.
249*fb1b10abSAndroid Build Coastguard Worker         int threshold = 100;
250*fb1b10abSAndroid Build Coastguard Worker         if (max_size_ == 32) {
251*fb1b10abSAndroid Build Coastguard Worker           // For 32x32, the threshold is halved. Double it to keep the values
252*fb1b10abSAndroid Build Coastguard Worker           // from clearing it.
253*fb1b10abSAndroid Build Coastguard Worker           threshold = 200;
254*fb1b10abSAndroid Build Coastguard Worker         }
255*fb1b10abSAndroid Build Coastguard Worker         for (int j = 0; j < 8; ++j) zbin_ptr_[j] = threshold;
256*fb1b10abSAndroid Build Coastguard Worker         coeff_.Set(&rnd, -99, 99);
257*fb1b10abSAndroid Build Coastguard Worker       } else if (i == 1) {
258*fb1b10abSAndroid Build Coastguard Worker         for (int j = 0; j < 8; ++j) zbin_ptr_[j] = 50;
259*fb1b10abSAndroid Build Coastguard Worker         coeff_.Set(&rnd, -500, 500);
260*fb1b10abSAndroid Build Coastguard Worker       }
261*fb1b10abSAndroid Build Coastguard Worker 
262*fb1b10abSAndroid Build Coastguard Worker       const char *type =
263*fb1b10abSAndroid Build Coastguard Worker           (i == 0) ? "Bypass calculations " : "Full calculations ";
264*fb1b10abSAndroid Build Coastguard Worker       char block_size[16];
265*fb1b10abSAndroid Build Coastguard Worker       snprintf(block_size, sizeof(block_size), "%dx%d", 4 << sz, 4 << sz);
266*fb1b10abSAndroid Build Coastguard Worker       char title[100];
267*fb1b10abSAndroid Build Coastguard Worker       snprintf(title, sizeof(title), "%25s %8s ", type, block_size);
268*fb1b10abSAndroid Build Coastguard Worker 
269*fb1b10abSAndroid Build Coastguard Worker       if (is_median) {
270*fb1b10abSAndroid Build Coastguard Worker         RunNTimes(10000000 / count_);
271*fb1b10abSAndroid Build Coastguard Worker         PrintMedian(title);
272*fb1b10abSAndroid Build Coastguard Worker       } else {
273*fb1b10abSAndroid Build Coastguard Worker         Buffer<tran_low_t> ref_qcoeff =
274*fb1b10abSAndroid Build Coastguard Worker             Buffer<tran_low_t>(max_size_, max_size_, 0, 32);
275*fb1b10abSAndroid Build Coastguard Worker         ASSERT_TRUE(ref_qcoeff.Init());
276*fb1b10abSAndroid Build Coastguard Worker         Buffer<tran_low_t> ref_dqcoeff =
277*fb1b10abSAndroid Build Coastguard Worker             Buffer<tran_low_t>(max_size_, max_size_, 0, 32);
278*fb1b10abSAndroid Build Coastguard Worker         ASSERT_TRUE(ref_dqcoeff.Init());
279*fb1b10abSAndroid Build Coastguard Worker         uint16_t ref_eob = 0;
280*fb1b10abSAndroid Build Coastguard Worker 
281*fb1b10abSAndroid Build Coastguard Worker         const int kNumTests = 5000000;
282*fb1b10abSAndroid Build Coastguard Worker         vpx_usec_timer timer, simd_timer;
283*fb1b10abSAndroid Build Coastguard Worker 
284*fb1b10abSAndroid Build Coastguard Worker         vpx_usec_timer_start(&timer);
285*fb1b10abSAndroid Build Coastguard Worker         for (int n = 0; n < kNumTests; ++n) {
286*fb1b10abSAndroid Build Coastguard Worker           ref_quantize_op_(coeff_.TopLeftPixel(), count_, mb_plane_,
287*fb1b10abSAndroid Build Coastguard Worker                            ref_qcoeff.TopLeftPixel(),
288*fb1b10abSAndroid Build Coastguard Worker                            ref_dqcoeff.TopLeftPixel(), dequant_ptr_, &ref_eob,
289*fb1b10abSAndroid Build Coastguard Worker                            scan_);
290*fb1b10abSAndroid Build Coastguard Worker         }
291*fb1b10abSAndroid Build Coastguard Worker         vpx_usec_timer_mark(&timer);
292*fb1b10abSAndroid Build Coastguard Worker 
293*fb1b10abSAndroid Build Coastguard Worker         vpx_usec_timer_start(&simd_timer);
294*fb1b10abSAndroid Build Coastguard Worker         for (int n = 0; n < kNumTests; ++n) {
295*fb1b10abSAndroid Build Coastguard Worker           quantize_op_(coeff_.TopLeftPixel(), count_, mb_plane_,
296*fb1b10abSAndroid Build Coastguard Worker                        qcoeff_.TopLeftPixel(), dqcoeff_.TopLeftPixel(),
297*fb1b10abSAndroid Build Coastguard Worker                        dequant_ptr_, &eob_, scan_);
298*fb1b10abSAndroid Build Coastguard Worker         }
299*fb1b10abSAndroid Build Coastguard Worker         vpx_usec_timer_mark(&simd_timer);
300*fb1b10abSAndroid Build Coastguard Worker 
301*fb1b10abSAndroid Build Coastguard Worker         const int elapsed_time =
302*fb1b10abSAndroid Build Coastguard Worker             static_cast<int>(vpx_usec_timer_elapsed(&timer));
303*fb1b10abSAndroid Build Coastguard Worker         const int simd_elapsed_time =
304*fb1b10abSAndroid Build Coastguard Worker             static_cast<int>(vpx_usec_timer_elapsed(&simd_timer));
305*fb1b10abSAndroid Build Coastguard Worker         printf("%s c_time = %d \t simd_time = %d \t Gain = %f \n", title,
306*fb1b10abSAndroid Build Coastguard Worker                elapsed_time, simd_elapsed_time,
307*fb1b10abSAndroid Build Coastguard Worker                ((float)elapsed_time / simd_elapsed_time));
308*fb1b10abSAndroid Build Coastguard Worker       }
309*fb1b10abSAndroid Build Coastguard Worker     }
310*fb1b10abSAndroid Build Coastguard Worker   }
311*fb1b10abSAndroid Build Coastguard Worker }
312*fb1b10abSAndroid Build Coastguard Worker 
313*fb1b10abSAndroid Build Coastguard Worker // This quantizer compares the AC coefficients to the quantization step size to
314*fb1b10abSAndroid Build Coastguard Worker // determine if further multiplication operations are needed.
315*fb1b10abSAndroid Build Coastguard Worker // Based on vp9_quantize_fp_sse2().
quant_fp_nz(const tran_low_t * coeff_ptr,intptr_t n_coeffs,const struct macroblock_plane * const mb_plane,tran_low_t * qcoeff_ptr,tran_low_t * dqcoeff_ptr,const int16_t * dequant_ptr,uint16_t * eob_ptr,const struct ScanOrder * const scan_order,int is_32x32)316*fb1b10abSAndroid Build Coastguard Worker inline void quant_fp_nz(const tran_low_t *coeff_ptr, intptr_t n_coeffs,
317*fb1b10abSAndroid Build Coastguard Worker                         const struct macroblock_plane *const mb_plane,
318*fb1b10abSAndroid Build Coastguard Worker                         tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr,
319*fb1b10abSAndroid Build Coastguard Worker                         const int16_t *dequant_ptr, uint16_t *eob_ptr,
320*fb1b10abSAndroid Build Coastguard Worker                         const struct ScanOrder *const scan_order,
321*fb1b10abSAndroid Build Coastguard Worker                         int is_32x32) {
322*fb1b10abSAndroid Build Coastguard Worker   int i, eob = -1;
323*fb1b10abSAndroid Build Coastguard Worker   const int thr = dequant_ptr[1] >> (1 + is_32x32);
324*fb1b10abSAndroid Build Coastguard Worker   const int16_t *round_ptr = mb_plane->round_fp;
325*fb1b10abSAndroid Build Coastguard Worker   const int16_t *quant_ptr = mb_plane->quant_fp;
326*fb1b10abSAndroid Build Coastguard Worker   const int16_t *scan = scan_order->scan;
327*fb1b10abSAndroid Build Coastguard Worker 
328*fb1b10abSAndroid Build Coastguard Worker   // Quantization pass: All coefficients with index >= zero_flag are
329*fb1b10abSAndroid Build Coastguard Worker   // skippable. Note: zero_flag can be zero.
330*fb1b10abSAndroid Build Coastguard Worker   for (i = 0; i < n_coeffs; i += 16) {
331*fb1b10abSAndroid Build Coastguard Worker     int y;
332*fb1b10abSAndroid Build Coastguard Worker     int nzflag_cnt = 0;
333*fb1b10abSAndroid Build Coastguard Worker     int abs_coeff[16];
334*fb1b10abSAndroid Build Coastguard Worker     int coeff_sign[16];
335*fb1b10abSAndroid Build Coastguard Worker 
336*fb1b10abSAndroid Build Coastguard Worker     // count nzflag for each row (16 tran_low_t)
337*fb1b10abSAndroid Build Coastguard Worker     for (y = 0; y < 16; ++y) {
338*fb1b10abSAndroid Build Coastguard Worker       const int rc = i + y;
339*fb1b10abSAndroid Build Coastguard Worker       const int coeff = coeff_ptr[rc];
340*fb1b10abSAndroid Build Coastguard Worker       coeff_sign[y] = (coeff >> 31);
341*fb1b10abSAndroid Build Coastguard Worker       abs_coeff[y] = (coeff ^ coeff_sign[y]) - coeff_sign[y];
342*fb1b10abSAndroid Build Coastguard Worker       // The first 16 are skipped in the sse2 code.  Do the same here to match.
343*fb1b10abSAndroid Build Coastguard Worker       if (i >= 16 && (abs_coeff[y] <= thr)) {
344*fb1b10abSAndroid Build Coastguard Worker         nzflag_cnt++;
345*fb1b10abSAndroid Build Coastguard Worker       }
346*fb1b10abSAndroid Build Coastguard Worker     }
347*fb1b10abSAndroid Build Coastguard Worker 
348*fb1b10abSAndroid Build Coastguard Worker     for (y = 0; y < 16; ++y) {
349*fb1b10abSAndroid Build Coastguard Worker       const int rc = i + y;
350*fb1b10abSAndroid Build Coastguard Worker       // If all of the AC coeffs in a row has magnitude less than the
351*fb1b10abSAndroid Build Coastguard Worker       // quantization step_size/2, quantize to zero.
352*fb1b10abSAndroid Build Coastguard Worker       if (nzflag_cnt < 16) {
353*fb1b10abSAndroid Build Coastguard Worker         int tmp;
354*fb1b10abSAndroid Build Coastguard Worker         int _round;
355*fb1b10abSAndroid Build Coastguard Worker 
356*fb1b10abSAndroid Build Coastguard Worker         if (is_32x32) {
357*fb1b10abSAndroid Build Coastguard Worker           _round = ROUND_POWER_OF_TWO(round_ptr[rc != 0], 1);
358*fb1b10abSAndroid Build Coastguard Worker         } else {
359*fb1b10abSAndroid Build Coastguard Worker           _round = round_ptr[rc != 0];
360*fb1b10abSAndroid Build Coastguard Worker         }
361*fb1b10abSAndroid Build Coastguard Worker         tmp = clamp(abs_coeff[y] + _round, INT16_MIN, INT16_MAX);
362*fb1b10abSAndroid Build Coastguard Worker         tmp = (tmp * quant_ptr[rc != 0]) >> (16 - is_32x32);
363*fb1b10abSAndroid Build Coastguard Worker         qcoeff_ptr[rc] = (tmp ^ coeff_sign[y]) - coeff_sign[y];
364*fb1b10abSAndroid Build Coastguard Worker         dqcoeff_ptr[rc] =
365*fb1b10abSAndroid Build Coastguard Worker             static_cast<tran_low_t>(qcoeff_ptr[rc] * dequant_ptr[rc != 0]);
366*fb1b10abSAndroid Build Coastguard Worker 
367*fb1b10abSAndroid Build Coastguard Worker         if (is_32x32) {
368*fb1b10abSAndroid Build Coastguard Worker           dqcoeff_ptr[rc] = static_cast<tran_low_t>(qcoeff_ptr[rc] *
369*fb1b10abSAndroid Build Coastguard Worker                                                     dequant_ptr[rc != 0] / 2);
370*fb1b10abSAndroid Build Coastguard Worker         } else {
371*fb1b10abSAndroid Build Coastguard Worker           dqcoeff_ptr[rc] =
372*fb1b10abSAndroid Build Coastguard Worker               static_cast<tran_low_t>(qcoeff_ptr[rc] * dequant_ptr[rc != 0]);
373*fb1b10abSAndroid Build Coastguard Worker         }
374*fb1b10abSAndroid Build Coastguard Worker       } else {
375*fb1b10abSAndroid Build Coastguard Worker         qcoeff_ptr[rc] = 0;
376*fb1b10abSAndroid Build Coastguard Worker         dqcoeff_ptr[rc] = 0;
377*fb1b10abSAndroid Build Coastguard Worker       }
378*fb1b10abSAndroid Build Coastguard Worker     }
379*fb1b10abSAndroid Build Coastguard Worker   }
380*fb1b10abSAndroid Build Coastguard Worker 
381*fb1b10abSAndroid Build Coastguard Worker   // Scan for eob.
382*fb1b10abSAndroid Build Coastguard Worker   for (i = 0; i < n_coeffs; i++) {
383*fb1b10abSAndroid Build Coastguard Worker     // Use the scan order to find the correct eob.
384*fb1b10abSAndroid Build Coastguard Worker     const int rc = scan[i];
385*fb1b10abSAndroid Build Coastguard Worker     if (qcoeff_ptr[rc]) {
386*fb1b10abSAndroid Build Coastguard Worker       eob = i;
387*fb1b10abSAndroid Build Coastguard Worker     }
388*fb1b10abSAndroid Build Coastguard Worker   }
389*fb1b10abSAndroid Build Coastguard Worker   *eob_ptr = eob + 1;
390*fb1b10abSAndroid Build Coastguard Worker }
391*fb1b10abSAndroid Build Coastguard Worker 
quantize_fp_nz_c(const tran_low_t * coeff_ptr,intptr_t n_coeffs,const struct macroblock_plane * mb_plane,tran_low_t * qcoeff_ptr,tran_low_t * dqcoeff_ptr,const int16_t * dequant_ptr,uint16_t * eob_ptr,const struct ScanOrder * const scan_order)392*fb1b10abSAndroid Build Coastguard Worker void quantize_fp_nz_c(const tran_low_t *coeff_ptr, intptr_t n_coeffs,
393*fb1b10abSAndroid Build Coastguard Worker                       const struct macroblock_plane *mb_plane,
394*fb1b10abSAndroid Build Coastguard Worker                       tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr,
395*fb1b10abSAndroid Build Coastguard Worker                       const int16_t *dequant_ptr, uint16_t *eob_ptr,
396*fb1b10abSAndroid Build Coastguard Worker                       const struct ScanOrder *const scan_order) {
397*fb1b10abSAndroid Build Coastguard Worker   quant_fp_nz(coeff_ptr, n_coeffs, mb_plane, qcoeff_ptr, dqcoeff_ptr,
398*fb1b10abSAndroid Build Coastguard Worker               dequant_ptr, eob_ptr, scan_order, 0);
399*fb1b10abSAndroid Build Coastguard Worker }
400*fb1b10abSAndroid Build Coastguard Worker 
quantize_fp_32x32_nz_c(const tran_low_t * coeff_ptr,intptr_t n_coeffs,const struct macroblock_plane * mb_plane,tran_low_t * qcoeff_ptr,tran_low_t * dqcoeff_ptr,const int16_t * dequant_ptr,uint16_t * eob_ptr,const struct ScanOrder * const scan_order)401*fb1b10abSAndroid Build Coastguard Worker void quantize_fp_32x32_nz_c(const tran_low_t *coeff_ptr, intptr_t n_coeffs,
402*fb1b10abSAndroid Build Coastguard Worker                             const struct macroblock_plane *mb_plane,
403*fb1b10abSAndroid Build Coastguard Worker                             tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr,
404*fb1b10abSAndroid Build Coastguard Worker                             const int16_t *dequant_ptr, uint16_t *eob_ptr,
405*fb1b10abSAndroid Build Coastguard Worker                             const struct ScanOrder *const scan_order) {
406*fb1b10abSAndroid Build Coastguard Worker   quant_fp_nz(coeff_ptr, n_coeffs, mb_plane, qcoeff_ptr, dqcoeff_ptr,
407*fb1b10abSAndroid Build Coastguard Worker               dequant_ptr, eob_ptr, scan_order, 1);
408*fb1b10abSAndroid Build Coastguard Worker }
409*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(VP9QuantizeTest,OperationCheck)410*fb1b10abSAndroid Build Coastguard Worker TEST_P(VP9QuantizeTest, OperationCheck) {
411*fb1b10abSAndroid Build Coastguard Worker   ACMRandom rnd(ACMRandom::DeterministicSeed());
412*fb1b10abSAndroid Build Coastguard Worker   ASSERT_TRUE(coeff_.Init());
413*fb1b10abSAndroid Build Coastguard Worker   ASSERT_TRUE(qcoeff_.Init());
414*fb1b10abSAndroid Build Coastguard Worker   ASSERT_TRUE(dqcoeff_.Init());
415*fb1b10abSAndroid Build Coastguard Worker   Buffer<tran_low_t> ref_qcoeff =
416*fb1b10abSAndroid Build Coastguard Worker       Buffer<tran_low_t>(max_size_, max_size_, 0, 32);
417*fb1b10abSAndroid Build Coastguard Worker   ASSERT_TRUE(ref_qcoeff.Init());
418*fb1b10abSAndroid Build Coastguard Worker   Buffer<tran_low_t> ref_dqcoeff =
419*fb1b10abSAndroid Build Coastguard Worker       Buffer<tran_low_t>(max_size_, max_size_, 0, 32);
420*fb1b10abSAndroid Build Coastguard Worker   ASSERT_TRUE(ref_dqcoeff.Init());
421*fb1b10abSAndroid Build Coastguard Worker   uint16_t ref_eob = 0;
422*fb1b10abSAndroid Build Coastguard Worker   eob_ = 0;
423*fb1b10abSAndroid Build Coastguard Worker 
424*fb1b10abSAndroid Build Coastguard Worker   for (int i = 0; i < number_of_iterations; ++i) {
425*fb1b10abSAndroid Build Coastguard Worker     TX_SIZE sz;
426*fb1b10abSAndroid Build Coastguard Worker     if (max_size_ == 16) {
427*fb1b10abSAndroid Build Coastguard Worker       sz = static_cast<TX_SIZE>(i % 3);  // TX_4X4, TX_8X8 TX_16X16
428*fb1b10abSAndroid Build Coastguard Worker     } else {
429*fb1b10abSAndroid Build Coastguard Worker       sz = TX_32X32;
430*fb1b10abSAndroid Build Coastguard Worker     }
431*fb1b10abSAndroid Build Coastguard Worker     const TX_TYPE tx_type = static_cast<TX_TYPE>((i >> 2) % 3);
432*fb1b10abSAndroid Build Coastguard Worker     scan_ = &vp9_scan_orders[sz][tx_type];
433*fb1b10abSAndroid Build Coastguard Worker     count_ = (4 << sz) * (4 << sz);
434*fb1b10abSAndroid Build Coastguard Worker     coeff_.Set(&rnd, -max_value_, max_value_);
435*fb1b10abSAndroid Build Coastguard Worker     GenerateHelperArrays(&rnd, zbin_ptr_, round_ptr_, quant_ptr_,
436*fb1b10abSAndroid Build Coastguard Worker                          quant_shift_ptr_, dequant_ptr_, round_fp_ptr_,
437*fb1b10abSAndroid Build Coastguard Worker                          quant_fp_ptr_);
438*fb1b10abSAndroid Build Coastguard Worker     ref_quantize_op_(coeff_.TopLeftPixel(), count_, mb_plane_,
439*fb1b10abSAndroid Build Coastguard Worker                      ref_qcoeff.TopLeftPixel(), ref_dqcoeff.TopLeftPixel(),
440*fb1b10abSAndroid Build Coastguard Worker                      dequant_ptr_, &ref_eob, scan_);
441*fb1b10abSAndroid Build Coastguard Worker 
442*fb1b10abSAndroid Build Coastguard Worker     ASM_REGISTER_STATE_CHECK(quantize_op_(
443*fb1b10abSAndroid Build Coastguard Worker         coeff_.TopLeftPixel(), count_, mb_plane_, qcoeff_.TopLeftPixel(),
444*fb1b10abSAndroid Build Coastguard Worker         dqcoeff_.TopLeftPixel(), dequant_ptr_, &eob_, scan_));
445*fb1b10abSAndroid Build Coastguard Worker 
446*fb1b10abSAndroid Build Coastguard Worker     EXPECT_TRUE(qcoeff_.CheckValues(ref_qcoeff));
447*fb1b10abSAndroid Build Coastguard Worker     EXPECT_TRUE(dqcoeff_.CheckValues(ref_dqcoeff));
448*fb1b10abSAndroid Build Coastguard Worker 
449*fb1b10abSAndroid Build Coastguard Worker     EXPECT_EQ(eob_, ref_eob);
450*fb1b10abSAndroid Build Coastguard Worker 
451*fb1b10abSAndroid Build Coastguard Worker     if (HasFailure()) {
452*fb1b10abSAndroid Build Coastguard Worker       printf("Failure on iteration %d.\n", i);
453*fb1b10abSAndroid Build Coastguard Worker       qcoeff_.PrintDifference(ref_qcoeff);
454*fb1b10abSAndroid Build Coastguard Worker       dqcoeff_.PrintDifference(ref_dqcoeff);
455*fb1b10abSAndroid Build Coastguard Worker       return;
456*fb1b10abSAndroid Build Coastguard Worker     }
457*fb1b10abSAndroid Build Coastguard Worker   }
458*fb1b10abSAndroid Build Coastguard Worker }
459*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(VP9QuantizeTest,EOBCheck)460*fb1b10abSAndroid Build Coastguard Worker TEST_P(VP9QuantizeTest, EOBCheck) {
461*fb1b10abSAndroid Build Coastguard Worker   ACMRandom rnd(ACMRandom::DeterministicSeed());
462*fb1b10abSAndroid Build Coastguard Worker   ASSERT_TRUE(coeff_.Init());
463*fb1b10abSAndroid Build Coastguard Worker   ASSERT_TRUE(qcoeff_.Init());
464*fb1b10abSAndroid Build Coastguard Worker   ASSERT_TRUE(dqcoeff_.Init());
465*fb1b10abSAndroid Build Coastguard Worker   Buffer<tran_low_t> ref_qcoeff =
466*fb1b10abSAndroid Build Coastguard Worker       Buffer<tran_low_t>(max_size_, max_size_, 0, 32);
467*fb1b10abSAndroid Build Coastguard Worker   ASSERT_TRUE(ref_qcoeff.Init());
468*fb1b10abSAndroid Build Coastguard Worker   Buffer<tran_low_t> ref_dqcoeff =
469*fb1b10abSAndroid Build Coastguard Worker       Buffer<tran_low_t>(max_size_, max_size_, 0, 32);
470*fb1b10abSAndroid Build Coastguard Worker   ASSERT_TRUE(ref_dqcoeff.Init());
471*fb1b10abSAndroid Build Coastguard Worker   uint16_t ref_eob = 0;
472*fb1b10abSAndroid Build Coastguard Worker   eob_ = 0;
473*fb1b10abSAndroid Build Coastguard Worker   const uint32_t max_index = max_size_ * max_size_ - 1;
474*fb1b10abSAndroid Build Coastguard Worker 
475*fb1b10abSAndroid Build Coastguard Worker   for (int i = 0; i < number_of_iterations; ++i) {
476*fb1b10abSAndroid Build Coastguard Worker     TX_SIZE sz;
477*fb1b10abSAndroid Build Coastguard Worker     if (max_size_ == 16) {
478*fb1b10abSAndroid Build Coastguard Worker       sz = static_cast<TX_SIZE>(i % 3);  // TX_4X4, TX_8X8 TX_16X16
479*fb1b10abSAndroid Build Coastguard Worker     } else {
480*fb1b10abSAndroid Build Coastguard Worker       sz = TX_32X32;
481*fb1b10abSAndroid Build Coastguard Worker     }
482*fb1b10abSAndroid Build Coastguard Worker     const TX_TYPE tx_type = static_cast<TX_TYPE>((i >> 2) % 3);
483*fb1b10abSAndroid Build Coastguard Worker     scan_ = &vp9_scan_orders[sz][tx_type];
484*fb1b10abSAndroid Build Coastguard Worker     count_ = (4 << sz) * (4 << sz);
485*fb1b10abSAndroid Build Coastguard Worker     // Two random entries
486*fb1b10abSAndroid Build Coastguard Worker     coeff_.Set(0);
487*fb1b10abSAndroid Build Coastguard Worker     coeff_.TopLeftPixel()[rnd.RandRange(count_) & max_index] =
488*fb1b10abSAndroid Build Coastguard Worker         static_cast<int>(rnd.RandRange(max_value_ * 2)) - max_value_;
489*fb1b10abSAndroid Build Coastguard Worker     coeff_.TopLeftPixel()[rnd.RandRange(count_) & max_index] =
490*fb1b10abSAndroid Build Coastguard Worker         static_cast<int>(rnd.RandRange(max_value_ * 2)) - max_value_;
491*fb1b10abSAndroid Build Coastguard Worker     GenerateHelperArrays(&rnd, zbin_ptr_, round_ptr_, quant_ptr_,
492*fb1b10abSAndroid Build Coastguard Worker                          quant_shift_ptr_, dequant_ptr_, round_fp_ptr_,
493*fb1b10abSAndroid Build Coastguard Worker                          quant_fp_ptr_);
494*fb1b10abSAndroid Build Coastguard Worker     ref_quantize_op_(coeff_.TopLeftPixel(), count_, mb_plane_,
495*fb1b10abSAndroid Build Coastguard Worker                      ref_qcoeff.TopLeftPixel(), ref_dqcoeff.TopLeftPixel(),
496*fb1b10abSAndroid Build Coastguard Worker                      dequant_ptr_, &ref_eob, scan_);
497*fb1b10abSAndroid Build Coastguard Worker 
498*fb1b10abSAndroid Build Coastguard Worker     ASM_REGISTER_STATE_CHECK(quantize_op_(
499*fb1b10abSAndroid Build Coastguard Worker         coeff_.TopLeftPixel(), count_, mb_plane_, qcoeff_.TopLeftPixel(),
500*fb1b10abSAndroid Build Coastguard Worker         dqcoeff_.TopLeftPixel(), dequant_ptr_, &eob_, scan_));
501*fb1b10abSAndroid Build Coastguard Worker 
502*fb1b10abSAndroid Build Coastguard Worker     EXPECT_TRUE(qcoeff_.CheckValues(ref_qcoeff));
503*fb1b10abSAndroid Build Coastguard Worker     EXPECT_TRUE(dqcoeff_.CheckValues(ref_dqcoeff));
504*fb1b10abSAndroid Build Coastguard Worker 
505*fb1b10abSAndroid Build Coastguard Worker     EXPECT_EQ(eob_, ref_eob);
506*fb1b10abSAndroid Build Coastguard Worker 
507*fb1b10abSAndroid Build Coastguard Worker     if (HasFailure()) {
508*fb1b10abSAndroid Build Coastguard Worker       printf("Failure on iteration %d.\n", i);
509*fb1b10abSAndroid Build Coastguard Worker       qcoeff_.PrintDifference(ref_qcoeff);
510*fb1b10abSAndroid Build Coastguard Worker       dqcoeff_.PrintDifference(ref_dqcoeff);
511*fb1b10abSAndroid Build Coastguard Worker       return;
512*fb1b10abSAndroid Build Coastguard Worker     }
513*fb1b10abSAndroid Build Coastguard Worker   }
514*fb1b10abSAndroid Build Coastguard Worker }
515*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(VP9QuantizeTest,DISABLED_Speed)516*fb1b10abSAndroid Build Coastguard Worker TEST_P(VP9QuantizeTest, DISABLED_Speed) { Speed(false); }
517*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(VP9QuantizeTest,DISABLED_SpeedMedian)518*fb1b10abSAndroid Build Coastguard Worker TEST_P(VP9QuantizeTest, DISABLED_SpeedMedian) { Speed(true); }
519*fb1b10abSAndroid Build Coastguard Worker 
520*fb1b10abSAndroid Build Coastguard Worker using std::make_tuple;
521*fb1b10abSAndroid Build Coastguard Worker 
522*fb1b10abSAndroid Build Coastguard Worker #if HAVE_SSE2
523*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
524*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
525*fb1b10abSAndroid Build Coastguard Worker     SSE2, VP9QuantizeTest,
526*fb1b10abSAndroid Build Coastguard Worker     ::testing::Values(
527*fb1b10abSAndroid Build Coastguard Worker         make_tuple(vpx_quantize_b_sse2, vpx_quantize_b_c, VPX_BITS_8, 16,
528*fb1b10abSAndroid Build Coastguard Worker                    false),
529*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&QuantFPWrapper<vp9_quantize_fp_sse2>,
530*fb1b10abSAndroid Build Coastguard Worker                    &QuantFPWrapper<quantize_fp_nz_c>, VPX_BITS_8, 16, true),
531*fb1b10abSAndroid Build Coastguard Worker         make_tuple(vpx_highbd_quantize_b_sse2, vpx_highbd_quantize_b_c,
532*fb1b10abSAndroid Build Coastguard Worker                    VPX_BITS_8, 16, false),
533*fb1b10abSAndroid Build Coastguard Worker         make_tuple(vpx_highbd_quantize_b_sse2, vpx_highbd_quantize_b_c,
534*fb1b10abSAndroid Build Coastguard Worker                    VPX_BITS_10, 16, false),
535*fb1b10abSAndroid Build Coastguard Worker         make_tuple(vpx_highbd_quantize_b_sse2, vpx_highbd_quantize_b_c,
536*fb1b10abSAndroid Build Coastguard Worker                    VPX_BITS_12, 16, false),
537*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&Quant32x32Wrapper<vpx_highbd_quantize_b_32x32_sse2>,
538*fb1b10abSAndroid Build Coastguard Worker                    &Quant32x32Wrapper<vpx_highbd_quantize_b_32x32_c>,
539*fb1b10abSAndroid Build Coastguard Worker                    VPX_BITS_8, 32, false),
540*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&Quant32x32Wrapper<vpx_highbd_quantize_b_32x32_sse2>,
541*fb1b10abSAndroid Build Coastguard Worker                    &Quant32x32Wrapper<vpx_highbd_quantize_b_32x32_c>,
542*fb1b10abSAndroid Build Coastguard Worker                    VPX_BITS_10, 32, false),
543*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&Quant32x32Wrapper<vpx_highbd_quantize_b_32x32_sse2>,
544*fb1b10abSAndroid Build Coastguard Worker                    &Quant32x32Wrapper<vpx_highbd_quantize_b_32x32_c>,
545*fb1b10abSAndroid Build Coastguard Worker                    VPX_BITS_12, 32, false)));
546*fb1b10abSAndroid Build Coastguard Worker 
547*fb1b10abSAndroid Build Coastguard Worker #else
548*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
549*fb1b10abSAndroid Build Coastguard Worker     SSE2, VP9QuantizeTest,
550*fb1b10abSAndroid Build Coastguard Worker     ::testing::Values(make_tuple(vpx_quantize_b_sse2, vpx_quantize_b_c,
551*fb1b10abSAndroid Build Coastguard Worker                                  VPX_BITS_8, 16, false),
552*fb1b10abSAndroid Build Coastguard Worker                       make_tuple(&QuantFPWrapper<vp9_quantize_fp_sse2>,
553*fb1b10abSAndroid Build Coastguard Worker                                  &QuantFPWrapper<quantize_fp_nz_c>, VPX_BITS_8,
554*fb1b10abSAndroid Build Coastguard Worker                                  16, true)));
555*fb1b10abSAndroid Build Coastguard Worker #endif  // CONFIG_VP9_HIGHBITDEPTH
556*fb1b10abSAndroid Build Coastguard Worker #endif  // HAVE_SSE2
557*fb1b10abSAndroid Build Coastguard Worker 
558*fb1b10abSAndroid Build Coastguard Worker #if HAVE_SSSE3
559*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
560*fb1b10abSAndroid Build Coastguard Worker     SSSE3, VP9QuantizeTest,
561*fb1b10abSAndroid Build Coastguard Worker     ::testing::Values(make_tuple(vpx_quantize_b_ssse3, vpx_quantize_b_c,
562*fb1b10abSAndroid Build Coastguard Worker                                  VPX_BITS_8, 16, false),
563*fb1b10abSAndroid Build Coastguard Worker                       make_tuple(&Quant32x32Wrapper<vpx_quantize_b_32x32_ssse3>,
564*fb1b10abSAndroid Build Coastguard Worker                                  &Quant32x32Wrapper<vpx_quantize_b_32x32_c>,
565*fb1b10abSAndroid Build Coastguard Worker                                  VPX_BITS_8, 32, false),
566*fb1b10abSAndroid Build Coastguard Worker                       make_tuple(&QuantFPWrapper<vp9_quantize_fp_ssse3>,
567*fb1b10abSAndroid Build Coastguard Worker                                  &QuantFPWrapper<quantize_fp_nz_c>, VPX_BITS_8,
568*fb1b10abSAndroid Build Coastguard Worker                                  16, true),
569*fb1b10abSAndroid Build Coastguard Worker                       make_tuple(&QuantFPWrapper<vp9_quantize_fp_32x32_ssse3>,
570*fb1b10abSAndroid Build Coastguard Worker                                  &QuantFPWrapper<quantize_fp_32x32_nz_c>,
571*fb1b10abSAndroid Build Coastguard Worker                                  VPX_BITS_8, 32, true)));
572*fb1b10abSAndroid Build Coastguard Worker #endif  // HAVE_SSSE3
573*fb1b10abSAndroid Build Coastguard Worker 
574*fb1b10abSAndroid Build Coastguard Worker #if HAVE_AVX
575*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
576*fb1b10abSAndroid Build Coastguard Worker     AVX, VP9QuantizeTest,
577*fb1b10abSAndroid Build Coastguard Worker     ::testing::Values(make_tuple(vpx_quantize_b_avx, vpx_quantize_b_c,
578*fb1b10abSAndroid Build Coastguard Worker                                  VPX_BITS_8, 16, false),
579*fb1b10abSAndroid Build Coastguard Worker                       make_tuple(&Quant32x32Wrapper<vpx_quantize_b_32x32_avx>,
580*fb1b10abSAndroid Build Coastguard Worker                                  &Quant32x32Wrapper<vpx_quantize_b_32x32_c>,
581*fb1b10abSAndroid Build Coastguard Worker                                  VPX_BITS_8, 32, false)));
582*fb1b10abSAndroid Build Coastguard Worker #endif  // HAVE_AVX
583*fb1b10abSAndroid Build Coastguard Worker 
584*fb1b10abSAndroid Build Coastguard Worker #if VPX_ARCH_X86_64 && HAVE_AVX2
585*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
586*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
587*fb1b10abSAndroid Build Coastguard Worker     AVX2, VP9QuantizeTest,
588*fb1b10abSAndroid Build Coastguard Worker     ::testing::Values(
589*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&QuantFPWrapper<vp9_quantize_fp_avx2>,
590*fb1b10abSAndroid Build Coastguard Worker                    &QuantFPWrapper<quantize_fp_nz_c>, VPX_BITS_8, 16, true),
591*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&QuantFPWrapper<vp9_highbd_quantize_fp_avx2>,
592*fb1b10abSAndroid Build Coastguard Worker                    &QuantFPWrapper<vp9_highbd_quantize_fp_c>, VPX_BITS_12, 16,
593*fb1b10abSAndroid Build Coastguard Worker                    true),
594*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&QuantFPWrapper<vp9_highbd_quantize_fp_32x32_avx2>,
595*fb1b10abSAndroid Build Coastguard Worker                    &QuantFPWrapper<vp9_highbd_quantize_fp_32x32_c>, VPX_BITS_12,
596*fb1b10abSAndroid Build Coastguard Worker                    32, true),
597*fb1b10abSAndroid Build Coastguard Worker         make_tuple(vpx_quantize_b_avx2, vpx_quantize_b_c, VPX_BITS_8, 16,
598*fb1b10abSAndroid Build Coastguard Worker                    false),
599*fb1b10abSAndroid Build Coastguard Worker         make_tuple(vpx_highbd_quantize_b_avx2, vpx_highbd_quantize_b_c,
600*fb1b10abSAndroid Build Coastguard Worker                    VPX_BITS_8, 16, false),
601*fb1b10abSAndroid Build Coastguard Worker         make_tuple(vpx_highbd_quantize_b_avx2, vpx_highbd_quantize_b_c,
602*fb1b10abSAndroid Build Coastguard Worker                    VPX_BITS_10, 16, false),
603*fb1b10abSAndroid Build Coastguard Worker         make_tuple(vpx_highbd_quantize_b_avx2, vpx_highbd_quantize_b_c,
604*fb1b10abSAndroid Build Coastguard Worker                    VPX_BITS_12, 16, false),
605*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&Quant32x32Wrapper<vpx_quantize_b_32x32_avx2>,
606*fb1b10abSAndroid Build Coastguard Worker                    &Quant32x32Wrapper<vpx_quantize_b_32x32_c>, VPX_BITS_8, 32,
607*fb1b10abSAndroid Build Coastguard Worker                    false),
608*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&Quant32x32Wrapper<vpx_highbd_quantize_b_32x32_avx2>,
609*fb1b10abSAndroid Build Coastguard Worker                    &Quant32x32Wrapper<vpx_highbd_quantize_b_32x32_c>,
610*fb1b10abSAndroid Build Coastguard Worker                    VPX_BITS_8, 32, false),
611*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&Quant32x32Wrapper<vpx_highbd_quantize_b_32x32_avx2>,
612*fb1b10abSAndroid Build Coastguard Worker                    &Quant32x32Wrapper<vpx_highbd_quantize_b_32x32_c>,
613*fb1b10abSAndroid Build Coastguard Worker                    VPX_BITS_10, 32, false),
614*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&Quant32x32Wrapper<vpx_highbd_quantize_b_32x32_avx2>,
615*fb1b10abSAndroid Build Coastguard Worker                    &Quant32x32Wrapper<vpx_highbd_quantize_b_32x32_c>,
616*fb1b10abSAndroid Build Coastguard Worker                    VPX_BITS_12, 32, false)));
617*fb1b10abSAndroid Build Coastguard Worker #else
618*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
619*fb1b10abSAndroid Build Coastguard Worker     AVX2, VP9QuantizeTest,
620*fb1b10abSAndroid Build Coastguard Worker     ::testing::Values(make_tuple(&QuantFPWrapper<vp9_quantize_fp_avx2>,
621*fb1b10abSAndroid Build Coastguard Worker                                  &QuantFPWrapper<quantize_fp_nz_c>, VPX_BITS_8,
622*fb1b10abSAndroid Build Coastguard Worker                                  16, true),
623*fb1b10abSAndroid Build Coastguard Worker                       make_tuple(&QuantFPWrapper<vp9_quantize_fp_32x32_avx2>,
624*fb1b10abSAndroid Build Coastguard Worker                                  &QuantFPWrapper<quantize_fp_32x32_nz_c>,
625*fb1b10abSAndroid Build Coastguard Worker                                  VPX_BITS_8, 32, true),
626*fb1b10abSAndroid Build Coastguard Worker                       make_tuple(vpx_quantize_b_avx2, vpx_quantize_b_c,
627*fb1b10abSAndroid Build Coastguard Worker                                  VPX_BITS_8, 16, false),
628*fb1b10abSAndroid Build Coastguard Worker                       make_tuple(&Quant32x32Wrapper<vpx_quantize_b_32x32_avx2>,
629*fb1b10abSAndroid Build Coastguard Worker                                  &Quant32x32Wrapper<vpx_quantize_b_32x32_c>,
630*fb1b10abSAndroid Build Coastguard Worker                                  VPX_BITS_8, 32, false)));
631*fb1b10abSAndroid Build Coastguard Worker #endif  // CONFIG_VP9_HIGHBITDEPTH
632*fb1b10abSAndroid Build Coastguard Worker #endif  // HAVE_AVX2
633*fb1b10abSAndroid Build Coastguard Worker 
634*fb1b10abSAndroid Build Coastguard Worker #if HAVE_NEON
635*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
636*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
637*fb1b10abSAndroid Build Coastguard Worker     NEON, VP9QuantizeTest,
638*fb1b10abSAndroid Build Coastguard Worker     ::testing::Values(
639*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&vpx_quantize_b_neon, &vpx_quantize_b_c, VPX_BITS_8, 16,
640*fb1b10abSAndroid Build Coastguard Worker                    false),
641*fb1b10abSAndroid Build Coastguard Worker         make_tuple(vpx_highbd_quantize_b_neon, vpx_highbd_quantize_b_c,
642*fb1b10abSAndroid Build Coastguard Worker                    VPX_BITS_8, 16, false),
643*fb1b10abSAndroid Build Coastguard Worker         make_tuple(vpx_highbd_quantize_b_neon, vpx_highbd_quantize_b_c,
644*fb1b10abSAndroid Build Coastguard Worker                    VPX_BITS_10, 16, false),
645*fb1b10abSAndroid Build Coastguard Worker         make_tuple(vpx_highbd_quantize_b_neon, vpx_highbd_quantize_b_c,
646*fb1b10abSAndroid Build Coastguard Worker                    VPX_BITS_12, 16, false),
647*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&Quant32x32Wrapper<vpx_quantize_b_32x32_neon>,
648*fb1b10abSAndroid Build Coastguard Worker                    &Quant32x32Wrapper<vpx_quantize_b_32x32_c>, VPX_BITS_8, 32,
649*fb1b10abSAndroid Build Coastguard Worker                    false),
650*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&Quant32x32Wrapper<vpx_highbd_quantize_b_32x32_neon>,
651*fb1b10abSAndroid Build Coastguard Worker                    &Quant32x32Wrapper<vpx_highbd_quantize_b_32x32_c>,
652*fb1b10abSAndroid Build Coastguard Worker                    VPX_BITS_8, 32, false),
653*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&Quant32x32Wrapper<vpx_highbd_quantize_b_32x32_neon>,
654*fb1b10abSAndroid Build Coastguard Worker                    &Quant32x32Wrapper<vpx_highbd_quantize_b_32x32_c>,
655*fb1b10abSAndroid Build Coastguard Worker                    VPX_BITS_10, 32, false),
656*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&Quant32x32Wrapper<vpx_highbd_quantize_b_32x32_neon>,
657*fb1b10abSAndroid Build Coastguard Worker                    &Quant32x32Wrapper<vpx_highbd_quantize_b_32x32_c>,
658*fb1b10abSAndroid Build Coastguard Worker                    VPX_BITS_12, 32, false),
659*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&QuantFPWrapper<vp9_quantize_fp_neon>,
660*fb1b10abSAndroid Build Coastguard Worker                    &QuantFPWrapper<vp9_quantize_fp_c>, VPX_BITS_8, 16, true),
661*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&QuantFPWrapper<vp9_quantize_fp_32x32_neon>,
662*fb1b10abSAndroid Build Coastguard Worker                    &QuantFPWrapper<vp9_quantize_fp_32x32_c>, VPX_BITS_8, 32,
663*fb1b10abSAndroid Build Coastguard Worker                    true)));
664*fb1b10abSAndroid Build Coastguard Worker #else
665*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
666*fb1b10abSAndroid Build Coastguard Worker     NEON, VP9QuantizeTest,
667*fb1b10abSAndroid Build Coastguard Worker     ::testing::Values(make_tuple(&vpx_quantize_b_neon, &vpx_quantize_b_c,
668*fb1b10abSAndroid Build Coastguard Worker                                  VPX_BITS_8, 16, false),
669*fb1b10abSAndroid Build Coastguard Worker                       make_tuple(&Quant32x32Wrapper<vpx_quantize_b_32x32_neon>,
670*fb1b10abSAndroid Build Coastguard Worker                                  &Quant32x32Wrapper<vpx_quantize_b_32x32_c>,
671*fb1b10abSAndroid Build Coastguard Worker                                  VPX_BITS_8, 32, false),
672*fb1b10abSAndroid Build Coastguard Worker                       make_tuple(&QuantFPWrapper<vp9_quantize_fp_neon>,
673*fb1b10abSAndroid Build Coastguard Worker                                  &QuantFPWrapper<vp9_quantize_fp_c>, VPX_BITS_8,
674*fb1b10abSAndroid Build Coastguard Worker                                  16, true),
675*fb1b10abSAndroid Build Coastguard Worker                       make_tuple(&QuantFPWrapper<vp9_quantize_fp_32x32_neon>,
676*fb1b10abSAndroid Build Coastguard Worker                                  &QuantFPWrapper<vp9_quantize_fp_32x32_c>,
677*fb1b10abSAndroid Build Coastguard Worker                                  VPX_BITS_8, 32, true)));
678*fb1b10abSAndroid Build Coastguard Worker #endif  // CONFIG_VP9_HIGHBITDEPTH
679*fb1b10abSAndroid Build Coastguard Worker #endif  // HAVE_NEON
680*fb1b10abSAndroid Build Coastguard Worker 
681*fb1b10abSAndroid Build Coastguard Worker #if HAVE_VSX && !CONFIG_VP9_HIGHBITDEPTH
682*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
683*fb1b10abSAndroid Build Coastguard Worker     VSX, VP9QuantizeTest,
684*fb1b10abSAndroid Build Coastguard Worker     ::testing::Values(make_tuple(&vpx_quantize_b_vsx, &vpx_quantize_b_c,
685*fb1b10abSAndroid Build Coastguard Worker                                  VPX_BITS_8, 16, false),
686*fb1b10abSAndroid Build Coastguard Worker                       make_tuple(&vpx_quantize_b_32x32_vsx,
687*fb1b10abSAndroid Build Coastguard Worker                                  &vpx_quantize_b_32x32_c, VPX_BITS_8, 32,
688*fb1b10abSAndroid Build Coastguard Worker                                  false),
689*fb1b10abSAndroid Build Coastguard Worker                       make_tuple(&QuantFPWrapper<vp9_quantize_fp_vsx>,
690*fb1b10abSAndroid Build Coastguard Worker                                  &QuantFPWrapper<vp9_quantize_fp_c>, VPX_BITS_8,
691*fb1b10abSAndroid Build Coastguard Worker                                  16, true),
692*fb1b10abSAndroid Build Coastguard Worker                       make_tuple(&QuantFPWrapper<vp9_quantize_fp_32x32_vsx>,
693*fb1b10abSAndroid Build Coastguard Worker                                  &QuantFPWrapper<vp9_quantize_fp_32x32_c>,
694*fb1b10abSAndroid Build Coastguard Worker                                  VPX_BITS_8, 32, true)));
695*fb1b10abSAndroid Build Coastguard Worker #endif  // HAVE_VSX && !CONFIG_VP9_HIGHBITDEPTH
696*fb1b10abSAndroid Build Coastguard Worker 
697*fb1b10abSAndroid Build Coastguard Worker #if HAVE_LSX && !CONFIG_VP9_HIGHBITDEPTH
698*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
699*fb1b10abSAndroid Build Coastguard Worker     LSX, VP9QuantizeTest,
700*fb1b10abSAndroid Build Coastguard Worker     ::testing::Values(make_tuple(&vpx_quantize_b_lsx, &vpx_quantize_b_c,
701*fb1b10abSAndroid Build Coastguard Worker                                  VPX_BITS_8, 16, false),
702*fb1b10abSAndroid Build Coastguard Worker                       make_tuple(&Quant32x32Wrapper<vpx_quantize_b_32x32_lsx>,
703*fb1b10abSAndroid Build Coastguard Worker                                  &Quant32x32Wrapper<vpx_quantize_b_32x32_c>,
704*fb1b10abSAndroid Build Coastguard Worker                                  VPX_BITS_8, 32, false)));
705*fb1b10abSAndroid Build Coastguard Worker #endif  // HAVE_LSX && !CONFIG_VP9_HIGHBITDEPTH
706*fb1b10abSAndroid Build Coastguard Worker 
707*fb1b10abSAndroid Build Coastguard Worker // Only useful to compare "Speed" test results.
708*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
709*fb1b10abSAndroid Build Coastguard Worker     DISABLED_C, VP9QuantizeTest,
710*fb1b10abSAndroid Build Coastguard Worker     ::testing::Values(
711*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&vpx_quantize_b_c, &vpx_quantize_b_c, VPX_BITS_8, 16, false),
712*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&Quant32x32Wrapper<vpx_quantize_b_32x32_c>,
713*fb1b10abSAndroid Build Coastguard Worker                    &Quant32x32Wrapper<vpx_quantize_b_32x32_c>, VPX_BITS_8, 32,
714*fb1b10abSAndroid Build Coastguard Worker                    false),
715*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&QuantFPWrapper<vp9_quantize_fp_c>,
716*fb1b10abSAndroid Build Coastguard Worker                    &QuantFPWrapper<vp9_quantize_fp_c>, VPX_BITS_8, 16, true),
717*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&QuantFPWrapper<quantize_fp_nz_c>,
718*fb1b10abSAndroid Build Coastguard Worker                    &QuantFPWrapper<quantize_fp_nz_c>, VPX_BITS_8, 16, true),
719*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&QuantFPWrapper<quantize_fp_32x32_nz_c>,
720*fb1b10abSAndroid Build Coastguard Worker                    &QuantFPWrapper<quantize_fp_32x32_nz_c>, VPX_BITS_8, 32,
721*fb1b10abSAndroid Build Coastguard Worker                    true),
722*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&QuantFPWrapper<vp9_quantize_fp_32x32_c>,
723*fb1b10abSAndroid Build Coastguard Worker                    &QuantFPWrapper<vp9_quantize_fp_32x32_c>, VPX_BITS_8, 32,
724*fb1b10abSAndroid Build Coastguard Worker                    true)));
725*fb1b10abSAndroid Build Coastguard Worker }  // namespace
726