1*fb1b10abSAndroid Build Coastguard Worker /*
2*fb1b10abSAndroid Build Coastguard Worker * Copyright (c) 2022 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 "./vpx_config.h"
12*fb1b10abSAndroid Build Coastguard Worker #include "./vpx_dsp_rtcd.h"
13*fb1b10abSAndroid Build Coastguard Worker #include "vpx_util/loongson_intrinsics.h"
14*fb1b10abSAndroid Build Coastguard Worker #include "vp9/common/vp9_scan.h"
15*fb1b10abSAndroid Build Coastguard Worker #include "vp9/encoder/vp9_block.h"
16*fb1b10abSAndroid Build Coastguard Worker
calculate_qcoeff(__m128i coeff,__m128i coeff_abs,__m128i round,__m128i quant,__m128i shift,__m128i cmp_mask)17*fb1b10abSAndroid Build Coastguard Worker static INLINE __m128i calculate_qcoeff(__m128i coeff, __m128i coeff_abs,
18*fb1b10abSAndroid Build Coastguard Worker __m128i round, __m128i quant,
19*fb1b10abSAndroid Build Coastguard Worker __m128i shift, __m128i cmp_mask) {
20*fb1b10abSAndroid Build Coastguard Worker __m128i rounded, qcoeff;
21*fb1b10abSAndroid Build Coastguard Worker
22*fb1b10abSAndroid Build Coastguard Worker rounded = __lsx_vsadd_h(coeff_abs, round);
23*fb1b10abSAndroid Build Coastguard Worker qcoeff = __lsx_vmuh_h(rounded, quant);
24*fb1b10abSAndroid Build Coastguard Worker qcoeff = __lsx_vadd_h(rounded, qcoeff);
25*fb1b10abSAndroid Build Coastguard Worker qcoeff = __lsx_vmuh_h(qcoeff, shift);
26*fb1b10abSAndroid Build Coastguard Worker qcoeff = __lsx_vsigncov_h(coeff, qcoeff);
27*fb1b10abSAndroid Build Coastguard Worker qcoeff = __lsx_vand_v(qcoeff, cmp_mask);
28*fb1b10abSAndroid Build Coastguard Worker
29*fb1b10abSAndroid Build Coastguard Worker return qcoeff;
30*fb1b10abSAndroid Build Coastguard Worker }
31*fb1b10abSAndroid Build Coastguard Worker
calculate_dqcoeff_and_store(__m128i qcoeff,__m128i dequant,int16_t * dqcoeff)32*fb1b10abSAndroid Build Coastguard Worker static INLINE void calculate_dqcoeff_and_store(__m128i qcoeff, __m128i dequant,
33*fb1b10abSAndroid Build Coastguard Worker int16_t *dqcoeff) {
34*fb1b10abSAndroid Build Coastguard Worker __m128i dqcoeff16 = __lsx_vmul_h(qcoeff, dequant);
35*fb1b10abSAndroid Build Coastguard Worker __lsx_vst(dqcoeff16, dqcoeff, 0);
36*fb1b10abSAndroid Build Coastguard Worker }
37*fb1b10abSAndroid Build Coastguard Worker
calculate_dqcoeff_and_store_32x32(__m128i qcoeff,__m128i dequant,int16_t * dqcoeff)38*fb1b10abSAndroid Build Coastguard Worker static INLINE void calculate_dqcoeff_and_store_32x32(__m128i qcoeff,
39*fb1b10abSAndroid Build Coastguard Worker __m128i dequant,
40*fb1b10abSAndroid Build Coastguard Worker int16_t *dqcoeff) {
41*fb1b10abSAndroid Build Coastguard Worker // Un-sign to bias rounding like C.
42*fb1b10abSAndroid Build Coastguard Worker __m128i low, high, dqcoeff32_0, dqcoeff32_1, res;
43*fb1b10abSAndroid Build Coastguard Worker __m128i zero = __lsx_vldi(0);
44*fb1b10abSAndroid Build Coastguard Worker __m128i coeff = __lsx_vabsd_h(qcoeff, zero);
45*fb1b10abSAndroid Build Coastguard Worker
46*fb1b10abSAndroid Build Coastguard Worker const __m128i sign_0 = __lsx_vilvl_h(qcoeff, zero);
47*fb1b10abSAndroid Build Coastguard Worker const __m128i sign_1 = __lsx_vilvh_h(qcoeff, zero);
48*fb1b10abSAndroid Build Coastguard Worker
49*fb1b10abSAndroid Build Coastguard Worker low = __lsx_vmul_h(coeff, dequant);
50*fb1b10abSAndroid Build Coastguard Worker high = __lsx_vmuh_h(coeff, dequant);
51*fb1b10abSAndroid Build Coastguard Worker dqcoeff32_0 = __lsx_vilvl_h(high, low);
52*fb1b10abSAndroid Build Coastguard Worker dqcoeff32_1 = __lsx_vilvh_h(high, low);
53*fb1b10abSAndroid Build Coastguard Worker
54*fb1b10abSAndroid Build Coastguard Worker // "Divide" by 2.
55*fb1b10abSAndroid Build Coastguard Worker dqcoeff32_0 = __lsx_vsrai_w(dqcoeff32_0, 1);
56*fb1b10abSAndroid Build Coastguard Worker dqcoeff32_1 = __lsx_vsrai_w(dqcoeff32_1, 1);
57*fb1b10abSAndroid Build Coastguard Worker dqcoeff32_0 = __lsx_vsigncov_w(sign_0, dqcoeff32_0);
58*fb1b10abSAndroid Build Coastguard Worker dqcoeff32_1 = __lsx_vsigncov_w(sign_1, dqcoeff32_1);
59*fb1b10abSAndroid Build Coastguard Worker res = __lsx_vpickev_h(dqcoeff32_1, dqcoeff32_0);
60*fb1b10abSAndroid Build Coastguard Worker __lsx_vst(res, dqcoeff, 0);
61*fb1b10abSAndroid Build Coastguard Worker }
62*fb1b10abSAndroid Build Coastguard Worker
scan_for_eob(__m128i coeff0,__m128i coeff1,const int16_t * scan,int index,__m128i zero)63*fb1b10abSAndroid Build Coastguard Worker static INLINE __m128i scan_for_eob(__m128i coeff0, __m128i coeff1,
64*fb1b10abSAndroid Build Coastguard Worker const int16_t *scan, int index,
65*fb1b10abSAndroid Build Coastguard Worker __m128i zero) {
66*fb1b10abSAndroid Build Coastguard Worker const __m128i zero_coeff0 = __lsx_vseq_h(coeff0, zero);
67*fb1b10abSAndroid Build Coastguard Worker const __m128i zero_coeff1 = __lsx_vseq_h(coeff1, zero);
68*fb1b10abSAndroid Build Coastguard Worker __m128i scan0 = __lsx_vld(scan + index, 0);
69*fb1b10abSAndroid Build Coastguard Worker __m128i scan1 = __lsx_vld(scan + index + 8, 0);
70*fb1b10abSAndroid Build Coastguard Worker __m128i eob0, eob1;
71*fb1b10abSAndroid Build Coastguard Worker
72*fb1b10abSAndroid Build Coastguard Worker eob0 = __lsx_vandn_v(zero_coeff0, scan0);
73*fb1b10abSAndroid Build Coastguard Worker eob1 = __lsx_vandn_v(zero_coeff1, scan1);
74*fb1b10abSAndroid Build Coastguard Worker return __lsx_vmax_h(eob0, eob1);
75*fb1b10abSAndroid Build Coastguard Worker }
76*fb1b10abSAndroid Build Coastguard Worker
accumulate_eob(__m128i eob)77*fb1b10abSAndroid Build Coastguard Worker static INLINE int16_t accumulate_eob(__m128i eob) {
78*fb1b10abSAndroid Build Coastguard Worker __m128i eob_shuffled;
79*fb1b10abSAndroid Build Coastguard Worker int16_t res_m;
80*fb1b10abSAndroid Build Coastguard Worker
81*fb1b10abSAndroid Build Coastguard Worker eob_shuffled = __lsx_vshuf4i_w(eob, 0xe);
82*fb1b10abSAndroid Build Coastguard Worker eob = __lsx_vmax_h(eob, eob_shuffled);
83*fb1b10abSAndroid Build Coastguard Worker eob_shuffled = __lsx_vshuf4i_h(eob, 0xe);
84*fb1b10abSAndroid Build Coastguard Worker eob = __lsx_vmax_h(eob, eob_shuffled);
85*fb1b10abSAndroid Build Coastguard Worker eob_shuffled = __lsx_vshuf4i_h(eob, 0x1);
86*fb1b10abSAndroid Build Coastguard Worker eob = __lsx_vmax_h(eob, eob_shuffled);
87*fb1b10abSAndroid Build Coastguard Worker res_m = __lsx_vpickve2gr_h(eob, 1);
88*fb1b10abSAndroid Build Coastguard Worker
89*fb1b10abSAndroid Build Coastguard Worker return res_m;
90*fb1b10abSAndroid Build Coastguard Worker }
91*fb1b10abSAndroid Build Coastguard Worker
92*fb1b10abSAndroid Build Coastguard Worker #if !CONFIG_VP9_HIGHBITDEPTH
93*fb1b10abSAndroid Build Coastguard Worker
vpx_quantize_b_lsx(const int16_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)94*fb1b10abSAndroid Build Coastguard Worker void vpx_quantize_b_lsx(const int16_t *coeff_ptr, intptr_t n_coeffs,
95*fb1b10abSAndroid Build Coastguard Worker const struct macroblock_plane *const mb_plane,
96*fb1b10abSAndroid Build Coastguard Worker tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr,
97*fb1b10abSAndroid Build Coastguard Worker const int16_t *dequant_ptr, uint16_t *eob_ptr,
98*fb1b10abSAndroid Build Coastguard Worker const struct ScanOrder *const scan_order) {
99*fb1b10abSAndroid Build Coastguard Worker __m128i zero = __lsx_vldi(0);
100*fb1b10abSAndroid Build Coastguard Worker int index = 16;
101*fb1b10abSAndroid Build Coastguard Worker const int16_t *iscan = scan_order->iscan;
102*fb1b10abSAndroid Build Coastguard Worker
103*fb1b10abSAndroid Build Coastguard Worker __m128i zbin, round, quant, dequant, quant_shift;
104*fb1b10abSAndroid Build Coastguard Worker __m128i coeff0, coeff1;
105*fb1b10abSAndroid Build Coastguard Worker __m128i qcoeff0, qcoeff1;
106*fb1b10abSAndroid Build Coastguard Worker __m128i cmp_mask0, cmp_mask1;
107*fb1b10abSAndroid Build Coastguard Worker __m128i eob, eob0;
108*fb1b10abSAndroid Build Coastguard Worker
109*fb1b10abSAndroid Build Coastguard Worker zbin = __lsx_vld(mb_plane->zbin, 0);
110*fb1b10abSAndroid Build Coastguard Worker round = __lsx_vld(mb_plane->round, 0);
111*fb1b10abSAndroid Build Coastguard Worker quant = __lsx_vld(mb_plane->quant, 0);
112*fb1b10abSAndroid Build Coastguard Worker dequant = __lsx_vld(dequant_ptr, 0);
113*fb1b10abSAndroid Build Coastguard Worker quant_shift = __lsx_vld(mb_plane->quant_shift, 0);
114*fb1b10abSAndroid Build Coastguard Worker // Handle one DC and first 15 AC.
115*fb1b10abSAndroid Build Coastguard Worker DUP2_ARG2(__lsx_vld, coeff_ptr, 0, coeff_ptr, 16, coeff0, coeff1);
116*fb1b10abSAndroid Build Coastguard Worker qcoeff0 = __lsx_vabsd_h(coeff0, zero);
117*fb1b10abSAndroid Build Coastguard Worker qcoeff1 = __lsx_vabsd_h(coeff1, zero);
118*fb1b10abSAndroid Build Coastguard Worker
119*fb1b10abSAndroid Build Coastguard Worker cmp_mask0 = __lsx_vsle_h(zbin, qcoeff0);
120*fb1b10abSAndroid Build Coastguard Worker zbin = __lsx_vilvh_d(zbin, zbin);
121*fb1b10abSAndroid Build Coastguard Worker cmp_mask1 = __lsx_vsle_h(zbin, qcoeff1);
122*fb1b10abSAndroid Build Coastguard Worker
123*fb1b10abSAndroid Build Coastguard Worker qcoeff0 =
124*fb1b10abSAndroid Build Coastguard Worker calculate_qcoeff(coeff0, qcoeff0, round, quant, quant_shift, cmp_mask0);
125*fb1b10abSAndroid Build Coastguard Worker round = __lsx_vilvh_d(round, round);
126*fb1b10abSAndroid Build Coastguard Worker quant = __lsx_vilvh_d(quant, quant);
127*fb1b10abSAndroid Build Coastguard Worker quant_shift = __lsx_vilvh_d(quant_shift, quant_shift);
128*fb1b10abSAndroid Build Coastguard Worker qcoeff1 =
129*fb1b10abSAndroid Build Coastguard Worker calculate_qcoeff(coeff1, qcoeff1, round, quant, quant_shift, cmp_mask1);
130*fb1b10abSAndroid Build Coastguard Worker
131*fb1b10abSAndroid Build Coastguard Worker __lsx_vst(qcoeff0, qcoeff_ptr, 0);
132*fb1b10abSAndroid Build Coastguard Worker __lsx_vst(qcoeff1, qcoeff_ptr, 16);
133*fb1b10abSAndroid Build Coastguard Worker
134*fb1b10abSAndroid Build Coastguard Worker calculate_dqcoeff_and_store(qcoeff0, dequant, dqcoeff_ptr);
135*fb1b10abSAndroid Build Coastguard Worker dequant = __lsx_vilvh_d(dequant, dequant);
136*fb1b10abSAndroid Build Coastguard Worker calculate_dqcoeff_and_store(qcoeff1, dequant, dqcoeff_ptr + 8);
137*fb1b10abSAndroid Build Coastguard Worker
138*fb1b10abSAndroid Build Coastguard Worker eob = scan_for_eob(qcoeff0, qcoeff1, iscan, 0, zero);
139*fb1b10abSAndroid Build Coastguard Worker // AC only loop.
140*fb1b10abSAndroid Build Coastguard Worker while (index < n_coeffs) {
141*fb1b10abSAndroid Build Coastguard Worker coeff0 = __lsx_vld(coeff_ptr + index, 0);
142*fb1b10abSAndroid Build Coastguard Worker coeff1 = __lsx_vld(coeff_ptr + index + 8, 0);
143*fb1b10abSAndroid Build Coastguard Worker
144*fb1b10abSAndroid Build Coastguard Worker qcoeff0 = __lsx_vabsd_h(coeff0, zero);
145*fb1b10abSAndroid Build Coastguard Worker qcoeff1 = __lsx_vabsd_h(coeff1, zero);
146*fb1b10abSAndroid Build Coastguard Worker
147*fb1b10abSAndroid Build Coastguard Worker cmp_mask0 = __lsx_vsle_h(zbin, qcoeff0);
148*fb1b10abSAndroid Build Coastguard Worker cmp_mask1 = __lsx_vsle_h(zbin, qcoeff1);
149*fb1b10abSAndroid Build Coastguard Worker
150*fb1b10abSAndroid Build Coastguard Worker qcoeff0 =
151*fb1b10abSAndroid Build Coastguard Worker calculate_qcoeff(coeff0, qcoeff0, round, quant, quant_shift, cmp_mask0);
152*fb1b10abSAndroid Build Coastguard Worker qcoeff1 =
153*fb1b10abSAndroid Build Coastguard Worker calculate_qcoeff(coeff1, qcoeff1, round, quant, quant_shift, cmp_mask1);
154*fb1b10abSAndroid Build Coastguard Worker
155*fb1b10abSAndroid Build Coastguard Worker __lsx_vst(qcoeff0, qcoeff_ptr + index, 0);
156*fb1b10abSAndroid Build Coastguard Worker __lsx_vst(qcoeff1, qcoeff_ptr + index + 8, 0);
157*fb1b10abSAndroid Build Coastguard Worker
158*fb1b10abSAndroid Build Coastguard Worker calculate_dqcoeff_and_store(qcoeff0, dequant, dqcoeff_ptr + index);
159*fb1b10abSAndroid Build Coastguard Worker calculate_dqcoeff_and_store(qcoeff1, dequant, dqcoeff_ptr + index + 8);
160*fb1b10abSAndroid Build Coastguard Worker
161*fb1b10abSAndroid Build Coastguard Worker eob0 = scan_for_eob(qcoeff0, qcoeff1, iscan, index, zero);
162*fb1b10abSAndroid Build Coastguard Worker eob = __lsx_vmax_h(eob, eob0);
163*fb1b10abSAndroid Build Coastguard Worker
164*fb1b10abSAndroid Build Coastguard Worker index += 16;
165*fb1b10abSAndroid Build Coastguard Worker }
166*fb1b10abSAndroid Build Coastguard Worker
167*fb1b10abSAndroid Build Coastguard Worker *eob_ptr = accumulate_eob(eob);
168*fb1b10abSAndroid Build Coastguard Worker }
169*fb1b10abSAndroid Build Coastguard Worker
vpx_quantize_b_32x32_lsx(const tran_low_t * coeff_ptr,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)170*fb1b10abSAndroid Build Coastguard Worker void vpx_quantize_b_32x32_lsx(const tran_low_t *coeff_ptr,
171*fb1b10abSAndroid Build Coastguard Worker const struct macroblock_plane *const mb_plane,
172*fb1b10abSAndroid Build Coastguard Worker tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr,
173*fb1b10abSAndroid Build Coastguard Worker const int16_t *dequant_ptr, uint16_t *eob_ptr,
174*fb1b10abSAndroid Build Coastguard Worker const struct ScanOrder *const scan_order) {
175*fb1b10abSAndroid Build Coastguard Worker __m128i zero = __lsx_vldi(0);
176*fb1b10abSAndroid Build Coastguard Worker int index;
177*fb1b10abSAndroid Build Coastguard Worker const int16_t *iscan = scan_order->iscan;
178*fb1b10abSAndroid Build Coastguard Worker
179*fb1b10abSAndroid Build Coastguard Worker __m128i zbin, round, quant, dequant, quant_shift;
180*fb1b10abSAndroid Build Coastguard Worker __m128i coeff0, coeff1, qcoeff0, qcoeff1, cmp_mask0, cmp_mask1;
181*fb1b10abSAndroid Build Coastguard Worker __m128i eob = zero, eob0;
182*fb1b10abSAndroid Build Coastguard Worker
183*fb1b10abSAndroid Build Coastguard Worker zbin = __lsx_vld(mb_plane->zbin, 0);
184*fb1b10abSAndroid Build Coastguard Worker zbin = __lsx_vsrari_h(zbin, 1);
185*fb1b10abSAndroid Build Coastguard Worker round = __lsx_vld(mb_plane->round, 0);
186*fb1b10abSAndroid Build Coastguard Worker round = __lsx_vsrari_h(round, 1);
187*fb1b10abSAndroid Build Coastguard Worker
188*fb1b10abSAndroid Build Coastguard Worker quant = __lsx_vld(mb_plane->quant, 0);
189*fb1b10abSAndroid Build Coastguard Worker dequant = __lsx_vld(dequant_ptr, 0);
190*fb1b10abSAndroid Build Coastguard Worker quant_shift = __lsx_vld(mb_plane->quant_shift, 0);
191*fb1b10abSAndroid Build Coastguard Worker quant_shift = __lsx_vslli_h(quant_shift, 1);
192*fb1b10abSAndroid Build Coastguard Worker // Handle one DC and first 15 AC.
193*fb1b10abSAndroid Build Coastguard Worker DUP2_ARG2(__lsx_vld, coeff_ptr, 0, coeff_ptr, 16, coeff0, coeff1);
194*fb1b10abSAndroid Build Coastguard Worker qcoeff0 = __lsx_vabsd_h(coeff0, zero);
195*fb1b10abSAndroid Build Coastguard Worker qcoeff1 = __lsx_vabsd_h(coeff1, zero);
196*fb1b10abSAndroid Build Coastguard Worker
197*fb1b10abSAndroid Build Coastguard Worker cmp_mask0 = __lsx_vsle_h(zbin, qcoeff0);
198*fb1b10abSAndroid Build Coastguard Worker // remove DC from zbin
199*fb1b10abSAndroid Build Coastguard Worker zbin = __lsx_vilvh_d(zbin, zbin);
200*fb1b10abSAndroid Build Coastguard Worker cmp_mask1 = __lsx_vsle_h(zbin, qcoeff1);
201*fb1b10abSAndroid Build Coastguard Worker
202*fb1b10abSAndroid Build Coastguard Worker qcoeff0 =
203*fb1b10abSAndroid Build Coastguard Worker calculate_qcoeff(coeff0, qcoeff0, round, quant, quant_shift, cmp_mask0);
204*fb1b10abSAndroid Build Coastguard Worker // remove DC in quant_shift, quant, quant_shift
205*fb1b10abSAndroid Build Coastguard Worker round = __lsx_vilvh_d(round, round);
206*fb1b10abSAndroid Build Coastguard Worker quant = __lsx_vilvh_d(quant, quant);
207*fb1b10abSAndroid Build Coastguard Worker quant_shift = __lsx_vilvh_d(quant_shift, quant_shift);
208*fb1b10abSAndroid Build Coastguard Worker qcoeff1 =
209*fb1b10abSAndroid Build Coastguard Worker calculate_qcoeff(coeff1, qcoeff1, round, quant, quant_shift, cmp_mask1);
210*fb1b10abSAndroid Build Coastguard Worker __lsx_vst(qcoeff0, qcoeff_ptr, 0);
211*fb1b10abSAndroid Build Coastguard Worker __lsx_vst(qcoeff1, qcoeff_ptr, 16);
212*fb1b10abSAndroid Build Coastguard Worker
213*fb1b10abSAndroid Build Coastguard Worker calculate_dqcoeff_and_store_32x32(qcoeff0, dequant, dqcoeff_ptr);
214*fb1b10abSAndroid Build Coastguard Worker dequant = __lsx_vilvh_d(dequant, dequant);
215*fb1b10abSAndroid Build Coastguard Worker calculate_dqcoeff_and_store_32x32(qcoeff1, dequant, dqcoeff_ptr + 8);
216*fb1b10abSAndroid Build Coastguard Worker eob = scan_for_eob(qcoeff0, qcoeff1, iscan, 0, zero);
217*fb1b10abSAndroid Build Coastguard Worker // AC only loop.
218*fb1b10abSAndroid Build Coastguard Worker for (index = 16; index < 32 * 32; index += 16) {
219*fb1b10abSAndroid Build Coastguard Worker coeff0 = __lsx_vld(coeff_ptr + index, 0);
220*fb1b10abSAndroid Build Coastguard Worker coeff1 = __lsx_vld(coeff_ptr + index + 8, 0);
221*fb1b10abSAndroid Build Coastguard Worker
222*fb1b10abSAndroid Build Coastguard Worker qcoeff0 = __lsx_vabsd_h(coeff0, zero);
223*fb1b10abSAndroid Build Coastguard Worker qcoeff1 = __lsx_vabsd_h(coeff1, zero);
224*fb1b10abSAndroid Build Coastguard Worker
225*fb1b10abSAndroid Build Coastguard Worker cmp_mask0 = __lsx_vsle_h(zbin, qcoeff0);
226*fb1b10abSAndroid Build Coastguard Worker cmp_mask1 = __lsx_vsle_h(zbin, qcoeff1);
227*fb1b10abSAndroid Build Coastguard Worker
228*fb1b10abSAndroid Build Coastguard Worker qcoeff0 =
229*fb1b10abSAndroid Build Coastguard Worker calculate_qcoeff(coeff0, qcoeff0, round, quant, quant_shift, cmp_mask0);
230*fb1b10abSAndroid Build Coastguard Worker qcoeff1 =
231*fb1b10abSAndroid Build Coastguard Worker calculate_qcoeff(coeff1, qcoeff1, round, quant, quant_shift, cmp_mask1);
232*fb1b10abSAndroid Build Coastguard Worker __lsx_vst(qcoeff0, qcoeff_ptr + index, 0);
233*fb1b10abSAndroid Build Coastguard Worker __lsx_vst(qcoeff1, qcoeff_ptr + index + 8, 0);
234*fb1b10abSAndroid Build Coastguard Worker
235*fb1b10abSAndroid Build Coastguard Worker calculate_dqcoeff_and_store_32x32(qcoeff0, dequant, dqcoeff_ptr + index);
236*fb1b10abSAndroid Build Coastguard Worker calculate_dqcoeff_and_store_32x32(qcoeff1, dequant,
237*fb1b10abSAndroid Build Coastguard Worker dqcoeff_ptr + 8 + index);
238*fb1b10abSAndroid Build Coastguard Worker eob0 = scan_for_eob(qcoeff0, qcoeff1, iscan, index, zero);
239*fb1b10abSAndroid Build Coastguard Worker eob = __lsx_vmax_h(eob, eob0);
240*fb1b10abSAndroid Build Coastguard Worker }
241*fb1b10abSAndroid Build Coastguard Worker
242*fb1b10abSAndroid Build Coastguard Worker *eob_ptr = accumulate_eob(eob);
243*fb1b10abSAndroid Build Coastguard Worker }
244*fb1b10abSAndroid Build Coastguard Worker #endif
245