1 /*
2 * Copyright (c) 2015 Manojkumar Bhosale (Manojkumar.Bhosale@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
24
26 /* 8 width cases */
27 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8,
28 /* 4 width cases */
29 0, 1, 1, 2, 2, 3, 3, 4, 16, 17, 17, 18, 18, 19, 19, 20,
30 /* 4 width cases */
31 8, 9, 9, 10, 10, 11, 11, 12, 24, 25, 25, 26, 26, 27, 27, 28
32 };
33
35 {-6, 123, 12, -1, 0, 0, 0, 0},
36 {2, -11, 108, 36, -8, 1, 0, 0}, /* New 1/4 pel 6 tap filter */
37 {-9, 93, 50, -6, 0, 0, 0, 0},
38 {3, -16, 77, 77, -16, 3, 0, 0}, /* New 1/2 pel 6 tap filter */
39 {-6, 50, 93, -9, 0, 0, 0, 0},
40 {1, -8, 36, 108, -11, 2, 0, 0}, /* New 1/4 pel 6 tap filter */
41 {-1, 12, 123, -6, 0, 0, 0, 0},
42 };
43
45 {112, 16},
46 {96, 32},
47 {80, 48},
48 {64, 64},
49 {48, 80},
50 {32, 96},
51 {16, 112}
52 };
53
54 #define HORIZ_6TAP_FILT(src0, src1, mask0, mask1, mask2, \
55 filt_h0, filt_h1, filt_h2) \
56 ( { \
57 v16i8 vec0_m, vec1_m, vec2_m; \
58 v8i16 hz_out_m; \
59 \
60 VSHF_B3_SB(src0, src1, src0, src1, src0, src1, mask0, mask1, mask2, \
61 vec0_m, vec1_m, vec2_m); \
62 hz_out_m = DPADD_SH3_SH(vec0_m, vec1_m, vec2_m, \
63 filt_h0, filt_h1, filt_h2); \
64 \
65 hz_out_m = __msa_srari_h(hz_out_m, 7); \
66 hz_out_m = __msa_sat_s_h(hz_out_m, 7); \
67 \
68 hz_out_m; \
69 } )
70
71 #define HORIZ_6TAP_4WID_4VECS_FILT(src0, src1, src2, src3, \
72 mask0, mask1, mask2, \
73 filt0, filt1, filt2, \
74 out0, out1) \
75 { \
76 v16i8 vec0_m, vec1_m, vec2_m, vec3_m, vec4_m, vec5_m; \
77 \
78 VSHF_B2_SB(src0, src1, src2, src3, mask0, mask0, vec0_m, vec1_m); \
79 DOTP_SB2_SH(vec0_m, vec1_m, filt0, filt0, out0, out1); \
80 VSHF_B2_SB(src0, src1, src2, src3, mask1, mask1, vec2_m, vec3_m); \
81 DPADD_SB2_SH(vec2_m, vec3_m, filt1, filt1, out0, out1); \
82 VSHF_B2_SB(src0, src1, src2, src3, mask2, mask2, vec4_m, vec5_m); \
83 DPADD_SB2_SH(vec4_m, vec5_m, filt2, filt2, out0, out1); \
84 }
85
86 #define HORIZ_6TAP_8WID_4VECS_FILT(src0, src1, src2, src3, \
87 mask0, mask1, mask2, \
88 filt0, filt1, filt2, \
89 out0, out1, out2, out3) \
90 { \
91 v16i8 vec0_m, vec1_m, vec2_m, vec3_m, vec4_m, vec5_m, vec6_m, vec7_m; \
92 \
93 VSHF_B2_SB(src0, src0, src1, src1, mask0, mask0, vec0_m, vec1_m); \
94 VSHF_B2_SB(src2, src2, src3, src3, mask0, mask0, vec2_m, vec3_m); \
95 DOTP_SB4_SH(vec0_m, vec1_m, vec2_m, vec3_m, filt0, filt0, filt0, filt0, \
96 out0, out1, out2, out3); \
97 VSHF_B2_SB(src0, src0, src1, src1, mask1, mask1, vec0_m, vec1_m); \
98 VSHF_B2_SB(src2, src2, src3, src3, mask1, mask1, vec2_m, vec3_m); \
99 VSHF_B2_SB(src0, src0, src1, src1, mask2, mask2, vec4_m, vec5_m); \
100 VSHF_B2_SB(src2, src2, src3, src3, mask2, mask2, vec6_m, vec7_m); \
101 DPADD_SB4_SH(vec0_m, vec1_m, vec2_m, vec3_m, filt1, filt1, filt1, filt1, \
102 out0, out1, out2, out3); \
103 DPADD_SB4_SH(vec4_m, vec5_m, vec6_m, vec7_m, filt2, filt2, filt2, filt2, \
104 out0, out1, out2, out3); \
105 }
106
107 #define FILT_4TAP_DPADD_S_H(vec0, vec1, filt0, filt1) \
108 ( { \
109 v8i16 tmp0; \
110 \
111 tmp0 = __msa_dotp_s_h((v16i8) vec0, (v16i8) filt0); \
112 tmp0 = __msa_dpadd_s_h(tmp0, (v16i8) vec1, (v16i8) filt1); \
113 \
114 tmp0; \
115 } )
116
117 #define HORIZ_4TAP_FILT(src0, src1, mask0, mask1, filt_h0, filt_h1) \
118 ( { \
119 v16i8 vec0_m, vec1_m; \
120 v8i16 hz_out_m; \
121 \
122 VSHF_B2_SB(src0, src1, src0, src1, mask0, mask1, vec0_m, vec1_m); \
123 hz_out_m = FILT_4TAP_DPADD_S_H(vec0_m, vec1_m, filt_h0, filt_h1); \
124 \
125 hz_out_m = __msa_srari_h(hz_out_m, 7); \
126 hz_out_m = __msa_sat_s_h(hz_out_m, 7); \
127 \
128 hz_out_m; \
129 } )
130
131 #define HORIZ_4TAP_4WID_4VECS_FILT(src0, src1, src2, src3, \
132 mask0, mask1, filt0, filt1, \
133 out0, out1) \
134 { \
135 v16i8 vec0_m, vec1_m, vec2_m, vec3_m; \
136 \
137 VSHF_B2_SB(src0, src1, src2, src3, mask0, mask0, vec0_m, vec1_m); \
138 DOTP_SB2_SH(vec0_m, vec1_m, filt0, filt0, out0, out1); \
139 VSHF_B2_SB(src0, src1, src2, src3, mask1, mask1, vec2_m, vec3_m); \
140 DPADD_SB2_SH(vec2_m, vec3_m, filt1, filt1, out0, out1); \
141 }
142
143 #define HORIZ_4TAP_8WID_4VECS_FILT(src0, src1, src2, src3, \
144 mask0, mask1, filt0, filt1, \
145 out0, out1, out2, out3) \
146 { \
147 v16i8 vec0_m, vec1_m, vec2_m, vec3_m; \
148 \
149 VSHF_B2_SB(src0, src0, src1, src1, mask0, mask0, vec0_m, vec1_m); \
150 VSHF_B2_SB(src2, src2, src3, src3, mask0, mask0, vec2_m, vec3_m); \
151 DOTP_SB4_SH(vec0_m, vec1_m, vec2_m, vec3_m, filt0, filt0, filt0, filt0, \
152 out0, out1, out2, out3); \
153 VSHF_B2_SB(src0, src0, src1, src1, mask1, mask1, vec0_m, vec1_m); \
154 VSHF_B2_SB(src2, src2, src3, src3, mask1, mask1, vec2_m, vec3_m); \
155 DPADD_SB4_SH(vec0_m, vec1_m, vec2_m, vec3_m, filt1, filt1, filt1, filt1, \
156 out0, out1, out2, out3); \
157 }
158
162 {
163 v16i8
src0,
src1, src2, src3, filt0, filt1, filt2;
164 v16u8 mask0, mask1, mask2,
out;
165 v8i16
filt, out0, out1;
166
168 src -= 2;
169
170 /* rearranging filter */
171 filt =
LD_SH(filter);
173
174 mask1 = mask0 + 2;
175 mask2 = mask0 + 4;
176
177 LD_SB4(src, src_stride, src0, src1, src2, src3);
180 filt0, filt1, filt2, out0, out1);
184 ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
185 }
186
190 {
191 v16i8
src0,
src1, src2, src3, filt0, filt1, filt2;
192 v16u8 mask0, mask1, mask2,
out;
193 v8i16
filt, out0, out1, out2, out3;
194
196 src -= 2;
197
198 /* rearranging filter */
199 filt =
LD_SH(filter);
201
202 mask1 = mask0 + 2;
203 mask2 = mask0 + 4;
204
205 LD_SB4(src, src_stride, src0, src1, src2, src3);
207 src += (4 * src_stride);
209 filt0, filt1, filt2, out0, out1);
210 LD_SB4(src, src_stride, src0, src1, src2, src3);
213 filt0, filt1, filt2, out2, out3);
217 ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
218 dst += (4 * dst_stride);
220 ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
221 }
222
225 int height,
int mx,
int my)
226 {
228
229 if (4 == height) {
231 } else if (8 == height) {
233 }
234 }
235
238 int height,
int mx,
int my)
239 {
240 uint32_t loop_cnt;
242 v16i8
src0,
src1, src2, src3, filt0, filt1, filt2;
243 v16u8 mask0, mask1, mask2, tmp0, tmp1;
244 v8i16
filt, out0, out1, out2, out3;
245
247
248 src -= 2;
249
250 /* rearranging filter */
251 filt =
LD_SH(filter);
253
254 mask1 = mask0 + 2;
255 mask2 = mask0 + 4;
256
257 LD_SB4(src, src_stride, src0, src1, src2, src3);
259 src += (4 * src_stride);
261 filt0, filt1, filt2, out0, out1, out2, out3);
266 ST8x4_UB(tmp0, tmp1, dst, dst_stride);
267 dst += (4 * dst_stride);
268
269 for (loop_cnt = (height >> 2) - 1; loop_cnt--;) {
270 LD_SB4(src, src_stride, src0, src1, src2, src3);
272 src += (4 * src_stride);
274 filt0, filt1, filt2, out0, out1, out2, out3);
279 ST8x4_UB(tmp0, tmp1, dst, dst_stride);
280 dst += (4 * dst_stride);
281 }
282 }
283
286 int height,
int mx,
int my)
287 {
288 uint32_t loop_cnt;
290 v16i8
src0,
src1, src2, src3, src4, src5, src6, src7, filt0, filt1, filt2;
291 v16u8 mask0, mask1, mask2,
out;
292 v8i16
filt, out0, out1, out2, out3, out4, out5, out6, out7;
293
295 src -= 2;
296
297 /* rearranging filter */
298 filt =
LD_SH(filter);
300
301 mask1 = mask0 + 2;
302 mask2 = mask0 + 4;
303
304 for (loop_cnt = (height >> 2); loop_cnt--;) {
305 LD_SB4(src, src_stride, src0, src2, src4, src6);
306 LD_SB4(src + 8, src_stride, src1, src3, src5, src7);
308 src += (4 * src_stride);
309
311 filt0, filt1, filt2, out0, out1, out2, out3);
313 filt0, filt1, filt2, out4, out5, out6, out7);
320 dst += dst_stride;
323 dst += dst_stride;
326 dst += dst_stride;
329 dst += dst_stride;
330 }
331 }
332
335 int height,
int mx,
int my)
336 {
337 uint32_t loop_cnt;
339 v16i8
src0,
src1, src2, src3, src4, src5, src6, src7, src8;
340 v16i8 src10_r, src32_r, src54_r, src76_r, src21_r, src43_r, src65_r;
341 v16i8 src87_r, src2110, src4332, src6554, src8776, filt0, filt1, filt2;
343 v8i16
filt, out10, out32;
344
345 src -= (2 * src_stride);
346
347 filt =
LD_SH(filter);
349
350 LD_SB5(src, src_stride, src0, src1, src2, src3, src4);
351 src += (5 * src_stride);
352
353 ILVR_B4_SB(src1, src0, src2, src1, src3, src2, src4, src3, src10_r, src21_r,
354 src32_r, src43_r);
355 ILVR_D2_SB(src21_r, src10_r, src43_r, src32_r, src2110, src4332);
357
358 for (loop_cnt = (height >> 2); loop_cnt--;) {
359 LD_SB4(src, src_stride, src5, src6, src7, src8);
360 src += (4 * src_stride);
361
362 ILVR_B4_SB(src5, src4, src6, src5, src7, src6, src8, src7, src54_r,
363 src65_r, src76_r, src87_r);
364 ILVR_D2_SB(src65_r, src54_r, src87_r, src76_r, src6554, src8776);
366 out10 =
DPADD_SH3_SH(src2110, src4332, src6554, filt0, filt1, filt2);
367 out32 =
DPADD_SH3_SH(src4332, src6554, src8776, filt0, filt1, filt2);
371 ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
372 dst += (4 * dst_stride);
373
374 src2110 = src6554;
375 src4332 = src8776;
376 src4 = src8;
377 }
378 }
379
382 int height,
int mx,
int my)
383 {
384 uint32_t loop_cnt;
386 v16i8
src0,
src1, src2, src3, src4, src7, src8, src9, src10;
387 v16i8 src10_r, src32_r, src76_r, src98_r, src21_r, src43_r, src87_r;
388 v16i8 src109_r, filt0, filt1, filt2;
389 v16u8 tmp0, tmp1;
390 v8i16
filt, out0_r, out1_r, out2_r, out3_r;
391
392 src -= (2 * src_stride);
393
394 filt =
LD_SH(filter);
396
397 LD_SB5(src, src_stride, src0, src1, src2, src3, src4);
398 src += (5 * src_stride);
399
401 ILVR_B4_SB(src1, src0, src3, src2, src2, src1, src4, src3,
402 src10_r, src32_r, src21_r, src43_r);
403
404 for (loop_cnt = (height >> 2); loop_cnt--;) {
405 LD_SB4(src, src_stride, src7, src8, src9, src10);
407 src += (4 * src_stride);
408
409 ILVR_B4_SB(src7, src4, src8, src7, src9, src8, src10, src9, src76_r,
410 src87_r, src98_r, src109_r);
411 out0_r =
DPADD_SH3_SH(src10_r, src32_r, src76_r, filt0, filt1, filt2);
412 out1_r =
DPADD_SH3_SH(src21_r, src43_r, src87_r, filt0, filt1, filt2);
413 out2_r =
DPADD_SH3_SH(src32_r, src76_r, src98_r, filt0, filt1, filt2);
414 out3_r =
DPADD_SH3_SH(src43_r, src87_r, src109_r, filt0, filt1, filt2);
416 SAT_SH4_SH(out0_r, out1_r, out2_r, out3_r, 7);
419 ST8x4_UB(tmp0, tmp1, dst, dst_stride);
420 dst += (4 * dst_stride);
421
422 src10_r = src76_r;
423 src32_r = src98_r;
424 src21_r = src87_r;
425 src43_r = src109_r;
426 src4 = src10;
427 }
428 }
429
432 int height,
int mx,
int my)
433 {
434 uint32_t loop_cnt;
436 v16i8
src0,
src1, src2, src3, src4, src5, src6, src7, src8;
437 v16i8 src10_r, src32_r, src54_r, src76_r, src21_r, src43_r, src65_r;
438 v16i8 src87_r, src10_l, src32_l, src54_l, src76_l, src21_l, src43_l;
439 v16i8 src65_l, src87_l, filt0, filt1, filt2;
440 v16u8 tmp0, tmp1, tmp2, tmp3;
441 v8i16 out0_r, out1_r, out2_r, out3_r, out0_l, out1_l, out2_l, out3_l,
filt;
442
443 src -= (2 * src_stride);
444
445 filt =
LD_SH(filter);
447
448 LD_SB5(src, src_stride, src0, src1, src2, src3, src4);
449 src += (5 * src_stride);
450
452 ILVR_B4_SB(src1, src0, src3, src2, src4, src3, src2, src1, src10_r,
453 src32_r, src43_r, src21_r);
454 ILVL_B4_SB(src1, src0, src3, src2, src4, src3, src2, src1, src10_l,
455 src32_l, src43_l, src21_l);
456
457 for (loop_cnt = (height >> 2); loop_cnt--;) {
458 LD_SB4(src, src_stride, src5, src6, src7, src8);
459 src += (4 * src_stride);
460
462 ILVR_B4_SB(src5, src4, src6, src5, src7, src6, src8, src7, src54_r,
463 src65_r, src76_r, src87_r);
464 ILVL_B4_SB(src5, src4, src6, src5, src7, src6, src8, src7, src54_l,
465 src65_l, src76_l, src87_l);
466 out0_r =
DPADD_SH3_SH(src10_r, src32_r, src54_r, filt0, filt1,
467 filt2);
468 out1_r =
DPADD_SH3_SH(src21_r, src43_r, src65_r, filt0, filt1,
469 filt2);
470 out2_r =
DPADD_SH3_SH(src32_r, src54_r, src76_r, filt0, filt1,
471 filt2);
472 out3_r =
DPADD_SH3_SH(src43_r, src65_r, src87_r, filt0, filt1,
473 filt2);
474 out0_l =
DPADD_SH3_SH(src10_l, src32_l, src54_l, filt0, filt1,
475 filt2);
476 out1_l =
DPADD_SH3_SH(src21_l, src43_l, src65_l, filt0, filt1,
477 filt2);
478 out2_l =
DPADD_SH3_SH(src32_l, src54_l, src76_l, filt0, filt1,
479 filt2);
480 out3_l =
DPADD_SH3_SH(src43_l, src65_l, src87_l, filt0, filt1,
481 filt2);
484 SAT_SH4_SH(out0_r, out1_r, out2_r, out3_r, 7);
485 SAT_SH4_SH(out0_l, out1_l, out2_l, out3_l, 7);
486 PCKEV_B4_UB(out0_l, out0_r, out1_l, out1_r, out2_l, out2_r, out3_l,
487 out3_r, tmp0, tmp1, tmp2, tmp3);
489 ST_UB4(tmp0, tmp1, tmp2, tmp3, dst, dst_stride);
490 dst += (4 * dst_stride);
491
492 src10_r = src54_r;
493 src32_r = src76_r;
494 src21_r = src65_r;
495 src43_r = src87_r;
496 src10_l = src54_l;
497 src32_l = src76_l;
498 src21_l = src65_l;
499 src43_l = src87_l;
500 src4 = src8;
501 }
502 }
503
506 int height,
int mx,
int my)
507 {
508 uint32_t loop_cnt;
511 v16i8
src0,
src1, src2, src3, src4, src5, src6, src7, src8;
512 v16i8 filt_hz0, filt_hz1, filt_hz2;
513 v16u8 mask0, mask1, mask2,
out;
514 v8i16 tmp0, tmp1;
515 v8i16 hz_out0, hz_out1, hz_out2, hz_out3, hz_out4, hz_out5, hz_out6;
516 v8i16 hz_out7,
filt, filt_vt0, filt_vt1, filt_vt2, out0, out1, out2, out3;
517
519 src -= (2 + 2 * src_stride);
520
521 /* rearranging filter */
522 filt =
LD_SH(filter_horiz);
523 SPLATI_H3_SB(filt, 0, 1, 2, filt_hz0, filt_hz1, filt_hz2);
524
525 filt =
LD_SH(filter_vert);
526 SPLATI_H3_SH(filt, 0, 1, 2, filt_vt0, filt_vt1, filt_vt2);
527
528 mask1 = mask0 + 2;
529 mask2 = mask0 + 4;
530
531 LD_SB5(src, src_stride, src0, src1, src2, src3, src4);
532 src += (5 * src_stride);
533
536 filt_hz1, filt_hz2);
538 filt_hz1, filt_hz2);
539 hz_out1 = (v8i16) __msa_sldi_b((v16i8) hz_out2, (v16i8) hz_out0, 8);
541 filt_hz1, filt_hz2);
542 ILVEV_B2_SH(hz_out0, hz_out1, hz_out2, hz_out3, out0, out1);
543
544 for (loop_cnt = (height >> 2); loop_cnt--;) {
545 LD_SB2(src, src_stride, src5, src6);
546 src += (2 * src_stride);
547
550 filt_hz1, filt_hz2);
551 hz_out4 = (v8i16) __msa_sldi_b((v16i8) hz_out5, (v16i8) hz_out3, 8);
552
553 LD_SB2(src, src_stride, src7, src8);
554 src += (2 * src_stride);
555
558 filt_hz1, filt_hz2);
559 hz_out6 = (v8i16) __msa_sldi_b((v16i8) hz_out7, (v16i8) hz_out5, 8);
560
561 out2 = (v8i16) __msa_ilvev_b((v16i8) hz_out5, (v16i8) hz_out4);
562 tmp0 =
DPADD_SH3_SH(out0, out1, out2, filt_vt0, filt_vt1, filt_vt2);
563
564 out3 = (v8i16) __msa_ilvev_b((v16i8) hz_out7, (v16i8) hz_out6);
565 tmp1 =
DPADD_SH3_SH(out1, out2, out3, filt_vt0, filt_vt1, filt_vt2);
566
570 ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
571 dst += (4 * dst_stride);
572
573 hz_out3 = hz_out7;
574 out0 = out2;
575 out1 = out3;
576 }
577 }
578
581 int height,
int mx,
int my)
582 {
583 uint32_t loop_cnt;
586 v16i8
src0,
src1, src2, src3, src4, src5, src6, src7, src8;
587 v16i8 filt_hz0, filt_hz1, filt_hz2;
588 v16u8 mask0, mask1, mask2, vec0, vec1;
589 v8i16
filt, filt_vt0, filt_vt1, filt_vt2;
590 v8i16 hz_out0, hz_out1, hz_out2, hz_out3, hz_out4, hz_out5, hz_out6;
591 v8i16 hz_out7, hz_out8, out0, out1, out2, out3, out4, out5, out6, out7;
592 v8i16 tmp0, tmp1, tmp2, tmp3;
593
595 src -= (2 + 2 * src_stride);
596
597 /* rearranging filter */
598 filt =
LD_SH(filter_horiz);
599 SPLATI_H3_SB(filt, 0, 1, 2, filt_hz0, filt_hz1, filt_hz2);
600
601 mask1 = mask0 + 2;
602 mask2 = mask0 + 4;
603
604 LD_SB5(src, src_stride, src0, src1, src2, src3, src4);
605 src += (5 * src_stride);
606
609 filt_hz1, filt_hz2);
611 filt_hz1, filt_hz2);
613 filt_hz1, filt_hz2);
615 filt_hz1, filt_hz2);
617 filt_hz1, filt_hz2);
618
619 filt =
LD_SH(filter_vert);
620 SPLATI_H3_SH(filt, 0, 1, 2, filt_vt0, filt_vt1, filt_vt2);
621
622 ILVEV_B2_SH(hz_out0, hz_out1, hz_out2, hz_out3, out0, out1);
623 ILVEV_B2_SH(hz_out1, hz_out2, hz_out3, hz_out4, out3, out4);
624
625 for (loop_cnt = (height >> 2); loop_cnt--;) {
626 LD_SB4(src, src_stride, src5, src6, src7, src8);
627 src += (4 * src_stride);
628
631 filt_hz1, filt_hz2);
632 out2 = (v8i16) __msa_ilvev_b((v16i8) hz_out5, (v16i8) hz_out4);
633 tmp0 =
DPADD_SH3_SH(out0, out1, out2, filt_vt0, filt_vt1, filt_vt2);
634
636 filt_hz1, filt_hz2);
637 out5 = (v8i16) __msa_ilvev_b((v16i8) hz_out6, (v16i8) hz_out5);
638 tmp1 =
DPADD_SH3_SH(out3, out4, out5, filt_vt0, filt_vt1, filt_vt2);
639
641 filt_hz1, filt_hz2);
642 out7 = (v8i16) __msa_ilvev_b((v16i8) hz_out7, (v16i8) hz_out6);
643 tmp2 =
DPADD_SH3_SH(out1, out2, out7, filt_vt0, filt_vt1, filt_vt2);
644
646 filt_hz1, filt_hz2);
647 out6 = (v8i16) __msa_ilvev_b((v16i8) hz_out8, (v16i8) hz_out7);
648 tmp3 =
DPADD_SH3_SH(out4, out5, out6, filt_vt0, filt_vt1, filt_vt2);
649
654 ST8x4_UB(vec0, vec1, dst, dst_stride);
655 dst += (4 * dst_stride);
656
657 hz_out4 = hz_out8;
658 out0 = out2;
659 out1 = out7;
660 out3 = out5;
661 out4 = out6;
662 }
663 }
664
665
668 int height,
int mx,
int my)
669 {
671
672 for (multiple8_cnt = 2; multiple8_cnt--;) {
674 mx, my);
675
676 src += 8;
677 dst += 8;
678 }
679 }
680
684 {
685 v16i8
src0,
src1, src2, src3, filt0, filt1, mask0, mask1;
686 v8i16
filt, out0, out1;
688
690 src -= 1;
691
692 /* rearranging filter */
693 filt =
LD_SH(filter);
695
696 mask1 = mask0 + 2;
697
698 LD_SB4(src, src_stride, src0, src1, src2, src3);
701 filt0, filt1, out0, out1);
705 ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
706 }
707
711 {
712 v16i8
src0,
src1, src2, src3, filt0, filt1, mask0, mask1;
714 v8i16
filt, out0, out1, out2, out3;
715
717 src -= 1;
718
719 /* rearranging filter */
720 filt =
LD_SH(filter);
722
723 mask1 = mask0 + 2;
724
725 LD_SB4(src, src_stride, src0, src1, src2, src3);
726 src += (4 * src_stride);
727
730 filt0, filt1, out0, out1);
731 LD_SB4(src, src_stride, src0, src1, src2, src3);
734 filt0, filt1, out2, out3);
738 ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
739 dst += (4 * dst_stride);
741 ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
742 }
743
747 {
748 v16i8
src0,
src1, src2, src3, src4, src5, src6, src7;
749 v16i8 filt0, filt1, mask0, mask1;
751 v8i16
filt, out0, out1, out2, out3;
752
754 src -= 1;
755
756 /* rearranging filter */
757 filt =
LD_SH(filter);
759
760 mask1 = mask0 + 2;
761
762 LD_SB8(src, src_stride, src0, src1, src2, src3, src4, src5, src6, src7);
763 src += (8 * src_stride);
766 filt0, filt1, out0, out1);
768 filt0, filt1, out2, out3);
772 ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
773 dst += (4 * dst_stride);
775 ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
776 dst += (4 * dst_stride);
777
778 LD_SB8(src, src_stride, src0, src1, src2, src3, src4, src5, src6, src7);
779 src += (8 * src_stride);
782 filt0, filt1, out0, out1);
784 filt0, filt1, out2, out3);
788 ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
789 dst += (4 * dst_stride);
791 ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
792 }
793
796 int height,
int mx,
int my)
797 {
799
800 if (4 == height) {
802 } else if (8 == height) {
804 } else if (16 == height) {
806 }
807 }
808
811 int height,
int mx,
int my)
812 {
813 uint32_t loop_cnt;
815 v16i8
src0,
src1, src2, src3, filt0, filt1, mask0, mask1;
816 v16u8 tmp0, tmp1;
817 v8i16
filt, out0, out1, out2, out3;
818
820 src -= 1;
821
822 /* rearranging filter */
823 filt =
LD_SH(filter);
825
826 mask1 = mask0 + 2;
827
828 for (loop_cnt = (height >> 2); loop_cnt--;) {
829 LD_SB4(src, src_stride, src0, src1, src2, src3);
830 src += (4 * src_stride);
831
834 filt1, out0, out1, out2, out3);
839 ST8x4_UB(tmp0, tmp1, dst, dst_stride);
840 dst += (4 * dst_stride);
841 }
842 }
843
846 int height,
int mx,
int my)
847 {
848 uint32_t loop_cnt;
850 v16i8
src0,
src1, src2, src3, src4, src5, src6, src7;
851 v16i8 filt0, filt1, mask0, mask1;
852 v8i16
filt, out0, out1, out2, out3, out4, out5, out6, out7;
854
856 src -= 1;
857
858 /* rearranging filter */
859 filt =
LD_SH(filter);
861
862 mask1 = mask0 + 2;
863
864 for (loop_cnt = (height >> 2); loop_cnt--;) {
865 LD_SB4(src, src_stride, src0, src2, src4, src6);
866 LD_SB4(src + 8, src_stride, src1, src3, src5, src7);
867 src += (4 * src_stride);
868
871 filt1, out0, out1, out2, out3);
873 filt1, out4, out5, out6, out7);
880 dst += dst_stride;
883 dst += dst_stride;
886 dst += dst_stride;
889 dst += dst_stride;
890 }
891 }
892
895 int height,
int mx,
int my)
896 {
897 uint32_t loop_cnt;
899 v16i8
src0,
src1, src2, src3, src4, src5;
900 v16i8 src10_r, src32_r, src54_r, src21_r, src43_r, src65_r;
901 v16i8 src2110, src4332, filt0, filt1;
902 v8i16
filt, out10, out32;
904
905 src -= src_stride;
906
907 filt =
LD_SH(filter);
909
910 LD_SB3(src, src_stride, src0, src1, src2);
911 src += (3 * src_stride);
912
913 ILVR_B2_SB(src1, src0, src2, src1, src10_r, src21_r);
914
915 src2110 = (v16i8) __msa_ilvr_d((v2i64) src21_r, (v2i64) src10_r);
916 src2110 = (v16i8) __msa_xori_b((v16u8) src2110, 128);
917
918 for (loop_cnt = (height >> 2); loop_cnt--;) {
919 LD_SB3(src, src_stride, src3, src4, src5);
920 src += (3 * src_stride);
921 ILVR_B2_SB(src3, src2, src4, src3, src32_r, src43_r);
922 src4332 = (v16i8) __msa_ilvr_d((v2i64) src43_r, (v2i64) src32_r);
923 src4332 = (v16i8) __msa_xori_b((v16u8) src4332, 128);
925
927 src += (src_stride);
928 ILVR_B2_SB(src5, src4, src2, src5, src54_r, src65_r);
929 src2110 = (v16i8) __msa_ilvr_d((v2i64) src65_r, (v2i64) src54_r);
930 src2110 = (v16i8) __msa_xori_b((v16u8) src2110, 128);
935 ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
936 dst += (4 * dst_stride);
937 }
938 }
939
942 int height,
int mx,
int my)
943 {
944 uint32_t loop_cnt;
946 v16i8
src0,
src1, src2, src7, src8, src9, src10;
947 v16i8 src10_r, src72_r, src98_r, src21_r, src87_r, src109_r, filt0, filt1;
948 v16u8 tmp0, tmp1;
949 v8i16
filt, out0_r, out1_r, out2_r, out3_r;
950
951 src -= src_stride;
952
953 filt =
LD_SH(filter);
955
956 LD_SB3(src, src_stride, src0, src1, src2);
957 src += (3 * src_stride);
958
960 ILVR_B2_SB(src1, src0, src2, src1, src10_r, src21_r);
961
962 for (loop_cnt = (height >> 2); loop_cnt--;) {
963 LD_SB4(src, src_stride, src7, src8, src9, src10);
964 src += (4 * src_stride);
965
967 ILVR_B4_SB(src7, src2, src8, src7, src9, src8, src10, src9,
968 src72_r, src87_r, src98_r, src109_r);
974 SAT_SH4_SH(out0_r, out1_r, out2_r, out3_r, 7);
977 ST8x4_UB(tmp0, tmp1, dst, dst_stride);
978 dst += (4 * dst_stride);
979
980 src10_r = src98_r;
981 src21_r = src109_r;
982 src2 = src10;
983 }
984 }
985
988 int height,
int mx,
int my)
989 {
990 uint32_t loop_cnt;
992 v16i8
src0,
src1, src2, src3, src4, src5, src6;
993 v16i8 src10_r, src32_r, src54_r, src21_r, src43_r, src65_r, src10_l;
994 v16i8 src32_l, src54_l, src21_l, src43_l, src65_l, filt0, filt1;
995 v16u8 tmp0, tmp1, tmp2, tmp3;
996 v8i16
filt, out0_r, out1_r, out2_r, out3_r, out0_l, out1_l, out2_l, out3_l;
997
998 src -= src_stride;
999
1000 filt =
LD_SH(filter);
1002
1003 LD_SB3(src, src_stride, src0, src1, src2);
1004 src += (3 * src_stride);
1005
1007 ILVR_B2_SB(src1, src0, src2, src1, src10_r, src21_r);
1008 ILVL_B2_SB(src1, src0, src2, src1, src10_l, src21_l);
1009
1010 for (loop_cnt = (height >> 2); loop_cnt--;) {
1011 LD_SB4(src, src_stride, src3, src4, src5, src6);
1012 src += (4 * src_stride);
1013
1015 ILVR_B4_SB(src3, src2, src4, src3, src5, src4, src6, src5,
1016 src32_r, src43_r, src54_r, src65_r);
1017 ILVL_B4_SB(src3, src2, src4, src3, src5, src4, src6, src5,
1018 src32_l, src43_l, src54_l, src65_l);
1029 SAT_SH4_SH(out0_r, out1_r, out2_r, out3_r, 7);
1030 SAT_SH4_SH(out0_l, out1_l, out2_l, out3_l, 7);
1031 PCKEV_B4_UB(out0_l, out0_r, out1_l, out1_r, out2_l, out2_r, out3_l,
1032 out3_r, tmp0, tmp1, tmp2, tmp3);
1034 ST_UB4(tmp0, tmp1, tmp2, tmp3, dst, dst_stride);
1035 dst += (4 * dst_stride);
1036
1037 src10_r = src54_r;
1038 src21_r = src65_r;
1039 src10_l = src54_l;
1040 src21_l = src65_l;
1041 src2 = src6;
1042 }
1043 }
1044
1047 int height,
int mx,
int my)
1048 {
1049 uint32_t loop_cnt;
1052 v16i8
src0,
src1, src2, src3, src4, src5, src6, filt_hz0, filt_hz1;
1053 v16u8 mask0, mask1,
out;
1054 v8i16
filt, filt_vt0, filt_vt1, tmp0, tmp1, vec0, vec1, vec2;
1055 v8i16 hz_out0, hz_out1, hz_out2, hz_out3, hz_out4, hz_out5;
1056
1058 src -= (1 + 1 * src_stride);
1059
1060 /* rearranging filter */
1061 filt =
LD_SH(filter_horiz);
1063
1064 mask1 = mask0 + 2;
1065
1066 LD_SB3(src, src_stride, src0, src1, src2);
1067 src += (3 * src_stride);
1068
1070 hz_out0 =
HORIZ_4TAP_FILT(src0, src1, mask0, mask1, filt_hz0, filt_hz1);
1071 hz_out1 =
HORIZ_4TAP_FILT(src1, src2, mask0, mask1, filt_hz0, filt_hz1);
1072 vec0 = (v8i16) __msa_ilvev_b((v16i8) hz_out1, (v16i8) hz_out0);
1073
1074 filt =
LD_SH(filter_vert);
1076
1077 for (loop_cnt = (height >> 2); loop_cnt--;) {
1078 LD_SB4(src, src_stride, src3, src4, src5, src6);
1079 src += (4 * src_stride);
1080
1082 hz_out3 =
HORIZ_4TAP_FILT(src3, src4, mask0, mask1, filt_hz0, filt_hz1);
1083 hz_out2 = (v8i16) __msa_sldi_b((v16i8) hz_out3, (v16i8) hz_out1, 8);
1084 vec1 = (v8i16) __msa_ilvev_b((v16i8) hz_out3, (v16i8) hz_out2);
1086
1088 hz_out5 =
HORIZ_4TAP_FILT(src5, src6, mask0, mask1, filt_hz0, filt_hz1);
1089 hz_out4 = (v8i16) __msa_sldi_b((v16i8) hz_out5, (v16i8) hz_out3, 8);
1090 vec2 = (v8i16) __msa_ilvev_b((v16i8) hz_out5, (v16i8) hz_out4);
1092
1096 ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
1097 dst += (4 * dst_stride);
1098
1099 hz_out1 = hz_out5;
1100 vec0 = vec2;
1101 }
1102 }
1103
1106 int height,
int mx,
int my)
1107 {
1108 uint32_t loop_cnt;
1111 v16i8
src0,
src1, src2, src3, src4, src5, src6, filt_hz0, filt_hz1;
1112 v16u8 mask0, mask1, out0, out1;
1113 v8i16
filt, filt_vt0, filt_vt1, tmp0, tmp1, tmp2, tmp3;
1114 v8i16 hz_out0, hz_out1, hz_out2, hz_out3;
1115 v8i16 vec0, vec1, vec2, vec3, vec4;
1116
1118 src -= (1 + 1 * src_stride);
1119
1120 /* rearranging filter */
1121 filt =
LD_SH(filter_horiz);
1123
1124 mask1 = mask0 + 2;
1125
1126 LD_SB3(src, src_stride, src0, src1, src2);
1127 src += (3 * src_stride);
1128
1130 hz_out0 =
HORIZ_4TAP_FILT(src0, src0, mask0, mask1, filt_hz0, filt_hz1);
1131 hz_out1 =
HORIZ_4TAP_FILT(src1, src1, mask0, mask1, filt_hz0, filt_hz1);
1132 hz_out2 =
HORIZ_4TAP_FILT(src2, src2, mask0, mask1, filt_hz0, filt_hz1);
1133 ILVEV_B2_SH(hz_out0, hz_out1, hz_out1, hz_out2, vec0, vec2);
1134
1135 filt =
LD_SH(filter_vert);
1137
1138 for (loop_cnt = (height >> 2); loop_cnt--;) {
1139 LD_SB4(src, src_stride, src3, src4, src5, src6);
1140 src += (4 * src_stride);
1141
1143 hz_out3 =
HORIZ_4TAP_FILT(src3, src3, mask0, mask1, filt_hz0, filt_hz1);
1144 vec1 = (v8i16) __msa_ilvev_b((v16i8) hz_out3, (v16i8) hz_out2);
1146
1147 hz_out0 =
HORIZ_4TAP_FILT(src4, src4, mask0, mask1, filt_hz0, filt_hz1);
1148 vec3 = (v8i16) __msa_ilvev_b((v16i8) hz_out0, (v16i8) hz_out3);
1150
1151 hz_out1 =
HORIZ_4TAP_FILT(src5, src5, mask0, mask1, filt_hz0, filt_hz1);
1152 vec4 = (v8i16) __msa_ilvev_b((v16i8) hz_out1, (v16i8) hz_out0);
1154
1155 hz_out2 =
HORIZ_4TAP_FILT(src6, src6, mask0, mask1, filt_hz0, filt_hz1);
1156 ILVEV_B2_SH(hz_out3, hz_out0, hz_out1, hz_out2, vec0, vec1);
1158
1163 ST8x4_UB(out0, out1, dst, dst_stride);
1164 dst += (4 * dst_stride);
1165
1166 vec0 = vec4;
1167 vec2 = vec1;
1168 }
1169 }
1170
1173 int height,
int mx,
int my)
1174 {
1176
1177 for (multiple8_cnt = 2; multiple8_cnt--;) {
1179 mx, my);
1180
1181 src += 8;
1182 dst += 8;
1183 }
1184 }
1185
1188 int height,
int mx,
int my)
1189 {
1190 uint32_t loop_cnt;
1193 v16i8
src0,
src1, src2, src3, src4, src5, src6;
1194 v16i8 filt_hz0, filt_hz1, filt_hz2;
1195 v16u8 res0, res1, mask0, mask1, mask2;
1196 v8i16
filt, filt_vt0, filt_vt1, tmp0, tmp1, vec0, vec1, vec2;
1197 v8i16 hz_out0, hz_out1, hz_out2, hz_out3, hz_out4, hz_out5;
1198
1200 src -= (2 + 1 * src_stride);
1201
1202 /* rearranging filter */
1203 filt =
LD_SH(filter_horiz);
1204 SPLATI_H3_SB(filt, 0, 1, 2, filt_hz0, filt_hz1, filt_hz2);
1205
1206 mask1 = mask0 + 2;
1207 mask2 = mask0 + 4;
1208
1209 LD_SB3(src, src_stride, src0, src1, src2);
1210 src += (3 * src_stride);
1211
1214 filt_hz1, filt_hz2);
1216 filt_hz1, filt_hz2);
1217 vec0 = (v8i16) __msa_ilvev_b((v16i8) hz_out1, (v16i8) hz_out0);
1218
1219 filt =
LD_SH(filter_vert);
1221
1222 for (loop_cnt = (height >> 2); loop_cnt--;) {
1223 LD_SB4(src, src_stride, src3, src4, src5, src6);
1224 src += (4 * src_stride);
1225
1228 filt_hz1, filt_hz2);
1229 hz_out2 = (v8i16) __msa_sldi_b((v16i8) hz_out3, (v16i8) hz_out1, 8);
1230 vec1 = (v8i16) __msa_ilvev_b((v16i8) hz_out3, (v16i8) hz_out2);
1232
1234 filt_hz1, filt_hz2);
1235 hz_out4 = (v8i16) __msa_sldi_b((v16i8) hz_out5, (v16i8) hz_out3, 8);
1236 vec2 = (v8i16) __msa_ilvev_b((v16i8) hz_out5, (v16i8) hz_out4);
1238
1243 ST4x4_UB(res0, res1, 0, 1, 0, 1, dst, dst_stride);
1244 dst += (4 * dst_stride);
1245
1246 hz_out1 = hz_out5;
1247 vec0 = vec2;
1248 }
1249 }
1250
1253 int height,
int mx,
int my)
1254 {
1255 uint32_t loop_cnt;
1258 v16i8
src0,
src1, src2, src3, src4, src5, src6;
1259 v16i8 filt_hz0, filt_hz1, filt_hz2, mask0, mask1, mask2;
1260 v8i16
filt, filt_vt0, filt_vt1, hz_out0, hz_out1, hz_out2, hz_out3;
1261 v8i16 tmp0, tmp1, tmp2, tmp3, vec0, vec1, vec2, vec3;
1262 v16u8 out0, out1;
1263
1265 src -= (2 + src_stride);
1266
1267 /* rearranging filter */
1268 filt =
LD_SH(filter_horiz);
1269 SPLATI_H3_SB(filt, 0, 1, 2, filt_hz0, filt_hz1, filt_hz2);
1270
1271 mask1 = mask0 + 2;
1272 mask2 = mask0 + 4;
1273
1274 LD_SB3(src, src_stride, src0, src1, src2);
1275 src += (3 * src_stride);
1276
1279 filt_hz1, filt_hz2);
1281 filt_hz1, filt_hz2);
1283 filt_hz1, filt_hz2);
1284 ILVEV_B2_SH(hz_out0, hz_out1, hz_out1, hz_out2, vec0, vec2);
1285
1286 filt =
LD_SH(filter_vert);
1288
1289 for (loop_cnt = (height >> 2); loop_cnt--;) {
1290 LD_SB4(src, src_stride, src3, src4, src5, src6);
1291 src += (4 * src_stride);
1292
1294
1296 filt_hz1, filt_hz2);
1297 vec1 = (v8i16) __msa_ilvev_b((v16i8) hz_out3, (v16i8) hz_out2);
1299
1301 filt_hz1, filt_hz2);
1302 vec3 = (v8i16) __msa_ilvev_b((v16i8) hz_out0, (v16i8) hz_out3);
1304
1306 filt_hz1, filt_hz2);
1307 vec0 = (v8i16) __msa_ilvev_b((v16i8) hz_out1, (v16i8) hz_out0);
1309
1311 filt_hz1, filt_hz2);
1312 ILVEV_B2_SH(hz_out3, hz_out0, hz_out1, hz_out2, vec1, vec2);
1314
1319 ST8x4_UB(out0, out1, dst, dst_stride);
1320 dst += (4 * dst_stride);
1321 }
1322 }
1323
1326 int height,
int mx,
int my)
1327 {
1329
1330 for (multiple8_cnt = 2; multiple8_cnt--;) {
1332 mx, my);
1333
1334 src += 8;
1335 dst += 8;
1336 }
1337 }
1338
1341 int height,
int mx,
int my)
1342 {
1343 uint32_t loop_cnt;
1346 v16i8
src0,
src1, src2, src3, src4, src5, src6, src7, src8;
1347 v16i8 filt_hz0, filt_hz1, mask0, mask1;
1349 v8i16 hz_out0, hz_out1, hz_out2, hz_out3, hz_out4, hz_out5, hz_out6;
1350 v8i16 hz_out7, tmp0, tmp1, out0, out1, out2, out3;
1351 v8i16
filt, filt_vt0, filt_vt1, filt_vt2;
1352
1354
1355 src -= (1 + 2 * src_stride);
1356
1357 /* rearranging filter */
1358 filt =
LD_SH(filter_horiz);
1360
1361 mask1 = mask0 + 2;
1362
1363 LD_SB5(src, src_stride, src0, src1, src2, src3, src4);
1364 src += (5 * src_stride);
1365
1367 hz_out0 =
HORIZ_4TAP_FILT(src0, src1, mask0, mask1, filt_hz0, filt_hz1);
1368 hz_out2 =
HORIZ_4TAP_FILT(src2, src3, mask0, mask1, filt_hz0, filt_hz1);
1369 hz_out3 =
HORIZ_4TAP_FILT(src3, src4, mask0, mask1, filt_hz0, filt_hz1);
1370 hz_out1 = (v8i16) __msa_sldi_b((v16i8) hz_out2, (v16i8) hz_out0, 8);
1371 ILVEV_B2_SH(hz_out0, hz_out1, hz_out2, hz_out3, out0, out1);
1372
1373 filt =
LD_SH(filter_vert);
1374 SPLATI_H3_SH(filt, 0, 1, 2, filt_vt0, filt_vt1, filt_vt2);
1375
1376 for (loop_cnt = (height >> 2); loop_cnt--;) {
1377 LD_SB4(src, src_stride, src5, src6, src7, src8);
1379 src += (4 * src_stride);
1380
1381 hz_out5 =
HORIZ_4TAP_FILT(src5, src6, mask0, mask1, filt_hz0, filt_hz1);
1382 hz_out4 = (v8i16) __msa_sldi_b((v16i8) hz_out5, (v16i8) hz_out3, 8);
1383 out2 = (v8i16) __msa_ilvev_b((v16i8) hz_out5, (v16i8) hz_out4);
1384 tmp0 =
DPADD_SH3_SH(out0, out1, out2, filt_vt0, filt_vt1, filt_vt2);
1385
1386 hz_out7 =
HORIZ_4TAP_FILT(src7, src8, mask0, mask1, filt_hz0, filt_hz1);
1387 hz_out6 = (v8i16) __msa_sldi_b((v16i8) hz_out7, (v16i8) hz_out5, 8);
1388 out3 = (v8i16) __msa_ilvev_b((v16i8) hz_out7, (v16i8) hz_out6);
1389 tmp1 =
DPADD_SH3_SH(out1, out2, out3, filt_vt0, filt_vt1, filt_vt2);
1390
1394 ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
1395 dst += (4 * dst_stride);
1396
1397 hz_out3 = hz_out7;
1398 out0 = out2;
1399 out1 = out3;
1400 }
1401 }
1402
1405 int height,
int mx,
int my)
1406 {
1407 uint32_t loop_cnt;
1410 v16i8
src0,
src1, src2, src3, src4, src5, src6, src7, src8;
1411 v16i8 filt_hz0, filt_hz1, mask0, mask1;
1412 v8i16
filt, filt_vt0, filt_vt1, filt_vt2, tmp0, tmp1, tmp2, tmp3;
1413 v8i16 hz_out0, hz_out1, hz_out2, hz_out3, hz_out4, hz_out5, hz_out6;
1414 v8i16 hz_out7, hz_out8, out0, out1, out2, out3, out4, out5, out6, out7;
1415 v16u8 vec0, vec1;
1416
1418 src -= (1 + 2 * src_stride);
1419
1420 /* rearranging filter */
1421 filt =
LD_SH(filter_horiz);
1423
1424 mask1 = mask0 + 2;
1425
1426 LD_SB5(src, src_stride, src0, src1, src2, src3, src4);
1427 src += (5 * src_stride);
1428
1430 hz_out0 =
HORIZ_4TAP_FILT(src0, src0, mask0, mask1, filt_hz0, filt_hz1);
1431 hz_out1 =
HORIZ_4TAP_FILT(src1, src1, mask0, mask1, filt_hz0, filt_hz1);
1432 hz_out2 =
HORIZ_4TAP_FILT(src2, src2, mask0, mask1, filt_hz0, filt_hz1);
1433 hz_out3 =
HORIZ_4TAP_FILT(src3, src3, mask0, mask1, filt_hz0, filt_hz1);
1434 hz_out4 =
HORIZ_4TAP_FILT(src4, src4, mask0, mask1, filt_hz0, filt_hz1);
1435 ILVEV_B2_SH(hz_out0, hz_out1, hz_out2, hz_out3, out0, out1);
1436 ILVEV_B2_SH(hz_out1, hz_out2, hz_out3, hz_out4, out3, out4);
1437
1438 filt =
LD_SH(filter_vert);
1439 SPLATI_H3_SH(filt, 0, 1, 2, filt_vt0, filt_vt1, filt_vt2);
1440
1441 for (loop_cnt = (height >> 2); loop_cnt--;) {
1442 LD_SB4(src, src_stride, src5, src6, src7, src8);
1443 src += (4 * src_stride);
1444
1446
1447 hz_out5 =
HORIZ_4TAP_FILT(src5, src5, mask0, mask1, filt_hz0, filt_hz1);
1448 out2 = (v8i16) __msa_ilvev_b((v16i8) hz_out5, (v16i8) hz_out4);
1449 tmp0 =
DPADD_SH3_SH(out0, out1, out2, filt_vt0, filt_vt1, filt_vt2);
1450
1451 hz_out6 =
HORIZ_4TAP_FILT(src6, src6, mask0, mask1, filt_hz0, filt_hz1);
1452 out5 = (v8i16) __msa_ilvev_b((v16i8) hz_out6, (v16i8) hz_out5);
1453 tmp1 =
DPADD_SH3_SH(out3, out4, out5, filt_vt0, filt_vt1, filt_vt2);
1454
1455 hz_out7 =
HORIZ_4TAP_FILT(src7, src7, mask0, mask1, filt_hz0, filt_hz1);
1456 out6 = (v8i16) __msa_ilvev_b((v16i8) hz_out7, (v16i8) hz_out6);
1457 tmp2 =
DPADD_SH3_SH(out1, out2, out6, filt_vt0, filt_vt1, filt_vt2);
1458
1459 hz_out8 =
HORIZ_4TAP_FILT(src8, src8, mask0, mask1, filt_hz0, filt_hz1);
1460 out7 = (v8i16) __msa_ilvev_b((v16i8) hz_out8, (v16i8) hz_out7);
1461 tmp3 =
DPADD_SH3_SH(out4, out5, out7, filt_vt0, filt_vt1, filt_vt2);
1462
1467 ST8x4_UB(vec0, vec1, dst, dst_stride);
1468 dst += (4 * dst_stride);
1469
1470 hz_out4 = hz_out8;
1471 out0 = out2;
1472 out1 = out6;
1473 out3 = out5;
1474 out4 = out7;
1475 }
1476 }
1477
1480 int height,
int mx,
int my)
1481 {
1483
1484 for (multiple8_cnt = 2; multiple8_cnt--;) {
1486 mx, my);
1487
1488 src += 8;
1489 dst += 8;
1490 }
1491 }
1492
1496 {
1498 v16u8 filt0, vec0, vec1, res0, res1;
1499 v8u16 vec2, vec3,
filt;
1500
1502
1503 /* rearranging filter */
1504 filt =
LD_UH(filter);
1505 filt0 = (v16u8) __msa_splati_h((v8i16)
filt, 0);
1506
1507 LD_SB4(src, src_stride, src0, src1, src2, src3);
1508 VSHF_B2_UB(src0, src1, src2, src3, mask, mask, vec0, vec1);
1509 DOTP_UB2_UH(vec0, vec1, filt0, filt0, vec2, vec3);
1512 ST4x4_UB(res0, res1, 0, 1, 0, 1, dst, dst_stride);
1513 }
1514
1518 {
1519 v16u8 vec0, vec1, vec2, vec3, filt0;
1520 v16i8
src0,
src1, src2, src3, src4, src5, src6, src7,
mask;
1521 v16i8 res0, res1, res2, res3;
1522 v8u16 vec4, vec5, vec6, vec7,
filt;
1523
1525
1526 /* rearranging filter */
1527 filt =
LD_UH(filter);
1528 filt0 = (v16u8) __msa_splati_h((v8i16)
filt, 0);
1529
1530 LD_SB8(src, src_stride, src0, src1, src2, src3, src4, src5, src6, src7);
1531 VSHF_B2_UB(src0, src1, src2, src3, mask, mask, vec0, vec1);
1532 VSHF_B2_UB(src4, src5, src6, src7, mask, mask, vec2, vec3);
1533 DOTP_UB4_UH(vec0, vec1, vec2, vec3, filt0, filt0, filt0, filt0,
1534 vec4, vec5, vec6, vec7);
1536 PCKEV_B4_SB(vec4, vec4, vec5, vec5, vec6, vec6, vec7, vec7,
1537 res0, res1, res2, res3);
1538 ST4x4_UB(res0, res1, 0, 1, 0, 1, dst, dst_stride);
1539 dst += (4 * dst_stride);
1540 ST4x4_UB(res2, res3, 0, 1, 0, 1, dst, dst_stride);
1541 }
1542
1545 int height,
int mx,
int my)
1546 {
1548
1549 if (4 == height) {
1551 } else if (8 == height) {
1553 }
1554 }
1555
1559 {
1560 v16u8 filt0;
1562 v8u16 vec0, vec1, vec2, vec3,
filt;
1563
1565
1566 /* rearranging filter */
1567 filt =
LD_UH(filter);
1568 filt0 = (v16u8) __msa_splati_h((v8i16)
filt, 0);
1569
1570 LD_SB4(src, src_stride, src0, src1, src2, src3);
1571 VSHF_B2_UH(src0, src0, src1, src1, mask, mask, vec0, vec1);
1572 VSHF_B2_UH(src2, src2, src3, src3, mask, mask, vec2, vec3);
1573 DOTP_UB4_UH(vec0, vec1, vec2, vec3, filt0, filt0, filt0, filt0,
1574 vec0, vec1, vec2, vec3);
1577 ST8x4_UB(src0, src1, dst, dst_stride);
1578 }
1579
1583 {
1584 v16u8 filt0;
1586 v8u16 vec0, vec1, vec2, vec3,
filt;
1587
1589
1590 /* rearranging filter */
1591 filt =
LD_UH(filter);
1592 filt0 = (v16u8) __msa_splati_h((v8i16)
filt, 0);
1593
1594 LD_SB4(src, src_stride, src0, src1, src2, src3);
1595 src += (4 * src_stride);
1596
1597 VSHF_B2_UH(src0, src0, src1, src1, mask, mask, vec0, vec1);
1598 VSHF_B2_UH(src2, src2, src3, src3, mask, mask, vec2, vec3);
1599 DOTP_UB4_UH(vec0, vec1, vec2, vec3, filt0, filt0, filt0, filt0,
1600 vec0, vec1, vec2, vec3);
1602
1603 LD_SB4(src, src_stride, src0, src1, src2, src3);
1604 src += (4 * src_stride);
1605
1607 ST8x4_UB(out0, out1, dst, dst_stride);
1608 dst += (4 * dst_stride);
1609
1610 VSHF_B2_UH(src0, src0, src1, src1, mask, mask, vec0, vec1);
1611 VSHF_B2_UH(src2, src2, src3, src3, mask, mask, vec2, vec3);
1612 DOTP_UB4_UH(vec0, vec1, vec2, vec3, filt0, filt0, filt0, filt0,
1613 vec0, vec1, vec2, vec3);
1616 ST8x4_UB(out0, out1, dst, dst_stride);
1617 dst += (4 * dst_stride);
1618
1619 if (16 == height) {
1620 LD_SB4(src, src_stride, src0, src1, src2, src3);
1621 src += (4 * src_stride);
1622
1623 VSHF_B2_UH(src0, src0, src1, src1, mask, mask, vec0, vec1);
1624 VSHF_B2_UH(src2, src2, src3, src3, mask, mask, vec2, vec3);
1625 DOTP_UB4_UH(vec0, vec1, vec2, vec3, filt0, filt0, filt0, filt0,
1626 vec0, vec1, vec2, vec3);
1628 LD_SB4(src, src_stride, src0, src1, src2, src3);
1629 src += (4 * src_stride);
1630
1632 ST8x4_UB(out0, out1, dst, dst_stride);
1633
1634 VSHF_B2_UH(src0, src0, src1, src1, mask, mask, vec0, vec1);
1635 VSHF_B2_UH(src2, src2, src3, src3, mask, mask, vec2, vec3);
1636 DOTP_UB4_UH(vec0, vec1, vec2, vec3, filt0, filt0, filt0, filt0,
1637 vec0, vec1, vec2, vec3);
1640 ST8x4_UB(out0, out1, dst + 4 * dst_stride, dst_stride);
1641 }
1642 }
1643
1646 int height,
int mx,
int my)
1647 {
1649
1650 if (4 == height) {
1652 } else {
1654 height);
1655 }
1656 }
1657
1660 int height,
int mx,
int my)
1661 {
1662 uint32_t loop_cnt;
1664 v16i8
src0,
src1, src2, src3, src4, src5, src6, src7,
mask;
1665 v16u8 filt0, vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7;
1666 v8u16 out0, out1, out2, out3, out4, out5, out6, out7,
filt;
1667
1669
1670 loop_cnt = (height >> 2) - 1;
1671
1672 /* rearranging filter */
1673 filt =
LD_UH(filter);
1674 filt0 = (v16u8) __msa_splati_h((v8i16)
filt, 0);
1675
1676 LD_SB4(src, src_stride, src0, src2, src4, src6);
1677 LD_SB4(src + 8, src_stride, src1, src3, src5, src7);
1678 src += (4 * src_stride);
1679
1680 VSHF_B2_UB(src0, src0, src1, src1, mask, mask, vec0, vec1);
1681 VSHF_B2_UB(src2, src2, src3, src3, mask, mask, vec2, vec3);
1682 VSHF_B2_UB(src4, src4, src5, src5, mask, mask, vec4, vec5);
1683 VSHF_B2_UB(src6, src6, src7, src7, mask, mask, vec6, vec7);
1684 DOTP_UB4_UH(vec0, vec1, vec2, vec3, filt0, filt0, filt0, filt0,
1685 out0, out1, out2, out3);
1686 DOTP_UB4_UH(vec4, vec5, vec6, vec7, filt0, filt0, filt0, filt0,
1687 out4, out5, out6, out7);
1691 dst += dst_stride;
1693 dst += dst_stride;
1695 dst += dst_stride;
1697 dst += dst_stride;
1698
1699 for (; loop_cnt--;) {
1700 LD_SB4(src, src_stride, src0, src2, src4, src6);
1701 LD_SB4(src + 8, src_stride, src1, src3, src5, src7);
1702 src += (4 * src_stride);
1703
1704 VSHF_B2_UB(src0, src0, src1, src1, mask, mask, vec0, vec1);
1705 VSHF_B2_UB(src2, src2, src3, src3, mask, mask, vec2, vec3);
1706 VSHF_B2_UB(src4, src4, src5, src5, mask, mask, vec4, vec5);
1707 VSHF_B2_UB(src6, src6, src7, src7, mask, mask, vec6, vec7);
1708 DOTP_UB4_UH(vec0, vec1, vec2, vec3, filt0, filt0, filt0, filt0,
1709 out0, out1, out2, out3);
1710 DOTP_UB4_UH(vec4, vec5, vec6, vec7, filt0, filt0, filt0, filt0,
1711 out4, out5, out6, out7);
1715 dst += dst_stride;
1717 dst += dst_stride;
1719 dst += dst_stride;
1721 dst += dst_stride;
1722 }
1723 }
1724
1728 {
1729 v16i8
src0,
src1, src2, src3, src4;
1730 v16i8 src10_r, src32_r, src21_r, src43_r, src2110, src4332;
1731 v16u8 filt0;
1733 v8u16 tmp0, tmp1;
1734
1735 filt =
LD_SH(filter);
1736 filt0 = (v16u8) __msa_splati_h(filt, 0);
1737
1738 LD_SB5(src, src_stride, src0, src1, src2, src3, src4);
1739 src += (5 * src_stride);
1740
1741 ILVR_B4_SB(src1, src0, src2, src1, src3, src2, src4, src3,
1742 src10_r, src21_r, src32_r, src43_r);
1743 ILVR_D2_SB(src21_r, src10_r, src43_r, src32_r, src2110, src4332);
1744 DOTP_UB2_UH(src2110, src4332, filt0, filt0, tmp0, tmp1);
1747 src2110 = __msa_pckev_b((v16i8) tmp1, (v16i8) tmp0);
1748 ST4x4_UB(src2110, src2110, 0, 1, 2, 3, dst, dst_stride);
1749 }
1750
1754 {
1755 v16i8
src0,
src1, src2, src3, src4, src5, src6, src7, src8;
1756 v16i8 src10_r, src32_r, src54_r, src76_r, src21_r, src43_r;
1757 v16i8 src65_r, src87_r, src2110, src4332, src6554, src8776;
1758 v8u16 tmp0, tmp1, tmp2, tmp3;
1759 v16u8 filt0;
1761
1762 filt =
LD_SH(filter);
1763 filt0 = (v16u8) __msa_splati_h(filt, 0);
1764
1765 LD_SB8(src, src_stride, src0, src1, src2, src3, src4, src5, src6, src7);
1766 src += (8 * src_stride);
1767
1769 src += src_stride;
1770
1771 ILVR_B4_SB(src1, src0, src2, src1, src3, src2, src4, src3, src10_r, src21_r,
1772 src32_r, src43_r);
1773 ILVR_B4_SB(src5, src4, src6, src5, src7, src6, src8, src7, src54_r, src65_r,
1774 src76_r, src87_r);
1775 ILVR_D4_SB(src21_r, src10_r, src43_r, src32_r, src65_r, src54_r,
1776 src87_r, src76_r, src2110, src4332, src6554, src8776);
1777 DOTP_UB4_UH(src2110, src4332, src6554, src8776, filt0, filt0, filt0, filt0,
1778 tmp0, tmp1, tmp2, tmp3);
1781 PCKEV_B2_SB(tmp1, tmp0, tmp3, tmp2, src2110, src4332);
1782 ST4x4_UB(src2110, src2110, 0, 1, 2, 3, dst, dst_stride);
1783 ST4x4_UB(src4332, src4332, 0, 1, 2, 3, dst + 4 * dst_stride, dst_stride);
1784 }
1785
1788 int height,
int mx,
int my)
1789 {
1791
1792 if (4 == height) {
1794 } else if (8 == height) {
1796 }
1797 }
1798
1802 {
1803 v16u8
src0,
src1, src2, src3, src4, vec0, vec1, vec2, vec3, filt0;
1804 v16i8 out0, out1;
1805 v8u16 tmp0, tmp1, tmp2, tmp3;
1807
1808 /* rearranging filter_y */
1809 filt =
LD_SH(filter);
1810 filt0 = (v16u8) __msa_splati_h(filt, 0);
1811
1812 LD_UB5(src, src_stride, src0, src1, src2, src3, src4);
1813 ILVR_B2_UB(src1, src0, src2, src1, vec0, vec1);
1814 ILVR_B2_UB(src3, src2, src4, src3, vec2, vec3);
1815 DOTP_UB4_UH(vec0, vec1, vec2, vec3, filt0, filt0, filt0, filt0,
1816 tmp0, tmp1, tmp2, tmp3);
1820 ST8x4_UB(out0, out1, dst, dst_stride);
1821 }
1822
1826 {
1827 uint32_t loop_cnt;
1828 v16u8
src0,
src1, src2, src3, src4, src5, src6, src7, src8;
1829 v16u8 vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7, filt0;
1830 v16i8 out0, out1;
1831 v8u16 tmp0, tmp1, tmp2, tmp3;
1833
1834 /* rearranging filter_y */
1835 filt =
LD_SH(filter);
1836 filt0 = (v16u8) __msa_splati_h(filt, 0);
1837
1839 src += src_stride;
1840
1841 for (loop_cnt = (height >> 3); loop_cnt--;) {
1842 LD_UB8(src, src_stride, src1, src2, src3, src4, src5, src6, src7, src8);
1843 src += (8 * src_stride);
1844
1845 ILVR_B4_UB(src1, src0, src2, src1, src3, src2, src4, src3,
1846 vec0, vec1, vec2, vec3);
1847 ILVR_B4_UB(src5, src4, src6, src5, src7, src6, src8, src7,
1848 vec4, vec5, vec6, vec7);
1849 DOTP_UB4_UH(vec0, vec1, vec2, vec3, filt0, filt0, filt0, filt0,
1850 tmp0, tmp1, tmp2, tmp3);
1854 ST8x4_UB(out0, out1, dst, dst_stride);
1855 dst += (4 * dst_stride);
1856
1857 DOTP_UB4_UH(vec4, vec5, vec6, vec7, filt0, filt0, filt0, filt0,
1858 tmp0, tmp1, tmp2, tmp3);
1862 ST8x4_UB(out0, out1, dst, dst_stride);
1863 dst += (4 * dst_stride);
1864
1865 src0 = src8;
1866 }
1867 }
1868
1871 int height,
int mx,
int my)
1872 {
1874
1875 if (4 == height) {
1877 } else {
1879 height);
1880 }
1881 }
1882
1885 int height,
int mx,
int my)
1886 {
1887 uint32_t loop_cnt;
1889 v16u8
src0,
src1, src2, src3, src4;
1890 v16u8 vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7, filt0;
1891 v8u16 tmp0, tmp1, tmp2, tmp3;
1893
1894 /* rearranging filter_y */
1895 filt =
LD_SH(filter);
1896 filt0 = (v16u8) __msa_splati_h(filt, 0);
1897
1899 src += src_stride;
1900
1901 for (loop_cnt = (height >> 2); loop_cnt--;) {
1902 LD_UB4(src, src_stride, src1, src2, src3, src4);
1903 src += (4 * src_stride);
1904
1905 ILVR_B2_UB(src1, src0, src2, src1, vec0, vec2);
1906 ILVL_B2_UB(src1, src0, src2, src1, vec1, vec3);
1907 DOTP_UB2_UH(vec0, vec1, filt0, filt0, tmp0, tmp1);
1911 dst += dst_stride;
1912
1913 ILVR_B2_UB(src3, src2, src4, src3, vec4, vec6);
1914 ILVL_B2_UB(src3, src2, src4, src3, vec5, vec7);
1915 DOTP_UB2_UH(vec2, vec3, filt0, filt0, tmp2, tmp3);
1919 dst += dst_stride;
1920
1921 DOTP_UB2_UH(vec4, vec5, filt0, filt0, tmp0, tmp1);
1925 dst += dst_stride;
1926
1927 DOTP_UB2_UH(vec6, vec7, filt0, filt0, tmp2, tmp3);
1931 dst += dst_stride;
1932
1933 src0 = src4;
1934 }
1935 }
1936
1939 const int8_t *filter_horiz,
1940 const int8_t *filter_vert)
1941 {
1943 v16u8 filt_vt, filt_hz, vec0, vec1, res0, res1;
1944 v8u16 hz_out0, hz_out1, hz_out2, hz_out3, hz_out4,
filt, tmp0, tmp1;
1945
1947
1948 /* rearranging filter */
1949 filt =
LD_UH(filter_horiz);
1950 filt_hz = (v16u8) __msa_splati_h((v8i16)
filt, 0);
1951
1952 filt =
LD_UH(filter_vert);
1953 filt_vt = (v16u8) __msa_splati_h((v8i16)
filt, 0);
1954
1955 LD_SB5(src, src_stride, src0, src1, src2, src3, src4);
1959 hz_out1 = (v8u16) __msa_sldi_b((v16i8) hz_out2, (v16i8) hz_out0, 8);
1960 hz_out3 = (v8u16) __msa_pckod_d((v2i64) hz_out4, (v2i64) hz_out2);
1961
1962 ILVEV_B2_UB(hz_out0, hz_out1, hz_out2, hz_out3, vec0, vec1);
1963 DOTP_UB2_UH(vec0, vec1, filt_vt, filt_vt, tmp0, tmp1);
1967 ST4x4_UB(res0, res1, 0, 1, 0, 1, dst, dst_stride);
1968 }
1969
1972 const int8_t *filter_horiz,
1973 const int8_t *filter_vert)
1974 {
1975 v16i8
src0,
src1, src2, src3, src4, src5, src6, src7, src8,
mask;
1976 v16i8 res0, res1, res2, res3;
1977 v16u8 filt_hz, filt_vt, vec0, vec1, vec2, vec3;
1978 v8u16 hz_out0, hz_out1, hz_out2, hz_out3, hz_out4, hz_out5, hz_out6;
1979 v8u16 hz_out7, hz_out8, vec4, vec5, vec6, vec7,
filt;
1980
1982
1983 /* rearranging filter */
1984 filt =
LD_UH(filter_horiz);
1985 filt_hz = (v16u8) __msa_splati_h((v8i16)
filt, 0);
1986
1987 filt =
LD_UH(filter_vert);
1988 filt_vt = (v16u8) __msa_splati_h((v8i16)
filt, 0);
1989
1990 LD_SB8(src, src_stride, src0, src1, src2, src3, src4, src5, src6, src7);
1991 src += (8 * src_stride);
1993
1999 SLDI_B3_UH(hz_out2, hz_out4, hz_out6, hz_out0, hz_out2, hz_out4, hz_out1,
2000 hz_out3, hz_out5, 8);
2001 hz_out7 = (v8u16) __msa_pckod_d((v2i64) hz_out8, (v2i64) hz_out6);
2002
2003 ILVEV_B2_UB(hz_out0, hz_out1, hz_out2, hz_out3, vec0, vec1);
2004 ILVEV_B2_UB(hz_out4, hz_out5, hz_out6, hz_out7, vec2, vec3);
2005 DOTP_UB4_UH(vec0, vec1, vec2, vec3, filt_vt, filt_vt, filt_vt, filt_vt,
2006 vec4, vec5, vec6, vec7);
2009 PCKEV_B4_SB(vec4, vec4, vec5, vec5, vec6, vec6, vec7, vec7,
2010 res0, res1, res2, res3);
2011 ST4x4_UB(res0, res1, 0, 1, 0, 1, dst, dst_stride);
2012 dst += (4 * dst_stride);
2013 ST4x4_UB(res2, res3, 0, 1, 0, 1, dst, dst_stride);
2014 }
2015
2018 int height,
int mx,
int my)
2019 {
2022
2023 if (4 == height) {
2025 filter_horiz, filter_vert);
2026 } else if (8 == height) {
2028 filter_horiz, filter_vert);
2029 }
2030 }
2031
2034 const int8_t *filter_horiz,
2035 const int8_t *filter_vert)
2036 {
2038 v16u8 filt_hz, filt_vt, vec0, vec1, vec2, vec3;
2039 v8u16 hz_out0, hz_out1, tmp0, tmp1, tmp2, tmp3;
2041
2043
2044 /* rearranging filter */
2045 filt =
LD_SH(filter_horiz);
2046 filt_hz = (v16u8) __msa_splati_h(filt, 0);
2047
2048 filt =
LD_SH(filter_vert);
2049 filt_vt = (v16u8) __msa_splati_h(filt, 0);
2050
2051 LD_SB5(src, src_stride, src0, src1, src2, src3, src4);
2052
2055 vec0 = (v16u8) __msa_ilvev_b((v16i8) hz_out1, (v16i8) hz_out0);
2056 tmp0 = __msa_dotp_u_h(vec0, filt_vt);
2057
2059 vec1 = (v16u8) __msa_ilvev_b((v16i8) hz_out0, (v16i8) hz_out1);
2060 tmp1 = __msa_dotp_u_h(vec1, filt_vt);
2061
2063 vec2 = (v16u8) __msa_ilvev_b((v16i8) hz_out1, (v16i8) hz_out0);
2064 tmp2 = __msa_dotp_u_h(vec2, filt_vt);
2065
2067 vec3 = (v16u8) __msa_ilvev_b((v16i8) hz_out0, (v16i8) hz_out1);
2068 tmp3 = __msa_dotp_u_h(vec3, filt_vt);
2069
2073 ST8x4_UB(out0, out1, dst, dst_stride);
2074 }
2075
2078 const int8_t *filter_horiz,
2079 const int8_t *filter_vert,
2081 {
2082 uint32_t loop_cnt;
2084 v16u8 filt_hz, filt_vt, vec0;
2085 v8u16 hz_out0, hz_out1, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp8;
2087
2089
2090 /* rearranging filter */
2091 filt =
LD_SH(filter_horiz);
2092 filt_hz = (v16u8) __msa_splati_h(filt, 0);
2093
2094 filt =
LD_SH(filter_vert);
2095 filt_vt = (v16u8) __msa_splati_h(filt, 0);
2096
2098 src += src_stride;
2099
2101
2102 for (loop_cnt = (height >> 3); loop_cnt--;) {
2103 LD_SB4(src, src_stride, src1, src2, src3, src4);
2104 src += (4 * src_stride);
2105
2107 vec0 = (v16u8) __msa_ilvev_b((v16i8) hz_out1, (v16i8) hz_out0);
2108 tmp1 = __msa_dotp_u_h(vec0, filt_vt);
2109
2111 vec0 = (v16u8) __msa_ilvev_b((v16i8) hz_out0, (v16i8) hz_out1);
2112 tmp2 = __msa_dotp_u_h(vec0, filt_vt);
2113
2116
2118 vec0 = (v16u8) __msa_ilvev_b((v16i8) hz_out1, (v16i8) hz_out0);
2119 tmp3 = __msa_dotp_u_h(vec0, filt_vt);
2120
2122 LD_SB4(src, src_stride, src1, src2, src3, src4);
2123 src += (4 * src_stride);
2124 vec0 = (v16u8) __msa_ilvev_b((v16i8) hz_out0, (v16i8) hz_out1);
2125 tmp4 = __msa_dotp_u_h(vec0, filt_vt);
2126
2130 ST8x4_UB(out0, out1, dst, dst_stride);
2131 dst += (4 * dst_stride);
2132
2134 vec0 = (v16u8) __msa_ilvev_b((v16i8) hz_out1, (v16i8) hz_out0);
2135 tmp5 = __msa_dotp_u_h(vec0, filt_vt);
2136
2138 vec0 = (v16u8) __msa_ilvev_b((v16i8) hz_out0, (v16i8) hz_out1);
2139 tmp6 = __msa_dotp_u_h(vec0, filt_vt);
2140
2142 vec0 = (v16u8) __msa_ilvev_b((v16i8) hz_out1, (v16i8) hz_out0);
2143 tmp7 = __msa_dotp_u_h(vec0, filt_vt);
2144
2146 vec0 = (v16u8) __msa_ilvev_b((v16i8) hz_out0, (v16i8) hz_out1);
2147 tmp8 = __msa_dotp_u_h(vec0, filt_vt);
2148
2152 ST8x4_UB(out0, out1, dst, dst_stride);
2153 dst += (4 * dst_stride);
2154 }
2155 }
2156
2159 int height,
int mx,
int my)
2160 {
2163
2164 if (4 == height) {
2166 filter_horiz, filter_vert);
2167 } else {
2169 filter_horiz, filter_vert, height);
2170 }
2171 }
2172
2175 int height,
int mx,
int my)
2176 {
2177 uint32_t loop_cnt;
2180 v16i8
src0,
src1, src2, src3, src4, src5, src6, src7,
mask;
2181 v16u8 filt_hz, filt_vt, vec0, vec1;
2182 v8u16 tmp1, tmp2, hz_out0, hz_out1, hz_out2, hz_out3;
2184
2186
2187 /* rearranging filter */
2188 filt =
LD_SH(filter_horiz);
2189 filt_hz = (v16u8) __msa_splati_h(filt, 0);
2190
2191 filt =
LD_SH(filter_vert);
2192 filt_vt = (v16u8) __msa_splati_h(filt, 0);
2193
2194 LD_SB2(src, 8, src0, src1);
2195 src += src_stride;
2196
2199
2200
2201 for (loop_cnt = (height >> 2); loop_cnt--;) {
2202 LD_SB4(src, src_stride, src0, src2, src4, src6);
2203 LD_SB4(src + 8, src_stride, src1, src3, src5, src7);
2204 src += (4 * src_stride);
2205
2208 ILVEV_B2_UB(hz_out0, hz_out1, hz_out2, hz_out3, vec0, vec1);
2209 DOTP_UB2_UH(vec0, vec1, filt_vt, filt_vt, tmp1, tmp2);
2213 dst += dst_stride;
2214
2217 ILVEV_B2_UB(hz_out1, hz_out0, hz_out3, hz_out2, vec0, vec1);
2218 DOTP_UB2_UH(vec0, vec1, filt_vt, filt_vt, tmp1, tmp2);
2222 dst += dst_stride;
2223
2226 ILVEV_B2_UB(hz_out0, hz_out1, hz_out2, hz_out3, vec0, vec1);
2227 DOTP_UB2_UH(vec0, vec1, filt_vt, filt_vt, tmp1, tmp2);
2231 dst += dst_stride;
2232
2235 ILVEV_B2_UB(hz_out1, hz_out0, hz_out3, hz_out2, vec0, vec1);
2236 DOTP_UB2_UH(vec0, vec1, filt_vt, filt_vt, tmp1, tmp2);
2240 dst += dst_stride;
2241 }
2242 }
2243
2246 int height,
int mx,
int my)
2247 {
2249 uint64_t out0, out1, out2, out3, out4, out5, out6, out7;
2250 v16u8
src0,
src1, src2, src3, src4, src5, src6, src7;
2251
2252 if (0 == height % 8) {
2253 for (cnt = height >> 3; cnt--;) {
2255 src0, src1, src2, src3, src4, src5, src6, src7);
2256 src += (8 * src_stride);
2257
2258 out0 = __msa_copy_u_d((v2i64) src0, 0);
2259 out1 = __msa_copy_u_d((v2i64) src1, 0);
2260 out2 = __msa_copy_u_d((v2i64) src2, 0);
2261 out3 = __msa_copy_u_d((v2i64) src3, 0);
2262 out4 = __msa_copy_u_d((v2i64) src4, 0);
2263 out5 = __msa_copy_u_d((v2i64) src5, 0);
2264 out6 = __msa_copy_u_d((v2i64) src6, 0);
2265 out7 = __msa_copy_u_d((v2i64) src7, 0);
2266
2267 SD4(out0, out1, out2, out3, dst, dst_stride);
2268 dst += (4 * dst_stride);
2269 SD4(out4, out5, out6, out7, dst, dst_stride);
2270 dst += (4 * dst_stride);
2271 }
2272 } else if (0 == height % 4) {
2273 for (cnt = (height / 4); cnt--;) {
2274 LD_UB4(src, src_stride, src0, src1, src2, src3);
2275 src += (4 * src_stride);
2276 out0 = __msa_copy_u_d((v2i64) src0, 0);
2277 out1 = __msa_copy_u_d((v2i64) src1, 0);
2278 out2 = __msa_copy_u_d((v2i64) src2, 0);
2279 out3 = __msa_copy_u_d((v2i64) src3, 0);
2280
2281 SD4(out0, out1, out2, out3, dst, dst_stride);
2282 dst += (4 * dst_stride);
2283 }
2284 }
2285 }
2286
2290 {
2293 v16u8
src0,
src1, src2, src3, src4, src5, src6, src7;
2294
2295 for (cnt = (width >> 4); cnt--;) {
2297 dst_tmp = dst;
2298
2299 for (loop_cnt = (height >> 3); loop_cnt--;) {
2300 LD_UB8(src_tmp, src_stride,
2301 src0, src1, src2, src3, src4, src5, src6, src7);
2302 src_tmp += (8 * src_stride);
2303
2304 ST_UB8(src0, src1, src2, src3, src4, src5, src6, src7,
2305 dst_tmp, dst_stride);
2306 dst_tmp += (8 * dst_stride);
2307 }
2308
2309 src += 16;
2310 dst += 16;
2311 }
2312 }
2313
2316 int height,
int mx,
int my)
2317 {
2320
2321 if (0 == height % 8) {
2323 } else if (0 == height % 4) {
2324 for (cnt = (height >> 2); cnt--;) {
2325 LD_UB4(src, src_stride, src0, src1, src2, src3);
2326 src += (4 * src_stride);
2327
2328 ST_UB4(src0, src1, src2, src3, dst, dst_stride);
2329 dst += (4 * dst_stride);
2330 }
2331 }
2332 }
void ff_put_vp8_epel4_h6v4_msa(uint8_t *dst, ptrdiff_t dst_stride, uint8_t *src, ptrdiff_t src_stride, int height, int mx, int my)
static void common_hz_4t_4x16_msa(uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride, const int8_t *filter)
void ff_put_vp8_bilinear8_h_msa(uint8_t *dst, ptrdiff_t dst_stride, uint8_t *src, ptrdiff_t src_stride, int height, int mx, int my)
#define XORI_B5_128_SB(...)
#define XORI_B8_128_SB(...)
#define HORIZ_4TAP_8WID_4VECS_FILT(src0, src1, src2, src3,mask0, mask1, filt0, filt1,out0, out1, out2, out3)
#define SPLATI_H3_SH(...)
void ff_put_vp8_epel16_h4v6_msa(uint8_t *dst, ptrdiff_t dst_stride, uint8_t *src, ptrdiff_t src_stride, int height, int mx, int my)
static void common_hz_2t_4x8_msa(uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride, const int8_t *filter)
static void common_hz_4t_4x8_msa(uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride, const int8_t *filter)
static void common_vt_2t_4x8_msa(uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride, const int8_t *filter)
#define XORI_B2_128_SB(...)
#define PCKEV_XORI128_UB(in0, in1)
#define XORI_B3_128_SB(...)
#define FILT_4TAP_DPADD_S_H(vec0, vec1, filt0, filt1)
void ff_put_vp8_pixels8_msa(uint8_t *dst, ptrdiff_t dst_stride, uint8_t *src, ptrdiff_t src_stride, int height, int mx, int my)
void ff_put_vp8_epel4_h4v4_msa(uint8_t *dst, ptrdiff_t dst_stride, uint8_t *src, ptrdiff_t src_stride, int height, int mx, int my)
void ff_put_vp8_epel8_h4_msa(uint8_t *dst, ptrdiff_t dst_stride, uint8_t *src, ptrdiff_t src_stride, int height, int mx, int my)
#define HORIZ_6TAP_4WID_4VECS_FILT(src0, src1, src2, src3,mask0, mask1, mask2,filt0, filt1, filt2,out0, out1)
#define SPLATI_H2_SH(...)
#define ST4x4_UB(in0, in1, idx0, idx1, idx2, idx3, pdst, stride)
static void common_vt_2t_8x4_msa(uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride, const int8_t *filter)
void ff_put_vp8_bilinear4_hv_msa(uint8_t *dst, ptrdiff_t dst_stride, uint8_t *src, ptrdiff_t src_stride, int height, int mx, int my)
#define DPADD_SH3_SH(in0, in1, in2, coeff0, coeff1, coeff2)
#define XORI_B4_128_UB(...)
static void common_hv_2ht_2vt_8x4_msa(uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride, const int8_t *filter_horiz, const int8_t *filter_vert)
void ff_put_vp8_epel8_v6_msa(uint8_t *dst, ptrdiff_t dst_stride, uint8_t *src, ptrdiff_t src_stride, int height, int mx, int my)
void ff_put_vp8_epel16_v4_msa(uint8_t *dst, ptrdiff_t dst_stride, uint8_t *src, ptrdiff_t src_stride, int height, int mx, int my)
#define PCKEV_ST_SB(in0, in1, pdst)
void ff_put_vp8_epel16_h4_msa(uint8_t *dst, ptrdiff_t dst_stride, uint8_t *src, ptrdiff_t src_stride, int height, int mx, int my)
void ff_put_vp8_epel4_v6_msa(uint8_t *dst, ptrdiff_t dst_stride, uint8_t *src, ptrdiff_t src_stride, int height, int mx, int my)
VP8 compatible video decoder.
static void common_vt_2t_4x4_msa(uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride, const int8_t *filter)
static void common_vt_2t_8x8mult_msa(uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride, const int8_t *filter, int32_t height)
#define XORI_B2_128_UB(...)
static void filter(int16_t *output, ptrdiff_t out_stride, int16_t *low, ptrdiff_t low_stride, int16_t *high, ptrdiff_t high_stride, int len, uint8_t clip)
void ff_put_vp8_epel16_h6v6_msa(uint8_t *dst, ptrdiff_t dst_stride, uint8_t *src, ptrdiff_t src_stride, int height, int mx, int my)
static const int8_t bilinear_filters_msa[7][2]
void ff_put_vp8_bilinear16_hv_msa(uint8_t *dst, ptrdiff_t dst_stride, uint8_t *src, ptrdiff_t src_stride, int height, int mx, int my)
static void common_hz_2t_4x4_msa(uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride, const int8_t *filter)
static void copy_16multx8mult_msa(uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride, int32_t height, int32_t width)
void ff_put_vp8_bilinear8_v_msa(uint8_t *dst, ptrdiff_t dst_stride, uint8_t *src, ptrdiff_t src_stride, int height, int mx, int my)
static void common_hv_2ht_2vt_8x8mult_msa(uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride, const int8_t *filter_horiz, const int8_t *filter_vert, int32_t height)
void ff_put_vp8_epel16_h4v4_msa(uint8_t *dst, ptrdiff_t dst_stride, uint8_t *src, ptrdiff_t src_stride, int height, int mx, int my)
static const int8_t subpel_filters_msa[7][8]
void ff_put_vp8_epel8_v4_msa(uint8_t *dst, ptrdiff_t dst_stride, uint8_t *src, ptrdiff_t src_stride, int height, int mx, int my)
static const uint16_t mask[17]
static void common_hz_4t_4x4_msa(uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride, const int8_t *filter)
#define SPLATI_H2_SB(...)
void ff_put_vp8_epel8_h6v6_msa(uint8_t *dst, ptrdiff_t dst_stride, uint8_t *src, ptrdiff_t src_stride, int height, int mx, int my)
#define XORI_B4_128_SB(...)
#define HORIZ_6TAP_FILT(src0, src1, mask0, mask1, mask2,filt_h0, filt_h1, filt_h2)
#define HORIZ_4TAP_4WID_4VECS_FILT(src0, src1, src2, src3,mask0, mask1, filt0, filt1,out0, out1)
void ff_put_vp8_bilinear4_h_msa(uint8_t *dst, ptrdiff_t dst_stride, uint8_t *src, ptrdiff_t src_stride, int height, int mx, int my)
void ff_put_vp8_bilinear4_v_msa(uint8_t *dst, ptrdiff_t dst_stride, uint8_t *src, ptrdiff_t src_stride, int height, int mx, int my)
void ff_put_vp8_pixels16_msa(uint8_t *dst, ptrdiff_t dst_stride, uint8_t *src, ptrdiff_t src_stride, int height, int mx, int my)
void ff_put_vp8_epel8_h4v6_msa(uint8_t *dst, ptrdiff_t dst_stride, uint8_t *src, ptrdiff_t src_stride, int height, int mx, int my)
void ff_put_vp8_bilinear8_hv_msa(uint8_t *dst, ptrdiff_t dst_stride, uint8_t *src, ptrdiff_t src_stride, int height, int mx, int my)
#define HORIZ_2TAP_FILT_UH(in0, in1, mask, coeff, shift)
static const uint8_t mc_filt_mask_arr[16 *3]
void ff_put_vp8_epel4_h6v6_msa(uint8_t *dst, ptrdiff_t dst_stride, uint8_t *src, ptrdiff_t src_stride, int height, int mx, int my)
void ff_put_vp8_bilinear16_h_msa(uint8_t *dst, ptrdiff_t dst_stride, uint8_t *src, ptrdiff_t src_stride, int height, int mx, int my)
void ff_put_vp8_epel16_v6_msa(uint8_t *dst, ptrdiff_t dst_stride, uint8_t *src, ptrdiff_t src_stride, int height, int mx, int my)
#define HORIZ_4TAP_FILT(src0, src1, mask0, mask1, filt_h0, filt_h1)
static void common_hz_6t_4x4_msa(uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride, const int8_t *filter)
void ff_put_vp8_epel4_h4_msa(uint8_t *dst, ptrdiff_t dst_stride, uint8_t *src, ptrdiff_t src_stride, int height, int mx, int my)
void ff_put_vp8_epel16_h6_msa(uint8_t *dst, ptrdiff_t dst_stride, uint8_t *src, ptrdiff_t src_stride, int height, int mx, int my)
#define HORIZ_6TAP_8WID_4VECS_FILT(src0, src1, src2, src3,mask0, mask1, mask2,filt0, filt1, filt2,out0, out1, out2, out3)
void ff_put_vp8_epel8_h6_msa(uint8_t *dst, ptrdiff_t dst_stride, uint8_t *src, ptrdiff_t src_stride, int height, int mx, int my)
void ff_put_vp8_epel8_h4v4_msa(uint8_t *dst, ptrdiff_t dst_stride, uint8_t *src, ptrdiff_t src_stride, int height, int mx, int my)
BYTE int const BYTE int int int height
static void common_hz_2t_8x8mult_msa(uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride, const int8_t *filter, int32_t height)
#define SD4(in0, in1, in2, in3, pdst, stride)
static const int8_t filt[NUMTAPS]
void ff_put_vp8_epel16_h6v4_msa(uint8_t *dst, ptrdiff_t dst_stride, uint8_t *src, ptrdiff_t src_stride, int height, int mx, int my)
#define ST8x4_UB(in0, in1, pdst, stride)
#define SPLATI_H3_SB(...)
static void common_hz_6t_4x8_msa(uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride, const int8_t *filter)
void ff_put_vp8_epel8_h6v4_msa(uint8_t *dst, ptrdiff_t dst_stride, uint8_t *src, ptrdiff_t src_stride, int height, int mx, int my)
static void common_hv_2ht_2vt_4x8_msa(uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride, const int8_t *filter_horiz, const int8_t *filter_vert)
void ff_put_vp8_bilinear16_v_msa(uint8_t *dst, ptrdiff_t dst_stride, uint8_t *src, ptrdiff_t src_stride, int height, int mx, int my)
static void common_hz_2t_8x4_msa(uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride, const int8_t *filter)
void ff_put_vp8_epel4_v4_msa(uint8_t *dst, ptrdiff_t dst_stride, uint8_t *src, ptrdiff_t src_stride, int height, int mx, int my)
void ff_put_vp8_epel4_h6_msa(uint8_t *dst, ptrdiff_t dst_stride, uint8_t *src, ptrdiff_t src_stride, int height, int mx, int my)
static void common_hv_2ht_2vt_4x4_msa(uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride, const int8_t *filter_horiz, const int8_t *filter_vert)
void ff_put_vp8_epel4_h4v6_msa(uint8_t *dst, ptrdiff_t dst_stride, uint8_t *src, ptrdiff_t src_stride, int height, int mx, int my)