1cabdff1aSopenharmony_ci/*
2cabdff1aSopenharmony_ci * Copyright (c) 2022 Loongson Technology Corporation Limited
3cabdff1aSopenharmony_ci * Contributed by Shiyou Yin <yinshiyou-hf@loongson.cn>
4cabdff1aSopenharmony_ci *                Hao Chen <chenhao@loongson.cn>
5cabdff1aSopenharmony_ci *
6cabdff1aSopenharmony_ci * This file is part of FFmpeg.
7cabdff1aSopenharmony_ci *
8cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or
9cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public
10cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either
11cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version.
12cabdff1aSopenharmony_ci *
13cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful,
14cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of
15cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16cabdff1aSopenharmony_ci * Lesser General Public License for more details.
17cabdff1aSopenharmony_ci *
18cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public
19cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software
20cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21cabdff1aSopenharmony_ci */
22cabdff1aSopenharmony_ci
23cabdff1aSopenharmony_ci#include "libavutil/loongarch/loongson_intrinsics.h"
24cabdff1aSopenharmony_ci#include "hevcdsp_lsx.h"
25cabdff1aSopenharmony_ci
26cabdff1aSopenharmony_cistatic const int16_t gt8x8_cnst[16] __attribute__ ((aligned (64))) = {
27cabdff1aSopenharmony_ci    64, 64, 83, 36, 89, 50, 18, 75, 64, -64, 36, -83, 75, -89, -50, -18
28cabdff1aSopenharmony_ci};
29cabdff1aSopenharmony_ci
30cabdff1aSopenharmony_cistatic const int16_t gt16x16_cnst[64] __attribute__ ((aligned (64))) = {
31cabdff1aSopenharmony_ci    64, 83, 64, 36, 89, 75, 50, 18, 90, 80, 57, 25, 70, 87, 9, 43,
32cabdff1aSopenharmony_ci    64, 36, -64, -83, 75, -18, -89, -50, 87, 9, -80, -70, -43, 57, -25, -90,
33cabdff1aSopenharmony_ci    64, -36, -64, 83, 50, -89, 18, 75, 80, -70, -25, 90, -87, 9, 43, 57,
34cabdff1aSopenharmony_ci    64, -83, 64, -36, 18, -50, 75, -89, 70, -87, 90, -80, 9, -43, -57, 25
35cabdff1aSopenharmony_ci};
36cabdff1aSopenharmony_ci
37cabdff1aSopenharmony_cistatic const int16_t gt32x32_cnst0[256] __attribute__ ((aligned (64))) = {
38cabdff1aSopenharmony_ci    90, 90, 88, 85, 82, 78, 73, 67, 61, 54, 46, 38, 31, 22, 13, 4,
39cabdff1aSopenharmony_ci    90, 82, 67, 46, 22, -4, -31, -54, -73, -85, -90, -88, -78, -61, -38, -13,
40cabdff1aSopenharmony_ci    88, 67, 31, -13, -54, -82, -90, -78, -46, -4, 38, 73, 90, 85, 61, 22,
41cabdff1aSopenharmony_ci    85, 46, -13, -67, -90, -73, -22, 38, 82, 88, 54, -4, -61, -90, -78, -31,
42cabdff1aSopenharmony_ci    82, 22, -54, -90, -61, 13, 78, 85, 31, -46, -90, -67, 4, 73, 88, 38,
43cabdff1aSopenharmony_ci    78, -4, -82, -73, 13, 85, 67, -22, -88, -61, 31, 90, 54, -38, -90, -46,
44cabdff1aSopenharmony_ci    73, -31, -90, -22, 78, 67, -38, -90, -13, 82, 61, -46, -88, -4, 85, 54,
45cabdff1aSopenharmony_ci    67, -54, -78, 38, 85, -22, -90, 4, 90, 13, -88, -31, 82, 46, -73, -61,
46cabdff1aSopenharmony_ci    61, -73, -46, 82, 31, -88, -13, 90, -4, -90, 22, 85, -38, -78, 54, 67,
47cabdff1aSopenharmony_ci    54, -85, -4, 88, -46, -61, 82, 13, -90, 38, 67, -78, -22, 90, -31, -73,
48cabdff1aSopenharmony_ci    46, -90, 38, 54, -90, 31, 61, -88, 22, 67, -85, 13, 73, -82, 4, 78,
49cabdff1aSopenharmony_ci    38, -88, 73, -4, -67, 90, -46, -31, 85, -78, 13, 61, -90, 54, 22, -82,
50cabdff1aSopenharmony_ci    31, -78, 90, -61, 4, 54, -88, 82, -38, -22, 73, -90, 67, -13, -46, 85,
51cabdff1aSopenharmony_ci    22, -61, 85, -90, 73, -38, -4, 46, -78, 90, -82, 54, -13, -31, 67, -88,
52cabdff1aSopenharmony_ci    13, -38, 61, -78, 88, -90, 85, -73, 54, -31, 4, 22, -46, 67, -82, 90,
53cabdff1aSopenharmony_ci    4, -13, 22, -31, 38, -46, 54, -61, 67, -73, 78, -82, 85, -88, 90, -90
54cabdff1aSopenharmony_ci};
55cabdff1aSopenharmony_ci
56cabdff1aSopenharmony_cistatic const int16_t gt32x32_cnst1[64] __attribute__ ((aligned (64))) = {
57cabdff1aSopenharmony_ci    90, 87, 80, 70, 57, 43, 25, 9, 87, 57, 9, -43, -80, -90, -70, -25,
58cabdff1aSopenharmony_ci    80, 9, -70, -87, -25, 57, 90, 43, 70, -43, -87, 9, 90, 25, -80, -57,
59cabdff1aSopenharmony_ci    57, -80, -25, 90, -9, -87, 43, 70, 43, -90, 57, 25, -87, 70, 9, -80,
60cabdff1aSopenharmony_ci    25, -70, 90, -80, 43, 9, -57, 87, 9, -25, 43, -57, 70, -80, 87, -90
61cabdff1aSopenharmony_ci};
62cabdff1aSopenharmony_ci
63cabdff1aSopenharmony_cistatic const int16_t gt32x32_cnst2[16] __attribute__ ((aligned (64))) = {
64cabdff1aSopenharmony_ci    89, 75, 50, 18, 75, -18, -89, -50, 50, -89, 18, 75, 18, -50, 75, -89
65cabdff1aSopenharmony_ci};
66cabdff1aSopenharmony_ci
67cabdff1aSopenharmony_ci#define HEVC_IDCT4x4_COL(in_r0, in_l0, in_r1, in_l1,          \
68cabdff1aSopenharmony_ci                         sum0, sum1, sum2, sum3, shift)       \
69cabdff1aSopenharmony_ci{                                                             \
70cabdff1aSopenharmony_ci    __m128i vec0, vec1, vec2, vec3, vec4, vec5;               \
71cabdff1aSopenharmony_ci    __m128i cnst64 = __lsx_vldi(0x0840);                      \
72cabdff1aSopenharmony_ci    __m128i cnst83 = __lsx_vldi(0x0853);                      \
73cabdff1aSopenharmony_ci    __m128i cnst36 = __lsx_vldi(0x0824);                      \
74cabdff1aSopenharmony_ci                                                              \
75cabdff1aSopenharmony_ci    vec0 = __lsx_vdp2_w_h(in_r0, cnst64);                     \
76cabdff1aSopenharmony_ci    vec1 = __lsx_vdp2_w_h(in_l0, cnst83);                     \
77cabdff1aSopenharmony_ci    vec2 = __lsx_vdp2_w_h(in_r1, cnst64);                     \
78cabdff1aSopenharmony_ci    vec3 = __lsx_vdp2_w_h(in_l1, cnst36);                     \
79cabdff1aSopenharmony_ci    vec4 = __lsx_vdp2_w_h(in_l0, cnst36);                     \
80cabdff1aSopenharmony_ci    vec5 = __lsx_vdp2_w_h(in_l1, cnst83);                     \
81cabdff1aSopenharmony_ci                                                              \
82cabdff1aSopenharmony_ci    sum0 = __lsx_vadd_w(vec0, vec2);                          \
83cabdff1aSopenharmony_ci    sum1 = __lsx_vsub_w(vec0, vec2);                          \
84cabdff1aSopenharmony_ci    vec1 = __lsx_vadd_w(vec1, vec3);                          \
85cabdff1aSopenharmony_ci    vec4 = __lsx_vsub_w(vec4, vec5);                          \
86cabdff1aSopenharmony_ci    sum2 = __lsx_vsub_w(sum1, vec4);                          \
87cabdff1aSopenharmony_ci    sum3 = __lsx_vsub_w(sum0, vec1);                          \
88cabdff1aSopenharmony_ci    sum0 = __lsx_vadd_w(sum0, vec1);                          \
89cabdff1aSopenharmony_ci    sum1 = __lsx_vadd_w(sum1, vec4);                          \
90cabdff1aSopenharmony_ci                                                              \
91cabdff1aSopenharmony_ci    sum0 = __lsx_vsrari_w(sum0, shift);                       \
92cabdff1aSopenharmony_ci    sum1 = __lsx_vsrari_w(sum1, shift);                       \
93cabdff1aSopenharmony_ci    sum2 = __lsx_vsrari_w(sum2, shift);                       \
94cabdff1aSopenharmony_ci    sum3 = __lsx_vsrari_w(sum3, shift);                       \
95cabdff1aSopenharmony_ci    sum0 = __lsx_vsat_w(sum0, 15);                            \
96cabdff1aSopenharmony_ci    sum1 = __lsx_vsat_w(sum1, 15);                            \
97cabdff1aSopenharmony_ci    sum2 = __lsx_vsat_w(sum2, 15);                            \
98cabdff1aSopenharmony_ci    sum3 = __lsx_vsat_w(sum3, 15);                            \
99cabdff1aSopenharmony_ci}
100cabdff1aSopenharmony_ci
101cabdff1aSopenharmony_ci#define HEVC_IDCT8x8_COL(in0, in1, in2, in3, in4, in5, in6, in7, shift)  \
102cabdff1aSopenharmony_ci{                                                                        \
103cabdff1aSopenharmony_ci    __m128i src0_r, src1_r, src2_r, src3_r;                              \
104cabdff1aSopenharmony_ci    __m128i src0_l, src1_l, src2_l, src3_l;                              \
105cabdff1aSopenharmony_ci    __m128i filter0, filter1, filter2, filter3;                          \
106cabdff1aSopenharmony_ci    __m128i temp0_r, temp1_r, temp2_r, temp3_r, temp4_r, temp5_r;        \
107cabdff1aSopenharmony_ci    __m128i temp0_l, temp1_l, temp2_l, temp3_l, temp4_l, temp5_l;        \
108cabdff1aSopenharmony_ci    __m128i sum0_r, sum1_r, sum2_r, sum3_r;                              \
109cabdff1aSopenharmony_ci    __m128i sum0_l, sum1_l, sum2_l, sum3_l;                              \
110cabdff1aSopenharmony_ci                                                                         \
111cabdff1aSopenharmony_ci    DUP4_ARG2(__lsx_vilvl_h, in4, in0, in6, in2, in5, in1, in3, in7,     \
112cabdff1aSopenharmony_ci              src0_r, src1_r, src2_r, src3_r);                           \
113cabdff1aSopenharmony_ci    DUP4_ARG2(__lsx_vilvh_h, in4, in0, in6, in2, in5, in1, in3, in7,     \
114cabdff1aSopenharmony_ci              src0_l, src1_l, src2_l, src3_l);                           \
115cabdff1aSopenharmony_ci                                                                         \
116cabdff1aSopenharmony_ci    DUP4_ARG2(__lsx_vldrepl_w, filter, 0, filter, 4, filter, 8,          \
117cabdff1aSopenharmony_ci              filter, 12, filter0, filter1, filter2, filter3);           \
118cabdff1aSopenharmony_ci    DUP4_ARG2(__lsx_vdp2_w_h, src0_r, filter0, src0_l, filter0,          \
119cabdff1aSopenharmony_ci              src1_r, filter1, src1_l, filter1,  temp0_r, temp0_l,       \
120cabdff1aSopenharmony_ci              temp1_r, temp1_l);                                         \
121cabdff1aSopenharmony_ci                                                                         \
122cabdff1aSopenharmony_ci    LSX_BUTTERFLY_4_W(temp0_r, temp0_l, temp1_l, temp1_r, sum0_r, sum0_l,\
123cabdff1aSopenharmony_ci                      sum1_l, sum1_r);                                   \
124cabdff1aSopenharmony_ci    sum2_r = sum1_r;                                                     \
125cabdff1aSopenharmony_ci    sum2_l = sum1_l;                                                     \
126cabdff1aSopenharmony_ci    sum3_r = sum0_r;                                                     \
127cabdff1aSopenharmony_ci    sum3_l = sum0_l;                                                     \
128cabdff1aSopenharmony_ci                                                                         \
129cabdff1aSopenharmony_ci    DUP4_ARG2(__lsx_vdp2_w_h, src2_r, filter2, src2_l, filter2,          \
130cabdff1aSopenharmony_ci              src3_r, filter3, src3_l, filter3,  temp2_r, temp2_l,       \
131cabdff1aSopenharmony_ci              temp3_r, temp3_l);                                         \
132cabdff1aSopenharmony_ci    temp2_r = __lsx_vadd_w(temp2_r, temp3_r);                            \
133cabdff1aSopenharmony_ci    temp2_l = __lsx_vadd_w(temp2_l, temp3_l);                            \
134cabdff1aSopenharmony_ci    sum0_r  = __lsx_vadd_w(sum0_r, temp2_r);                             \
135cabdff1aSopenharmony_ci    sum0_l  = __lsx_vadd_w(sum0_l, temp2_l);                             \
136cabdff1aSopenharmony_ci    sum3_r  = __lsx_vsub_w(sum3_r, temp2_r);                             \
137cabdff1aSopenharmony_ci    sum3_l  = __lsx_vsub_w(sum3_l, temp2_l);                             \
138cabdff1aSopenharmony_ci                                                                         \
139cabdff1aSopenharmony_ci    in0 = __lsx_vssrarni_h_w(sum0_l, sum0_r, shift);                     \
140cabdff1aSopenharmony_ci    in7 = __lsx_vssrarni_h_w(sum3_l, sum3_r, shift);                     \
141cabdff1aSopenharmony_ci                                                                         \
142cabdff1aSopenharmony_ci    DUP4_ARG2(__lsx_vdp2_w_h, src2_r, filter3, src2_l, filter3,          \
143cabdff1aSopenharmony_ci              src3_r, filter2, src3_l, filter2,  temp4_r, temp4_l,       \
144cabdff1aSopenharmony_ci              temp5_r, temp5_l);                                         \
145cabdff1aSopenharmony_ci    temp4_r = __lsx_vsub_w(temp4_r, temp5_r);                            \
146cabdff1aSopenharmony_ci    temp4_l = __lsx_vsub_w(temp4_l, temp5_l);                            \
147cabdff1aSopenharmony_ci    sum1_r  = __lsx_vadd_w(sum1_r, temp4_r);                             \
148cabdff1aSopenharmony_ci    sum1_l  = __lsx_vadd_w(sum1_l, temp4_l);                             \
149cabdff1aSopenharmony_ci    sum2_r  = __lsx_vsub_w(sum2_r, temp4_r);                             \
150cabdff1aSopenharmony_ci    sum2_l  = __lsx_vsub_w(sum2_l, temp4_l);                             \
151cabdff1aSopenharmony_ci                                                                         \
152cabdff1aSopenharmony_ci    in3 = __lsx_vssrarni_h_w(sum1_l, sum1_r, shift);                     \
153cabdff1aSopenharmony_ci    in4 = __lsx_vssrarni_h_w(sum2_l, sum2_r, shift);                     \
154cabdff1aSopenharmony_ci                                                                         \
155cabdff1aSopenharmony_ci    DUP4_ARG2(__lsx_vldrepl_w, filter, 16, filter, 20, filter, 24,       \
156cabdff1aSopenharmony_ci              filter, 28, filter0, filter1, filter2, filter3);           \
157cabdff1aSopenharmony_ci    DUP4_ARG2(__lsx_vdp2_w_h, src0_r, filter0, src0_l, filter0,          \
158cabdff1aSopenharmony_ci              src1_r, filter1, src1_l, filter1,  temp0_r, temp0_l,       \
159cabdff1aSopenharmony_ci              temp1_r, temp1_l);                                         \
160cabdff1aSopenharmony_ci                                                                         \
161cabdff1aSopenharmony_ci    LSX_BUTTERFLY_4_W(temp0_r, temp0_l, temp1_l, temp1_r, sum0_r, sum0_l,\
162cabdff1aSopenharmony_ci                      sum1_l, sum1_r);                                   \
163cabdff1aSopenharmony_ci    sum2_r = sum1_r;                                                     \
164cabdff1aSopenharmony_ci    sum2_l = sum1_l;                                                     \
165cabdff1aSopenharmony_ci    sum3_r = sum0_r;                                                     \
166cabdff1aSopenharmony_ci    sum3_l = sum0_l;                                                     \
167cabdff1aSopenharmony_ci                                                                         \
168cabdff1aSopenharmony_ci    DUP4_ARG2(__lsx_vdp2_w_h, src2_r, filter2, src2_l, filter2,          \
169cabdff1aSopenharmony_ci              src3_r, filter3, src3_l, filter3,  temp2_r, temp2_l,       \
170cabdff1aSopenharmony_ci              temp3_r, temp3_l);                                         \
171cabdff1aSopenharmony_ci    temp2_r = __lsx_vadd_w(temp2_r, temp3_r);                            \
172cabdff1aSopenharmony_ci    temp2_l = __lsx_vadd_w(temp2_l, temp3_l);                            \
173cabdff1aSopenharmony_ci    sum0_r  = __lsx_vadd_w(sum0_r, temp2_r);                             \
174cabdff1aSopenharmony_ci    sum0_l  = __lsx_vadd_w(sum0_l, temp2_l);                             \
175cabdff1aSopenharmony_ci    sum3_r  = __lsx_vsub_w(sum3_r, temp2_r);                             \
176cabdff1aSopenharmony_ci    sum3_l  = __lsx_vsub_w(sum3_l, temp2_l);                             \
177cabdff1aSopenharmony_ci                                                                         \
178cabdff1aSopenharmony_ci    in1 = __lsx_vssrarni_h_w(sum0_l, sum0_r, shift);                     \
179cabdff1aSopenharmony_ci    in6 = __lsx_vssrarni_h_w(sum3_l, sum3_r, shift);                     \
180cabdff1aSopenharmony_ci                                                                         \
181cabdff1aSopenharmony_ci    DUP4_ARG2(__lsx_vdp2_w_h, src2_r, filter3, src2_l, filter3,          \
182cabdff1aSopenharmony_ci              src3_r, filter2, src3_l, filter2,  temp4_r, temp4_l,       \
183cabdff1aSopenharmony_ci              temp5_r, temp5_l);                                         \
184cabdff1aSopenharmony_ci    temp4_r = __lsx_vsub_w(temp4_r, temp5_r);                            \
185cabdff1aSopenharmony_ci    temp4_l = __lsx_vsub_w(temp4_l, temp5_l);                            \
186cabdff1aSopenharmony_ci    sum1_r  = __lsx_vsub_w(sum1_r, temp4_r);                             \
187cabdff1aSopenharmony_ci    sum1_l  = __lsx_vsub_w(sum1_l, temp4_l);                             \
188cabdff1aSopenharmony_ci    sum2_r  = __lsx_vadd_w(sum2_r, temp4_r);                             \
189cabdff1aSopenharmony_ci    sum2_l  = __lsx_vadd_w(sum2_l, temp4_l);                             \
190cabdff1aSopenharmony_ci                                                                         \
191cabdff1aSopenharmony_ci    in2 = __lsx_vssrarni_h_w(sum1_l, sum1_r, shift);                     \
192cabdff1aSopenharmony_ci    in5 = __lsx_vssrarni_h_w(sum2_l, sum2_r, shift);                     \
193cabdff1aSopenharmony_ci}
194cabdff1aSopenharmony_ci
195cabdff1aSopenharmony_ci#define HEVC_IDCT16x16_COL(src0_r, src1_r, src2_r, src3_r,                   \
196cabdff1aSopenharmony_ci                           src4_r, src5_r, src6_r, src7_r,                   \
197cabdff1aSopenharmony_ci                           src0_l, src1_l, src2_l, src3_l,                   \
198cabdff1aSopenharmony_ci                           src4_l, src5_l, src6_l, src7_l, shift)            \
199cabdff1aSopenharmony_ci{                                                                            \
200cabdff1aSopenharmony_ci    int16_t *ptr0, *ptr1;                                                    \
201cabdff1aSopenharmony_ci    __m128i dst0, dst1;                                                      \
202cabdff1aSopenharmony_ci    __m128i filter0, filter1, filter2, filter3;                              \
203cabdff1aSopenharmony_ci    __m128i temp0_r, temp1_r, temp0_l, temp1_l;                              \
204cabdff1aSopenharmony_ci    __m128i sum0_r, sum1_r, sum2_r, sum3_r, sum0_l, sum1_l, sum2_l;          \
205cabdff1aSopenharmony_ci    __m128i sum3_l, res0_r, res1_r, res0_l, res1_l;                          \
206cabdff1aSopenharmony_ci                                                                             \
207cabdff1aSopenharmony_ci    ptr0 = (buf_ptr + 112);                                                  \
208cabdff1aSopenharmony_ci    ptr1 = (buf_ptr + 128);                                                  \
209cabdff1aSopenharmony_ci    k = -1;                                                                  \
210cabdff1aSopenharmony_ci                                                                             \
211cabdff1aSopenharmony_ci    for (j = 0; j < 4; j++)                                                  \
212cabdff1aSopenharmony_ci    {                                                                        \
213cabdff1aSopenharmony_ci        DUP4_ARG2(__lsx_vldrepl_w, filter, 0, filter, 4, filter, 16,         \
214cabdff1aSopenharmony_ci                  filter, 20, filter0, filter1, filter2, filter3);           \
215cabdff1aSopenharmony_ci        DUP4_ARG2(__lsx_vdp2_w_h, src0_r, filter0, src0_l, filter0,          \
216cabdff1aSopenharmony_ci                  src4_r, filter2, src4_l, filter2,  sum0_r, sum0_l,         \
217cabdff1aSopenharmony_ci                  sum2_r, sum2_l);                                           \
218cabdff1aSopenharmony_ci        DUP2_ARG2(__lsx_vdp2_w_h, src7_r, filter2, src7_l, filter2,          \
219cabdff1aSopenharmony_ci                  sum3_r, sum3_l);                                           \
220cabdff1aSopenharmony_ci        DUP4_ARG3(__lsx_vdp2add_w_h, sum0_r, src1_r, filter1, sum0_l,        \
221cabdff1aSopenharmony_ci                  src1_l, filter1, sum2_r, src5_r, filter3, sum2_l,          \
222cabdff1aSopenharmony_ci                  src5_l, filter3, sum0_r, sum0_l, sum2_r, sum2_l);          \
223cabdff1aSopenharmony_ci        DUP2_ARG3(__lsx_vdp2add_w_h, sum3_r, src6_r, filter3, sum3_l,        \
224cabdff1aSopenharmony_ci                  src6_l, filter3, sum3_r, sum3_l);                          \
225cabdff1aSopenharmony_ci                                                                             \
226cabdff1aSopenharmony_ci        sum1_r = sum0_r;                                                     \
227cabdff1aSopenharmony_ci        sum1_l = sum0_l;                                                     \
228cabdff1aSopenharmony_ci                                                                             \
229cabdff1aSopenharmony_ci        DUP4_ARG2(__lsx_vldrepl_w, filter, 8, filter, 12, filter, 24,        \
230cabdff1aSopenharmony_ci                  filter, 28, filter0, filter1, filter2, filter3);           \
231cabdff1aSopenharmony_ci        filter += 16;                                                        \
232cabdff1aSopenharmony_ci        DUP2_ARG2(__lsx_vdp2_w_h, src2_r, filter0, src2_l, filter0,          \
233cabdff1aSopenharmony_ci                  temp0_r, temp0_l);                                         \
234cabdff1aSopenharmony_ci        DUP2_ARG3(__lsx_vdp2add_w_h, sum2_r, src6_r, filter2, sum2_l,        \
235cabdff1aSopenharmony_ci                  src6_l, filter2, sum2_r, sum2_l);                          \
236cabdff1aSopenharmony_ci        DUP2_ARG2(__lsx_vdp2_w_h, src5_r, filter2, src5_l, filter2,          \
237cabdff1aSopenharmony_ci                  temp1_r, temp1_l);                                         \
238cabdff1aSopenharmony_ci                                                                             \
239cabdff1aSopenharmony_ci        sum0_r = __lsx_vadd_w(sum0_r, temp0_r);                              \
240cabdff1aSopenharmony_ci        sum0_l = __lsx_vadd_w(sum0_l, temp0_l);                              \
241cabdff1aSopenharmony_ci        sum1_r = __lsx_vsub_w(sum1_r, temp0_r);                              \
242cabdff1aSopenharmony_ci        sum1_l = __lsx_vsub_w(sum1_l, temp0_l);                              \
243cabdff1aSopenharmony_ci        sum3_r = __lsx_vsub_w(temp1_r, sum3_r);                              \
244cabdff1aSopenharmony_ci        sum3_l = __lsx_vsub_w(temp1_l, sum3_l);                              \
245cabdff1aSopenharmony_ci                                                                             \
246cabdff1aSopenharmony_ci        DUP2_ARG2(__lsx_vdp2_w_h, src3_r, filter1, src3_l, filter1,          \
247cabdff1aSopenharmony_ci                  temp0_r, temp0_l);                                         \
248cabdff1aSopenharmony_ci        DUP4_ARG3(__lsx_vdp2add_w_h, sum2_r, src7_r, filter3, sum2_l,        \
249cabdff1aSopenharmony_ci                  src7_l, filter3, sum3_r, src4_r, filter3, sum3_l,          \
250cabdff1aSopenharmony_ci                  src4_l, filter3, sum2_r, sum2_l, sum3_r, sum3_l);          \
251cabdff1aSopenharmony_ci                                                                             \
252cabdff1aSopenharmony_ci        sum0_r = __lsx_vadd_w(sum0_r, temp0_r);                              \
253cabdff1aSopenharmony_ci        sum0_l = __lsx_vadd_w(sum0_l, temp0_l);                              \
254cabdff1aSopenharmony_ci        sum1_r = __lsx_vsub_w(sum1_r, temp0_r);                              \
255cabdff1aSopenharmony_ci        sum1_l = __lsx_vsub_w(sum1_l, temp0_l);                              \
256cabdff1aSopenharmony_ci                                                                             \
257cabdff1aSopenharmony_ci        LSX_BUTTERFLY_4_W(sum0_r, sum0_l, sum2_l, sum2_r, res0_r, res0_l,    \
258cabdff1aSopenharmony_ci                          res1_l, res1_r);                                   \
259cabdff1aSopenharmony_ci        dst0 = __lsx_vssrarni_h_w(res0_l, res0_r, shift);                    \
260cabdff1aSopenharmony_ci        dst1 = __lsx_vssrarni_h_w(res1_l, res1_r, shift);                    \
261cabdff1aSopenharmony_ci        __lsx_vst(dst0, buf_ptr, 0);                                         \
262cabdff1aSopenharmony_ci        __lsx_vst(dst1, (buf_ptr + ((15 - (j * 2)) << 4)), 0);               \
263cabdff1aSopenharmony_ci                                                                             \
264cabdff1aSopenharmony_ci        LSX_BUTTERFLY_4_W(sum1_r, sum1_l, sum3_l, sum3_r, res0_r, res0_l,    \
265cabdff1aSopenharmony_ci                          res1_l, res1_r);                                   \
266cabdff1aSopenharmony_ci                                                                             \
267cabdff1aSopenharmony_ci        dst0 = __lsx_vssrarni_h_w(res0_l, res0_r, shift);                    \
268cabdff1aSopenharmony_ci        dst1 = __lsx_vssrarni_h_w(res1_l, res1_r, shift);                    \
269cabdff1aSopenharmony_ci        __lsx_vst(dst0, (ptr0 + ((((j + 1) >> 1) * 2 * k) << 4)), 0);        \
270cabdff1aSopenharmony_ci        __lsx_vst(dst1, (ptr1 - ((((j + 1) >> 1) * 2 * k) << 4)), 0);        \
271cabdff1aSopenharmony_ci                                                                             \
272cabdff1aSopenharmony_ci        k *= -1;                                                             \
273cabdff1aSopenharmony_ci        buf_ptr += 16;                                                       \
274cabdff1aSopenharmony_ci    }                                                                        \
275cabdff1aSopenharmony_ci}
276cabdff1aSopenharmony_ci
277cabdff1aSopenharmony_ci#define HEVC_EVEN16_CALC(input, sum0_r, sum0_l, load_idx, store_idx)  \
278cabdff1aSopenharmony_ci{                                                                     \
279cabdff1aSopenharmony_ci    tmp0_r = __lsx_vld(input + load_idx * 8, 0);                      \
280cabdff1aSopenharmony_ci    tmp0_l = __lsx_vld(input + load_idx * 8, 16);                     \
281cabdff1aSopenharmony_ci    tmp1_r = sum0_r;                                                  \
282cabdff1aSopenharmony_ci    tmp1_l = sum0_l;                                                  \
283cabdff1aSopenharmony_ci    sum0_r = __lsx_vadd_w(sum0_r, tmp0_r);                            \
284cabdff1aSopenharmony_ci    sum0_l = __lsx_vadd_w(sum0_l, tmp0_l);                            \
285cabdff1aSopenharmony_ci    __lsx_vst(sum0_r, (input + load_idx * 8), 0);                     \
286cabdff1aSopenharmony_ci    __lsx_vst(sum0_l, (input + load_idx * 8), 16);                    \
287cabdff1aSopenharmony_ci    tmp1_r = __lsx_vsub_w(tmp1_r, tmp0_r);                            \
288cabdff1aSopenharmony_ci    tmp1_l = __lsx_vsub_w(tmp1_l, tmp0_l);                            \
289cabdff1aSopenharmony_ci    __lsx_vst(tmp1_r, (input + store_idx * 8), 0);                    \
290cabdff1aSopenharmony_ci    __lsx_vst(tmp1_l, (input + store_idx * 8), 16);                   \
291cabdff1aSopenharmony_ci}
292cabdff1aSopenharmony_ci
293cabdff1aSopenharmony_ci#define HEVC_IDCT_LUMA4x4_COL(in_r0, in_l0, in_r1, in_l1,     \
294cabdff1aSopenharmony_ci                              res0, res1, res2, res3, shift)  \
295cabdff1aSopenharmony_ci{                                                             \
296cabdff1aSopenharmony_ci    __m128i vec0, vec1, vec2, vec3;                           \
297cabdff1aSopenharmony_ci    __m128i cnst74 = __lsx_vldi(0x84a);                       \
298cabdff1aSopenharmony_ci    __m128i cnst55 = __lsx_vldi(0x837);                       \
299cabdff1aSopenharmony_ci    __m128i cnst29 = __lsx_vldi(0x81d);                       \
300cabdff1aSopenharmony_ci                                                              \
301cabdff1aSopenharmony_ci    vec0 = __lsx_vadd_w(in_r0, in_r1);                        \
302cabdff1aSopenharmony_ci    vec2 = __lsx_vsub_w(in_r0, in_l1);                        \
303cabdff1aSopenharmony_ci    res0 = __lsx_vmul_w(vec0, cnst29);                        \
304cabdff1aSopenharmony_ci    res1 = __lsx_vmul_w(vec2, cnst55);                        \
305cabdff1aSopenharmony_ci    res2 = __lsx_vsub_w(in_r0, in_r1);                        \
306cabdff1aSopenharmony_ci    vec1 = __lsx_vadd_w(in_r1, in_l1);                        \
307cabdff1aSopenharmony_ci    res2 = __lsx_vadd_w(res2, in_l1);                         \
308cabdff1aSopenharmony_ci    vec3 = __lsx_vmul_w(in_l0, cnst74);                       \
309cabdff1aSopenharmony_ci    res3 = __lsx_vmul_w(vec0, cnst55);                        \
310cabdff1aSopenharmony_ci                                                              \
311cabdff1aSopenharmony_ci    res0 = __lsx_vadd_w(res0, __lsx_vmul_w(vec1, cnst55));    \
312cabdff1aSopenharmony_ci    res1 = __lsx_vsub_w(res1, __lsx_vmul_w(vec1, cnst29));    \
313cabdff1aSopenharmony_ci    res2 = __lsx_vmul_w(res2, cnst74);                        \
314cabdff1aSopenharmony_ci    res3 = __lsx_vadd_w(res3, __lsx_vmul_w(vec2, cnst29));    \
315cabdff1aSopenharmony_ci                                                              \
316cabdff1aSopenharmony_ci    res0 = __lsx_vadd_w(res0, vec3);                          \
317cabdff1aSopenharmony_ci    res1 = __lsx_vadd_w(res1, vec3);                          \
318cabdff1aSopenharmony_ci    res3 = __lsx_vsub_w(res3, vec3);                          \
319cabdff1aSopenharmony_ci                                                              \
320cabdff1aSopenharmony_ci    res0 = __lsx_vsrari_w(res0, shift);                       \
321cabdff1aSopenharmony_ci    res1 = __lsx_vsrari_w(res1, shift);                       \
322cabdff1aSopenharmony_ci    res2 = __lsx_vsrari_w(res2, shift);                       \
323cabdff1aSopenharmony_ci    res3 = __lsx_vsrari_w(res3, shift);                       \
324cabdff1aSopenharmony_ci    res0 = __lsx_vsat_w(res0, 15);                            \
325cabdff1aSopenharmony_ci    res1 = __lsx_vsat_w(res1, 15);                            \
326cabdff1aSopenharmony_ci    res2 = __lsx_vsat_w(res2, 15);                            \
327cabdff1aSopenharmony_ci    res3 = __lsx_vsat_w(res3, 15);                            \
328cabdff1aSopenharmony_ci}
329cabdff1aSopenharmony_ci
330cabdff1aSopenharmony_civoid ff_hevc_idct_4x4_lsx(int16_t *coeffs, int col_limit)
331cabdff1aSopenharmony_ci{
332cabdff1aSopenharmony_ci    __m128i in0, in1;
333cabdff1aSopenharmony_ci    __m128i in_r0, in_l0, in_r1, in_l1;
334cabdff1aSopenharmony_ci    __m128i sum0, sum1, sum2, sum3;
335cabdff1aSopenharmony_ci    __m128i zero = __lsx_vldi(0x00);
336cabdff1aSopenharmony_ci
337cabdff1aSopenharmony_ci    in0   = __lsx_vld(coeffs, 0);
338cabdff1aSopenharmony_ci    in1   = __lsx_vld(coeffs, 16);
339cabdff1aSopenharmony_ci    in_r0 = __lsx_vilvl_h(zero, in0);
340cabdff1aSopenharmony_ci    in_l0 = __lsx_vilvh_h(zero, in0);
341cabdff1aSopenharmony_ci    in_r1 = __lsx_vilvl_h(zero, in1);
342cabdff1aSopenharmony_ci    in_l1 = __lsx_vilvh_h(zero, in1);
343cabdff1aSopenharmony_ci
344cabdff1aSopenharmony_ci    HEVC_IDCT4x4_COL(in_r0, in_l0, in_r1, in_l1, sum0, sum1, sum2, sum3, 7);
345cabdff1aSopenharmony_ci    LSX_TRANSPOSE4x4_W(sum0, sum1, sum2, sum3, in_r0, in_l0, in_r1, in_l1);
346cabdff1aSopenharmony_ci    HEVC_IDCT4x4_COL(in_r0, in_l0, in_r1, in_l1, sum0, sum1, sum2, sum3, 12);
347cabdff1aSopenharmony_ci
348cabdff1aSopenharmony_ci    /* Pack and transpose */
349cabdff1aSopenharmony_ci    in0  = __lsx_vpickev_h(sum2, sum0);
350cabdff1aSopenharmony_ci    in1  = __lsx_vpickev_h(sum3, sum1);
351cabdff1aSopenharmony_ci    sum0 = __lsx_vilvl_h(in1, in0);
352cabdff1aSopenharmony_ci    sum1 = __lsx_vilvh_h(in1, in0);
353cabdff1aSopenharmony_ci    in0  = __lsx_vilvl_w(sum1, sum0);
354cabdff1aSopenharmony_ci    in1  = __lsx_vilvh_w(sum1, sum0);
355cabdff1aSopenharmony_ci
356cabdff1aSopenharmony_ci    __lsx_vst(in0, coeffs, 0);
357cabdff1aSopenharmony_ci    __lsx_vst(in1, coeffs, 16);
358cabdff1aSopenharmony_ci}
359cabdff1aSopenharmony_ci
360cabdff1aSopenharmony_civoid ff_hevc_idct_8x8_lsx(int16_t *coeffs, int col_limit)
361cabdff1aSopenharmony_ci{
362cabdff1aSopenharmony_ci    const int16_t *filter = &gt8x8_cnst[0];
363cabdff1aSopenharmony_ci    __m128i in0, in1, in2, in3, in4, in5, in6, in7;
364cabdff1aSopenharmony_ci
365cabdff1aSopenharmony_ci    DUP4_ARG2(__lsx_vld, coeffs, 0, coeffs, 16, coeffs, 32,
366cabdff1aSopenharmony_ci              coeffs, 48, in0, in1, in2, in3);
367cabdff1aSopenharmony_ci    DUP4_ARG2(__lsx_vld, coeffs, 64, coeffs, 80, coeffs, 96,
368cabdff1aSopenharmony_ci              coeffs, 112, in4, in5, in6, in7);
369cabdff1aSopenharmony_ci    HEVC_IDCT8x8_COL(in0, in1, in2, in3, in4, in5, in6, in7, 7);
370cabdff1aSopenharmony_ci    LSX_TRANSPOSE8x8_H(in0, in1, in2, in3, in4, in5, in6, in7,
371cabdff1aSopenharmony_ci                       in0, in1, in2, in3, in4, in5, in6, in7);
372cabdff1aSopenharmony_ci    HEVC_IDCT8x8_COL(in0, in1, in2, in3, in4, in5, in6, in7, 12);
373cabdff1aSopenharmony_ci    LSX_TRANSPOSE8x8_H(in0, in1, in2, in3, in4, in5, in6, in7,
374cabdff1aSopenharmony_ci                       in0, in1, in2, in3, in4, in5, in6, in7);
375cabdff1aSopenharmony_ci
376cabdff1aSopenharmony_ci    __lsx_vst(in0, coeffs, 0);
377cabdff1aSopenharmony_ci    __lsx_vst(in1, coeffs, 16);
378cabdff1aSopenharmony_ci    __lsx_vst(in2, coeffs, 32);
379cabdff1aSopenharmony_ci    __lsx_vst(in3, coeffs, 48);
380cabdff1aSopenharmony_ci    __lsx_vst(in4, coeffs, 64);
381cabdff1aSopenharmony_ci    __lsx_vst(in5, coeffs, 80);
382cabdff1aSopenharmony_ci    __lsx_vst(in6, coeffs, 96);
383cabdff1aSopenharmony_ci    __lsx_vst(in7, coeffs, 112);
384cabdff1aSopenharmony_ci}
385cabdff1aSopenharmony_ci
386cabdff1aSopenharmony_civoid ff_hevc_idct_16x16_lsx(int16_t *coeffs, int col_limit)
387cabdff1aSopenharmony_ci{
388cabdff1aSopenharmony_ci    int16_t i, j, k;
389cabdff1aSopenharmony_ci    int16_t buf[256];
390cabdff1aSopenharmony_ci    int16_t *buf_ptr = &buf[0];
391cabdff1aSopenharmony_ci    int16_t *src = coeffs;
392cabdff1aSopenharmony_ci    const int16_t *filter = &gt16x16_cnst[0];
393cabdff1aSopenharmony_ci    __m128i in0, in1, in2, in3, in4, in5, in6, in7;
394cabdff1aSopenharmony_ci    __m128i in8, in9, in10, in11, in12, in13, in14, in15;
395cabdff1aSopenharmony_ci    __m128i vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7;
396cabdff1aSopenharmony_ci    __m128i src0_r, src1_r, src2_r, src3_r, src4_r, src5_r, src6_r, src7_r;
397cabdff1aSopenharmony_ci    __m128i src0_l, src1_l, src2_l, src3_l, src4_l, src5_l, src6_l, src7_l;
398cabdff1aSopenharmony_ci
399cabdff1aSopenharmony_ci    for (i = 2; i--;) {
400cabdff1aSopenharmony_ci        DUP4_ARG2(__lsx_vld, src, 0, src, 32, src, 64, src, 96,
401cabdff1aSopenharmony_ci                  in0, in1, in2, in3);
402cabdff1aSopenharmony_ci        DUP4_ARG2(__lsx_vld, src, 128, src, 160, src, 192, src, 224,
403cabdff1aSopenharmony_ci                  in4, in5, in6, in7);
404cabdff1aSopenharmony_ci        DUP4_ARG2(__lsx_vld, src, 256, src, 288, src, 320, src, 352,
405cabdff1aSopenharmony_ci                  in8, in9, in10, in11);
406cabdff1aSopenharmony_ci        DUP4_ARG2(__lsx_vld, src, 384, src, 416, src, 448, src, 480,
407cabdff1aSopenharmony_ci                  in12, in13, in14, in15);
408cabdff1aSopenharmony_ci
409cabdff1aSopenharmony_ci        DUP4_ARG2(__lsx_vilvl_h, in4, in0, in12, in8, in6, in2, in14, in10,
410cabdff1aSopenharmony_ci                  src0_r, src1_r, src2_r, src3_r);
411cabdff1aSopenharmony_ci        DUP4_ARG2(__lsx_vilvl_h, in5, in1, in13, in9, in3, in7, in11, in15,
412cabdff1aSopenharmony_ci                  src4_r, src5_r, src6_r, src7_r);
413cabdff1aSopenharmony_ci        DUP4_ARG2(__lsx_vilvh_h, in4, in0, in12, in8, in6, in2, in14, in10,
414cabdff1aSopenharmony_ci                  src0_l, src1_l, src2_l, src3_l);
415cabdff1aSopenharmony_ci        DUP4_ARG2(__lsx_vilvh_h, in5, in1, in13, in9, in3, in7, in11, in15,
416cabdff1aSopenharmony_ci                  src4_l, src5_l, src6_l, src7_l);
417cabdff1aSopenharmony_ci
418cabdff1aSopenharmony_ci        HEVC_IDCT16x16_COL(src0_r, src1_r, src2_r, src3_r, src4_r, src5_r,
419cabdff1aSopenharmony_ci                           src6_r, src7_r, src0_l, src1_l, src2_l, src3_l,
420cabdff1aSopenharmony_ci                           src4_l, src5_l, src6_l, src7_l, 7);
421cabdff1aSopenharmony_ci
422cabdff1aSopenharmony_ci        src += 8;
423cabdff1aSopenharmony_ci        buf_ptr = (&buf[0] + 8);
424cabdff1aSopenharmony_ci        filter = &gt16x16_cnst[0];
425cabdff1aSopenharmony_ci    }
426cabdff1aSopenharmony_ci
427cabdff1aSopenharmony_ci    src = &buf[0];
428cabdff1aSopenharmony_ci    buf_ptr = coeffs;
429cabdff1aSopenharmony_ci    filter = &gt16x16_cnst[0];
430cabdff1aSopenharmony_ci
431cabdff1aSopenharmony_ci    for (i = 2; i--;) {
432cabdff1aSopenharmony_ci        DUP4_ARG2(__lsx_vld, src, 0, src, 16, src, 32, src, 48,
433cabdff1aSopenharmony_ci                  in0, in8, in1, in9);
434cabdff1aSopenharmony_ci        DUP4_ARG2(__lsx_vld, src, 64, src, 80, src, 96, src, 112,
435cabdff1aSopenharmony_ci                  in2, in10, in3, in11);
436cabdff1aSopenharmony_ci        DUP4_ARG2(__lsx_vld, src, 128, src, 144, src, 160, src, 176,
437cabdff1aSopenharmony_ci                  in4, in12, in5, in13);
438cabdff1aSopenharmony_ci        DUP4_ARG2(__lsx_vld, src, 192, src, 208, src, 224, src, 240,
439cabdff1aSopenharmony_ci                  in6, in14, in7, in15);
440cabdff1aSopenharmony_ci        LSX_TRANSPOSE8x8_H(in0, in1, in2, in3, in4, in5, in6, in7,
441cabdff1aSopenharmony_ci                           in0, in1, in2, in3, in4, in5, in6, in7);
442cabdff1aSopenharmony_ci        LSX_TRANSPOSE8x8_H(in8, in9, in10, in11, in12, in13, in14, in15,
443cabdff1aSopenharmony_ci                           in8, in9, in10, in11, in12, in13, in14, in15);
444cabdff1aSopenharmony_ci        DUP4_ARG2(__lsx_vilvl_h, in4, in0, in12, in8, in6, in2, in14, in10,
445cabdff1aSopenharmony_ci                  src0_r, src1_r, src2_r, src3_r);
446cabdff1aSopenharmony_ci        DUP4_ARG2(__lsx_vilvl_h, in5, in1, in13, in9, in3, in7, in11, in15,
447cabdff1aSopenharmony_ci                  src4_r, src5_r, src6_r, src7_r);
448cabdff1aSopenharmony_ci        DUP4_ARG2(__lsx_vilvh_h, in4, in0, in12, in8, in6, in2, in14, in10,
449cabdff1aSopenharmony_ci                  src0_l, src1_l, src2_l, src3_l);
450cabdff1aSopenharmony_ci        DUP4_ARG2(__lsx_vilvh_h, in5, in1, in13, in9, in3, in7, in11, in15,
451cabdff1aSopenharmony_ci                  src4_l, src5_l, src6_l, src7_l);
452cabdff1aSopenharmony_ci        HEVC_IDCT16x16_COL(src0_r, src1_r, src2_r, src3_r, src4_r, src5_r,
453cabdff1aSopenharmony_ci                           src6_r, src7_r, src0_l, src1_l, src2_l, src3_l,
454cabdff1aSopenharmony_ci                           src4_l, src5_l, src6_l, src7_l, 12);
455cabdff1aSopenharmony_ci
456cabdff1aSopenharmony_ci        src += 128;
457cabdff1aSopenharmony_ci        buf_ptr = coeffs + 8;
458cabdff1aSopenharmony_ci        filter = &gt16x16_cnst[0];
459cabdff1aSopenharmony_ci    }
460cabdff1aSopenharmony_ci
461cabdff1aSopenharmony_ci    DUP4_ARG2(__lsx_vld, coeffs, 0, coeffs, 32, coeffs, 64, coeffs, 96,
462cabdff1aSopenharmony_ci              in0, in1, in2, in3);
463cabdff1aSopenharmony_ci    DUP4_ARG2(__lsx_vld, coeffs, 128, coeffs, 160, coeffs, 192, coeffs, 224,
464cabdff1aSopenharmony_ci              in4, in5, in6, in7);
465cabdff1aSopenharmony_ci    LSX_TRANSPOSE8x8_H(in0, in1, in2, in3, in4, in5, in6, in7,
466cabdff1aSopenharmony_ci                       vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7);
467cabdff1aSopenharmony_ci    __lsx_vst(vec0, coeffs, 0);
468cabdff1aSopenharmony_ci    __lsx_vst(vec1, coeffs, 32);
469cabdff1aSopenharmony_ci    __lsx_vst(vec2, coeffs, 64);
470cabdff1aSopenharmony_ci    __lsx_vst(vec3, coeffs, 96);
471cabdff1aSopenharmony_ci    __lsx_vst(vec4, coeffs, 128);
472cabdff1aSopenharmony_ci    __lsx_vst(vec5, coeffs, 160);
473cabdff1aSopenharmony_ci    __lsx_vst(vec6, coeffs, 192);
474cabdff1aSopenharmony_ci    __lsx_vst(vec7, coeffs, 224);
475cabdff1aSopenharmony_ci
476cabdff1aSopenharmony_ci    src = coeffs + 8;
477cabdff1aSopenharmony_ci    DUP4_ARG2(__lsx_vld, src, 0, src, 32, src, 64, src, 96, in0, in1, in2, in3);
478cabdff1aSopenharmony_ci    DUP4_ARG2(__lsx_vld, src, 128, src, 160, src, 192, src, 224,
479cabdff1aSopenharmony_ci              in4, in5, in6, in7);
480cabdff1aSopenharmony_ci    LSX_TRANSPOSE8x8_H(in0, in1, in2, in3, in4, in5, in6, in7,
481cabdff1aSopenharmony_ci                       vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7);
482cabdff1aSopenharmony_ci    src = coeffs + 128;
483cabdff1aSopenharmony_ci    DUP4_ARG2(__lsx_vld, src, 0, src, 32, src, 64, src, 96,
484cabdff1aSopenharmony_ci              in8, in9, in10, in11);
485cabdff1aSopenharmony_ci    DUP4_ARG2(__lsx_vld, src, 128, src, 160, src, 192, src, 224,
486cabdff1aSopenharmony_ci              in12, in13, in14, in15);
487cabdff1aSopenharmony_ci
488cabdff1aSopenharmony_ci    __lsx_vst(vec0, src, 0);
489cabdff1aSopenharmony_ci    __lsx_vst(vec1, src, 32);
490cabdff1aSopenharmony_ci    __lsx_vst(vec2, src, 64);
491cabdff1aSopenharmony_ci    __lsx_vst(vec3, src, 96);
492cabdff1aSopenharmony_ci    __lsx_vst(vec4, src, 128);
493cabdff1aSopenharmony_ci    __lsx_vst(vec5, src, 160);
494cabdff1aSopenharmony_ci    __lsx_vst(vec6, src, 192);
495cabdff1aSopenharmony_ci    __lsx_vst(vec7, src, 224);
496cabdff1aSopenharmony_ci    LSX_TRANSPOSE8x8_H(in8, in9, in10, in11, in12, in13, in14, in15,
497cabdff1aSopenharmony_ci                       vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7);
498cabdff1aSopenharmony_ci    src = coeffs + 8;
499cabdff1aSopenharmony_ci    __lsx_vst(vec0, src, 0);
500cabdff1aSopenharmony_ci    __lsx_vst(vec1, src, 32);
501cabdff1aSopenharmony_ci    __lsx_vst(vec2, src, 64);
502cabdff1aSopenharmony_ci    __lsx_vst(vec3, src, 96);
503cabdff1aSopenharmony_ci    __lsx_vst(vec4, src, 128);
504cabdff1aSopenharmony_ci    __lsx_vst(vec5, src, 160);
505cabdff1aSopenharmony_ci    __lsx_vst(vec6, src, 192);
506cabdff1aSopenharmony_ci    __lsx_vst(vec7, src, 224);
507cabdff1aSopenharmony_ci
508cabdff1aSopenharmony_ci    src = coeffs + 136;
509cabdff1aSopenharmony_ci    DUP4_ARG2(__lsx_vld, src, 0, src, 32, src, 64, src, 96,
510cabdff1aSopenharmony_ci              in0, in1, in2, in3);
511cabdff1aSopenharmony_ci    DUP4_ARG2(__lsx_vld, src, 128, src, 160, src, 192, src, 224,
512cabdff1aSopenharmony_ci              in4, in5, in6, in7);
513cabdff1aSopenharmony_ci    LSX_TRANSPOSE8x8_H(in0, in1, in2, in3, in4, in5, in6, in7,
514cabdff1aSopenharmony_ci                       vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7);
515cabdff1aSopenharmony_ci    __lsx_vst(vec0, src, 0);
516cabdff1aSopenharmony_ci    __lsx_vst(vec1, src, 32);
517cabdff1aSopenharmony_ci    __lsx_vst(vec2, src, 64);
518cabdff1aSopenharmony_ci    __lsx_vst(vec3, src, 96);
519cabdff1aSopenharmony_ci    __lsx_vst(vec4, src, 128);
520cabdff1aSopenharmony_ci    __lsx_vst(vec5, src, 160);
521cabdff1aSopenharmony_ci    __lsx_vst(vec6, src, 192);
522cabdff1aSopenharmony_ci    __lsx_vst(vec7, src, 224);
523cabdff1aSopenharmony_ci}
524cabdff1aSopenharmony_ci
525cabdff1aSopenharmony_cistatic void hevc_idct_8x32_column_lsx(int16_t *coeffs, int32_t buf_pitch,
526cabdff1aSopenharmony_ci                                      uint8_t round)
527cabdff1aSopenharmony_ci{
528cabdff1aSopenharmony_ci    uint8_t i;
529cabdff1aSopenharmony_ci    int32_t buf_pitch_2  = buf_pitch << 1;
530cabdff1aSopenharmony_ci    int32_t buf_pitch_4  = buf_pitch << 2;
531cabdff1aSopenharmony_ci    int32_t buf_pitch_8  = buf_pitch << 3;
532cabdff1aSopenharmony_ci    int32_t buf_pitch_16 = buf_pitch << 4;
533cabdff1aSopenharmony_ci
534cabdff1aSopenharmony_ci    const int16_t *filter_ptr0 = &gt32x32_cnst0[0];
535cabdff1aSopenharmony_ci    const int16_t *filter_ptr1 = &gt32x32_cnst1[0];
536cabdff1aSopenharmony_ci    const int16_t *filter_ptr2 = &gt32x32_cnst2[0];
537cabdff1aSopenharmony_ci    const int16_t *filter_ptr3 = &gt8x8_cnst[0];
538cabdff1aSopenharmony_ci    int16_t *src0 = (coeffs + buf_pitch);
539cabdff1aSopenharmony_ci    int16_t *src1 = (coeffs + buf_pitch_2);
540cabdff1aSopenharmony_ci    int16_t *src2 = (coeffs + buf_pitch_4);
541cabdff1aSopenharmony_ci    int16_t *src3 = (coeffs);
542cabdff1aSopenharmony_ci    int32_t tmp_buf[8 * 32 + 15];
543cabdff1aSopenharmony_ci    int32_t *tmp_buf_ptr = tmp_buf + 15;
544cabdff1aSopenharmony_ci    __m128i in0, in1, in2, in3, in4, in5, in6, in7;
545cabdff1aSopenharmony_ci    __m128i src0_r, src1_r, src2_r, src3_r, src4_r, src5_r, src6_r, src7_r;
546cabdff1aSopenharmony_ci    __m128i src0_l, src1_l, src2_l, src3_l, src4_l, src5_l, src6_l, src7_l;
547cabdff1aSopenharmony_ci    __m128i filter0, filter1, filter2, filter3;
548cabdff1aSopenharmony_ci    __m128i sum0_r, sum0_l, sum1_r, sum1_l, tmp0_r, tmp0_l, tmp1_r, tmp1_l;
549cabdff1aSopenharmony_ci
550cabdff1aSopenharmony_ci    /* Align pointer to 64 byte boundary */
551cabdff1aSopenharmony_ci    tmp_buf_ptr = (int32_t *)(((uintptr_t) tmp_buf_ptr) & ~(uintptr_t) 63);
552cabdff1aSopenharmony_ci
553cabdff1aSopenharmony_ci    /* process coeff 4, 12, 20, 28 */
554cabdff1aSopenharmony_ci    in0 = __lsx_vld(src2, 0);
555cabdff1aSopenharmony_ci    in1 = __lsx_vld(src2 + buf_pitch_8, 0);
556cabdff1aSopenharmony_ci    in2 = __lsx_vld(src2 + buf_pitch_16, 0);
557cabdff1aSopenharmony_ci    in3 = __lsx_vld(src2 + buf_pitch_16 + buf_pitch_8, 0);
558cabdff1aSopenharmony_ci    in4 = __lsx_vld(src3, 0);
559cabdff1aSopenharmony_ci    in5 = __lsx_vld(src3 + buf_pitch_8, 0);
560cabdff1aSopenharmony_ci    in6 = __lsx_vld(src3 + buf_pitch_16, 0);
561cabdff1aSopenharmony_ci    in7 = __lsx_vld(src3 + buf_pitch_16 + buf_pitch_8, 0);
562cabdff1aSopenharmony_ci    DUP4_ARG2(__lsx_vilvl_h, in1, in0, in3, in2, in6, in4, in7, in5,
563cabdff1aSopenharmony_ci              src0_r, src1_r, src2_r, src3_r);
564cabdff1aSopenharmony_ci    DUP4_ARG2(__lsx_vilvh_h, in1, in0, in3, in2, in6, in4, in7, in5,
565cabdff1aSopenharmony_ci              src0_l, src1_l, src2_l, src3_l);
566cabdff1aSopenharmony_ci
567cabdff1aSopenharmony_ci    filter0 = __lsx_vldrepl_w(filter_ptr2, 0);
568cabdff1aSopenharmony_ci    filter1 = __lsx_vldrepl_w(filter_ptr2, 4);
569cabdff1aSopenharmony_ci    sum0_r = __lsx_vdp2_w_h(src0_r, filter0);
570cabdff1aSopenharmony_ci    sum0_l = __lsx_vdp2_w_h(src0_l, filter0);
571cabdff1aSopenharmony_ci    sum0_r = __lsx_vdp2add_w_h(sum0_r, src1_r, filter1);
572cabdff1aSopenharmony_ci    sum0_l = __lsx_vdp2add_w_h(sum0_l, src1_l, filter1);
573cabdff1aSopenharmony_ci    __lsx_vst(sum0_r, tmp_buf_ptr, 0);
574cabdff1aSopenharmony_ci    __lsx_vst(sum0_l, tmp_buf_ptr, 16);
575cabdff1aSopenharmony_ci
576cabdff1aSopenharmony_ci    filter0 = __lsx_vldrepl_w(filter_ptr2, 8);
577cabdff1aSopenharmony_ci    filter1 = __lsx_vldrepl_w(filter_ptr2, 12);
578cabdff1aSopenharmony_ci    sum0_r = __lsx_vdp2_w_h(src0_r, filter0);
579cabdff1aSopenharmony_ci    sum0_l = __lsx_vdp2_w_h(src0_l, filter0);
580cabdff1aSopenharmony_ci    sum0_r = __lsx_vdp2add_w_h(sum0_r, src1_r, filter1);
581cabdff1aSopenharmony_ci    sum0_l = __lsx_vdp2add_w_h(sum0_l, src1_l, filter1);
582cabdff1aSopenharmony_ci    __lsx_vst(sum0_r, tmp_buf_ptr, 32);
583cabdff1aSopenharmony_ci    __lsx_vst(sum0_l, tmp_buf_ptr, 48);
584cabdff1aSopenharmony_ci
585cabdff1aSopenharmony_ci    filter0 = __lsx_vldrepl_w(filter_ptr2, 16);
586cabdff1aSopenharmony_ci    filter1 = __lsx_vldrepl_w(filter_ptr2, 20);
587cabdff1aSopenharmony_ci    sum0_r = __lsx_vdp2_w_h(src0_r, filter0);
588cabdff1aSopenharmony_ci    sum0_l = __lsx_vdp2_w_h(src0_l, filter0);
589cabdff1aSopenharmony_ci    sum0_r = __lsx_vdp2add_w_h(sum0_r, src1_r, filter1);
590cabdff1aSopenharmony_ci    sum0_l = __lsx_vdp2add_w_h(sum0_l, src1_l, filter1);
591cabdff1aSopenharmony_ci    __lsx_vst(sum0_r, tmp_buf_ptr, 64);
592cabdff1aSopenharmony_ci    __lsx_vst(sum0_l, tmp_buf_ptr, 80);
593cabdff1aSopenharmony_ci
594cabdff1aSopenharmony_ci    filter0 = __lsx_vldrepl_w(filter_ptr2, 24);
595cabdff1aSopenharmony_ci    filter1 = __lsx_vldrepl_w(filter_ptr2, 28);
596cabdff1aSopenharmony_ci    sum0_r = __lsx_vdp2_w_h(src0_r, filter0);
597cabdff1aSopenharmony_ci    sum0_l = __lsx_vdp2_w_h(src0_l, filter0);
598cabdff1aSopenharmony_ci    sum0_r = __lsx_vdp2add_w_h(sum0_r, src1_r, filter1);
599cabdff1aSopenharmony_ci    sum0_l = __lsx_vdp2add_w_h(sum0_l, src1_l, filter1);
600cabdff1aSopenharmony_ci    __lsx_vst(sum0_r, tmp_buf_ptr, 96);
601cabdff1aSopenharmony_ci    __lsx_vst(sum0_l, tmp_buf_ptr, 112);
602cabdff1aSopenharmony_ci
603cabdff1aSopenharmony_ci    /* process coeff 0, 8, 16, 24 */
604cabdff1aSopenharmony_ci    filter0 = __lsx_vldrepl_w(filter_ptr3, 0);
605cabdff1aSopenharmony_ci    filter1 = __lsx_vldrepl_w(filter_ptr3, 4);
606cabdff1aSopenharmony_ci
607cabdff1aSopenharmony_ci    DUP4_ARG2(__lsx_vdp2_w_h, src2_r, filter0, src2_l, filter0,
608cabdff1aSopenharmony_ci              src3_r, filter1, src3_l, filter1, sum0_r, sum0_l, tmp1_r, tmp1_l);
609cabdff1aSopenharmony_ci    sum1_r = __lsx_vsub_w(sum0_r, tmp1_r);
610cabdff1aSopenharmony_ci    sum1_l = __lsx_vsub_w(sum0_l, tmp1_l);
611cabdff1aSopenharmony_ci    sum0_r = __lsx_vadd_w(sum0_r, tmp1_r);
612cabdff1aSopenharmony_ci    sum0_l = __lsx_vadd_w(sum0_l, tmp1_l);
613cabdff1aSopenharmony_ci
614cabdff1aSopenharmony_ci    HEVC_EVEN16_CALC(tmp_buf_ptr, sum0_r, sum0_l, 0, 7);
615cabdff1aSopenharmony_ci    HEVC_EVEN16_CALC(tmp_buf_ptr, sum1_r, sum1_l, 3, 4);
616cabdff1aSopenharmony_ci
617cabdff1aSopenharmony_ci    filter0 = __lsx_vldrepl_w(filter_ptr3, 16);
618cabdff1aSopenharmony_ci    filter1 = __lsx_vldrepl_w(filter_ptr3, 20);
619cabdff1aSopenharmony_ci
620cabdff1aSopenharmony_ci    DUP4_ARG2(__lsx_vdp2_w_h, src2_r, filter0, src2_l, filter0,
621cabdff1aSopenharmony_ci              src3_r, filter1, src3_l, filter1, sum0_r, sum0_l, tmp1_r, tmp1_l);
622cabdff1aSopenharmony_ci    sum1_r = __lsx_vsub_w(sum0_r, tmp1_r);
623cabdff1aSopenharmony_ci    sum1_l = __lsx_vsub_w(sum0_l, tmp1_l);
624cabdff1aSopenharmony_ci    sum0_r = __lsx_vadd_w(sum0_r, tmp1_r);
625cabdff1aSopenharmony_ci    sum0_l = __lsx_vadd_w(sum0_l, tmp1_l);
626cabdff1aSopenharmony_ci
627cabdff1aSopenharmony_ci    HEVC_EVEN16_CALC(tmp_buf_ptr, sum0_r, sum0_l, 1, 6);
628cabdff1aSopenharmony_ci    HEVC_EVEN16_CALC(tmp_buf_ptr, sum1_r, sum1_l, 2, 5);
629cabdff1aSopenharmony_ci
630cabdff1aSopenharmony_ci    /* process coeff 2 6 10 14 18 22 26 30 */
631cabdff1aSopenharmony_ci    in0 = __lsx_vld(src1, 0);
632cabdff1aSopenharmony_ci    in1 = __lsx_vld(src1 + buf_pitch_4, 0);
633cabdff1aSopenharmony_ci    in2 = __lsx_vld(src1 + buf_pitch_8, 0);
634cabdff1aSopenharmony_ci    in3 = __lsx_vld(src1 + buf_pitch_8 + buf_pitch_4, 0);
635cabdff1aSopenharmony_ci    in4 = __lsx_vld(src1 + buf_pitch_16, 0);
636cabdff1aSopenharmony_ci    in5 = __lsx_vld(src1 + buf_pitch_16 + buf_pitch_4, 0);
637cabdff1aSopenharmony_ci    in6 = __lsx_vld(src1 + buf_pitch_16 + buf_pitch_8, 0);
638cabdff1aSopenharmony_ci    in7 = __lsx_vld(src1 + buf_pitch_16 + buf_pitch_8 + buf_pitch_4, 0);
639cabdff1aSopenharmony_ci
640cabdff1aSopenharmony_ci    DUP4_ARG2(__lsx_vilvl_h, in1, in0, in3, in2, in5, in4, in7, in6,
641cabdff1aSopenharmony_ci              src0_r, src1_r, src2_r, src3_r);
642cabdff1aSopenharmony_ci    DUP4_ARG2(__lsx_vilvh_h, in1, in0, in3, in2, in5, in4, in7, in6,
643cabdff1aSopenharmony_ci              src0_l, src1_l, src2_l, src3_l);
644cabdff1aSopenharmony_ci
645cabdff1aSopenharmony_ci    /* loop for all columns of constants */
646cabdff1aSopenharmony_ci    for (i = 0; i < 8; i++) {
647cabdff1aSopenharmony_ci        /* processing single column of constants */
648cabdff1aSopenharmony_ci        filter0 = __lsx_vldrepl_w(filter_ptr1, 0);
649cabdff1aSopenharmony_ci        filter1 = __lsx_vldrepl_w(filter_ptr1, 4);
650cabdff1aSopenharmony_ci        filter2 = __lsx_vldrepl_w(filter_ptr1, 8);
651cabdff1aSopenharmony_ci        filter3 = __lsx_vldrepl_w(filter_ptr1, 12);
652cabdff1aSopenharmony_ci        sum0_r = __lsx_vdp2_w_h(src0_r, filter0);
653cabdff1aSopenharmony_ci        sum0_l = __lsx_vdp2_w_h(src0_l, filter0);
654cabdff1aSopenharmony_ci        sum0_r = __lsx_vdp2add_w_h(sum0_r, src1_r, filter1);
655cabdff1aSopenharmony_ci        sum0_l = __lsx_vdp2add_w_h(sum0_l, src1_l, filter1);
656cabdff1aSopenharmony_ci        sum0_r = __lsx_vdp2add_w_h(sum0_r, src2_r, filter2);
657cabdff1aSopenharmony_ci        sum0_l = __lsx_vdp2add_w_h(sum0_l, src2_l, filter2);
658cabdff1aSopenharmony_ci        sum0_r = __lsx_vdp2add_w_h(sum0_r, src3_r, filter3);
659cabdff1aSopenharmony_ci        sum0_l = __lsx_vdp2add_w_h(sum0_l, src3_l, filter3);
660cabdff1aSopenharmony_ci
661cabdff1aSopenharmony_ci        tmp0_r = __lsx_vld(tmp_buf_ptr + (i << 3), 0);
662cabdff1aSopenharmony_ci        tmp0_l = __lsx_vld(tmp_buf_ptr + (i << 3), 16);
663cabdff1aSopenharmony_ci        tmp1_r = tmp0_r;
664cabdff1aSopenharmony_ci        tmp1_l = tmp0_l;
665cabdff1aSopenharmony_ci        tmp0_r = __lsx_vadd_w(tmp0_r, sum0_r);
666cabdff1aSopenharmony_ci        tmp0_l = __lsx_vadd_w(tmp0_l, sum0_l);
667cabdff1aSopenharmony_ci        tmp1_r = __lsx_vsub_w(tmp1_r, sum0_r);
668cabdff1aSopenharmony_ci        tmp1_l = __lsx_vsub_w(tmp1_l, sum0_l);
669cabdff1aSopenharmony_ci        __lsx_vst(tmp0_r, tmp_buf_ptr + (i << 3), 0);
670cabdff1aSopenharmony_ci        __lsx_vst(tmp0_l, tmp_buf_ptr + (i << 3), 16);
671cabdff1aSopenharmony_ci        __lsx_vst(tmp1_r, tmp_buf_ptr + ((15 - i) * 8), 0);
672cabdff1aSopenharmony_ci        __lsx_vst(tmp1_l, tmp_buf_ptr + ((15 - i) * 8), 16);
673cabdff1aSopenharmony_ci
674cabdff1aSopenharmony_ci        filter_ptr1 += 8;
675cabdff1aSopenharmony_ci    }
676cabdff1aSopenharmony_ci
677cabdff1aSopenharmony_ci    /* process coeff 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 */
678cabdff1aSopenharmony_ci    in0 = __lsx_vld(src0, 0);
679cabdff1aSopenharmony_ci    in1 = __lsx_vld(src0 + buf_pitch_2, 0);
680cabdff1aSopenharmony_ci    in2 = __lsx_vld(src0 + buf_pitch_4, 0);
681cabdff1aSopenharmony_ci    in3 = __lsx_vld(src0 + buf_pitch_4 + buf_pitch_2, 0);
682cabdff1aSopenharmony_ci    in4 = __lsx_vld(src0 + buf_pitch_8, 0);
683cabdff1aSopenharmony_ci    in5 = __lsx_vld(src0 + buf_pitch_8 + buf_pitch_2, 0);
684cabdff1aSopenharmony_ci    in6 = __lsx_vld(src0 + buf_pitch_8 + buf_pitch_4, 0);
685cabdff1aSopenharmony_ci    in7 = __lsx_vld(src0 + buf_pitch_8 + buf_pitch_4 + buf_pitch_2, 0);
686cabdff1aSopenharmony_ci
687cabdff1aSopenharmony_ci    src0 += 16 * buf_pitch;
688cabdff1aSopenharmony_ci    DUP4_ARG2(__lsx_vilvl_h, in1, in0, in3, in2, in5, in4, in7, in6,
689cabdff1aSopenharmony_ci              src0_r, src1_r, src2_r, src3_r);
690cabdff1aSopenharmony_ci    DUP4_ARG2(__lsx_vilvh_h, in1, in0, in3, in2, in5, in4, in7, in6,
691cabdff1aSopenharmony_ci              src0_l, src1_l, src2_l, src3_l);
692cabdff1aSopenharmony_ci    in0 = __lsx_vld(src0, 0);
693cabdff1aSopenharmony_ci    in1 = __lsx_vld(src0 + buf_pitch_2, 0);
694cabdff1aSopenharmony_ci    in2 = __lsx_vld(src0 + buf_pitch_4, 0);
695cabdff1aSopenharmony_ci    in3 = __lsx_vld(src0 + buf_pitch_4 + buf_pitch_2, 0);
696cabdff1aSopenharmony_ci    in4 = __lsx_vld(src0 + buf_pitch_8, 0);
697cabdff1aSopenharmony_ci    in5 = __lsx_vld(src0 + buf_pitch_8 + buf_pitch_2, 0);
698cabdff1aSopenharmony_ci    in6 = __lsx_vld(src0 + buf_pitch_8 + buf_pitch_4, 0);
699cabdff1aSopenharmony_ci    in7 = __lsx_vld(src0 + buf_pitch_8 + buf_pitch_4 + buf_pitch_2, 0);
700cabdff1aSopenharmony_ci
701cabdff1aSopenharmony_ci    DUP4_ARG2(__lsx_vilvl_h, in1, in0, in3, in2, in5, in4, in7, in6,
702cabdff1aSopenharmony_ci              src4_r, src5_r, src6_r, src7_r);
703cabdff1aSopenharmony_ci    DUP4_ARG2(__lsx_vilvh_h, in1, in0, in3, in2, in5, in4, in7, in6,
704cabdff1aSopenharmony_ci              src4_l, src5_l, src6_l, src7_l);
705cabdff1aSopenharmony_ci
706cabdff1aSopenharmony_ci    /* loop for all columns of filter constants */
707cabdff1aSopenharmony_ci    for (i = 0; i < 16; i++) {
708cabdff1aSopenharmony_ci        /* processing single column of constants */
709cabdff1aSopenharmony_ci        filter0 = __lsx_vldrepl_w(filter_ptr0, 0);
710cabdff1aSopenharmony_ci        filter1 = __lsx_vldrepl_w(filter_ptr0, 4);
711cabdff1aSopenharmony_ci        filter2 = __lsx_vldrepl_w(filter_ptr0, 8);
712cabdff1aSopenharmony_ci        filter3 = __lsx_vldrepl_w(filter_ptr0, 12);
713cabdff1aSopenharmony_ci        sum0_r = __lsx_vdp2_w_h(src0_r, filter0);
714cabdff1aSopenharmony_ci        sum0_l = __lsx_vdp2_w_h(src0_l, filter0);
715cabdff1aSopenharmony_ci        sum0_r = __lsx_vdp2add_w_h(sum0_r, src1_r, filter1);
716cabdff1aSopenharmony_ci        sum0_l = __lsx_vdp2add_w_h(sum0_l, src1_l, filter1);
717cabdff1aSopenharmony_ci        sum0_r = __lsx_vdp2add_w_h(sum0_r, src2_r, filter2);
718cabdff1aSopenharmony_ci        sum0_l = __lsx_vdp2add_w_h(sum0_l, src2_l, filter2);
719cabdff1aSopenharmony_ci        sum0_r = __lsx_vdp2add_w_h(sum0_r, src3_r, filter3);
720cabdff1aSopenharmony_ci        sum0_l = __lsx_vdp2add_w_h(sum0_l, src3_l, filter3);
721cabdff1aSopenharmony_ci        tmp1_r = sum0_r;
722cabdff1aSopenharmony_ci        tmp1_l = sum0_l;
723cabdff1aSopenharmony_ci
724cabdff1aSopenharmony_ci        filter0 = __lsx_vldrepl_w(filter_ptr0, 16);
725cabdff1aSopenharmony_ci        filter1 = __lsx_vldrepl_w(filter_ptr0, 20);
726cabdff1aSopenharmony_ci        filter2 = __lsx_vldrepl_w(filter_ptr0, 24);
727cabdff1aSopenharmony_ci        filter3 = __lsx_vldrepl_w(filter_ptr0, 28);
728cabdff1aSopenharmony_ci        sum0_r = __lsx_vdp2_w_h(src4_r, filter0);
729cabdff1aSopenharmony_ci        sum0_l = __lsx_vdp2_w_h(src4_l, filter0);
730cabdff1aSopenharmony_ci        sum0_r = __lsx_vdp2add_w_h(sum0_r, src5_r, filter1);
731cabdff1aSopenharmony_ci        sum0_l = __lsx_vdp2add_w_h(sum0_l, src5_l, filter1);
732cabdff1aSopenharmony_ci        sum0_r = __lsx_vdp2add_w_h(sum0_r, src6_r, filter2);
733cabdff1aSopenharmony_ci        sum0_l = __lsx_vdp2add_w_h(sum0_l, src6_l, filter2);
734cabdff1aSopenharmony_ci        sum0_r = __lsx_vdp2add_w_h(sum0_r, src7_r, filter3);
735cabdff1aSopenharmony_ci        sum0_l = __lsx_vdp2add_w_h(sum0_l, src7_l, filter3);
736cabdff1aSopenharmony_ci        sum0_r = __lsx_vadd_w(sum0_r, tmp1_r);
737cabdff1aSopenharmony_ci        sum0_l = __lsx_vadd_w(sum0_l, tmp1_l);
738cabdff1aSopenharmony_ci
739cabdff1aSopenharmony_ci        tmp0_r = __lsx_vld(tmp_buf_ptr + i * 8, 0);
740cabdff1aSopenharmony_ci        tmp0_l = __lsx_vld(tmp_buf_ptr + i * 8, 16);
741cabdff1aSopenharmony_ci        tmp1_r = tmp0_r;
742cabdff1aSopenharmony_ci        tmp1_l = tmp0_l;
743cabdff1aSopenharmony_ci        tmp0_r = __lsx_vadd_w(tmp0_r, sum0_r);
744cabdff1aSopenharmony_ci        tmp0_l = __lsx_vadd_w(tmp0_l, sum0_l);
745cabdff1aSopenharmony_ci        sum1_r = __lsx_vreplgr2vr_w(round);
746cabdff1aSopenharmony_ci        tmp0_r = __lsx_vssrarn_h_w(tmp0_r, sum1_r);
747cabdff1aSopenharmony_ci        tmp0_l = __lsx_vssrarn_h_w(tmp0_l, sum1_r);
748cabdff1aSopenharmony_ci        in0    = __lsx_vpackev_d(tmp0_l, tmp0_r);
749cabdff1aSopenharmony_ci        __lsx_vst(in0, (coeffs + i * buf_pitch), 0);
750cabdff1aSopenharmony_ci        tmp1_r = __lsx_vsub_w(tmp1_r, sum0_r);
751cabdff1aSopenharmony_ci        tmp1_l = __lsx_vsub_w(tmp1_l, sum0_l);
752cabdff1aSopenharmony_ci        tmp1_r = __lsx_vssrarn_h_w(tmp1_r, sum1_r);
753cabdff1aSopenharmony_ci        tmp1_l = __lsx_vssrarn_h_w(tmp1_l, sum1_r);
754cabdff1aSopenharmony_ci        in0    = __lsx_vpackev_d(tmp1_l, tmp1_r);
755cabdff1aSopenharmony_ci        __lsx_vst(in0, (coeffs + (31 - i) * buf_pitch), 0);
756cabdff1aSopenharmony_ci
757cabdff1aSopenharmony_ci        filter_ptr0 += 16;
758cabdff1aSopenharmony_ci    }
759cabdff1aSopenharmony_ci}
760cabdff1aSopenharmony_ci
761cabdff1aSopenharmony_cistatic void hevc_idct_transpose_32x8_to_8x32(int16_t *coeffs, int16_t *tmp_buf)
762cabdff1aSopenharmony_ci{
763cabdff1aSopenharmony_ci    uint8_t i;
764cabdff1aSopenharmony_ci    __m128i in0, in1, in2, in3, in4, in5, in6, in7;
765cabdff1aSopenharmony_ci
766cabdff1aSopenharmony_ci    for (i = 0; i < 4; i++) {
767cabdff1aSopenharmony_ci        DUP4_ARG2(__lsx_vld, coeffs, 0, coeffs, 64, coeffs, 128,
768cabdff1aSopenharmony_ci                  coeffs, 192, in0, in1, in2, in3);
769cabdff1aSopenharmony_ci        DUP4_ARG2(__lsx_vld, coeffs, 256, coeffs, 320, coeffs, 384,
770cabdff1aSopenharmony_ci                  coeffs, 448, in4, in5, in6, in7);
771cabdff1aSopenharmony_ci        coeffs += 8;
772cabdff1aSopenharmony_ci        LSX_TRANSPOSE8x8_H(in0, in1, in2, in3, in4, in5, in6, in7,
773cabdff1aSopenharmony_ci                           in0, in1, in2, in3, in4, in5, in6, in7);
774cabdff1aSopenharmony_ci        __lsx_vst(in0, tmp_buf, 0);
775cabdff1aSopenharmony_ci        __lsx_vst(in1, tmp_buf, 16);
776cabdff1aSopenharmony_ci        __lsx_vst(in2, tmp_buf, 32);
777cabdff1aSopenharmony_ci        __lsx_vst(in3, tmp_buf, 48);
778cabdff1aSopenharmony_ci        __lsx_vst(in4, tmp_buf, 64);
779cabdff1aSopenharmony_ci        __lsx_vst(in5, tmp_buf, 80);
780cabdff1aSopenharmony_ci        __lsx_vst(in6, tmp_buf, 96);
781cabdff1aSopenharmony_ci        __lsx_vst(in7, tmp_buf, 112);
782cabdff1aSopenharmony_ci        tmp_buf += 64;
783cabdff1aSopenharmony_ci    }
784cabdff1aSopenharmony_ci}
785cabdff1aSopenharmony_ci
786cabdff1aSopenharmony_cistatic void hevc_idct_transpose_8x32_to_32x8(int16_t *tmp_buf, int16_t *coeffs)
787cabdff1aSopenharmony_ci{
788cabdff1aSopenharmony_ci    uint8_t i;
789cabdff1aSopenharmony_ci    __m128i in0, in1, in2, in3, in4, in5, in6, in7;
790cabdff1aSopenharmony_ci
791cabdff1aSopenharmony_ci    for (i = 0; i < 4; i++) {
792cabdff1aSopenharmony_ci        DUP4_ARG2(__lsx_vld, tmp_buf, 0, tmp_buf, 16, tmp_buf, 32,
793cabdff1aSopenharmony_ci                  tmp_buf, 48, in0, in1, in2, in3);
794cabdff1aSopenharmony_ci        DUP4_ARG2(__lsx_vld, tmp_buf, 64, tmp_buf, 80, tmp_buf, 96,
795cabdff1aSopenharmony_ci                  tmp_buf, 112, in4, in5, in6, in7);
796cabdff1aSopenharmony_ci        tmp_buf += 64;
797cabdff1aSopenharmony_ci        LSX_TRANSPOSE8x8_H(in0, in1, in2, in3, in4, in5, in6, in7,
798cabdff1aSopenharmony_ci                           in0, in1, in2, in3, in4, in5, in6, in7);
799cabdff1aSopenharmony_ci        __lsx_vst(in0, coeffs, 0);
800cabdff1aSopenharmony_ci        __lsx_vst(in1, coeffs, 64);
801cabdff1aSopenharmony_ci        __lsx_vst(in2, coeffs, 128);
802cabdff1aSopenharmony_ci        __lsx_vst(in3, coeffs, 192);
803cabdff1aSopenharmony_ci        __lsx_vst(in4, coeffs, 256);
804cabdff1aSopenharmony_ci        __lsx_vst(in5, coeffs, 320);
805cabdff1aSopenharmony_ci        __lsx_vst(in6, coeffs, 384);
806cabdff1aSopenharmony_ci        __lsx_vst(in7, coeffs, 448);
807cabdff1aSopenharmony_ci        coeffs += 8;
808cabdff1aSopenharmony_ci    }
809cabdff1aSopenharmony_ci}
810cabdff1aSopenharmony_ci
811cabdff1aSopenharmony_civoid ff_hevc_idct_32x32_lsx(int16_t *coeffs, int col_limit)
812cabdff1aSopenharmony_ci{
813cabdff1aSopenharmony_ci    uint8_t row_cnt, col_cnt;
814cabdff1aSopenharmony_ci    int16_t *src = coeffs;
815cabdff1aSopenharmony_ci    int16_t tmp_buf[8 * 32 + 31];
816cabdff1aSopenharmony_ci    int16_t *tmp_buf_ptr = tmp_buf + 31;
817cabdff1aSopenharmony_ci    uint8_t round;
818cabdff1aSopenharmony_ci    int32_t buf_pitch;
819cabdff1aSopenharmony_ci
820cabdff1aSopenharmony_ci    /* Align pointer to 64 byte boundary */
821cabdff1aSopenharmony_ci    tmp_buf_ptr = (int16_t *)(((uintptr_t) tmp_buf_ptr) & ~(uintptr_t) 63);
822cabdff1aSopenharmony_ci
823cabdff1aSopenharmony_ci    /* column transform */
824cabdff1aSopenharmony_ci    round = 7;
825cabdff1aSopenharmony_ci    buf_pitch = 32;
826cabdff1aSopenharmony_ci    for (col_cnt = 0; col_cnt < 4; col_cnt++) {
827cabdff1aSopenharmony_ci        /* process 8x32 blocks */
828cabdff1aSopenharmony_ci        hevc_idct_8x32_column_lsx((coeffs + col_cnt * 8), buf_pitch, round);
829cabdff1aSopenharmony_ci    }
830cabdff1aSopenharmony_ci
831cabdff1aSopenharmony_ci    /* row transform */
832cabdff1aSopenharmony_ci    round = 12;
833cabdff1aSopenharmony_ci    buf_pitch = 8;
834cabdff1aSopenharmony_ci    for (row_cnt = 0; row_cnt < 4; row_cnt++) {
835cabdff1aSopenharmony_ci        /* process 32x8 blocks */
836cabdff1aSopenharmony_ci        src = (coeffs + 32 * 8 * row_cnt);
837cabdff1aSopenharmony_ci
838cabdff1aSopenharmony_ci        hevc_idct_transpose_32x8_to_8x32(src, tmp_buf_ptr);
839cabdff1aSopenharmony_ci        hevc_idct_8x32_column_lsx(tmp_buf_ptr, buf_pitch, round);
840cabdff1aSopenharmony_ci        hevc_idct_transpose_8x32_to_32x8(tmp_buf_ptr, src);
841cabdff1aSopenharmony_ci    }
842cabdff1aSopenharmony_ci}
843