FFmpeg
Loading...
Searching...
No Matches
h264dsp_msa.c
Go to the documentation of this file.
1/*
2 * Copyright (c) 2015 - 2017 Parag Salasakar (Parag.Salasakar@imgtec.com)
3 *
4 * This file is part of FFmpeg.
5 *
6 * FFmpeg is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * FFmpeg is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with FFmpeg; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 */
20
22#include "h264dsp_mips.h"
23
24static void avc_wgt_4x2_msa(uint8_t *data, ptrdiff_t stride,
25 int32_t log2_denom, int32_t src_weight,
26 int32_t offset_in)
27{
28 uint32_t tp0, tp1, offset_val;
29 v16u8 zero = { 0 };
30 v16u8 src0 = { 0 };
31 v8i16 src0_r, tmp0, wgt, denom, offset;
32
33 offset_val = (unsigned) offset_in << log2_denom;
34
35 wgt = __msa_fill_h(src_weight);
36 offset = __msa_fill_h(offset_val);
37 denom = __msa_fill_h(log2_denom);
38
39 LW2(data, stride, tp0, tp1);
40 INSERT_W2_UB(tp0, tp1, src0);
41 src0_r = (v8i16) __msa_ilvr_b((v16i8) zero, (v16i8) src0);
42 tmp0 = wgt * src0_r;
43 tmp0 = __msa_adds_s_h(tmp0, offset);
44 tmp0 = __msa_maxi_s_h(tmp0, 0);
45 tmp0 = __msa_srlr_h(tmp0, denom);
46 tmp0 = (v8i16) __msa_sat_u_h((v8u16) tmp0, 7);
47 src0 = (v16u8) __msa_pckev_b((v16i8) tmp0, (v16i8) tmp0);
48 ST_W2(src0, 0, 1, data, stride);
49}
50
51static void avc_wgt_4x4_msa(uint8_t *data, ptrdiff_t stride,
52 int32_t log2_denom, int32_t src_weight,
53 int32_t offset_in)
54{
55 uint32_t tp0, tp1, tp2, tp3, offset_val;
56 v16u8 src0 = { 0 };
57 v8i16 src0_r, src1_r, tmp0, tmp1, wgt, denom, offset;
58
59 offset_val = (unsigned) offset_in << log2_denom;
60
61 wgt = __msa_fill_h(src_weight);
62 offset = __msa_fill_h(offset_val);
63 denom = __msa_fill_h(log2_denom);
64
65 LW4(data, stride, tp0, tp1, tp2, tp3);
66 INSERT_W4_UB(tp0, tp1, tp2, tp3, src0);
67 UNPCK_UB_SH(src0, src0_r, src1_r);
68 MUL2(wgt, src0_r, wgt, src1_r, tmp0, tmp1);
69 ADDS_SH2_SH(tmp0, offset, tmp1, offset, tmp0, tmp1);
70 MAXI_SH2_SH(tmp0, tmp1, 0);
71 tmp0 = __msa_srlr_h(tmp0, denom);
72 tmp1 = __msa_srlr_h(tmp1, denom);
73 SAT_UH2_SH(tmp0, tmp1, 7);
74 src0 = (v16u8) __msa_pckev_b((v16i8) tmp1, (v16i8) tmp0);
75 ST_W4(src0, 0, 1, 2, 3, data, stride);
76}
77
78static void avc_wgt_4x8_msa(uint8_t *data, ptrdiff_t stride,
79 int32_t log2_denom, int32_t src_weight,
80 int32_t offset_in)
81{
82 uint32_t tp0, tp1, tp2, tp3, offset_val;
83 v16u8 src0 = { 0 }, src1 = { 0 };
84 v8i16 src0_r, src1_r, src2_r, src3_r, tmp0, tmp1, tmp2, tmp3;
85 v8i16 wgt, denom, offset;
86
87 offset_val = (unsigned) offset_in << log2_denom;
88
89 wgt = __msa_fill_h(src_weight);
90 offset = __msa_fill_h(offset_val);
91 denom = __msa_fill_h(log2_denom);
92
93 LW4(data, stride, tp0, tp1, tp2, tp3);
94 INSERT_W4_UB(tp0, tp1, tp2, tp3, src0);
95 LW4(data + 4 * stride, stride, tp0, tp1, tp2, tp3);
96 INSERT_W4_UB(tp0, tp1, tp2, tp3, src1);
97 UNPCK_UB_SH(src0, src0_r, src1_r);
98 UNPCK_UB_SH(src1, src2_r, src3_r);
99 MUL4(wgt, src0_r, wgt, src1_r, wgt, src2_r, wgt, src3_r, tmp0, tmp1, tmp2,
100 tmp3);
101 ADDS_SH4_SH(tmp0, offset, tmp1, offset, tmp2, offset, tmp3, offset, tmp0,
102 tmp1, tmp2, tmp3);
103 MAXI_SH4_SH(tmp0, tmp1, tmp2, tmp3, 0);
104 SRLR_H4_SH(tmp0, tmp1, tmp2, tmp3, denom);
105 SAT_UH4_SH(tmp0, tmp1, tmp2, tmp3, 7);
106 PCKEV_B2_UB(tmp1, tmp0, tmp3, tmp2, src0, src1);
107 ST_W8(src0, src1, 0, 1, 2, 3, 0, 1, 2, 3, data, stride);
108}
109
110static void avc_wgt_8x4_msa(uint8_t *data, ptrdiff_t stride,
111 int32_t log2_denom, int32_t src_weight,
112 int32_t offset_in)
113{
114 uint32_t offset_val;
115 uint64_t tp0, tp1, tp2, tp3;
116 v16u8 src0 = { 0 }, src1 = { 0 };
117 v8i16 src0_r, src1_r, src2_r, src3_r, tmp0, tmp1, tmp2, tmp3;
118 v8i16 wgt, denom, offset;
119
120 offset_val = (unsigned) offset_in << log2_denom;
121
122 wgt = __msa_fill_h(src_weight);
123 offset = __msa_fill_h(offset_val);
124 denom = __msa_fill_h(log2_denom);
125
126 LD4(data, stride, tp0, tp1, tp2, tp3);
127 INSERT_D2_UB(tp0, tp1, src0);
128 INSERT_D2_UB(tp2, tp3, src1);
129 UNPCK_UB_SH(src0, src0_r, src1_r);
130 UNPCK_UB_SH(src1, src2_r, src3_r);
131 MUL4(wgt, src0_r, wgt, src1_r, wgt, src2_r, wgt, src3_r, tmp0, tmp1, tmp2,
132 tmp3);
133 ADDS_SH4_SH(tmp0, offset, tmp1, offset, tmp2, offset, tmp3, offset, tmp0,
134 tmp1, tmp2, tmp3);
135 MAXI_SH4_SH(tmp0, tmp1, tmp2, tmp3, 0);
136 SRLR_H4_SH(tmp0, tmp1, tmp2, tmp3, denom);
137 SAT_UH4_SH(tmp0, tmp1, tmp2, tmp3, 7);
138 PCKEV_B2_UB(tmp1, tmp0, tmp3, tmp2, src0, src1);
139 ST_D4(src0, src1, 0, 1, 0, 1, data, stride);
140}
141
142static void avc_wgt_8x8_msa(uint8_t *data, ptrdiff_t stride, int32_t log2_denom,
143 int32_t src_weight, int32_t offset_in)
144{
145 uint32_t offset_val;
146 uint64_t tp0, tp1, tp2, tp3;
147 v16u8 src0 = { 0 }, src1 = { 0 }, src2 = { 0 }, src3 = { 0 };
148 v8i16 src0_r, src1_r, src2_r, src3_r, src4_r, src5_r, src6_r, src7_r;
149 v8i16 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
150 v8i16 wgt, denom, offset;
151
152 offset_val = (unsigned) offset_in << log2_denom;
153
154 wgt = __msa_fill_h(src_weight);
155 offset = __msa_fill_h(offset_val);
156 denom = __msa_fill_h(log2_denom);
157
158 LD4(data, stride, tp0, tp1, tp2, tp3);
159 INSERT_D2_UB(tp0, tp1, src0);
160 INSERT_D2_UB(tp2, tp3, src1);
161 LD4(data + 4 * stride, stride, tp0, tp1, tp2, tp3);
162 INSERT_D2_UB(tp0, tp1, src2);
163 INSERT_D2_UB(tp2, tp3, src3);
164 UNPCK_UB_SH(src0, src0_r, src1_r);
165 UNPCK_UB_SH(src1, src2_r, src3_r);
166 UNPCK_UB_SH(src2, src4_r, src5_r);
167 UNPCK_UB_SH(src3, src6_r, src7_r);
168 MUL4(wgt, src0_r, wgt, src1_r, wgt, src2_r, wgt, src3_r, tmp0, tmp1, tmp2,
169 tmp3);
170 MUL4(wgt, src4_r, wgt, src5_r, wgt, src6_r, wgt, src7_r, tmp4, tmp5, tmp6,
171 tmp7);
172 ADDS_SH4_SH(tmp0, offset, tmp1, offset, tmp2, offset, tmp3, offset, tmp0,
173 tmp1, tmp2, tmp3);
174 ADDS_SH4_SH(tmp4, offset, tmp5, offset, tmp6, offset, tmp7, offset, tmp4,
175 tmp5, tmp6, tmp7);
176 MAXI_SH8_SH(tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, 0);
177 SRLR_H8_SH(tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, denom);
178 SAT_UH8_SH(tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, 7);
179 PCKEV_B4_UB(tmp1, tmp0, tmp3, tmp2, tmp5, tmp4, tmp7, tmp6, src0, src1,
180 src2, src3);
181 ST_D8(src0, src1, src2, src3, 0, 1, 0, 1, 0, 1, 0, 1, data, stride);
182}
183
184static void avc_wgt_8x16_msa(uint8_t *data, ptrdiff_t stride,
185 int32_t log2_denom, int32_t src_weight,
186 int32_t offset_in)
187{
188 uint32_t offset_val, cnt;
189 uint64_t tp0, tp1, tp2, tp3;
190 v16u8 src0 = { 0 }, src1 = { 0 }, src2 = { 0 }, src3 = { 0 };
191 v8i16 src0_r, src1_r, src2_r, src3_r, src4_r, src5_r, src6_r, src7_r;
192 v8i16 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
193 v8i16 wgt, denom, offset;
194
195 offset_val = (unsigned) offset_in << log2_denom;
196
197 wgt = __msa_fill_h(src_weight);
198 offset = __msa_fill_h(offset_val);
199 denom = __msa_fill_h(log2_denom);
200
201 for (cnt = 2; cnt--;) {
202 LD4(data, stride, tp0, tp1, tp2, tp3);
203 INSERT_D2_UB(tp0, tp1, src0);
204 INSERT_D2_UB(tp2, tp3, src1);
205 LD4(data + 4 * stride, stride, tp0, tp1, tp2, tp3);
206 INSERT_D2_UB(tp0, tp1, src2);
207 INSERT_D2_UB(tp2, tp3, src3);
208 UNPCK_UB_SH(src0, src0_r, src1_r);
209 UNPCK_UB_SH(src1, src2_r, src3_r);
210 UNPCK_UB_SH(src2, src4_r, src5_r);
211 UNPCK_UB_SH(src3, src6_r, src7_r);
212 MUL4(wgt, src0_r, wgt, src1_r, wgt, src2_r, wgt, src3_r, tmp0, tmp1,
213 tmp2, tmp3);
214 MUL4(wgt, src4_r, wgt, src5_r, wgt, src6_r, wgt, src7_r, tmp4, tmp5,
215 tmp6, tmp7);
216 ADDS_SH4_SH(tmp0, offset, tmp1, offset, tmp2, offset, tmp3, offset,
217 tmp0, tmp1, tmp2, tmp3);
218 ADDS_SH4_SH(tmp4, offset, tmp5, offset, tmp6, offset, tmp7, offset,
219 tmp4, tmp5, tmp6, tmp7);
220 MAXI_SH8_SH(tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, 0);
221 SRLR_H8_SH(tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, denom);
222 SAT_UH8_SH(tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, 7);
223 PCKEV_B4_UB(tmp1, tmp0, tmp3, tmp2, tmp5, tmp4, tmp7, tmp6, src0, src1,
224 src2, src3);
225 ST_D8(src0, src1, src2, src3, 0, 1, 0, 1, 0, 1, 0, 1, data, stride);
226 data += 8 * stride;
227 }
228}
229
230static void avc_biwgt_4x2_msa(uint8_t *src, uint8_t *dst, ptrdiff_t stride,
231 int32_t log2_denom, int32_t src_weight,
232 int32_t dst_weight, int32_t offset_in)
233{
234 uint32_t tp0, tp1;
235 v16i8 src_wgt, dst_wgt, wgt, vec0;
236 v16u8 src0 = { 0 }, dst0 = { 0 };
237 v8i16 tmp0, denom, offset, zero = { 0 }, max255 = __msa_ldi_h(255);
238
239 offset_in = (unsigned) ((offset_in + 1) | 1) << log2_denom;
240 offset_in += (128 * (src_weight + dst_weight));
241
242 src_wgt = __msa_fill_b(src_weight);
243 dst_wgt = __msa_fill_b(dst_weight);
244 offset = __msa_fill_h(offset_in);
245 denom = __msa_fill_h(log2_denom + 1);
246
247 wgt = __msa_ilvev_b(dst_wgt, src_wgt);
248
249 LW2(src, stride, tp0, tp1);
250 INSERT_W2_UB(tp0, tp1, src0);
251 LW2(dst, stride, tp0, tp1);
252 INSERT_W2_UB(tp0, tp1, dst0);
253 XORI_B2_128_UB(src0, dst0);
254 vec0 = (v16i8) __msa_ilvr_b((v16i8) dst0, (v16i8) src0);
255 tmp0 = __msa_dpadd_s_h(zero, wgt, vec0);
256 tmp0 = __msa_adds_s_h(tmp0, offset);
257 tmp0 >>= denom;
258 tmp0 = __msa_maxi_s_h(tmp0, 0);
259 tmp0 = __msa_min_s_h(max255, tmp0);
260 dst0 = (v16u8) __msa_pckev_b((v16i8) tmp0, (v16i8) tmp0);
261 ST_W2(dst0, 0, 1, dst, stride);
262}
263
264static void avc_biwgt_4x4_msa(uint8_t *src, uint8_t *dst, ptrdiff_t stride,
265 int32_t log2_denom, int32_t src_weight,
266 int32_t dst_weight, int32_t offset_in)
267{
268 uint32_t tp0, tp1, tp2, tp3;
269 v16i8 src_wgt, dst_wgt, wgt, vec0, vec1;
270 v16u8 src0, dst0;
271 v8i16 tmp0, tmp1, denom, offset, zero = { 0 };
272
273 offset_in = (unsigned) ((offset_in + 1) | 1) << log2_denom;
274 offset_in += (128 * (src_weight + dst_weight));
275
276 src_wgt = __msa_fill_b(src_weight);
277 dst_wgt = __msa_fill_b(dst_weight);
278 offset = __msa_fill_h(offset_in);
279 denom = __msa_fill_h(log2_denom + 1);
280
281 wgt = __msa_ilvev_b(dst_wgt, src_wgt);
282
283 LW4(src, stride, tp0, tp1, tp2, tp3);
284 INSERT_W4_UB(tp0, tp1, tp2, tp3, src0);
285 LW4(dst, stride, tp0, tp1, tp2, tp3);
286 INSERT_W4_UB(tp0, tp1, tp2, tp3, dst0);
287 XORI_B2_128_UB(src0, dst0);
288 ILVRL_B2_SB(dst0, src0, vec0, vec1);
289 tmp0 = __msa_dpadd_s_h(zero, wgt, vec0);
290 tmp1 = __msa_dpadd_s_h(zero, wgt, vec1);
291 tmp0 = __msa_adds_s_h(tmp0, offset);
292 tmp1 = __msa_adds_s_h(tmp1, offset);
293 tmp0 >>= denom;
294 tmp1 >>= denom;
295 CLIP_SH2_0_255(tmp0, tmp1);
296 dst0 = (v16u8) __msa_pckev_b((v16i8) tmp1, (v16i8) tmp0);
297 ST_W4(dst0, 0, 1, 2, 3, dst, stride);
298}
299
300static void avc_biwgt_4x8_msa(uint8_t *src, uint8_t *dst, ptrdiff_t stride,
301 int32_t log2_denom, int32_t src_weight,
302 int32_t dst_weight, int32_t offset_in)
303{
304 uint32_t tp0, tp1, tp2, tp3;
305 v16i8 src_wgt, dst_wgt, wgt, vec0, vec1, vec2, vec3;
306 v16u8 src0, src1, dst0, dst1;
307 v8i16 tmp0, tmp1, tmp2, tmp3, denom, offset, zero = { 0 };
308
309 offset_in = (unsigned) ((offset_in + 1) | 1) << log2_denom;
310 offset_in += (128 * (src_weight + dst_weight));
311
312 src_wgt = __msa_fill_b(src_weight);
313 dst_wgt = __msa_fill_b(dst_weight);
314 offset = __msa_fill_h(offset_in);
315 denom = __msa_fill_h(log2_denom + 1);
316 wgt = __msa_ilvev_b(dst_wgt, src_wgt);
317
318 LW4(src, stride, tp0, tp1, tp2, tp3);
319 src += 4 * stride;
320 INSERT_W4_UB(tp0, tp1, tp2, tp3, src0);
321 LW4(src, stride, tp0, tp1, tp2, tp3);
322 INSERT_W4_UB(tp0, tp1, tp2, tp3, src1);
323 LW4(dst, stride, tp0, tp1, tp2, tp3);
324 INSERT_W4_UB(tp0, tp1, tp2, tp3, dst0);
325 LW4(dst + 4 * stride, stride, tp0, tp1, tp2, tp3);
326 INSERT_W4_UB(tp0, tp1, tp2, tp3, dst1);
327 XORI_B4_128_UB(src0, src1, dst0, dst1);
328 ILVRL_B2_SB(dst0, src0, vec0, vec1);
329 ILVRL_B2_SB(dst1, src1, vec2, vec3);
330 tmp0 = __msa_dpadd_s_h(zero, wgt, vec0);
331 tmp1 = __msa_dpadd_s_h(zero, wgt, vec1);
332 tmp2 = __msa_dpadd_s_h(zero, wgt, vec2);
333 tmp3 = __msa_dpadd_s_h(zero, wgt, vec3);
334 tmp0 = __msa_adds_s_h(tmp0, offset);
335 tmp1 = __msa_adds_s_h(tmp1, offset);
336 tmp2 = __msa_adds_s_h(tmp2, offset);
337 tmp3 = __msa_adds_s_h(tmp3, offset);
338 SRA_4V(tmp0, tmp1, tmp2, tmp3, denom);
339 CLIP_SH4_0_255(tmp0, tmp1, tmp2, tmp3);
340 PCKEV_B2_UB(tmp1, tmp0, tmp3, tmp2, dst0, dst1);
341 ST_W8(dst0, dst1, 0, 1, 2, 3, 0, 1, 2, 3, dst, stride);
342}
343
344static void avc_biwgt_8x4_msa(uint8_t *src, uint8_t *dst, ptrdiff_t stride,
345 int32_t log2_denom, int32_t src_weight,
346 int32_t dst_weight, int32_t offset_in)
347{
348 uint64_t tp0, tp1, tp2, tp3;
349 v16i8 src_wgt, dst_wgt, wgt, vec0, vec1, vec2, vec3;
350 v16u8 src0, src1, dst0, dst1;
351 v8i16 tmp0, tmp1, tmp2, tmp3, denom, offset, zero = { 0 };
352
353 offset_in = (unsigned) ((offset_in + 1) | 1) << log2_denom;
354 offset_in += (128 * (src_weight + dst_weight));
355
356 src_wgt = __msa_fill_b(src_weight);
357 dst_wgt = __msa_fill_b(dst_weight);
358 offset = __msa_fill_h(offset_in);
359 denom = __msa_fill_h(log2_denom + 1);
360
361 wgt = __msa_ilvev_b(dst_wgt, src_wgt);
362
363 LD4(src, stride, tp0, tp1, tp2, tp3);
364 INSERT_D2_UB(tp0, tp1, src0);
365 INSERT_D2_UB(tp2, tp3, src1);
366 LD4(dst, stride, tp0, tp1, tp2, tp3);
367 INSERT_D2_UB(tp0, tp1, dst0);
368 INSERT_D2_UB(tp2, tp3, dst1);
369 XORI_B4_128_UB(src0, src1, dst0, dst1);
370 ILVRL_B2_SB(dst0, src0, vec0, vec1);
371 ILVRL_B2_SB(dst1, src1, vec2, vec3);
372 tmp0 = __msa_dpadd_s_h(zero, wgt, vec0);
373 tmp1 = __msa_dpadd_s_h(zero, wgt, vec1);
374 tmp2 = __msa_dpadd_s_h(zero, wgt, vec2);
375 tmp3 = __msa_dpadd_s_h(zero, wgt, vec3);
376 tmp0 = __msa_adds_s_h(tmp0, offset);
377 tmp1 = __msa_adds_s_h(tmp1, offset);
378 tmp2 = __msa_adds_s_h(tmp2, offset);
379 tmp3 = __msa_adds_s_h(tmp3, offset);
380 SRA_4V(tmp0, tmp1, tmp2, tmp3, denom);
381 CLIP_SH4_0_255(tmp0, tmp1, tmp2, tmp3);
382 PCKEV_B2_UB(tmp1, tmp0, tmp3, tmp2, dst0, dst1);
383 ST_D4(dst0, dst1, 0, 1, 0, 1, dst, stride);
384}
385
386static void avc_biwgt_8x8_msa(uint8_t *src, uint8_t *dst, ptrdiff_t stride,
387 int32_t log2_denom, int32_t src_weight,
388 int32_t dst_weight, int32_t offset_in)
389{
390 uint64_t tp0, tp1, tp2, tp3;
391 v16i8 src_wgt, dst_wgt, wgt, vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7;
392 v16u8 src0, src1, src2, src3, dst0, dst1, dst2, dst3;
393 v8i16 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, denom, offset,
394 zero = { 0 };
395
396 offset_in = (unsigned) ((offset_in + 1) | 1) << log2_denom;
397 offset_in += (128 * (src_weight + dst_weight));
398
399 src_wgt = __msa_fill_b(src_weight);
400 dst_wgt = __msa_fill_b(dst_weight);
401 offset = __msa_fill_h(offset_in);
402 denom = __msa_fill_h(log2_denom + 1);
403 wgt = __msa_ilvev_b(dst_wgt, src_wgt);
404
405 LD4(src, stride, tp0, tp1, tp2, tp3);
406 INSERT_D2_UB(tp0, tp1, src0);
407 INSERT_D2_UB(tp2, tp3, src1);
408 LD4(src + 4 * stride, stride, tp0, tp1, tp2, tp3);
409 INSERT_D2_UB(tp0, tp1, src2);
410 INSERT_D2_UB(tp2, tp3, src3);
411 LD4(dst, stride, tp0, tp1, tp2, tp3);
412 INSERT_D2_UB(tp0, tp1, dst0);
413 INSERT_D2_UB(tp2, tp3, dst1);
414 LD4(dst + 4 * stride, stride, tp0, tp1, tp2, tp3);
415 INSERT_D2_UB(tp0, tp1, dst2);
416 INSERT_D2_UB(tp2, tp3, dst3);
417 XORI_B8_128_UB(src0, src1, src2, src3, dst0, dst1, dst2, dst3);
418 ILVRL_B2_SB(dst0, src0, vec0, vec1);
419 ILVRL_B2_SB(dst1, src1, vec2, vec3);
420 ILVRL_B2_SB(dst2, src2, vec4, vec5);
421 ILVRL_B2_SB(dst3, src3, vec6, vec7);
422 tmp0 = __msa_dpadd_s_h(zero, wgt, vec0);
423 tmp1 = __msa_dpadd_s_h(zero, wgt, vec1);
424 tmp2 = __msa_dpadd_s_h(zero, wgt, vec2);
425 tmp3 = __msa_dpadd_s_h(zero, wgt, vec3);
426 tmp4 = __msa_dpadd_s_h(zero, wgt, vec4);
427 tmp5 = __msa_dpadd_s_h(zero, wgt, vec5);
428 tmp6 = __msa_dpadd_s_h(zero, wgt, vec6);
429 tmp7 = __msa_dpadd_s_h(zero, wgt, vec7);
430 tmp0 = __msa_adds_s_h(tmp0, offset);
431 tmp1 = __msa_adds_s_h(tmp1, offset);
432 tmp2 = __msa_adds_s_h(tmp2, offset);
433 tmp3 = __msa_adds_s_h(tmp3, offset);
434 tmp4 = __msa_adds_s_h(tmp4, offset);
435 tmp5 = __msa_adds_s_h(tmp5, offset);
436 tmp6 = __msa_adds_s_h(tmp6, offset);
437 tmp7 = __msa_adds_s_h(tmp7, offset);
438 SRA_4V(tmp0, tmp1, tmp2, tmp3, denom);
439 SRA_4V(tmp4, tmp5, tmp6, tmp7, denom);
440 CLIP_SH8_0_255(tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7);
441 PCKEV_B2_UB(tmp1, tmp0, tmp3, tmp2, dst0, dst1);
442 PCKEV_B2_UB(tmp5, tmp4, tmp7, tmp6, dst2, dst3);
443 ST_D8(dst0, dst1, dst2, dst3, 0, 1, 0, 1, 0, 1, 0, 1, dst, stride);
444}
445
446static void avc_biwgt_8x16_msa(uint8_t *src, uint8_t *dst, ptrdiff_t stride,
447 int32_t log2_denom, int32_t src_weight,
448 int32_t dst_weight, int32_t offset_in)
449{
450 uint8_t cnt;
451 uint64_t tp0, tp1, tp2, tp3;
452 v16i8 src_wgt, dst_wgt, wgt;
453 v16u8 src0, src1, src2, src3;
454 v16u8 dst0, dst1, dst2, dst3;
455 v16i8 vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7;
456 v8i16 temp0, temp1, temp2, temp3, temp4, temp5, temp6, temp7;
457 v8i16 zero = { 0 };
458 v8i16 denom, offset;
459
460 offset_in = (unsigned) ((offset_in + 1) | 1) << log2_denom;
461 offset_in += (128 * (src_weight + dst_weight));
462
463 src_wgt = __msa_fill_b(src_weight);
464 dst_wgt = __msa_fill_b(dst_weight);
465 offset = __msa_fill_h(offset_in);
466 denom = __msa_fill_h(log2_denom + 1);
467 wgt = __msa_ilvev_b(dst_wgt, src_wgt);
468
469 for (cnt = 2; cnt--;) {
470 LD4(src, stride, tp0, tp1, tp2, tp3);
471 src += 4 * stride;
472 INSERT_D2_UB(tp0, tp1, src0);
473 INSERT_D2_UB(tp2, tp3, src1);
474 LD4(src, stride, tp0, tp1, tp2, tp3);
475 src += 4 * stride;
476 INSERT_D2_UB(tp0, tp1, src2);
477 INSERT_D2_UB(tp2, tp3, src3);
478 LD4(dst, stride, tp0, tp1, tp2, tp3);
479 INSERT_D2_UB(tp0, tp1, dst0);
480 INSERT_D2_UB(tp2, tp3, dst1);
481 LD4(dst + 4 * stride, stride, tp0, tp1, tp2, tp3);
482 INSERT_D2_UB(tp0, tp1, dst2);
483 INSERT_D2_UB(tp2, tp3, dst3);
484 XORI_B4_128_UB(src0, src1, src2, src3);
485 XORI_B4_128_UB(dst0, dst1, dst2, dst3);
486 ILVR_B4_SB(dst0, src0, dst1, src1, dst2, src2, dst3, src3,
487 vec0, vec2, vec4, vec6);
488 ILVL_B4_SB(dst0, src0, dst1, src1, dst2, src2, dst3, src3,
489 vec1, vec3, vec5, vec7);
490
491 temp0 = __msa_dpadd_s_h(zero, wgt, vec0);
492 temp1 = __msa_dpadd_s_h(zero, wgt, vec1);
493 temp2 = __msa_dpadd_s_h(zero, wgt, vec2);
494 temp3 = __msa_dpadd_s_h(zero, wgt, vec3);
495 temp4 = __msa_dpadd_s_h(zero, wgt, vec4);
496 temp5 = __msa_dpadd_s_h(zero, wgt, vec5);
497 temp6 = __msa_dpadd_s_h(zero, wgt, vec6);
498 temp7 = __msa_dpadd_s_h(zero, wgt, vec7);
499 temp0 = __msa_adds_s_h(temp0, offset);
500 temp1 = __msa_adds_s_h(temp1, offset);
501 temp2 = __msa_adds_s_h(temp2, offset);
502 temp3 = __msa_adds_s_h(temp3, offset);
503 temp4 = __msa_adds_s_h(temp4, offset);
504 temp5 = __msa_adds_s_h(temp5, offset);
505 temp6 = __msa_adds_s_h(temp6, offset);
506 temp7 = __msa_adds_s_h(temp7, offset);
507
508 SRA_4V(temp0, temp1, temp2, temp3, denom);
509 SRA_4V(temp4, temp5, temp6, temp7, denom);
510 CLIP_SH8_0_255(temp0, temp1, temp2, temp3, temp4, temp5, temp6, temp7);
511 PCKEV_B4_UB(temp1, temp0, temp3, temp2, temp5, temp4, temp7, temp6,
512 dst0, dst1, dst2, dst3);
513 ST_D8(dst0, dst1, dst2, dst3, 0, 1, 0, 1, 0, 1, 0, 1, dst, stride);
514 dst += 8 * stride;
515 }
516}
517
518#define AVC_LPF_P0P1P2_OR_Q0Q1Q2(p3_or_q3_org_in, p0_or_q0_org_in, \
519 q3_or_p3_org_in, p1_or_q1_org_in, \
520 p2_or_q2_org_in, q1_or_p1_org_in, \
521 p0_or_q0_out, p1_or_q1_out, p2_or_q2_out) \
522{ \
523 v8i16 threshold; \
524 v8i16 const3 = __msa_ldi_h(3); \
525 \
526 threshold = (p0_or_q0_org_in) + (q3_or_p3_org_in); \
527 threshold += (p1_or_q1_org_in); \
528 \
529 (p0_or_q0_out) = threshold << 1; \
530 (p0_or_q0_out) += (p2_or_q2_org_in); \
531 (p0_or_q0_out) += (q1_or_p1_org_in); \
532 (p0_or_q0_out) = __msa_srari_h((p0_or_q0_out), 3); \
533 \
534 (p1_or_q1_out) = (p2_or_q2_org_in) + threshold; \
535 (p1_or_q1_out) = __msa_srari_h((p1_or_q1_out), 2); \
536 \
537 (p2_or_q2_out) = (p2_or_q2_org_in) * const3; \
538 (p2_or_q2_out) += (p3_or_q3_org_in); \
539 (p2_or_q2_out) += (p3_or_q3_org_in); \
540 (p2_or_q2_out) += threshold; \
541 (p2_or_q2_out) = __msa_srari_h((p2_or_q2_out), 3); \
542}
543
544/* data[-u32_img_width] = (uint8_t)((2 * p1 + p0 + q1 + 2) >> 2); */
545#define AVC_LPF_P0_OR_Q0(p0_or_q0_org_in, q1_or_p1_org_in, \
546 p1_or_q1_org_in, p0_or_q0_out) \
547{ \
548 (p0_or_q0_out) = (p0_or_q0_org_in) + (q1_or_p1_org_in); \
549 (p0_or_q0_out) += (p1_or_q1_org_in); \
550 (p0_or_q0_out) += (p1_or_q1_org_in); \
551 (p0_or_q0_out) = __msa_srari_h((p0_or_q0_out), 2); \
552}
553
554#define AVC_LPF_P1_OR_Q1(p0_or_q0_org_in, q0_or_p0_org_in, \
555 p1_or_q1_org_in, p2_or_q2_org_in, \
556 negate_tc_in, tc_in, p1_or_q1_out) \
557{ \
558 v8i16 clip3, temp; \
559 \
560 clip3 = (v8i16) __msa_aver_u_h((v8u16) p0_or_q0_org_in, \
561 (v8u16) q0_or_p0_org_in); \
562 temp = p1_or_q1_org_in << 1; \
563 clip3 = clip3 - temp; \
564 clip3 = __msa_ave_s_h(p2_or_q2_org_in, clip3); \
565 CLIP_SH(clip3, negate_tc_in, tc_in); \
566 p1_or_q1_out = p1_or_q1_org_in + clip3; \
567}
568
569#define AVC_LPF_P0Q0(q0_or_p0_org_in, p0_or_q0_org_in, \
570 p1_or_q1_org_in, q1_or_p1_org_in, \
571 negate_threshold_in, threshold_in, \
572 p0_or_q0_out, q0_or_p0_out) \
573{ \
574 v8i16 q0_sub_p0, p1_sub_q1, delta; \
575 \
576 q0_sub_p0 = q0_or_p0_org_in - p0_or_q0_org_in; \
577 p1_sub_q1 = p1_or_q1_org_in - q1_or_p1_org_in; \
578 q0_sub_p0 <<= 2; \
579 p1_sub_q1 += 4; \
580 delta = q0_sub_p0 + p1_sub_q1; \
581 delta >>= 3; \
582 \
583 CLIP_SH(delta, negate_threshold_in, threshold_in); \
584 \
585 p0_or_q0_out = p0_or_q0_org_in + delta; \
586 q0_or_p0_out = q0_or_p0_org_in - delta; \
587 \
588 CLIP_SH2_0_255(p0_or_q0_out, q0_or_p0_out); \
589}
590
591#define AVC_LPF_H_CHROMA_422(src, stride, tc_val, alpha, beta, res) \
592{ \
593 uint32_t load0, load1, load2, load3; \
594 v16u8 src0 = { 0 }; \
595 v16u8 src1 = { 0 }; \
596 v16u8 src2 = { 0 }; \
597 v16u8 src3 = { 0 }; \
598 v16u8 p0_asub_q0, p1_asub_p0, q1_asub_q0; \
599 v16u8 is_less_than, is_less_than_alpha, is_less_than_beta; \
600 v8i16 tc, q0_sub_p0, p1_sub_q1, delta; \
601 v8i16 res0_r, res1_r; \
602 v16i8 zeros = { 0 }; \
603 v16u8 res0, res1; \
604 \
605 LW4((src - 2), stride, load0, load1, load2, load3); \
606 src0 = (v16u8) __msa_insert_w((v4i32) src0, 0, load0); \
607 src1 = (v16u8) __msa_insert_w((v4i32) src1, 0, load1); \
608 src2 = (v16u8) __msa_insert_w((v4i32) src2, 0, load2); \
609 src3 = (v16u8) __msa_insert_w((v4i32) src3, 0, load3); \
610 \
611 TRANSPOSE4x4_UB_UB(src0, src1, src2, src3, src0, src1, src2, src3); \
612 \
613 p0_asub_q0 = __msa_asub_u_b(src2, src1); \
614 p1_asub_p0 = __msa_asub_u_b(src1, src0); \
615 q1_asub_q0 = __msa_asub_u_b(src2, src3); \
616 \
617 tc = __msa_fill_h(tc_val); \
618 \
619 is_less_than_alpha = (p0_asub_q0 < alpha); \
620 is_less_than_beta = (p1_asub_p0 < beta); \
621 is_less_than = is_less_than_alpha & is_less_than_beta; \
622 is_less_than_beta = (q1_asub_q0 < beta); \
623 is_less_than = is_less_than_beta & is_less_than; \
624 \
625 ILVR_B2_SH(src2, src1, src0, src3, q0_sub_p0, p1_sub_q1); \
626 HSUB_UB2_SH(q0_sub_p0, p1_sub_q1, q0_sub_p0, p1_sub_q1); \
627 \
628 q0_sub_p0 <<= 2; \
629 delta = q0_sub_p0 + p1_sub_q1; \
630 delta = __msa_srari_h(delta, 3); \
631 \
632 CLIP_SH(delta, -tc, tc); \
633 \
634 ILVR_B2_SH(zeros, src1, zeros, src2, res0_r, res1_r); \
635 \
636 res0_r += delta; \
637 res1_r -= delta; \
638 \
639 CLIP_SH2_0_255(res0_r, res1_r); \
640 PCKEV_B2_UB(res0_r, res0_r, res1_r, res1_r, res0, res1); \
641 \
642 res0 = __msa_bmnz_v(src1, res0, is_less_than); \
643 res1 = __msa_bmnz_v(src2, res1, is_less_than); \
644 \
645 res = (v16u8) __msa_ilvr_b((v16i8) res1, (v16i8) res0); \
646}
647
648#define TRANSPOSE2x4_B_UB(in0, in1, out0, out1, out2, out3) \
649{ \
650 v16i8 zero_m = { 0 }; \
651 \
652 out0 = (v16u8) __msa_ilvr_b((v16i8) in1, (v16i8) in0); \
653 out1 = (v16u8) __msa_sldi_b(zero_m, (v16i8) out0, 2); \
654 SLDI_B2_UB(zero_m, out1, zero_m, out2, 2, out2, out3); \
655}
656
657#define AVC_LPF_H_2BYTE_CHROMA_422(src, stride, tc_val, alpha, beta, res) \
658{ \
659 uint32_t load0, load1; \
660 v16u8 src0 = { 0 }; \
661 v16u8 src1 = { 0 }; \
662 v16u8 src2 = { 0 }; \
663 v16u8 src3 = { 0 }; \
664 v16u8 p0_asub_q0, p1_asub_p0, q1_asub_q0; \
665 v16u8 is_less_than, is_less_than_alpha, is_less_than_beta; \
666 v8i16 tc, q0_sub_p0, p1_sub_q1, delta, res0_r, res1_r; \
667 v16i8 zeros = { 0 }; \
668 v16u8 res0, res1; \
669 \
670 load0 = LW(src - 2); \
671 load1 = LW(src - 2 + stride); \
672 \
673 src0 = (v16u8) __msa_insert_w((v4i32) src0, 0, load0); \
674 src1 = (v16u8) __msa_insert_w((v4i32) src1, 0, load1); \
675 \
676 TRANSPOSE2x4_B_UB(src0, src1, src0, src1, src2, src3); \
677 \
678 p0_asub_q0 = __msa_asub_u_b(src2, src1); \
679 p1_asub_p0 = __msa_asub_u_b(src1, src0); \
680 q1_asub_q0 = __msa_asub_u_b(src2, src3); \
681 \
682 tc = __msa_fill_h(tc_val); \
683 \
684 is_less_than_alpha = (p0_asub_q0 < alpha); \
685 is_less_than_beta = (p1_asub_p0 < beta); \
686 is_less_than = is_less_than_alpha & is_less_than_beta; \
687 is_less_than_beta = (q1_asub_q0 < beta); \
688 is_less_than = is_less_than_beta & is_less_than; \
689 \
690 ILVR_B2_SH(src2, src1, src0, src3, q0_sub_p0, p1_sub_q1); \
691 HSUB_UB2_SH(q0_sub_p0, p1_sub_q1, q0_sub_p0, p1_sub_q1); \
692 \
693 q0_sub_p0 <<= 2; \
694 delta = q0_sub_p0 + p1_sub_q1; \
695 delta = __msa_srari_h(delta, 3); \
696 CLIP_SH(delta, -tc, tc); \
697 \
698 ILVR_B2_SH(zeros, src1, zeros, src2, res0_r, res1_r); \
699 \
700 res0_r += delta; \
701 res1_r -= delta; \
702 \
703 CLIP_SH2_0_255(res0_r, res1_r); \
704 PCKEV_B2_UB(res0_r, res0_r, res1_r, res1_r, res0, res1); \
705 \
706 res0 = __msa_bmnz_v(src1, res0, is_less_than); \
707 res1 = __msa_bmnz_v(src2, res1, is_less_than); \
708 \
709 res = (v16u8) __msa_ilvr_b((v16i8) res1, (v16i8) res0); \
710}
711
713 uint8_t alpha_in,
714 uint8_t beta_in,
715 ptrdiff_t img_width)
716{
717 v16u8 p0_asub_q0, p1_asub_p0, q1_asub_q0;
718 v16u8 is_less_than, is_less_than_beta, is_less_than_alpha;
719 v16u8 p1_org, p0_org, q0_org, q1_org;
720
721 LD_UB4(data - (img_width << 1), img_width, p1_org, p0_org, q0_org, q1_org);
722
723 p0_asub_q0 = __msa_asub_u_b(p0_org, q0_org);
724 p1_asub_p0 = __msa_asub_u_b(p1_org, p0_org);
725 q1_asub_q0 = __msa_asub_u_b(q1_org, q0_org);
726
727 is_less_than_alpha = (p0_asub_q0 < alpha_in);
728 is_less_than_beta = (p1_asub_p0 < beta_in);
729 is_less_than = is_less_than_beta & is_less_than_alpha;
730 is_less_than_beta = (q1_asub_q0 < beta_in);
731 is_less_than = is_less_than_beta & is_less_than;
732
733 if (!__msa_test_bz_v(is_less_than)) {
734 v16u8 p2_asub_p0, q2_asub_q0, p0, q0, negate_is_less_than_beta;
735 v8i16 p0_r = { 0 };
736 v8i16 q0_r = { 0 };
737 v8i16 p0_l = { 0 };
738 v8i16 q0_l = { 0 };
739 v16i8 zero = { 0 };
740 v8i16 p1_org_r, p0_org_r, q0_org_r, q1_org_r;
741 v8i16 p1_org_l, p0_org_l, q0_org_l, q1_org_l;
742 v16u8 q2_org = LD_UB(data + (2 * img_width));
743 v16u8 p2_org = LD_UB(data - (3 * img_width));
744 v16u8 tmp_flag = (v16u8)__msa_fill_b((alpha_in >> 2) + 2);
745
746 UNPCK_UB_SH(p1_org, p1_org_r, p1_org_l);
747 UNPCK_UB_SH(p0_org, p0_org_r, p0_org_l);
748 UNPCK_UB_SH(q0_org, q0_org_r, q0_org_l);
749
750 tmp_flag = (p0_asub_q0 < tmp_flag);
751
752 p2_asub_p0 = __msa_asub_u_b(p2_org, p0_org);
753 is_less_than_beta = (p2_asub_p0 < beta_in);
754 is_less_than_beta = is_less_than_beta & tmp_flag;
755 negate_is_less_than_beta = __msa_xori_b(is_less_than_beta, 0xff);
756 is_less_than_beta = is_less_than_beta & is_less_than;
757 negate_is_less_than_beta = negate_is_less_than_beta & is_less_than;
758
759 q1_org_r = (v8i16) __msa_ilvr_b(zero, (v16i8) q1_org);
760 q1_org_l = (v8i16) __msa_ilvl_b(zero, (v16i8) q1_org);
761
762 /* combine and store */
763 if (!__msa_test_bz_v(is_less_than_beta)) {
764 v8i16 p3_org_l, p3_org_r;
765 v16u8 p3_org = LD_UB(data - (img_width << 2));
766 v16u8 p2, p1;
767 v8i16 p2_r = { 0 };
768 v8i16 p2_l = { 0 };
769 v8i16 p1_r = { 0 };
770 v8i16 p1_l = { 0 };
771
772 ILVR_B2_SH(zero, p3_org, zero, p2_org, p3_org_r, p2_r);
773 AVC_LPF_P0P1P2_OR_Q0Q1Q2(p3_org_r, p0_org_r, q0_org_r, p1_org_r,
774 p2_r, q1_org_r, p0_r, p1_r, p2_r);
775
776 ILVL_B2_SH(zero, p3_org, zero, p2_org, p3_org_l, p2_l);
777 AVC_LPF_P0P1P2_OR_Q0Q1Q2(p3_org_l, p0_org_l, q0_org_l, p1_org_l,
778 p2_l, q1_org_l, p0_l, p1_l, p2_l);
779
780 PCKEV_B3_UB(p0_l, p0_r, p1_l, p1_r, p2_l, p2_r, p0, p1, p2);
781
782 p0_org = __msa_bmnz_v(p0_org, p0, is_less_than_beta);
783 p1_org = __msa_bmnz_v(p1_org, p1, is_less_than_beta);
784 p2_org = __msa_bmnz_v(p2_org, p2, is_less_than_beta);
785
786 ST_UB(p1_org, data - (2 * img_width));
787 ST_UB(p2_org, data - (3 * img_width));
788 }
789
790 AVC_LPF_P0_OR_Q0(p0_org_r, q1_org_r, p1_org_r, p0_r);
791 AVC_LPF_P0_OR_Q0(p0_org_l, q1_org_l, p1_org_l, p0_l);
792
793 /* combine */
794 p0 = (v16u8) __msa_pckev_b((v16i8) p0_l, (v16i8) p0_r);
795 p0_org = __msa_bmnz_v(p0_org, p0, negate_is_less_than_beta);
796
797 ST_UB(p0_org, data - img_width);
798
799 /* if (tmpFlag && (unsigned)ABS(q2-q0) < thresholds->beta_in) */
800 q2_asub_q0 = __msa_asub_u_b(q2_org, q0_org);
801 is_less_than_beta = (q2_asub_q0 < beta_in);
802 is_less_than_beta = is_less_than_beta & tmp_flag;
803 negate_is_less_than_beta = __msa_xori_b(is_less_than_beta, 0xff);
804 is_less_than_beta = is_less_than_beta & is_less_than;
805 negate_is_less_than_beta = negate_is_less_than_beta & is_less_than;
806
807 /* combine and store */
808 if (!__msa_test_bz_v(is_less_than_beta)) {
809 v8i16 q3_org_r, q3_org_l;
810 v16u8 q3_org = LD_UB(data + (3 * img_width));
811 v16u8 q1, q2;
812 v8i16 q2_r = { 0 };
813 v8i16 q2_l = { 0 };
814 v8i16 q1_r = { 0 };
815 v8i16 q1_l = { 0 };
816
817 ILVR_B2_SH(zero, q3_org, zero, q2_org, q3_org_r, q2_r);
818 AVC_LPF_P0P1P2_OR_Q0Q1Q2(q3_org_r, q0_org_r, p0_org_r, q1_org_r,
819 q2_r, p1_org_r, q0_r, q1_r, q2_r);
820
821 ILVL_B2_SH(zero, q3_org, zero, q2_org, q3_org_l, q2_l);
822 AVC_LPF_P0P1P2_OR_Q0Q1Q2(q3_org_l, q0_org_l, p0_org_l, q1_org_l,
823 q2_l, p1_org_l, q0_l, q1_l, q2_l);
824
825 PCKEV_B3_UB(q0_l, q0_r, q1_l, q1_r, q2_l, q2_r, q0, q1, q2);
826 q0_org = __msa_bmnz_v(q0_org, q0, is_less_than_beta);
827 q1_org = __msa_bmnz_v(q1_org, q1, is_less_than_beta);
828 q2_org = __msa_bmnz_v(q2_org, q2, is_less_than_beta);
829
830 ST_UB(q1_org, data + img_width);
831 ST_UB(q2_org, data + 2 * img_width);
832 }
833
834 AVC_LPF_P0_OR_Q0(q0_org_r, p1_org_r, q1_org_r, q0_r);
835 AVC_LPF_P0_OR_Q0(q0_org_l, p1_org_l, q1_org_l, q0_l);
836
837 /* combine */
838 q0 = (v16u8) __msa_pckev_b((v16i8) q0_l, (v16i8) q0_r);
839 q0_org = __msa_bmnz_v(q0_org, q0, negate_is_less_than_beta);
840
841 ST_UB(q0_org, data);
842 }
843}
844
846 uint8_t alpha_in,
847 uint8_t beta_in,
848 ptrdiff_t img_width)
849{
850 uint8_t *src = data - 4;
851 v16u8 alpha, beta, p0_asub_q0;
852 v16u8 is_less_than_alpha, is_less_than, is_less_than_beta;
853 v16u8 p3_org, p2_org, p1_org, p0_org, q0_org, q1_org, q2_org, q3_org;
854 v16u8 p1_asub_p0, q1_asub_q0;
855
856
857 {
858 v16u8 row0, row1, row2, row3, row4, row5, row6, row7;
859 v16u8 row8, row9, row10, row11, row12, row13, row14, row15;
860
861 LD_UB8(src, img_width, row0, row1, row2, row3, row4, row5, row6, row7);
862 LD_UB8(src + (8 * img_width), img_width,
863 row8, row9, row10, row11, row12, row13, row14, row15);
864
865 TRANSPOSE16x8_UB_UB(row0, row1, row2, row3,
866 row4, row5, row6, row7,
867 row8, row9, row10, row11,
868 row12, row13, row14, row15,
869 p3_org, p2_org, p1_org, p0_org,
870 q0_org, q1_org, q2_org, q3_org);
871 }
872
873 p0_asub_q0 = __msa_asub_u_b(p0_org, q0_org);
874 p1_asub_p0 = __msa_asub_u_b(p1_org, p0_org);
875 q1_asub_q0 = __msa_asub_u_b(q1_org, q0_org);
876
877 alpha = (v16u8) __msa_fill_b(alpha_in);
878 beta = (v16u8) __msa_fill_b(beta_in);
879
880 is_less_than_alpha = (p0_asub_q0 < alpha);
881 is_less_than_beta = (p1_asub_p0 < beta);
882 is_less_than = is_less_than_beta & is_less_than_alpha;
883 is_less_than_beta = (q1_asub_q0 < beta);
884 is_less_than = is_less_than_beta & is_less_than;
885
886 if (!__msa_test_bz_v(is_less_than)) {
887 v8i16 p0_r = { 0 };
888 v8i16 q0_r = { 0 };
889 v8i16 p0_l = { 0 };
890 v8i16 q0_l = { 0 };
891 v16i8 zero = { 0 };
892 v16u8 tmp_flag, p0, q0, p2_asub_p0, q2_asub_q0;
893 v16u8 negate_is_less_than_beta;
894 v8i16 p1_org_r, p0_org_r, q0_org_r, q1_org_r;
895 v8i16 p1_org_l, p0_org_l, q0_org_l, q1_org_l;
896
897 UNPCK_UB_SH(p1_org, p1_org_r, p1_org_l);
898 UNPCK_UB_SH(p0_org, p0_org_r, p0_org_l);
899 UNPCK_UB_SH(q0_org, q0_org_r, q0_org_l);
900 UNPCK_UB_SH(q1_org, q1_org_r, q1_org_l);
901
902 tmp_flag = alpha >> 2;
903 tmp_flag = tmp_flag + 2;
904 tmp_flag = (p0_asub_q0 < tmp_flag);
905
906 p2_asub_p0 = __msa_asub_u_b(p2_org, p0_org);
907 is_less_than_beta = (p2_asub_p0 < beta);
908 is_less_than_beta = tmp_flag & is_less_than_beta;
909 negate_is_less_than_beta = __msa_xori_b(is_less_than_beta, 0xff);
910 is_less_than_beta = is_less_than_beta & is_less_than;
911 negate_is_less_than_beta = negate_is_less_than_beta & is_less_than;
912
913 if (!__msa_test_bz_v(is_less_than_beta)) {
914 v16u8 p2, p1;
915 v8i16 p3_org_r, p3_org_l;
916 v8i16 p2_l = { 0 };
917 v8i16 p2_r = { 0 };
918 v8i16 p1_l = { 0 };
919 v8i16 p1_r = { 0 };
920
921 ILVR_B2_SH(zero, p3_org, zero, p2_org, p3_org_r, p2_r);
922 AVC_LPF_P0P1P2_OR_Q0Q1Q2(p3_org_r, p0_org_r, q0_org_r, p1_org_r,
923 p2_r, q1_org_r, p0_r, p1_r, p2_r);
924
925 ILVL_B2_SH(zero, p3_org, zero, p2_org, p3_org_l, p2_l);
926 AVC_LPF_P0P1P2_OR_Q0Q1Q2(p3_org_l, p0_org_l, q0_org_l, p1_org_l,
927 p2_l, q1_org_l, p0_l, p1_l, p2_l);
928
929 PCKEV_B3_UB(p0_l, p0_r, p1_l, p1_r, p2_l, p2_r, p0, p1, p2);
930 p0_org = __msa_bmnz_v(p0_org, p0, is_less_than_beta);
931 p1_org = __msa_bmnz_v(p1_org, p1, is_less_than_beta);
932 p2_org = __msa_bmnz_v(p2_org, p2, is_less_than_beta);
933 }
934
935 AVC_LPF_P0_OR_Q0(p0_org_r, q1_org_r, p1_org_r, p0_r);
936 AVC_LPF_P0_OR_Q0(p0_org_l, q1_org_l, p1_org_l, p0_l);
937
938 p0 = (v16u8) __msa_pckev_b((v16i8) p0_l, (v16i8) p0_r);
939 p0_org = __msa_bmnz_v(p0_org, p0, negate_is_less_than_beta);
940
941 q2_asub_q0 = __msa_asub_u_b(q2_org, q0_org);
942 is_less_than_beta = (q2_asub_q0 < beta);
943
944 is_less_than_beta = is_less_than_beta & tmp_flag;
945 negate_is_less_than_beta = __msa_xori_b(is_less_than_beta, 0xff);
946
947 is_less_than_beta = is_less_than_beta & is_less_than;
948 negate_is_less_than_beta = negate_is_less_than_beta & is_less_than;
949
950 if (!__msa_test_bz_v(is_less_than_beta)) {
951 v16u8 q1, q2;
952 v8i16 q3_org_r, q3_org_l;
953 v8i16 q1_l = { 0 };
954 v8i16 q1_r = { 0 };
955 v8i16 q2_l = { 0 };
956 v8i16 q2_r = { 0 };
957
958 ILVR_B2_SH(zero, q3_org, zero, q2_org, q3_org_r, q2_r);
959 AVC_LPF_P0P1P2_OR_Q0Q1Q2(q3_org_r, q0_org_r, p0_org_r, q1_org_r,
960 q2_r, p1_org_r, q0_r, q1_r, q2_r);
961
962 ILVL_B2_SH(zero, q3_org, zero, q2_org, q3_org_l, q2_l);
963 AVC_LPF_P0P1P2_OR_Q0Q1Q2(q3_org_l, q0_org_l, p0_org_l, q1_org_l,
964 q2_l, p1_org_l, q0_l, q1_l, q2_l);
965
966 PCKEV_B3_UB(q0_l, q0_r, q1_l, q1_r, q2_l, q2_r, q0, q1, q2);
967 q0_org = __msa_bmnz_v(q0_org, q0, is_less_than_beta);
968 q1_org = __msa_bmnz_v(q1_org, q1, is_less_than_beta);
969 q2_org = __msa_bmnz_v(q2_org, q2, is_less_than_beta);
970 }
971
972 AVC_LPF_P0_OR_Q0(q0_org_r, p1_org_r, q1_org_r, q0_r);
973 AVC_LPF_P0_OR_Q0(q0_org_l, p1_org_l, q1_org_l, q0_l);
974
975 q0 = (v16u8) __msa_pckev_b((v16i8) q0_l, (v16i8) q0_r);
976 q0_org = __msa_bmnz_v(q0_org, q0, negate_is_less_than_beta);
977
978 {
979 v8i16 tp0, tp1, tp2, tp3, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
980
981 ILVRL_B2_SH(p1_org, p2_org, tp0, tp2);
982 ILVRL_B2_SH(q0_org, p0_org, tp1, tp3);
983 ILVRL_B2_SH(q2_org, q1_org, tmp2, tmp5);
984
985 ILVRL_H2_SH(tp1, tp0, tmp3, tmp4);
986 ILVRL_H2_SH(tp3, tp2, tmp6, tmp7);
987
988 src = data - 3;
989 ST_W4(tmp3, 0, 1, 2, 3, src, img_width);
990 ST_H4(tmp2, 0, 1, 2, 3, src + 4, img_width);
991 src += 4 * img_width;
992 ST_W4(tmp4, 0, 1, 2, 3, src, img_width);
993 ST_H4(tmp2, 4, 5, 6, 7, src + 4, img_width);
994 src += 4 * img_width;
995
996 ST_W4(tmp6, 0, 1, 2, 3, src, img_width);
997 ST_H4(tmp5, 0, 1, 2, 3, src + 4, img_width);
998 src += 4 * img_width;
999 ST_W4(tmp7, 0, 1, 2, 3, src, img_width);
1000 ST_H4(tmp5, 4, 5, 6, 7, src + 4, img_width);
1001 }
1002 }
1003}
1004
1006 ptrdiff_t stride,
1007 int32_t alpha_in,
1008 int32_t beta_in)
1009{
1010 uint64_t load0, load1;
1011 uint32_t out0, out2;
1012 uint16_t out1, out3;
1013 v8u16 src0_r, src1_r, src2_r, src3_r, src4_r, src5_r, src6_r, src7_r;
1014 v8u16 dst0_r, dst1_r, dst4_r, dst5_r;
1015 v8u16 dst2_x_r, dst2_y_r, dst3_x_r, dst3_y_r;
1016 v16u8 dst0, dst1, dst4, dst5, dst2_x, dst2_y, dst3_x, dst3_y;
1017 v8i16 tmp0, tmp1, tmp2, tmp3;
1018 v16u8 alpha, beta;
1019 v16u8 p0_asub_q0, p1_asub_p0, q1_asub_q0, p2_asub_p0, q2_asub_q0;
1020 v16u8 is_less_than, is_less_than_alpha, is_less_than_beta;
1021 v16u8 is_less_than_beta1, is_less_than_beta2;
1022 v16i8 src0 = { 0 };
1023 v16i8 src1 = { 0 };
1024 v16i8 src2 = { 0 };
1025 v16i8 src3 = { 0 };
1026 v16i8 src4 = { 0 };
1027 v16i8 src5 = { 0 };
1028 v16i8 src6 = { 0 };
1029 v16i8 src7 = { 0 };
1030 v16i8 zeros = { 0 };
1031
1032 load0 = LD(src - 4);
1033 load1 = LD(src + stride - 4);
1034 src0 = (v16i8) __msa_insert_d((v2i64) src0, 0, load0);
1035 src1 = (v16i8) __msa_insert_d((v2i64) src1, 0, load1);
1036
1037 load0 = LD(src + (2 * stride) - 4);
1038 load1 = LD(src + (3 * stride) - 4);
1039 src2 = (v16i8) __msa_insert_d((v2i64) src2, 0, load0);
1040 src3 = (v16i8) __msa_insert_d((v2i64) src3, 0, load1);
1041
1042 load0 = LD(src + (4 * stride) - 4);
1043 load1 = LD(src + (5 * stride) - 4);
1044 src4 = (v16i8) __msa_insert_d((v2i64) src4, 0, load0);
1045 src5 = (v16i8) __msa_insert_d((v2i64) src5, 0, load1);
1046
1047 load0 = LD(src + (6 * stride) - 4);
1048 load1 = LD(src + (7 * stride) - 4);
1049 src6 = (v16i8) __msa_insert_d((v2i64) src6, 0, load0);
1050 src7 = (v16i8) __msa_insert_d((v2i64) src7, 0, load1);
1051
1052 ILVR_B4_SB(src1, src0, src3, src2, src5, src4, src7, src6,
1053 src0, src1, src2, src3);
1054
1055 ILVR_H2_SH(src1, src0, src3, src2, tmp0, tmp2);
1056 ILVL_H2_SH(src1, src0, src3, src2, tmp1, tmp3);
1057
1058 ILVR_W2_SB(tmp2, tmp0, tmp3, tmp1, src6, src3);
1059 ILVL_W2_SB(tmp2, tmp0, tmp3, tmp1, src1, src5);
1060 SLDI_B4_SB(zeros, src6, zeros, src1, zeros, src3, zeros, src5,
1061 8, src0, src2, src4, src7);
1062
1063 p0_asub_q0 = __msa_asub_u_b((v16u8) src2, (v16u8) src3);
1064 p1_asub_p0 = __msa_asub_u_b((v16u8) src1, (v16u8) src2);
1065 q1_asub_q0 = __msa_asub_u_b((v16u8) src4, (v16u8) src3);
1066
1067 alpha = (v16u8) __msa_fill_b(alpha_in);
1068 beta = (v16u8) __msa_fill_b(beta_in);
1069
1070 is_less_than_alpha = (p0_asub_q0 < alpha);
1071 is_less_than_beta = (p1_asub_p0 < beta);
1072 is_less_than = is_less_than_alpha & is_less_than_beta;
1073 is_less_than_beta = (q1_asub_q0 < beta);
1074 is_less_than = is_less_than & is_less_than_beta;
1075
1076 alpha >>= 2;
1077 alpha += 2;
1078
1079 is_less_than_alpha = (p0_asub_q0 < alpha);
1080
1081 p2_asub_p0 = __msa_asub_u_b((v16u8) src0, (v16u8) src2);
1082 is_less_than_beta1 = (p2_asub_p0 < beta);
1083 q2_asub_q0 = __msa_asub_u_b((v16u8) src5, (v16u8) src3);
1084 is_less_than_beta2 = (q2_asub_q0 < beta);
1085
1086 ILVR_B4_UH(zeros, src0, zeros, src1, zeros, src2, zeros, src3,
1087 src0_r, src1_r, src2_r, src3_r);
1088 ILVR_B4_UH(zeros, src4, zeros, src5, zeros, src6, zeros, src7,
1089 src4_r, src5_r, src6_r, src7_r);
1090
1091 dst2_x_r = src1_r + src2_r + src3_r;
1092 dst2_x_r = src0_r + (2 * (dst2_x_r)) + src4_r;
1093 dst2_x_r = (v8u16) __msa_srari_h((v8i16) dst2_x_r, 3);
1094 dst1_r = src0_r + src1_r + src2_r + src3_r;
1095 dst1_r = (v8u16) __msa_srari_h((v8i16) dst1_r, 2);
1096
1097 dst0_r = (2 * src6_r) + (3 * src0_r);
1098 dst0_r += src1_r + src2_r + src3_r;
1099 dst0_r = (v8u16) __msa_srari_h((v8i16) dst0_r, 3);
1100 dst2_y_r = (2 * src1_r) + src2_r + src4_r;
1101 dst2_y_r = (v8u16) __msa_srari_h((v8i16) dst2_y_r, 2);
1102
1103 PCKEV_B2_UB(dst2_x_r, dst2_x_r, dst2_y_r, dst2_y_r, dst2_x, dst2_y);
1104 dst2_x = __msa_bmnz_v(dst2_y, dst2_x, is_less_than_beta1);
1105
1106 dst3_x_r = src2_r + src3_r + src4_r;
1107 dst3_x_r = src1_r + (2 * dst3_x_r) + src5_r;
1108 dst3_x_r = (v8u16) __msa_srari_h((v8i16) dst3_x_r, 3);
1109 dst4_r = src2_r + src3_r + src4_r + src5_r;
1110 dst4_r = (v8u16) __msa_srari_h((v8i16) dst4_r, 2);
1111
1112 dst5_r = (2 * src7_r) + (3 * src5_r);
1113 dst5_r += src4_r + src3_r + src2_r;
1114 dst5_r = (v8u16) __msa_srari_h((v8i16) dst5_r, 3);
1115 dst3_y_r = (2 * src4_r) + src3_r + src1_r;
1116 dst3_y_r = (v8u16) __msa_srari_h((v8i16) dst3_y_r, 2);
1117
1118 PCKEV_B2_UB(dst3_x_r, dst3_x_r, dst3_y_r, dst3_y_r, dst3_x, dst3_y);
1119 dst3_x = __msa_bmnz_v(dst3_y, dst3_x, is_less_than_beta2);
1120
1121 dst2_y_r = (2 * src1_r) + src2_r + src4_r;
1122 dst2_y_r = (v8u16) __msa_srari_h((v8i16) dst2_y_r, 2);
1123 dst3_y_r = (2 * src4_r) + src3_r + src1_r;
1124 dst3_y_r = (v8u16) __msa_srari_h((v8i16) dst3_y_r, 2);
1125
1126 PCKEV_B2_UB(dst2_y_r, dst2_y_r, dst3_y_r, dst3_y_r, dst2_y, dst3_y);
1127
1128 dst2_x = __msa_bmnz_v(dst2_y, dst2_x, is_less_than_alpha);
1129 dst3_x = __msa_bmnz_v(dst3_y, dst3_x, is_less_than_alpha);
1130 dst2_x = __msa_bmnz_v((v16u8) src2, dst2_x, is_less_than);
1131 dst3_x = __msa_bmnz_v((v16u8) src3, dst3_x, is_less_than);
1132
1133 is_less_than = is_less_than_alpha & is_less_than;
1134 dst1 = (v16u8) __msa_pckev_b((v16i8) dst1_r, (v16i8) dst1_r);
1135 is_less_than_beta1 = is_less_than_beta1 & is_less_than;
1136 dst1 = __msa_bmnz_v((v16u8) src1, dst1, is_less_than_beta1);
1137
1138 dst0 = (v16u8) __msa_pckev_b((v16i8) dst0_r, (v16i8) dst0_r);
1139 dst0 = __msa_bmnz_v((v16u8) src0, dst0, is_less_than_beta1);
1140 dst4 = (v16u8) __msa_pckev_b((v16i8) dst4_r, (v16i8) dst4_r);
1141 is_less_than_beta2 = is_less_than_beta2 & is_less_than;
1142 dst4 = __msa_bmnz_v((v16u8) src4, dst4, is_less_than_beta2);
1143 dst5 = (v16u8) __msa_pckev_b((v16i8) dst5_r, (v16i8) dst5_r);
1144 dst5 = __msa_bmnz_v((v16u8) src5, dst5, is_less_than_beta2);
1145
1146 ILVR_B2_UB(dst1, dst0, dst3_x, dst2_x, dst0, dst1);
1147 dst2_x = (v16u8) __msa_ilvr_b((v16i8) dst5, (v16i8) dst4);
1148 ILVRL_H2_SH(dst1, dst0, tmp0, tmp1);
1149 ILVRL_H2_SH(zeros, dst2_x, tmp2, tmp3);
1150
1151 ILVR_W2_UB(tmp2, tmp0, tmp3, tmp1, dst0, dst4);
1152 SLDI_B2_UB(zeros, dst0, zeros, dst4, 8, dst1, dst5);
1153 dst2_x = (v16u8) __msa_ilvl_w((v4i32) tmp2, (v4i32) tmp0);
1154 dst2_y = (v16u8) __msa_ilvl_w((v4i32) tmp3, (v4i32) tmp1);
1155 SLDI_B2_UB(zeros, dst2_x, zeros, dst2_y, 8, dst3_x, dst3_y);
1156
1157 out0 = __msa_copy_u_w((v4i32) dst0, 0);
1158 out1 = __msa_copy_u_h((v8i16) dst0, 2);
1159 out2 = __msa_copy_u_w((v4i32) dst1, 0);
1160 out3 = __msa_copy_u_h((v8i16) dst1, 2);
1161
1162 SW(out0, (src - 3));
1163 SH(out1, (src + 1));
1164 src += stride;
1165 SW(out2, (src - 3));
1166 SH(out3, (src + 1));
1167 src += stride;
1168
1169 out0 = __msa_copy_u_w((v4i32) dst2_x, 0);
1170 out1 = __msa_copy_u_h((v8i16) dst2_x, 2);
1171 out2 = __msa_copy_u_w((v4i32) dst3_x, 0);
1172 out3 = __msa_copy_u_h((v8i16) dst3_x, 2);
1173
1174 SW(out0, (src - 3));
1175 SH(out1, (src + 1));
1176 src += stride;
1177 SW(out2, (src - 3));
1178 SH(out3, (src + 1));
1179 src += stride;
1180
1181 out0 = __msa_copy_u_w((v4i32) dst4, 0);
1182 out1 = __msa_copy_u_h((v8i16) dst4, 2);
1183 out2 = __msa_copy_u_w((v4i32) dst5, 0);
1184 out3 = __msa_copy_u_h((v8i16) dst5, 2);
1185
1186 SW(out0, (src - 3));
1187 SH(out1, (src + 1));
1188 src += stride;
1189 SW(out2, (src - 3));
1190 SH(out3, (src + 1));
1191 src += stride;
1192
1193 out0 = __msa_copy_u_w((v4i32) dst2_y, 0);
1194 out1 = __msa_copy_u_h((v8i16) dst2_y, 2);
1195 out2 = __msa_copy_u_w((v4i32) dst3_y, 0);
1196 out3 = __msa_copy_u_h((v8i16) dst3_y, 2);
1197
1198 SW(out0, (src - 3));
1199 SH(out1, (src + 1));
1200 src += stride;
1201 SW(out2, (src - 3));
1202 SH(out3, (src + 1));
1203}
1204
1205static void avc_loopfilter_cb_or_cr_intra_edge_hor_msa(uint8_t *data_cb_or_cr,
1206 uint8_t alpha_in,
1207 uint8_t beta_in,
1208 ptrdiff_t img_width)
1209{
1210 v16u8 alpha, beta;
1211 v16u8 is_less_than;
1212 v8i16 p0_or_q0, q0_or_p0;
1213 v16u8 p1_or_q1_org, p0_or_q0_org, q0_or_p0_org, q1_or_p1_org;
1214 v16i8 zero = { 0 };
1215 v16u8 p0_asub_q0, p1_asub_p0, q1_asub_q0;
1216 v16u8 is_less_than_alpha, is_less_than_beta;
1217 v8i16 p1_org_r, p0_org_r, q0_org_r, q1_org_r;
1218
1219 alpha = (v16u8) __msa_fill_b(alpha_in);
1220 beta = (v16u8) __msa_fill_b(beta_in);
1221
1222 LD_UB4(data_cb_or_cr - (img_width << 1), img_width,
1223 p1_or_q1_org, p0_or_q0_org, q0_or_p0_org, q1_or_p1_org);
1224
1225 p0_asub_q0 = __msa_asub_u_b(p0_or_q0_org, q0_or_p0_org);
1226 p1_asub_p0 = __msa_asub_u_b(p1_or_q1_org, p0_or_q0_org);
1227 q1_asub_q0 = __msa_asub_u_b(q1_or_p1_org, q0_or_p0_org);
1228
1229 is_less_than_alpha = (p0_asub_q0 < alpha);
1230 is_less_than_beta = (p1_asub_p0 < beta);
1231 is_less_than = is_less_than_beta & is_less_than_alpha;
1232 is_less_than_beta = (q1_asub_q0 < beta);
1233 is_less_than = is_less_than_beta & is_less_than;
1234
1235 is_less_than = (v16u8) __msa_ilvr_d((v2i64) zero, (v2i64) is_less_than);
1236
1237 if (!__msa_test_bz_v(is_less_than)) {
1238 ILVR_B4_SH(zero, p1_or_q1_org, zero, p0_or_q0_org, zero, q0_or_p0_org,
1239 zero, q1_or_p1_org, p1_org_r, p0_org_r, q0_org_r, q1_org_r);
1240 AVC_LPF_P0_OR_Q0(p0_org_r, q1_org_r, p1_org_r, p0_or_q0);
1241 AVC_LPF_P0_OR_Q0(q0_org_r, p1_org_r, q1_org_r, q0_or_p0);
1242 PCKEV_B2_SH(zero, p0_or_q0, zero, q0_or_p0, p0_or_q0, q0_or_p0);
1243
1244 p0_or_q0_org =
1245 __msa_bmnz_v(p0_or_q0_org, (v16u8) p0_or_q0, is_less_than);
1246 q0_or_p0_org =
1247 __msa_bmnz_v(q0_or_p0_org, (v16u8) q0_or_p0, is_less_than);
1248
1249 ST_UB(q0_or_p0_org, data_cb_or_cr);
1250 ST_UB(p0_or_q0_org, data_cb_or_cr - img_width);
1251 }
1252}
1253
1254static void avc_loopfilter_cb_or_cr_intra_edge_ver_msa(uint8_t *data_cb_or_cr,
1255 uint8_t alpha_in,
1256 uint8_t beta_in,
1257 ptrdiff_t img_width)
1258{
1259 v8i16 tmp1;
1260 v16u8 alpha, beta, is_less_than;
1261 v8i16 p0_or_q0, q0_or_p0;
1262 v16u8 p1_or_q1_org, p0_or_q0_org, q0_or_p0_org, q1_or_p1_org;
1263 v16i8 zero = { 0 };
1264 v16u8 p0_asub_q0, p1_asub_p0, q1_asub_q0;
1265 v16u8 is_less_than_alpha, is_less_than_beta;
1266 v8i16 p1_org_r, p0_org_r, q0_org_r, q1_org_r;
1267
1268 {
1269 v16u8 row0, row1, row2, row3, row4, row5, row6, row7;
1270
1271 LD_UB8((data_cb_or_cr - 2), img_width,
1272 row0, row1, row2, row3, row4, row5, row6, row7);
1273
1274 TRANSPOSE8x4_UB_UB(row0, row1, row2, row3, row4, row5, row6, row7,
1275 p1_or_q1_org, p0_or_q0_org,
1276 q0_or_p0_org, q1_or_p1_org);
1277 }
1278
1279 alpha = (v16u8) __msa_fill_b(alpha_in);
1280 beta = (v16u8) __msa_fill_b(beta_in);
1281
1282 p0_asub_q0 = __msa_asub_u_b(p0_or_q0_org, q0_or_p0_org);
1283 p1_asub_p0 = __msa_asub_u_b(p1_or_q1_org, p0_or_q0_org);
1284 q1_asub_q0 = __msa_asub_u_b(q1_or_p1_org, q0_or_p0_org);
1285
1286 is_less_than_alpha = (p0_asub_q0 < alpha);
1287 is_less_than_beta = (p1_asub_p0 < beta);
1288 is_less_than = is_less_than_beta & is_less_than_alpha;
1289 is_less_than_beta = (q1_asub_q0 < beta);
1290 is_less_than = is_less_than_beta & is_less_than;
1291 is_less_than = (v16u8) __msa_ilvr_d((v2i64) zero, (v2i64) is_less_than);
1292
1293 if (!__msa_test_bz_v(is_less_than)) {
1294 ILVR_B4_SH(zero, p1_or_q1_org, zero, p0_or_q0_org, zero, q0_or_p0_org,
1295 zero, q1_or_p1_org, p1_org_r, p0_org_r, q0_org_r, q1_org_r);
1296
1297 AVC_LPF_P0_OR_Q0(p0_org_r, q1_org_r, p1_org_r, p0_or_q0);
1298 AVC_LPF_P0_OR_Q0(q0_org_r, p1_org_r, q1_org_r, q0_or_p0);
1299
1300 /* convert 16 bit output into 8 bit output */
1301 PCKEV_B2_SH(zero, p0_or_q0, zero, q0_or_p0, p0_or_q0, q0_or_p0);
1302
1303 p0_or_q0_org =
1304 __msa_bmnz_v(p0_or_q0_org, (v16u8) p0_or_q0, is_less_than);
1305 q0_or_p0_org =
1306 __msa_bmnz_v(q0_or_p0_org, (v16u8) q0_or_p0, is_less_than);
1307 tmp1 = (v8i16) __msa_ilvr_b((v16i8) q0_or_p0_org, (v16i8) p0_or_q0_org);
1308
1309 data_cb_or_cr -= 1;
1310 ST_H4(tmp1, 0, 1, 2, 3, data_cb_or_cr, img_width);
1311 data_cb_or_cr += 4 * img_width;
1312 ST_H4(tmp1, 4, 5, 6, 7, data_cb_or_cr, img_width);
1313 }
1314}
1315
1316static void avc_loopfilter_luma_inter_edge_ver_msa(uint8_t* pPix, uint32_t iStride,
1317 uint8_t iAlpha, uint8_t iBeta,
1318 uint8_t* pTc)
1319{
1320 v16u8 p0, p1, p2, q0, q1, q2;
1321 v16i8 iTc, negiTc, negTc, flags, f;
1322 v8i16 p0_l, p0_r, p1_l, p1_r, p2_l, p2_r, q0_l, q0_r, q1_l, q1_r, q2_l, q2_r;
1323 v8i16 tc_l, tc_r, negTc_l, negTc_r;
1324 v8i16 iTc_l, iTc_r, negiTc_l, negiTc_r;
1325 // Use for temporary variable
1326 v8i16 t0, t1, t2, t3;
1327 v16u8 alpha, beta;
1328 v16u8 bDetaP0Q0, bDetaP1P0, bDetaQ1Q0, bDetaP2P0, bDetaQ2Q0;
1329 v16i8 const_1_b = __msa_ldi_b(1);
1330 v8i16 const_1_h = __msa_ldi_h(1);
1331 v8i16 const_4_h = __msa_ldi_h(4);
1332 v8i16 const_not_255_h = __msa_ldi_h(~255);
1333 v16i8 zero = { 0 };
1334 v16i8 tc = { pTc[0 >> 2], pTc[1 >> 2], pTc[2 >> 2], pTc[3 >> 2],
1335 pTc[4 >> 2], pTc[5 >> 2], pTc[6 >> 2], pTc[7 >> 2],
1336 pTc[8 >> 2], pTc[9 >> 2], pTc[10 >> 2], pTc[11 >> 2],
1337 pTc[12 >> 2], pTc[13 >> 2], pTc[14 >> 2], pTc[15 >> 2] };
1338 negTc = zero - tc;
1339 iTc = tc;
1340
1341 // Load data from pPix
1342 LD_SH8(pPix - 3, iStride, t0, t1, t2, t3, q1_l, q1_r, q2_l, q2_r);
1343 LD_SH8(pPix + 8 * iStride - 3, iStride, p0_l, p0_r, p1_l, p1_r,
1344 p2_l, p2_r, q0_l, q0_r);
1345 TRANSPOSE16x8_UB_UB(t0, t1, t2, t3, q1_l, q1_r, q2_l, q2_r,
1346 p0_l, p0_r, p1_l, p1_r, p2_l, p2_r, q0_l, q0_r,
1347 p2, p1, p0, q0, q1, q2, alpha, beta);
1348
1349 alpha = (v16u8)__msa_fill_b(iAlpha);
1350 beta = (v16u8)__msa_fill_b(iBeta);
1351
1352 bDetaP0Q0 = __msa_asub_u_b(p0, q0);
1353 bDetaP1P0 = __msa_asub_u_b(p1, p0);
1354 bDetaQ1Q0 = __msa_asub_u_b(q1, q0);
1355 bDetaP2P0 = __msa_asub_u_b(p2, p0);
1356 bDetaQ2Q0 = __msa_asub_u_b(q2, q0);
1357 bDetaP0Q0 = (v16u8)__msa_clt_u_b(bDetaP0Q0, alpha);
1358 bDetaP1P0 = (v16u8)__msa_clt_u_b(bDetaP1P0, beta);
1359 bDetaQ1Q0 = (v16u8)__msa_clt_u_b(bDetaQ1Q0, beta);
1360 bDetaP2P0 = (v16u8)__msa_clt_u_b(bDetaP2P0, beta);
1361 bDetaQ2Q0 = (v16u8)__msa_clt_u_b(bDetaQ2Q0, beta);
1362
1363 // Unsigned extend p0, p1, p2, q0, q1, q2 from 8 bits to 16 bits
1364 ILVRL_B2_SH(zero, p0, p0_r, p0_l);
1365 ILVRL_B2_SH(zero, p1, p1_r, p1_l);
1366 ILVRL_B2_SH(zero, p2, p2_r, p2_l);
1367 ILVRL_B2_SH(zero, q0, q0_r, q0_l);
1368 ILVRL_B2_SH(zero, q1, q1_r, q1_l);
1369 ILVRL_B2_SH(zero, q2, q2_r, q2_l);
1370 // Signed extend tc, negTc from 8 bits to 16 bits
1371 flags = __msa_clt_s_b(tc, zero);
1372 ILVRL_B2(v8i16, flags, tc, tc_r, tc_l);
1373 flags = __msa_clt_s_b(negTc, zero);
1374 ILVRL_B2(v8i16, flags, negTc, negTc_r, negTc_l);
1375
1376 f = (v16i8)bDetaP0Q0 & (v16i8)bDetaP1P0 & (v16i8)bDetaQ1Q0;
1377 flags = f & (v16i8)bDetaP2P0;
1378 flags = __msa_ceq_b(flags, zero);
1379 iTc += ((~flags) & const_1_b);
1380 flags = f & (v16i8)bDetaQ2Q0;
1381 flags = __msa_ceq_b(flags, zero);
1382 iTc += ((~flags) & const_1_b);
1383 negiTc = zero - iTc;
1384 // Signed extend iTc, negiTc from 8 bits to 16 bits
1385 flags = __msa_clt_s_b(iTc, zero);
1386 ILVRL_B2(v8i16, flags, iTc, iTc_r, iTc_l);
1387 flags = __msa_clt_s_b(negiTc, zero);
1388 ILVRL_B2(v8i16, flags, negiTc, negiTc_r, negiTc_l);
1389
1390 // Calculate the left part
1391 // p1
1392 t0 = (p2_l + ((p0_l + q0_l + const_1_h) >> 1) - (p1_l << 1)) >> 1;
1393 t0 = __msa_max_s_h(negTc_l, t0);
1394 t0 = __msa_min_s_h(tc_l, t0);
1395 t1 = p1_l + t0;
1396 // q1
1397 t0 = (q2_l + ((p0_l + q0_l + const_1_h) >> 1) - (q1_l << 1)) >> 1;
1398 t0 = __msa_max_s_h(negTc_l, t0);
1399 t0 = __msa_min_s_h(tc_l, t0);
1400 t2 = q1_l + t0;
1401 // iDeta
1402 t0 = (((q0_l - p0_l) << 2) + (p1_l - q1_l) + const_4_h) >> 3;
1403 t0 = __msa_max_s_h(negiTc_l, t0);
1404 t0 = __msa_min_s_h(iTc_l, t0);
1405 p1_l = t1;
1406 q1_l = t2;
1407 // p0
1408 t1 = p0_l + t0;
1409 t2 = t1 & const_not_255_h;
1410 t3 = __msa_cle_s_h((v8i16)zero, t1);
1411 flags = (v16i8)__msa_ceq_h(t2, (v8i16)zero);
1412 p0_l = (t1 & (v8i16)flags) + (t3 & (v8i16)(~flags));
1413 // q0
1414 t1 = q0_l - t0;
1415 t2 = t1 & const_not_255_h;
1416 t3 = __msa_cle_s_h((v8i16)zero, t1);
1417 flags = (v16i8)__msa_ceq_h(t2, (v8i16)zero);
1418 q0_l = (t1 & (v8i16)flags) + (t3 & (v8i16)(~flags));
1419
1420 // Calculate the right part
1421 // p1
1422 t0 = (p2_r + ((p0_r + q0_r + const_1_h) >> 1) - (p1_r << 1)) >> 1;
1423 t0 = __msa_max_s_h(negTc_r, t0);
1424 t0 = __msa_min_s_h(tc_r, t0);
1425 t1 = p1_r + t0;
1426 // q1
1427 t0 = (q2_r + ((p0_r + q0_r + const_1_h) >> 1) - (q1_r << 1)) >> 1;
1428 t0 = __msa_max_s_h(negTc_r, t0);
1429 t0 = __msa_min_s_h(tc_r, t0);
1430 t2 = q1_r + t0;
1431 // iDeta
1432 t0 = (((q0_r - p0_r) << 2) + (p1_r - q1_r) + const_4_h) >> 3;
1433 t0 = __msa_max_s_h(negiTc_r, t0);
1434 t0 = __msa_min_s_h(iTc_r, t0);
1435 p1_r = t1;
1436 q1_r = t2;
1437 // p0
1438 t1 = p0_r + t0;
1439 t2 = t1 & const_not_255_h;
1440 t3 = __msa_cle_s_h((v8i16)zero, t1);
1441 flags = (v16i8)__msa_ceq_h(t2, (v8i16)zero);
1442 p0_r = (t1 & (v8i16)flags) + (t3 & (v8i16)(~flags));
1443 // q0
1444 t1 = q0_r - t0;
1445 t2 = t1 & const_not_255_h;
1446 t3 = __msa_cle_s_h((v8i16)zero, t1);
1447 flags = (v16i8)__msa_ceq_h(t2, (v8i16)zero);
1448 q0_r = (t1 & (v8i16)flags) + (t3 & (v8i16)(~flags));
1449
1450 // Combined left and right
1451 PCKEV_B4(v8i16, p1_l, p1_r, p0_l, p0_r, q0_l, q0_r, q1_l, q1_r,
1452 t0, t1, t2, t3);
1453 flags = (v16i8)__msa_cle_s_b(zero, tc);
1454 flags &= f;
1455 p0 = (v16u8)(((v16i8)t1 & flags) + (p0 & (~flags)));
1456 q0 = (v16u8)(((v16i8)t2 & flags) + (q0 & (~flags)));
1457 // Using t1, t2 as temporary flags
1458 t1 = (v8i16)(flags & (~(__msa_ceq_b((v16i8)bDetaP2P0, zero))));
1459 p1 = (v16u8)(t0 & t1) + (p1 & (v16u8)(~t1));
1460 t2 = (v8i16)(flags & (~(__msa_ceq_b((v16i8)bDetaQ2Q0, zero))));
1461 q1 = (v16u8)(t3 & t2) + (q1 & (v16u8)(~t2));
1462
1463 ILVRL_B2_SH(p0, p1, t0, t1);
1464 ILVRL_B2_SH(q1, q0, t2, t3);
1465 ILVRL_H2_UB(t2, t0, p1, p0);
1466 ILVRL_H2_UB(t3, t1, q0, q1);
1467 // Store data to pPix
1468 ST_W8(p1, p0, 0, 1, 2, 3, 0, 1, 2, 3, pPix - 2, iStride);
1469 ST_W8(q0, q1, 0, 1, 2, 3, 0, 1, 2, 3, pPix + 8 * iStride - 2, iStride);
1470}
1471
1473 uint8_t bs0, uint8_t bs1,
1474 uint8_t bs2, uint8_t bs3,
1475 uint8_t tc0, uint8_t tc1,
1476 uint8_t tc2, uint8_t tc3,
1477 uint8_t alpha_in,
1478 uint8_t beta_in,
1479 ptrdiff_t image_width)
1480{
1481 v16u8 tmp_vec;
1482 v16u8 bs = { 0 };
1483
1484 tmp_vec = (v16u8) __msa_fill_b(bs0);
1485 bs = (v16u8) __msa_insve_w((v4i32) bs, 0, (v4i32) tmp_vec);
1486 tmp_vec = (v16u8) __msa_fill_b(bs1);
1487 bs = (v16u8) __msa_insve_w((v4i32) bs, 1, (v4i32) tmp_vec);
1488 tmp_vec = (v16u8) __msa_fill_b(bs2);
1489 bs = (v16u8) __msa_insve_w((v4i32) bs, 2, (v4i32) tmp_vec);
1490 tmp_vec = (v16u8) __msa_fill_b(bs3);
1491 bs = (v16u8) __msa_insve_w((v4i32) bs, 3, (v4i32) tmp_vec);
1492
1493 if (!__msa_test_bz_v(bs)) {
1494 v16u8 alpha, beta, is_less_than, is_less_than_beta;
1495 v16u8 p0, q0, p2_org, p1_org, p0_org, q0_org, q1_org, q2_org;
1496 v16u8 p0_asub_q0, p1_asub_p0, q1_asub_q0;
1497 v16u8 is_less_than_alpha, is_bs_greater_than0;
1498 v8i16 p0_r, q0_r, p0_l, q0_l;
1499 v8i16 p1_org_r, p0_org_r, q0_org_r, q1_org_r;
1500 v8i16 p1_org_l, p0_org_l, q0_org_l, q1_org_l;
1501 v16i8 zero = { 0 };
1502 v16i8 tc = { 0 };
1503
1504 tmp_vec = (v16u8) __msa_fill_b(tc0);
1505 tc = (v16i8) __msa_insve_w((v4i32) tc, 0, (v4i32) tmp_vec);
1506 tmp_vec = (v16u8) __msa_fill_b(tc1);
1507 tc = (v16i8) __msa_insve_w((v4i32) tc, 1, (v4i32) tmp_vec);
1508 tmp_vec = (v16u8) __msa_fill_b(tc2);
1509 tc = (v16i8) __msa_insve_w((v4i32) tc, 2, (v4i32) tmp_vec);
1510 tmp_vec = (v16u8) __msa_fill_b(tc3);
1511 tc = (v16i8) __msa_insve_w((v4i32) tc, 3, (v4i32) tmp_vec);
1512
1513 alpha = (v16u8) __msa_fill_b(alpha_in);
1514 beta = (v16u8) __msa_fill_b(beta_in);
1515
1516 LD_UB5(data - (3 * image_width), image_width,
1517 p2_org, p1_org, p0_org, q0_org, q1_org);
1518
1519 is_bs_greater_than0 = ((v16u8) zero < bs);
1520 p0_asub_q0 = __msa_asub_u_b(p0_org, q0_org);
1521 p1_asub_p0 = __msa_asub_u_b(p1_org, p0_org);
1522 q1_asub_q0 = __msa_asub_u_b(q1_org, q0_org);
1523
1524 is_less_than_alpha = (p0_asub_q0 < alpha);
1525 is_less_than_beta = (p1_asub_p0 < beta);
1526 is_less_than = is_less_than_beta & is_less_than_alpha;
1527 is_less_than_beta = (q1_asub_q0 < beta);
1528 is_less_than = is_less_than_beta & is_less_than;
1529 is_less_than = is_less_than & is_bs_greater_than0;
1530
1531 if (!__msa_test_bz_v(is_less_than)) {
1532 v16i8 sign_negate_tc, negate_tc;
1533 v8i16 negate_tc_r, i16_negatetc_l, tc_l, tc_r;
1534 v16u8 p2_asub_p0, q2_asub_q0;
1535
1536 q2_org = LD_UB(data + (2 * image_width));
1537 negate_tc = zero - tc;
1538 sign_negate_tc = __msa_clti_s_b(negate_tc, 0);
1539
1540 ILVRL_B2_SH(sign_negate_tc, negate_tc, negate_tc_r, i16_negatetc_l);
1541
1542 UNPCK_UB_SH(tc, tc_r, tc_l);
1543 UNPCK_UB_SH(p1_org, p1_org_r, p1_org_l);
1544 UNPCK_UB_SH(p0_org, p0_org_r, p0_org_l);
1545 UNPCK_UB_SH(q0_org, q0_org_r, q0_org_l);
1546
1547 p2_asub_p0 = __msa_asub_u_b(p2_org, p0_org);
1548 is_less_than_beta = (p2_asub_p0 < beta);
1549 is_less_than_beta = is_less_than_beta & is_less_than;
1550
1551 if (!__msa_test_bz_v(is_less_than_beta)) {
1552 v16u8 p1;
1553 v8i16 p1_r = { 0 };
1554 v8i16 p1_l = { 0 };
1555 v8i16 p2_org_r = (v8i16) __msa_ilvr_b(zero, (v16i8) p2_org);
1556 v8i16 p2_org_l = (v8i16) __msa_ilvl_b(zero, (v16i8) p2_org);
1557
1558 AVC_LPF_P1_OR_Q1(p0_org_r, q0_org_r, p1_org_r, p2_org_r,
1559 negate_tc_r, tc_r, p1_r);
1560 AVC_LPF_P1_OR_Q1(p0_org_l, q0_org_l, p1_org_l, p2_org_l,
1561 i16_negatetc_l, tc_l, p1_l);
1562
1563 p1 = (v16u8) __msa_pckev_b((v16i8) p1_l, (v16i8) p1_r);
1564 p1_org = __msa_bmnz_v(p1_org, p1, is_less_than_beta);
1565 ST_UB(p1_org, data - (2 * image_width));
1566
1567 is_less_than_beta = __msa_andi_b(is_less_than_beta, 1);
1568 tc = tc + (v16i8) is_less_than_beta;
1569 }
1570
1571 q2_asub_q0 = __msa_asub_u_b(q2_org, q0_org);
1572 is_less_than_beta = (q2_asub_q0 < beta);
1573 is_less_than_beta = is_less_than_beta & is_less_than;
1574
1575 q1_org_r = (v8i16) __msa_ilvr_b(zero, (v16i8) q1_org);
1576 q1_org_l = (v8i16) __msa_ilvl_b(zero, (v16i8) q1_org);
1577
1578 if (!__msa_test_bz_v(is_less_than_beta)) {
1579 v16u8 q1;
1580 v8i16 q1_r = { 0 };
1581 v8i16 q1_l = { 0 };
1582 v8i16 q2_org_r = (v8i16) __msa_ilvr_b(zero, (v16i8) q2_org);
1583 v8i16 q2_org_l = (v8i16) __msa_ilvl_b(zero, (v16i8) q2_org);
1584
1585 AVC_LPF_P1_OR_Q1(p0_org_r, q0_org_r, q1_org_r, q2_org_r,
1586 negate_tc_r, tc_r, q1_r);
1587 AVC_LPF_P1_OR_Q1(p0_org_l, q0_org_l, q1_org_l, q2_org_l,
1588 i16_negatetc_l, tc_l, q1_l);
1589
1590 q1 = (v16u8) __msa_pckev_b((v16i8) q1_l, (v16i8) q1_r);
1591 q1_org = __msa_bmnz_v(q1_org, q1, is_less_than_beta);
1592 ST_UB(q1_org, data + image_width);
1593
1594 is_less_than_beta = __msa_andi_b(is_less_than_beta, 1);
1595 tc = tc + (v16i8) is_less_than_beta;
1596 }
1597 {
1598 v16i8 negate_thresh, sign_negate_thresh;
1599 v8i16 threshold_r, threshold_l;
1600 v8i16 negate_thresh_l, negate_thresh_r;
1601
1602 negate_thresh = zero - tc;
1603 sign_negate_thresh = __msa_clti_s_b(negate_thresh, 0);
1604
1605 ILVR_B2_SH(zero, tc, sign_negate_thresh, negate_thresh,
1606 threshold_r, negate_thresh_r);
1607 AVC_LPF_P0Q0(q0_org_r, p0_org_r, p1_org_r, q1_org_r,
1608 negate_thresh_r, threshold_r, p0_r, q0_r);
1609
1610 threshold_l = (v8i16) __msa_ilvl_b(zero, tc);
1611 negate_thresh_l = (v8i16) __msa_ilvl_b(sign_negate_thresh,
1612 negate_thresh);
1613 AVC_LPF_P0Q0(q0_org_l, p0_org_l, p1_org_l, q1_org_l,
1614 negate_thresh_l, threshold_l, p0_l, q0_l);
1615 }
1616
1617 PCKEV_B2_UB(p0_l, p0_r, q0_l, q0_r, p0, q0);
1618
1619 p0_org = __msa_bmnz_v(p0_org, p0, is_less_than);
1620 q0_org = __msa_bmnz_v(q0_org, q0, is_less_than);
1621
1622 ST_UB(p0_org, (data - image_width));
1623 ST_UB(q0_org, data);
1624 }
1625 }
1626}
1627
1628static void avc_h_loop_filter_luma_mbaff_msa(uint8_t *in, ptrdiff_t stride,
1629 int32_t alpha_in, int32_t beta_in,
1630 int8_t *tc0)
1631{
1632 uint8_t *data = in;
1633 uint32_t out0, out1, out2, out3;
1634 uint64_t load;
1635 uint32_t tc_val;
1636 v16u8 alpha, beta;
1637 v16i8 inp0 = { 0 };
1638 v16i8 inp1 = { 0 };
1639 v16i8 inp2 = { 0 };
1640 v16i8 inp3 = { 0 };
1641 v16i8 inp4 = { 0 };
1642 v16i8 inp5 = { 0 };
1643 v16i8 inp6 = { 0 };
1644 v16i8 inp7 = { 0 };
1645 v16i8 src0, src1, src2, src3;
1646 v8i16 src4, src5, src6, src7;
1647 v16u8 p0_asub_q0, p1_asub_p0, q1_asub_q0, p2_asub_p0, q2_asub_q0;
1648 v16u8 is_less_than, is_less_than_alpha, is_less_than_beta;
1649 v16u8 is_less_than_beta1, is_less_than_beta2;
1650 v8i16 tc, tc_orig_r, tc_plus1;
1651 v16u8 is_tc_orig1, is_tc_orig2, tc_orig = { 0 };
1652 v8i16 p0_ilvr_q0, p0_add_q0, q0_sub_p0, p1_sub_q1;
1653 v8i16 src2_r, src3_r;
1654 v8i16 p2_r, p1_r, q2_r, q1_r;
1655 v16u8 p2, q2, p0, q0;
1656 v4i32 dst0, dst1;
1657 v16i8 zeros = { 0 };
1658
1659 alpha = (v16u8) __msa_fill_b(alpha_in);
1660 beta = (v16u8) __msa_fill_b(beta_in);
1661
1662 if (tc0[0] < 0) {
1663 data += (2 * stride);
1664 } else {
1665 load = LD(data - 3);
1666 inp0 = (v16i8) __msa_insert_d((v2i64) inp0, 0, load);
1667 load = LD(data - 3 + stride);
1668 inp1 = (v16i8) __msa_insert_d((v2i64) inp1, 0, load);
1669 data += (2 * stride);
1670 }
1671
1672 if (tc0[1] < 0) {
1673 data += (2 * stride);
1674 } else {
1675 load = LD(data - 3);
1676 inp2 = (v16i8) __msa_insert_d((v2i64) inp2, 0, load);
1677 load = LD(data - 3 + stride);
1678 inp3 = (v16i8) __msa_insert_d((v2i64) inp3, 0, load);
1679 data += (2 * stride);
1680 }
1681
1682 if (tc0[2] < 0) {
1683 data += (2 * stride);
1684 } else {
1685 load = LD(data - 3);
1686 inp4 = (v16i8) __msa_insert_d((v2i64) inp4, 0, load);
1687 load = LD(data - 3 + stride);
1688 inp5 = (v16i8) __msa_insert_d((v2i64) inp5, 0, load);
1689 data += (2 * stride);
1690 }
1691
1692 if (tc0[3] < 0) {
1693 data += (2 * stride);
1694 } else {
1695 load = LD(data - 3);
1696 inp6 = (v16i8) __msa_insert_d((v2i64) inp6, 0, load);
1697 load = LD(data - 3 + stride);
1698 inp7 = (v16i8) __msa_insert_d((v2i64) inp7, 0, load);
1699 data += (2 * stride);
1700 }
1701
1702 ILVR_B4_SB(inp1, inp0, inp3, inp2, inp5, inp4, inp7, inp6,
1703 src0, src1, src2, src3);
1704
1705 ILVR_H2_SH(src1, src0, src3, src2, src4, src6);
1706 ILVL_H2_SH(src1, src0, src3, src2, src5, src7);
1707
1708 src0 = (v16i8) __msa_ilvr_w((v4i32) src6, (v4i32) src4);
1709 src1 = __msa_sldi_b(zeros, (v16i8) src0, 8);
1710 src2 = (v16i8) __msa_ilvl_w((v4i32) src6, (v4i32) src4);
1711 src3 = __msa_sldi_b(zeros, (v16i8) src2, 8);
1712 src4 = (v8i16) __msa_ilvr_w((v4i32) src7, (v4i32) src5);
1713 src5 = (v8i16) __msa_sldi_b(zeros, (v16i8) src4, 8);
1714
1715 p0_asub_q0 = __msa_asub_u_b((v16u8) src2, (v16u8) src3);
1716 p1_asub_p0 = __msa_asub_u_b((v16u8) src1, (v16u8) src2);
1717 q1_asub_q0 = __msa_asub_u_b((v16u8) src4, (v16u8) src3);
1718 p2_asub_p0 = __msa_asub_u_b((v16u8) src0, (v16u8) src2);
1719 q2_asub_q0 = __msa_asub_u_b((v16u8) src5, (v16u8) src3);
1720
1721 is_less_than_alpha = (p0_asub_q0 < alpha);
1722 is_less_than_beta = (p1_asub_p0 < beta);
1723 is_less_than = is_less_than_alpha & is_less_than_beta;
1724 is_less_than_beta = (q1_asub_q0 < beta);
1725 is_less_than = is_less_than_beta & is_less_than;
1726
1727 is_less_than_beta1 = (p2_asub_p0 < beta);
1728 is_less_than_beta2 = (q2_asub_q0 < beta);
1729
1730 p0_ilvr_q0 = (v8i16) __msa_ilvr_b((v16i8) src3, (v16i8) src2);
1731 p0_add_q0 = (v8i16) __msa_hadd_u_h((v16u8) p0_ilvr_q0, (v16u8) p0_ilvr_q0);
1732 p0_add_q0 = __msa_srari_h(p0_add_q0, 1);
1733
1734 ILVR_B2_SH(zeros, src0, zeros, src1, p2_r, p1_r);
1735 p2_r += p0_add_q0;
1736 p2_r >>= 1;
1737 p2_r -= p1_r;
1738 ILVR_B2_SH(zeros, src5, zeros, src4, q2_r, q1_r);
1739 q2_r += p0_add_q0;
1740 q2_r >>= 1;
1741 q2_r -= q1_r;
1742
1743 tc_val = LW(tc0);
1744 tc_orig = (v16u8) __msa_insert_w((v4i32) tc_orig, 0, tc_val);
1745 tc_orig = (v16u8) __msa_ilvr_b((v16i8) tc_orig, (v16i8) tc_orig);
1746 is_tc_orig1 = tc_orig;
1747 is_tc_orig2 = tc_orig;
1748 tc_orig_r = (v8i16) __msa_ilvr_b(zeros, (v16i8) tc_orig);
1749 tc = tc_orig_r;
1750
1751 CLIP_SH(p2_r, -tc_orig_r, tc_orig_r);
1752 CLIP_SH(q2_r, -tc_orig_r, tc_orig_r);
1753
1754 p2_r += p1_r;
1755 q2_r += q1_r;
1756
1757 PCKEV_B2_UB(p2_r, p2_r, q2_r, q2_r, p2, q2);
1758
1759 is_tc_orig1 = (zeros < is_tc_orig1);
1760 is_tc_orig2 = is_tc_orig1;
1761 is_tc_orig1 = is_less_than_beta1 & is_tc_orig1;
1762 is_tc_orig2 = is_less_than_beta2 & is_tc_orig2;
1763 is_tc_orig1 = is_less_than & is_tc_orig1;
1764 is_tc_orig2 = is_less_than & is_tc_orig2;
1765
1766 p2 = __msa_bmnz_v((v16u8) src1, p2, is_tc_orig1);
1767 q2 = __msa_bmnz_v((v16u8) src4, q2, is_tc_orig2);
1768
1769 q0_sub_p0 = __msa_hsub_u_h((v16u8) p0_ilvr_q0, (v16u8) p0_ilvr_q0);
1770 q0_sub_p0 <<= 2;
1771 p1_sub_q1 = p1_r - q1_r;
1772 q0_sub_p0 += p1_sub_q1;
1773 q0_sub_p0 = __msa_srari_h(q0_sub_p0, 3);
1774
1775 tc_plus1 = tc + 1;
1776 is_less_than_beta1 = (v16u8) __msa_ilvr_b((v16i8) is_less_than_beta1,
1777 (v16i8) is_less_than_beta1);
1778 tc = (v8i16) __msa_bmnz_v((v16u8) tc, (v16u8) tc_plus1, is_less_than_beta1);
1779 tc_plus1 = tc + 1;
1780 is_less_than_beta2 = (v16u8) __msa_ilvr_b((v16i8) is_less_than_beta2,
1781 (v16i8) is_less_than_beta2);
1782 tc = (v8i16) __msa_bmnz_v((v16u8) tc, (v16u8) tc_plus1, is_less_than_beta2);
1783
1784 CLIP_SH(q0_sub_p0, -tc, tc);
1785
1786 ILVR_B2_SH(zeros, src2, zeros, src3, src2_r, src3_r);
1787 src2_r += q0_sub_p0;
1788 src3_r -= q0_sub_p0;
1789
1790 CLIP_SH2_0_255(src2_r, src3_r);
1791
1792 PCKEV_B2_UB(src2_r, src2_r, src3_r, src3_r, p0, q0);
1793
1794 p0 = __msa_bmnz_v((v16u8) src2, p0, is_less_than);
1795 q0 = __msa_bmnz_v((v16u8) src3, q0, is_less_than);
1796
1797 ILVR_B2_UB(p0, p2, q2, q0, p2, q2);
1798
1799 ILVRL_H2_SW(q2, p2, dst0, dst1);
1800
1801 data = in;
1802
1803 out0 = __msa_copy_u_w(dst0, 0);
1804 out1 = __msa_copy_u_w(dst0, 1);
1805 out2 = __msa_copy_u_w(dst0, 2);
1806 out3 = __msa_copy_u_w(dst0, 3);
1807
1808 if (tc0[0] < 0) {
1809 data += (2 * stride);
1810 } else {
1811 SW(out0, (data - 2));
1812 data += stride;
1813 SW(out1, (data - 2));
1814 data += stride;
1815 }
1816
1817 if (tc0[1] < 0) {
1818 data += (2 * stride);
1819 } else {
1820 SW(out2, (data - 2));
1821 data += stride;
1822 SW(out3, (data - 2));
1823 data += stride;
1824 }
1825
1826 out0 = __msa_copy_u_w(dst1, 0);
1827 out1 = __msa_copy_u_w(dst1, 1);
1828 out2 = __msa_copy_u_w(dst1, 2);
1829 out3 = __msa_copy_u_w(dst1, 3);
1830
1831 if (tc0[2] < 0) {
1832 data += (2 * stride);
1833 } else {
1834 SW(out0, (data - 2));
1835 data += stride;
1836 SW(out1, (data - 2));
1837 data += stride;
1838 }
1839
1840 if (tc0[3] >= 0) {
1841 SW(out2, (data - 2));
1842 data += stride;
1843 SW(out3, (data - 2));
1844 }
1845}
1846
1848 uint8_t bs0, uint8_t bs1,
1849 uint8_t bs2, uint8_t bs3,
1850 uint8_t tc0, uint8_t tc1,
1851 uint8_t tc2, uint8_t tc3,
1852 uint8_t alpha_in,
1853 uint8_t beta_in,
1854 ptrdiff_t img_width)
1855{
1856 v16u8 alpha, beta;
1857 v8i16 tmp_vec;
1858 v8i16 bs = { 0 };
1859 v8i16 tc = { 0 };
1860 v16u8 p0, q0, p0_asub_q0, p1_asub_p0, q1_asub_q0;
1861 v16u8 is_less_than;
1862 v16u8 is_less_than_beta, is_less_than_alpha, is_bs_greater_than0;
1863 v8i16 p0_r, q0_r;
1864 v16u8 p1_org, p0_org, q0_org, q1_org;
1865 v8i16 p1_org_r, p0_org_r, q0_org_r, q1_org_r;
1866 v16i8 negate_tc, sign_negate_tc;
1867 v8i16 tc_r, negate_tc_r;
1868 v16i8 zero = { 0 };
1869
1870 tmp_vec = (v8i16) __msa_fill_b(bs0);
1871 bs = __msa_insve_h(bs, 0, tmp_vec);
1872 tmp_vec = (v8i16) __msa_fill_b(bs1);
1873 bs = __msa_insve_h(bs, 1, tmp_vec);
1874 tmp_vec = (v8i16) __msa_fill_b(bs2);
1875 bs = __msa_insve_h(bs, 2, tmp_vec);
1876 tmp_vec = (v8i16) __msa_fill_b(bs3);
1877 bs = __msa_insve_h(bs, 3, tmp_vec);
1878
1879 if (!__msa_test_bz_v((v16u8) bs)) {
1880 tmp_vec = (v8i16) __msa_fill_b(tc0);
1881 tc = __msa_insve_h(tc, 0, tmp_vec);
1882 tmp_vec = (v8i16) __msa_fill_b(tc1);
1883 tc = __msa_insve_h(tc, 1, tmp_vec);
1884 tmp_vec = (v8i16) __msa_fill_b(tc2);
1885 tc = __msa_insve_h(tc, 2, tmp_vec);
1886 tmp_vec = (v8i16) __msa_fill_b(tc3);
1887 tc = __msa_insve_h(tc, 3, tmp_vec);
1888
1889 is_bs_greater_than0 = (v16u8) (zero < (v16i8) bs);
1890
1891 alpha = (v16u8) __msa_fill_b(alpha_in);
1892 beta = (v16u8) __msa_fill_b(beta_in);
1893
1894 LD_UB4(data - (img_width << 1), img_width,
1895 p1_org, p0_org, q0_org, q1_org);
1896
1897 p0_asub_q0 = __msa_asub_u_b(p0_org, q0_org);
1898 p1_asub_p0 = __msa_asub_u_b(p1_org, p0_org);
1899 q1_asub_q0 = __msa_asub_u_b(q1_org, q0_org);
1900
1901 is_less_than_alpha = (p0_asub_q0 < alpha);
1902 is_less_than_beta = (p1_asub_p0 < beta);
1903 is_less_than = is_less_than_beta & is_less_than_alpha;
1904 is_less_than_beta = (q1_asub_q0 < beta);
1905 is_less_than = is_less_than_beta & is_less_than;
1906 is_less_than = is_less_than & is_bs_greater_than0;
1907
1908 is_less_than = (v16u8) __msa_ilvr_d((v2i64) zero, (v2i64) is_less_than);
1909
1910 if (!__msa_test_bz_v(is_less_than)) {
1911 negate_tc = zero - (v16i8) tc;
1912 sign_negate_tc = __msa_clti_s_b(negate_tc, 0);
1913
1914 ILVR_B2_SH(zero, tc, sign_negate_tc, negate_tc, tc_r, negate_tc_r);
1915
1916 ILVR_B4_SH(zero, p1_org, zero, p0_org, zero, q0_org, zero, q1_org,
1917 p1_org_r, p0_org_r, q0_org_r, q1_org_r);
1918
1919 AVC_LPF_P0Q0(q0_org_r, p0_org_r, p1_org_r, q1_org_r, negate_tc_r,
1920 tc_r, p0_r, q0_r);
1921
1922 PCKEV_B2_UB(zero, p0_r, zero, q0_r, p0, q0);
1923
1924 p0_org = __msa_bmnz_v(p0_org, p0, is_less_than);
1925 q0_org = __msa_bmnz_v(q0_org, q0, is_less_than);
1926
1927 ST_UB(q0_org, data);
1928 ST_UB(p0_org, (data - img_width));
1929 }
1930 }
1931}
1932
1934 uint8_t bs0, uint8_t bs1,
1935 uint8_t bs2, uint8_t bs3,
1936 uint8_t tc0, uint8_t tc1,
1937 uint8_t tc2, uint8_t tc3,
1938 uint8_t alpha_in,
1939 uint8_t beta_in,
1940 ptrdiff_t img_width)
1941{
1942 uint8_t *src;
1943 v16u8 alpha, beta;
1944 v16u8 p0_asub_q0, p1_asub_p0, q1_asub_q0;
1945 v16u8 is_less_than, is_less_than_beta, is_less_than_alpha;
1946 v16u8 p0, q0;
1947 v8i16 p0_r = { 0 };
1948 v8i16 q0_r = { 0 };
1949 v16u8 p1_org, p0_org, q0_org, q1_org;
1950 v8i16 p1_org_r, p0_org_r, q0_org_r, q1_org_r;
1951 v16u8 is_bs_greater_than0;
1952 v8i16 tc_r, negate_tc_r;
1953 v16i8 negate_tc, sign_negate_tc;
1954 v16i8 zero = { 0 };
1955 v16u8 row0, row1, row2, row3, row4, row5, row6, row7;
1956 v8i16 tmp1, tmp_vec, bs = { 0 };
1957 v8i16 tc = { 0 };
1958
1959 tmp_vec = (v8i16) __msa_fill_b(bs0);
1960 bs = __msa_insve_h(bs, 0, tmp_vec);
1961 tmp_vec = (v8i16) __msa_fill_b(bs1);
1962 bs = __msa_insve_h(bs, 1, tmp_vec);
1963 tmp_vec = (v8i16) __msa_fill_b(bs2);
1964 bs = __msa_insve_h(bs, 2, tmp_vec);
1965 tmp_vec = (v8i16) __msa_fill_b(bs3);
1966 bs = __msa_insve_h(bs, 3, tmp_vec);
1967
1968 if (!__msa_test_bz_v((v16u8) bs)) {
1969 tmp_vec = (v8i16) __msa_fill_b(tc0);
1970 tc = __msa_insve_h(tc, 0, tmp_vec);
1971 tmp_vec = (v8i16) __msa_fill_b(tc1);
1972 tc = __msa_insve_h(tc, 1, tmp_vec);
1973 tmp_vec = (v8i16) __msa_fill_b(tc2);
1974 tc = __msa_insve_h(tc, 2, tmp_vec);
1975 tmp_vec = (v8i16) __msa_fill_b(tc3);
1976 tc = __msa_insve_h(tc, 3, tmp_vec);
1977
1978 is_bs_greater_than0 = (v16u8) (zero < (v16i8) bs);
1979
1980 LD_UB8((data - 2), img_width,
1981 row0, row1, row2, row3, row4, row5, row6, row7);
1982
1983 TRANSPOSE8x4_UB_UB(row0, row1, row2, row3,
1984 row4, row5, row6, row7,
1985 p1_org, p0_org, q0_org, q1_org);
1986
1987 p0_asub_q0 = __msa_asub_u_b(p0_org, q0_org);
1988 p1_asub_p0 = __msa_asub_u_b(p1_org, p0_org);
1989 q1_asub_q0 = __msa_asub_u_b(q1_org, q0_org);
1990
1991 alpha = (v16u8) __msa_fill_b(alpha_in);
1992 beta = (v16u8) __msa_fill_b(beta_in);
1993
1994 is_less_than_alpha = (p0_asub_q0 < alpha);
1995 is_less_than_beta = (p1_asub_p0 < beta);
1996 is_less_than = is_less_than_beta & is_less_than_alpha;
1997 is_less_than_beta = (q1_asub_q0 < beta);
1998 is_less_than = is_less_than_beta & is_less_than;
1999 is_less_than = is_bs_greater_than0 & is_less_than;
2000
2001 is_less_than = (v16u8) __msa_ilvr_d((v2i64) zero, (v2i64) is_less_than);
2002
2003 if (!__msa_test_bz_v(is_less_than)) {
2004 ILVR_B4_SH(zero, p1_org, zero, p0_org, zero, q0_org, zero, q1_org,
2005 p1_org_r, p0_org_r, q0_org_r, q1_org_r);
2006
2007 negate_tc = zero - (v16i8) tc;
2008 sign_negate_tc = __msa_clti_s_b(negate_tc, 0);
2009
2010 ILVR_B2_SH(sign_negate_tc, negate_tc, zero, tc, negate_tc_r, tc_r);
2011
2012 AVC_LPF_P0Q0(q0_org_r, p0_org_r, p1_org_r, q1_org_r, negate_tc_r,
2013 tc_r, p0_r, q0_r);
2014
2015 PCKEV_B2_UB(zero, p0_r, zero, q0_r, p0, q0);
2016
2017 p0_org = __msa_bmnz_v(p0_org, p0, is_less_than);
2018 q0_org = __msa_bmnz_v(q0_org, q0, is_less_than);
2019 tmp1 = (v8i16) __msa_ilvr_b((v16i8) q0_org, (v16i8) p0_org);
2020 src = data - 1;
2021 ST_H4(tmp1, 0, 1, 2, 3, src, img_width);
2022 src += 4 * img_width;
2023 ST_H4(tmp1, 4, 5, 6, 7, src, img_width);
2024 }
2025 }
2026}
2027
2028static void avc_h_loop_filter_chroma422_msa(uint8_t *src, ptrdiff_t stride,
2029 int32_t alpha_in, int32_t beta_in,
2030 int8_t *tc0)
2031{
2032 int32_t col, tc_val;
2033 v16u8 alpha, beta, res;
2034
2035 alpha = (v16u8) __msa_fill_b(alpha_in);
2036 beta = (v16u8) __msa_fill_b(beta_in);
2037
2038 for (col = 0; col < 4; col++) {
2039 tc_val = (tc0[col] - 1) + 1;
2040
2041 if (tc_val <= 0) {
2042 src += (4 * stride);
2043 continue;
2044 }
2045
2046 AVC_LPF_H_CHROMA_422(src, stride, tc_val, alpha, beta, res);
2047 ST_H4(res, 0, 1, 2, 3, (src - 1), stride);
2048 src += (4 * stride);
2049 }
2050}
2051
2053 ptrdiff_t stride,
2054 int32_t alpha_in,
2055 int32_t beta_in,
2056 int8_t *tc0)
2057{
2058 int32_t col, tc_val;
2059 int16_t out0, out1;
2060 v16u8 alpha, beta, res;
2061
2062 alpha = (v16u8) __msa_fill_b(alpha_in);
2063 beta = (v16u8) __msa_fill_b(beta_in);
2064
2065 for (col = 0; col < 4; col++) {
2066 tc_val = (tc0[col] - 1) + 1;
2067
2068 if (tc_val <= 0) {
2069 src += 4 * stride;
2070 continue;
2071 }
2072
2073 AVC_LPF_H_2BYTE_CHROMA_422(src, stride, tc_val, alpha, beta, res);
2074
2075 out0 = __msa_copy_s_h((v8i16) res, 0);
2076 out1 = __msa_copy_s_h((v8i16) res, 1);
2077
2078 SH(out0, (src - 1));
2079 src += stride;
2080 SH(out1, (src - 1));
2081 src += stride;
2082 }
2083}
2084
2085void ff_h264_h_lpf_luma_inter_msa(uint8_t *data, ptrdiff_t img_width,
2086 int alpha, int beta, int8_t *tc)
2087{
2088// uint8_t bs0 = 1;
2089// uint8_t bs1 = 1;
2090// uint8_t bs2 = 1;
2091// uint8_t bs3 = 1;
2092//
2093// if (tc[0] < 0)
2094// bs0 = 0;
2095// if (tc[1] < 0)
2096// bs1 = 0;
2097// if (tc[2] < 0)
2098// bs2 = 0;
2099// if (tc[3] < 0)
2100// bs3 = 0;
2101//
2102// avc_loopfilter_luma_inter_edge_ver_msa(data, bs0, bs1, bs2, bs3,
2103// tc[0], tc[1], tc[2], tc[3],
2104// alpha, beta, img_width);
2105 avc_loopfilter_luma_inter_edge_ver_msa(data, img_width, alpha, beta, tc);
2106}
2107
2108void ff_h264_v_lpf_luma_inter_msa(uint8_t *data, ptrdiff_t img_width,
2109 int alpha, int beta, int8_t *tc)
2110{
2111
2112 uint8_t bs0 = 1;
2113 uint8_t bs1 = 1;
2114 uint8_t bs2 = 1;
2115 uint8_t bs3 = 1;
2116
2117 if (tc[0] < 0)
2118 bs0 = 0;
2119 if (tc[1] < 0)
2120 bs1 = 0;
2121 if (tc[2] < 0)
2122 bs2 = 0;
2123 if (tc[3] < 0)
2124 bs3 = 0;
2125
2126 avc_loopfilter_luma_inter_edge_hor_msa(data, bs0, bs1, bs2, bs3,
2127 tc[0], tc[1], tc[2], tc[3],
2128 alpha, beta, img_width);
2129}
2130
2131void ff_h264_h_lpf_chroma_inter_msa(uint8_t *data, ptrdiff_t img_width,
2132 int alpha, int beta, int8_t *tc)
2133{
2134 uint8_t bs0 = 1;
2135 uint8_t bs1 = 1;
2136 uint8_t bs2 = 1;
2137 uint8_t bs3 = 1;
2138
2139 if (tc[0] < 0)
2140 bs0 = 0;
2141 if (tc[1] < 0)
2142 bs1 = 0;
2143 if (tc[2] < 0)
2144 bs2 = 0;
2145 if (tc[3] < 0)
2146 bs3 = 0;
2147
2149 tc[0], tc[1], tc[2], tc[3],
2150 alpha, beta, img_width);
2151}
2152
2153void ff_h264_v_lpf_chroma_inter_msa(uint8_t *data, ptrdiff_t img_width,
2154 int alpha, int beta, int8_t *tc)
2155{
2156 uint8_t bs0 = 1;
2157 uint8_t bs1 = 1;
2158 uint8_t bs2 = 1;
2159 uint8_t bs3 = 1;
2160
2161 if (tc[0] < 0)
2162 bs0 = 0;
2163 if (tc[1] < 0)
2164 bs1 = 0;
2165 if (tc[2] < 0)
2166 bs2 = 0;
2167 if (tc[3] < 0)
2168 bs3 = 0;
2169
2171 tc[0], tc[1], tc[2], tc[3],
2172 alpha, beta, img_width);
2173}
2174
2175void ff_h264_h_lpf_luma_intra_msa(uint8_t *data, ptrdiff_t img_width,
2176 int alpha, int beta)
2177{
2179 (uint8_t) beta,
2180 img_width);
2181}
2182
2183void ff_h264_v_lpf_luma_intra_msa(uint8_t *data, ptrdiff_t img_width,
2184 int alpha, int beta)
2185{
2187 (uint8_t) beta,
2188 img_width);
2189}
2190
2191void ff_h264_h_lpf_chroma_intra_msa(uint8_t *data, ptrdiff_t img_width,
2192 int alpha, int beta)
2193{
2195 (uint8_t) beta,
2196 img_width);
2197}
2198
2199void ff_h264_v_lpf_chroma_intra_msa(uint8_t *data, ptrdiff_t img_width,
2200 int alpha, int beta)
2201{
2203 (uint8_t) beta,
2204 img_width);
2205}
2206
2208 ptrdiff_t ystride,
2209 int32_t alpha, int32_t beta,
2210 int8_t *tc0)
2211{
2212 avc_h_loop_filter_chroma422_msa(src, ystride, alpha, beta, tc0);
2213}
2214
2216 ptrdiff_t ystride,
2217 int32_t alpha,
2218 int32_t beta,
2219 int8_t *tc0)
2220{
2221 avc_h_loop_filter_chroma422_mbaff_msa(src, ystride, alpha, beta, tc0);
2222}
2223
2225 ptrdiff_t ystride,
2226 int32_t alpha,
2227 int32_t beta,
2228 int8_t *tc0)
2229{
2230 avc_h_loop_filter_luma_mbaff_msa(src, ystride, alpha, beta, tc0);
2231}
2232
2234 ptrdiff_t ystride,
2235 int32_t alpha,
2236 int32_t beta)
2237{
2239}
2240
2242 int height, int log2_denom,
2243 int weight_src, int offset_in)
2244{
2245 uint32_t offset_val;
2246 v16i8 zero = { 0 };
2247 v16u8 src0, src1, src2, src3, src4, src5, src6, src7;
2248 v16u8 dst0, dst1, dst2, dst3, dst4, dst5, dst6, dst7;
2249 v8i16 src0_l, src1_l, src2_l, src3_l, src0_r, src1_r, src2_r, src3_r;
2250 v8i16 src4_l, src5_l, src6_l, src7_l, src4_r, src5_r, src6_r, src7_r;
2251 v8i16 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
2252 v8i16 tmp8, tmp9, tmp10, tmp11, tmp12, tmp13, tmp14, tmp15;
2253 v8i16 wgt, denom, offset;
2254
2255 offset_val = (unsigned) offset_in << log2_denom;
2256
2257 wgt = __msa_fill_h(weight_src);
2258 offset = __msa_fill_h(offset_val);
2259 denom = __msa_fill_h(log2_denom);
2260
2261 LD_UB8(src, stride, src0, src1, src2, src3, src4, src5, src6, src7);
2262 ILVR_B4_SH(zero, src0, zero, src1, zero, src2, zero, src3, src0_r, src1_r,
2263 src2_r, src3_r);
2264 ILVL_B4_SH(zero, src0, zero, src1, zero, src2, zero, src3, src0_l, src1_l,
2265 src2_l, src3_l);
2266 ILVR_B4_SH(zero, src4, zero, src5, zero, src6, zero, src7, src4_r, src5_r,
2267 src6_r, src7_r);
2268 ILVL_B4_SH(zero, src4, zero, src5, zero, src6, zero, src7, src4_l, src5_l,
2269 src6_l, src7_l);
2270 MUL4(wgt, src0_r, wgt, src0_l, wgt, src1_r, wgt, src1_l, tmp0, tmp1, tmp2,
2271 tmp3);
2272 MUL4(wgt, src2_r, wgt, src2_l, wgt, src3_r, wgt, src3_l, tmp4, tmp5, tmp6,
2273 tmp7);
2274 MUL4(wgt, src4_r, wgt, src4_l, wgt, src5_r, wgt, src5_l, tmp8, tmp9, tmp10,
2275 tmp11);
2276 MUL4(wgt, src6_r, wgt, src6_l, wgt, src7_r, wgt, src7_l, tmp12, tmp13,
2277 tmp14, tmp15);
2278 ADDS_SH4_SH(tmp0, offset, tmp1, offset, tmp2, offset, tmp3, offset, tmp0,
2279 tmp1, tmp2, tmp3);
2280 ADDS_SH4_SH(tmp4, offset, tmp5, offset, tmp6, offset, tmp7, offset, tmp4,
2281 tmp5, tmp6, tmp7);
2282 ADDS_SH4_SH(tmp8, offset, tmp9, offset, tmp10, offset, tmp11, offset, tmp8,
2283 tmp9, tmp10, tmp11);
2284 ADDS_SH4_SH(tmp12, offset, tmp13, offset, tmp14, offset, tmp15, offset,
2285 tmp12, tmp13, tmp14, tmp15);
2286 MAXI_SH8_SH(tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, 0);
2287 MAXI_SH8_SH(tmp8, tmp9, tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, 0);
2288 SRLR_H8_SH(tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, denom);
2289 SRLR_H8_SH(tmp8, tmp9, tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, denom);
2290 SAT_UH8_SH(tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, 7);
2291 SAT_UH8_SH(tmp8, tmp9, tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, 7);
2292 PCKEV_B4_UB(tmp1, tmp0, tmp3, tmp2, tmp5, tmp4, tmp7, tmp6, dst0, dst1,
2293 dst2, dst3);
2294 PCKEV_B4_UB(tmp9, tmp8, tmp11, tmp10, tmp13, tmp12, tmp15, tmp14, dst4,
2295 dst5, dst6, dst7);
2296 ST_UB8(dst0, dst1, dst2, dst3, dst4, dst5, dst6, dst7, src, stride);
2297 src += 8 * stride;
2298
2299 if (16 == height) {
2300 LD_UB8(src, stride, src0, src1, src2, src3, src4, src5, src6, src7);
2301 ILVR_B4_SH(zero, src0, zero, src1, zero, src2, zero, src3, src0_r,
2302 src1_r, src2_r, src3_r);
2303 ILVL_B4_SH(zero, src0, zero, src1, zero, src2, zero, src3, src0_l,
2304 src1_l, src2_l, src3_l);
2305 ILVR_B4_SH(zero, src4, zero, src5, zero, src6, zero, src7, src4_r,
2306 src5_r, src6_r, src7_r);
2307 ILVL_B4_SH(zero, src4, zero, src5, zero, src6, zero, src7, src4_l,
2308 src5_l, src6_l, src7_l);
2309 MUL4(wgt, src0_r, wgt, src0_l, wgt, src1_r, wgt, src1_l, tmp0, tmp1,
2310 tmp2, tmp3);
2311 MUL4(wgt, src2_r, wgt, src2_l, wgt, src3_r, wgt, src3_l, tmp4, tmp5,
2312 tmp6, tmp7);
2313 MUL4(wgt, src4_r, wgt, src4_l, wgt, src5_r, wgt, src5_l, tmp8, tmp9,
2314 tmp10, tmp11);
2315 MUL4(wgt, src6_r, wgt, src6_l, wgt, src7_r, wgt, src7_l, tmp12, tmp13,
2316 tmp14, tmp15);
2317 ADDS_SH4_SH(tmp0, offset, tmp1, offset, tmp2, offset, tmp3, offset,
2318 tmp0, tmp1, tmp2, tmp3);
2319 ADDS_SH4_SH(tmp4, offset, tmp5, offset, tmp6, offset, tmp7, offset,
2320 tmp4, tmp5, tmp6, tmp7);
2321 ADDS_SH4_SH(tmp8, offset, tmp9, offset, tmp10, offset, tmp11, offset,
2322 tmp8, tmp9, tmp10, tmp11);
2323 ADDS_SH4_SH(tmp12, offset, tmp13, offset, tmp14, offset, tmp15, offset,
2324 tmp12, tmp13, tmp14, tmp15);
2325 MAXI_SH8_SH(tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, 0);
2326 MAXI_SH8_SH(tmp8, tmp9, tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, 0);
2327 SRLR_H8_SH(tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, denom);
2328 SRLR_H8_SH(tmp8, tmp9, tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, denom);
2329 SAT_UH8_SH(tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, 7);
2330 SAT_UH8_SH(tmp8, tmp9, tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, 7);
2331 PCKEV_B4_UB(tmp1, tmp0, tmp3, tmp2, tmp5, tmp4, tmp7, tmp6, dst0, dst1,
2332 dst2, dst3);
2333 PCKEV_B4_UB(tmp9, tmp8, tmp11, tmp10, tmp13, tmp12, tmp15, tmp14, dst4,
2334 dst5, dst6, dst7);
2335 ST_UB8(dst0, dst1, dst2, dst3, dst4, dst5, dst6, dst7, src, stride);
2336 }
2337}
2338
2339void ff_weight_h264_pixels8_8_msa(uint8_t *src, ptrdiff_t stride,
2340 int height, int log2_denom,
2341 int weight_src, int offset)
2342{
2343 if (4 == height) {
2344 avc_wgt_8x4_msa(src, stride, log2_denom, weight_src, offset);
2345 } else if (8 == height) {
2346 avc_wgt_8x8_msa(src, stride, log2_denom, weight_src, offset);
2347 } else {
2348 avc_wgt_8x16_msa(src, stride, log2_denom, weight_src, offset);
2349 }
2350}
2351
2352void ff_weight_h264_pixels4_8_msa(uint8_t *src, ptrdiff_t stride,
2353 int height, int log2_denom,
2354 int weight_src, int offset)
2355{
2356 if (2 == height) {
2357 avc_wgt_4x2_msa(src, stride, log2_denom, weight_src, offset);
2358 } else if (4 == height) {
2359 avc_wgt_4x4_msa(src, stride, log2_denom, weight_src, offset);
2360 } else {
2361 avc_wgt_4x8_msa(src, stride, log2_denom, weight_src, offset);
2362 }
2363}
2364
2366 ptrdiff_t stride, int height,
2367 int log2_denom, int weight_dst,
2368 int weight_src, int offset_in)
2369{
2370 v16i8 src_wgt, dst_wgt, wgt;
2371 v16u8 src0, src1, src2, src3, src4, src5, src6, src7;
2372 v16u8 dst0, dst1, dst2, dst3, dst4, dst5, dst6, dst7;
2373 v16i8 vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7;
2374 v16i8 vec8, vec9, vec10, vec11, vec12, vec13, vec14, vec15;
2375 v8i16 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, zero = { 0 };
2376 v8i16 tmp8, tmp9, tmp10, tmp11, tmp12, tmp13, tmp14, tmp15;
2377 v8i16 denom, offset;
2378
2379 offset_in = (unsigned) ((offset_in + 1) | 1) << log2_denom;
2380 offset_in += (128 * (weight_src + weight_dst));
2381
2382 src_wgt = __msa_fill_b(weight_src);
2383 dst_wgt = __msa_fill_b(weight_dst);
2384 offset = __msa_fill_h(offset_in);
2385 denom = __msa_fill_h(log2_denom + 1);
2386
2387 wgt = __msa_ilvev_b(dst_wgt, src_wgt);
2388
2389 LD_UB8(src, stride, src0, src1, src2, src3, src4, src5, src6, src7);
2390 src += 8 * stride;
2391 LD_UB8(dst, stride, dst0, dst1, dst2, dst3, dst4, dst5, dst6, dst7);
2392 XORI_B8_128_UB(src0, src1, src2, src3, src4, src5, src6, src7);
2393 XORI_B8_128_UB(dst0, dst1, dst2, dst3, dst4, dst5, dst6, dst7);
2394 ILVR_B4_SB(dst0, src0, dst1, src1, dst2, src2, dst3, src3, vec0, vec2, vec4,
2395 vec6);
2396 ILVL_B4_SB(dst0, src0, dst1, src1, dst2, src2, dst3, src3, vec1, vec3, vec5,
2397 vec7);
2398 ILVR_B4_SB(dst4, src4, dst5, src5, dst6, src6, dst7, src7, vec8, vec10,
2399 vec12, vec14);
2400 ILVL_B4_SB(dst4, src4, dst5, src5, dst6, src6, dst7, src7, vec9, vec11,
2401 vec13, vec15);
2402 tmp0 = __msa_dpadd_s_h(zero, wgt, vec0);
2403 tmp1 = __msa_dpadd_s_h(zero, wgt, vec1);
2404 tmp2 = __msa_dpadd_s_h(zero, wgt, vec2);
2405 tmp3 = __msa_dpadd_s_h(zero, wgt, vec3);
2406 tmp4 = __msa_dpadd_s_h(zero, wgt, vec4);
2407 tmp5 = __msa_dpadd_s_h(zero, wgt, vec5);
2408 tmp6 = __msa_dpadd_s_h(zero, wgt, vec6);
2409 tmp7 = __msa_dpadd_s_h(zero, wgt, vec7);
2410 tmp8 = __msa_dpadd_s_h(zero, wgt, vec8);
2411 tmp9 = __msa_dpadd_s_h(zero, wgt, vec9);
2412 tmp10 = __msa_dpadd_s_h(zero, wgt, vec10);
2413 tmp11 = __msa_dpadd_s_h(zero, wgt, vec11);
2414 tmp12 = __msa_dpadd_s_h(zero, wgt, vec12);
2415 tmp13 = __msa_dpadd_s_h(zero, wgt, vec13);
2416 tmp14 = __msa_dpadd_s_h(zero, wgt, vec14);
2417 tmp15 = __msa_dpadd_s_h(zero, wgt, vec15);
2418 tmp0 = __msa_adds_s_h(tmp0, offset);
2419 tmp1 = __msa_adds_s_h(tmp1, offset);
2420 tmp2 = __msa_adds_s_h(tmp2, offset);
2421 tmp3 = __msa_adds_s_h(tmp3, offset);
2422 tmp4 = __msa_adds_s_h(tmp4, offset);
2423 tmp5 = __msa_adds_s_h(tmp5, offset);
2424 tmp6 = __msa_adds_s_h(tmp6, offset);
2425 tmp7 = __msa_adds_s_h(tmp7, offset);
2426 tmp8 = __msa_adds_s_h(tmp8, offset);
2427 tmp9 = __msa_adds_s_h(tmp9, offset);
2428 tmp10 = __msa_adds_s_h(tmp10, offset);
2429 tmp11 = __msa_adds_s_h(tmp11, offset);
2430 tmp12 = __msa_adds_s_h(tmp12, offset);
2431 tmp13 = __msa_adds_s_h(tmp13, offset);
2432 tmp14 = __msa_adds_s_h(tmp14, offset);
2433 tmp15 = __msa_adds_s_h(tmp15, offset);
2434 SRA_4V(tmp0, tmp1, tmp2, tmp3, denom);
2435 SRA_4V(tmp4, tmp5, tmp6, tmp7, denom);
2436 SRA_4V(tmp8, tmp9, tmp10, tmp11, denom);
2437 SRA_4V(tmp12, tmp13, tmp14, tmp15, denom);
2438 CLIP_SH8_0_255(tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7);
2439 CLIP_SH8_0_255(tmp8, tmp9, tmp10, tmp11, tmp12, tmp13, tmp14, tmp15);
2440 PCKEV_B4_UB(tmp1, tmp0, tmp3, tmp2, tmp5, tmp4, tmp7, tmp6, dst0, dst1,
2441 dst2, dst3);
2442 PCKEV_B4_UB(tmp9, tmp8, tmp11, tmp10, tmp13, tmp12, tmp15, tmp14, dst4,
2443 dst5, dst6, dst7);
2444 ST_UB8(dst0, dst1, dst2, dst3, dst4, dst5, dst6, dst7, dst, stride);
2445 dst += 8 * stride;
2446
2447 if (16 == height) {
2448 LD_UB8(src, stride, src0, src1, src2, src3, src4, src5, src6, src7);
2449 LD_UB8(dst, stride, dst0, dst1, dst2, dst3, dst4, dst5, dst6, dst7);
2450 XORI_B8_128_UB(src0, src1, src2, src3, src4, src5, src6, src7);
2451 XORI_B8_128_UB(dst0, dst1, dst2, dst3, dst4, dst5, dst6, dst7);
2452 ILVR_B4_SB(dst0, src0, dst1, src1, dst2, src2, dst3, src3, vec0, vec2,
2453 vec4, vec6);
2454 ILVL_B4_SB(dst0, src0, dst1, src1, dst2, src2, dst3, src3, vec1, vec3,
2455 vec5, vec7);
2456 ILVR_B4_SB(dst4, src4, dst5, src5, dst6, src6, dst7, src7, vec8, vec10,
2457 vec12, vec14);
2458 ILVL_B4_SB(dst4, src4, dst5, src5, dst6, src6, dst7, src7, vec9, vec11,
2459 vec13, vec15);
2460 tmp0 = __msa_dpadd_s_h(zero, wgt, vec0);
2461 tmp1 = __msa_dpadd_s_h(zero, wgt, vec1);
2462 tmp2 = __msa_dpadd_s_h(zero, wgt, vec2);
2463 tmp3 = __msa_dpadd_s_h(zero, wgt, vec3);
2464 tmp4 = __msa_dpadd_s_h(zero, wgt, vec4);
2465 tmp5 = __msa_dpadd_s_h(zero, wgt, vec5);
2466 tmp6 = __msa_dpadd_s_h(zero, wgt, vec6);
2467 tmp7 = __msa_dpadd_s_h(zero, wgt, vec7);
2468 tmp8 = __msa_dpadd_s_h(zero, wgt, vec8);
2469 tmp9 = __msa_dpadd_s_h(zero, wgt, vec9);
2470 tmp10 = __msa_dpadd_s_h(zero, wgt, vec10);
2471 tmp11 = __msa_dpadd_s_h(zero, wgt, vec11);
2472 tmp12 = __msa_dpadd_s_h(zero, wgt, vec12);
2473 tmp13 = __msa_dpadd_s_h(zero, wgt, vec13);
2474 tmp14 = __msa_dpadd_s_h(zero, wgt, vec14);
2475 tmp15 = __msa_dpadd_s_h(zero, wgt, vec15);
2476 tmp0 = __msa_adds_s_h(tmp0, offset);
2477 tmp1 = __msa_adds_s_h(tmp1, offset);
2478 tmp2 = __msa_adds_s_h(tmp2, offset);
2479 tmp3 = __msa_adds_s_h(tmp3, offset);
2480 tmp4 = __msa_adds_s_h(tmp4, offset);
2481 tmp5 = __msa_adds_s_h(tmp5, offset);
2482 tmp6 = __msa_adds_s_h(tmp6, offset);
2483 tmp7 = __msa_adds_s_h(tmp7, offset);
2484 tmp8 = __msa_adds_s_h(tmp8, offset);
2485 tmp9 = __msa_adds_s_h(tmp9, offset);
2486 tmp10 = __msa_adds_s_h(tmp10, offset);
2487 tmp11 = __msa_adds_s_h(tmp11, offset);
2488 tmp12 = __msa_adds_s_h(tmp12, offset);
2489 tmp13 = __msa_adds_s_h(tmp13, offset);
2490 tmp14 = __msa_adds_s_h(tmp14, offset);
2491 tmp15 = __msa_adds_s_h(tmp15, offset);
2492 SRA_4V(tmp0, tmp1, tmp2, tmp3, denom);
2493 SRA_4V(tmp4, tmp5, tmp6, tmp7, denom);
2494 SRA_4V(tmp8, tmp9, tmp10, tmp11, denom);
2495 SRA_4V(tmp12, tmp13, tmp14, tmp15, denom);
2496 CLIP_SH8_0_255(tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7);
2497 CLIP_SH8_0_255(tmp8, tmp9, tmp10, tmp11, tmp12, tmp13, tmp14, tmp15);
2498 PCKEV_B4_UB(tmp1, tmp0, tmp3, tmp2, tmp5, tmp4, tmp7, tmp6, dst0, dst1,
2499 dst2, dst3);
2500 PCKEV_B4_UB(tmp9, tmp8, tmp11, tmp10, tmp13, tmp12, tmp15, tmp14, dst4,
2501 dst5, dst6, dst7);
2502 ST_UB8(dst0, dst1, dst2, dst3, dst4, dst5, dst6, dst7, dst, stride);
2503 }
2504}
2505
2507 ptrdiff_t stride, int height,
2508 int log2_denom, int weight_dst,
2509 int weight_src, int offset)
2510{
2511 if (4 == height) {
2512 avc_biwgt_8x4_msa(src, dst, stride, log2_denom, weight_src, weight_dst,
2513 offset);
2514 } else if (8 == height) {
2515 avc_biwgt_8x8_msa(src, dst, stride, log2_denom, weight_src, weight_dst,
2516 offset);
2517 } else {
2518 avc_biwgt_8x16_msa(src, dst, stride, log2_denom, weight_src, weight_dst,
2519 offset);
2520 }
2521}
2522
2524 ptrdiff_t stride, int height,
2525 int log2_denom, int weight_dst,
2526 int weight_src, int offset)
2527{
2528 if (2 == height) {
2529 avc_biwgt_4x2_msa(src, dst, stride, log2_denom, weight_src, weight_dst,
2530 offset);
2531 } else if (4 == height) {
2532 avc_biwgt_4x4_msa(src, dst, stride, log2_denom, weight_src, weight_dst,
2533 offset);
2534 } else {
2535 avc_biwgt_4x8_msa(src, dst, stride, log2_denom, weight_src, weight_dst,
2536 offset);
2537 }
2538}
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition dsp.h:87
int32_t
#define flags(name, subs,...)
Definition cbs_h264.c:74
#define f(width, name)
Definition cbs_vp8.c:236
#define LD_UB4(...)
#define ILVR_B4_UH(...)
#define INSERT_W4_UB(...)
#define LD_SH8(...)
#define CLIP_SH2_0_255(in0, in1)
#define XORI_B2_128_UB(...)
#define LW2(psrc, stride, out0, out1)
#define ILVR_W2_UB(...)
#define SH(val, pdst)
#define LD4(psrc, stride, out0, out1, out2, out3)
#define PCKEV_B4_UB(...)
#define ST_D4(in0, in1, idx0, idx1, idx2, idx3, pdst, stride)
#define ILVR_H2_SH(...)
#define XORI_B8_128_UB(...)
#define ILVR_B4_SB(...)
#define PCKEV_B2_UB(...)
#define ADDS_SH2_SH(...)
#define ILVRL_B2_SH(...)
#define ILVR_B4_SH(...)
#define SLDI_B4_SB(...)
#define MUL4(in0, in1, in2, in3, in4, in5, in6, in7, out0, out1, out2, out3)
#define SRLR_H8_SH(...)
#define LW(psrc)
#define XORI_B4_128_UB(...)
#define CLIP_SH4_0_255(in0, in1, in2, in3)
#define TRANSPOSE8x4_UB_UB(...)
#define ILVL_B4_SB(...)
#define ILVRL_H2_SH(...)
#define SAT_UH4_SH(...)
#define ILVR_B2_UB(...)
#define MAXI_SH8_SH(...)
#define ST_D8(in0, in1, in2, in3, idx0, idx1, idx2, idx3, idx4, idx5, idx6, idx7, pdst, stride)
#define PCKEV_B3_UB(...)
#define MAXI_SH2_SH(...)
#define TRANSPOSE16x8_UB_UB(in0, in1, in2, in3, in4, in5, in6, in7, in8, in9, in10, in11, in12, in13, in14, in15, out0, out1, out2, out3, out4, out5, out6, out7)
#define PCKEV_B2_SH(...)
#define ADDS_SH4_SH(...)
#define PCKEV_B4(RTYPE, in0, in1, in2, in3, in4, in5, in6, in7, out0, out1, out2, out3)
#define INSERT_W2_UB(...)
#define SRA_4V(in0, in1, in2, in3, shift)
#define ILVRL_H2_UB(...)
#define SRLR_H4_SH(...)
#define UNPCK_UB_SH(in, out0, out1)
#define CLIP_SH(in, min, max)
#define ST_W2(in, idx0, idx1, pdst, stride)
#define SW(val, pdst)
#define ST_W8(in0, in1, idx0, idx1, idx2, idx3, idx4, idx5, idx6, idx7, pdst, stride)
#define LW4(psrc, stride, out0, out1, out2, out3)
#define LD_UB8(...)
#define ILVL_H2_SH(...)
#define LD(psrc)
#define ILVR_W2_SB(...)
#define ILVRL_B2_SB(...)
#define ILVR_B2_SH(...)
#define LD_UB5(...)
#define SAT_UH2_SH(...)
#define ILVRL_H2_SW(...)
#define MAXI_SH4_SH(...)
#define SLDI_B2_UB(...)
#define SAT_UH8_SH(...)
#define MUL2(in0, in1, in2, in3, out0, out1)
#define ST_UB8(...)
#define INSERT_D2_UB(...)
#define ILVL_B4_SH(...)
#define ILVRL_B2(RTYPE, in0, in1, out0, out1)
#define ST_UB(...)
#define CLIP_SH8_0_255(in0, in1, in2, in3, in4, in5, in6, in7)
#define LD_UB(...)
#define ST_H4(in, idx0, idx1, idx2, idx3, pdst, stride)
#define ILVL_W2_SB(...)
#define ILVL_B2_SH(...)
static void avc_wgt_4x8_msa(uint8_t *data, ptrdiff_t stride, int32_t log2_denom, int32_t src_weight, int32_t offset_in)
Definition h264dsp_msa.c:78
#define AVC_LPF_H_2BYTE_CHROMA_422(src, stride, tc_val, alpha, beta, res)
void ff_biweight_h264_pixels8_8_msa(uint8_t *dst, uint8_t *src, ptrdiff_t stride, int height, int log2_denom, int weight_dst, int weight_src, int offset)
void ff_h264_h_loop_filter_luma_mbaff_msa(uint8_t *src, ptrdiff_t ystride, int32_t alpha, int32_t beta, int8_t *tc0)
#define AVC_LPF_P1_OR_Q1(p0_or_q0_org_in, q0_or_p0_org_in, p1_or_q1_org_in, p2_or_q2_org_in, negate_tc_in, tc_in, p1_or_q1_out)
static void avc_wgt_4x4_msa(uint8_t *data, ptrdiff_t stride, int32_t log2_denom, int32_t src_weight, int32_t offset_in)
Definition h264dsp_msa.c:51
void ff_biweight_h264_pixels4_8_msa(uint8_t *dst, uint8_t *src, ptrdiff_t stride, int height, int log2_denom, int weight_dst, int weight_src, int offset)
static void avc_loopfilter_luma_inter_edge_ver_msa(uint8_t *pPix, uint32_t iStride, uint8_t iAlpha, uint8_t iBeta, uint8_t *pTc)
static void avc_h_loop_filter_chroma422_mbaff_msa(uint8_t *src, ptrdiff_t stride, int32_t alpha_in, int32_t beta_in, int8_t *tc0)
static void avc_h_loop_filter_chroma422_msa(uint8_t *src, ptrdiff_t stride, int32_t alpha_in, int32_t beta_in, int8_t *tc0)
static void avc_loopfilter_cb_or_cr_intra_edge_hor_msa(uint8_t *data_cb_or_cr, uint8_t alpha_in, uint8_t beta_in, ptrdiff_t img_width)
void ff_h264_h_loop_filter_chroma422_msa(uint8_t *src, ptrdiff_t ystride, int32_t alpha, int32_t beta, int8_t *tc0)
static void avc_h_loop_filter_luma_mbaff_intra_msa(uint8_t *src, ptrdiff_t stride, int32_t alpha_in, int32_t beta_in)
void ff_weight_h264_pixels4_8_msa(uint8_t *src, ptrdiff_t stride, int height, int log2_denom, int weight_src, int offset)
#define AVC_LPF_P0P1P2_OR_Q0Q1Q2(p3_or_q3_org_in, p0_or_q0_org_in, q3_or_p3_org_in, p1_or_q1_org_in, p2_or_q2_org_in, q1_or_p1_org_in, p0_or_q0_out, p1_or_q1_out, p2_or_q2_out)
#define AVC_LPF_H_CHROMA_422(src, stride, tc_val, alpha, beta, res)
static void avc_wgt_8x4_msa(uint8_t *data, ptrdiff_t stride, int32_t log2_denom, int32_t src_weight, int32_t offset_in)
static void avc_loopfilter_cb_or_cr_inter_edge_ver_msa(uint8_t *data, uint8_t bs0, uint8_t bs1, uint8_t bs2, uint8_t bs3, uint8_t tc0, uint8_t tc1, uint8_t tc2, uint8_t tc3, uint8_t alpha_in, uint8_t beta_in, ptrdiff_t img_width)
static void avc_biwgt_8x4_msa(uint8_t *src, uint8_t *dst, ptrdiff_t stride, int32_t log2_denom, int32_t src_weight, int32_t dst_weight, int32_t offset_in)
void ff_h264_h_lpf_luma_inter_msa(uint8_t *data, ptrdiff_t img_width, int alpha, int beta, int8_t *tc)
#define AVC_LPF_P0_OR_Q0(p0_or_q0_org_in, q1_or_p1_org_in, p1_or_q1_org_in, p0_or_q0_out)
static void avc_wgt_8x16_msa(uint8_t *data, ptrdiff_t stride, int32_t log2_denom, int32_t src_weight, int32_t offset_in)
static void avc_loopfilter_luma_intra_edge_ver_msa(uint8_t *data, uint8_t alpha_in, uint8_t beta_in, ptrdiff_t img_width)
void ff_h264_v_lpf_luma_intra_msa(uint8_t *data, ptrdiff_t img_width, int alpha, int beta)
static void avc_biwgt_4x4_msa(uint8_t *src, uint8_t *dst, ptrdiff_t stride, int32_t log2_denom, int32_t src_weight, int32_t dst_weight, int32_t offset_in)
static void avc_wgt_4x2_msa(uint8_t *data, ptrdiff_t stride, int32_t log2_denom, int32_t src_weight, int32_t offset_in)
Definition h264dsp_msa.c:24
void ff_h264_h_lpf_luma_intra_msa(uint8_t *data, ptrdiff_t img_width, int alpha, int beta)
static void avc_biwgt_8x16_msa(uint8_t *src, uint8_t *dst, ptrdiff_t stride, int32_t log2_denom, int32_t src_weight, int32_t dst_weight, int32_t offset_in)
void ff_h264_h_loop_filter_chroma422_mbaff_msa(uint8_t *src, ptrdiff_t ystride, int32_t alpha, int32_t beta, int8_t *tc0)
static void avc_loopfilter_cb_or_cr_inter_edge_hor_msa(uint8_t *data, uint8_t bs0, uint8_t bs1, uint8_t bs2, uint8_t bs3, uint8_t tc0, uint8_t tc1, uint8_t tc2, uint8_t tc3, uint8_t alpha_in, uint8_t beta_in, ptrdiff_t img_width)
static void avc_wgt_8x8_msa(uint8_t *data, ptrdiff_t stride, int32_t log2_denom, int32_t src_weight, int32_t offset_in)
static void avc_biwgt_4x2_msa(uint8_t *src, uint8_t *dst, ptrdiff_t stride, int32_t log2_denom, int32_t src_weight, int32_t dst_weight, int32_t offset_in)
void ff_h264_h_lpf_chroma_inter_msa(uint8_t *data, ptrdiff_t img_width, int alpha, int beta, int8_t *tc)
void ff_weight_h264_pixels16_8_msa(uint8_t *src, ptrdiff_t stride, int height, int log2_denom, int weight_src, int offset_in)
void ff_h264_v_lpf_chroma_inter_msa(uint8_t *data, ptrdiff_t img_width, int alpha, int beta, int8_t *tc)
static void avc_loopfilter_luma_intra_edge_hor_msa(uint8_t *data, uint8_t alpha_in, uint8_t beta_in, ptrdiff_t img_width)
static void avc_biwgt_4x8_msa(uint8_t *src, uint8_t *dst, ptrdiff_t stride, int32_t log2_denom, int32_t src_weight, int32_t dst_weight, int32_t offset_in)
void ff_h264_v_lpf_chroma_intra_msa(uint8_t *data, ptrdiff_t img_width, int alpha, int beta)
void ff_h264_h_lpf_chroma_intra_msa(uint8_t *data, ptrdiff_t img_width, int alpha, int beta)
static void avc_h_loop_filter_luma_mbaff_msa(uint8_t *in, ptrdiff_t stride, int32_t alpha_in, int32_t beta_in, int8_t *tc0)
void ff_biweight_h264_pixels16_8_msa(uint8_t *dst, uint8_t *src, ptrdiff_t stride, int height, int log2_denom, int weight_dst, int weight_src, int offset_in)
static void avc_biwgt_8x8_msa(uint8_t *src, uint8_t *dst, ptrdiff_t stride, int32_t log2_denom, int32_t src_weight, int32_t dst_weight, int32_t offset_in)
void ff_h264_v_lpf_luma_inter_msa(uint8_t *data, ptrdiff_t img_width, int alpha, int beta, int8_t *tc)
void ff_h264_h_loop_filter_luma_mbaff_intra_msa(uint8_t *src, ptrdiff_t ystride, int32_t alpha, int32_t beta)
static void avc_loopfilter_cb_or_cr_intra_edge_ver_msa(uint8_t *data_cb_or_cr, uint8_t alpha_in, uint8_t beta_in, ptrdiff_t img_width)
void ff_weight_h264_pixels8_8_msa(uint8_t *src, ptrdiff_t stride, int height, int log2_denom, int weight_src, int offset)
static void avc_loopfilter_luma_inter_edge_hor_msa(uint8_t *data, uint8_t bs0, uint8_t bs1, uint8_t bs2, uint8_t bs3, uint8_t tc0, uint8_t tc1, uint8_t tc2, uint8_t tc3, uint8_t alpha_in, uint8_t beta_in, ptrdiff_t image_width)
#define AVC_LPF_P0Q0(q0_or_p0_org_in, p0_or_q0_org_in, p1_or_q1_org_in, q1_or_p1_org_in, negate_threshold_in, threshold_in, p0_or_q0_out, q0_or_p0_out)
const pixel * src2
static const int16_t alpha[]
Definition ilbcdata.h:55
static int zero(InterplayACMContext *s, unsigned ind, unsigned col)
unsigned offset
Definition libaomenc.c:763
const char data[16]
Definition mxf.c:149
#define stride
#define src1
Definition h264pred.c:141
#define src0
Definition h264pred.c:140
#define src
Definition vp8dsp.c:248
#define height
Definition dsp.h:89
static const uint8_t q1[256]
Definition twofish.c:100
static const uint8_t q0[256]
Definition twofish.c:81
#define ST_W4(in, idx0, idx1, idx2, idx3, pdst, stride)