1cabdff1aSopenharmony_ci/*
2cabdff1aSopenharmony_ci * Copyright (c) 2015 - 2017 Manojkumar Bhosale (Manojkumar.Bhosale@imgtec.com)
3cabdff1aSopenharmony_ci *
4cabdff1aSopenharmony_ci * This file is part of FFmpeg.
5cabdff1aSopenharmony_ci *
6cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or
7cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public
8cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either
9cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version.
10cabdff1aSopenharmony_ci *
11cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful,
12cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of
13cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14cabdff1aSopenharmony_ci * Lesser General Public License for more details.
15cabdff1aSopenharmony_ci *
16cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public
17cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software
18cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19cabdff1aSopenharmony_ci */
20cabdff1aSopenharmony_ci
21cabdff1aSopenharmony_ci#include "libavutil/mips/generic_macros_msa.h"
22cabdff1aSopenharmony_ci#include "h264dsp_mips.h"
23cabdff1aSopenharmony_ci#include "libavcodec/bit_depth_template.c"
24cabdff1aSopenharmony_ci
25cabdff1aSopenharmony_ci#define AVC_ITRANS_H(in0, in1, in2, in3, out0, out1, out2, out3)          \
26cabdff1aSopenharmony_ci{                                                                         \
27cabdff1aSopenharmony_ci    v8i16 tmp0_m, tmp1_m, tmp2_m, tmp3_m;                                 \
28cabdff1aSopenharmony_ci                                                                          \
29cabdff1aSopenharmony_ci    tmp0_m = in0 + in2;                                                   \
30cabdff1aSopenharmony_ci    tmp1_m = in0 - in2;                                                   \
31cabdff1aSopenharmony_ci    tmp2_m = in1 >> 1;                                                    \
32cabdff1aSopenharmony_ci    tmp2_m = tmp2_m - in3;                                                \
33cabdff1aSopenharmony_ci    tmp3_m = in3 >> 1;                                                    \
34cabdff1aSopenharmony_ci    tmp3_m = in1 + tmp3_m;                                                \
35cabdff1aSopenharmony_ci                                                                          \
36cabdff1aSopenharmony_ci    BUTTERFLY_4(tmp0_m, tmp1_m, tmp2_m, tmp3_m, out0, out1, out2, out3);  \
37cabdff1aSopenharmony_ci}
38cabdff1aSopenharmony_ci
39cabdff1aSopenharmony_cistatic void avc_deq_idct_luma_dc_msa(int16_t *dst, int16_t *src,
40cabdff1aSopenharmony_ci                                     int32_t de_q_val)
41cabdff1aSopenharmony_ci{
42cabdff1aSopenharmony_ci#define DC_DEST_STRIDE 16
43cabdff1aSopenharmony_ci    int16_t out0, out1, out2, out3, out4, out5, out6, out7;
44cabdff1aSopenharmony_ci    v8i16 src1, src3;
45cabdff1aSopenharmony_ci    v8i16 vec0, vec1, vec2, vec3;
46cabdff1aSopenharmony_ci    v8i16 tmp0, tmp1, tmp2, tmp3;
47cabdff1aSopenharmony_ci    v8i16 hres0, hres1, hres2, hres3;
48cabdff1aSopenharmony_ci    v8i16 vres0, vres1, vres2, vres3;
49cabdff1aSopenharmony_ci    v4i32 vres0_r, vres1_r, vres2_r, vres3_r;
50cabdff1aSopenharmony_ci    const v4i32 de_q_vec = __msa_fill_w(de_q_val);
51cabdff1aSopenharmony_ci    const v8i16 src0 = LD_SH(src);
52cabdff1aSopenharmony_ci    const v8i16 src2 = LD_SH(src + 8);
53cabdff1aSopenharmony_ci
54cabdff1aSopenharmony_ci    ILVL_D2_SH(src0, src0, src2, src2, src1, src3);
55cabdff1aSopenharmony_ci    TRANSPOSE4x4_SH_SH(src0, src1, src2, src3, tmp0, tmp1, tmp2, tmp3);
56cabdff1aSopenharmony_ci    BUTTERFLY_4(tmp0, tmp2, tmp3, tmp1, vec0, vec3, vec2, vec1);
57cabdff1aSopenharmony_ci    BUTTERFLY_4(vec0, vec1, vec2, vec3, hres0, hres3, hres2, hres1);
58cabdff1aSopenharmony_ci    TRANSPOSE4x4_SH_SH(hres0, hres1, hres2, hres3, hres0, hres1, hres2, hres3);
59cabdff1aSopenharmony_ci    BUTTERFLY_4(hres0, hres1, hres3, hres2, vec0, vec3, vec2, vec1);
60cabdff1aSopenharmony_ci    BUTTERFLY_4(vec0, vec1, vec2, vec3, vres0, vres1, vres2, vres3);
61cabdff1aSopenharmony_ci    UNPCK_R_SH_SW(vres0, vres0_r);
62cabdff1aSopenharmony_ci    UNPCK_R_SH_SW(vres1, vres1_r);
63cabdff1aSopenharmony_ci    UNPCK_R_SH_SW(vres2, vres2_r);
64cabdff1aSopenharmony_ci    UNPCK_R_SH_SW(vres3, vres3_r);
65cabdff1aSopenharmony_ci
66cabdff1aSopenharmony_ci    vres0_r *= de_q_vec;
67cabdff1aSopenharmony_ci    vres1_r *= de_q_vec;
68cabdff1aSopenharmony_ci    vres2_r *= de_q_vec;
69cabdff1aSopenharmony_ci    vres3_r *= de_q_vec;
70cabdff1aSopenharmony_ci
71cabdff1aSopenharmony_ci    SRARI_W4_SW(vres0_r, vres1_r, vres2_r, vres3_r, 8);
72cabdff1aSopenharmony_ci    PCKEV_H2_SH(vres1_r, vres0_r, vres3_r, vres2_r, vec0, vec1);
73cabdff1aSopenharmony_ci
74cabdff1aSopenharmony_ci    out0 = __msa_copy_s_h(vec0, 0);
75cabdff1aSopenharmony_ci    out1 = __msa_copy_s_h(vec0, 1);
76cabdff1aSopenharmony_ci    out2 = __msa_copy_s_h(vec0, 2);
77cabdff1aSopenharmony_ci    out3 = __msa_copy_s_h(vec0, 3);
78cabdff1aSopenharmony_ci    out4 = __msa_copy_s_h(vec0, 4);
79cabdff1aSopenharmony_ci    out5 = __msa_copy_s_h(vec0, 5);
80cabdff1aSopenharmony_ci    out6 = __msa_copy_s_h(vec0, 6);
81cabdff1aSopenharmony_ci    out7 = __msa_copy_s_h(vec0, 7);
82cabdff1aSopenharmony_ci    SH(out0, (dst + 0  * DC_DEST_STRIDE));
83cabdff1aSopenharmony_ci    SH(out1, (dst + 2  * DC_DEST_STRIDE));
84cabdff1aSopenharmony_ci    SH(out2, (dst + 8  * DC_DEST_STRIDE));
85cabdff1aSopenharmony_ci    SH(out3, (dst + 10 * DC_DEST_STRIDE));
86cabdff1aSopenharmony_ci    SH(out4, (dst + 1  * DC_DEST_STRIDE));
87cabdff1aSopenharmony_ci    SH(out5, (dst + 3  * DC_DEST_STRIDE));
88cabdff1aSopenharmony_ci    SH(out6, (dst + 9  * DC_DEST_STRIDE));
89cabdff1aSopenharmony_ci    SH(out7, (dst + 11 * DC_DEST_STRIDE));
90cabdff1aSopenharmony_ci
91cabdff1aSopenharmony_ci    out0 = __msa_copy_s_h(vec1, 0);
92cabdff1aSopenharmony_ci    out1 = __msa_copy_s_h(vec1, 1);
93cabdff1aSopenharmony_ci    out2 = __msa_copy_s_h(vec1, 2);
94cabdff1aSopenharmony_ci    out3 = __msa_copy_s_h(vec1, 3);
95cabdff1aSopenharmony_ci    out4 = __msa_copy_s_h(vec1, 4);
96cabdff1aSopenharmony_ci    out5 = __msa_copy_s_h(vec1, 5);
97cabdff1aSopenharmony_ci    out6 = __msa_copy_s_h(vec1, 6);
98cabdff1aSopenharmony_ci    out7 = __msa_copy_s_h(vec1, 7);
99cabdff1aSopenharmony_ci    SH(out0, (dst + 4  * DC_DEST_STRIDE));
100cabdff1aSopenharmony_ci    SH(out1, (dst + 6  * DC_DEST_STRIDE));
101cabdff1aSopenharmony_ci    SH(out2, (dst + 12 * DC_DEST_STRIDE));
102cabdff1aSopenharmony_ci    SH(out3, (dst + 14 * DC_DEST_STRIDE));
103cabdff1aSopenharmony_ci    SH(out4, (dst + 5  * DC_DEST_STRIDE));
104cabdff1aSopenharmony_ci    SH(out5, (dst + 7  * DC_DEST_STRIDE));
105cabdff1aSopenharmony_ci    SH(out6, (dst + 13 * DC_DEST_STRIDE));
106cabdff1aSopenharmony_ci    SH(out7, (dst + 15 * DC_DEST_STRIDE));
107cabdff1aSopenharmony_ci
108cabdff1aSopenharmony_ci#undef DC_DEST_STRIDE
109cabdff1aSopenharmony_ci}
110cabdff1aSopenharmony_ci
111cabdff1aSopenharmony_cistatic void avc_idct8_addblk_msa(uint8_t *dst, int16_t *src, int32_t dst_stride)
112cabdff1aSopenharmony_ci{
113cabdff1aSopenharmony_ci    v8i16 src0, src1, src2, src3, src4, src5, src6, src7;
114cabdff1aSopenharmony_ci    v8i16 vec0, vec1, vec2, vec3;
115cabdff1aSopenharmony_ci    v8i16 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
116cabdff1aSopenharmony_ci    v8i16 res0, res1, res2, res3, res4, res5, res6, res7;
117cabdff1aSopenharmony_ci    v4i32 tmp0_r, tmp1_r, tmp2_r, tmp3_r, tmp4_r, tmp5_r, tmp6_r, tmp7_r;
118cabdff1aSopenharmony_ci    v4i32 tmp0_l, tmp1_l, tmp2_l, tmp3_l, tmp4_l, tmp5_l, tmp6_l, tmp7_l;
119cabdff1aSopenharmony_ci    v4i32 vec0_r, vec1_r, vec2_r, vec3_r, vec0_l, vec1_l, vec2_l, vec3_l;
120cabdff1aSopenharmony_ci    v4i32 res0_r, res1_r, res2_r, res3_r, res4_r, res5_r, res6_r, res7_r;
121cabdff1aSopenharmony_ci    v4i32 res0_l, res1_l, res2_l, res3_l, res4_l, res5_l, res6_l, res7_l;
122cabdff1aSopenharmony_ci    v16i8 dst0, dst1, dst2, dst3, dst4, dst5, dst6, dst7;
123cabdff1aSopenharmony_ci    v8i16 zeros = { 0 };
124cabdff1aSopenharmony_ci
125cabdff1aSopenharmony_ci    src[0] += 32;
126cabdff1aSopenharmony_ci
127cabdff1aSopenharmony_ci    LD_SH8(src, 8, src0, src1, src2, src3, src4, src5, src6, src7);
128cabdff1aSopenharmony_ci    ST_SH8(zeros, zeros, zeros, zeros, zeros, zeros, zeros, zeros, src, 8);
129cabdff1aSopenharmony_ci
130cabdff1aSopenharmony_ci    vec0 = src0 + src4;
131cabdff1aSopenharmony_ci    vec1 = src0 - src4;
132cabdff1aSopenharmony_ci    vec2 = src2 >> 1;
133cabdff1aSopenharmony_ci    vec2 = vec2 - src6;
134cabdff1aSopenharmony_ci    vec3 = src6 >> 1;
135cabdff1aSopenharmony_ci    vec3 = src2 + vec3;
136cabdff1aSopenharmony_ci
137cabdff1aSopenharmony_ci    BUTTERFLY_4(vec0, vec1, vec2, vec3, tmp0, tmp1, tmp2, tmp3);
138cabdff1aSopenharmony_ci
139cabdff1aSopenharmony_ci    vec0 = src7 >> 1;
140cabdff1aSopenharmony_ci    vec0 = src5 - vec0 - src3 - src7;
141cabdff1aSopenharmony_ci    vec1 = src3 >> 1;
142cabdff1aSopenharmony_ci    vec1 = src1 - vec1 + src7 - src3;
143cabdff1aSopenharmony_ci    vec2 = src5 >> 1;
144cabdff1aSopenharmony_ci    vec2 = vec2 - src1 + src7 + src5;
145cabdff1aSopenharmony_ci    vec3 = src1 >> 1;
146cabdff1aSopenharmony_ci    vec3 = vec3 + src3 + src5 + src1;
147cabdff1aSopenharmony_ci    tmp4 = vec3 >> 2;
148cabdff1aSopenharmony_ci    tmp4 += vec0;
149cabdff1aSopenharmony_ci    tmp5 = vec2 >> 2;
150cabdff1aSopenharmony_ci    tmp5 += vec1;
151cabdff1aSopenharmony_ci    tmp6 = vec1 >> 2;
152cabdff1aSopenharmony_ci    tmp6 -= vec2;
153cabdff1aSopenharmony_ci    tmp7 = vec0 >> 2;
154cabdff1aSopenharmony_ci    tmp7 = vec3 - tmp7;
155cabdff1aSopenharmony_ci
156cabdff1aSopenharmony_ci    BUTTERFLY_8(tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7,
157cabdff1aSopenharmony_ci                res0, res1, res2, res3, res4, res5, res6, res7);
158cabdff1aSopenharmony_ci    TRANSPOSE8x8_SH_SH(res0, res1, res2, res3, res4, res5, res6, res7,
159cabdff1aSopenharmony_ci                       res0, res1, res2, res3, res4, res5, res6, res7);
160cabdff1aSopenharmony_ci    UNPCK_SH_SW(res0, tmp0_r, tmp0_l);
161cabdff1aSopenharmony_ci    UNPCK_SH_SW(res1, tmp1_r, tmp1_l);
162cabdff1aSopenharmony_ci    UNPCK_SH_SW(res2, tmp2_r, tmp2_l);
163cabdff1aSopenharmony_ci    UNPCK_SH_SW(res3, tmp3_r, tmp3_l);
164cabdff1aSopenharmony_ci    UNPCK_SH_SW(res4, tmp4_r, tmp4_l);
165cabdff1aSopenharmony_ci    UNPCK_SH_SW(res5, tmp5_r, tmp5_l);
166cabdff1aSopenharmony_ci    UNPCK_SH_SW(res6, tmp6_r, tmp6_l);
167cabdff1aSopenharmony_ci    UNPCK_SH_SW(res7, tmp7_r, tmp7_l);
168cabdff1aSopenharmony_ci    BUTTERFLY_4(tmp0_r, tmp0_l, tmp4_l, tmp4_r, vec0_r, vec0_l, vec1_l, vec1_r);
169cabdff1aSopenharmony_ci
170cabdff1aSopenharmony_ci    vec2_r = tmp2_r >> 1;
171cabdff1aSopenharmony_ci    vec2_l = tmp2_l >> 1;
172cabdff1aSopenharmony_ci    vec2_r -= tmp6_r;
173cabdff1aSopenharmony_ci    vec2_l -= tmp6_l;
174cabdff1aSopenharmony_ci    vec3_r = tmp6_r >> 1;
175cabdff1aSopenharmony_ci    vec3_l = tmp6_l >> 1;
176cabdff1aSopenharmony_ci    vec3_r += tmp2_r;
177cabdff1aSopenharmony_ci    vec3_l += tmp2_l;
178cabdff1aSopenharmony_ci
179cabdff1aSopenharmony_ci    BUTTERFLY_4(vec0_r, vec1_r, vec2_r, vec3_r, tmp0_r, tmp2_r, tmp4_r, tmp6_r);
180cabdff1aSopenharmony_ci    BUTTERFLY_4(vec0_l, vec1_l, vec2_l, vec3_l, tmp0_l, tmp2_l, tmp4_l, tmp6_l);
181cabdff1aSopenharmony_ci
182cabdff1aSopenharmony_ci    vec0_r = tmp7_r >> 1;
183cabdff1aSopenharmony_ci    vec0_l = tmp7_l >> 1;
184cabdff1aSopenharmony_ci    vec0_r = tmp5_r - vec0_r - tmp3_r - tmp7_r;
185cabdff1aSopenharmony_ci    vec0_l = tmp5_l - vec0_l - tmp3_l - tmp7_l;
186cabdff1aSopenharmony_ci    vec1_r = tmp3_r >> 1;
187cabdff1aSopenharmony_ci    vec1_l = tmp3_l >> 1;
188cabdff1aSopenharmony_ci    vec1_r = tmp1_r - vec1_r + tmp7_r - tmp3_r;
189cabdff1aSopenharmony_ci    vec1_l = tmp1_l - vec1_l + tmp7_l - tmp3_l;
190cabdff1aSopenharmony_ci    vec2_r = tmp5_r >> 1;
191cabdff1aSopenharmony_ci    vec2_l = tmp5_l >> 1;
192cabdff1aSopenharmony_ci    vec2_r = vec2_r - tmp1_r + tmp7_r + tmp5_r;
193cabdff1aSopenharmony_ci    vec2_l = vec2_l - tmp1_l + tmp7_l + tmp5_l;
194cabdff1aSopenharmony_ci    vec3_r = tmp1_r >> 1;
195cabdff1aSopenharmony_ci    vec3_l = tmp1_l >> 1;
196cabdff1aSopenharmony_ci    vec3_r = vec3_r + tmp3_r + tmp5_r + tmp1_r;
197cabdff1aSopenharmony_ci    vec3_l = vec3_l + tmp3_l + tmp5_l + tmp1_l;
198cabdff1aSopenharmony_ci    tmp1_r = vec3_r >> 2;
199cabdff1aSopenharmony_ci    tmp1_l = vec3_l >> 2;
200cabdff1aSopenharmony_ci    tmp1_r += vec0_r;
201cabdff1aSopenharmony_ci    tmp1_l += vec0_l;
202cabdff1aSopenharmony_ci    tmp3_r = vec2_r >> 2;
203cabdff1aSopenharmony_ci    tmp3_l = vec2_l >> 2;
204cabdff1aSopenharmony_ci    tmp3_r += vec1_r;
205cabdff1aSopenharmony_ci    tmp3_l += vec1_l;
206cabdff1aSopenharmony_ci    tmp5_r = vec1_r >> 2;
207cabdff1aSopenharmony_ci    tmp5_l = vec1_l >> 2;
208cabdff1aSopenharmony_ci    tmp5_r -= vec2_r;
209cabdff1aSopenharmony_ci    tmp5_l -= vec2_l;
210cabdff1aSopenharmony_ci    tmp7_r = vec0_r >> 2;
211cabdff1aSopenharmony_ci    tmp7_l = vec0_l >> 2;
212cabdff1aSopenharmony_ci    tmp7_r = vec3_r - tmp7_r;
213cabdff1aSopenharmony_ci    tmp7_l = vec3_l - tmp7_l;
214cabdff1aSopenharmony_ci
215cabdff1aSopenharmony_ci    BUTTERFLY_4(tmp0_r, tmp0_l, tmp7_l, tmp7_r, res0_r, res0_l, res7_l, res7_r);
216cabdff1aSopenharmony_ci    BUTTERFLY_4(tmp2_r, tmp2_l, tmp5_l, tmp5_r, res1_r, res1_l, res6_l, res6_r);
217cabdff1aSopenharmony_ci    BUTTERFLY_4(tmp4_r, tmp4_l, tmp3_l, tmp3_r, res2_r, res2_l, res5_l, res5_r);
218cabdff1aSopenharmony_ci    BUTTERFLY_4(tmp6_r, tmp6_l, tmp1_l, tmp1_r, res3_r, res3_l, res4_l, res4_r);
219cabdff1aSopenharmony_ci    SRA_4V(res0_r, res0_l, res1_r, res1_l, 6);
220cabdff1aSopenharmony_ci    SRA_4V(res2_r, res2_l, res3_r, res3_l, 6);
221cabdff1aSopenharmony_ci    SRA_4V(res4_r, res4_l, res5_r, res5_l, 6);
222cabdff1aSopenharmony_ci    SRA_4V(res6_r, res6_l, res7_r, res7_l, 6);
223cabdff1aSopenharmony_ci    PCKEV_H4_SH(res0_l, res0_r, res1_l, res1_r, res2_l, res2_r, res3_l, res3_r,
224cabdff1aSopenharmony_ci                res0, res1, res2, res3);
225cabdff1aSopenharmony_ci    PCKEV_H4_SH(res4_l, res4_r, res5_l, res5_r, res6_l, res6_r, res7_l, res7_r,
226cabdff1aSopenharmony_ci                res4, res5, res6, res7);
227cabdff1aSopenharmony_ci    LD_SB8(dst, dst_stride, dst0, dst1, dst2, dst3, dst4, dst5, dst6, dst7);
228cabdff1aSopenharmony_ci    ILVR_B4_SH(zeros, dst0, zeros, dst1, zeros, dst2, zeros, dst3,
229cabdff1aSopenharmony_ci               tmp0, tmp1, tmp2, tmp3);
230cabdff1aSopenharmony_ci    ILVR_B4_SH(zeros, dst4, zeros, dst5, zeros, dst6, zeros, dst7,
231cabdff1aSopenharmony_ci               tmp4, tmp5, tmp6, tmp7);
232cabdff1aSopenharmony_ci    ADD4(res0, tmp0, res1, tmp1, res2, tmp2, res3, tmp3,
233cabdff1aSopenharmony_ci         res0, res1, res2, res3);
234cabdff1aSopenharmony_ci    ADD4(res4, tmp4, res5, tmp5, res6, tmp6, res7, tmp7,
235cabdff1aSopenharmony_ci         res4, res5, res6, res7);
236cabdff1aSopenharmony_ci    CLIP_SH8_0_255(res0, res1, res2, res3, res4, res5, res6, res7);
237cabdff1aSopenharmony_ci    PCKEV_B4_SB(res1, res0, res3, res2, res5, res4, res7, res6,
238cabdff1aSopenharmony_ci                dst0, dst1, dst2, dst3);
239cabdff1aSopenharmony_ci    ST_D8(dst0, dst1, dst2, dst3, 0, 1, 0, 1, 0, 1, 0, 1, dst, dst_stride)
240cabdff1aSopenharmony_ci}
241cabdff1aSopenharmony_ci
242cabdff1aSopenharmony_cistatic void avc_idct8_dc_addblk_msa(uint8_t *dst, int16_t *src,
243cabdff1aSopenharmony_ci                                    int32_t dst_stride)
244cabdff1aSopenharmony_ci{
245cabdff1aSopenharmony_ci    int32_t dc_val;
246cabdff1aSopenharmony_ci    v16i8 dst0, dst1, dst2, dst3, dst4, dst5, dst6, dst7;
247cabdff1aSopenharmony_ci    v8i16 dst0_r, dst1_r, dst2_r, dst3_r, dst4_r, dst5_r, dst6_r, dst7_r;
248cabdff1aSopenharmony_ci    v8i16 dc;
249cabdff1aSopenharmony_ci    v16i8 zeros = { 0 };
250cabdff1aSopenharmony_ci
251cabdff1aSopenharmony_ci    dc_val = (src[0] + 32) >> 6;
252cabdff1aSopenharmony_ci    dc = __msa_fill_h(dc_val);
253cabdff1aSopenharmony_ci
254cabdff1aSopenharmony_ci    src[0] = 0;
255cabdff1aSopenharmony_ci
256cabdff1aSopenharmony_ci    LD_SB8(dst, dst_stride, dst0, dst1, dst2, dst3, dst4, dst5, dst6, dst7);
257cabdff1aSopenharmony_ci    ILVR_B4_SH(zeros, dst0, zeros, dst1, zeros, dst2, zeros, dst3,
258cabdff1aSopenharmony_ci               dst0_r, dst1_r, dst2_r, dst3_r);
259cabdff1aSopenharmony_ci    ILVR_B4_SH(zeros, dst4, zeros, dst5, zeros, dst6, zeros, dst7,
260cabdff1aSopenharmony_ci               dst4_r, dst5_r, dst6_r, dst7_r);
261cabdff1aSopenharmony_ci    ADD4(dst0_r, dc, dst1_r, dc, dst2_r, dc, dst3_r, dc,
262cabdff1aSopenharmony_ci         dst0_r, dst1_r, dst2_r, dst3_r);
263cabdff1aSopenharmony_ci    ADD4(dst4_r, dc, dst5_r, dc, dst6_r, dc, dst7_r, dc,
264cabdff1aSopenharmony_ci         dst4_r, dst5_r, dst6_r, dst7_r);
265cabdff1aSopenharmony_ci    CLIP_SH8_0_255(dst0_r, dst1_r, dst2_r, dst3_r,
266cabdff1aSopenharmony_ci                   dst4_r, dst5_r, dst6_r, dst7_r);
267cabdff1aSopenharmony_ci    PCKEV_B4_SB(dst1_r, dst0_r, dst3_r, dst2_r, dst5_r, dst4_r, dst7_r, dst6_r,
268cabdff1aSopenharmony_ci                dst0, dst1, dst2, dst3);
269cabdff1aSopenharmony_ci    ST_D8(dst0, dst1, dst2, dst3, 0, 1, 0, 1, 0, 1, 0, 1, dst, dst_stride)
270cabdff1aSopenharmony_ci}
271cabdff1aSopenharmony_ci
272cabdff1aSopenharmony_civoid ff_h264_idct_add_msa(uint8_t *dst, int16_t *src, int32_t dst_stride)
273cabdff1aSopenharmony_ci{
274cabdff1aSopenharmony_ci    uint32_t src0_m, src1_m, src2_m, src3_m, out0_m, out1_m, out2_m, out3_m;
275cabdff1aSopenharmony_ci    v16i8 dst0_m = { 0 };
276cabdff1aSopenharmony_ci    v16i8 dst1_m = { 0 };
277cabdff1aSopenharmony_ci    v8i16 hres0, hres1, hres2, hres3, vres0, vres1, vres2, vres3;
278cabdff1aSopenharmony_ci    v8i16 inp0_m, inp1_m, res0_m, res1_m, src1, src3;
279cabdff1aSopenharmony_ci    const v8i16 src0 = LD_SH(src);
280cabdff1aSopenharmony_ci    const v8i16 src2 = LD_SH(src + 8);
281cabdff1aSopenharmony_ci    const v8i16 zero = { 0 };
282cabdff1aSopenharmony_ci    const uint8_t *dst1 = dst + dst_stride;
283cabdff1aSopenharmony_ci    const uint8_t *dst2 = dst + 2 * dst_stride;
284cabdff1aSopenharmony_ci    const uint8_t *dst3 = dst + 3 * dst_stride;
285cabdff1aSopenharmony_ci
286cabdff1aSopenharmony_ci    ILVL_D2_SH(src0, src0, src2, src2, src1, src3);
287cabdff1aSopenharmony_ci    ST_SH2(zero, zero, src, 8);
288cabdff1aSopenharmony_ci    AVC_ITRANS_H(src0, src1, src2, src3, hres0, hres1, hres2, hres3);
289cabdff1aSopenharmony_ci    TRANSPOSE4x4_SH_SH(hres0, hres1, hres2, hres3, hres0, hres1, hres2, hres3);
290cabdff1aSopenharmony_ci    AVC_ITRANS_H(hres0, hres1, hres2, hres3, vres0, vres1, vres2, vres3);
291cabdff1aSopenharmony_ci    src0_m = LW(dst);
292cabdff1aSopenharmony_ci    src1_m = LW(dst1);
293cabdff1aSopenharmony_ci    SRARI_H4_SH(vres0, vres1, vres2, vres3, 6);
294cabdff1aSopenharmony_ci    src2_m = LW(dst2);
295cabdff1aSopenharmony_ci    src3_m = LW(dst3);
296cabdff1aSopenharmony_ci    ILVR_D2_SH(vres1, vres0, vres3, vres2, inp0_m, inp1_m);
297cabdff1aSopenharmony_ci    INSERT_W2_SB(src0_m, src1_m, dst0_m);
298cabdff1aSopenharmony_ci    INSERT_W2_SB(src2_m, src3_m, dst1_m);
299cabdff1aSopenharmony_ci    ILVR_B2_SH(zero, dst0_m, zero, dst1_m, res0_m, res1_m);
300cabdff1aSopenharmony_ci    ADD2(res0_m, inp0_m, res1_m, inp1_m, res0_m, res1_m);
301cabdff1aSopenharmony_ci    CLIP_SH2_0_255(res0_m, res1_m);
302cabdff1aSopenharmony_ci    PCKEV_B2_SB(res0_m, res0_m, res1_m, res1_m, dst0_m, dst1_m);
303cabdff1aSopenharmony_ci    out0_m = __msa_copy_u_w((v4i32) dst0_m, 0);
304cabdff1aSopenharmony_ci    out1_m = __msa_copy_u_w((v4i32) dst0_m, 1);
305cabdff1aSopenharmony_ci    out2_m = __msa_copy_u_w((v4i32) dst1_m, 0);
306cabdff1aSopenharmony_ci    out3_m = __msa_copy_u_w((v4i32) dst1_m, 1);
307cabdff1aSopenharmony_ci    SW(out0_m, dst);
308cabdff1aSopenharmony_ci    SW(out1_m, dst1);
309cabdff1aSopenharmony_ci    SW(out2_m, dst2);
310cabdff1aSopenharmony_ci    SW(out3_m, dst3);
311cabdff1aSopenharmony_ci}
312cabdff1aSopenharmony_ci
313cabdff1aSopenharmony_civoid ff_h264_idct8_addblk_msa(uint8_t *dst, int16_t *src,
314cabdff1aSopenharmony_ci                              int32_t dst_stride)
315cabdff1aSopenharmony_ci{
316cabdff1aSopenharmony_ci    avc_idct8_addblk_msa(dst, src, dst_stride);
317cabdff1aSopenharmony_ci}
318cabdff1aSopenharmony_ci
319cabdff1aSopenharmony_civoid ff_h264_idct4x4_addblk_dc_msa(uint8_t *dst, int16_t *src,
320cabdff1aSopenharmony_ci                                   int32_t dst_stride)
321cabdff1aSopenharmony_ci{
322cabdff1aSopenharmony_ci    v16u8 pred = { 0 };
323cabdff1aSopenharmony_ci    v16i8 out;
324cabdff1aSopenharmony_ci    v8i16 pred_r, pred_l;
325cabdff1aSopenharmony_ci    const uint32_t src0 = LW(dst);
326cabdff1aSopenharmony_ci    const uint32_t src1 = LW(dst + dst_stride);
327cabdff1aSopenharmony_ci    const uint32_t src2 = LW(dst + 2 * dst_stride);
328cabdff1aSopenharmony_ci    const uint32_t src3 = LW(dst + 3 * dst_stride);
329cabdff1aSopenharmony_ci    const int16_t dc = (src[0] + 32) >> 6;
330cabdff1aSopenharmony_ci    const v8i16 input_dc = __msa_fill_h(dc);
331cabdff1aSopenharmony_ci
332cabdff1aSopenharmony_ci    src[0] = 0;
333cabdff1aSopenharmony_ci    INSERT_W4_UB(src0, src1, src2, src3, pred);
334cabdff1aSopenharmony_ci    UNPCK_UB_SH(pred, pred_r, pred_l);
335cabdff1aSopenharmony_ci    ADD2(pred_r, input_dc, pred_l, input_dc, pred_r, pred_l);
336cabdff1aSopenharmony_ci    CLIP_SH2_0_255(pred_r, pred_l);
337cabdff1aSopenharmony_ci    out = __msa_pckev_b((v16i8) pred_l, (v16i8) pred_r);
338cabdff1aSopenharmony_ci    ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
339cabdff1aSopenharmony_ci}
340cabdff1aSopenharmony_ci
341cabdff1aSopenharmony_civoid ff_h264_idct8_dc_addblk_msa(uint8_t *dst, int16_t *src,
342cabdff1aSopenharmony_ci                                 int32_t dst_stride)
343cabdff1aSopenharmony_ci{
344cabdff1aSopenharmony_ci    avc_idct8_dc_addblk_msa(dst, src, dst_stride);
345cabdff1aSopenharmony_ci}
346cabdff1aSopenharmony_ci
347cabdff1aSopenharmony_civoid ff_h264_idct_add16_msa(uint8_t *dst,
348cabdff1aSopenharmony_ci                            const int32_t *blk_offset,
349cabdff1aSopenharmony_ci                            int16_t *block, int32_t dst_stride,
350cabdff1aSopenharmony_ci                            const uint8_t nzc[5 * 8])
351cabdff1aSopenharmony_ci{
352cabdff1aSopenharmony_ci    int32_t i;
353cabdff1aSopenharmony_ci
354cabdff1aSopenharmony_ci    for (i = 0; i < 16; i++) {
355cabdff1aSopenharmony_ci        int32_t nnz = nzc[scan8[i]];
356cabdff1aSopenharmony_ci
357cabdff1aSopenharmony_ci        if (nnz) {
358cabdff1aSopenharmony_ci            if (nnz == 1 && ((dctcoef *) block)[i * 16])
359cabdff1aSopenharmony_ci                ff_h264_idct4x4_addblk_dc_msa(dst + blk_offset[i],
360cabdff1aSopenharmony_ci                                              block + i * 16 * sizeof(pixel),
361cabdff1aSopenharmony_ci                                              dst_stride);
362cabdff1aSopenharmony_ci            else
363cabdff1aSopenharmony_ci                ff_h264_idct_add_msa(dst + blk_offset[i],
364cabdff1aSopenharmony_ci                                     block + i * 16 * sizeof(pixel),
365cabdff1aSopenharmony_ci                                     dst_stride);
366cabdff1aSopenharmony_ci        }
367cabdff1aSopenharmony_ci    }
368cabdff1aSopenharmony_ci}
369cabdff1aSopenharmony_ci
370cabdff1aSopenharmony_civoid ff_h264_idct8_add4_msa(uint8_t *dst, const int32_t *blk_offset,
371cabdff1aSopenharmony_ci                            int16_t *block, int32_t dst_stride,
372cabdff1aSopenharmony_ci                            const uint8_t nzc[5 * 8])
373cabdff1aSopenharmony_ci{
374cabdff1aSopenharmony_ci    int32_t cnt;
375cabdff1aSopenharmony_ci
376cabdff1aSopenharmony_ci    for (cnt = 0; cnt < 16; cnt += 4) {
377cabdff1aSopenharmony_ci        int32_t nnz = nzc[scan8[cnt]];
378cabdff1aSopenharmony_ci
379cabdff1aSopenharmony_ci        if (nnz) {
380cabdff1aSopenharmony_ci            if (nnz == 1 && ((dctcoef *) block)[cnt * 16])
381cabdff1aSopenharmony_ci                ff_h264_idct8_dc_addblk_msa(dst + blk_offset[cnt],
382cabdff1aSopenharmony_ci                                            block + cnt * 16 * sizeof(pixel),
383cabdff1aSopenharmony_ci                                            dst_stride);
384cabdff1aSopenharmony_ci            else
385cabdff1aSopenharmony_ci                ff_h264_idct8_addblk_msa(dst + blk_offset[cnt],
386cabdff1aSopenharmony_ci                                         block + cnt * 16 * sizeof(pixel),
387cabdff1aSopenharmony_ci                                         dst_stride);
388cabdff1aSopenharmony_ci        }
389cabdff1aSopenharmony_ci    }
390cabdff1aSopenharmony_ci}
391cabdff1aSopenharmony_ci
392cabdff1aSopenharmony_civoid ff_h264_idct_add8_msa(uint8_t **dst,
393cabdff1aSopenharmony_ci                           const int32_t *blk_offset,
394cabdff1aSopenharmony_ci                           int16_t *block, int32_t dst_stride,
395cabdff1aSopenharmony_ci                           const uint8_t nzc[15 * 8])
396cabdff1aSopenharmony_ci{
397cabdff1aSopenharmony_ci    int32_t i, j;
398cabdff1aSopenharmony_ci
399cabdff1aSopenharmony_ci    for (j = 1; j < 3; j++) {
400cabdff1aSopenharmony_ci        for (i = (j * 16); i < (j * 16 + 4); i++) {
401cabdff1aSopenharmony_ci            if (nzc[scan8[i]])
402cabdff1aSopenharmony_ci                ff_h264_idct_add_msa(dst[j - 1] + blk_offset[i],
403cabdff1aSopenharmony_ci                                     block + i * 16 * sizeof(pixel),
404cabdff1aSopenharmony_ci                                     dst_stride);
405cabdff1aSopenharmony_ci            else if (((dctcoef *) block)[i * 16])
406cabdff1aSopenharmony_ci                ff_h264_idct4x4_addblk_dc_msa(dst[j - 1] + blk_offset[i],
407cabdff1aSopenharmony_ci                                              block + i * 16 * sizeof(pixel),
408cabdff1aSopenharmony_ci                                              dst_stride);
409cabdff1aSopenharmony_ci        }
410cabdff1aSopenharmony_ci    }
411cabdff1aSopenharmony_ci}
412cabdff1aSopenharmony_ci
413cabdff1aSopenharmony_civoid ff_h264_idct_add8_422_msa(uint8_t **dst,
414cabdff1aSopenharmony_ci                               const int32_t *blk_offset,
415cabdff1aSopenharmony_ci                               int16_t *block, int32_t dst_stride,
416cabdff1aSopenharmony_ci                               const uint8_t nzc[15 * 8])
417cabdff1aSopenharmony_ci{
418cabdff1aSopenharmony_ci    int32_t i, j;
419cabdff1aSopenharmony_ci
420cabdff1aSopenharmony_ci    for (j = 1; j < 3; j++) {
421cabdff1aSopenharmony_ci        for (i = (j * 16); i < (j * 16 + 4); i++) {
422cabdff1aSopenharmony_ci            if (nzc[scan8[i]])
423cabdff1aSopenharmony_ci                ff_h264_idct_add_msa(dst[j - 1] + blk_offset[i],
424cabdff1aSopenharmony_ci                                     block + i * 16 * sizeof(pixel),
425cabdff1aSopenharmony_ci                                     dst_stride);
426cabdff1aSopenharmony_ci            else if (((dctcoef *) block)[i * 16])
427cabdff1aSopenharmony_ci                ff_h264_idct4x4_addblk_dc_msa(dst[j - 1] + blk_offset[i],
428cabdff1aSopenharmony_ci                                              block + i * 16 * sizeof(pixel),
429cabdff1aSopenharmony_ci                                              dst_stride);
430cabdff1aSopenharmony_ci        }
431cabdff1aSopenharmony_ci    }
432cabdff1aSopenharmony_ci
433cabdff1aSopenharmony_ci    for (j = 1; j < 3; j++) {
434cabdff1aSopenharmony_ci        for (i = (j * 16 + 4); i < (j * 16 + 8); i++) {
435cabdff1aSopenharmony_ci            if (nzc[scan8[i + 4]])
436cabdff1aSopenharmony_ci                ff_h264_idct_add_msa(dst[j - 1] + blk_offset[i + 4],
437cabdff1aSopenharmony_ci                                     block + i * 16 * sizeof(pixel),
438cabdff1aSopenharmony_ci                                     dst_stride);
439cabdff1aSopenharmony_ci            else if (((dctcoef *) block)[i * 16])
440cabdff1aSopenharmony_ci                ff_h264_idct4x4_addblk_dc_msa(dst[j - 1] + blk_offset[i + 4],
441cabdff1aSopenharmony_ci                                              block + i * 16 * sizeof(pixel),
442cabdff1aSopenharmony_ci                                              dst_stride);
443cabdff1aSopenharmony_ci        }
444cabdff1aSopenharmony_ci    }
445cabdff1aSopenharmony_ci}
446cabdff1aSopenharmony_ci
447cabdff1aSopenharmony_civoid ff_h264_idct_add16_intra_msa(uint8_t *dst,
448cabdff1aSopenharmony_ci                                  const int32_t *blk_offset,
449cabdff1aSopenharmony_ci                                  int16_t *block,
450cabdff1aSopenharmony_ci                                  int32_t dst_stride,
451cabdff1aSopenharmony_ci                                  const uint8_t nzc[5 * 8])
452cabdff1aSopenharmony_ci{
453cabdff1aSopenharmony_ci    int32_t i;
454cabdff1aSopenharmony_ci
455cabdff1aSopenharmony_ci    for (i = 0; i < 16; i++) {
456cabdff1aSopenharmony_ci        if (nzc[scan8[i]])
457cabdff1aSopenharmony_ci            ff_h264_idct_add_msa(dst + blk_offset[i],
458cabdff1aSopenharmony_ci                                 block + i * 16 * sizeof(pixel), dst_stride);
459cabdff1aSopenharmony_ci        else if (((dctcoef *) block)[i * 16])
460cabdff1aSopenharmony_ci            ff_h264_idct4x4_addblk_dc_msa(dst + blk_offset[i],
461cabdff1aSopenharmony_ci                                          block + i * 16 * sizeof(pixel),
462cabdff1aSopenharmony_ci                                          dst_stride);
463cabdff1aSopenharmony_ci    }
464cabdff1aSopenharmony_ci}
465cabdff1aSopenharmony_ci
466cabdff1aSopenharmony_civoid ff_h264_deq_idct_luma_dc_msa(int16_t *dst, int16_t *src,
467cabdff1aSopenharmony_ci                                  int32_t de_qval)
468cabdff1aSopenharmony_ci{
469cabdff1aSopenharmony_ci    avc_deq_idct_luma_dc_msa(dst, src, de_qval);
470cabdff1aSopenharmony_ci}
471