2 * Copyright (c) 2015 Manojkumar Bhosale (Manojkumar.Bhosale@imgtec.com)
4 * This file is part of FFmpeg.
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.
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.
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
21 #include "libavcodec/vp8dsp.h"
22 #include "libavutil/mips/generic_macros_msa.h"
23 #include "vp8dsp_mips.h"
25 static const uint8_t mc_filt_mask_arr[16 * 3] = {
27 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8,
29 0, 1, 1, 2, 2, 3, 3, 4, 16, 17, 17, 18, 18, 19, 19, 20,
31 8, 9, 9, 10, 10, 11, 11, 12, 24, 25, 25, 26, 26, 27, 27, 28
34 static const int8_t subpel_filters_msa[7][8] = {
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},
44 static const int8_t bilinear_filters_msa[7][2] = {
54 #define HORIZ_6TAP_FILT(src0, src1, mask0, mask1, mask2, \
55 filt_h0, filt_h1, filt_h2) \
57 v16i8 vec0_m, vec1_m, vec2_m; \
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); \
65 hz_out_m = __msa_srari_h(hz_out_m, 7); \
66 hz_out_m = __msa_sat_s_h(hz_out_m, 7); \
71 #define HORIZ_6TAP_4WID_4VECS_FILT(src0, src1, src2, src3, \
72 mask0, mask1, mask2, \
73 filt0, filt1, filt2, \
76 v16i8 vec0_m, vec1_m, vec2_m, vec3_m, vec4_m, vec5_m; \
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); \
86 #define HORIZ_6TAP_8WID_4VECS_FILT(src0, src1, src2, src3, \
87 mask0, mask1, mask2, \
88 filt0, filt1, filt2, \
89 out0, out1, out2, out3) \
91 v16i8 vec0_m, vec1_m, vec2_m, vec3_m, vec4_m, vec5_m, vec6_m, vec7_m; \
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); \
107 #define FILT_4TAP_DPADD_S_H(vec0, vec1, filt0, filt1) \
111 tmp0 = __msa_dotp_s_h((v16i8) vec0, (v16i8) filt0); \
112 tmp0 = __msa_dpadd_s_h(tmp0, (v16i8) vec1, (v16i8) filt1); \
117 #define HORIZ_4TAP_FILT(src0, src1, mask0, mask1, filt_h0, filt_h1) \
119 v16i8 vec0_m, vec1_m; \
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); \
125 hz_out_m = __msa_srari_h(hz_out_m, 7); \
126 hz_out_m = __msa_sat_s_h(hz_out_m, 7); \
131 #define HORIZ_4TAP_4WID_4VECS_FILT(src0, src1, src2, src3, \
132 mask0, mask1, filt0, filt1, \
135 v16i8 vec0_m, vec1_m, vec2_m, vec3_m; \
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); \
143 #define HORIZ_4TAP_8WID_4VECS_FILT(src0, src1, src2, src3, \
144 mask0, mask1, filt0, filt1, \
145 out0, out1, out2, out3) \
147 v16i8 vec0_m, vec1_m, vec2_m, vec3_m; \
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); \
159 static void common_hz_6t_4x4_msa(uint8_t *src, int32_t src_stride,
160 uint8_t *dst, int32_t dst_stride,
161 const int8_t *filter)
163 v16i8 src0, src1, src2, src3, filt0, filt1, filt2;
164 v16u8 mask0, mask1, mask2, out;
165 v8i16 filt, out0, out1;
167 mask0 = LD_UB(&mc_filt_mask_arr[16]);
170 /* rearranging filter */
171 filt = LD_SH(filter);
172 SPLATI_H3_SB(filt, 0, 1, 2, filt0, filt1, filt2);
177 LD_SB4(src, src_stride, src0, src1, src2, src3);
178 XORI_B4_128_SB(src0, src1, src2, src3);
179 HORIZ_6TAP_4WID_4VECS_FILT(src0, src1, src2, src3, mask0, mask1, mask2,
180 filt0, filt1, filt2, out0, out1);
181 SRARI_H2_SH(out0, out1, 7);
182 SAT_SH2_SH(out0, out1, 7);
183 out = PCKEV_XORI128_UB(out0, out1);
184 ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
187 static void common_hz_6t_4x8_msa(uint8_t *src, int32_t src_stride,
188 uint8_t *dst, int32_t dst_stride,
189 const int8_t *filter)
191 v16i8 src0, src1, src2, src3, filt0, filt1, filt2;
192 v16u8 mask0, mask1, mask2, out;
193 v8i16 filt, out0, out1, out2, out3;
195 mask0 = LD_UB(&mc_filt_mask_arr[16]);
198 /* rearranging filter */
199 filt = LD_SH(filter);
200 SPLATI_H3_SB(filt, 0, 1, 2, filt0, filt1, filt2);
205 LD_SB4(src, src_stride, src0, src1, src2, src3);
206 XORI_B4_128_SB(src0, src1, src2, src3);
207 src += (4 * src_stride);
208 HORIZ_6TAP_4WID_4VECS_FILT(src0, src1, src2, src3, mask0, mask1, mask2,
209 filt0, filt1, filt2, out0, out1);
210 LD_SB4(src, src_stride, src0, src1, src2, src3);
211 XORI_B4_128_SB(src0, src1, src2, src3);
212 HORIZ_6TAP_4WID_4VECS_FILT(src0, src1, src2, src3, mask0, mask1, mask2,
213 filt0, filt1, filt2, out2, out3);
214 SRARI_H4_SH(out0, out1, out2, out3, 7);
215 SAT_SH4_SH(out0, out1, out2, out3, 7);
216 out = PCKEV_XORI128_UB(out0, out1);
217 ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
218 dst += (4 * dst_stride);
219 out = PCKEV_XORI128_UB(out2, out3);
220 ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
223 void ff_put_vp8_epel4_h6_msa(uint8_t *dst, ptrdiff_t dst_stride,
224 uint8_t *src, ptrdiff_t src_stride,
225 int height, int mx, int my)
227 const int8_t *filter = subpel_filters_msa[mx - 1];
230 common_hz_6t_4x4_msa(src, src_stride, dst, dst_stride, filter);
231 } else if (8 == height) {
232 common_hz_6t_4x8_msa(src, src_stride, dst, dst_stride, filter);
236 void ff_put_vp8_epel8_h6_msa(uint8_t *dst, ptrdiff_t dst_stride,
237 uint8_t *src, ptrdiff_t src_stride,
238 int height, int mx, int my)
241 const int8_t *filter = subpel_filters_msa[mx - 1];
242 v16i8 src0, src1, src2, src3, filt0, filt1, filt2;
243 v16u8 mask0, mask1, mask2, tmp0, tmp1;
244 v8i16 filt, out0, out1, out2, out3;
246 mask0 = LD_UB(&mc_filt_mask_arr[0]);
250 /* rearranging filter */
251 filt = LD_SH(filter);
252 SPLATI_H3_SB(filt, 0, 1, 2, filt0, filt1, filt2);
257 LD_SB4(src, src_stride, src0, src1, src2, src3);
258 XORI_B4_128_SB(src0, src1, src2, src3);
259 src += (4 * src_stride);
260 HORIZ_6TAP_8WID_4VECS_FILT(src0, src1, src2, src3, mask0, mask1, mask2,
261 filt0, filt1, filt2, out0, out1, out2, out3);
262 SRARI_H4_SH(out0, out1, out2, out3, 7);
263 SAT_SH4_SH(out0, out1, out2, out3, 7);
264 tmp0 = PCKEV_XORI128_UB(out0, out1);
265 tmp1 = PCKEV_XORI128_UB(out2, out3);
266 ST8x4_UB(tmp0, tmp1, dst, dst_stride);
267 dst += (4 * dst_stride);
269 for (loop_cnt = (height >> 2) - 1; loop_cnt--;) {
270 LD_SB4(src, src_stride, src0, src1, src2, src3);
271 XORI_B4_128_SB(src0, src1, src2, src3);
272 src += (4 * src_stride);
273 HORIZ_6TAP_8WID_4VECS_FILT(src0, src1, src2, src3, mask0, mask1, mask2,
274 filt0, filt1, filt2, out0, out1, out2, out3);
275 SRARI_H4_SH(out0, out1, out2, out3, 7);
276 SAT_SH4_SH(out0, out1, out2, out3, 7);
277 tmp0 = PCKEV_XORI128_UB(out0, out1);
278 tmp1 = PCKEV_XORI128_UB(out2, out3);
279 ST8x4_UB(tmp0, tmp1, dst, dst_stride);
280 dst += (4 * dst_stride);
284 void ff_put_vp8_epel16_h6_msa(uint8_t *dst, ptrdiff_t dst_stride,
285 uint8_t *src, ptrdiff_t src_stride,
286 int height, int mx, int my)
289 const int8_t *filter = subpel_filters_msa[mx - 1];
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;
294 mask0 = LD_UB(&mc_filt_mask_arr[0]);
297 /* rearranging filter */
298 filt = LD_SH(filter);
299 SPLATI_H3_SB(filt, 0, 1, 2, filt0, filt1, filt2);
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);
307 XORI_B8_128_SB(src0, src1, src2, src3, src4, src5, src6, src7);
308 src += (4 * src_stride);
310 HORIZ_6TAP_8WID_4VECS_FILT(src0, src1, src2, src3, mask0, mask1, mask2,
311 filt0, filt1, filt2, out0, out1, out2, out3);
312 HORIZ_6TAP_8WID_4VECS_FILT(src4, src5, src6, src7, mask0, mask1, mask2,
313 filt0, filt1, filt2, out4, out5, out6, out7);
314 SRARI_H4_SH(out0, out1, out2, out3, 7);
315 SRARI_H4_SH(out4, out5, out6, out7, 7);
316 SAT_SH4_SH(out0, out1, out2, out3, 7);
317 SAT_SH4_SH(out4, out5, out6, out7, 7);
318 out = PCKEV_XORI128_UB(out0, out1);
321 out = PCKEV_XORI128_UB(out2, out3);
324 out = PCKEV_XORI128_UB(out4, out5);
327 out = PCKEV_XORI128_UB(out6, out7);
333 void ff_put_vp8_epel4_v6_msa(uint8_t *dst, ptrdiff_t dst_stride,
334 uint8_t *src, ptrdiff_t src_stride,
335 int height, int mx, int my)
338 const int8_t *filter = subpel_filters_msa[my - 1];
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;
345 src -= (2 * src_stride);
347 filt = LD_SH(filter);
348 SPLATI_H3_SB(filt, 0, 1, 2, filt0, filt1, filt2);
350 LD_SB5(src, src_stride, src0, src1, src2, src3, src4);
351 src += (5 * src_stride);
353 ILVR_B4_SB(src1, src0, src2, src1, src3, src2, src4, src3, src10_r, src21_r,
355 ILVR_D2_SB(src21_r, src10_r, src43_r, src32_r, src2110, src4332);
356 XORI_B2_128_SB(src2110, src4332);
358 for (loop_cnt = (height >> 2); loop_cnt--;) {
359 LD_SB4(src, src_stride, src5, src6, src7, src8);
360 src += (4 * src_stride);
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);
365 XORI_B2_128_SB(src6554, src8776);
366 out10 = DPADD_SH3_SH(src2110, src4332, src6554, filt0, filt1, filt2);
367 out32 = DPADD_SH3_SH(src4332, src6554, src8776, filt0, filt1, filt2);
368 SRARI_H2_SH(out10, out32, 7);
369 SAT_SH2_SH(out10, out32, 7);
370 out = PCKEV_XORI128_UB(out10, out32);
371 ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
372 dst += (4 * dst_stride);
380 void ff_put_vp8_epel8_v6_msa(uint8_t *dst, ptrdiff_t dst_stride,
381 uint8_t *src, ptrdiff_t src_stride,
382 int height, int mx, int my)
385 const int8_t *filter = subpel_filters_msa[my - 1];
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;
390 v8i16 filt, out0_r, out1_r, out2_r, out3_r;
392 src -= (2 * src_stride);
394 filt = LD_SH(filter);
395 SPLATI_H3_SB(filt, 0, 1, 2, filt0, filt1, filt2);
397 LD_SB5(src, src_stride, src0, src1, src2, src3, src4);
398 src += (5 * src_stride);
400 XORI_B5_128_SB(src0, src1, src2, src3, src4);
401 ILVR_B4_SB(src1, src0, src3, src2, src2, src1, src4, src3,
402 src10_r, src32_r, src21_r, src43_r);
404 for (loop_cnt = (height >> 2); loop_cnt--;) {
405 LD_SB4(src, src_stride, src7, src8, src9, src10);
406 XORI_B4_128_SB(src7, src8, src9, src10);
407 src += (4 * src_stride);
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);
415 SRARI_H4_SH(out0_r, out1_r, out2_r, out3_r, 7);
416 SAT_SH4_SH(out0_r, out1_r, out2_r, out3_r, 7);
417 tmp0 = PCKEV_XORI128_UB(out0_r, out1_r);
418 tmp1 = PCKEV_XORI128_UB(out2_r, out3_r);
419 ST8x4_UB(tmp0, tmp1, dst, dst_stride);
420 dst += (4 * dst_stride);
430 void ff_put_vp8_epel16_v6_msa(uint8_t *dst, ptrdiff_t dst_stride,
431 uint8_t *src, ptrdiff_t src_stride,
432 int height, int mx, int my)
435 const int8_t *filter = subpel_filters_msa[my - 1];
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;
443 src -= (2 * src_stride);
445 filt = LD_SH(filter);
446 SPLATI_H3_SB(filt, 0, 1, 2, filt0, filt1, filt2);
448 LD_SB5(src, src_stride, src0, src1, src2, src3, src4);
449 src += (5 * src_stride);
451 XORI_B5_128_SB(src0, src1, src2, src3, src4);
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);
457 for (loop_cnt = (height >> 2); loop_cnt--;) {
458 LD_SB4(src, src_stride, src5, src6, src7, src8);
459 src += (4 * src_stride);
461 XORI_B4_128_SB(src5, src6, src7, src8);
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,
468 out1_r = DPADD_SH3_SH(src21_r, src43_r, src65_r, filt0, filt1,
470 out2_r = DPADD_SH3_SH(src32_r, src54_r, src76_r, filt0, filt1,
472 out3_r = DPADD_SH3_SH(src43_r, src65_r, src87_r, filt0, filt1,
474 out0_l = DPADD_SH3_SH(src10_l, src32_l, src54_l, filt0, filt1,
476 out1_l = DPADD_SH3_SH(src21_l, src43_l, src65_l, filt0, filt1,
478 out2_l = DPADD_SH3_SH(src32_l, src54_l, src76_l, filt0, filt1,
480 out3_l = DPADD_SH3_SH(src43_l, src65_l, src87_l, filt0, filt1,
482 SRARI_H4_SH(out0_r, out1_r, out2_r, out3_r, 7);
483 SRARI_H4_SH(out0_l, out1_l, out2_l, out3_l, 7);
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);
488 XORI_B4_128_UB(tmp0, tmp1, tmp2, tmp3);
489 ST_UB4(tmp0, tmp1, tmp2, tmp3, dst, dst_stride);
490 dst += (4 * dst_stride);
504 void ff_put_vp8_epel4_h6v6_msa(uint8_t *dst, ptrdiff_t dst_stride,
505 uint8_t *src, ptrdiff_t src_stride,
506 int height, int mx, int my)
509 const int8_t *filter_horiz = subpel_filters_msa[mx - 1];
510 const int8_t *filter_vert = subpel_filters_msa[my - 1];
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;
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;
518 mask0 = LD_UB(&mc_filt_mask_arr[16]);
519 src -= (2 + 2 * src_stride);
521 /* rearranging filter */
522 filt = LD_SH(filter_horiz);
523 SPLATI_H3_SB(filt, 0, 1, 2, filt_hz0, filt_hz1, filt_hz2);
525 filt = LD_SH(filter_vert);
526 SPLATI_H3_SH(filt, 0, 1, 2, filt_vt0, filt_vt1, filt_vt2);
531 LD_SB5(src, src_stride, src0, src1, src2, src3, src4);
532 src += (5 * src_stride);
534 XORI_B5_128_SB(src0, src1, src2, src3, src4);
535 hz_out0 = HORIZ_6TAP_FILT(src0, src1, mask0, mask1, mask2, filt_hz0,
537 hz_out2 = HORIZ_6TAP_FILT(src2, src3, mask0, mask1, mask2, filt_hz0,
539 hz_out1 = (v8i16) __msa_sldi_b((v16i8) hz_out2, (v16i8) hz_out0, 8);
540 hz_out3 = HORIZ_6TAP_FILT(src3, src4, mask0, mask1, mask2, filt_hz0,
542 ILVEV_B2_SH(hz_out0, hz_out1, hz_out2, hz_out3, out0, out1);
544 for (loop_cnt = (height >> 2); loop_cnt--;) {
545 LD_SB2(src, src_stride, src5, src6);
546 src += (2 * src_stride);
548 XORI_B2_128_SB(src5, src6);
549 hz_out5 = HORIZ_6TAP_FILT(src5, src6, mask0, mask1, mask2, filt_hz0,
551 hz_out4 = (v8i16) __msa_sldi_b((v16i8) hz_out5, (v16i8) hz_out3, 8);
553 LD_SB2(src, src_stride, src7, src8);
554 src += (2 * src_stride);
556 XORI_B2_128_SB(src7, src8);
557 hz_out7 = HORIZ_6TAP_FILT(src7, src8, mask0, mask1, mask2, filt_hz0,
559 hz_out6 = (v8i16) __msa_sldi_b((v16i8) hz_out7, (v16i8) hz_out5, 8);
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);
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);
567 SRARI_H2_SH(tmp0, tmp1, 7);
568 SAT_SH2_SH(tmp0, tmp1, 7);
569 out = PCKEV_XORI128_UB(tmp0, tmp1);
570 ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
571 dst += (4 * dst_stride);
579 void ff_put_vp8_epel8_h6v6_msa(uint8_t *dst, ptrdiff_t dst_stride,
580 uint8_t *src, ptrdiff_t src_stride,
581 int height, int mx, int my)
584 const int8_t *filter_horiz = subpel_filters_msa[mx - 1];
585 const int8_t *filter_vert = subpel_filters_msa[my - 1];
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;
594 mask0 = LD_UB(&mc_filt_mask_arr[0]);
595 src -= (2 + 2 * src_stride);
597 /* rearranging filter */
598 filt = LD_SH(filter_horiz);
599 SPLATI_H3_SB(filt, 0, 1, 2, filt_hz0, filt_hz1, filt_hz2);
604 LD_SB5(src, src_stride, src0, src1, src2, src3, src4);
605 src += (5 * src_stride);
607 XORI_B5_128_SB(src0, src1, src2, src3, src4);
608 hz_out0 = HORIZ_6TAP_FILT(src0, src0, mask0, mask1, mask2, filt_hz0,
610 hz_out1 = HORIZ_6TAP_FILT(src1, src1, mask0, mask1, mask2, filt_hz0,
612 hz_out2 = HORIZ_6TAP_FILT(src2, src2, mask0, mask1, mask2, filt_hz0,
614 hz_out3 = HORIZ_6TAP_FILT(src3, src3, mask0, mask1, mask2, filt_hz0,
616 hz_out4 = HORIZ_6TAP_FILT(src4, src4, mask0, mask1, mask2, filt_hz0,
619 filt = LD_SH(filter_vert);
620 SPLATI_H3_SH(filt, 0, 1, 2, filt_vt0, filt_vt1, filt_vt2);
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);
625 for (loop_cnt = (height >> 2); loop_cnt--;) {
626 LD_SB4(src, src_stride, src5, src6, src7, src8);
627 src += (4 * src_stride);
629 XORI_B4_128_SB(src5, src6, src7, src8);
630 hz_out5 = HORIZ_6TAP_FILT(src5, src5, mask0, mask1, mask2, filt_hz0,
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);
635 hz_out6 = HORIZ_6TAP_FILT(src6, src6, mask0, mask1, mask2, filt_hz0,
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);
640 hz_out7 = HORIZ_6TAP_FILT(src7, src7, mask0, mask1, mask2, filt_hz0,
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);
645 hz_out8 = HORIZ_6TAP_FILT(src8, src8, mask0, mask1, mask2, filt_hz0,
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);
650 SRARI_H4_SH(tmp0, tmp1, tmp2, tmp3, 7);
651 SAT_SH4_SH(tmp0, tmp1, tmp2, tmp3, 7);
652 vec0 = PCKEV_XORI128_UB(tmp0, tmp1);
653 vec1 = PCKEV_XORI128_UB(tmp2, tmp3);
654 ST8x4_UB(vec0, vec1, dst, dst_stride);
655 dst += (4 * dst_stride);
666 void ff_put_vp8_epel16_h6v6_msa(uint8_t *dst, ptrdiff_t dst_stride,
667 uint8_t *src, ptrdiff_t src_stride,
668 int height, int mx, int my)
670 int32_t multiple8_cnt;
672 for (multiple8_cnt = 2; multiple8_cnt--;) {
673 ff_put_vp8_epel8_h6v6_msa(dst, dst_stride, src, src_stride, height,
681 static void common_hz_4t_4x4_msa(uint8_t *src, int32_t src_stride,
682 uint8_t *dst, int32_t dst_stride,
683 const int8_t *filter)
685 v16i8 src0, src1, src2, src3, filt0, filt1, mask0, mask1;
686 v8i16 filt, out0, out1;
689 mask0 = LD_SB(&mc_filt_mask_arr[16]);
692 /* rearranging filter */
693 filt = LD_SH(filter);
694 SPLATI_H2_SB(filt, 0, 1, filt0, filt1);
698 LD_SB4(src, src_stride, src0, src1, src2, src3);
699 XORI_B4_128_SB(src0, src1, src2, src3);
700 HORIZ_4TAP_4WID_4VECS_FILT(src0, src1, src2, src3, mask0, mask1,
701 filt0, filt1, out0, out1);
702 SRARI_H2_SH(out0, out1, 7);
703 SAT_SH2_SH(out0, out1, 7);
704 out = PCKEV_XORI128_UB(out0, out1);
705 ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
708 static void common_hz_4t_4x8_msa(uint8_t *src, int32_t src_stride,
709 uint8_t *dst, int32_t dst_stride,
710 const int8_t *filter)
712 v16i8 src0, src1, src2, src3, filt0, filt1, mask0, mask1;
714 v8i16 filt, out0, out1, out2, out3;
716 mask0 = LD_SB(&mc_filt_mask_arr[16]);
719 /* rearranging filter */
720 filt = LD_SH(filter);
721 SPLATI_H2_SB(filt, 0, 1, filt0, filt1);
725 LD_SB4(src, src_stride, src0, src1, src2, src3);
726 src += (4 * src_stride);
728 XORI_B4_128_SB(src0, src1, src2, src3);
729 HORIZ_4TAP_4WID_4VECS_FILT(src0, src1, src2, src3, mask0, mask1,
730 filt0, filt1, out0, out1);
731 LD_SB4(src, src_stride, src0, src1, src2, src3);
732 XORI_B4_128_SB(src0, src1, src2, src3);
733 HORIZ_4TAP_4WID_4VECS_FILT(src0, src1, src2, src3, mask0, mask1,
734 filt0, filt1, out2, out3);
735 SRARI_H4_SH(out0, out1, out2, out3, 7);
736 SAT_SH4_SH(out0, out1, out2, out3, 7);
737 out = PCKEV_XORI128_UB(out0, out1);
738 ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
739 dst += (4 * dst_stride);
740 out = PCKEV_XORI128_UB(out2, out3);
741 ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
744 static void common_hz_4t_4x16_msa(uint8_t *src, int32_t src_stride,
745 uint8_t *dst, int32_t dst_stride,
746 const int8_t *filter)
748 v16i8 src0, src1, src2, src3, src4, src5, src6, src7;
749 v16i8 filt0, filt1, mask0, mask1;
751 v8i16 filt, out0, out1, out2, out3;
753 mask0 = LD_SB(&mc_filt_mask_arr[16]);
756 /* rearranging filter */
757 filt = LD_SH(filter);
758 SPLATI_H2_SB(filt, 0, 1, filt0, filt1);
762 LD_SB8(src, src_stride, src0, src1, src2, src3, src4, src5, src6, src7);
763 src += (8 * src_stride);
764 XORI_B8_128_SB(src0, src1, src2, src3, src4, src5, src6, src7);
765 HORIZ_4TAP_4WID_4VECS_FILT(src0, src1, src2, src3, mask0, mask1,
766 filt0, filt1, out0, out1);
767 HORIZ_4TAP_4WID_4VECS_FILT(src4, src5, src6, src7, mask0, mask1,
768 filt0, filt1, out2, out3);
769 SRARI_H4_SH(out0, out1, out2, out3, 7);
770 SAT_SH4_SH(out0, out1, out2, out3, 7);
771 out = PCKEV_XORI128_UB(out0, out1);
772 ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
773 dst += (4 * dst_stride);
774 out = PCKEV_XORI128_UB(out2, out3);
775 ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
776 dst += (4 * dst_stride);
778 LD_SB8(src, src_stride, src0, src1, src2, src3, src4, src5, src6, src7);
779 src += (8 * src_stride);
780 XORI_B8_128_SB(src0, src1, src2, src3, src4, src5, src6, src7);
781 HORIZ_4TAP_4WID_4VECS_FILT(src0, src1, src2, src3, mask0, mask1,
782 filt0, filt1, out0, out1);
783 HORIZ_4TAP_4WID_4VECS_FILT(src4, src5, src6, src7, mask0, mask1,
784 filt0, filt1, out2, out3);
785 SRARI_H4_SH(out0, out1, out2, out3, 7);
786 SAT_SH4_SH(out0, out1, out2, out3, 7);
787 out = PCKEV_XORI128_UB(out0, out1);
788 ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
789 dst += (4 * dst_stride);
790 out = PCKEV_XORI128_UB(out2, out3);
791 ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
794 void ff_put_vp8_epel4_h4_msa(uint8_t *dst, ptrdiff_t dst_stride,
795 uint8_t *src, ptrdiff_t src_stride,
796 int height, int mx, int my)
798 const int8_t *filter = subpel_filters_msa[mx - 1];
801 common_hz_4t_4x4_msa(src, src_stride, dst, dst_stride, filter);
802 } else if (8 == height) {
803 common_hz_4t_4x8_msa(src, src_stride, dst, dst_stride, filter);
804 } else if (16 == height) {
805 common_hz_4t_4x16_msa(src, src_stride, dst, dst_stride, filter);
809 void ff_put_vp8_epel8_h4_msa(uint8_t *dst, ptrdiff_t dst_stride,
810 uint8_t *src, ptrdiff_t src_stride,
811 int height, int mx, int my)
814 const int8_t *filter = subpel_filters_msa[mx - 1];
815 v16i8 src0, src1, src2, src3, filt0, filt1, mask0, mask1;
817 v8i16 filt, out0, out1, out2, out3;
819 mask0 = LD_SB(&mc_filt_mask_arr[0]);
822 /* rearranging filter */
823 filt = LD_SH(filter);
824 SPLATI_H2_SB(filt, 0, 1, filt0, filt1);
828 for (loop_cnt = (height >> 2); loop_cnt--;) {
829 LD_SB4(src, src_stride, src0, src1, src2, src3);
830 src += (4 * src_stride);
832 XORI_B4_128_SB(src0, src1, src2, src3);
833 HORIZ_4TAP_8WID_4VECS_FILT(src0, src1, src2, src3, mask0, mask1, filt0,
834 filt1, out0, out1, out2, out3);
835 SRARI_H4_SH(out0, out1, out2, out3, 7);
836 SAT_SH4_SH(out0, out1, out2, out3, 7);
837 tmp0 = PCKEV_XORI128_UB(out0, out1);
838 tmp1 = PCKEV_XORI128_UB(out2, out3);
839 ST8x4_UB(tmp0, tmp1, dst, dst_stride);
840 dst += (4 * dst_stride);
844 void ff_put_vp8_epel16_h4_msa(uint8_t *dst, ptrdiff_t dst_stride,
845 uint8_t *src, ptrdiff_t src_stride,
846 int height, int mx, int my)
849 const int8_t *filter = subpel_filters_msa[mx - 1];
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;
855 mask0 = LD_SB(&mc_filt_mask_arr[0]);
858 /* rearranging filter */
859 filt = LD_SH(filter);
860 SPLATI_H2_SB(filt, 0, 1, filt0, filt1);
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);
869 XORI_B8_128_SB(src0, src1, src2, src3, src4, src5, src6, src7);
870 HORIZ_4TAP_8WID_4VECS_FILT(src0, src1, src2, src3, mask0, mask1, filt0,
871 filt1, out0, out1, out2, out3);
872 HORIZ_4TAP_8WID_4VECS_FILT(src4, src5, src6, src7, mask0, mask1, filt0,
873 filt1, out4, out5, out6, out7);
874 SRARI_H4_SH(out0, out1, out2, out3, 7);
875 SRARI_H4_SH(out4, out5, out6, out7, 7);
876 SAT_SH4_SH(out0, out1, out2, out3, 7);
877 SAT_SH4_SH(out4, out5, out6, out7, 7);
878 out = PCKEV_XORI128_UB(out0, out1);
881 out = PCKEV_XORI128_UB(out2, out3);
884 out = PCKEV_XORI128_UB(out4, out5);
887 out = PCKEV_XORI128_UB(out6, out7);
893 void ff_put_vp8_epel4_v4_msa(uint8_t *dst, ptrdiff_t dst_stride,
894 uint8_t *src, ptrdiff_t src_stride,
895 int height, int mx, int my)
898 const int8_t *filter = subpel_filters_msa[my - 1];
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;
907 filt = LD_SH(filter);
908 SPLATI_H2_SB(filt, 0, 1, filt0, filt1);
910 LD_SB3(src, src_stride, src0, src1, src2);
911 src += (3 * src_stride);
913 ILVR_B2_SB(src1, src0, src2, src1, src10_r, src21_r);
915 src2110 = (v16i8) __msa_ilvr_d((v2i64) src21_r, (v2i64) src10_r);
916 src2110 = (v16i8) __msa_xori_b((v16u8) src2110, 128);
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);
924 out10 = FILT_4TAP_DPADD_S_H(src2110, src4332, filt0, filt1);
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);
931 out32 = FILT_4TAP_DPADD_S_H(src4332, src2110, filt0, filt1);
932 SRARI_H2_SH(out10, out32, 7);
933 SAT_SH2_SH(out10, out32, 7);
934 out = PCKEV_XORI128_UB(out10, out32);
935 ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
936 dst += (4 * dst_stride);
940 void ff_put_vp8_epel8_v4_msa(uint8_t *dst, ptrdiff_t dst_stride,
941 uint8_t *src, ptrdiff_t src_stride,
942 int height, int mx, int my)
945 const int8_t *filter = subpel_filters_msa[my - 1];
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;
949 v8i16 filt, out0_r, out1_r, out2_r, out3_r;
953 filt = LD_SH(filter);
954 SPLATI_H2_SB(filt, 0, 1, filt0, filt1);
956 LD_SB3(src, src_stride, src0, src1, src2);
957 src += (3 * src_stride);
959 XORI_B3_128_SB(src0, src1, src2);
960 ILVR_B2_SB(src1, src0, src2, src1, src10_r, src21_r);
962 for (loop_cnt = (height >> 2); loop_cnt--;) {
963 LD_SB4(src, src_stride, src7, src8, src9, src10);
964 src += (4 * src_stride);
966 XORI_B4_128_SB(src7, src8, src9, src10);
967 ILVR_B4_SB(src7, src2, src8, src7, src9, src8, src10, src9,
968 src72_r, src87_r, src98_r, src109_r);
969 out0_r = FILT_4TAP_DPADD_S_H(src10_r, src72_r, filt0, filt1);
970 out1_r = FILT_4TAP_DPADD_S_H(src21_r, src87_r, filt0, filt1);
971 out2_r = FILT_4TAP_DPADD_S_H(src72_r, src98_r, filt0, filt1);
972 out3_r = FILT_4TAP_DPADD_S_H(src87_r, src109_r, filt0, filt1);
973 SRARI_H4_SH(out0_r, out1_r, out2_r, out3_r, 7);
974 SAT_SH4_SH(out0_r, out1_r, out2_r, out3_r, 7);
975 tmp0 = PCKEV_XORI128_UB(out0_r, out1_r);
976 tmp1 = PCKEV_XORI128_UB(out2_r, out3_r);
977 ST8x4_UB(tmp0, tmp1, dst, dst_stride);
978 dst += (4 * dst_stride);
986 void ff_put_vp8_epel16_v4_msa(uint8_t *dst, ptrdiff_t dst_stride,
987 uint8_t *src, ptrdiff_t src_stride,
988 int height, int mx, int my)
991 const int8_t *filter = subpel_filters_msa[my - 1];
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;
1000 filt = LD_SH(filter);
1001 SPLATI_H2_SB(filt, 0, 1, filt0, filt1);
1003 LD_SB3(src, src_stride, src0, src1, src2);
1004 src += (3 * src_stride);
1006 XORI_B3_128_SB(src0, src1, src2);
1007 ILVR_B2_SB(src1, src0, src2, src1, src10_r, src21_r);
1008 ILVL_B2_SB(src1, src0, src2, src1, src10_l, src21_l);
1010 for (loop_cnt = (height >> 2); loop_cnt--;) {
1011 LD_SB4(src, src_stride, src3, src4, src5, src6);
1012 src += (4 * src_stride);
1014 XORI_B4_128_SB(src3, src4, src5, src6);
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);
1019 out0_r = FILT_4TAP_DPADD_S_H(src10_r, src32_r, filt0, filt1);
1020 out1_r = FILT_4TAP_DPADD_S_H(src21_r, src43_r, filt0, filt1);
1021 out2_r = FILT_4TAP_DPADD_S_H(src32_r, src54_r, filt0, filt1);
1022 out3_r = FILT_4TAP_DPADD_S_H(src43_r, src65_r, filt0, filt1);
1023 out0_l = FILT_4TAP_DPADD_S_H(src10_l, src32_l, filt0, filt1);
1024 out1_l = FILT_4TAP_DPADD_S_H(src21_l, src43_l, filt0, filt1);
1025 out2_l = FILT_4TAP_DPADD_S_H(src32_l, src54_l, filt0, filt1);
1026 out3_l = FILT_4TAP_DPADD_S_H(src43_l, src65_l, filt0, filt1);
1027 SRARI_H4_SH(out0_r, out1_r, out2_r, out3_r, 7);
1028 SRARI_H4_SH(out0_l, out1_l, out2_l, out3_l, 7);
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);
1033 XORI_B4_128_UB(tmp0, tmp1, tmp2, tmp3);
1034 ST_UB4(tmp0, tmp1, tmp2, tmp3, dst, dst_stride);
1035 dst += (4 * dst_stride);
1045 void ff_put_vp8_epel4_h4v4_msa(uint8_t *dst, ptrdiff_t dst_stride,
1046 uint8_t *src, ptrdiff_t src_stride,
1047 int height, int mx, int my)
1050 const int8_t *filter_horiz = subpel_filters_msa[mx - 1];
1051 const int8_t *filter_vert = subpel_filters_msa[my - 1];
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;
1057 mask0 = LD_UB(&mc_filt_mask_arr[16]);
1058 src -= (1 + 1 * src_stride);
1060 /* rearranging filter */
1061 filt = LD_SH(filter_horiz);
1062 SPLATI_H2_SB(filt, 0, 1, filt_hz0, filt_hz1);
1066 LD_SB3(src, src_stride, src0, src1, src2);
1067 src += (3 * src_stride);
1069 XORI_B3_128_SB(src0, src1, src2);
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);
1074 filt = LD_SH(filter_vert);
1075 SPLATI_H2_SH(filt, 0, 1, filt_vt0, filt_vt1);
1077 for (loop_cnt = (height >> 2); loop_cnt--;) {
1078 LD_SB4(src, src_stride, src3, src4, src5, src6);
1079 src += (4 * src_stride);
1081 XORI_B2_128_SB(src3, src4);
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);
1085 tmp0 = FILT_4TAP_DPADD_S_H(vec0, vec1, filt_vt0, filt_vt1);
1087 XORI_B2_128_SB(src5, src6);
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);
1091 tmp1 = FILT_4TAP_DPADD_S_H(vec1, vec2, filt_vt0, filt_vt1);
1093 SRARI_H2_SH(tmp0, tmp1, 7);
1094 SAT_SH2_SH(tmp0, tmp1, 7);
1095 out = PCKEV_XORI128_UB(tmp0, tmp1);
1096 ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
1097 dst += (4 * dst_stride);
1104 void ff_put_vp8_epel8_h4v4_msa(uint8_t *dst, ptrdiff_t dst_stride,
1105 uint8_t *src, ptrdiff_t src_stride,
1106 int height, int mx, int my)
1109 const int8_t *filter_horiz = subpel_filters_msa[mx - 1];
1110 const int8_t *filter_vert = subpel_filters_msa[my - 1];
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;
1117 mask0 = LD_UB(&mc_filt_mask_arr[0]);
1118 src -= (1 + 1 * src_stride);
1120 /* rearranging filter */
1121 filt = LD_SH(filter_horiz);
1122 SPLATI_H2_SB(filt, 0, 1, filt_hz0, filt_hz1);
1126 LD_SB3(src, src_stride, src0, src1, src2);
1127 src += (3 * src_stride);
1129 XORI_B3_128_SB(src0, src1, src2);
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);
1135 filt = LD_SH(filter_vert);
1136 SPLATI_H2_SH(filt, 0, 1, filt_vt0, filt_vt1);
1138 for (loop_cnt = (height >> 2); loop_cnt--;) {
1139 LD_SB4(src, src_stride, src3, src4, src5, src6);
1140 src += (4 * src_stride);
1142 XORI_B4_128_SB(src3, src4, src5, src6);
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);
1145 tmp0 = FILT_4TAP_DPADD_S_H(vec0, vec1, filt_vt0, filt_vt1);
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);
1149 tmp1 = FILT_4TAP_DPADD_S_H(vec2, vec3, filt_vt0, filt_vt1);
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);
1153 tmp2 = FILT_4TAP_DPADD_S_H(vec1, vec4, filt_vt0, filt_vt1);
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);
1157 tmp3 = FILT_4TAP_DPADD_S_H(vec0, vec1, filt_vt0, filt_vt1);
1159 SRARI_H4_SH(tmp0, tmp1, tmp2, tmp3, 7);
1160 SAT_SH4_SH(tmp0, tmp1, tmp2, tmp3, 7);
1161 out0 = PCKEV_XORI128_UB(tmp0, tmp1);
1162 out1 = PCKEV_XORI128_UB(tmp2, tmp3);
1163 ST8x4_UB(out0, out1, dst, dst_stride);
1164 dst += (4 * dst_stride);
1171 void ff_put_vp8_epel16_h4v4_msa(uint8_t *dst, ptrdiff_t dst_stride,
1172 uint8_t *src, ptrdiff_t src_stride,
1173 int height, int mx, int my)
1175 int32_t multiple8_cnt;
1177 for (multiple8_cnt = 2; multiple8_cnt--;) {
1178 ff_put_vp8_epel8_h4v4_msa(dst, dst_stride, src, src_stride, height,
1186 void ff_put_vp8_epel4_h6v4_msa(uint8_t *dst, ptrdiff_t dst_stride,
1187 uint8_t *src, ptrdiff_t src_stride,
1188 int height, int mx, int my)
1191 const int8_t *filter_horiz = subpel_filters_msa[mx - 1];
1192 const int8_t *filter_vert = subpel_filters_msa[my - 1];
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;
1199 mask0 = LD_UB(&mc_filt_mask_arr[16]);
1200 src -= (2 + 1 * src_stride);
1202 /* rearranging filter */
1203 filt = LD_SH(filter_horiz);
1204 SPLATI_H3_SB(filt, 0, 1, 2, filt_hz0, filt_hz1, filt_hz2);
1209 LD_SB3(src, src_stride, src0, src1, src2);
1210 src += (3 * src_stride);
1212 XORI_B3_128_SB(src0, src1, src2);
1213 hz_out0 = HORIZ_6TAP_FILT(src0, src1, mask0, mask1, mask2, filt_hz0,
1214 filt_hz1, filt_hz2);
1215 hz_out1 = HORIZ_6TAP_FILT(src1, src2, mask0, mask1, mask2, filt_hz0,
1216 filt_hz1, filt_hz2);
1217 vec0 = (v8i16) __msa_ilvev_b((v16i8) hz_out1, (v16i8) hz_out0);
1219 filt = LD_SH(filter_vert);
1220 SPLATI_H2_SH(filt, 0, 1, filt_vt0, filt_vt1);
1222 for (loop_cnt = (height >> 2); loop_cnt--;) {
1223 LD_SB4(src, src_stride, src3, src4, src5, src6);
1224 src += (4 * src_stride);
1226 XORI_B4_128_SB(src3, src4, src5, src6);
1227 hz_out3 = HORIZ_6TAP_FILT(src3, src4, mask0, mask1, mask2, filt_hz0,
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);
1231 tmp0 = FILT_4TAP_DPADD_S_H(vec0, vec1, filt_vt0, filt_vt1);
1233 hz_out5 = HORIZ_6TAP_FILT(src5, src6, mask0, mask1, mask2, filt_hz0,
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);
1237 tmp1 = FILT_4TAP_DPADD_S_H(vec1, vec2, filt_vt0, filt_vt1);
1239 SRARI_H2_SH(tmp0, tmp1, 7);
1240 SAT_SH2_SH(tmp0, tmp1, 7);
1241 PCKEV_B2_UB(tmp0, tmp0, tmp1, tmp1, res0, res1);
1242 XORI_B2_128_UB(res0, res1);
1243 ST4x4_UB(res0, res1, 0, 1, 0, 1, dst, dst_stride);
1244 dst += (4 * dst_stride);
1251 void ff_put_vp8_epel8_h6v4_msa(uint8_t *dst, ptrdiff_t dst_stride,
1252 uint8_t *src, ptrdiff_t src_stride,
1253 int height, int mx, int my)
1256 const int8_t *filter_horiz = subpel_filters_msa[mx - 1];
1257 const int8_t *filter_vert = subpel_filters_msa[my - 1];
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;
1264 mask0 = LD_SB(&mc_filt_mask_arr[0]);
1265 src -= (2 + src_stride);
1267 /* rearranging filter */
1268 filt = LD_SH(filter_horiz);
1269 SPLATI_H3_SB(filt, 0, 1, 2, filt_hz0, filt_hz1, filt_hz2);
1274 LD_SB3(src, src_stride, src0, src1, src2);
1275 src += (3 * src_stride);
1277 XORI_B3_128_SB(src0, src1, src2);
1278 hz_out0 = HORIZ_6TAP_FILT(src0, src0, mask0, mask1, mask2, filt_hz0,
1279 filt_hz1, filt_hz2);
1280 hz_out1 = HORIZ_6TAP_FILT(src1, src1, mask0, mask1, mask2, filt_hz0,
1281 filt_hz1, filt_hz2);
1282 hz_out2 = HORIZ_6TAP_FILT(src2, src2, mask0, mask1, mask2, filt_hz0,
1283 filt_hz1, filt_hz2);
1284 ILVEV_B2_SH(hz_out0, hz_out1, hz_out1, hz_out2, vec0, vec2);
1286 filt = LD_SH(filter_vert);
1287 SPLATI_H2_SH(filt, 0, 1, filt_vt0, filt_vt1);
1289 for (loop_cnt = (height >> 2); loop_cnt--;) {
1290 LD_SB4(src, src_stride, src3, src4, src5, src6);
1291 src += (4 * src_stride);
1293 XORI_B4_128_SB(src3, src4, src5, src6);
1295 hz_out3 = HORIZ_6TAP_FILT(src3, src3, mask0, mask1, mask2, filt_hz0,
1296 filt_hz1, filt_hz2);
1297 vec1 = (v8i16) __msa_ilvev_b((v16i8) hz_out3, (v16i8) hz_out2);
1298 tmp0 = FILT_4TAP_DPADD_S_H(vec0, vec1, filt_vt0, filt_vt1);
1300 hz_out0 = HORIZ_6TAP_FILT(src4, src4, mask0, mask1, mask2, filt_hz0,
1301 filt_hz1, filt_hz2);
1302 vec3 = (v8i16) __msa_ilvev_b((v16i8) hz_out0, (v16i8) hz_out3);
1303 tmp1 = FILT_4TAP_DPADD_S_H(vec2, vec3, filt_vt0, filt_vt1);
1305 hz_out1 = HORIZ_6TAP_FILT(src5, src5, mask0, mask1, mask2, filt_hz0,
1306 filt_hz1, filt_hz2);
1307 vec0 = (v8i16) __msa_ilvev_b((v16i8) hz_out1, (v16i8) hz_out0);
1308 tmp2 = FILT_4TAP_DPADD_S_H(vec1, vec0, filt_vt0, filt_vt1);
1310 hz_out2 = HORIZ_6TAP_FILT(src6, src6, mask0, mask1, mask2, filt_hz0,
1311 filt_hz1, filt_hz2);
1312 ILVEV_B2_SH(hz_out3, hz_out0, hz_out1, hz_out2, vec1, vec2);
1313 tmp3 = FILT_4TAP_DPADD_S_H(vec1, vec2, filt_vt0, filt_vt1);
1315 SRARI_H4_SH(tmp0, tmp1, tmp2, tmp3, 7);
1316 SAT_SH4_SH(tmp0, tmp1, tmp2, tmp3, 7);
1317 out0 = PCKEV_XORI128_UB(tmp0, tmp1);
1318 out1 = PCKEV_XORI128_UB(tmp2, tmp3);
1319 ST8x4_UB(out0, out1, dst, dst_stride);
1320 dst += (4 * dst_stride);
1324 void ff_put_vp8_epel16_h6v4_msa(uint8_t *dst, ptrdiff_t dst_stride,
1325 uint8_t *src, ptrdiff_t src_stride,
1326 int height, int mx, int my)
1328 int32_t multiple8_cnt;
1330 for (multiple8_cnt = 2; multiple8_cnt--;) {
1331 ff_put_vp8_epel8_h6v4_msa(dst, dst_stride, src, src_stride, height,
1339 void ff_put_vp8_epel4_h4v6_msa(uint8_t *dst, ptrdiff_t dst_stride,
1340 uint8_t *src, ptrdiff_t src_stride,
1341 int height, int mx, int my)
1344 const int8_t *filter_horiz = subpel_filters_msa[mx - 1];
1345 const int8_t *filter_vert = subpel_filters_msa[my - 1];
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;
1353 mask0 = LD_SB(&mc_filt_mask_arr[16]);
1355 src -= (1 + 2 * src_stride);
1357 /* rearranging filter */
1358 filt = LD_SH(filter_horiz);
1359 SPLATI_H2_SB(filt, 0, 1, filt_hz0, filt_hz1);
1363 LD_SB5(src, src_stride, src0, src1, src2, src3, src4);
1364 src += (5 * src_stride);
1366 XORI_B5_128_SB(src0, src1, src2, src3, src4);
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);
1373 filt = LD_SH(filter_vert);
1374 SPLATI_H3_SH(filt, 0, 1, 2, filt_vt0, filt_vt1, filt_vt2);
1376 for (loop_cnt = (height >> 2); loop_cnt--;) {
1377 LD_SB4(src, src_stride, src5, src6, src7, src8);
1378 XORI_B4_128_SB(src5, src6, src7, src8);
1379 src += (4 * src_stride);
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);
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);
1391 SRARI_H2_SH(tmp0, tmp1, 7);
1392 SAT_SH2_SH(tmp0, tmp1, 7);
1393 out = PCKEV_XORI128_UB(tmp0, tmp1);
1394 ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
1395 dst += (4 * dst_stride);
1403 void ff_put_vp8_epel8_h4v6_msa(uint8_t *dst, ptrdiff_t dst_stride,
1404 uint8_t *src, ptrdiff_t src_stride,
1405 int height, int mx, int my)
1408 const int8_t *filter_horiz = subpel_filters_msa[mx - 1];
1409 const int8_t *filter_vert = subpel_filters_msa[my - 1];
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;
1417 mask0 = LD_SB(&mc_filt_mask_arr[0]);
1418 src -= (1 + 2 * src_stride);
1420 /* rearranging filter */
1421 filt = LD_SH(filter_horiz);
1422 SPLATI_H2_SB(filt, 0, 1, filt_hz0, filt_hz1);
1426 LD_SB5(src, src_stride, src0, src1, src2, src3, src4);
1427 src += (5 * src_stride);
1429 XORI_B5_128_SB(src0, src1, src2, src3, src4);
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);
1438 filt = LD_SH(filter_vert);
1439 SPLATI_H3_SH(filt, 0, 1, 2, filt_vt0, filt_vt1, filt_vt2);
1441 for (loop_cnt = (height >> 2); loop_cnt--;) {
1442 LD_SB4(src, src_stride, src5, src6, src7, src8);
1443 src += (4 * src_stride);
1445 XORI_B4_128_SB(src5, src6, src7, src8);
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);
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);
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);
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);
1463 SRARI_H4_SH(tmp0, tmp1, tmp2, tmp3, 7);
1464 SAT_SH4_SH(tmp0, tmp1, tmp2, tmp3, 7);
1465 vec0 = PCKEV_XORI128_UB(tmp0, tmp1);
1466 vec1 = PCKEV_XORI128_UB(tmp2, tmp3);
1467 ST8x4_UB(vec0, vec1, dst, dst_stride);
1468 dst += (4 * dst_stride);
1478 void ff_put_vp8_epel16_h4v6_msa(uint8_t *dst, ptrdiff_t dst_stride,
1479 uint8_t *src, ptrdiff_t src_stride,
1480 int height, int mx, int my)
1482 int32_t multiple8_cnt;
1484 for (multiple8_cnt = 2; multiple8_cnt--;) {
1485 ff_put_vp8_epel8_h4v6_msa(dst, dst_stride, src, src_stride, height,
1493 static void common_hz_2t_4x4_msa(uint8_t *src, int32_t src_stride,
1494 uint8_t *dst, int32_t dst_stride,
1495 const int8_t *filter)
1497 v16i8 src0, src1, src2, src3, mask;
1498 v16u8 filt0, vec0, vec1, res0, res1;
1499 v8u16 vec2, vec3, filt;
1501 mask = LD_SB(&mc_filt_mask_arr[16]);
1503 /* rearranging filter */
1504 filt = LD_UH(filter);
1505 filt0 = (v16u8) __msa_splati_h((v8i16) filt, 0);
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);
1510 SRARI_H2_UH(vec2, vec3, 7);
1511 PCKEV_B2_UB(vec2, vec2, vec3, vec3, res0, res1);
1512 ST4x4_UB(res0, res1, 0, 1, 0, 1, dst, dst_stride);
1515 static void common_hz_2t_4x8_msa(uint8_t *src, int32_t src_stride,
1516 uint8_t *dst, int32_t dst_stride,
1517 const int8_t *filter)
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;
1524 mask = LD_SB(&mc_filt_mask_arr[16]);
1526 /* rearranging filter */
1527 filt = LD_UH(filter);
1528 filt0 = (v16u8) __msa_splati_h((v8i16) filt, 0);
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);
1535 SRARI_H4_UH(vec4, vec5, vec6, vec7, 7);
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);
1543 void ff_put_vp8_bilinear4_h_msa(uint8_t *dst, ptrdiff_t dst_stride,
1544 uint8_t *src, ptrdiff_t src_stride,
1545 int height, int mx, int my)
1547 const int8_t *filter = bilinear_filters_msa[mx - 1];
1550 common_hz_2t_4x4_msa(src, src_stride, dst, dst_stride, filter);
1551 } else if (8 == height) {
1552 common_hz_2t_4x8_msa(src, src_stride, dst, dst_stride, filter);
1556 static void common_hz_2t_8x4_msa(uint8_t *src, int32_t src_stride,
1557 uint8_t *dst, int32_t dst_stride,
1558 const int8_t *filter)
1561 v16i8 src0, src1, src2, src3, mask;
1562 v8u16 vec0, vec1, vec2, vec3, filt;
1564 mask = LD_SB(&mc_filt_mask_arr[0]);
1566 /* rearranging filter */
1567 filt = LD_UH(filter);
1568 filt0 = (v16u8) __msa_splati_h((v8i16) filt, 0);
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);
1575 SRARI_H4_UH(vec0, vec1, vec2, vec3, 7);
1576 PCKEV_B2_SB(vec1, vec0, vec3, vec2, src0, src1);
1577 ST8x4_UB(src0, src1, dst, dst_stride);
1580 static void common_hz_2t_8x8mult_msa(uint8_t *src, int32_t src_stride,
1581 uint8_t *dst, int32_t dst_stride,
1582 const int8_t *filter, int32_t height)
1585 v16i8 src0, src1, src2, src3, mask, out0, out1;
1586 v8u16 vec0, vec1, vec2, vec3, filt;
1588 mask = LD_SB(&mc_filt_mask_arr[0]);
1590 /* rearranging filter */
1591 filt = LD_UH(filter);
1592 filt0 = (v16u8) __msa_splati_h((v8i16) filt, 0);
1594 LD_SB4(src, src_stride, src0, src1, src2, src3);
1595 src += (4 * src_stride);
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);
1601 SRARI_H4_UH(vec0, vec1, vec2, vec3, 7);
1603 LD_SB4(src, src_stride, src0, src1, src2, src3);
1604 src += (4 * src_stride);
1606 PCKEV_B2_SB(vec1, vec0, vec3, vec2, out0, out1);
1607 ST8x4_UB(out0, out1, dst, dst_stride);
1608 dst += (4 * dst_stride);
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);
1614 SRARI_H4_UH(vec0, vec1, vec2, vec3, 7);
1615 PCKEV_B2_SB(vec1, vec0, vec3, vec2, out0, out1);
1616 ST8x4_UB(out0, out1, dst, dst_stride);
1617 dst += (4 * dst_stride);
1620 LD_SB4(src, src_stride, src0, src1, src2, src3);
1621 src += (4 * src_stride);
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);
1627 SRARI_H4_UH(vec0, vec1, vec2, vec3, 7);
1628 LD_SB4(src, src_stride, src0, src1, src2, src3);
1629 src += (4 * src_stride);
1631 PCKEV_B2_SB(vec1, vec0, vec3, vec2, out0, out1);
1632 ST8x4_UB(out0, out1, dst, dst_stride);
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);
1638 SRARI_H4_UH(vec0, vec1, vec2, vec3, 7);
1639 PCKEV_B2_SB(vec1, vec0, vec3, vec2, out0, out1);
1640 ST8x4_UB(out0, out1, dst + 4 * dst_stride, dst_stride);
1644 void ff_put_vp8_bilinear8_h_msa(uint8_t *dst, ptrdiff_t dst_stride,
1645 uint8_t *src, ptrdiff_t src_stride,
1646 int height, int mx, int my)
1648 const int8_t *filter = bilinear_filters_msa[mx - 1];
1651 common_hz_2t_8x4_msa(src, src_stride, dst, dst_stride, filter);
1653 common_hz_2t_8x8mult_msa(src, src_stride, dst, dst_stride, filter,
1658 void ff_put_vp8_bilinear16_h_msa(uint8_t *dst, ptrdiff_t dst_stride,
1659 uint8_t *src, ptrdiff_t src_stride,
1660 int height, int mx, int my)
1663 const int8_t *filter = bilinear_filters_msa[mx - 1];
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;
1668 mask = LD_SB(&mc_filt_mask_arr[0]);
1670 loop_cnt = (height >> 2) - 1;
1672 /* rearranging filter */
1673 filt = LD_UH(filter);
1674 filt0 = (v16u8) __msa_splati_h((v8i16) filt, 0);
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);
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);
1688 SRARI_H4_UH(out0, out1, out2, out3, 7);
1689 SRARI_H4_UH(out4, out5, out6, out7, 7);
1690 PCKEV_ST_SB(out0, out1, dst);
1692 PCKEV_ST_SB(out2, out3, dst);
1694 PCKEV_ST_SB(out4, out5, dst);
1696 PCKEV_ST_SB(out6, out7, dst);
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);
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);
1712 SRARI_H4_UH(out0, out1, out2, out3, 7);
1713 SRARI_H4_UH(out4, out5, out6, out7, 7);
1714 PCKEV_ST_SB(out0, out1, dst);
1716 PCKEV_ST_SB(out2, out3, dst);
1718 PCKEV_ST_SB(out4, out5, dst);
1720 PCKEV_ST_SB(out6, out7, dst);
1725 static void common_vt_2t_4x4_msa(uint8_t *src, int32_t src_stride,
1726 uint8_t *dst, int32_t dst_stride,
1727 const int8_t *filter)
1729 v16i8 src0, src1, src2, src3, src4;
1730 v16i8 src10_r, src32_r, src21_r, src43_r, src2110, src4332;
1735 filt = LD_SH(filter);
1736 filt0 = (v16u8) __msa_splati_h(filt, 0);
1738 LD_SB5(src, src_stride, src0, src1, src2, src3, src4);
1739 src += (5 * src_stride);
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);
1745 SRARI_H2_UH(tmp0, tmp1, 7);
1746 SAT_UH2_UH(tmp0, tmp1, 7);
1747 src2110 = __msa_pckev_b((v16i8) tmp1, (v16i8) tmp0);
1748 ST4x4_UB(src2110, src2110, 0, 1, 2, 3, dst, dst_stride);
1751 static void common_vt_2t_4x8_msa(uint8_t *src, int32_t src_stride,
1752 uint8_t *dst, int32_t dst_stride,
1753 const int8_t *filter)
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;
1762 filt = LD_SH(filter);
1763 filt0 = (v16u8) __msa_splati_h(filt, 0);
1765 LD_SB8(src, src_stride, src0, src1, src2, src3, src4, src5, src6, src7);
1766 src += (8 * src_stride);
1771 ILVR_B4_SB(src1, src0, src2, src1, src3, src2, src4, src3, src10_r, src21_r,
1773 ILVR_B4_SB(src5, src4, src6, src5, src7, src6, src8, src7, src54_r, src65_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);
1779 SRARI_H4_UH(tmp0, tmp1, tmp2, tmp3, 7);
1780 SAT_UH4_UH(tmp0, tmp1, tmp2, tmp3, 7);
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);
1786 void ff_put_vp8_bilinear4_v_msa(uint8_t *dst, ptrdiff_t dst_stride,
1787 uint8_t *src, ptrdiff_t src_stride,
1788 int height, int mx, int my)
1790 const int8_t *filter = bilinear_filters_msa[my - 1];
1793 common_vt_2t_4x4_msa(src, src_stride, dst, dst_stride, filter);
1794 } else if (8 == height) {
1795 common_vt_2t_4x8_msa(src, src_stride, dst, dst_stride, filter);
1799 static void common_vt_2t_8x4_msa(uint8_t *src, int32_t src_stride,
1800 uint8_t *dst, int32_t dst_stride,
1801 const int8_t *filter)
1803 v16u8 src0, src1, src2, src3, src4, vec0, vec1, vec2, vec3, filt0;
1805 v8u16 tmp0, tmp1, tmp2, tmp3;
1808 /* rearranging filter_y */
1809 filt = LD_SH(filter);
1810 filt0 = (v16u8) __msa_splati_h(filt, 0);
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);
1817 SRARI_H4_UH(tmp0, tmp1, tmp2, tmp3, 7);
1818 SAT_UH4_UH(tmp0, tmp1, tmp2, tmp3, 7);
1819 PCKEV_B2_SB(tmp1, tmp0, tmp3, tmp2, out0, out1);
1820 ST8x4_UB(out0, out1, dst, dst_stride);
1823 static void common_vt_2t_8x8mult_msa(uint8_t *src, int32_t src_stride,
1824 uint8_t *dst, int32_t dst_stride,
1825 const int8_t *filter, int32_t height)
1828 v16u8 src0, src1, src2, src3, src4, src5, src6, src7, src8;
1829 v16u8 vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7, filt0;
1831 v8u16 tmp0, tmp1, tmp2, tmp3;
1834 /* rearranging filter_y */
1835 filt = LD_SH(filter);
1836 filt0 = (v16u8) __msa_splati_h(filt, 0);
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);
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);
1851 SRARI_H4_UH(tmp0, tmp1, tmp2, tmp3, 7);
1852 SAT_UH4_UH(tmp0, tmp1, tmp2, tmp3, 7);
1853 PCKEV_B2_SB(tmp1, tmp0, tmp3, tmp2, out0, out1);
1854 ST8x4_UB(out0, out1, dst, dst_stride);
1855 dst += (4 * dst_stride);
1857 DOTP_UB4_UH(vec4, vec5, vec6, vec7, filt0, filt0, filt0, filt0,
1858 tmp0, tmp1, tmp2, tmp3);
1859 SRARI_H4_UH(tmp0, tmp1, tmp2, tmp3, 7);
1860 SAT_UH4_UH(tmp0, tmp1, tmp2, tmp3, 7);
1861 PCKEV_B2_SB(tmp1, tmp0, tmp3, tmp2, out0, out1);
1862 ST8x4_UB(out0, out1, dst, dst_stride);
1863 dst += (4 * dst_stride);
1869 void ff_put_vp8_bilinear8_v_msa(uint8_t *dst, ptrdiff_t dst_stride,
1870 uint8_t *src, ptrdiff_t src_stride,
1871 int height, int mx, int my)
1873 const int8_t *filter = bilinear_filters_msa[my - 1];
1876 common_vt_2t_8x4_msa(src, src_stride, dst, dst_stride, filter);
1878 common_vt_2t_8x8mult_msa(src, src_stride, dst, dst_stride, filter,
1883 void ff_put_vp8_bilinear16_v_msa(uint8_t *dst, ptrdiff_t dst_stride,
1884 uint8_t *src, ptrdiff_t src_stride,
1885 int height, int mx, int my)
1888 const int8_t *filter = bilinear_filters_msa[my - 1];
1889 v16u8 src0, src1, src2, src3, src4;
1890 v16u8 vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7, filt0;
1891 v8u16 tmp0, tmp1, tmp2, tmp3;
1894 /* rearranging filter_y */
1895 filt = LD_SH(filter);
1896 filt0 = (v16u8) __msa_splati_h(filt, 0);
1901 for (loop_cnt = (height >> 2); loop_cnt--;) {
1902 LD_UB4(src, src_stride, src1, src2, src3, src4);
1903 src += (4 * src_stride);
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);
1908 SRARI_H2_UH(tmp0, tmp1, 7);
1909 SAT_UH2_UH(tmp0, tmp1, 7);
1910 PCKEV_ST_SB(tmp0, tmp1, dst);
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);
1916 SRARI_H2_UH(tmp2, tmp3, 7);
1917 SAT_UH2_UH(tmp2, tmp3, 7);
1918 PCKEV_ST_SB(tmp2, tmp3, dst);
1921 DOTP_UB2_UH(vec4, vec5, filt0, filt0, tmp0, tmp1);
1922 SRARI_H2_UH(tmp0, tmp1, 7);
1923 SAT_UH2_UH(tmp0, tmp1, 7);
1924 PCKEV_ST_SB(tmp0, tmp1, dst);
1927 DOTP_UB2_UH(vec6, vec7, filt0, filt0, tmp2, tmp3);
1928 SRARI_H2_UH(tmp2, tmp3, 7);
1929 SAT_UH2_UH(tmp2, tmp3, 7);
1930 PCKEV_ST_SB(tmp2, tmp3, dst);
1937 static void common_hv_2ht_2vt_4x4_msa(uint8_t *src, int32_t src_stride,
1938 uint8_t *dst, int32_t dst_stride,
1939 const int8_t *filter_horiz,
1940 const int8_t *filter_vert)
1942 v16i8 src0, src1, src2, src3, src4, mask;
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;
1946 mask = LD_SB(&mc_filt_mask_arr[16]);
1948 /* rearranging filter */
1949 filt = LD_UH(filter_horiz);
1950 filt_hz = (v16u8) __msa_splati_h((v8i16) filt, 0);
1952 filt = LD_UH(filter_vert);
1953 filt_vt = (v16u8) __msa_splati_h((v8i16) filt, 0);
1955 LD_SB5(src, src_stride, src0, src1, src2, src3, src4);
1956 hz_out0 = HORIZ_2TAP_FILT_UH(src0, src1, mask, filt_hz, 7);
1957 hz_out2 = HORIZ_2TAP_FILT_UH(src2, src3, mask, filt_hz, 7);
1958 hz_out4 = HORIZ_2TAP_FILT_UH(src4, src4, mask, filt_hz, 7);
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);
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);
1964 SRARI_H2_UH(tmp0, tmp1, 7);
1965 SAT_UH2_UH(tmp0, tmp1, 7);
1966 PCKEV_B2_UB(tmp0, tmp0, tmp1, tmp1, res0, res1);
1967 ST4x4_UB(res0, res1, 0, 1, 0, 1, dst, dst_stride);
1970 static void common_hv_2ht_2vt_4x8_msa(uint8_t *src, int32_t src_stride,
1971 uint8_t *dst, int32_t dst_stride,
1972 const int8_t *filter_horiz,
1973 const int8_t *filter_vert)
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;
1981 mask = LD_SB(&mc_filt_mask_arr[16]);
1983 /* rearranging filter */
1984 filt = LD_UH(filter_horiz);
1985 filt_hz = (v16u8) __msa_splati_h((v8i16) filt, 0);
1987 filt = LD_UH(filter_vert);
1988 filt_vt = (v16u8) __msa_splati_h((v8i16) filt, 0);
1990 LD_SB8(src, src_stride, src0, src1, src2, src3, src4, src5, src6, src7);
1991 src += (8 * src_stride);
1994 hz_out0 = HORIZ_2TAP_FILT_UH(src0, src1, mask, filt_hz, 7);
1995 hz_out2 = HORIZ_2TAP_FILT_UH(src2, src3, mask, filt_hz, 7);
1996 hz_out4 = HORIZ_2TAP_FILT_UH(src4, src5, mask, filt_hz, 7);
1997 hz_out6 = HORIZ_2TAP_FILT_UH(src6, src7, mask, filt_hz, 7);
1998 hz_out8 = HORIZ_2TAP_FILT_UH(src8, src8, mask, filt_hz, 7);
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);
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);
2007 SRARI_H4_UH(vec4, vec5, vec6, vec7, 7);
2008 SAT_UH4_UH(vec4, vec5, vec6, vec7, 7);
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);
2016 void ff_put_vp8_bilinear4_hv_msa(uint8_t *dst, ptrdiff_t dst_stride,
2017 uint8_t *src, ptrdiff_t src_stride,
2018 int height, int mx, int my)
2020 const int8_t *filter_horiz = bilinear_filters_msa[mx - 1];
2021 const int8_t *filter_vert = bilinear_filters_msa[my - 1];
2024 common_hv_2ht_2vt_4x4_msa(src, src_stride, dst, dst_stride,
2025 filter_horiz, filter_vert);
2026 } else if (8 == height) {
2027 common_hv_2ht_2vt_4x8_msa(src, src_stride, dst, dst_stride,
2028 filter_horiz, filter_vert);
2032 static void common_hv_2ht_2vt_8x4_msa(uint8_t *src, int32_t src_stride,
2033 uint8_t *dst, int32_t dst_stride,
2034 const int8_t *filter_horiz,
2035 const int8_t *filter_vert)
2037 v16i8 src0, src1, src2, src3, src4, mask, out0, out1;
2038 v16u8 filt_hz, filt_vt, vec0, vec1, vec2, vec3;
2039 v8u16 hz_out0, hz_out1, tmp0, tmp1, tmp2, tmp3;
2042 mask = LD_SB(&mc_filt_mask_arr[0]);
2044 /* rearranging filter */
2045 filt = LD_SH(filter_horiz);
2046 filt_hz = (v16u8) __msa_splati_h(filt, 0);
2048 filt = LD_SH(filter_vert);
2049 filt_vt = (v16u8) __msa_splati_h(filt, 0);
2051 LD_SB5(src, src_stride, src0, src1, src2, src3, src4);
2053 hz_out0 = HORIZ_2TAP_FILT_UH(src0, src0, mask, filt_hz, 7);
2054 hz_out1 = HORIZ_2TAP_FILT_UH(src1, src1, mask, filt_hz, 7);
2055 vec0 = (v16u8) __msa_ilvev_b((v16i8) hz_out1, (v16i8) hz_out0);
2056 tmp0 = __msa_dotp_u_h(vec0, filt_vt);
2058 hz_out0 = HORIZ_2TAP_FILT_UH(src2, src2, mask, filt_hz, 7);
2059 vec1 = (v16u8) __msa_ilvev_b((v16i8) hz_out0, (v16i8) hz_out1);
2060 tmp1 = __msa_dotp_u_h(vec1, filt_vt);
2062 hz_out1 = HORIZ_2TAP_FILT_UH(src3, src3, mask, filt_hz, 7);
2063 vec2 = (v16u8) __msa_ilvev_b((v16i8) hz_out1, (v16i8) hz_out0);
2064 tmp2 = __msa_dotp_u_h(vec2, filt_vt);
2066 hz_out0 = HORIZ_2TAP_FILT_UH(src4, src4, mask, filt_hz, 7);
2067 vec3 = (v16u8) __msa_ilvev_b((v16i8) hz_out0, (v16i8) hz_out1);
2068 tmp3 = __msa_dotp_u_h(vec3, filt_vt);
2070 SRARI_H4_UH(tmp0, tmp1, tmp2, tmp3, 7);
2071 SAT_UH4_UH(tmp0, tmp1, tmp2, tmp3, 7);
2072 PCKEV_B2_SB(tmp1, tmp0, tmp3, tmp2, out0, out1);
2073 ST8x4_UB(out0, out1, dst, dst_stride);
2076 static void common_hv_2ht_2vt_8x8mult_msa(uint8_t *src, int32_t src_stride,
2077 uint8_t *dst, int32_t dst_stride,
2078 const int8_t *filter_horiz,
2079 const int8_t *filter_vert,
2083 v16i8 src0, src1, src2, src3, src4, mask, out0, out1;
2084 v16u8 filt_hz, filt_vt, vec0;
2085 v8u16 hz_out0, hz_out1, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp8;
2088 mask = LD_SB(&mc_filt_mask_arr[0]);
2090 /* rearranging filter */
2091 filt = LD_SH(filter_horiz);
2092 filt_hz = (v16u8) __msa_splati_h(filt, 0);
2094 filt = LD_SH(filter_vert);
2095 filt_vt = (v16u8) __msa_splati_h(filt, 0);
2100 hz_out0 = HORIZ_2TAP_FILT_UH(src0, src0, mask, filt_hz, 7);
2102 for (loop_cnt = (height >> 3); loop_cnt--;) {
2103 LD_SB4(src, src_stride, src1, src2, src3, src4);
2104 src += (4 * src_stride);
2106 hz_out1 = HORIZ_2TAP_FILT_UH(src1, src1, mask, filt_hz, 7);
2107 vec0 = (v16u8) __msa_ilvev_b((v16i8) hz_out1, (v16i8) hz_out0);
2108 tmp1 = __msa_dotp_u_h(vec0, filt_vt);
2110 hz_out0 = HORIZ_2TAP_FILT_UH(src2, src2, mask, filt_hz, 7);
2111 vec0 = (v16u8) __msa_ilvev_b((v16i8) hz_out0, (v16i8) hz_out1);
2112 tmp2 = __msa_dotp_u_h(vec0, filt_vt);
2114 SRARI_H2_UH(tmp1, tmp2, 7);
2115 SAT_UH2_UH(tmp1, tmp2, 7);
2117 hz_out1 = HORIZ_2TAP_FILT_UH(src3, src3, mask, filt_hz, 7);
2118 vec0 = (v16u8) __msa_ilvev_b((v16i8) hz_out1, (v16i8) hz_out0);
2119 tmp3 = __msa_dotp_u_h(vec0, filt_vt);
2121 hz_out0 = HORIZ_2TAP_FILT_UH(src4, src4, mask, filt_hz, 7);
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);
2127 SRARI_H2_UH(tmp3, tmp4, 7);
2128 SAT_UH2_UH(tmp3, tmp4, 7);
2129 PCKEV_B2_SB(tmp2, tmp1, tmp4, tmp3, out0, out1);
2130 ST8x4_UB(out0, out1, dst, dst_stride);
2131 dst += (4 * dst_stride);
2133 hz_out1 = HORIZ_2TAP_FILT_UH(src1, src1, mask, filt_hz, 7);
2134 vec0 = (v16u8) __msa_ilvev_b((v16i8) hz_out1, (v16i8) hz_out0);
2135 tmp5 = __msa_dotp_u_h(vec0, filt_vt);
2137 hz_out0 = HORIZ_2TAP_FILT_UH(src2, src2, mask, filt_hz, 7);
2138 vec0 = (v16u8) __msa_ilvev_b((v16i8) hz_out0, (v16i8) hz_out1);
2139 tmp6 = __msa_dotp_u_h(vec0, filt_vt);
2141 hz_out1 = HORIZ_2TAP_FILT_UH(src3, src3, mask, filt_hz, 7);
2142 vec0 = (v16u8) __msa_ilvev_b((v16i8) hz_out1, (v16i8) hz_out0);
2143 tmp7 = __msa_dotp_u_h(vec0, filt_vt);
2145 hz_out0 = HORIZ_2TAP_FILT_UH(src4, src4, mask, filt_hz, 7);
2146 vec0 = (v16u8) __msa_ilvev_b((v16i8) hz_out0, (v16i8) hz_out1);
2147 tmp8 = __msa_dotp_u_h(vec0, filt_vt);
2149 SRARI_H4_UH(tmp5, tmp6, tmp7, tmp8, 7);
2150 SAT_UH4_UH(tmp5, tmp6, tmp7, tmp8, 7);
2151 PCKEV_B2_SB(tmp6, tmp5, tmp8, tmp7, out0, out1);
2152 ST8x4_UB(out0, out1, dst, dst_stride);
2153 dst += (4 * dst_stride);
2157 void ff_put_vp8_bilinear8_hv_msa(uint8_t *dst, ptrdiff_t dst_stride,
2158 uint8_t *src, ptrdiff_t src_stride,
2159 int height, int mx, int my)
2161 const int8_t *filter_horiz = bilinear_filters_msa[mx - 1];
2162 const int8_t *filter_vert = bilinear_filters_msa[my - 1];
2165 common_hv_2ht_2vt_8x4_msa(src, src_stride, dst, dst_stride,
2166 filter_horiz, filter_vert);
2168 common_hv_2ht_2vt_8x8mult_msa(src, src_stride, dst, dst_stride,
2169 filter_horiz, filter_vert, height);
2173 void ff_put_vp8_bilinear16_hv_msa(uint8_t *dst, ptrdiff_t dst_stride,
2174 uint8_t *src, ptrdiff_t src_stride,
2175 int height, int mx, int my)
2178 const int8_t *filter_horiz = bilinear_filters_msa[mx - 1];
2179 const int8_t *filter_vert = bilinear_filters_msa[my - 1];
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;
2185 mask = LD_SB(&mc_filt_mask_arr[0]);
2187 /* rearranging filter */
2188 filt = LD_SH(filter_horiz);
2189 filt_hz = (v16u8) __msa_splati_h(filt, 0);
2191 filt = LD_SH(filter_vert);
2192 filt_vt = (v16u8) __msa_splati_h(filt, 0);
2194 LD_SB2(src, 8, src0, src1);
2197 hz_out0 = HORIZ_2TAP_FILT_UH(src0, src0, mask, filt_hz, 7);
2198 hz_out2 = HORIZ_2TAP_FILT_UH(src1, src1, mask, filt_hz, 7);
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);
2206 hz_out1 = HORIZ_2TAP_FILT_UH(src0, src0, mask, filt_hz, 7);
2207 hz_out3 = HORIZ_2TAP_FILT_UH(src1, src1, mask, filt_hz, 7);
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);
2210 SRARI_H2_UH(tmp1, tmp2, 7);
2211 SAT_UH2_UH(tmp1, tmp2, 7);
2212 PCKEV_ST_SB(tmp1, tmp2, dst);
2215 hz_out0 = HORIZ_2TAP_FILT_UH(src2, src2, mask, filt_hz, 7);
2216 hz_out2 = HORIZ_2TAP_FILT_UH(src3, src3, mask, filt_hz, 7);
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);
2219 SRARI_H2_UH(tmp1, tmp2, 7);
2220 SAT_UH2_UH(tmp1, tmp2, 7);
2221 PCKEV_ST_SB(tmp1, tmp2, dst);
2224 hz_out1 = HORIZ_2TAP_FILT_UH(src4, src4, mask, filt_hz, 7);
2225 hz_out3 = HORIZ_2TAP_FILT_UH(src5, src5, mask, filt_hz, 7);
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);
2228 SRARI_H2_UH(tmp1, tmp2, 7);
2229 SAT_UH2_UH(tmp1, tmp2, 7);
2230 PCKEV_ST_SB(tmp1, tmp2, dst);
2233 hz_out0 = HORIZ_2TAP_FILT_UH(src6, src6, mask, filt_hz, 7);
2234 hz_out2 = HORIZ_2TAP_FILT_UH(src7, src7, mask, filt_hz, 7);
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);
2237 SRARI_H2_UH(tmp1, tmp2, 7);
2238 SAT_UH2_UH(tmp1, tmp2, 7);
2239 PCKEV_ST_SB(tmp1, tmp2, dst);
2244 void ff_put_vp8_pixels8_msa(uint8_t *dst, ptrdiff_t dst_stride,
2245 uint8_t *src, ptrdiff_t src_stride,
2246 int height, int mx, int my)
2249 uint64_t out0, out1, out2, out3, out4, out5, out6, out7;
2250 v16u8 src0, src1, src2, src3, src4, src5, src6, src7;
2252 if (0 == height % 8) {
2253 for (cnt = height >> 3; cnt--;) {
2254 LD_UB8(src, src_stride,
2255 src0, src1, src2, src3, src4, src5, src6, src7);
2256 src += (8 * src_stride);
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);
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);
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);
2281 SD4(out0, out1, out2, out3, dst, dst_stride);
2282 dst += (4 * dst_stride);
2287 static void copy_16multx8mult_msa(uint8_t *src, int32_t src_stride,
2288 uint8_t *dst, int32_t dst_stride,
2289 int32_t height, int32_t width)
2291 int32_t cnt, loop_cnt;
2292 uint8_t *src_tmp, *dst_tmp;
2293 v16u8 src0, src1, src2, src3, src4, src5, src6, src7;
2295 for (cnt = (width >> 4); cnt--;) {
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);
2304 ST_UB8(src0, src1, src2, src3, src4, src5, src6, src7,
2305 dst_tmp, dst_stride);
2306 dst_tmp += (8 * dst_stride);
2314 void ff_put_vp8_pixels16_msa(uint8_t *dst, ptrdiff_t dst_stride,
2315 uint8_t *src, ptrdiff_t src_stride,
2316 int height, int mx, int my)
2319 v16u8 src0, src1, src2, src3;
2321 if (0 == height % 8) {
2322 copy_16multx8mult_msa(src, src_stride, dst, dst_stride, height, 16);
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);
2328 ST_UB4(src0, src1, src2, src3, dst, dst_stride);
2329 dst += (4 * dst_stride);