ref: 4993158ee5120b05dfee5cba23d45369c97b7df6
dir: /vpx_dsp/mips/vpx_convolve_msa.h/
/* * Copyright (c) 2015 The WebM project authors. All Rights Reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. */ #ifndef VPX_DSP_MIPS_VPX_CONVOLVE_MSA_H_ #define VPX_DSP_MIPS_VPX_CONVOLVE_MSA_H_ #include "vpx_dsp/mips/macros_msa.h" #include "vpx_dsp/vpx_filter.h" extern const uint8_t mc_filt_mask_arr[16 * 3]; #define FILT_8TAP_DPADD_S_H(vec0, vec1, vec2, vec3, \ filt0, filt1, filt2, filt3) ({ \ v8i16 tmp0, tmp1; \ \ tmp0 = __msa_dotp_s_h((v16i8)vec0, (v16i8)filt0); \ tmp0 = __msa_dpadd_s_h(tmp0, (v16i8)vec1, (v16i8)filt1); \ tmp1 = __msa_dotp_s_h((v16i8)vec2, (v16i8)filt2); \ tmp1 = __msa_dpadd_s_h(tmp1, (v16i8)vec3, (v16i8)filt3); \ tmp0 = __msa_adds_s_h(tmp0, tmp1); \ \ tmp0; \ }) #define HORIZ_8TAP_FILT(src0, src1, mask0, mask1, mask2, mask3, \ filt_h0, filt_h1, filt_h2, filt_h3) ({ \ v16i8 vec0_m, vec1_m, vec2_m, vec3_m; \ v8i16 hz_out_m; \ \ VSHF_B4_SB(src0, src1, mask0, mask1, mask2, mask3, \ vec0_m, vec1_m, vec2_m, vec3_m); \ hz_out_m = FILT_8TAP_DPADD_S_H(vec0_m, vec1_m, vec2_m, vec3_m, \ filt_h0, filt_h1, filt_h2, filt_h3); \ \ hz_out_m = __msa_srari_h(hz_out_m, FILTER_BITS); \ hz_out_m = __msa_sat_s_h(hz_out_m, 7); \ \ hz_out_m; \ }) #define HORIZ_8TAP_4WID_4VECS_FILT(src0, src1, src2, src3, \ mask0, mask1, mask2, mask3, \ filt0, filt1, filt2, filt3, \ out0, out1) { \ v16i8 vec0_m, vec1_m, vec2_m, vec3_m, vec4_m, vec5_m, vec6_m, vec7_m; \ v8i16 res0_m, res1_m, res2_m, res3_m; \ \ VSHF_B2_SB(src0, src1, src2, src3, mask0, mask0, vec0_m, vec1_m); \ DOTP_SB2_SH(vec0_m, vec1_m, filt0, filt0, res0_m, res1_m); \ VSHF_B2_SB(src0, src1, src2, src3, mask1, mask1, vec2_m, vec3_m); \ DPADD_SB2_SH(vec2_m, vec3_m, filt1, filt1, res0_m, res1_m); \ VSHF_B2_SB(src0, src1, src2, src3, mask2, mask2, vec4_m, vec5_m); \ DOTP_SB2_SH(vec4_m, vec5_m, filt2, filt2, res2_m, res3_m); \ VSHF_B2_SB(src0, src1, src2, src3, mask3, mask3, vec6_m, vec7_m); \ DPADD_SB2_SH(vec6_m, vec7_m, filt3, filt3, res2_m, res3_m); \ ADDS_SH2_SH(res0_m, res2_m, res1_m, res3_m, out0, out1); \ } #define HORIZ_8TAP_8WID_4VECS_FILT(src0, src1, src2, src3, \ mask0, mask1, mask2, mask3, \ filt0, filt1, filt2, filt3, \ out0, out1, out2, out3) { \ v16i8 vec0_m, vec1_m, vec2_m, vec3_m, vec4_m, vec5_m, vec6_m, vec7_m; \ v8i16 res0_m, res1_m, res2_m, res3_m, res4_m, res5_m, res6_m, res7_m; \ \ VSHF_B2_SB(src0, src0, src1, src1, mask0, mask0, vec0_m, vec1_m); \ VSHF_B2_SB(src2, src2, src3, src3, mask0, mask0, vec2_m, vec3_m); \ DOTP_SB4_SH(vec0_m, vec1_m, vec2_m, vec3_m, filt0, filt0, filt0, filt0, \ res0_m, res1_m, res2_m, res3_m); \ VSHF_B2_SB(src0, src0, src1, src1, mask2, mask2, vec0_m, vec1_m); \ VSHF_B2_SB(src2, src2, src3, src3, mask2, mask2, vec2_m, vec3_m); \ DOTP_SB4_SH(vec0_m, vec1_m, vec2_m, vec3_m, filt2, filt2, filt2, filt2, \ res4_m, res5_m, res6_m, res7_m); \ VSHF_B2_SB(src0, src0, src1, src1, mask1, mask1, vec4_m, vec5_m); \ VSHF_B2_SB(src2, src2, src3, src3, mask1, mask1, vec6_m, vec7_m); \ DPADD_SB4_SH(vec4_m, vec5_m, vec6_m, vec7_m, filt1, filt1, filt1, filt1, \ res0_m, res1_m, res2_m, res3_m); \ VSHF_B2_SB(src0, src0, src1, src1, mask3, mask3, vec4_m, vec5_m); \ VSHF_B2_SB(src2, src2, src3, src3, mask3, mask3, vec6_m, vec7_m); \ DPADD_SB4_SH(vec4_m, vec5_m, vec6_m, vec7_m, filt3, filt3, filt3, filt3, \ res4_m, res5_m, res6_m, res7_m); \ ADDS_SH4_SH(res0_m, res4_m, res1_m, res5_m, res2_m, res6_m, res3_m, \ res7_m, out0, out1, out2, out3); \ } #define PCKEV_XORI128_AVG_ST_UB(in0, in1, dst, pdst) { \ v16u8 tmp_m; \ \ tmp_m = PCKEV_XORI128_UB(in1, in0); \ tmp_m = __msa_aver_u_b(tmp_m, (v16u8)dst); \ ST_UB(tmp_m, (pdst)); \ } #define PCKEV_AVG_ST_UB(in0, in1, dst, pdst) { \ v16u8 tmp_m; \ \ tmp_m = (v16u8)__msa_pckev_b((v16i8)in0, (v16i8)in1); \ tmp_m = __msa_aver_u_b(tmp_m, (v16u8)dst); \ ST_UB(tmp_m, (pdst)); \ } #define PCKEV_AVG_ST8x4_UB(in1, dst0, in2, dst1, in3, dst2, in4, dst3, \ pdst, stride) { \ v16u8 tmp0_m, tmp1_m, tmp2_m, tmp3_m; \ uint8_t *pdst_m = (uint8_t *)(pdst); \ \ PCKEV_B2_UB(in2, in1, in4, in3, tmp0_m, tmp1_m); \ PCKEV_D2_UB(dst1, dst0, dst3, dst2, tmp2_m, tmp3_m); \ AVER_UB2_UB(tmp0_m, tmp2_m, tmp1_m, tmp3_m, tmp0_m, tmp1_m); \ ST8x4_UB(tmp0_m, tmp1_m, pdst_m, stride); \ } #endif /* VPX_DSP_MIPS_VPX_CONVOLVE_MSA_H_ */