Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * Copyright (c) 2015 Shivraj Patil (Shivraj.Patil@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.  
  21. #include "libavcodec/vp9dsp.h"
  22. #include "libavutil/mips/generic_macros_msa.h"
  23. #include "vp9dsp_mips.h"
  24.  
  25. static const uint8_t mc_filt_mask_arr[16 * 3] = {
  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.  
  34. static const int8_t vp9_bilinear_filters_msa[15][2] = {
  35.     {120, 8},
  36.     {112, 16},
  37.     {104, 24},
  38.     {96, 32},
  39.     {88, 40},
  40.     {80, 48},
  41.     {72, 56},
  42.     {64, 64},
  43.     {56, 72},
  44.     {48, 80},
  45.     {40, 88},
  46.     {32, 96},
  47.     {24, 104},
  48.     {16, 112},
  49.     {8, 120}
  50. };
  51.  
  52. #define FILT_8TAP_DPADD_S_H(vec0, vec1, vec2, vec3,             \
  53.                             filt0, filt1, filt2, filt3)         \
  54. ( {                                                             \
  55.     v8i16 tmp0, tmp1;                                           \
  56.                                                                 \
  57.     tmp0 = __msa_dotp_s_h((v16i8) vec0, (v16i8) filt0);         \
  58.     tmp0 = __msa_dpadd_s_h(tmp0, (v16i8) vec1, (v16i8) filt1);  \
  59.     tmp1 = __msa_dotp_s_h((v16i8) vec2, (v16i8) filt2);         \
  60.     tmp1 = __msa_dpadd_s_h(tmp1, (v16i8) vec3, (v16i8) filt3);  \
  61.     tmp0 = __msa_adds_s_h(tmp0, tmp1);                          \
  62.                                                                 \
  63.     tmp0;                                                       \
  64. } )
  65.  
  66. #define HORIZ_8TAP_FILT(src0, src1, mask0, mask1, mask2, mask3,          \
  67.                         filt_h0, filt_h1, filt_h2, filt_h3)              \
  68. ( {                                                                      \
  69.     v16i8 vec0_m, vec1_m, vec2_m, vec3_m;                                \
  70.     v8i16 hz_out_m;                                                      \
  71.                                                                          \
  72.     VSHF_B4_SB(src0, src1, mask0, mask1, mask2, mask3,                   \
  73.                vec0_m, vec1_m, vec2_m, vec3_m);                          \
  74.     hz_out_m = FILT_8TAP_DPADD_S_H(vec0_m, vec1_m, vec2_m, vec3_m,       \
  75.                                    filt_h0, filt_h1, filt_h2, filt_h3);  \
  76.                                                                          \
  77.     hz_out_m = __msa_srari_h(hz_out_m, 7);                               \
  78.     hz_out_m = __msa_sat_s_h(hz_out_m, 7);                               \
  79.                                                                          \
  80.     hz_out_m;                                                            \
  81. } )
  82.  
  83. #define HORIZ_8TAP_4WID_4VECS_FILT(src0, src1, src2, src3,                  \
  84.                                    mask0, mask1, mask2, mask3,              \
  85.                                    filt0, filt1, filt2, filt3,              \
  86.                                    out0, out1)                              \
  87. {                                                                           \
  88.     v16i8 vec0_m, vec1_m, vec2_m, vec3_m,  vec4_m, vec5_m, vec6_m, vec7_m;  \
  89.     v8i16 res0_m, res1_m, res2_m, res3_m;                                   \
  90.                                                                             \
  91.     VSHF_B2_SB(src0, src1, src2, src3, mask0, mask0, vec0_m, vec1_m);       \
  92.     DOTP_SB2_SH(vec0_m, vec1_m, filt0, filt0, res0_m, res1_m);              \
  93.     VSHF_B2_SB(src0, src1, src2, src3, mask1, mask1, vec2_m, vec3_m);       \
  94.     DPADD_SB2_SH(vec2_m, vec3_m, filt1, filt1, res0_m, res1_m);             \
  95.     VSHF_B2_SB(src0, src1, src2, src3, mask2, mask2, vec4_m, vec5_m);       \
  96.     DOTP_SB2_SH(vec4_m, vec5_m, filt2, filt2, res2_m, res3_m);              \
  97.     VSHF_B2_SB(src0, src1, src2, src3, mask3, mask3, vec6_m, vec7_m);       \
  98.     DPADD_SB2_SH(vec6_m, vec7_m, filt3, filt3, res2_m, res3_m);             \
  99.     ADDS_SH2_SH(res0_m, res2_m, res1_m, res3_m, out0, out1);                \
  100. }
  101.  
  102. #define HORIZ_8TAP_8WID_4VECS_FILT(src0, src1, src2, src3,                    \
  103.                                    mask0, mask1, mask2, mask3,                \
  104.                                    filt0, filt1, filt2, filt3,                \
  105.                                    out0, out1, out2, out3)                    \
  106. {                                                                             \
  107.     v16i8 vec0_m, vec1_m, vec2_m, vec3_m, vec4_m, vec5_m, vec6_m, vec7_m;     \
  108.     v8i16 res0_m, res1_m, res2_m, res3_m, res4_m, res5_m, res6_m, res7_m;     \
  109.                                                                               \
  110.     VSHF_B2_SB(src0, src0, src1, src1, mask0, mask0, vec0_m, vec1_m);         \
  111.     VSHF_B2_SB(src2, src2, src3, src3, mask0, mask0, vec2_m, vec3_m);         \
  112.     DOTP_SB4_SH(vec0_m, vec1_m, vec2_m, vec3_m, filt0, filt0, filt0, filt0,   \
  113.                 res0_m, res1_m, res2_m, res3_m);                              \
  114.     VSHF_B2_SB(src0, src0, src1, src1, mask2, mask2, vec0_m, vec1_m);         \
  115.     VSHF_B2_SB(src2, src2, src3, src3, mask2, mask2, vec2_m, vec3_m);         \
  116.     DOTP_SB4_SH(vec0_m, vec1_m, vec2_m, vec3_m, filt2, filt2, filt2, filt2,   \
  117.                 res4_m, res5_m, res6_m, res7_m);                              \
  118.     VSHF_B2_SB(src0, src0, src1, src1, mask1, mask1, vec4_m, vec5_m);         \
  119.     VSHF_B2_SB(src2, src2, src3, src3, mask1, mask1, vec6_m, vec7_m);         \
  120.     DPADD_SB4_SH(vec4_m, vec5_m, vec6_m, vec7_m, filt1, filt1, filt1, filt1,  \
  121.                  res0_m, res1_m, res2_m, res3_m);                             \
  122.     VSHF_B2_SB(src0, src0, src1, src1, mask3, mask3, vec4_m, vec5_m);         \
  123.     VSHF_B2_SB(src2, src2, src3, src3, mask3, mask3, vec6_m, vec7_m);         \
  124.     DPADD_SB4_SH(vec4_m, vec5_m, vec6_m, vec7_m, filt3, filt3, filt3, filt3,  \
  125.                  res4_m, res5_m, res6_m, res7_m);                             \
  126.     ADDS_SH4_SH(res0_m, res4_m, res1_m, res5_m, res2_m, res6_m, res3_m,       \
  127.                 res7_m, out0, out1, out2, out3);                              \
  128. }
  129.  
  130. #define PCKEV_XORI128_AVG_ST_UB(in0, in1, dst, pdst)  \
  131. {                                                     \
  132.     v16u8 tmp_m;                                      \
  133.                                                       \
  134.     tmp_m = PCKEV_XORI128_UB(in1, in0);               \
  135.     tmp_m = __msa_aver_u_b(tmp_m, (v16u8) dst);       \
  136.     ST_UB(tmp_m, (pdst));                             \
  137. }
  138.  
  139. #define PCKEV_AVG_ST_UB(in0, in1, dst, pdst)                  \
  140. {                                                             \
  141.     v16u8 tmp_m;                                              \
  142.                                                               \
  143.     tmp_m = (v16u8) __msa_pckev_b((v16i8) in0, (v16i8) in1);  \
  144.     tmp_m = __msa_aver_u_b(tmp_m, (v16u8) dst);               \
  145.     ST_UB(tmp_m, (pdst));                                     \
  146. }
  147.  
  148. #define PCKEV_AVG_ST8x4_UB(in1, dst0, in2, dst1, in3, dst2, in4, dst3,  \
  149.                            pdst, stride)                                \
  150. {                                                                       \
  151.     v16u8 tmp0_m, tmp1_m, tmp2_m, tmp3_m;                               \
  152.     uint8_t *pdst_m = (uint8_t *) (pdst);                               \
  153.                                                                         \
  154.     PCKEV_B2_UB(in2, in1, in4, in3, tmp0_m, tmp1_m);                    \
  155.     PCKEV_D2_UB(dst1, dst0, dst3, dst2, tmp2_m, tmp3_m);                \
  156.     AVER_UB2_UB(tmp0_m, tmp2_m, tmp1_m, tmp3_m, tmp0_m, tmp1_m);        \
  157.     ST8x4_UB(tmp0_m, tmp1_m, pdst_m, stride);                           \
  158. }
  159.  
  160. static void common_hz_8t_4x4_msa(const uint8_t *src, int32_t src_stride,
  161.                                  uint8_t *dst, int32_t dst_stride,
  162.                                  const int8_t *filter)
  163. {
  164.     v16u8 mask0, mask1, mask2, mask3, out;
  165.     v16i8 src0, src1, src2, src3, filt0, filt1, filt2, filt3;
  166.     v8i16 filt, out0, out1;
  167.  
  168.     mask0 = LD_UB(&mc_filt_mask_arr[16]);
  169.     src -= 3;
  170.  
  171.     /* rearranging filter */
  172.     filt = LD_SH(filter);
  173.     SPLATI_H4_SB(filt, 0, 1, 2, 3, filt0, filt1, filt2, filt3);
  174.  
  175.     mask1 = mask0 + 2;
  176.     mask2 = mask0 + 4;
  177.     mask3 = mask0 + 6;
  178.  
  179.     LD_SB4(src, src_stride, src0, src1, src2, src3);
  180.     XORI_B4_128_SB(src0, src1, src2, src3);
  181.     HORIZ_8TAP_4WID_4VECS_FILT(src0, src1, src2, src3, mask0, mask1, mask2,
  182.                                mask3, filt0, filt1, filt2, filt3, out0, out1);
  183.     SRARI_H2_SH(out0, out1, 7);
  184.     SAT_SH2_SH(out0, out1, 7);
  185.     out = PCKEV_XORI128_UB(out0, out1);
  186.     ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
  187. }
  188.  
  189. static void common_hz_8t_4x8_msa(const uint8_t *src, int32_t src_stride,
  190.                                  uint8_t *dst, int32_t dst_stride,
  191.                                  const int8_t *filter)
  192. {
  193.     v16i8 filt0, filt1, filt2, filt3;
  194.     v16i8 src0, src1, src2, src3;
  195.     v16u8 mask0, mask1, mask2, mask3, out;
  196.     v8i16 filt, out0, out1, out2, out3;
  197.  
  198.     mask0 = LD_UB(&mc_filt_mask_arr[16]);
  199.     src -= 3;
  200.  
  201.     /* rearranging filter */
  202.     filt = LD_SH(filter);
  203.     SPLATI_H4_SB(filt, 0, 1, 2, 3, filt0, filt1, filt2, filt3);
  204.  
  205.     mask1 = mask0 + 2;
  206.     mask2 = mask0 + 4;
  207.     mask3 = mask0 + 6;
  208.  
  209.     LD_SB4(src, src_stride, src0, src1, src2, src3);
  210.     XORI_B4_128_SB(src0, src1, src2, src3);
  211.     src += (4 * src_stride);
  212.     HORIZ_8TAP_4WID_4VECS_FILT(src0, src1, src2, src3, mask0, mask1, mask2,
  213.                                mask3, filt0, filt1, filt2, filt3, out0, out1);
  214.     LD_SB4(src, src_stride, src0, src1, src2, src3);
  215.     XORI_B4_128_SB(src0, src1, src2, src3);
  216.     HORIZ_8TAP_4WID_4VECS_FILT(src0, src1, src2, src3, mask0, mask1, mask2,
  217.                                mask3, filt0, filt1, filt2, filt3, out2, out3);
  218.     SRARI_H4_SH(out0, out1, out2, out3, 7);
  219.     SAT_SH4_SH(out0, out1, out2, out3, 7);
  220.     out = PCKEV_XORI128_UB(out0, out1);
  221.     ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
  222.     dst += (4 * dst_stride);
  223.     out = PCKEV_XORI128_UB(out2, out3);
  224.     ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
  225. }
  226.  
  227. static void common_hz_8t_4x16_msa(const uint8_t *src, int32_t src_stride,
  228.                                   uint8_t *dst, int32_t dst_stride,
  229.                                   const int8_t *filter)
  230. {
  231.     v16u8 mask0, mask1, mask2, mask3, out;
  232.     v16i8 src0, src1, src2, src3, filt0, filt1, filt2, filt3;
  233.     v8i16 filt, out0, out1, out2, out3;
  234.  
  235.     mask0 = LD_UB(&mc_filt_mask_arr[16]);
  236.     src -= 3;
  237.  
  238.     /* rearranging filter */
  239.     filt = LD_SH(filter);
  240.     SPLATI_H4_SB(filt, 0, 1, 2, 3, filt0, filt1, filt2, filt3);
  241.  
  242.     mask1 = mask0 + 2;
  243.     mask2 = mask0 + 4;
  244.     mask3 = mask0 + 6;
  245.  
  246.     LD_SB4(src, src_stride, src0, src1, src2, src3);
  247.     XORI_B4_128_SB(src0, src1, src2, src3);
  248.     src += (4 * src_stride);
  249.     HORIZ_8TAP_4WID_4VECS_FILT(src0, src1, src2, src3, mask0, mask1, mask2,
  250.                                mask3, filt0, filt1, filt2, filt3, out0, out1);
  251.     LD_SB4(src, src_stride, src0, src1, src2, src3);
  252.     XORI_B4_128_SB(src0, src1, src2, src3);
  253.     src += (4 * src_stride);
  254.     HORIZ_8TAP_4WID_4VECS_FILT(src0, src1, src2, src3, mask0, mask1, mask2,
  255.                                mask3, filt0, filt1, filt2, filt3, out2, out3);
  256.     SRARI_H4_SH(out0, out1, out2, out3, 7);
  257.     SAT_SH4_SH(out0, out1, out2, out3, 7);
  258.     out = PCKEV_XORI128_UB(out0, out1);
  259.     ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
  260.     dst += (4 * dst_stride);
  261.     out = PCKEV_XORI128_UB(out2, out3);
  262.     ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
  263.     dst += (4 * dst_stride);
  264.  
  265.     LD_SB4(src, src_stride, src0, src1, src2, src3);
  266.     XORI_B4_128_SB(src0, src1, src2, src3);
  267.     src += (4 * src_stride);
  268.     HORIZ_8TAP_4WID_4VECS_FILT(src0, src1, src2, src3, mask0, mask1, mask2,
  269.                                mask3, filt0, filt1, filt2, filt3, out0, out1);
  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_8TAP_4WID_4VECS_FILT(src0, src1, src2, src3, mask0, mask1, mask2,
  274.                                mask3, filt0, filt1, filt2, filt3, out2, out3);
  275.  
  276.     SRARI_H4_SH(out0, out1, out2, out3, 7);
  277.     SAT_SH4_SH(out0, out1, out2, out3, 7);
  278.     out = PCKEV_XORI128_UB(out0, out1);
  279.     ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
  280.     dst += (4 * dst_stride);
  281.     out = PCKEV_XORI128_UB(out2, out3);
  282.     ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
  283. }
  284.  
  285. static void common_hz_8t_4w_msa(const uint8_t *src, int32_t src_stride,
  286.                                 uint8_t *dst, int32_t dst_stride,
  287.                                 const int8_t *filter, int32_t height)
  288. {
  289.     if (4 == height) {
  290.         common_hz_8t_4x4_msa(src, src_stride, dst, dst_stride, filter);
  291.     } else if (8 == height) {
  292.         common_hz_8t_4x8_msa(src, src_stride, dst, dst_stride, filter);
  293.     } else if (16 == height) {
  294.         common_hz_8t_4x16_msa(src, src_stride, dst, dst_stride, filter);
  295.     }
  296. }
  297.  
  298. static void common_hz_8t_8x4_msa(const uint8_t *src, int32_t src_stride,
  299.                                  uint8_t *dst, int32_t dst_stride,
  300.                                  const int8_t *filter)
  301. {
  302.     v16i8 src0, src1, src2, src3, filt0, filt1, filt2, filt3;
  303.     v16u8 mask0, mask1, mask2, mask3, tmp0, tmp1;
  304.     v8i16 filt, out0, out1, out2, out3;
  305.  
  306.     mask0 = LD_UB(&mc_filt_mask_arr[0]);
  307.     src -= 3;
  308.  
  309.     /* rearranging filter */
  310.     filt = LD_SH(filter);
  311.     SPLATI_H4_SB(filt, 0, 1, 2, 3, filt0, filt1, filt2, filt3);
  312.  
  313.     mask1 = mask0 + 2;
  314.     mask2 = mask0 + 4;
  315.     mask3 = mask0 + 6;
  316.  
  317.     LD_SB4(src, src_stride, src0, src1, src2, src3);
  318.     XORI_B4_128_SB(src0, src1, src2, src3);
  319.     HORIZ_8TAP_8WID_4VECS_FILT(src0, src1, src2, src3, mask0, mask1, mask2,
  320.                                mask3, filt0, filt1, filt2, filt3, out0, out1,
  321.                                out2, out3);
  322.     SRARI_H4_SH(out0, out1, out2, out3, 7);
  323.     SAT_SH4_SH(out0, out1, out2, out3, 7);
  324.     tmp0 = PCKEV_XORI128_UB(out0, out1);
  325.     tmp1 = PCKEV_XORI128_UB(out2, out3);
  326.     ST8x4_UB(tmp0, tmp1, dst, dst_stride);
  327. }
  328.  
  329. static void common_hz_8t_8x8mult_msa(const uint8_t *src, int32_t src_stride,
  330.                                      uint8_t *dst, int32_t dst_stride,
  331.                                      const int8_t *filter, int32_t height)
  332. {
  333.     uint32_t loop_cnt;
  334.     v16i8 src0, src1, src2, src3, filt0, filt1, filt2, filt3;
  335.     v16u8 mask0, mask1, mask2, mask3, tmp0, tmp1;
  336.     v8i16 filt, out0, out1, out2, out3;
  337.  
  338.     mask0 = LD_UB(&mc_filt_mask_arr[0]);
  339.     src -= 3;
  340.  
  341.     /* rearranging filter */
  342.     filt = LD_SH(filter);
  343.     SPLATI_H4_SB(filt, 0, 1, 2, 3, filt0, filt1, filt2, filt3);
  344.  
  345.     mask1 = mask0 + 2;
  346.     mask2 = mask0 + 4;
  347.     mask3 = mask0 + 6;
  348.  
  349.     for (loop_cnt = (height >> 2); loop_cnt--;) {
  350.         LD_SB4(src, src_stride, src0, src1, src2, src3);
  351.         XORI_B4_128_SB(src0, src1, src2, src3);
  352.         src += (4 * src_stride);
  353.         HORIZ_8TAP_8WID_4VECS_FILT(src0, src1, src2, src3, mask0, mask1, mask2,
  354.                                    mask3, filt0, filt1, filt2, filt3, out0,
  355.                                    out1, out2, out3);
  356.         SRARI_H4_SH(out0, out1, out2, out3, 7);
  357.         SAT_SH4_SH(out0, out1, out2, out3, 7);
  358.         tmp0 = PCKEV_XORI128_UB(out0, out1);
  359.         tmp1 = PCKEV_XORI128_UB(out2, out3);
  360.         ST8x4_UB(tmp0, tmp1, dst, dst_stride);
  361.         dst += (4 * dst_stride);
  362.     }
  363. }
  364.  
  365. static void common_hz_8t_8w_msa(const uint8_t *src, int32_t src_stride,
  366.                                 uint8_t *dst, int32_t dst_stride,
  367.                                 const int8_t *filter, int32_t height)
  368. {
  369.     if (4 == height) {
  370.         common_hz_8t_8x4_msa(src, src_stride, dst, dst_stride, filter);
  371.     } else {
  372.         common_hz_8t_8x8mult_msa(src, src_stride, dst, dst_stride, filter,
  373.                                  height);
  374.     }
  375. }
  376.  
  377. static void common_hz_8t_16w_msa(const uint8_t *src, int32_t src_stride,
  378.                                  uint8_t *dst, int32_t dst_stride,
  379.                                  const int8_t *filter, int32_t height)
  380. {
  381.     uint32_t loop_cnt;
  382.     v16i8 src0, src1, src2, src3, filt0, filt1, filt2, filt3;
  383.     v16u8 mask0, mask1, mask2, mask3, out;
  384.     v8i16 filt, out0, out1, out2, out3;
  385.  
  386.     mask0 = LD_UB(&mc_filt_mask_arr[0]);
  387.     src -= 3;
  388.  
  389.     /* rearranging filter */
  390.     filt = LD_SH(filter);
  391.     SPLATI_H4_SB(filt, 0, 1, 2, 3, filt0, filt1, filt2, filt3);
  392.  
  393.     mask1 = mask0 + 2;
  394.     mask2 = mask0 + 4;
  395.     mask3 = mask0 + 6;
  396.  
  397.     for (loop_cnt = (height >> 1); loop_cnt--;) {
  398.         LD_SB2(src, src_stride, src0, src2);
  399.         LD_SB2(src + 8, src_stride, src1, src3);
  400.         XORI_B4_128_SB(src0, src1, src2, src3);
  401.         src += (2 * src_stride);
  402.         HORIZ_8TAP_8WID_4VECS_FILT(src0, src1, src2, src3, mask0, mask1, mask2,
  403.                                    mask3, filt0, filt1, filt2, filt3, out0,
  404.                                    out1, out2, out3);
  405.         SRARI_H4_SH(out0, out1, out2, out3, 7);
  406.         SAT_SH4_SH(out0, out1, out2, out3, 7);
  407.         out = PCKEV_XORI128_UB(out0, out1);
  408.         ST_UB(out, dst);
  409.         dst += dst_stride;
  410.         out = PCKEV_XORI128_UB(out2, out3);
  411.         ST_UB(out, dst);
  412.         dst += dst_stride;
  413.     }
  414. }
  415.  
  416. static void common_hz_8t_32w_msa(const uint8_t *src, int32_t src_stride,
  417.                                  uint8_t *dst, int32_t dst_stride,
  418.                                  const int8_t *filter, int32_t height)
  419. {
  420.     uint32_t loop_cnt;
  421.     v16i8 src0, src1, src2, src3, filt0, filt1, filt2, filt3;
  422.     v16u8 mask0, mask1, mask2, mask3, out;
  423.     v8i16 filt, out0, out1, out2, out3;
  424.  
  425.     mask0 = LD_UB(&mc_filt_mask_arr[0]);
  426.     src -= 3;
  427.  
  428.     /* rearranging filter */
  429.     filt = LD_SH(filter);
  430.     SPLATI_H4_SB(filt, 0, 1, 2, 3, filt0, filt1, filt2, filt3);
  431.  
  432.     mask1 = mask0 + 2;
  433.     mask2 = mask0 + 4;
  434.     mask3 = mask0 + 6;
  435.  
  436.     for (loop_cnt = (height >> 1); loop_cnt--;) {
  437.         src0 = LD_SB(src);
  438.         src2 = LD_SB(src + 16);
  439.         src3 = LD_SB(src + 24);
  440.         src1 = __msa_sldi_b(src2, src0, 8);
  441.         src += src_stride;
  442.         XORI_B4_128_SB(src0, src1, src2, src3);
  443.         HORIZ_8TAP_8WID_4VECS_FILT(src0, src1, src2, src3, mask0, mask1, mask2,
  444.                                    mask3, filt0, filt1, filt2, filt3, out0,
  445.                                    out1, out2, out3);
  446.         SRARI_H4_SH(out0, out1, out2, out3, 7);
  447.         SAT_SH4_SH(out0, out1, out2, out3, 7);
  448.  
  449.         src0 = LD_SB(src);
  450.         src2 = LD_SB(src + 16);
  451.         src3 = LD_SB(src + 24);
  452.         src1 = __msa_sldi_b(src2, src0, 8);
  453.         src += src_stride;
  454.  
  455.         out = PCKEV_XORI128_UB(out0, out1);
  456.         ST_UB(out, dst);
  457.         out = PCKEV_XORI128_UB(out2, out3);
  458.         ST_UB(out, dst + 16);
  459.         dst += dst_stride;
  460.  
  461.         XORI_B4_128_SB(src0, src1, src2, src3);
  462.         HORIZ_8TAP_8WID_4VECS_FILT(src0, src1, src2, src3, mask0, mask1, mask2,
  463.                                    mask3, filt0, filt1, filt2, filt3, out0,
  464.                                    out1, out2, out3);
  465.         SRARI_H4_SH(out0, out1, out2, out3, 7);
  466.         SAT_SH4_SH(out0, out1, out2, out3, 7);
  467.         out = PCKEV_XORI128_UB(out0, out1);
  468.         ST_UB(out, dst);
  469.         out = PCKEV_XORI128_UB(out2, out3);
  470.         ST_UB(out, dst + 16);
  471.         dst += dst_stride;
  472.     }
  473. }
  474.  
  475. static void common_hz_8t_64w_msa(const uint8_t *src, int32_t src_stride,
  476.                                  uint8_t *dst, int32_t dst_stride,
  477.                                  const int8_t *filter, int32_t height)
  478. {
  479.     int32_t loop_cnt;
  480.     v16i8 src0, src1, src2, src3, filt0, filt1, filt2, filt3;
  481.     v16u8 mask0, mask1, mask2, mask3, out;
  482.     v8i16 filt, out0, out1, out2, out3;
  483.  
  484.     mask0 = LD_UB(&mc_filt_mask_arr[0]);
  485.     src -= 3;
  486.  
  487.     /* rearranging filter */
  488.     filt = LD_SH(filter);
  489.     SPLATI_H4_SB(filt, 0, 1, 2, 3, filt0, filt1, filt2, filt3);
  490.  
  491.     mask1 = mask0 + 2;
  492.     mask2 = mask0 + 4;
  493.     mask3 = mask0 + 6;
  494.  
  495.     for (loop_cnt = height; loop_cnt--;) {
  496.         src0 = LD_SB(src);
  497.         src2 = LD_SB(src + 16);
  498.         src3 = LD_SB(src + 24);
  499.         src1 = __msa_sldi_b(src2, src0, 8);
  500.  
  501.         XORI_B4_128_SB(src0, src1, src2, src3);
  502.         HORIZ_8TAP_8WID_4VECS_FILT(src0, src1, src2, src3, mask0, mask1,
  503.                                    mask2, mask3, filt0, filt1, filt2, filt3,
  504.                                    out0, out1, out2, out3);
  505.         SRARI_H4_SH(out0, out1, out2, out3, 7);
  506.         SAT_SH4_SH(out0, out1, out2, out3, 7);
  507.         out = PCKEV_XORI128_UB(out0, out1);
  508.         ST_UB(out, dst);
  509.         out = PCKEV_XORI128_UB(out2, out3);
  510.         ST_UB(out, dst + 16);
  511.  
  512.         src0 = LD_SB(src + 32);
  513.         src2 = LD_SB(src + 48);
  514.         src3 = LD_SB(src + 56);
  515.         src1 = __msa_sldi_b(src2, src0, 8);
  516.         src += src_stride;
  517.  
  518.         XORI_B4_128_SB(src0, src1, src2, src3);
  519.         HORIZ_8TAP_8WID_4VECS_FILT(src0, src1, src2, src3, mask0, mask1,
  520.                                    mask2, mask3, filt0, filt1, filt2, filt3,
  521.                                    out0, out1, out2, out3);
  522.         SRARI_H4_SH(out0, out1, out2, out3, 7);
  523.         SAT_SH4_SH(out0, out1, out2, out3, 7);
  524.         out = PCKEV_XORI128_UB(out0, out1);
  525.         ST_UB(out, dst + 32);
  526.         out = PCKEV_XORI128_UB(out2, out3);
  527.         ST_UB(out, dst + 48);
  528.         dst += dst_stride;
  529.     }
  530. }
  531.  
  532. static void common_vt_8t_4w_msa(const uint8_t *src, int32_t src_stride,
  533.                                 uint8_t *dst, int32_t dst_stride,
  534.                                 const int8_t *filter, int32_t height)
  535. {
  536.     uint32_t loop_cnt;
  537.     v16i8 src0, src1, src2, src3, src4, src5, src6, src7, src8, src9, src10;
  538.     v16i8 src10_r, src32_r, src54_r, src76_r, src98_r, src21_r, src43_r;
  539.     v16i8 src65_r, src87_r, src109_r, src2110, src4332, src6554, src8776;
  540.     v16i8 src10998, filt0, filt1, filt2, filt3;
  541.     v16u8 out;
  542.     v8i16 filt, out10, out32;
  543.  
  544.     src -= (3 * src_stride);
  545.  
  546.     filt = LD_SH(filter);
  547.     SPLATI_H4_SB(filt, 0, 1, 2, 3, filt0, filt1, filt2, filt3);
  548.  
  549.     LD_SB7(src, src_stride, src0, src1, src2, src3, src4, src5, src6);
  550.     src += (7 * src_stride);
  551.  
  552.     ILVR_B4_SB(src1, src0, src3, src2, src5, src4, src2, src1, src10_r, src32_r,
  553.                src54_r, src21_r);
  554.     ILVR_B2_SB(src4, src3, src6, src5, src43_r, src65_r);
  555.     ILVR_D3_SB(src21_r, src10_r, src43_r, src32_r, src65_r, src54_r, src2110,
  556.                src4332, src6554);
  557.     XORI_B3_128_SB(src2110, src4332, src6554);
  558.  
  559.     for (loop_cnt = (height >> 2); loop_cnt--;) {
  560.         LD_SB4(src, src_stride, src7, src8, src9, src10);
  561.         src += (4 * src_stride);
  562.  
  563.         ILVR_B4_SB(src7, src6, src8, src7, src9, src8, src10, src9, src76_r,
  564.                    src87_r, src98_r, src109_r);
  565.         ILVR_D2_SB(src87_r, src76_r, src109_r, src98_r, src8776, src10998);
  566.         XORI_B2_128_SB(src8776, src10998);
  567.         out10 = FILT_8TAP_DPADD_S_H(src2110, src4332, src6554, src8776, filt0,
  568.                                     filt1, filt2, filt3);
  569.         out32 = FILT_8TAP_DPADD_S_H(src4332, src6554, src8776, src10998, filt0,
  570.                                     filt1, filt2, filt3);
  571.         SRARI_H2_SH(out10, out32, 7);
  572.         SAT_SH2_SH(out10, out32, 7);
  573.         out = PCKEV_XORI128_UB(out10, out32);
  574.         ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
  575.         dst += (4 * dst_stride);
  576.  
  577.         src2110 = src6554;
  578.         src4332 = src8776;
  579.         src6554 = src10998;
  580.         src6 = src10;
  581.     }
  582. }
  583.  
  584. static void common_vt_8t_8w_msa(const uint8_t *src, int32_t src_stride,
  585.                                 uint8_t *dst, int32_t dst_stride,
  586.                                 const int8_t *filter, int32_t height)
  587. {
  588.     uint32_t loop_cnt;
  589.     v16i8 src0, src1, src2, src3, src4, src5, src6, src7, src8, src9, src10;
  590.     v16i8 src10_r, src32_r, src54_r, src76_r, src98_r, src21_r, src43_r;
  591.     v16i8 src65_r, src87_r, src109_r, filt0, filt1, filt2, filt3;
  592.     v16u8 tmp0, tmp1;
  593.     v8i16 filt, out0_r, out1_r, out2_r, out3_r;
  594.  
  595.     src -= (3 * src_stride);
  596.  
  597.     filt = LD_SH(filter);
  598.     SPLATI_H4_SB(filt, 0, 1, 2, 3, filt0, filt1, filt2, filt3);
  599.  
  600.     LD_SB7(src, src_stride, src0, src1, src2, src3, src4, src5, src6);
  601.     XORI_B7_128_SB(src0, src1, src2, src3, src4, src5, src6);
  602.     src += (7 * src_stride);
  603.     ILVR_B4_SB(src1, src0, src3, src2, src5, src4, src2, src1, src10_r, src32_r,
  604.                src54_r, src21_r);
  605.     ILVR_B2_SB(src4, src3, src6, src5, src43_r, src65_r);
  606.  
  607.     for (loop_cnt = (height >> 2); loop_cnt--;) {
  608.         LD_SB4(src, src_stride, src7, src8, src9, src10);
  609.         XORI_B4_128_SB(src7, src8, src9, src10);
  610.         src += (4 * src_stride);
  611.  
  612.         ILVR_B4_SB(src7, src6, src8, src7, src9, src8, src10, src9, src76_r,
  613.                    src87_r, src98_r, src109_r);
  614.         out0_r = FILT_8TAP_DPADD_S_H(src10_r, src32_r, src54_r, src76_r, filt0,
  615.                                      filt1, filt2, filt3);
  616.         out1_r = FILT_8TAP_DPADD_S_H(src21_r, src43_r, src65_r, src87_r, filt0,
  617.                                      filt1, filt2, filt3);
  618.         out2_r = FILT_8TAP_DPADD_S_H(src32_r, src54_r, src76_r, src98_r, filt0,
  619.                                      filt1, filt2, filt3);
  620.         out3_r = FILT_8TAP_DPADD_S_H(src43_r, src65_r, src87_r, src109_r, filt0,
  621.                                      filt1, filt2, filt3);
  622.         SRARI_H4_SH(out0_r, out1_r, out2_r, out3_r, 7);
  623.         SAT_SH4_SH(out0_r, out1_r, out2_r, out3_r, 7);
  624.         tmp0 = PCKEV_XORI128_UB(out0_r, out1_r);
  625.         tmp1 = PCKEV_XORI128_UB(out2_r, out3_r);
  626.         ST8x4_UB(tmp0, tmp1, dst, dst_stride);
  627.         dst += (4 * dst_stride);
  628.  
  629.         src10_r = src54_r;
  630.         src32_r = src76_r;
  631.         src54_r = src98_r;
  632.         src21_r = src65_r;
  633.         src43_r = src87_r;
  634.         src65_r = src109_r;
  635.         src6 = src10;
  636.     }
  637. }
  638.  
  639. static void common_vt_8t_16w_msa(const uint8_t *src, int32_t src_stride,
  640.                                  uint8_t *dst, int32_t dst_stride,
  641.                                  const int8_t *filter, int32_t height)
  642. {
  643.     uint32_t loop_cnt;
  644.     v16i8 src0, src1, src2, src3, src4, src5, src6, src7, src8, src9, src10;
  645.     v16i8 filt0, filt1, filt2, filt3;
  646.     v16i8 src10_r, src32_r, src54_r, src76_r, src98_r, src21_r, src43_r;
  647.     v16i8 src65_r, src87_r, src109_r, src10_l, src32_l, src54_l, src76_l;
  648.     v16i8 src98_l, src21_l, src43_l, src65_l, src87_l, src109_l;
  649.     v16u8 tmp0, tmp1, tmp2, tmp3;
  650.     v8i16 filt, out0_r, out1_r, out2_r, out3_r, out0_l, out1_l, out2_l, out3_l;
  651.  
  652.     src -= (3 * src_stride);
  653.  
  654.     filt = LD_SH(filter);
  655.     SPLATI_H4_SB(filt, 0, 1, 2, 3, filt0, filt1, filt2, filt3);
  656.  
  657.     LD_SB7(src, src_stride, src0, src1, src2, src3, src4, src5, src6);
  658.     XORI_B7_128_SB(src0, src1, src2, src3, src4, src5, src6);
  659.     src += (7 * src_stride);
  660.     ILVR_B4_SB(src1, src0, src3, src2, src5, src4, src2, src1, src10_r, src32_r,
  661.                src54_r, src21_r);
  662.     ILVR_B2_SB(src4, src3, src6, src5, src43_r, src65_r);
  663.     ILVL_B4_SB(src1, src0, src3, src2, src5, src4, src2, src1, src10_l, src32_l,
  664.                src54_l, src21_l);
  665.     ILVL_B2_SB(src4, src3, src6, src5, src43_l, src65_l);
  666.  
  667.     for (loop_cnt = (height >> 2); loop_cnt--;) {
  668.         LD_SB4(src, src_stride, src7, src8, src9, src10);
  669.         XORI_B4_128_SB(src7, src8, src9, src10);
  670.         src += (4 * src_stride);
  671.  
  672.         ILVR_B4_SB(src7, src6, src8, src7, src9, src8, src10, src9, src76_r,
  673.                    src87_r, src98_r, src109_r);
  674.         ILVL_B4_SB(src7, src6, src8, src7, src9, src8, src10, src9, src76_l,
  675.                    src87_l, src98_l, src109_l);
  676.         out0_r = FILT_8TAP_DPADD_S_H(src10_r, src32_r, src54_r, src76_r, filt0,
  677.                                      filt1, filt2, filt3);
  678.         out1_r = FILT_8TAP_DPADD_S_H(src21_r, src43_r, src65_r, src87_r, filt0,
  679.                                      filt1, filt2, filt3);
  680.         out2_r = FILT_8TAP_DPADD_S_H(src32_r, src54_r, src76_r, src98_r, filt0,
  681.                                      filt1, filt2, filt3);
  682.         out3_r = FILT_8TAP_DPADD_S_H(src43_r, src65_r, src87_r, src109_r, filt0,
  683.                                      filt1, filt2, filt3);
  684.         out0_l = FILT_8TAP_DPADD_S_H(src10_l, src32_l, src54_l, src76_l, filt0,
  685.                                      filt1, filt2, filt3);
  686.         out1_l = FILT_8TAP_DPADD_S_H(src21_l, src43_l, src65_l, src87_l, filt0,
  687.                                      filt1, filt2, filt3);
  688.         out2_l = FILT_8TAP_DPADD_S_H(src32_l, src54_l, src76_l, src98_l, filt0,
  689.                                      filt1, filt2, filt3);
  690.         out3_l = FILT_8TAP_DPADD_S_H(src43_l, src65_l, src87_l, src109_l, filt0,
  691.                                      filt1, filt2, filt3);
  692.         SRARI_H4_SH(out0_r, out1_r, out2_r, out3_r, 7);
  693.         SRARI_H4_SH(out0_l, out1_l, out2_l, out3_l, 7);
  694.         SAT_SH4_SH(out0_r, out1_r, out2_r, out3_r, 7);
  695.         SAT_SH4_SH(out0_l, out1_l, out2_l, out3_l, 7);
  696.         PCKEV_B4_UB(out0_l, out0_r, out1_l, out1_r, out2_l, out2_r, out3_l,
  697.                     out3_r, tmp0, tmp1, tmp2, tmp3);
  698.         XORI_B4_128_UB(tmp0, tmp1, tmp2, tmp3);
  699.         ST_UB4(tmp0, tmp1, tmp2, tmp3, dst, dst_stride);
  700.         dst += (4 * dst_stride);
  701.  
  702.         src10_r = src54_r;
  703.         src32_r = src76_r;
  704.         src54_r = src98_r;
  705.         src21_r = src65_r;
  706.         src43_r = src87_r;
  707.         src65_r = src109_r;
  708.         src10_l = src54_l;
  709.         src32_l = src76_l;
  710.         src54_l = src98_l;
  711.         src21_l = src65_l;
  712.         src43_l = src87_l;
  713.         src65_l = src109_l;
  714.         src6 = src10;
  715.     }
  716. }
  717.  
  718. static void common_vt_8t_16w_mult_msa(const uint8_t *src, int32_t src_stride,
  719.                                       uint8_t *dst, int32_t dst_stride,
  720.                                       const int8_t *filter, int32_t height,
  721.                                       int32_t width)
  722. {
  723.     const uint8_t *src_tmp;
  724.     uint8_t *dst_tmp;
  725.     uint32_t loop_cnt, cnt;
  726.     v16i8 src0, src1, src2, src3, src4, src5, src6, src7, src8, src9, src10;
  727.     v16i8 filt0, filt1, filt2, filt3;
  728.     v16i8 src10_r, src32_r, src54_r, src76_r, src98_r, src21_r, src43_r;
  729.     v16i8 src65_r, src87_r, src109_r, src10_l, src32_l, src54_l, src76_l;
  730.     v16i8 src98_l, src21_l, src43_l, src65_l, src87_l, src109_l;
  731.     v16u8 tmp0, tmp1, tmp2, tmp3;
  732.     v8i16 filt, out0_r, out1_r, out2_r, out3_r, out0_l, out1_l, out2_l, out3_l;
  733.  
  734.     src -= (3 * src_stride);
  735.  
  736.     filt = LD_SH(filter);
  737.     SPLATI_H4_SB(filt, 0, 1, 2, 3, filt0, filt1, filt2, filt3);
  738.  
  739.     for (cnt = (width >> 4); cnt--;) {
  740.         src_tmp = src;
  741.         dst_tmp = dst;
  742.  
  743.         LD_SB7(src_tmp, src_stride, src0, src1, src2, src3, src4, src5, src6);
  744.         XORI_B7_128_SB(src0, src1, src2, src3, src4, src5, src6);
  745.         src_tmp += (7 * src_stride);
  746.         ILVR_B4_SB(src1, src0, src3, src2, src5, src4, src2, src1, src10_r,
  747.                    src32_r, src54_r, src21_r);
  748.         ILVR_B2_SB(src4, src3, src6, src5, src43_r, src65_r);
  749.         ILVL_B4_SB(src1, src0, src3, src2, src5, src4, src2, src1, src10_l,
  750.                    src32_l, src54_l, src21_l);
  751.         ILVL_B2_SB(src4, src3, src6, src5, src43_l, src65_l);
  752.  
  753.         for (loop_cnt = (height >> 2); loop_cnt--;) {
  754.             LD_SB4(src_tmp, src_stride, src7, src8, src9, src10);
  755.             XORI_B4_128_SB(src7, src8, src9, src10);
  756.             src_tmp += (4 * src_stride);
  757.             ILVR_B4_SB(src7, src6, src8, src7, src9, src8, src10, src9, src76_r,
  758.                        src87_r, src98_r, src109_r);
  759.             ILVL_B4_SB(src7, src6, src8, src7, src9, src8, src10, src9, src76_l,
  760.                        src87_l, src98_l, src109_l);
  761.             out0_r = FILT_8TAP_DPADD_S_H(src10_r, src32_r, src54_r, src76_r,
  762.                                          filt0, filt1, filt2, filt3);
  763.             out1_r = FILT_8TAP_DPADD_S_H(src21_r, src43_r, src65_r, src87_r,
  764.                                          filt0, filt1, filt2, filt3);
  765.             out2_r = FILT_8TAP_DPADD_S_H(src32_r, src54_r, src76_r, src98_r,
  766.                                          filt0, filt1, filt2, filt3);
  767.             out3_r = FILT_8TAP_DPADD_S_H(src43_r, src65_r, src87_r, src109_r,
  768.                                          filt0, filt1, filt2, filt3);
  769.             out0_l = FILT_8TAP_DPADD_S_H(src10_l, src32_l, src54_l, src76_l,
  770.                                          filt0, filt1, filt2, filt3);
  771.             out1_l = FILT_8TAP_DPADD_S_H(src21_l, src43_l, src65_l, src87_l,
  772.                                          filt0, filt1, filt2, filt3);
  773.             out2_l = FILT_8TAP_DPADD_S_H(src32_l, src54_l, src76_l, src98_l,
  774.                                          filt0, filt1, filt2, filt3);
  775.             out3_l = FILT_8TAP_DPADD_S_H(src43_l, src65_l, src87_l, src109_l,
  776.                                          filt0, filt1, filt2, filt3);
  777.             SRARI_H4_SH(out0_r, out1_r, out2_r, out3_r, 7);
  778.             SRARI_H4_SH(out0_l, out1_l, out2_l, out3_l, 7);
  779.             SAT_SH4_SH(out0_r, out1_r, out2_r, out3_r, 7);
  780.             SAT_SH4_SH(out0_l, out1_l, out2_l, out3_l, 7);
  781.             PCKEV_B4_UB(out0_l, out0_r, out1_l, out1_r, out2_l, out2_r, out3_l,
  782.                         out3_r, tmp0, tmp1, tmp2, tmp3);
  783.             XORI_B4_128_UB(tmp0, tmp1, tmp2, tmp3);
  784.             ST_UB4(tmp0, tmp1, tmp2, tmp3, dst_tmp, dst_stride);
  785.             dst_tmp += (4 * dst_stride);
  786.  
  787.             src10_r = src54_r;
  788.             src32_r = src76_r;
  789.             src54_r = src98_r;
  790.             src21_r = src65_r;
  791.             src43_r = src87_r;
  792.             src65_r = src109_r;
  793.             src10_l = src54_l;
  794.             src32_l = src76_l;
  795.             src54_l = src98_l;
  796.             src21_l = src65_l;
  797.             src43_l = src87_l;
  798.             src65_l = src109_l;
  799.             src6 = src10;
  800.         }
  801.  
  802.         src += 16;
  803.         dst += 16;
  804.     }
  805. }
  806.  
  807. static void common_vt_8t_32w_msa(const uint8_t *src, int32_t src_stride,
  808.                                  uint8_t *dst, int32_t dst_stride,
  809.                                  const int8_t *filter, int32_t height)
  810. {
  811.     common_vt_8t_16w_mult_msa(src, src_stride, dst, dst_stride, filter, height,
  812.                               32);
  813. }
  814.  
  815. static void common_vt_8t_64w_msa(const uint8_t *src, int32_t src_stride,
  816.                                  uint8_t *dst, int32_t dst_stride,
  817.                                  const int8_t *filter, int32_t height)
  818. {
  819.     common_vt_8t_16w_mult_msa(src, src_stride, dst, dst_stride, filter, height,
  820.                               64);
  821. }
  822.  
  823. static void common_hv_8ht_8vt_4w_msa(const uint8_t *src, int32_t src_stride,
  824.                                      uint8_t *dst, int32_t dst_stride,
  825.                                      const int8_t *filter_horiz,
  826.                                      const int8_t *filter_vert,
  827.                                      int32_t height)
  828. {
  829.     uint32_t loop_cnt;
  830.     v16i8 src0, src1, src2, src3, src4, src5, src6, src7, src8, src9, src10;
  831.     v16i8 filt_hz0, filt_hz1, filt_hz2, filt_hz3;
  832.     v16u8 mask0, mask1, mask2, mask3, out;
  833.     v8i16 hz_out0, hz_out1, hz_out2, hz_out3, hz_out4, hz_out5, hz_out6;
  834.     v8i16 hz_out7, hz_out8, hz_out9, tmp0, tmp1, out0, out1, out2, out3, out4;
  835.     v8i16 filt, filt_vt0, filt_vt1, filt_vt2, filt_vt3;
  836.  
  837.     mask0 = LD_UB(&mc_filt_mask_arr[16]);
  838.     src -= (3 + 3 * src_stride);
  839.  
  840.     /* rearranging filter */
  841.     filt = LD_SH(filter_horiz);
  842.     SPLATI_H4_SB(filt, 0, 1, 2, 3, filt_hz0, filt_hz1, filt_hz2, filt_hz3);
  843.  
  844.     mask1 = mask0 + 2;
  845.     mask2 = mask0 + 4;
  846.     mask3 = mask0 + 6;
  847.  
  848.     LD_SB7(src, src_stride, src0, src1, src2, src3, src4, src5, src6);
  849.     XORI_B7_128_SB(src0, src1, src2, src3, src4, src5, src6);
  850.     src += (7 * src_stride);
  851.  
  852.     hz_out0 = HORIZ_8TAP_FILT(src0, src1, mask0, mask1, mask2, mask3, filt_hz0,
  853.                               filt_hz1, filt_hz2, filt_hz3);
  854.     hz_out2 = HORIZ_8TAP_FILT(src2, src3, mask0, mask1, mask2, mask3, filt_hz0,
  855.                               filt_hz1, filt_hz2, filt_hz3);
  856.     hz_out4 = HORIZ_8TAP_FILT(src4, src5, mask0, mask1, mask2, mask3, filt_hz0,
  857.                               filt_hz1, filt_hz2, filt_hz3);
  858.     hz_out5 = HORIZ_8TAP_FILT(src5, src6, mask0, mask1, mask2, mask3, filt_hz0,
  859.                               filt_hz1, filt_hz2, filt_hz3);
  860.     SLDI_B2_SH(hz_out2, hz_out4, hz_out0, hz_out2, hz_out1, hz_out3, 8);
  861.  
  862.     filt = LD_SH(filter_vert);
  863.     SPLATI_H4_SH(filt, 0, 1, 2, 3, filt_vt0, filt_vt1, filt_vt2, filt_vt3);
  864.  
  865.     ILVEV_B2_SH(hz_out0, hz_out1, hz_out2, hz_out3, out0, out1);
  866.     out2 = (v8i16) __msa_ilvev_b((v16i8) hz_out5, (v16i8) hz_out4);
  867.  
  868.     for (loop_cnt = (height >> 2); loop_cnt--;) {
  869.         LD_SB4(src, src_stride, src7, src8, src9, src10);
  870.         XORI_B4_128_SB(src7, src8, src9, src10);
  871.         src += (4 * src_stride);
  872.  
  873.         hz_out7 = HORIZ_8TAP_FILT(src7, src8, mask0, mask1, mask2, mask3,
  874.                                   filt_hz0, filt_hz1, filt_hz2, filt_hz3);
  875.         hz_out6 = (v8i16) __msa_sldi_b((v16i8) hz_out7, (v16i8) hz_out5, 8);
  876.         out3 = (v8i16) __msa_ilvev_b((v16i8) hz_out7, (v16i8) hz_out6);
  877.         tmp0 = FILT_8TAP_DPADD_S_H(out0, out1, out2, out3, filt_vt0, filt_vt1,
  878.                                    filt_vt2, filt_vt3);
  879.  
  880.         hz_out9 = HORIZ_8TAP_FILT(src9, src10, mask0, mask1, mask2, mask3,
  881.                                   filt_hz0, filt_hz1, filt_hz2, filt_hz3);
  882.         hz_out8 = (v8i16) __msa_sldi_b((v16i8) hz_out9, (v16i8) hz_out7, 8);
  883.         out4 = (v8i16) __msa_ilvev_b((v16i8) hz_out9, (v16i8) hz_out8);
  884.         tmp1 = FILT_8TAP_DPADD_S_H(out1, out2, out3, out4, filt_vt0, filt_vt1,
  885.                                    filt_vt2, filt_vt3);
  886.         SRARI_H2_SH(tmp0, tmp1, 7);
  887.         SAT_SH2_SH(tmp0, tmp1, 7);
  888.         out = PCKEV_XORI128_UB(tmp0, tmp1);
  889.         ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
  890.         dst += (4 * dst_stride);
  891.  
  892.         hz_out5 = hz_out9;
  893.         out0 = out2;
  894.         out1 = out3;
  895.         out2 = out4;
  896.     }
  897. }
  898.  
  899. static void common_hv_8ht_8vt_8w_msa(const uint8_t *src, int32_t src_stride,
  900.                                      uint8_t *dst, int32_t dst_stride,
  901.                                      const int8_t *filter_horiz,
  902.                                      const int8_t *filter_vert,
  903.                                      int32_t height)
  904. {
  905.     uint32_t loop_cnt;
  906.     v16i8 src0, src1, src2, src3, src4, src5, src6, src7, src8, src9, src10;
  907.     v16i8 filt_hz0, filt_hz1, filt_hz2, filt_hz3;
  908.     v16u8 mask0, mask1, mask2, mask3, vec0, vec1;
  909.     v8i16 filt, filt_vt0, filt_vt1, filt_vt2, filt_vt3;
  910.     v8i16 hz_out0, hz_out1, hz_out2, hz_out3, hz_out4, hz_out5, hz_out6;
  911.     v8i16 hz_out7, hz_out8, hz_out9, hz_out10, tmp0, tmp1, tmp2, tmp3;
  912.     v8i16 out0, out1, out2, out3, out4, out5, out6, out7, out8, out9;
  913.  
  914.     mask0 = LD_UB(&mc_filt_mask_arr[0]);
  915.     src -= (3 + 3 * src_stride);
  916.  
  917.     /* rearranging filter */
  918.     filt = LD_SH(filter_horiz);
  919.     SPLATI_H4_SB(filt, 0, 1, 2, 3, filt_hz0, filt_hz1, filt_hz2, filt_hz3);
  920.  
  921.     mask1 = mask0 + 2;
  922.     mask2 = mask0 + 4;
  923.     mask3 = mask0 + 6;
  924.  
  925.     LD_SB7(src, src_stride, src0, src1, src2, src3, src4, src5, src6);
  926.     src += (7 * src_stride);
  927.  
  928.     XORI_B7_128_SB(src0, src1, src2, src3, src4, src5, src6);
  929.     hz_out0 = HORIZ_8TAP_FILT(src0, src0, mask0, mask1, mask2, mask3, filt_hz0,
  930.                               filt_hz1, filt_hz2, filt_hz3);
  931.     hz_out1 = HORIZ_8TAP_FILT(src1, src1, mask0, mask1, mask2, mask3, filt_hz0,
  932.                               filt_hz1, filt_hz2, filt_hz3);
  933.     hz_out2 = HORIZ_8TAP_FILT(src2, src2, mask0, mask1, mask2, mask3, filt_hz0,
  934.                               filt_hz1, filt_hz2, filt_hz3);
  935.     hz_out3 = HORIZ_8TAP_FILT(src3, src3, mask0, mask1, mask2, mask3, filt_hz0,
  936.                               filt_hz1, filt_hz2, filt_hz3);
  937.     hz_out4 = HORIZ_8TAP_FILT(src4, src4, mask0, mask1, mask2, mask3, filt_hz0,
  938.                               filt_hz1, filt_hz2, filt_hz3);
  939.     hz_out5 = HORIZ_8TAP_FILT(src5, src5, mask0, mask1, mask2, mask3, filt_hz0,
  940.                               filt_hz1, filt_hz2, filt_hz3);
  941.     hz_out6 = HORIZ_8TAP_FILT(src6, src6, mask0, mask1, mask2, mask3, filt_hz0,
  942.                               filt_hz1, filt_hz2, filt_hz3);
  943.  
  944.     filt = LD_SH(filter_vert);
  945.     SPLATI_H4_SH(filt, 0, 1, 2, 3, filt_vt0, filt_vt1, filt_vt2, filt_vt3);
  946.  
  947.     ILVEV_B2_SH(hz_out0, hz_out1, hz_out2, hz_out3, out0, out1);
  948.     ILVEV_B2_SH(hz_out4, hz_out5, hz_out1, hz_out2, out2, out4);
  949.     ILVEV_B2_SH(hz_out3, hz_out4, hz_out5, hz_out6, out5, out6);
  950.  
  951.     for (loop_cnt = (height >> 2); loop_cnt--;) {
  952.         LD_SB4(src, src_stride, src7, src8, src9, src10);
  953.         src += (4 * src_stride);
  954.  
  955.         XORI_B4_128_SB(src7, src8, src9, src10);
  956.  
  957.         hz_out7 = HORIZ_8TAP_FILT(src7, src7, mask0, mask1, mask2, mask3,
  958.                                   filt_hz0, filt_hz1, filt_hz2, filt_hz3);
  959.         out3 = (v8i16) __msa_ilvev_b((v16i8) hz_out7, (v16i8) hz_out6);
  960.         tmp0 = FILT_8TAP_DPADD_S_H(out0, out1, out2, out3, filt_vt0, filt_vt1,
  961.                                    filt_vt2, filt_vt3);
  962.  
  963.         hz_out8 = HORIZ_8TAP_FILT(src8, src8, mask0, mask1, mask2, mask3,
  964.                                   filt_hz0, filt_hz1, filt_hz2, filt_hz3);
  965.         out7 = (v8i16) __msa_ilvev_b((v16i8) hz_out8, (v16i8) hz_out7);
  966.         tmp1 = FILT_8TAP_DPADD_S_H(out4, out5, out6, out7, filt_vt0, filt_vt1,
  967.                                    filt_vt2, filt_vt3);
  968.  
  969.         hz_out9 = HORIZ_8TAP_FILT(src9, src9, mask0, mask1, mask2, mask3,
  970.                                   filt_hz0, filt_hz1, filt_hz2, filt_hz3);
  971.         out8 = (v8i16) __msa_ilvev_b((v16i8) hz_out9, (v16i8) hz_out8);
  972.         tmp2 = FILT_8TAP_DPADD_S_H(out1, out2, out3, out8, filt_vt0,
  973.                                    filt_vt1, filt_vt2, filt_vt3);
  974.  
  975.         hz_out10 = HORIZ_8TAP_FILT(src10, src10, mask0, mask1, mask2, mask3,
  976.                                    filt_hz0, filt_hz1, filt_hz2, filt_hz3);
  977.         out9 = (v8i16) __msa_ilvev_b((v16i8) hz_out10, (v16i8) hz_out9);
  978.         tmp3 = FILT_8TAP_DPADD_S_H(out5, out6, out7, out9, filt_vt0, filt_vt1,
  979.                                    filt_vt2, filt_vt3);
  980.         SRARI_H4_SH(tmp0, tmp1, tmp2, tmp3, 7);
  981.         SAT_SH4_SH(tmp0, tmp1, tmp2, tmp3, 7);
  982.         vec0 = PCKEV_XORI128_UB(tmp0, tmp1);
  983.         vec1 = PCKEV_XORI128_UB(tmp2, tmp3);
  984.         ST8x4_UB(vec0, vec1, dst, dst_stride);
  985.         dst += (4 * dst_stride);
  986.  
  987.         hz_out6 = hz_out10;
  988.         out0 = out2;
  989.         out1 = out3;
  990.         out2 = out8;
  991.         out4 = out6;
  992.         out5 = out7;
  993.         out6 = out9;
  994.     }
  995. }
  996.  
  997. static void common_hv_8ht_8vt_16w_msa(const uint8_t *src, int32_t src_stride,
  998.                                       uint8_t *dst, int32_t dst_stride,
  999.                                       const int8_t *filter_horiz,
  1000.                                       const int8_t *filter_vert,
  1001.                                       int32_t height)
  1002. {
  1003.     int32_t multiple8_cnt;
  1004.  
  1005.     for (multiple8_cnt = 2; multiple8_cnt--;) {
  1006.         common_hv_8ht_8vt_8w_msa(src, src_stride, dst, dst_stride, filter_horiz,
  1007.                                  filter_vert, height);
  1008.  
  1009.         src += 8;
  1010.         dst += 8;
  1011.     }
  1012. }
  1013.  
  1014. static void common_hv_8ht_8vt_32w_msa(const uint8_t *src, int32_t src_stride,
  1015.                                       uint8_t *dst, int32_t dst_stride,
  1016.                                       const int8_t *filter_horiz,
  1017.                                       const int8_t *filter_vert,
  1018.                                       int32_t height)
  1019. {
  1020.     int32_t multiple8_cnt;
  1021.  
  1022.     for (multiple8_cnt = 4; multiple8_cnt--;) {
  1023.         common_hv_8ht_8vt_8w_msa(src, src_stride, dst, dst_stride, filter_horiz,
  1024.                                  filter_vert, height);
  1025.  
  1026.         src += 8;
  1027.         dst += 8;
  1028.     }
  1029. }
  1030.  
  1031. static void common_hv_8ht_8vt_64w_msa(const uint8_t *src, int32_t src_stride,
  1032.                                       uint8_t *dst, int32_t dst_stride,
  1033.                                       const int8_t *filter_horiz,
  1034.                                       const int8_t *filter_vert,
  1035.                                       int32_t height)
  1036. {
  1037.     int32_t multiple8_cnt;
  1038.  
  1039.     for (multiple8_cnt = 8; multiple8_cnt--;) {
  1040.         common_hv_8ht_8vt_8w_msa(src, src_stride, dst, dst_stride, filter_horiz,
  1041.                                  filter_vert, height);
  1042.  
  1043.         src += 8;
  1044.         dst += 8;
  1045.     }
  1046. }
  1047.  
  1048. static void common_hz_8t_and_aver_dst_4x4_msa(const uint8_t *src,
  1049.                                               int32_t src_stride,
  1050.                                               uint8_t *dst, int32_t dst_stride,
  1051.                                               const int8_t *filter)
  1052. {
  1053.     v16i8 src0, src1, src2, src3, filt0, filt1, filt2, filt3;
  1054.     v16u8 dst0, dst1, dst2, dst3, res2, res3;
  1055.     v16u8 mask0, mask1, mask2, mask3;
  1056.     v8i16 filt, res0, res1;
  1057.  
  1058.     mask0 = LD_UB(&mc_filt_mask_arr[16]);
  1059.     src -= 3;
  1060.  
  1061.     /* rearranging filter */
  1062.     filt = LD_SH(filter);
  1063.     SPLATI_H4_SB(filt, 0, 1, 2, 3, filt0, filt1, filt2, filt3);
  1064.  
  1065.     mask1 = mask0 + 2;
  1066.     mask2 = mask0 + 4;
  1067.     mask3 = mask0 + 6;
  1068.  
  1069.     LD_SB4(src, src_stride, src0, src1, src2, src3);
  1070.     XORI_B4_128_SB(src0, src1, src2, src3);
  1071.     HORIZ_8TAP_4WID_4VECS_FILT(src0, src1, src2, src3, mask0, mask1, mask2,
  1072.                                mask3, filt0, filt1, filt2, filt3, res0, res1);
  1073.     LD_UB4(dst, dst_stride, dst0, dst1, dst2, dst3);
  1074.     SRARI_H2_SH(res0, res1, 7);
  1075.     SAT_SH2_SH(res0, res1, 7);
  1076.     PCKEV_B2_UB(res0, res0, res1, res1, res2, res3);
  1077.     ILVR_W2_UB(dst1, dst0, dst3, dst2, dst0, dst2);
  1078.     XORI_B2_128_UB(res2, res3);
  1079.     AVER_UB2_UB(res2, dst0, res3, dst2, res2, res3);
  1080.     ST4x4_UB(res2, res3, 0, 1, 0, 1, dst, dst_stride);
  1081. }
  1082.  
  1083. static void common_hz_8t_and_aver_dst_4x8_msa(const uint8_t *src,
  1084.                                               int32_t src_stride,
  1085.                                               uint8_t *dst, int32_t dst_stride,
  1086.                                               const int8_t *filter)
  1087. {
  1088.     v16i8 src0, src1, src2, src3, filt0, filt1, filt2, filt3;
  1089.     v16u8 mask0, mask1, mask2, mask3, res0, res1, res2, res3;
  1090.     v16u8 dst0, dst1, dst2, dst3, dst4, dst5, dst6, dst7;
  1091.     v8i16 filt, vec0, vec1, vec2, vec3;
  1092.  
  1093.     mask0 = LD_UB(&mc_filt_mask_arr[16]);
  1094.     src -= 3;
  1095.  
  1096.     /* rearranging filter */
  1097.     filt = LD_SH(filter);
  1098.     SPLATI_H4_SB(filt, 0, 1, 2, 3, filt0, filt1, filt2, filt3);
  1099.  
  1100.     mask1 = mask0 + 2;
  1101.     mask2 = mask0 + 4;
  1102.     mask3 = mask0 + 6;
  1103.  
  1104.     LD_SB4(src, src_stride, src0, src1, src2, src3);
  1105.     XORI_B4_128_SB(src0, src1, src2, src3);
  1106.     src += (4 * src_stride);
  1107.     LD_UB8(dst, dst_stride, dst0, dst1, dst2, dst3, dst4, dst5, dst6, dst7);
  1108.     HORIZ_8TAP_4WID_4VECS_FILT(src0, src1, src2, src3, mask0, mask1, mask2,
  1109.                                mask3, filt0, filt1, filt2, filt3, vec0, vec1);
  1110.     LD_SB4(src, src_stride, src0, src1, src2, src3);
  1111.     XORI_B4_128_SB(src0, src1, src2, src3);
  1112.     HORIZ_8TAP_4WID_4VECS_FILT(src0, src1, src2, src3, mask0, mask1, mask2,
  1113.                                mask3, filt0, filt1, filt2, filt3, vec2, vec3);
  1114.     SRARI_H4_SH(vec0, vec1, vec2, vec3, 7);
  1115.     SAT_SH4_SH(vec0, vec1, vec2, vec3, 7);
  1116.     PCKEV_B4_UB(vec0, vec0, vec1, vec1, vec2, vec2, vec3, vec3,
  1117.                 res0, res1, res2, res3);
  1118.     ILVR_D2_UB(res1, res0, res3, res2, res0, res2);
  1119.     XORI_B2_128_UB(res0, res2);
  1120.     ILVR_W4_UB(dst1, dst0, dst3, dst2, dst5, dst4, dst7, dst6,
  1121.                dst0, dst2, dst4, dst6);
  1122.     ILVR_D2_UB(dst2, dst0, dst6, dst4, dst0, dst4);
  1123.     AVER_UB2_UB(res0, dst0, res2, dst4, res0, res2);
  1124.     ST4x8_UB(res0, res2, dst, dst_stride);
  1125. }
  1126.  
  1127. static void common_hz_8t_and_aver_dst_4w_msa(const uint8_t *src,
  1128.                                              int32_t src_stride,
  1129.                                              uint8_t *dst, int32_t dst_stride,
  1130.                                              const int8_t *filter,
  1131.                                              int32_t height)
  1132. {
  1133.     if (4 == height) {
  1134.         common_hz_8t_and_aver_dst_4x4_msa(src, src_stride, dst, dst_stride,
  1135.                                           filter);
  1136.     } else if (8 == height) {
  1137.         common_hz_8t_and_aver_dst_4x8_msa(src, src_stride, dst, dst_stride,
  1138.                                           filter);
  1139.     }
  1140. }
  1141.  
  1142. static void common_hz_8t_and_aver_dst_8w_msa(const uint8_t *src,
  1143.                                              int32_t src_stride,
  1144.                                              uint8_t *dst, int32_t dst_stride,
  1145.                                              const int8_t *filter,
  1146.                                              int32_t height)
  1147. {
  1148.     int32_t loop_cnt;
  1149.     v16i8 src0, src1, src2, src3, filt0, filt1, filt2, filt3;
  1150.     v16u8 mask0, mask1, mask2, mask3, dst0, dst1, dst2, dst3;
  1151.     v8i16 filt, out0, out1, out2, out3;
  1152.  
  1153.     mask0 = LD_UB(&mc_filt_mask_arr[0]);
  1154.     src -= 3;
  1155.  
  1156.     /* rearranging filter */
  1157.     filt = LD_SH(filter);
  1158.     SPLATI_H4_SB(filt, 0, 1, 2, 3, filt0, filt1, filt2, filt3);
  1159.  
  1160.     mask1 = mask0 + 2;
  1161.     mask2 = mask0 + 4;
  1162.     mask3 = mask0 + 6;
  1163.  
  1164.     for (loop_cnt = (height >> 2); loop_cnt--;) {
  1165.         LD_SB4(src, src_stride, src0, src1, src2, src3);
  1166.         XORI_B4_128_SB(src0, src1, src2, src3);
  1167.         src += (4 * src_stride);
  1168.         HORIZ_8TAP_8WID_4VECS_FILT(src0, src1, src2, src3, mask0, mask1, mask2,
  1169.                                    mask3, filt0, filt1, filt2, filt3, out0,
  1170.                                    out1, out2, out3);
  1171.         LD_UB4(dst, dst_stride, dst0, dst1, dst2, dst3);
  1172.         SRARI_H4_SH(out0, out1, out2, out3, 7);
  1173.         SAT_SH4_SH(out0, out1, out2, out3, 7);
  1174.         CONVERT_UB_AVG_ST8x4_UB(out0, out1, out2, out3, dst0, dst1, dst2, dst3,
  1175.                                 dst, dst_stride);
  1176.         dst += (4 * dst_stride);
  1177.     }
  1178. }
  1179.  
  1180. static void common_hz_8t_and_aver_dst_16w_msa(const uint8_t *src,
  1181.                                               int32_t src_stride,
  1182.                                               uint8_t *dst, int32_t dst_stride,
  1183.                                               const int8_t *filter,
  1184.                                               int32_t height)
  1185. {
  1186.     int32_t loop_cnt;
  1187.     v16i8 src0, src1, src2, src3, filt0, filt1, filt2, filt3;
  1188.     v16u8 mask0, mask1, mask2, mask3, dst0, dst1;
  1189.     v8i16 filt, out0, out1, out2, out3;
  1190.     v8i16 vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7;
  1191.     v8i16 vec8, vec9, vec10, vec11, vec12, vec13, vec14, vec15;
  1192.  
  1193.     mask0 = LD_UB(&mc_filt_mask_arr[0]);
  1194.     src -= 3;
  1195.  
  1196.     /* rearranging filter */
  1197.     filt = LD_SH(filter);
  1198.     SPLATI_H4_SB(filt, 0, 1, 2, 3, filt0, filt1, filt2, filt3);
  1199.  
  1200.     mask1 = mask0 + 2;
  1201.     mask2 = mask0 + 4;
  1202.     mask3 = mask0 + 6;
  1203.  
  1204.     for (loop_cnt = height >> 1; loop_cnt--;) {
  1205.         LD_SB2(src, src_stride, src0, src2);
  1206.         LD_SB2(src + 8, src_stride, src1, src3);
  1207.         src += (2 * src_stride);
  1208.  
  1209.         XORI_B4_128_SB(src0, src1, src2, src3);
  1210.         VSHF_B4_SH(src0, src0, mask0, mask1, mask2, mask3, vec0, vec4, vec8,
  1211.                    vec12);
  1212.         VSHF_B4_SH(src1, src1, mask0, mask1, mask2, mask3, vec1, vec5, vec9,
  1213.                    vec13);
  1214.         VSHF_B4_SH(src2, src2, mask0, mask1, mask2, mask3, vec2, vec6, vec10,
  1215.                    vec14);
  1216.         VSHF_B4_SH(src3, src3, mask0, mask1, mask2, mask3, vec3, vec7, vec11,
  1217.                    vec15);
  1218.         DOTP_SB4_SH(vec0, vec1, vec2, vec3, filt0, filt0, filt0, filt0, vec0,
  1219.                     vec1, vec2, vec3);
  1220.         DOTP_SB4_SH(vec8, vec9, vec10, vec11, filt2, filt2, filt2, filt2, vec8,
  1221.                     vec9, vec10, vec11);
  1222.         DPADD_SB4_SH(vec4, vec5, vec6, vec7, filt1, filt1, filt1, filt1, vec0,
  1223.                      vec1, vec2, vec3);
  1224.         DPADD_SB4_SH(vec12, vec13, vec14, vec15, filt3, filt3, filt3, filt3,
  1225.                      vec8, vec9, vec10, vec11);
  1226.         ADDS_SH4_SH(vec0, vec8, vec1, vec9, vec2, vec10, vec3, vec11, out0,
  1227.                     out1, out2, out3);
  1228.         LD_UB2(dst, dst_stride, dst0, dst1);
  1229.         SRARI_H4_SH(out0, out1, out2, out3, 7);
  1230.         SAT_SH4_SH(out0, out1, out2, out3, 7);
  1231.         PCKEV_XORI128_AVG_ST_UB(out1, out0, dst0, dst);
  1232.         dst += dst_stride;
  1233.         PCKEV_XORI128_AVG_ST_UB(out3, out2, dst1, dst);
  1234.         dst += dst_stride;
  1235.     }
  1236. }
  1237.  
  1238. static void common_hz_8t_and_aver_dst_32w_msa(const uint8_t *src,
  1239.                                               int32_t src_stride,
  1240.                                               uint8_t *dst, int32_t dst_stride,
  1241.                                               const int8_t *filter,
  1242.                                               int32_t height)
  1243. {
  1244.     uint32_t loop_cnt;
  1245.     v16i8 src0, src1, src2, src3, filt0, filt1, filt2, filt3;
  1246.     v16u8 dst1, dst2, mask0, mask1, mask2, mask3;
  1247.     v8i16 filt, out0, out1, out2, out3;
  1248.     v8i16 vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7;
  1249.     v8i16 vec8, vec9, vec10, vec11, vec12, vec13, vec14, vec15;
  1250.  
  1251.     mask0 = LD_UB(&mc_filt_mask_arr[0]);
  1252.     src -= 3;
  1253.  
  1254.     /* rearranging filter */
  1255.     filt = LD_SH(filter);
  1256.     SPLATI_H4_SB(filt, 0, 1, 2, 3, filt0, filt1, filt2, filt3);
  1257.  
  1258.     mask1 = mask0 + 2;
  1259.     mask2 = mask0 + 4;
  1260.     mask3 = mask0 + 6;
  1261.  
  1262.     for (loop_cnt = height; loop_cnt--;) {
  1263.         src0 = LD_SB(src);
  1264.         src2 = LD_SB(src + 16);
  1265.         src3 = LD_SB(src + 24);
  1266.         src1 = __msa_sldi_b(src2, src0, 8);
  1267.         src += src_stride;
  1268.  
  1269.         XORI_B4_128_SB(src0, src1, src2, src3);
  1270.         VSHF_B4_SH(src0, src0, mask0, mask1, mask2, mask3, vec0, vec4, vec8,
  1271.                    vec12);
  1272.         VSHF_B4_SH(src1, src1, mask0, mask1, mask2, mask3, vec1, vec5, vec9,
  1273.                    vec13);
  1274.         VSHF_B4_SH(src2, src2, mask0, mask1, mask2, mask3, vec2, vec6, vec10,
  1275.                    vec14);
  1276.         VSHF_B4_SH(src3, src3, mask0, mask1, mask2, mask3, vec3, vec7, vec11,
  1277.                    vec15);
  1278.         DOTP_SB4_SH(vec0, vec1, vec2, vec3, filt0, filt0, filt0, filt0, vec0,
  1279.                     vec1, vec2, vec3);
  1280.         DOTP_SB4_SH(vec8, vec9, vec10, vec11, filt2, filt2, filt2, filt2, vec8,
  1281.                     vec9, vec10, vec11);
  1282.         DPADD_SB4_SH(vec4, vec5, vec6, vec7, filt1, filt1, filt1, filt1, vec0,
  1283.                      vec1, vec2, vec3);
  1284.         DPADD_SB4_SH(vec12, vec13, vec14, vec15, filt3, filt3, filt3, filt3,
  1285.                      vec8, vec9, vec10, vec11);
  1286.         ADDS_SH4_SH(vec0, vec8, vec1, vec9, vec2, vec10, vec3, vec11, out0,
  1287.                     out1, out2, out3);
  1288.         SRARI_H4_SH(out0, out1, out2, out3, 7);
  1289.         SAT_SH4_SH(out0, out1, out2, out3, 7);
  1290.         LD_UB2(dst, 16, dst1, dst2);
  1291.         PCKEV_XORI128_AVG_ST_UB(out1, out0, dst1, dst);
  1292.         PCKEV_XORI128_AVG_ST_UB(out3, out2, dst2, dst + 16);
  1293.         dst += dst_stride;
  1294.     }
  1295. }
  1296.  
  1297. static void common_hz_8t_and_aver_dst_64w_msa(const uint8_t *src,
  1298.                                               int32_t src_stride,
  1299.                                               uint8_t *dst, int32_t dst_stride,
  1300.                                               const int8_t *filter,
  1301.                                               int32_t height)
  1302. {
  1303.     uint32_t loop_cnt, cnt;
  1304.     v16i8 src0, src1, src2, src3, filt0, filt1, filt2, filt3;
  1305.     v16u8 dst1, dst2, mask0, mask1, mask2, mask3;
  1306.     v8i16 filt, out0, out1, out2, out3;
  1307.     v8i16 vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7;
  1308.     v8i16 vec8, vec9, vec10, vec11, vec12, vec13, vec14, vec15;
  1309.  
  1310.     mask0 = LD_UB(&mc_filt_mask_arr[0]);
  1311.     src -= 3;
  1312.  
  1313.     /* rearranging filter */
  1314.     filt = LD_SH(filter);
  1315.     SPLATI_H4_SB(filt, 0, 1, 2, 3, filt0, filt1, filt2, filt3);
  1316.  
  1317.     mask1 = mask0 + 2;
  1318.     mask2 = mask0 + 4;
  1319.     mask3 = mask0 + 6;
  1320.  
  1321.     for (loop_cnt = height; loop_cnt--;) {
  1322.         for (cnt = 0; cnt < 2; ++cnt) {
  1323.             src0 = LD_SB(&src[cnt << 5]);
  1324.             src2 = LD_SB(&src[16 + (cnt << 5)]);
  1325.             src3 = LD_SB(&src[24 + (cnt << 5)]);
  1326.             src1 = __msa_sldi_b(src2, src0, 8);
  1327.  
  1328.             XORI_B4_128_SB(src0, src1, src2, src3);
  1329.             VSHF_B4_SH(src0, src0, mask0, mask1, mask2, mask3, vec0, vec4, vec8,
  1330.                        vec12);
  1331.             VSHF_B4_SH(src1, src1, mask0, mask1, mask2, mask3, vec1, vec5, vec9,
  1332.                        vec13);
  1333.             VSHF_B4_SH(src2, src2, mask0, mask1, mask2, mask3, vec2, vec6,
  1334.                        vec10, vec14);
  1335.             VSHF_B4_SH(src3, src3, mask0, mask1, mask2, mask3, vec3, vec7,
  1336.                        vec11, vec15);
  1337.             DOTP_SB4_SH(vec0, vec1, vec2, vec3, filt0, filt0, filt0, filt0,
  1338.                         vec0, vec1, vec2, vec3);
  1339.             DOTP_SB4_SH(vec8, vec9, vec10, vec11, filt2, filt2, filt2, filt2,
  1340.                         vec8, vec9, vec10, vec11);
  1341.             DPADD_SB4_SH(vec4, vec5, vec6, vec7, filt1, filt1, filt1, filt1,
  1342.                          vec0, vec1, vec2, vec3);
  1343.             DPADD_SB4_SH(vec12, vec13, vec14, vec15, filt3, filt3, filt3, filt3,
  1344.                          vec8, vec9, vec10, vec11);
  1345.             ADDS_SH4_SH(vec0, vec8, vec1, vec9, vec2, vec10, vec3, vec11, out0,
  1346.                         out1, out2, out3);
  1347.             SRARI_H4_SH(out0, out1, out2, out3, 7);
  1348.             SAT_SH4_SH(out0, out1, out2, out3, 7);
  1349.             LD_UB2(&dst[cnt << 5], 16, dst1, dst2);
  1350.             PCKEV_XORI128_AVG_ST_UB(out1, out0, dst1, &dst[cnt << 5]);
  1351.             PCKEV_XORI128_AVG_ST_UB(out3, out2, dst2, &dst[16 + (cnt << 5)]);
  1352.         }
  1353.  
  1354.         src += src_stride;
  1355.         dst += dst_stride;
  1356.     }
  1357. }
  1358.  
  1359. static void common_vt_8t_and_aver_dst_4w_msa(const uint8_t *src,
  1360.                                              int32_t src_stride,
  1361.                                              uint8_t *dst, int32_t dst_stride,
  1362.                                              const int8_t *filter,
  1363.                                              int32_t height)
  1364. {
  1365.     uint32_t loop_cnt;
  1366.     v16i8 src0, src1, src2, src3, src4, src5, src6, src7, src8, src9, src10;
  1367.     v16u8 dst0, dst1, dst2, dst3, out;
  1368.     v16i8 src10_r, src32_r, src54_r, src76_r, src98_r, src21_r, src43_r;
  1369.     v16i8 src65_r, src87_r, src109_r, src2110, src4332, src6554, src8776;
  1370.     v16i8 src10998, filt0, filt1, filt2, filt3;
  1371.     v8i16 filt, out10, out32;
  1372.  
  1373.     src -= (3 * src_stride);
  1374.  
  1375.     filt = LD_SH(filter);
  1376.     SPLATI_H4_SB(filt, 0, 1, 2, 3, filt0, filt1, filt2, filt3);
  1377.  
  1378.     LD_SB7(src, src_stride, src0, src1, src2, src3, src4, src5, src6);
  1379.     src += (7 * src_stride);
  1380.  
  1381.     ILVR_B4_SB(src1, src0, src3, src2, src5, src4, src2, src1, src10_r, src32_r,
  1382.                src54_r, src21_r);
  1383.     ILVR_B2_SB(src4, src3, src6, src5, src43_r, src65_r);
  1384.     ILVR_D3_SB(src21_r, src10_r, src43_r, src32_r, src65_r, src54_r, src2110,
  1385.                src4332, src6554);
  1386.     XORI_B3_128_SB(src2110, src4332, src6554);
  1387.  
  1388.     for (loop_cnt = (height >> 2); loop_cnt--;) {
  1389.         LD_SB4(src, src_stride, src7, src8, src9, src10);
  1390.         src += (4 * src_stride);
  1391.  
  1392.         LD_UB4(dst, dst_stride, dst0, dst1, dst2, dst3);
  1393.         ILVR_B4_SB(src7, src6, src8, src7, src9, src8, src10, src9, src76_r,
  1394.                    src87_r, src98_r, src109_r);
  1395.         ILVR_D2_SB(src87_r, src76_r, src109_r, src98_r, src8776, src10998);
  1396.         XORI_B2_128_SB(src8776, src10998);
  1397.         out10 = FILT_8TAP_DPADD_S_H(src2110, src4332, src6554, src8776, filt0,
  1398.                                     filt1, filt2, filt3);
  1399.         out32 = FILT_8TAP_DPADD_S_H(src4332, src6554, src8776, src10998, filt0,
  1400.                                     filt1, filt2, filt3);
  1401.         SRARI_H2_SH(out10, out32, 7);
  1402.         SAT_SH2_SH(out10, out32, 7);
  1403.         out = PCKEV_XORI128_UB(out10, out32);
  1404.         ILVR_W2_UB(dst1, dst0, dst3, dst2, dst0, dst2);
  1405.  
  1406.         dst0 = (v16u8) __msa_ilvr_d((v2i64) dst2, (v2i64) dst0);
  1407.         out = __msa_aver_u_b(out, dst0);
  1408.  
  1409.         ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
  1410.         dst += (4 * dst_stride);
  1411.  
  1412.         src2110 = src6554;
  1413.         src4332 = src8776;
  1414.         src6554 = src10998;
  1415.         src6 = src10;
  1416.     }
  1417. }
  1418.  
  1419. static void common_vt_8t_and_aver_dst_8w_msa(const uint8_t *src,
  1420.                                              int32_t src_stride,
  1421.                                              uint8_t *dst, int32_t dst_stride,
  1422.                                              const int8_t *filter,
  1423.                                              int32_t height)
  1424. {
  1425.     uint32_t loop_cnt;
  1426.     v16i8 src0, src1, src2, src3, src4, src5, src6, src7, src8, src9, src10;
  1427.     v16u8 dst0, dst1, dst2, dst3;
  1428.     v16i8 src10_r, src32_r, src54_r, src76_r, src98_r, src21_r, src43_r;
  1429.     v16i8 src65_r, src87_r, src109_r, filt0, filt1, filt2, filt3;
  1430.     v8i16 filt, out0, out1, out2, out3;
  1431.  
  1432.     src -= (3 * src_stride);
  1433.  
  1434.     filt = LD_SH(filter);
  1435.     SPLATI_H4_SB(filt, 0, 1, 2, 3, filt0, filt1, filt2, filt3);
  1436.  
  1437.     LD_SB7(src, src_stride, src0, src1, src2, src3, src4, src5, src6);
  1438.     src += (7 * src_stride);
  1439.  
  1440.     XORI_B7_128_SB(src0, src1, src2, src3, src4, src5, src6);
  1441.     ILVR_B4_SB(src1, src0, src3, src2, src5, src4, src2, src1, src10_r, src32_r,
  1442.                src54_r, src21_r);
  1443.     ILVR_B2_SB(src4, src3, src6, src5, src43_r, src65_r);
  1444.  
  1445.     for (loop_cnt = (height >> 2); loop_cnt--;) {
  1446.         LD_SB4(src, src_stride, src7, src8, src9, src10);
  1447.         src += (4 * src_stride);
  1448.  
  1449.         LD_UB4(dst, dst_stride, dst0, dst1, dst2, dst3);
  1450.         XORI_B4_128_SB(src7, src8, src9, src10);
  1451.         ILVR_B4_SB(src7, src6, src8, src7, src9, src8, src10, src9, src76_r,
  1452.                    src87_r, src98_r, src109_r);
  1453.         out0 = FILT_8TAP_DPADD_S_H(src10_r, src32_r, src54_r, src76_r, filt0,
  1454.                                    filt1, filt2, filt3);
  1455.         out1 = FILT_8TAP_DPADD_S_H(src21_r, src43_r, src65_r, src87_r, filt0,
  1456.                                    filt1, filt2, filt3);
  1457.         out2 = FILT_8TAP_DPADD_S_H(src32_r, src54_r, src76_r, src98_r, filt0,
  1458.                                    filt1, filt2, filt3);
  1459.         out3 = FILT_8TAP_DPADD_S_H(src43_r, src65_r, src87_r, src109_r, filt0,
  1460.                                    filt1, filt2, filt3);
  1461.         SRARI_H4_SH(out0, out1, out2, out3, 7);
  1462.         SAT_SH4_SH(out0, out1, out2, out3, 7);
  1463.         CONVERT_UB_AVG_ST8x4_UB(out0, out1, out2, out3, dst0, dst1, dst2, dst3,
  1464.                                 dst, dst_stride);
  1465.         dst += (4 * dst_stride);
  1466.  
  1467.         src10_r = src54_r;
  1468.         src32_r = src76_r;
  1469.         src54_r = src98_r;
  1470.         src21_r = src65_r;
  1471.         src43_r = src87_r;
  1472.         src65_r = src109_r;
  1473.         src6 = src10;
  1474.     }
  1475. }
  1476.  
  1477. static void common_vt_8t_and_aver_dst_16w_mult_msa(const uint8_t *src,
  1478.                                                    int32_t src_stride,
  1479.                                                    uint8_t *dst,
  1480.                                                    int32_t dst_stride,
  1481.                                                    const int8_t *filter,
  1482.                                                    int32_t height,
  1483.                                                    int32_t width)
  1484. {
  1485.     const uint8_t *src_tmp;
  1486.     uint8_t *dst_tmp;
  1487.     uint32_t loop_cnt, cnt;
  1488.     v16i8 src0, src1, src2, src3, src4, src5, src6, src7, src8, src9, src10;
  1489.     v16i8 src10_r, src32_r, src54_r, src76_r, src98_r, src21_r, src43_r;
  1490.     v16i8 src65_r, src87_r, src109_r, src10_l, src32_l, src54_l, src76_l;
  1491.     v16i8 src98_l, src21_l, src43_l, src65_l, src87_l, src109_l;
  1492.     v16i8 filt0, filt1, filt2, filt3;
  1493.     v16u8 dst0, dst1, dst2, dst3, tmp0, tmp1, tmp2, tmp3;
  1494.     v8i16 out0_r, out1_r, out2_r, out3_r, out0_l, out1_l, out2_l, out3_l, filt;
  1495.  
  1496.     src -= (3 * src_stride);
  1497.  
  1498.     filt = LD_SH(filter);
  1499.     SPLATI_H4_SB(filt, 0, 1, 2, 3, filt0, filt1, filt2, filt3);
  1500.  
  1501.     for (cnt = (width >> 4); cnt--;) {
  1502.         src_tmp = src;
  1503.         dst_tmp = dst;
  1504.  
  1505.         LD_SB7(src_tmp, src_stride, src0, src1, src2, src3, src4, src5, src6);
  1506.         XORI_B7_128_SB(src0, src1, src2, src3, src4, src5, src6);
  1507.         src_tmp += (7 * src_stride);
  1508.  
  1509.         ILVR_B4_SB(src1, src0, src3, src2, src5, src4, src2, src1, src10_r,
  1510.                    src32_r, src54_r, src21_r);
  1511.         ILVR_B2_SB(src4, src3, src6, src5, src43_r, src65_r);
  1512.         ILVL_B4_SB(src1, src0, src3, src2, src5, src4, src2, src1, src10_l,
  1513.                    src32_l, src54_l, src21_l);
  1514.         ILVL_B2_SB(src4, src3, src6, src5, src43_l, src65_l);
  1515.  
  1516.         for (loop_cnt = (height >> 2); loop_cnt--;) {
  1517.             LD_SB4(src_tmp, src_stride, src7, src8, src9, src10);
  1518.             src_tmp += (4 * src_stride);
  1519.  
  1520.             LD_UB4(dst_tmp, dst_stride, dst0, dst1, dst2, dst3);
  1521.             XORI_B4_128_SB(src7, src8, src9, src10);
  1522.             ILVR_B4_SB(src7, src6, src8, src7, src9, src8, src10, src9, src76_r,
  1523.                        src87_r, src98_r, src109_r);
  1524.             ILVL_B4_SB(src7, src6, src8, src7, src9, src8, src10, src9, src76_l,
  1525.                        src87_l, src98_l, src109_l);
  1526.             out0_r = FILT_8TAP_DPADD_S_H(src10_r, src32_r, src54_r, src76_r,
  1527.                                          filt0, filt1, filt2, filt3);
  1528.             out1_r = FILT_8TAP_DPADD_S_H(src21_r, src43_r, src65_r, src87_r,
  1529.                                          filt0, filt1, filt2, filt3);
  1530.             out2_r = FILT_8TAP_DPADD_S_H(src32_r, src54_r, src76_r, src98_r,
  1531.                                          filt0, filt1, filt2, filt3);
  1532.             out3_r = FILT_8TAP_DPADD_S_H(src43_r, src65_r, src87_r, src109_r,
  1533.                                          filt0, filt1, filt2, filt3);
  1534.             out0_l = FILT_8TAP_DPADD_S_H(src10_l, src32_l, src54_l, src76_l,
  1535.                                          filt0, filt1, filt2, filt3);
  1536.             out1_l = FILT_8TAP_DPADD_S_H(src21_l, src43_l, src65_l, src87_l,
  1537.                                          filt0, filt1, filt2, filt3);
  1538.             out2_l = FILT_8TAP_DPADD_S_H(src32_l, src54_l, src76_l, src98_l,
  1539.                                          filt0, filt1, filt2, filt3);
  1540.             out3_l = FILT_8TAP_DPADD_S_H(src43_l, src65_l, src87_l, src109_l,
  1541.                                          filt0, filt1, filt2, filt3);
  1542.             SRARI_H4_SH(out0_r, out1_r, out2_r, out3_r, 7);
  1543.             SRARI_H4_SH(out0_l, out1_l, out2_l, out3_l, 7);
  1544.             SAT_SH4_SH(out0_r, out1_r, out2_r, out3_r, 7);
  1545.             SAT_SH4_SH(out0_l, out1_l, out2_l, out3_l, 7);
  1546.             PCKEV_B4_UB(out0_l, out0_r, out1_l, out1_r, out2_l, out2_r, out3_l,
  1547.                         out3_r, tmp0, tmp1, tmp2, tmp3);
  1548.             XORI_B4_128_UB(tmp0, tmp1, tmp2, tmp3);
  1549.             AVER_UB4_UB(tmp0, dst0, tmp1, dst1, tmp2, dst2, tmp3, dst3,
  1550.                         dst0, dst1, dst2, dst3);
  1551.             ST_UB4(dst0, dst1, dst2, dst3, dst_tmp, dst_stride);
  1552.             dst_tmp += (4 * dst_stride);
  1553.  
  1554.             src10_r = src54_r;
  1555.             src32_r = src76_r;
  1556.             src54_r = src98_r;
  1557.             src21_r = src65_r;
  1558.             src43_r = src87_r;
  1559.             src65_r = src109_r;
  1560.             src10_l = src54_l;
  1561.             src32_l = src76_l;
  1562.             src54_l = src98_l;
  1563.             src21_l = src65_l;
  1564.             src43_l = src87_l;
  1565.             src65_l = src109_l;
  1566.             src6 = src10;
  1567.         }
  1568.  
  1569.         src += 16;
  1570.         dst += 16;
  1571.     }
  1572. }
  1573.  
  1574. static void common_vt_8t_and_aver_dst_16w_msa(const uint8_t *src,
  1575.                                               int32_t src_stride,
  1576.                                               uint8_t *dst, int32_t dst_stride,
  1577.                                               const int8_t *filter,
  1578.                                               int32_t height)
  1579. {
  1580.     common_vt_8t_and_aver_dst_16w_mult_msa(src, src_stride, dst, dst_stride,
  1581.                                            filter, height, 16);
  1582. }
  1583.  
  1584. static void common_vt_8t_and_aver_dst_32w_msa(const uint8_t *src,
  1585.                                               int32_t src_stride,
  1586.                                               uint8_t *dst, int32_t dst_stride,
  1587.                                               const int8_t *filter,
  1588.                                               int32_t height)
  1589. {
  1590.     common_vt_8t_and_aver_dst_16w_mult_msa(src, src_stride, dst, dst_stride,
  1591.                                            filter, height, 32);
  1592. }
  1593.  
  1594. static void common_vt_8t_and_aver_dst_64w_msa(const uint8_t *src,
  1595.                                               int32_t src_stride,
  1596.                                               uint8_t *dst, int32_t dst_stride,
  1597.                                               const int8_t *filter,
  1598.                                               int32_t height)
  1599. {
  1600.     common_vt_8t_and_aver_dst_16w_mult_msa(src, src_stride, dst, dst_stride,
  1601.                                            filter, height, 64);
  1602. }
  1603.  
  1604. static void common_hv_8ht_8vt_and_aver_dst_4w_msa(const uint8_t *src,
  1605.                                                   int32_t src_stride,
  1606.                                                   uint8_t *dst,
  1607.                                                   int32_t dst_stride,
  1608.                                                   const int8_t *filter_horiz,
  1609.                                                   const int8_t *filter_vert,
  1610.                                                   int32_t height)
  1611. {
  1612.     uint32_t loop_cnt;
  1613.     v16i8 src0, src1, src2, src3, src4, src5, src6, src7, src8, src9, src10;
  1614.     v16u8 dst0, dst1, dst2, dst3, mask0, mask1, mask2, mask3, tmp0, tmp1;
  1615.     v16i8 filt_hz0, filt_hz1, filt_hz2, filt_hz3;
  1616.     v8i16 hz_out0, hz_out1, hz_out2, hz_out3, hz_out4, hz_out5, hz_out6;
  1617.     v8i16 hz_out7, hz_out8, hz_out9, res0, res1, vec0, vec1, vec2, vec3, vec4;
  1618.     v8i16 filt, filt_vt0, filt_vt1, filt_vt2, filt_vt3;
  1619.  
  1620.     mask0 = LD_UB(&mc_filt_mask_arr[16]);
  1621.     src -= (3 + 3 * src_stride);
  1622.  
  1623.     /* rearranging filter */
  1624.     filt = LD_SH(filter_horiz);
  1625.     SPLATI_H4_SB(filt, 0, 1, 2, 3, filt_hz0, filt_hz1, filt_hz2, filt_hz3);
  1626.  
  1627.     mask1 = mask0 + 2;
  1628.     mask2 = mask0 + 4;
  1629.     mask3 = mask0 + 6;
  1630.  
  1631.     LD_SB7(src, src_stride, src0, src1, src2, src3, src4, src5, src6);
  1632.     XORI_B7_128_SB(src0, src1, src2, src3, src4, src5, src6);
  1633.     src += (7 * src_stride);
  1634.  
  1635.     hz_out0 = HORIZ_8TAP_FILT(src0, src1, mask0, mask1, mask2, mask3, filt_hz0,
  1636.                               filt_hz1, filt_hz2, filt_hz3);
  1637.     hz_out2 = HORIZ_8TAP_FILT(src2, src3, mask0, mask1, mask2, mask3, filt_hz0,
  1638.                               filt_hz1, filt_hz2, filt_hz3);
  1639.     hz_out4 = HORIZ_8TAP_FILT(src4, src5, mask0, mask1, mask2, mask3, filt_hz0,
  1640.                               filt_hz1, filt_hz2, filt_hz3);
  1641.     hz_out5 = HORIZ_8TAP_FILT(src5, src6, mask0, mask1, mask2, mask3, filt_hz0,
  1642.                               filt_hz1, filt_hz2, filt_hz3);
  1643.     SLDI_B2_SH(hz_out2, hz_out4, hz_out0, hz_out2, hz_out1, hz_out3, 8);
  1644.  
  1645.     filt = LD_SH(filter_vert);
  1646.     SPLATI_H4_SH(filt, 0, 1, 2, 3, filt_vt0, filt_vt1, filt_vt2, filt_vt3);
  1647.  
  1648.     ILVEV_B2_SH(hz_out0, hz_out1, hz_out2, hz_out3, vec0, vec1);
  1649.     vec2 = (v8i16) __msa_ilvev_b((v16i8) hz_out5, (v16i8) hz_out4);
  1650.  
  1651.     for (loop_cnt = (height >> 2); loop_cnt--;) {
  1652.         LD_SB4(src, src_stride, src7, src8, src9, src10);
  1653.         XORI_B4_128_SB(src7, src8, src9, src10);
  1654.         src += (4 * src_stride);
  1655.  
  1656.         LD_UB4(dst, dst_stride, dst0, dst1, dst2, dst3);
  1657.         hz_out7 = HORIZ_8TAP_FILT(src7, src8, mask0, mask1, mask2, mask3,
  1658.                                   filt_hz0, filt_hz1, filt_hz2, filt_hz3);
  1659.         hz_out6 = (v8i16) __msa_sldi_b((v16i8) hz_out7, (v16i8) hz_out5, 8);
  1660.         vec3 = (v8i16) __msa_ilvev_b((v16i8) hz_out7, (v16i8) hz_out6);
  1661.         res0 = FILT_8TAP_DPADD_S_H(vec0, vec1, vec2, vec3, filt_vt0, filt_vt1,
  1662.                                    filt_vt2, filt_vt3);
  1663.  
  1664.         hz_out9 = HORIZ_8TAP_FILT(src9, src10, mask0, mask1, mask2, mask3,
  1665.                                   filt_hz0, filt_hz1, filt_hz2, filt_hz3);
  1666.         hz_out8 = (v8i16) __msa_sldi_b((v16i8) hz_out9, (v16i8) hz_out7, 8);
  1667.         vec4 = (v8i16) __msa_ilvev_b((v16i8) hz_out9, (v16i8) hz_out8);
  1668.         res1 = FILT_8TAP_DPADD_S_H(vec1, vec2, vec3, vec4, filt_vt0, filt_vt1,
  1669.                                    filt_vt2, filt_vt3);
  1670.         ILVR_W2_UB(dst1, dst0, dst3, dst2, dst0, dst2);
  1671.  
  1672.         SRARI_H2_SH(res0, res1, 7);
  1673.         SAT_SH2_SH(res0, res1, 7);
  1674.         PCKEV_B2_UB(res0, res0, res1, res1, tmp0, tmp1);
  1675.         XORI_B2_128_UB(tmp0, tmp1);
  1676.         AVER_UB2_UB(tmp0, dst0, tmp1, dst2, tmp0, tmp1);
  1677.         ST4x4_UB(tmp0, tmp1, 0, 1, 0, 1, dst, dst_stride);
  1678.         dst += (4 * dst_stride);
  1679.  
  1680.         hz_out5 = hz_out9;
  1681.         vec0 = vec2;
  1682.         vec1 = vec3;
  1683.         vec2 = vec4;
  1684.     }
  1685. }
  1686.  
  1687. static void common_hv_8ht_8vt_and_aver_dst_8w_msa(const uint8_t *src,
  1688.                                                   int32_t src_stride,
  1689.                                                   uint8_t *dst,
  1690.                                                   int32_t dst_stride,
  1691.                                                   const int8_t *filter_horiz,
  1692.                                                   const int8_t *filter_vert,
  1693.                                                   int32_t height)
  1694. {
  1695.     uint32_t loop_cnt;
  1696.     v16i8 src0, src1, src2, src3, src4, src5, src6, src7, src8, src9, src10;
  1697.     v16i8 filt_hz0, filt_hz1, filt_hz2, filt_hz3;
  1698.     v8i16 filt, filt_vt0, filt_vt1, filt_vt2, filt_vt3;
  1699.     v16u8 dst0, dst1, dst2, dst3, mask0, mask1, mask2, mask3;
  1700.     v8i16 hz_out0, hz_out1, hz_out2, hz_out3, hz_out4, hz_out5, hz_out6;
  1701.     v8i16 hz_out7, hz_out8, hz_out9, hz_out10, tmp0, tmp1, tmp2, tmp3;
  1702.     v8i16 out0, out1, out2, out3, out4, out5, out6, out7, out8, out9;
  1703.  
  1704.     mask0 = LD_UB(&mc_filt_mask_arr[0]);
  1705.     src -= (3 + 3 * src_stride);
  1706.  
  1707.     /* rearranging filter */
  1708.     filt = LD_SH(filter_horiz);
  1709.     SPLATI_H4_SB(filt, 0, 1, 2, 3, filt_hz0, filt_hz1, filt_hz2, filt_hz3);
  1710.  
  1711.     mask1 = mask0 + 2;
  1712.     mask2 = mask0 + 4;
  1713.     mask3 = mask0 + 6;
  1714.  
  1715.     LD_SB7(src, src_stride, src0, src1, src2, src3, src4, src5, src6);
  1716.     src += (7 * src_stride);
  1717.  
  1718.     XORI_B7_128_SB(src0, src1, src2, src3, src4, src5, src6);
  1719.     hz_out0 = HORIZ_8TAP_FILT(src0, src0, mask0, mask1, mask2, mask3, filt_hz0,
  1720.                               filt_hz1, filt_hz2, filt_hz3);
  1721.     hz_out1 = HORIZ_8TAP_FILT(src1, src1, mask0, mask1, mask2, mask3, filt_hz0,
  1722.                               filt_hz1, filt_hz2, filt_hz3);
  1723.     hz_out2 = HORIZ_8TAP_FILT(src2, src2, mask0, mask1, mask2, mask3, filt_hz0,
  1724.                               filt_hz1, filt_hz2, filt_hz3);
  1725.     hz_out3 = HORIZ_8TAP_FILT(src3, src3, mask0, mask1, mask2, mask3, filt_hz0,
  1726.                               filt_hz1, filt_hz2, filt_hz3);
  1727.     hz_out4 = HORIZ_8TAP_FILT(src4, src4, mask0, mask1, mask2, mask3, filt_hz0,
  1728.                               filt_hz1, filt_hz2, filt_hz3);
  1729.     hz_out5 = HORIZ_8TAP_FILT(src5, src5, mask0, mask1, mask2, mask3, filt_hz0,
  1730.                               filt_hz1, filt_hz2, filt_hz3);
  1731.     hz_out6 = HORIZ_8TAP_FILT(src6, src6, mask0, mask1, mask2, mask3, filt_hz0,
  1732.                               filt_hz1, filt_hz2, filt_hz3);
  1733.  
  1734.     filt = LD_SH(filter_vert);
  1735.     SPLATI_H4_SH(filt, 0, 1, 2, 3, filt_vt0, filt_vt1, filt_vt2, filt_vt3);
  1736.  
  1737.     ILVEV_B2_SH(hz_out0, hz_out1, hz_out2, hz_out3, out0, out1);
  1738.     ILVEV_B2_SH(hz_out4, hz_out5, hz_out1, hz_out2, out2, out4);
  1739.     ILVEV_B2_SH(hz_out3, hz_out4, hz_out5, hz_out6, out5, out6);
  1740.  
  1741.     for (loop_cnt = (height >> 2); loop_cnt--;) {
  1742.         LD_SB4(src, src_stride, src7, src8, src9, src10);
  1743.         XORI_B4_128_SB(src7, src8, src9, src10);
  1744.         src += (4 * src_stride);
  1745.  
  1746.         LD_UB4(dst, dst_stride, dst0, dst1, dst2, dst3);
  1747.  
  1748.         hz_out7 = HORIZ_8TAP_FILT(src7, src7, mask0, mask1, mask2, mask3,
  1749.                                   filt_hz0, filt_hz1, filt_hz2, filt_hz3);
  1750.         out3 = (v8i16) __msa_ilvev_b((v16i8) hz_out7, (v16i8) hz_out6);
  1751.         tmp0 = FILT_8TAP_DPADD_S_H(out0, out1, out2, out3, filt_vt0, filt_vt1,
  1752.                                    filt_vt2, filt_vt3);
  1753.  
  1754.         hz_out8 = HORIZ_8TAP_FILT(src8, src8, mask0, mask1, mask2, mask3,
  1755.                                   filt_hz0, filt_hz1, filt_hz2, filt_hz3);
  1756.         out7 = (v8i16) __msa_ilvev_b((v16i8) hz_out8, (v16i8) hz_out7);
  1757.         tmp1 = FILT_8TAP_DPADD_S_H(out4, out5, out6, out7, filt_vt0, filt_vt1,
  1758.                                    filt_vt2, filt_vt3);
  1759.  
  1760.         hz_out9 = HORIZ_8TAP_FILT(src9, src9, mask0, mask1, mask2, mask3,
  1761.                                   filt_hz0, filt_hz1, filt_hz2, filt_hz3);
  1762.         out8 = (v8i16) __msa_ilvev_b((v16i8) hz_out9, (v16i8) hz_out8);
  1763.         tmp2 = FILT_8TAP_DPADD_S_H(out1, out2, out3, out8, filt_vt0, filt_vt1,
  1764.                                    filt_vt2, filt_vt3);
  1765.  
  1766.         hz_out10 = HORIZ_8TAP_FILT(src10, src10, mask0, mask1, mask2, mask3,
  1767.                                    filt_hz0, filt_hz1, filt_hz2, filt_hz3);
  1768.         out9 = (v8i16) __msa_ilvev_b((v16i8) hz_out10, (v16i8) hz_out9);
  1769.         tmp3 = FILT_8TAP_DPADD_S_H(out5, out6, out7, out9, filt_vt0, filt_vt1,
  1770.                                    filt_vt2, filt_vt3);
  1771.  
  1772.         SRARI_H4_SH(tmp0, tmp1, tmp2, tmp3, 7);
  1773.         SAT_SH4_SH(tmp0, tmp1, tmp2, tmp3, 7);
  1774.         CONVERT_UB_AVG_ST8x4_UB(tmp0, tmp1, tmp2, tmp3, dst0, dst1, dst2, dst3,
  1775.                                 dst, dst_stride);
  1776.         dst += (4 * dst_stride);
  1777.  
  1778.         hz_out6 = hz_out10;
  1779.         out0 = out2;
  1780.         out1 = out3;
  1781.         out2 = out8;
  1782.         out4 = out6;
  1783.         out5 = out7;
  1784.         out6 = out9;
  1785.     }
  1786. }
  1787.  
  1788. static void common_hv_8ht_8vt_and_aver_dst_16w_msa(const uint8_t *src,
  1789.                                                    int32_t src_stride,
  1790.                                                    uint8_t *dst,
  1791.                                                    int32_t dst_stride,
  1792.                                                    const int8_t *filter_horiz,
  1793.                                                    const int8_t *filter_vert,
  1794.                                                    int32_t height)
  1795. {
  1796.     int32_t multiple8_cnt;
  1797.  
  1798.     for (multiple8_cnt = 2; multiple8_cnt--;) {
  1799.         common_hv_8ht_8vt_and_aver_dst_8w_msa(src, src_stride, dst, dst_stride,
  1800.                                               filter_horiz, filter_vert,
  1801.                                               height);
  1802.  
  1803.         src += 8;
  1804.         dst += 8;
  1805.     }
  1806. }
  1807.  
  1808. static void common_hv_8ht_8vt_and_aver_dst_32w_msa(const uint8_t *src,
  1809.                                                    int32_t src_stride,
  1810.                                                    uint8_t *dst,
  1811.                                                    int32_t dst_stride,
  1812.                                                    const int8_t *filter_horiz,
  1813.                                                    const int8_t *filter_vert,
  1814.                                                    int32_t height)
  1815. {
  1816.     int32_t multiple8_cnt;
  1817.  
  1818.     for (multiple8_cnt = 4; multiple8_cnt--;) {
  1819.         common_hv_8ht_8vt_and_aver_dst_8w_msa(src, src_stride, dst, dst_stride,
  1820.                                               filter_horiz, filter_vert,
  1821.                                               height);
  1822.  
  1823.         src += 8;
  1824.         dst += 8;
  1825.     }
  1826. }
  1827.  
  1828. static void common_hv_8ht_8vt_and_aver_dst_64w_msa(const uint8_t *src,
  1829.                                                    int32_t src_stride,
  1830.                                                    uint8_t *dst,
  1831.                                                    int32_t dst_stride,
  1832.                                                    const int8_t *filter_horiz,
  1833.                                                    const int8_t *filter_vert,
  1834.                                                    int32_t height)
  1835. {
  1836.     int32_t multiple8_cnt;
  1837.  
  1838.     for (multiple8_cnt = 8; multiple8_cnt--;) {
  1839.         common_hv_8ht_8vt_and_aver_dst_8w_msa(src, src_stride, dst, dst_stride,
  1840.                                               filter_horiz, filter_vert,
  1841.                                               height);
  1842.  
  1843.         src += 8;
  1844.         dst += 8;
  1845.     }
  1846. }
  1847.  
  1848. static void common_hz_2t_4x4_msa(const uint8_t *src, int32_t src_stride,
  1849.                                  uint8_t *dst, int32_t dst_stride,
  1850.                                  const int8_t *filter)
  1851. {
  1852.     v16i8 src0, src1, src2, src3, mask;
  1853.     v16u8 filt0, vec0, vec1, res0, res1;
  1854.     v8u16 vec2, vec3, filt;
  1855.  
  1856.     mask = LD_SB(&mc_filt_mask_arr[16]);
  1857.  
  1858.     /* rearranging filter */
  1859.     filt = LD_UH(filter);
  1860.     filt0 = (v16u8) __msa_splati_h((v8i16) filt, 0);
  1861.  
  1862.     LD_SB4(src, src_stride, src0, src1, src2, src3);
  1863.     VSHF_B2_UB(src0, src1, src2, src3, mask, mask, vec0, vec1);
  1864.     DOTP_UB2_UH(vec0, vec1, filt0, filt0, vec2, vec3);
  1865.     SRARI_H2_UH(vec2, vec3, 7);
  1866.     PCKEV_B2_UB(vec2, vec2, vec3, vec3, res0, res1);
  1867.     ST4x4_UB(res0, res1, 0, 1, 0, 1, dst, dst_stride);
  1868. }
  1869.  
  1870. static void common_hz_2t_4x8_msa(const uint8_t *src, int32_t src_stride,
  1871.                                  uint8_t *dst, int32_t dst_stride,
  1872.                                  const int8_t *filter)
  1873. {
  1874.     v16u8 vec0, vec1, vec2, vec3, filt0;
  1875.     v16i8 src0, src1, src2, src3, src4, src5, src6, src7, mask;
  1876.     v16i8 res0, res1, res2, res3;
  1877.     v8u16 vec4, vec5, vec6, vec7, filt;
  1878.  
  1879.     mask = LD_SB(&mc_filt_mask_arr[16]);
  1880.  
  1881.     /* rearranging filter */
  1882.     filt = LD_UH(filter);
  1883.     filt0 = (v16u8) __msa_splati_h((v8i16) filt, 0);
  1884.  
  1885.     LD_SB8(src, src_stride, src0, src1, src2, src3, src4, src5, src6, src7);
  1886.     VSHF_B2_UB(src0, src1, src2, src3, mask, mask, vec0, vec1);
  1887.     VSHF_B2_UB(src4, src5, src6, src7, mask, mask, vec2, vec3);
  1888.     DOTP_UB4_UH(vec0, vec1, vec2, vec3, filt0, filt0, filt0, filt0,
  1889.                 vec4, vec5, vec6, vec7);
  1890.     SRARI_H4_UH(vec4, vec5, vec6, vec7, 7);
  1891.     PCKEV_B4_SB(vec4, vec4, vec5, vec5, vec6, vec6, vec7, vec7,
  1892.                 res0, res1, res2, res3);
  1893.     ST4x4_UB(res0, res1, 0, 1, 0, 1, dst, dst_stride);
  1894.     dst += (4 * dst_stride);
  1895.     ST4x4_UB(res2, res3, 0, 1, 0, 1, dst, dst_stride);
  1896. }
  1897.  
  1898. void ff_put_bilin_4h_msa(uint8_t *dst, ptrdiff_t dst_stride,
  1899.                          const uint8_t *src, ptrdiff_t src_stride,
  1900.                          int height, int mx, int my)
  1901. {
  1902.     const int8_t *filter = vp9_bilinear_filters_msa[mx - 1];
  1903.  
  1904.     if (4 == height) {
  1905.         common_hz_2t_4x4_msa(src, src_stride, dst, dst_stride, filter);
  1906.     } else if (8 == height) {
  1907.         common_hz_2t_4x8_msa(src, src_stride, dst, dst_stride, filter);
  1908.     }
  1909. }
  1910.  
  1911. static void common_hz_2t_8x4_msa(const uint8_t *src, int32_t src_stride,
  1912.                                  uint8_t *dst, int32_t dst_stride,
  1913.                                  const int8_t *filter)
  1914. {
  1915.     v16u8 filt0;
  1916.     v16i8 src0, src1, src2, src3, mask;
  1917.     v8u16 vec0, vec1, vec2, vec3, filt;
  1918.  
  1919.     mask = LD_SB(&mc_filt_mask_arr[0]);
  1920.  
  1921.     /* rearranging filter */
  1922.     filt = LD_UH(filter);
  1923.     filt0 = (v16u8) __msa_splati_h((v8i16) filt, 0);
  1924.  
  1925.     LD_SB4(src, src_stride, src0, src1, src2, src3);
  1926.     VSHF_B2_UH(src0, src0, src1, src1, mask, mask, vec0, vec1);
  1927.     VSHF_B2_UH(src2, src2, src3, src3, mask, mask, vec2, vec3);
  1928.     DOTP_UB4_UH(vec0, vec1, vec2, vec3, filt0, filt0, filt0, filt0,
  1929.                 vec0, vec1, vec2, vec3);
  1930.     SRARI_H4_UH(vec0, vec1, vec2, vec3, 7);
  1931.     PCKEV_B2_SB(vec1, vec0, vec3, vec2, src0, src1);
  1932.     ST8x4_UB(src0, src1, dst, dst_stride);
  1933. }
  1934.  
  1935. static void common_hz_2t_8x8mult_msa(const uint8_t *src, int32_t src_stride,
  1936.                                      uint8_t *dst, int32_t dst_stride,
  1937.                                      const int8_t *filter, int32_t height)
  1938. {
  1939.     v16u8 filt0;
  1940.     v16i8 src0, src1, src2, src3, mask, out0, out1;
  1941.     v8u16 vec0, vec1, vec2, vec3, filt;
  1942.  
  1943.     mask = LD_SB(&mc_filt_mask_arr[0]);
  1944.  
  1945.     /* rearranging filter */
  1946.     filt = LD_UH(filter);
  1947.     filt0 = (v16u8) __msa_splati_h((v8i16) filt, 0);
  1948.  
  1949.     LD_SB4(src, src_stride, src0, src1, src2, src3);
  1950.     src += (4 * src_stride);
  1951.  
  1952.     VSHF_B2_UH(src0, src0, src1, src1, mask, mask, vec0, vec1);
  1953.     VSHF_B2_UH(src2, src2, src3, src3, mask, mask, vec2, vec3);
  1954.     DOTP_UB4_UH(vec0, vec1, vec2, vec3, filt0, filt0, filt0, filt0,
  1955.                 vec0, vec1, vec2, vec3);
  1956.     SRARI_H4_UH(vec0, vec1, vec2, vec3, 7);
  1957.     LD_SB4(src, src_stride, src0, src1, src2, src3);
  1958.     src += (4 * src_stride);
  1959.  
  1960.     PCKEV_B2_SB(vec1, vec0, vec3, vec2, out0, out1);
  1961.     ST8x4_UB(out0, out1, dst, dst_stride);
  1962.     dst += (4 * dst_stride);
  1963.  
  1964.     VSHF_B2_UH(src0, src0, src1, src1, mask, mask, vec0, vec1);
  1965.     VSHF_B2_UH(src2, src2, src3, src3, mask, mask, vec2, vec3);
  1966.     DOTP_UB4_UH(vec0, vec1, vec2, vec3, filt0, filt0, filt0, filt0,
  1967.                 vec0, vec1, vec2, vec3);
  1968.     SRARI_H4_UH(vec0, vec1, vec2, vec3, 7);
  1969.     PCKEV_B2_SB(vec1, vec0, vec3, vec2, out0, out1);
  1970.     ST8x4_UB(out0, out1, dst, dst_stride);
  1971.     dst += (4 * dst_stride);
  1972.  
  1973.     if (16 == height) {
  1974.         LD_SB4(src, src_stride, src0, src1, src2, src3);
  1975.         src += (4 * src_stride);
  1976.  
  1977.         VSHF_B2_UH(src0, src0, src1, src1, mask, mask, vec0, vec1);
  1978.         VSHF_B2_UH(src2, src2, src3, src3, mask, mask, vec2, vec3);
  1979.         DOTP_UB4_UH(vec0, vec1, vec2, vec3, filt0, filt0, filt0, filt0,
  1980.                     vec0, vec1, vec2, vec3);
  1981.         SRARI_H4_UH(vec0, vec1, vec2, vec3, 7);
  1982.         LD_SB4(src, src_stride, src0, src1, src2, src3);
  1983.         src += (4 * src_stride);
  1984.  
  1985.         PCKEV_B2_SB(vec1, vec0, vec3, vec2, out0, out1);
  1986.         ST8x4_UB(out0, out1, dst, dst_stride);
  1987.  
  1988.         VSHF_B2_UH(src0, src0, src1, src1, mask, mask, vec0, vec1);
  1989.         VSHF_B2_UH(src2, src2, src3, src3, mask, mask, vec2, vec3);
  1990.         DOTP_UB4_UH(vec0, vec1, vec2, vec3, filt0, filt0, filt0, filt0,
  1991.                     vec0, vec1, vec2, vec3);
  1992.         SRARI_H4_UH(vec0, vec1, vec2, vec3, 7);
  1993.         PCKEV_B2_SB(vec1, vec0, vec3, vec2, out0, out1);
  1994.         ST8x4_UB(out0, out1, dst + 4 * dst_stride, dst_stride);
  1995.     }
  1996. }
  1997.  
  1998. void ff_put_bilin_8h_msa(uint8_t *dst, ptrdiff_t dst_stride,
  1999.                          const uint8_t *src, ptrdiff_t src_stride,
  2000.                          int height, int mx, int my)
  2001. {
  2002.     const int8_t *filter = vp9_bilinear_filters_msa[mx - 1];
  2003.  
  2004.     if (4 == height) {
  2005.         common_hz_2t_8x4_msa(src, src_stride, dst, dst_stride, filter);
  2006.     } else {
  2007.         common_hz_2t_8x8mult_msa(src, src_stride, dst, dst_stride, filter,
  2008.                                  height);
  2009.     }
  2010. }
  2011.  
  2012. void ff_put_bilin_16h_msa(uint8_t *dst, ptrdiff_t dst_stride,
  2013.                           const uint8_t *src, ptrdiff_t src_stride,
  2014.                           int height, int mx, int my)
  2015. {
  2016.     uint32_t loop_cnt;
  2017.     const int8_t *filter = vp9_bilinear_filters_msa[mx - 1];
  2018.     v16i8 src0, src1, src2, src3, src4, src5, src6, src7, mask;
  2019.     v16u8 filt0, vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7;
  2020.     v8u16 out0, out1, out2, out3, out4, out5, out6, out7, filt;
  2021.  
  2022.     mask = LD_SB(&mc_filt_mask_arr[0]);
  2023.  
  2024.     loop_cnt = (height >> 2) - 1;
  2025.  
  2026.     /* rearranging filter */
  2027.     filt = LD_UH(filter);
  2028.     filt0 = (v16u8) __msa_splati_h((v8i16) filt, 0);
  2029.  
  2030.     LD_SB4(src, src_stride, src0, src2, src4, src6);
  2031.     LD_SB4(src + 8, src_stride, src1, src3, src5, src7);
  2032.     src += (4 * src_stride);
  2033.  
  2034.     VSHF_B2_UB(src0, src0, src1, src1, mask, mask, vec0, vec1);
  2035.     VSHF_B2_UB(src2, src2, src3, src3, mask, mask, vec2, vec3);
  2036.     VSHF_B2_UB(src4, src4, src5, src5, mask, mask, vec4, vec5);
  2037.     VSHF_B2_UB(src6, src6, src7, src7, mask, mask, vec6, vec7);
  2038.     DOTP_UB4_UH(vec0, vec1, vec2, vec3, filt0, filt0, filt0, filt0,
  2039.                 out0, out1, out2, out3);
  2040.     DOTP_UB4_UH(vec4, vec5, vec6, vec7, filt0, filt0, filt0, filt0,
  2041.                 out4, out5, out6, out7);
  2042.     SRARI_H4_UH(out0, out1, out2, out3, 7);
  2043.     SRARI_H4_UH(out4, out5, out6, out7, 7);
  2044.     PCKEV_ST_SB(out0, out1, dst);
  2045.     dst += dst_stride;
  2046.     PCKEV_ST_SB(out2, out3, dst);
  2047.     dst += dst_stride;
  2048.     PCKEV_ST_SB(out4, out5, dst);
  2049.     dst += dst_stride;
  2050.     PCKEV_ST_SB(out6, out7, dst);
  2051.     dst += dst_stride;
  2052.  
  2053.     for (; loop_cnt--;) {
  2054.         LD_SB4(src, src_stride, src0, src2, src4, src6);
  2055.         LD_SB4(src + 8, src_stride, src1, src3, src5, src7);
  2056.         src += (4 * src_stride);
  2057.  
  2058.         VSHF_B2_UB(src0, src0, src1, src1, mask, mask, vec0, vec1);
  2059.         VSHF_B2_UB(src2, src2, src3, src3, mask, mask, vec2, vec3);
  2060.         VSHF_B2_UB(src4, src4, src5, src5, mask, mask, vec4, vec5);
  2061.         VSHF_B2_UB(src6, src6, src7, src7, mask, mask, vec6, vec7);
  2062.         DOTP_UB4_UH(vec0, vec1, vec2, vec3, filt0, filt0, filt0, filt0,
  2063.                     out0, out1, out2, out3);
  2064.         DOTP_UB4_UH(vec4, vec5, vec6, vec7, filt0, filt0, filt0, filt0,
  2065.                     out4, out5, out6, out7);
  2066.         SRARI_H4_UH(out0, out1, out2, out3, 7);
  2067.         SRARI_H4_UH(out4, out5, out6, out7, 7);
  2068.         PCKEV_ST_SB(out0, out1, dst);
  2069.         dst += dst_stride;
  2070.         PCKEV_ST_SB(out2, out3, dst);
  2071.         dst += dst_stride;
  2072.         PCKEV_ST_SB(out4, out5, dst);
  2073.         dst += dst_stride;
  2074.         PCKEV_ST_SB(out6, out7, dst);
  2075.         dst += dst_stride;
  2076.     }
  2077. }
  2078.  
  2079. void ff_put_bilin_32h_msa(uint8_t *dst, ptrdiff_t dst_stride,
  2080.                           const uint8_t *src, ptrdiff_t src_stride,
  2081.                           int height, int mx, int my)
  2082. {
  2083.     uint32_t loop_cnt;
  2084.     const int8_t *filter = vp9_bilinear_filters_msa[mx - 1];
  2085.     v16i8 src0, src1, src2, src3, src4, src5, src6, src7, mask;
  2086.     v16u8 filt0, vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7;
  2087.     v8u16 out0, out1, out2, out3, out4, out5, out6, out7, filt;
  2088.  
  2089.     mask = LD_SB(&mc_filt_mask_arr[0]);
  2090.  
  2091.     /* rearranging filter */
  2092.     filt = LD_UH(filter);
  2093.     filt0 = (v16u8) __msa_splati_h((v8i16) filt, 0);
  2094.  
  2095.     for (loop_cnt = height >> 1; loop_cnt--;) {
  2096.         src0 = LD_SB(src);
  2097.         src2 = LD_SB(src + 16);
  2098.         src3 = LD_SB(src + 24);
  2099.         src1 = __msa_sldi_b(src2, src0, 8);
  2100.         src += src_stride;
  2101.         src4 = LD_SB(src);
  2102.         src6 = LD_SB(src + 16);
  2103.         src7 = LD_SB(src + 24);
  2104.         src5 = __msa_sldi_b(src6, src4, 8);
  2105.         src += src_stride;
  2106.  
  2107.         VSHF_B2_UB(src0, src0, src1, src1, mask, mask, vec0, vec1);
  2108.         VSHF_B2_UB(src2, src2, src3, src3, mask, mask, vec2, vec3);
  2109.         VSHF_B2_UB(src4, src4, src5, src5, mask, mask, vec4, vec5);
  2110.         VSHF_B2_UB(src6, src6, src7, src7, mask, mask, vec6, vec7);
  2111.         DOTP_UB4_UH(vec0, vec1, vec2, vec3, filt0, filt0, filt0, filt0,
  2112.                     out0, out1, out2, out3);
  2113.         DOTP_UB4_UH(vec4, vec5, vec6, vec7, filt0, filt0, filt0, filt0,
  2114.                     out4, out5, out6, out7);
  2115.         SRARI_H4_UH(out0, out1, out2, out3, 7);
  2116.         SRARI_H4_UH(out4, out5, out6, out7, 7);
  2117.         PCKEV_ST_SB(out0, out1, dst);
  2118.         PCKEV_ST_SB(out2, out3, dst + 16);
  2119.         dst += dst_stride;
  2120.         PCKEV_ST_SB(out4, out5, dst);
  2121.         PCKEV_ST_SB(out6, out7, dst + 16);
  2122.         dst += dst_stride;
  2123.     }
  2124. }
  2125.  
  2126. void ff_put_bilin_64h_msa(uint8_t *dst, ptrdiff_t dst_stride,
  2127.                           const uint8_t *src, ptrdiff_t src_stride,
  2128.                           int height, int mx, int my)
  2129. {
  2130.     uint32_t loop_cnt;
  2131.     const int8_t *filter = vp9_bilinear_filters_msa[mx - 1];
  2132.     v16i8 src0, src1, src2, src3, src4, src5, src6, src7, mask;
  2133.     v16u8 filt0, vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7;
  2134.     v8u16 out0, out1, out2, out3, out4, out5, out6, out7, filt;
  2135.  
  2136.     mask = LD_SB(&mc_filt_mask_arr[0]);
  2137.  
  2138.     /* rearranging filter */
  2139.     filt = LD_UH(filter);
  2140.     filt0 = (v16u8) __msa_splati_h((v8i16) filt, 0);
  2141.  
  2142.     for (loop_cnt = height; loop_cnt--;) {
  2143.         src0 = LD_SB(src);
  2144.         src2 = LD_SB(src + 16);
  2145.         src4 = LD_SB(src + 32);
  2146.         src6 = LD_SB(src + 48);
  2147.         src7 = LD_SB(src + 56);
  2148.         SLDI_B3_SB(src2, src4, src6, src0, src2, src4, src1, src3, src5, 8);
  2149.         src += src_stride;
  2150.  
  2151.         VSHF_B2_UB(src0, src0, src1, src1, mask, mask, vec0, vec1);
  2152.         VSHF_B2_UB(src2, src2, src3, src3, mask, mask, vec2, vec3);
  2153.         VSHF_B2_UB(src4, src4, src5, src5, mask, mask, vec4, vec5);
  2154.         VSHF_B2_UB(src6, src6, src7, src7, mask, mask, vec6, vec7);
  2155.         DOTP_UB4_UH(vec0, vec1, vec2, vec3, filt0, filt0, filt0, filt0,
  2156.                     out0, out1, out2, out3);
  2157.         DOTP_UB4_UH(vec4, vec5, vec6, vec7, filt0, filt0, filt0, filt0,
  2158.                     out4, out5, out6, out7);
  2159.         SRARI_H4_UH(out0, out1, out2, out3, 7);
  2160.         SRARI_H4_UH(out4, out5, out6, out7, 7);
  2161.         PCKEV_ST_SB(out0, out1, dst);
  2162.         PCKEV_ST_SB(out2, out3, dst + 16);
  2163.         PCKEV_ST_SB(out4, out5, dst + 32);
  2164.         PCKEV_ST_SB(out6, out7, dst + 48);
  2165.         dst += dst_stride;
  2166.     }
  2167. }
  2168.  
  2169. static void common_vt_2t_4x4_msa(const uint8_t *src, int32_t src_stride,
  2170.                                  uint8_t *dst, int32_t dst_stride,
  2171.                                  const int8_t *filter)
  2172. {
  2173.     v16i8 src0, src1, src2, src3, src4;
  2174.     v16i8 src10_r, src32_r, src21_r, src43_r, src2110, src4332;
  2175.     v16u8 filt0;
  2176.     v8i16 filt;
  2177.     v8u16 tmp0, tmp1;
  2178.  
  2179.     filt = LD_SH(filter);
  2180.     filt0 = (v16u8) __msa_splati_h(filt, 0);
  2181.  
  2182.     LD_SB5(src, src_stride, src0, src1, src2, src3, src4);
  2183.     src += (5 * src_stride);
  2184.  
  2185.     ILVR_B4_SB(src1, src0, src2, src1, src3, src2, src4, src3,
  2186.                src10_r, src21_r, src32_r, src43_r);
  2187.     ILVR_D2_SB(src21_r, src10_r, src43_r, src32_r, src2110, src4332);
  2188.     DOTP_UB2_UH(src2110, src4332, filt0, filt0, tmp0, tmp1);
  2189.     SRARI_H2_UH(tmp0, tmp1, 7);
  2190.     SAT_UH2_UH(tmp0, tmp1, 7);
  2191.     src2110 = __msa_pckev_b((v16i8) tmp1, (v16i8) tmp0);
  2192.     ST4x4_UB(src2110, src2110, 0, 1, 2, 3, dst, dst_stride);
  2193. }
  2194.  
  2195. static void common_vt_2t_4x8_msa(const uint8_t *src, int32_t src_stride,
  2196.                                  uint8_t *dst, int32_t dst_stride,
  2197.                                  const int8_t *filter)
  2198. {
  2199.     v16i8 src0, src1, src2, src3, src4, src5, src6, src7, src8;
  2200.     v16i8 src10_r, src32_r, src54_r, src76_r, src21_r, src43_r;
  2201.     v16i8 src65_r, src87_r, src2110, src4332, src6554, src8776;
  2202.     v8u16 tmp0, tmp1, tmp2, tmp3;
  2203.     v16u8 filt0;
  2204.     v8i16 filt;
  2205.  
  2206.     filt = LD_SH(filter);
  2207.     filt0 = (v16u8) __msa_splati_h(filt, 0);
  2208.  
  2209.     LD_SB8(src, src_stride, src0, src1, src2, src3, src4, src5, src6, src7);
  2210.     src += (8 * src_stride);
  2211.  
  2212.     src8 = LD_SB(src);
  2213.     src += src_stride;
  2214.  
  2215.     ILVR_B4_SB(src1, src0, src2, src1, src3, src2, src4, src3, src10_r, src21_r,
  2216.                src32_r, src43_r);
  2217.     ILVR_B4_SB(src5, src4, src6, src5, src7, src6, src8, src7, src54_r, src65_r,
  2218.                src76_r, src87_r);
  2219.     ILVR_D4_SB(src21_r, src10_r, src43_r, src32_r, src65_r, src54_r,
  2220.                src87_r, src76_r, src2110, src4332, src6554, src8776);
  2221.     DOTP_UB4_UH(src2110, src4332, src6554, src8776, filt0, filt0, filt0, filt0,
  2222.                 tmp0, tmp1, tmp2, tmp3);
  2223.     SRARI_H4_UH(tmp0, tmp1, tmp2, tmp3, 7);
  2224.     SAT_UH4_UH(tmp0, tmp1, tmp2, tmp3, 7);
  2225.     PCKEV_B2_SB(tmp1, tmp0, tmp3, tmp2, src2110, src4332);
  2226.     ST4x4_UB(src2110, src2110, 0, 1, 2, 3, dst, dst_stride);
  2227.     ST4x4_UB(src4332, src4332, 0, 1, 2, 3, dst + 4 * dst_stride, dst_stride);
  2228. }
  2229.  
  2230. void ff_put_bilin_4v_msa(uint8_t *dst, ptrdiff_t dst_stride,
  2231.                          const uint8_t *src, ptrdiff_t src_stride,
  2232.                          int height, int mx, int my)
  2233. {
  2234.     const int8_t *filter = vp9_bilinear_filters_msa[my - 1];
  2235.  
  2236.     if (4 == height) {
  2237.         common_vt_2t_4x4_msa(src, src_stride, dst, dst_stride, filter);
  2238.     } else if (8 == height) {
  2239.         common_vt_2t_4x8_msa(src, src_stride, dst, dst_stride, filter);
  2240.     }
  2241. }
  2242.  
  2243. static void common_vt_2t_8x4_msa(const uint8_t *src, int32_t src_stride,
  2244.                                  uint8_t *dst, int32_t dst_stride,
  2245.                                  const int8_t *filter)
  2246. {
  2247.     v16u8 src0, src1, src2, src3, src4, vec0, vec1, vec2, vec3, filt0;
  2248.     v16i8 out0, out1;
  2249.     v8u16 tmp0, tmp1, tmp2, tmp3;
  2250.     v8i16 filt;
  2251.  
  2252.     /* rearranging filter_y */
  2253.     filt = LD_SH(filter);
  2254.     filt0 = (v16u8) __msa_splati_h(filt, 0);
  2255.  
  2256.     LD_UB5(src, src_stride, src0, src1, src2, src3, src4);
  2257.     ILVR_B2_UB(src1, src0, src2, src1, vec0, vec1);
  2258.     ILVR_B2_UB(src3, src2, src4, src3, vec2, vec3);
  2259.     DOTP_UB4_UH(vec0, vec1, vec2, vec3, filt0, filt0, filt0, filt0,
  2260.                 tmp0, tmp1, tmp2, tmp3);
  2261.     SRARI_H4_UH(tmp0, tmp1, tmp2, tmp3, 7);
  2262.     SAT_UH4_UH(tmp0, tmp1, tmp2, tmp3, 7);
  2263.     PCKEV_B2_SB(tmp1, tmp0, tmp3, tmp2, out0, out1);
  2264.     ST8x4_UB(out0, out1, dst, dst_stride);
  2265. }
  2266.  
  2267. static void common_vt_2t_8x8mult_msa(const uint8_t *src, int32_t src_stride,
  2268.                                      uint8_t *dst, int32_t dst_stride,
  2269.                                      const int8_t *filter, int32_t height)
  2270. {
  2271.     uint32_t loop_cnt;
  2272.     v16u8 src0, src1, src2, src3, src4, src5, src6, src7, src8;
  2273.     v16u8 vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7, filt0;
  2274.     v16i8 out0, out1;
  2275.     v8u16 tmp0, tmp1, tmp2, tmp3;
  2276.     v8i16 filt;
  2277.  
  2278.     /* rearranging filter_y */
  2279.     filt = LD_SH(filter);
  2280.     filt0 = (v16u8) __msa_splati_h(filt, 0);
  2281.  
  2282.     src0 = LD_UB(src);
  2283.     src += src_stride;
  2284.  
  2285.     for (loop_cnt = (height >> 3); loop_cnt--;) {
  2286.         LD_UB8(src, src_stride, src1, src2, src3, src4, src5, src6, src7, src8);
  2287.         src += (8 * src_stride);
  2288.  
  2289.         ILVR_B4_UB(src1, src0, src2, src1, src3, src2, src4, src3,
  2290.                    vec0, vec1, vec2, vec3);
  2291.         ILVR_B4_UB(src5, src4, src6, src5, src7, src6, src8, src7,
  2292.                    vec4, vec5, vec6, vec7);
  2293.         DOTP_UB4_UH(vec0, vec1, vec2, vec3, filt0, filt0, filt0, filt0,
  2294.                     tmp0, tmp1, tmp2, tmp3);
  2295.         SRARI_H4_UH(tmp0, tmp1, tmp2, tmp3, 7);
  2296.         SAT_UH4_UH(tmp0, tmp1, tmp2, tmp3, 7);
  2297.         PCKEV_B2_SB(tmp1, tmp0, tmp3, tmp2, out0, out1);
  2298.         ST8x4_UB(out0, out1, dst, dst_stride);
  2299.         dst += (4 * dst_stride);
  2300.  
  2301.         DOTP_UB4_UH(vec4, vec5, vec6, vec7, filt0, filt0, filt0, filt0,
  2302.                     tmp0, tmp1, tmp2, tmp3);
  2303.         SRARI_H4_UH(tmp0, tmp1, tmp2, tmp3, 7);
  2304.         SAT_UH4_UH(tmp0, tmp1, tmp2, tmp3, 7);
  2305.         PCKEV_B2_SB(tmp1, tmp0, tmp3, tmp2, out0, out1);
  2306.         ST8x4_UB(out0, out1, dst, dst_stride);
  2307.         dst += (4 * dst_stride);
  2308.  
  2309.         src0 = src8;
  2310.     }
  2311. }
  2312.  
  2313. void ff_put_bilin_8v_msa(uint8_t *dst, ptrdiff_t dst_stride,
  2314.                          const uint8_t *src, ptrdiff_t src_stride,
  2315.                          int height, int mx, int my)
  2316. {
  2317.     const int8_t *filter = vp9_bilinear_filters_msa[my - 1];
  2318.  
  2319.     if (4 == height) {
  2320.         common_vt_2t_8x4_msa(src, src_stride, dst, dst_stride, filter);
  2321.     } else {
  2322.         common_vt_2t_8x8mult_msa(src, src_stride, dst, dst_stride, filter,
  2323.                                  height);
  2324.     }
  2325. }
  2326.  
  2327. void ff_put_bilin_16v_msa(uint8_t *dst, ptrdiff_t dst_stride,
  2328.                           const uint8_t *src, ptrdiff_t src_stride,
  2329.                           int height, int mx, int my)
  2330. {
  2331.     uint32_t loop_cnt;
  2332.     const int8_t *filter = vp9_bilinear_filters_msa[my - 1];
  2333.     v16u8 src0, src1, src2, src3, src4;
  2334.     v16u8 vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7, filt0;
  2335.     v8u16 tmp0, tmp1, tmp2, tmp3;
  2336.     v8i16 filt;
  2337.  
  2338.     /* rearranging filter_y */
  2339.     filt = LD_SH(filter);
  2340.     filt0 = (v16u8) __msa_splati_h(filt, 0);
  2341.  
  2342.     src0 = LD_UB(src);
  2343.     src += src_stride;
  2344.  
  2345.     for (loop_cnt = (height >> 2); loop_cnt--;) {
  2346.         LD_UB4(src, src_stride, src1, src2, src3, src4);
  2347.         src += (4 * src_stride);
  2348.  
  2349.         ILVR_B2_UB(src1, src0, src2, src1, vec0, vec2);
  2350.         ILVL_B2_UB(src1, src0, src2, src1, vec1, vec3);
  2351.         DOTP_UB2_UH(vec0, vec1, filt0, filt0, tmp0, tmp1);
  2352.         SRARI_H2_UH(tmp0, tmp1, 7);
  2353.         SAT_UH2_UH(tmp0, tmp1, 7);
  2354.         PCKEV_ST_SB(tmp0, tmp1, dst);
  2355.         dst += dst_stride;
  2356.  
  2357.         ILVR_B2_UB(src3, src2, src4, src3, vec4, vec6);
  2358.         ILVL_B2_UB(src3, src2, src4, src3, vec5, vec7);
  2359.         DOTP_UB2_UH(vec2, vec3, filt0, filt0, tmp2, tmp3);
  2360.         SRARI_H2_UH(tmp2, tmp3, 7);
  2361.         SAT_UH2_UH(tmp2, tmp3, 7);
  2362.         PCKEV_ST_SB(tmp2, tmp3, dst);
  2363.         dst += dst_stride;
  2364.  
  2365.         DOTP_UB2_UH(vec4, vec5, filt0, filt0, tmp0, tmp1);
  2366.         SRARI_H2_UH(tmp0, tmp1, 7);
  2367.         SAT_UH2_UH(tmp0, tmp1, 7);
  2368.         PCKEV_ST_SB(tmp0, tmp1, dst);
  2369.         dst += dst_stride;
  2370.  
  2371.         DOTP_UB2_UH(vec6, vec7, filt0, filt0, tmp2, tmp3);
  2372.         SRARI_H2_UH(tmp2, tmp3, 7);
  2373.         SAT_UH2_UH(tmp2, tmp3, 7);
  2374.         PCKEV_ST_SB(tmp2, tmp3, dst);
  2375.         dst += dst_stride;
  2376.  
  2377.         src0 = src4;
  2378.     }
  2379. }
  2380.  
  2381. void ff_put_bilin_32v_msa(uint8_t *dst, ptrdiff_t dst_stride,
  2382.                           const uint8_t *src, ptrdiff_t src_stride,
  2383.                           int height, int mx, int my)
  2384. {
  2385.     uint32_t loop_cnt;
  2386.     const int8_t *filter = vp9_bilinear_filters_msa[my - 1];
  2387.     v16u8 src0, src1, src2, src3, src4, src5, src6, src7, src8, src9;
  2388.     v16u8 vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7, filt0;
  2389.     v8u16 tmp0, tmp1, tmp2, tmp3;
  2390.     v8i16 filt;
  2391.  
  2392.     /* rearranging filter_y */
  2393.     filt = LD_SH(filter);
  2394.     filt0 = (v16u8) __msa_splati_h(filt, 0);
  2395.  
  2396.     src0 = LD_UB(src);
  2397.     src5 = LD_UB(src + 16);
  2398.     src += src_stride;
  2399.  
  2400.     for (loop_cnt = (height >> 2); loop_cnt--;) {
  2401.         LD_UB4(src, src_stride, src1, src2, src3, src4);
  2402.         ILVR_B2_UB(src1, src0, src2, src1, vec0, vec2);
  2403.         ILVL_B2_UB(src1, src0, src2, src1, vec1, vec3);
  2404.  
  2405.         LD_UB4(src + 16, src_stride, src6, src7, src8, src9);
  2406.         src += (4 * src_stride);
  2407.  
  2408.         DOTP_UB2_UH(vec0, vec1, filt0, filt0, tmp0, tmp1);
  2409.         SRARI_H2_UH(tmp0, tmp1, 7);
  2410.         SAT_UH2_UH(tmp0, tmp1, 7);
  2411.         PCKEV_ST_SB(tmp0, tmp1, dst);
  2412.         DOTP_UB2_UH(vec2, vec3, filt0, filt0, tmp2, tmp3);
  2413.         SRARI_H2_UH(tmp2, tmp3, 7);
  2414.         SAT_UH2_UH(tmp2, tmp3, 7);
  2415.         PCKEV_ST_SB(tmp2, tmp3, dst + dst_stride);
  2416.  
  2417.         ILVR_B2_UB(src3, src2, src4, src3, vec4, vec6);
  2418.         ILVL_B2_UB(src3, src2, src4, src3, vec5, vec7);
  2419.         DOTP_UB2_UH(vec4, vec5, filt0, filt0, tmp0, tmp1);
  2420.         SRARI_H2_UH(tmp0, tmp1, 7);
  2421.         SAT_UH2_UH(tmp0, tmp1, 7);
  2422.         PCKEV_ST_SB(tmp0, tmp1, dst + 2 * dst_stride);
  2423.  
  2424.         DOTP_UB2_UH(vec6, vec7, filt0, filt0, tmp2, tmp3);
  2425.         SRARI_H2_UH(tmp2, tmp3, 7);
  2426.         SAT_UH2_UH(tmp2, tmp3, 7);
  2427.         PCKEV_ST_SB(tmp2, tmp3, dst + 3 * dst_stride);
  2428.  
  2429.         ILVR_B2_UB(src6, src5, src7, src6, vec0, vec2);
  2430.         ILVL_B2_UB(src6, src5, src7, src6, vec1, vec3);
  2431.         DOTP_UB2_UH(vec0, vec1, filt0, filt0, tmp0, tmp1);
  2432.         SRARI_H2_UH(tmp0, tmp1, 7);
  2433.         SAT_UH2_UH(tmp0, tmp1, 7);
  2434.         PCKEV_ST_SB(tmp0, tmp1, dst + 16);
  2435.  
  2436.         DOTP_UB2_UH(vec2, vec3, filt0, filt0, tmp2, tmp3);
  2437.         SRARI_H2_UH(tmp2, tmp3, 7);
  2438.         SAT_UH2_UH(tmp2, tmp3, 7);
  2439.         PCKEV_ST_SB(tmp2, tmp3, dst + 16 + dst_stride);
  2440.  
  2441.         ILVR_B2_UB(src8, src7, src9, src8, vec4, vec6);
  2442.         ILVL_B2_UB(src8, src7, src9, src8, vec5, vec7);
  2443.         DOTP_UB2_UH(vec4, vec5, filt0, filt0, tmp0, tmp1);
  2444.         SRARI_H2_UH(tmp0, tmp1, 7);
  2445.         SAT_UH2_UH(tmp0, tmp1, 7);
  2446.         PCKEV_ST_SB(tmp0, tmp1, dst + 16 + 2 * dst_stride);
  2447.  
  2448.         DOTP_UB2_UH(vec6, vec7, filt0, filt0, tmp2, tmp3);
  2449.         SRARI_H2_UH(tmp2, tmp3, 7);
  2450.         SAT_UH2_UH(tmp2, tmp3, 7);
  2451.         PCKEV_ST_SB(tmp2, tmp3, dst + 16 + 3 * dst_stride);
  2452.         dst += (4 * dst_stride);
  2453.  
  2454.         src0 = src4;
  2455.         src5 = src9;
  2456.     }
  2457. }
  2458.  
  2459. void ff_put_bilin_64v_msa(uint8_t *dst, ptrdiff_t dst_stride,
  2460.                           const uint8_t *src, ptrdiff_t src_stride,
  2461.                           int height, int mx, int my)
  2462. {
  2463.     uint32_t loop_cnt;
  2464.     const int8_t *filter = vp9_bilinear_filters_msa[my - 1];
  2465.     v16u8 src0, src1, src2, src3, src4, src5, src6, src7, src8, src9, src10;
  2466.     v16u8 src11, vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7, filt0;
  2467.     v8u16 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
  2468.     v8i16 filt;
  2469.  
  2470.     /* rearranging filter_y */
  2471.     filt = LD_SH(filter);
  2472.     filt0 = (v16u8) __msa_splati_h(filt, 0);
  2473.  
  2474.     LD_UB4(src, 16, src0, src3, src6, src9);
  2475.     src += src_stride;
  2476.  
  2477.     for (loop_cnt = (height >> 1); loop_cnt--;) {
  2478.         LD_UB2(src, src_stride, src1, src2);
  2479.         LD_UB2(src + 16, src_stride, src4, src5);
  2480.         LD_UB2(src + 32, src_stride, src7, src8);
  2481.         LD_UB2(src + 48, src_stride, src10, src11);
  2482.         src += (2 * src_stride);
  2483.  
  2484.         ILVR_B2_UB(src1, src0, src2, src1, vec0, vec2);
  2485.         ILVL_B2_UB(src1, src0, src2, src1, vec1, vec3);
  2486.         DOTP_UB2_UH(vec0, vec1, filt0, filt0, tmp0, tmp1);
  2487.         SRARI_H2_UH(tmp0, tmp1, 7);
  2488.         SAT_UH2_UH(tmp0, tmp1, 7);
  2489.         PCKEV_ST_SB(tmp0, tmp1, dst);
  2490.  
  2491.         DOTP_UB2_UH(vec2, vec3, filt0, filt0, tmp2, tmp3);
  2492.         SRARI_H2_UH(tmp2, tmp3, 7);
  2493.         SAT_UH2_UH(tmp2, tmp3, 7);
  2494.         PCKEV_ST_SB(tmp2, tmp3, dst + dst_stride);
  2495.  
  2496.         ILVR_B2_UB(src4, src3, src5, src4, vec4, vec6);
  2497.         ILVL_B2_UB(src4, src3, src5, src4, vec5, vec7);
  2498.         DOTP_UB2_UH(vec4, vec5, filt0, filt0, tmp4, tmp5);
  2499.         SRARI_H2_UH(tmp4, tmp5, 7);
  2500.         SAT_UH2_UH(tmp4, tmp5, 7);
  2501.         PCKEV_ST_SB(tmp4, tmp5, dst + 16);
  2502.  
  2503.         DOTP_UB2_UH(vec6, vec7, filt0, filt0, tmp6, tmp7);
  2504.         SRARI_H2_UH(tmp6, tmp7, 7);
  2505.         SAT_UH2_UH(tmp6, tmp7, 7);
  2506.         PCKEV_ST_SB(tmp6, tmp7, dst + 16 + dst_stride);
  2507.  
  2508.         ILVR_B2_UB(src7, src6, src8, src7, vec0, vec2);
  2509.         ILVL_B2_UB(src7, src6, src8, src7, vec1, vec3);
  2510.         DOTP_UB2_UH(vec0, vec1, filt0, filt0, tmp0, tmp1);
  2511.         SRARI_H2_UH(tmp0, tmp1, 7);
  2512.         SAT_UH2_UH(tmp0, tmp1, 7);
  2513.         PCKEV_ST_SB(tmp0, tmp1, dst + 32);
  2514.  
  2515.         DOTP_UB2_UH(vec2, vec3, filt0, filt0, tmp2, tmp3);
  2516.         SRARI_H2_UH(tmp2, tmp3, 7);
  2517.         SAT_UH2_UH(tmp2, tmp3, 7);
  2518.         PCKEV_ST_SB(tmp2, tmp3, dst + 32 + dst_stride);
  2519.  
  2520.         ILVR_B2_UB(src10, src9, src11, src10, vec4, vec6);
  2521.         ILVL_B2_UB(src10, src9, src11, src10, vec5, vec7);
  2522.         DOTP_UB2_UH(vec4, vec5, filt0, filt0, tmp4, tmp5);
  2523.         SRARI_H2_UH(tmp4, tmp5, 7);
  2524.         SAT_UH2_UH(tmp4, tmp5, 7);
  2525.         PCKEV_ST_SB(tmp4, tmp5, dst + 48);
  2526.  
  2527.         DOTP_UB2_UH(vec6, vec7, filt0, filt0, tmp6, tmp7);
  2528.         SRARI_H2_UH(tmp6, tmp7, 7);
  2529.         SAT_UH2_UH(tmp6, tmp7, 7);
  2530.         PCKEV_ST_SB(tmp6, tmp7, dst + 48 + dst_stride);
  2531.         dst += (2 * dst_stride);
  2532.  
  2533.         src0 = src2;
  2534.         src3 = src5;
  2535.         src6 = src8;
  2536.         src9 = src11;
  2537.     }
  2538. }
  2539.  
  2540. static void common_hv_2ht_2vt_4x4_msa(const uint8_t *src, int32_t src_stride,
  2541.                                uint8_t *dst, int32_t dst_stride,
  2542.                                const int8_t *filter_horiz, const int8_t *filter_vert)
  2543. {
  2544.     v16i8 src0, src1, src2, src3, src4, mask;
  2545.     v16u8 filt_vt, filt_hz, vec0, vec1, res0, res1;
  2546.     v8u16 hz_out0, hz_out1, hz_out2, hz_out3, hz_out4, filt, tmp0, tmp1;
  2547.  
  2548.     mask = LD_SB(&mc_filt_mask_arr[16]);
  2549.  
  2550.     /* rearranging filter */
  2551.     filt = LD_UH(filter_horiz);
  2552.     filt_hz = (v16u8) __msa_splati_h((v8i16) filt, 0);
  2553.  
  2554.     filt = LD_UH(filter_vert);
  2555.     filt_vt = (v16u8) __msa_splati_h((v8i16) filt, 0);
  2556.  
  2557.     LD_SB5(src, src_stride, src0, src1, src2, src3, src4);
  2558.     hz_out0 = HORIZ_2TAP_FILT_UH(src0, src1, mask, filt_hz, 7);
  2559.     hz_out2 = HORIZ_2TAP_FILT_UH(src2, src3, mask, filt_hz, 7);
  2560.     hz_out4 = HORIZ_2TAP_FILT_UH(src4, src4, mask, filt_hz, 7);
  2561.     hz_out1 = (v8u16) __msa_sldi_b((v16i8) hz_out2, (v16i8) hz_out0, 8);
  2562.     hz_out3 = (v8u16) __msa_pckod_d((v2i64) hz_out4, (v2i64) hz_out2);
  2563.  
  2564.     ILVEV_B2_UB(hz_out0, hz_out1, hz_out2, hz_out3, vec0, vec1);
  2565.     DOTP_UB2_UH(vec0, vec1, filt_vt, filt_vt, tmp0, tmp1);
  2566.     SRARI_H2_UH(tmp0, tmp1, 7);
  2567.     SAT_UH2_UH(tmp0, tmp1, 7);
  2568.     PCKEV_B2_UB(tmp0, tmp0, tmp1, tmp1, res0, res1);
  2569.     ST4x4_UB(res0, res1, 0, 1, 0, 1, dst, dst_stride);
  2570. }
  2571.  
  2572. static void common_hv_2ht_2vt_4x8_msa(const uint8_t *src, int32_t src_stride,
  2573.                                uint8_t *dst, int32_t dst_stride,
  2574.                                const int8_t *filter_horiz, const int8_t *filter_vert)
  2575. {
  2576.     v16i8 src0, src1, src2, src3, src4, src5, src6, src7, src8, mask;
  2577.     v16i8 res0, res1, res2, res3;
  2578.     v16u8 filt_hz, filt_vt, vec0, vec1, vec2, vec3;
  2579.     v8u16 hz_out0, hz_out1, hz_out2, hz_out3, hz_out4, hz_out5, hz_out6;
  2580.     v8u16 hz_out7, hz_out8, vec4, vec5, vec6, vec7, filt;
  2581.  
  2582.     mask = LD_SB(&mc_filt_mask_arr[16]);
  2583.  
  2584.     /* rearranging filter */
  2585.     filt = LD_UH(filter_horiz);
  2586.     filt_hz = (v16u8) __msa_splati_h((v8i16) filt, 0);
  2587.  
  2588.     filt = LD_UH(filter_vert);
  2589.     filt_vt = (v16u8) __msa_splati_h((v8i16) filt, 0);
  2590.  
  2591.     LD_SB8(src, src_stride, src0, src1, src2, src3, src4, src5, src6, src7);
  2592.     src += (8 * src_stride);
  2593.     src8 = LD_SB(src);
  2594.  
  2595.     hz_out0 = HORIZ_2TAP_FILT_UH(src0, src1, mask, filt_hz, 7);
  2596.     hz_out2 = HORIZ_2TAP_FILT_UH(src2, src3, mask, filt_hz, 7);
  2597.     hz_out4 = HORIZ_2TAP_FILT_UH(src4, src5, mask, filt_hz, 7);
  2598.     hz_out6 = HORIZ_2TAP_FILT_UH(src6, src7, mask, filt_hz, 7);
  2599.     hz_out8 = HORIZ_2TAP_FILT_UH(src8, src8, mask, filt_hz, 7);
  2600.     SLDI_B3_UH(hz_out2, hz_out4, hz_out6, hz_out0, hz_out2, hz_out4, hz_out1,
  2601.                hz_out3, hz_out5, 8);
  2602.     hz_out7 = (v8u16) __msa_pckod_d((v2i64) hz_out8, (v2i64) hz_out6);
  2603.  
  2604.     ILVEV_B2_UB(hz_out0, hz_out1, hz_out2, hz_out3, vec0, vec1);
  2605.     ILVEV_B2_UB(hz_out4, hz_out5, hz_out6, hz_out7, vec2, vec3);
  2606.     DOTP_UB4_UH(vec0, vec1, vec2, vec3, filt_vt, filt_vt, filt_vt, filt_vt,
  2607.                 vec4, vec5, vec6, vec7);
  2608.     SRARI_H4_UH(vec4, vec5, vec6, vec7, 7);
  2609.     SAT_UH4_UH(vec4, vec5, vec6, vec7, 7);
  2610.     PCKEV_B4_SB(vec4, vec4, vec5, vec5, vec6, vec6, vec7, vec7,
  2611.                 res0, res1, res2, res3);
  2612.     ST4x4_UB(res0, res1, 0, 1, 0, 1, dst, dst_stride);
  2613.     dst += (4 * dst_stride);
  2614.     ST4x4_UB(res2, res3, 0, 1, 0, 1, dst, dst_stride);
  2615. }
  2616.  
  2617. void ff_put_bilin_4hv_msa(uint8_t *dst, ptrdiff_t dst_stride,
  2618.                           const uint8_t *src, ptrdiff_t src_stride,
  2619.                           int height, int mx, int my)
  2620. {
  2621.     const int8_t *filter_horiz = vp9_bilinear_filters_msa[mx - 1];
  2622.     const int8_t *filter_vert = vp9_bilinear_filters_msa[my - 1];
  2623.  
  2624.     if (4 == height) {
  2625.         common_hv_2ht_2vt_4x4_msa(src, src_stride, dst, dst_stride,
  2626.                                   filter_horiz, filter_vert);
  2627.     } else if (8 == height) {
  2628.         common_hv_2ht_2vt_4x8_msa(src, src_stride, dst, dst_stride,
  2629.                                   filter_horiz, filter_vert);
  2630.     }
  2631. }
  2632.  
  2633. static void common_hv_2ht_2vt_8x4_msa(const uint8_t *src, int32_t src_stride,
  2634.                                uint8_t *dst, int32_t dst_stride,
  2635.                                const int8_t *filter_horiz, const int8_t *filter_vert)
  2636. {
  2637.     v16i8 src0, src1, src2, src3, src4, mask, out0, out1;
  2638.     v16u8 filt_hz, filt_vt, vec0, vec1, vec2, vec3;
  2639.     v8u16 hz_out0, hz_out1, tmp0, tmp1, tmp2, tmp3;
  2640.     v8i16 filt;
  2641.  
  2642.     mask = LD_SB(&mc_filt_mask_arr[0]);
  2643.  
  2644.     /* rearranging filter */
  2645.     filt = LD_SH(filter_horiz);
  2646.     filt_hz = (v16u8) __msa_splati_h(filt, 0);
  2647.  
  2648.     filt = LD_SH(filter_vert);
  2649.     filt_vt = (v16u8) __msa_splati_h(filt, 0);
  2650.  
  2651.     LD_SB5(src, src_stride, src0, src1, src2, src3, src4);
  2652.  
  2653.     hz_out0 = HORIZ_2TAP_FILT_UH(src0, src0, mask, filt_hz, 7);
  2654.     hz_out1 = HORIZ_2TAP_FILT_UH(src1, src1, mask, filt_hz, 7);
  2655.     vec0 = (v16u8) __msa_ilvev_b((v16i8) hz_out1, (v16i8) hz_out0);
  2656.     tmp0 = __msa_dotp_u_h(vec0, filt_vt);
  2657.  
  2658.     hz_out0 = HORIZ_2TAP_FILT_UH(src2, src2, mask, filt_hz, 7);
  2659.     vec1 = (v16u8) __msa_ilvev_b((v16i8) hz_out0, (v16i8) hz_out1);
  2660.     tmp1 = __msa_dotp_u_h(vec1, filt_vt);
  2661.  
  2662.     hz_out1 = HORIZ_2TAP_FILT_UH(src3, src3, mask, filt_hz, 7);
  2663.     vec2 = (v16u8) __msa_ilvev_b((v16i8) hz_out1, (v16i8) hz_out0);
  2664.     tmp2 = __msa_dotp_u_h(vec2, filt_vt);
  2665.  
  2666.     hz_out0 = HORIZ_2TAP_FILT_UH(src4, src4, mask, filt_hz, 7);
  2667.     vec3 = (v16u8) __msa_ilvev_b((v16i8) hz_out0, (v16i8) hz_out1);
  2668.     tmp3 = __msa_dotp_u_h(vec3, filt_vt);
  2669.  
  2670.     SRARI_H4_UH(tmp0, tmp1, tmp2, tmp3, 7);
  2671.     SAT_UH4_UH(tmp0, tmp1, tmp2, tmp3, 7);
  2672.     PCKEV_B2_SB(tmp1, tmp0, tmp3, tmp2, out0, out1);
  2673.     ST8x4_UB(out0, out1, dst, dst_stride);
  2674. }
  2675.  
  2676. static void common_hv_2ht_2vt_8x8mult_msa(const uint8_t *src, int32_t src_stride,
  2677.                                    uint8_t *dst, int32_t dst_stride,
  2678.                                    const int8_t *filter_horiz, const int8_t *filter_vert,
  2679.                                    int32_t height)
  2680. {
  2681.     uint32_t loop_cnt;
  2682.     v16i8 src0, src1, src2, src3, src4, mask, out0, out1;
  2683.     v16u8 filt_hz, filt_vt, vec0;
  2684.     v8u16 hz_out0, hz_out1, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp8;
  2685.     v8i16 filt;
  2686.  
  2687.     mask = LD_SB(&mc_filt_mask_arr[0]);
  2688.  
  2689.     /* rearranging filter */
  2690.     filt = LD_SH(filter_horiz);
  2691.     filt_hz = (v16u8) __msa_splati_h(filt, 0);
  2692.  
  2693.     filt = LD_SH(filter_vert);
  2694.     filt_vt = (v16u8) __msa_splati_h(filt, 0);
  2695.  
  2696.     src0 = LD_SB(src);
  2697.     src += src_stride;
  2698.  
  2699.     hz_out0 = HORIZ_2TAP_FILT_UH(src0, src0, mask, filt_hz, 7);
  2700.  
  2701.     for (loop_cnt = (height >> 3); loop_cnt--;) {
  2702.         LD_SB4(src, src_stride, src1, src2, src3, src4);
  2703.         src += (4 * src_stride);
  2704.  
  2705.         hz_out1 = HORIZ_2TAP_FILT_UH(src1, src1, mask, filt_hz, 7);
  2706.         vec0 = (v16u8) __msa_ilvev_b((v16i8) hz_out1, (v16i8) hz_out0);
  2707.         tmp1 = __msa_dotp_u_h(vec0, filt_vt);
  2708.  
  2709.         hz_out0 = HORIZ_2TAP_FILT_UH(src2, src2, mask, filt_hz, 7);
  2710.         vec0 = (v16u8) __msa_ilvev_b((v16i8) hz_out0, (v16i8) hz_out1);
  2711.         tmp2 = __msa_dotp_u_h(vec0, filt_vt);
  2712.  
  2713.         SRARI_H2_UH(tmp1, tmp2, 7);
  2714.         SAT_UH2_UH(tmp1, tmp2, 7);
  2715.  
  2716.         hz_out1 = HORIZ_2TAP_FILT_UH(src3, src3, mask, filt_hz, 7);
  2717.         vec0 = (v16u8) __msa_ilvev_b((v16i8) hz_out1, (v16i8) hz_out0);
  2718.         tmp3 = __msa_dotp_u_h(vec0, filt_vt);
  2719.  
  2720.         hz_out0 = HORIZ_2TAP_FILT_UH(src4, src4, mask, filt_hz, 7);
  2721.         LD_SB4(src, src_stride, src1, src2, src3, src4);
  2722.         src += (4 * src_stride);
  2723.         vec0 = (v16u8) __msa_ilvev_b((v16i8) hz_out0, (v16i8) hz_out1);
  2724.         tmp4 = __msa_dotp_u_h(vec0, filt_vt);
  2725.  
  2726.         SRARI_H2_UH(tmp3, tmp4, 7);
  2727.         SAT_UH2_UH(tmp3, tmp4, 7);
  2728.         PCKEV_B2_SB(tmp2, tmp1, tmp4, tmp3, out0, out1);
  2729.         ST8x4_UB(out0, out1, dst, dst_stride);
  2730.         dst += (4 * dst_stride);
  2731.  
  2732.         hz_out1 = HORIZ_2TAP_FILT_UH(src1, src1, mask, filt_hz, 7);
  2733.         vec0 = (v16u8) __msa_ilvev_b((v16i8) hz_out1, (v16i8) hz_out0);
  2734.         tmp5 = __msa_dotp_u_h(vec0, filt_vt);
  2735.  
  2736.         hz_out0 = HORIZ_2TAP_FILT_UH(src2, src2, mask, filt_hz, 7);
  2737.         vec0 = (v16u8) __msa_ilvev_b((v16i8) hz_out0, (v16i8) hz_out1);
  2738.         tmp6 = __msa_dotp_u_h(vec0, filt_vt);
  2739.  
  2740.         hz_out1 = HORIZ_2TAP_FILT_UH(src3, src3, mask, filt_hz, 7);
  2741.         vec0 = (v16u8) __msa_ilvev_b((v16i8) hz_out1, (v16i8) hz_out0);
  2742.         tmp7 = __msa_dotp_u_h(vec0, filt_vt);
  2743.  
  2744.         hz_out0 = HORIZ_2TAP_FILT_UH(src4, src4, mask, filt_hz, 7);
  2745.         vec0 = (v16u8) __msa_ilvev_b((v16i8) hz_out0, (v16i8) hz_out1);
  2746.         tmp8 = __msa_dotp_u_h(vec0, filt_vt);
  2747.  
  2748.         SRARI_H4_UH(tmp5, tmp6, tmp7, tmp8, 7);
  2749.         SAT_UH4_UH(tmp5, tmp6, tmp7, tmp8, 7);
  2750.         PCKEV_B2_SB(tmp6, tmp5, tmp8, tmp7, out0, out1);
  2751.         ST8x4_UB(out0, out1, dst, dst_stride);
  2752.         dst += (4 * dst_stride);
  2753.     }
  2754. }
  2755.  
  2756. void ff_put_bilin_8hv_msa(uint8_t *dst, ptrdiff_t dst_stride,
  2757.                           const uint8_t *src, ptrdiff_t src_stride,
  2758.                           int height, int mx, int my)
  2759. {
  2760.     const int8_t *filter_horiz = vp9_bilinear_filters_msa[mx - 1];
  2761.     const int8_t *filter_vert = vp9_bilinear_filters_msa[my - 1];
  2762.  
  2763.     if (4 == height) {
  2764.         common_hv_2ht_2vt_8x4_msa(src, src_stride, dst, dst_stride,
  2765.                                   filter_horiz, filter_vert);
  2766.     } else {
  2767.         common_hv_2ht_2vt_8x8mult_msa(src, src_stride, dst, dst_stride,
  2768.                                       filter_horiz, filter_vert, height);
  2769.     }
  2770. }
  2771.  
  2772. void ff_put_bilin_16hv_msa(uint8_t *dst, ptrdiff_t dst_stride,
  2773.                            const uint8_t *src, ptrdiff_t src_stride,
  2774.                            int height, int mx, int my)
  2775. {
  2776.     uint32_t loop_cnt;
  2777.     const int8_t *filter_horiz = vp9_bilinear_filters_msa[mx - 1];
  2778.     const int8_t *filter_vert = vp9_bilinear_filters_msa[my - 1];
  2779.     v16i8 src0, src1, src2, src3, src4, src5, src6, src7, mask;
  2780.     v16u8 filt_hz, filt_vt, vec0, vec1;
  2781.     v8u16 tmp1, tmp2, hz_out0, hz_out1, hz_out2, hz_out3;
  2782.     v8i16 filt;
  2783.  
  2784.     mask = LD_SB(&mc_filt_mask_arr[0]);
  2785.  
  2786.     /* rearranging filter */
  2787.     filt = LD_SH(filter_horiz);
  2788.     filt_hz = (v16u8) __msa_splati_h(filt, 0);
  2789.  
  2790.     filt = LD_SH(filter_vert);
  2791.     filt_vt = (v16u8) __msa_splati_h(filt, 0);
  2792.  
  2793.     LD_SB2(src, 8, src0, src1);
  2794.     src += src_stride;
  2795.  
  2796.     hz_out0 = HORIZ_2TAP_FILT_UH(src0, src0, mask, filt_hz, 7);
  2797.     hz_out2 = HORIZ_2TAP_FILT_UH(src1, src1, mask, filt_hz, 7);
  2798.  
  2799.  
  2800.     for (loop_cnt = (height >> 2); loop_cnt--;) {
  2801.         LD_SB4(src, src_stride, src0, src2, src4, src6);
  2802.         LD_SB4(src + 8, src_stride, src1, src3, src5, src7);
  2803.         src += (4 * src_stride);
  2804.  
  2805.         hz_out1 = HORIZ_2TAP_FILT_UH(src0, src0, mask, filt_hz, 7);
  2806.         hz_out3 = HORIZ_2TAP_FILT_UH(src1, src1, mask, filt_hz, 7);
  2807.         ILVEV_B2_UB(hz_out0, hz_out1, hz_out2, hz_out3, vec0, vec1);
  2808.         DOTP_UB2_UH(vec0, vec1, filt_vt, filt_vt, tmp1, tmp2);
  2809.         SRARI_H2_UH(tmp1, tmp2, 7);
  2810.         SAT_UH2_UH(tmp1, tmp2, 7);
  2811.         PCKEV_ST_SB(tmp1, tmp2, dst);
  2812.         dst += dst_stride;
  2813.  
  2814.         hz_out0 = HORIZ_2TAP_FILT_UH(src2, src2, mask, filt_hz, 7);
  2815.         hz_out2 = HORIZ_2TAP_FILT_UH(src3, src3, mask, filt_hz, 7);
  2816.         ILVEV_B2_UB(hz_out1, hz_out0, hz_out3, hz_out2, vec0, vec1);
  2817.         DOTP_UB2_UH(vec0, vec1, filt_vt, filt_vt, tmp1, tmp2);
  2818.         SRARI_H2_UH(tmp1, tmp2, 7);
  2819.         SAT_UH2_UH(tmp1, tmp2, 7);
  2820.         PCKEV_ST_SB(tmp1, tmp2, dst);
  2821.         dst += dst_stride;
  2822.  
  2823.         hz_out1 = HORIZ_2TAP_FILT_UH(src4, src4, mask, filt_hz, 7);
  2824.         hz_out3 = HORIZ_2TAP_FILT_UH(src5, src5, mask, filt_hz, 7);
  2825.         ILVEV_B2_UB(hz_out0, hz_out1, hz_out2, hz_out3, vec0, vec1);
  2826.         DOTP_UB2_UH(vec0, vec1, filt_vt, filt_vt, tmp1, tmp2);
  2827.         SRARI_H2_UH(tmp1, tmp2, 7);
  2828.         SAT_UH2_UH(tmp1, tmp2, 7);
  2829.         PCKEV_ST_SB(tmp1, tmp2, dst);
  2830.         dst += dst_stride;
  2831.  
  2832.         hz_out0 = HORIZ_2TAP_FILT_UH(src6, src6, mask, filt_hz, 7);
  2833.         hz_out2 = HORIZ_2TAP_FILT_UH(src7, src7, mask, filt_hz, 7);
  2834.         ILVEV_B2_UB(hz_out1, hz_out0, hz_out3, hz_out2, vec0, vec1);
  2835.         DOTP_UB2_UH(vec0, vec1, filt_vt, filt_vt, tmp1, tmp2);
  2836.         SRARI_H2_UH(tmp1, tmp2, 7);
  2837.         SAT_UH2_UH(tmp1, tmp2, 7);
  2838.         PCKEV_ST_SB(tmp1, tmp2, dst);
  2839.         dst += dst_stride;
  2840.     }
  2841. }
  2842.  
  2843. void ff_put_bilin_32hv_msa(uint8_t *dst, ptrdiff_t dst_stride,
  2844.                            const uint8_t *src, ptrdiff_t src_stride,
  2845.                            int height, int mx, int my)
  2846. {
  2847.     int32_t multiple8_cnt;
  2848.  
  2849.     for (multiple8_cnt = 2; multiple8_cnt--;) {
  2850.         ff_put_bilin_16hv_msa(dst, dst_stride, src, src_stride, height, mx, my);
  2851.  
  2852.         src += 16;
  2853.         dst += 16;
  2854.     }
  2855. }
  2856.  
  2857. void ff_put_bilin_64hv_msa(uint8_t *dst, ptrdiff_t dst_stride,
  2858.                            const uint8_t *src, ptrdiff_t src_stride,
  2859.                            int height, int mx, int my)
  2860. {
  2861.     int32_t multiple8_cnt;
  2862.  
  2863.     for (multiple8_cnt = 4; multiple8_cnt--;) {
  2864.         ff_put_bilin_16hv_msa(dst, dst_stride, src, src_stride, height, mx, my);
  2865.  
  2866.         src += 16;
  2867.         dst += 16;
  2868.     }
  2869. }
  2870.  
  2871. static void common_hz_2t_and_aver_dst_4x4_msa(const uint8_t *src,
  2872.                                               int32_t src_stride,
  2873.                                               uint8_t *dst, int32_t dst_stride,
  2874.                                               const int8_t *filter)
  2875. {
  2876.     v16i8 src0, src1, src2, src3, mask;
  2877.     v16u8 filt0, dst0, dst1, dst2, dst3, vec0, vec1, res0, res1;
  2878.     v8u16 vec2, vec3, filt;
  2879.  
  2880.     mask = LD_SB(&mc_filt_mask_arr[16]);
  2881.  
  2882.     /* rearranging filter */
  2883.     filt = LD_UH(filter);
  2884.     filt0 = (v16u8) __msa_splati_h((v8i16) filt, 0);
  2885.  
  2886.     LD_SB4(src, src_stride, src0, src1, src2, src3);
  2887.     LD_UB4(dst, dst_stride, dst0, dst1, dst2, dst3);
  2888.     VSHF_B2_UB(src0, src1, src2, src3, mask, mask, vec0, vec1);
  2889.     DOTP_UB2_UH(vec0, vec1, filt0, filt0, vec2, vec3);
  2890.     SRARI_H2_UH(vec2, vec3, 7);
  2891.     PCKEV_B2_UB(vec2, vec2, vec3, vec3, res0, res1);
  2892.     ILVR_W2_UB(dst1, dst0, dst3, dst2, dst0, dst2);
  2893.     AVER_UB2_UB(res0, dst0, res1, dst2, res0, res1);
  2894.     ST4x4_UB(res0, res1, 0, 1, 0, 1, dst, dst_stride);
  2895. }
  2896.  
  2897. static void common_hz_2t_and_aver_dst_4x8_msa(const uint8_t *src,
  2898.                                               int32_t src_stride,
  2899.                                               uint8_t *dst, int32_t dst_stride,
  2900.                                               const int8_t *filter)
  2901. {
  2902.     v16i8 src0, src1, src2, src3, src4, src5, src6, src7, mask;
  2903.     v16u8 filt0, vec0, vec1, vec2, vec3, res0, res1, res2, res3;
  2904.     v16u8 dst0, dst1, dst2, dst3, dst4, dst5, dst6, dst7;
  2905.     v8u16 vec4, vec5, vec6, vec7, filt;
  2906.  
  2907.     mask = LD_SB(&mc_filt_mask_arr[16]);
  2908.  
  2909.     /* rearranging filter */
  2910.     filt = LD_UH(filter);
  2911.     filt0 = (v16u8) __msa_splati_h((v8i16) filt, 0);
  2912.  
  2913.     LD_SB8(src, src_stride, src0, src1, src2, src3, src4, src5, src6, src7);
  2914.     LD_UB8(dst, dst_stride, dst0, dst1, dst2, dst3, dst4, dst5, dst6, dst7);
  2915.     VSHF_B2_UB(src0, src1, src2, src3, mask, mask, vec0, vec1);
  2916.     VSHF_B2_UB(src4, src5, src6, src7, mask, mask, vec2, vec3);
  2917.     DOTP_UB4_UH(vec0, vec1, vec2, vec3, filt0, filt0, filt0, filt0, vec4, vec5,
  2918.                 vec6, vec7);
  2919.     SRARI_H4_UH(vec4, vec5, vec6, vec7, 7);
  2920.     PCKEV_B4_UB(vec4, vec4, vec5, vec5, vec6, vec6, vec7, vec7, res0, res1,
  2921.                 res2, res3);
  2922.     ILVR_W4_UB(dst1, dst0, dst3, dst2, dst5, dst4, dst7, dst6, dst0, dst2,
  2923.                dst4, dst6);
  2924.     AVER_UB4_UB(res0, dst0, res1, dst2, res2, dst4, res3, dst6, res0, res1,
  2925.                 res2, res3);
  2926.     ST4x4_UB(res0, res1, 0, 1, 0, 1, dst, dst_stride);
  2927.     dst += (4 * dst_stride);
  2928.     ST4x4_UB(res2, res3, 0, 1, 0, 1, dst, dst_stride);
  2929. }
  2930.  
  2931. void ff_avg_bilin_4h_msa(uint8_t *dst, ptrdiff_t dst_stride,
  2932.                          const uint8_t *src, ptrdiff_t src_stride,
  2933.                          int height, int mx, int my)
  2934. {
  2935.     const int8_t *filter = vp9_bilinear_filters_msa[mx - 1];
  2936.  
  2937.     if (4 == height) {
  2938.         common_hz_2t_and_aver_dst_4x4_msa(src, src_stride, dst, dst_stride,
  2939.                                           filter);
  2940.     } else if (8 == height) {
  2941.         common_hz_2t_and_aver_dst_4x8_msa(src, src_stride, dst, dst_stride,
  2942.                                           filter);
  2943.     }
  2944. }
  2945.  
  2946. static void common_hz_2t_and_aver_dst_8x4_msa(const uint8_t *src,
  2947.                                               int32_t src_stride,
  2948.                                               uint8_t *dst, int32_t dst_stride,
  2949.                                               const int8_t *filter)
  2950. {
  2951.     v16i8 src0, src1, src2, src3, mask;
  2952.     v16u8 filt0, dst0, dst1, dst2, dst3;
  2953.     v8u16 vec0, vec1, vec2, vec3, filt;
  2954.  
  2955.     mask = LD_SB(&mc_filt_mask_arr[0]);
  2956.  
  2957.     /* rearranging filter */
  2958.     filt = LD_UH(filter);
  2959.     filt0 = (v16u8) __msa_splati_h((v8i16) filt, 0);
  2960.  
  2961.     LD_SB4(src, src_stride, src0, src1, src2, src3);
  2962.     VSHF_B2_UH(src0, src0, src1, src1, mask, mask, vec0, vec1);
  2963.     VSHF_B2_UH(src2, src2, src3, src3, mask, mask, vec2, vec3);
  2964.     DOTP_UB4_UH(vec0, vec1, vec2, vec3, filt0, filt0, filt0, filt0,
  2965.                 vec0, vec1, vec2, vec3);
  2966.     SRARI_H4_UH(vec0, vec1, vec2, vec3, 7);
  2967.     LD_UB4(dst, dst_stride, dst0, dst1, dst2, dst3);
  2968.     PCKEV_AVG_ST8x4_UB(vec0, dst0, vec1, dst1, vec2, dst2, vec3, dst3,
  2969.                        dst, dst_stride);
  2970. }
  2971.  
  2972. static void common_hz_2t_and_aver_dst_8x8mult_msa(const uint8_t *src,
  2973.                                                   int32_t src_stride,
  2974.                                                   uint8_t *dst,
  2975.                                                   int32_t dst_stride,
  2976.                                                   const int8_t *filter,
  2977.                                                   int32_t height)
  2978. {
  2979.     v16i8 src0, src1, src2, src3, mask;
  2980.     v16u8 filt0, dst0, dst1, dst2, dst3;
  2981.     v8u16 vec0, vec1, vec2, vec3, filt;
  2982.  
  2983.     mask = LD_SB(&mc_filt_mask_arr[0]);
  2984.  
  2985.     /* rearranging filter */
  2986.     filt = LD_UH(filter);
  2987.     filt0 = (v16u8) __msa_splati_h((v8i16) filt, 0);
  2988.  
  2989.     LD_SB4(src, src_stride, src0, src1, src2, src3);
  2990.     src += (4 * src_stride);
  2991.     VSHF_B2_UH(src0, src0, src1, src1, mask, mask, vec0, vec1);
  2992.     VSHF_B2_UH(src2, src2, src3, src3, mask, mask, vec2, vec3);
  2993.     DOTP_UB4_UH(vec0, vec1, vec2, vec3, filt0, filt0, filt0, filt0, vec0, vec1,
  2994.                 vec2, vec3);
  2995.     SRARI_H4_UH(vec0, vec1, vec2, vec3, 7);
  2996.     LD_UB4(dst, dst_stride, dst0, dst1, dst2, dst3);
  2997.     LD_SB4(src, src_stride, src0, src1, src2, src3);
  2998.     src += (4 * src_stride);
  2999.     PCKEV_AVG_ST8x4_UB(vec0, dst0, vec1, dst1, vec2, dst2, vec3, dst3,
  3000.                        dst, dst_stride);
  3001.     dst += (4 * dst_stride);
  3002.  
  3003.     VSHF_B2_UH(src0, src0, src1, src1, mask, mask, vec0, vec1);
  3004.     VSHF_B2_UH(src2, src2, src3, src3, mask, mask, vec2, vec3);
  3005.     DOTP_UB4_UH(vec0, vec1, vec2, vec3, filt0, filt0, filt0, filt0, vec0, vec1,
  3006.                 vec2, vec3);
  3007.     SRARI_H4_UH(vec0, vec1, vec2, vec3, 7);
  3008.     LD_UB4(dst, dst_stride, dst0, dst1, dst2, dst3);
  3009.     PCKEV_AVG_ST8x4_UB(vec0, dst0, vec1, dst1, vec2, dst2, vec3, dst3,
  3010.                        dst, dst_stride);
  3011.     dst += (4 * dst_stride);
  3012.  
  3013.     if (16 == height) {
  3014.         LD_SB4(src, src_stride, src0, src1, src2, src3);
  3015.         src += (4 * src_stride);
  3016.  
  3017.         VSHF_B2_UH(src0, src0, src1, src1, mask, mask, vec0, vec1);
  3018.         VSHF_B2_UH(src2, src2, src3, src3, mask, mask, vec2, vec3);
  3019.         DOTP_UB4_UH(vec0, vec1, vec2, vec3, filt0, filt0, filt0, filt0, vec0,
  3020.                     vec1, vec2, vec3);
  3021.         SRARI_H4_UH(vec0, vec1, vec2, vec3, 7);
  3022.         LD_UB4(dst, dst_stride, dst0, dst1, dst2, dst3);
  3023.         LD_SB4(src, src_stride, src0, src1, src2, src3);
  3024.         PCKEV_AVG_ST8x4_UB(vec0, dst0, vec1, dst1, vec2, dst2, vec3, dst3,
  3025.                            dst, dst_stride);
  3026.         dst += (4 * dst_stride);
  3027.  
  3028.         VSHF_B2_UH(src0, src0, src1, src1, mask, mask, vec0, vec1);
  3029.         VSHF_B2_UH(src2, src2, src3, src3, mask, mask, vec2, vec3);
  3030.         DOTP_UB4_UH(vec0, vec1, vec2, vec3, filt0, filt0, filt0, filt0, vec0,
  3031.                     vec1, vec2, vec3);
  3032.         SRARI_H4_UH(vec0, vec1, vec2, vec3, 7);
  3033.         LD_UB4(dst, dst_stride, dst0, dst1, dst2, dst3);
  3034.         PCKEV_AVG_ST8x4_UB(vec0, dst0, vec1, dst1, vec2, dst2, vec3, dst3,
  3035.                            dst, dst_stride);
  3036.     }
  3037. }
  3038.  
  3039. void ff_avg_bilin_8h_msa(uint8_t *dst, ptrdiff_t dst_stride,
  3040.                          const uint8_t *src, ptrdiff_t src_stride,
  3041.                          int height, int mx, int my)
  3042. {
  3043.     const int8_t *filter = vp9_bilinear_filters_msa[mx - 1];
  3044.  
  3045.     if (4 == height) {
  3046.         common_hz_2t_and_aver_dst_8x4_msa(src, src_stride, dst, dst_stride,
  3047.                                           filter);
  3048.     } else {
  3049.         common_hz_2t_and_aver_dst_8x8mult_msa(src, src_stride, dst, dst_stride,
  3050.                                               filter, height);
  3051.     }
  3052. }
  3053.  
  3054. void ff_avg_bilin_16h_msa(uint8_t *dst, ptrdiff_t dst_stride,
  3055.                           const uint8_t *src, ptrdiff_t src_stride,
  3056.                           int height, int mx, int my)
  3057. {
  3058.     uint32_t loop_cnt;
  3059.     const int8_t *filter = vp9_bilinear_filters_msa[mx - 1];
  3060.     v16i8 src0, src1, src2, src3, src4, src5, src6, src7, mask;
  3061.     v16u8 filt0, dst0, dst1, dst2, dst3;
  3062.     v16u8 vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7;
  3063.     v8u16 res0, res1, res2, res3, res4, res5, res6, res7, filt;
  3064.  
  3065.     mask = LD_SB(&mc_filt_mask_arr[0]);
  3066.  
  3067.     /* rearranging filter */
  3068.     filt = LD_UH(filter);
  3069.     filt0 = (v16u8) __msa_splati_h((v8i16) filt, 0);
  3070.  
  3071.     LD_SB4(src, src_stride, src0, src2, src4, src6);
  3072.     LD_SB4(src + 8, src_stride, src1, src3, src5, src7);
  3073.     src += (4 * src_stride);
  3074.  
  3075.     VSHF_B2_UB(src0, src0, src1, src1, mask, mask, vec0, vec1);
  3076.     VSHF_B2_UB(src2, src2, src3, src3, mask, mask, vec2, vec3);
  3077.     VSHF_B2_UB(src4, src4, src5, src5, mask, mask, vec4, vec5);
  3078.     VSHF_B2_UB(src6, src6, src7, src7, mask, mask, vec6, vec7);
  3079.     DOTP_UB4_UH(vec0, vec1, vec2, vec3, filt0, filt0, filt0, filt0, res0, res1,
  3080.                 res2, res3);
  3081.     DOTP_UB4_UH(vec4, vec5, vec6, vec7, filt0, filt0, filt0, filt0, res4, res5,
  3082.                 res6, res7);
  3083.     SRARI_H4_UH(res0, res1, res2, res3, 7);
  3084.     SRARI_H4_UH(res4, res5, res6, res7, 7);
  3085.     LD_UB4(dst, dst_stride, dst0, dst1, dst2, dst3);
  3086.     PCKEV_AVG_ST_UB(res1, res0, dst0, dst);
  3087.     dst += dst_stride;
  3088.     PCKEV_AVG_ST_UB(res3, res2, dst1, dst);
  3089.     dst += dst_stride;
  3090.     PCKEV_AVG_ST_UB(res5, res4, dst2, dst);
  3091.     dst += dst_stride;
  3092.     PCKEV_AVG_ST_UB(res7, res6, dst3, dst);
  3093.     dst += dst_stride;
  3094.  
  3095.     for (loop_cnt = (height >> 2) - 1; loop_cnt--;) {
  3096.         LD_SB4(src, src_stride, src0, src2, src4, src6);
  3097.         LD_SB4(src + 8, src_stride, src1, src3, src5, src7);
  3098.         src += (4 * src_stride);
  3099.  
  3100.         VSHF_B2_UB(src0, src0, src1, src1, mask, mask, vec0, vec1);
  3101.         VSHF_B2_UB(src2, src2, src3, src3, mask, mask, vec2, vec3);
  3102.         VSHF_B2_UB(src4, src4, src5, src5, mask, mask, vec4, vec5);
  3103.         VSHF_B2_UB(src6, src6, src7, src7, mask, mask, vec6, vec7);
  3104.         DOTP_UB4_UH(vec0, vec1, vec2, vec3, filt0, filt0, filt0, filt0, res0,
  3105.                     res1, res2, res3);
  3106.         DOTP_UB4_UH(vec4, vec5, vec6, vec7, filt0, filt0, filt0, filt0, res4,
  3107.                     res5, res6, res7);
  3108.         SRARI_H4_UH(res0, res1, res2, res3, 7);
  3109.         SRARI_H4_UH(res4, res5, res6, res7, 7);
  3110.         LD_UB4(dst, dst_stride, dst0, dst1, dst2, dst3);
  3111.         PCKEV_AVG_ST_UB(res1, res0, dst0, dst);
  3112.         dst += dst_stride;
  3113.         PCKEV_AVG_ST_UB(res3, res2, dst1, dst);
  3114.         dst += dst_stride;
  3115.         PCKEV_AVG_ST_UB(res5, res4, dst2, dst);
  3116.         dst += dst_stride;
  3117.         PCKEV_AVG_ST_UB(res7, res6, dst3, dst);
  3118.         dst += dst_stride;
  3119.     }
  3120. }
  3121.  
  3122. void ff_avg_bilin_32h_msa(uint8_t *dst, ptrdiff_t dst_stride,
  3123.                           const uint8_t *src, ptrdiff_t src_stride,
  3124.                           int height, int mx, int my)
  3125. {
  3126.     uint32_t loop_cnt;
  3127.     const int8_t *filter = vp9_bilinear_filters_msa[mx - 1];
  3128.     v16i8 src0, src1, src2, src3, src4, src5, src6, src7, mask;
  3129.     v16u8 filt0, dst0, dst1, dst2, dst3;
  3130.     v16u8 vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7;
  3131.     v8u16 res0, res1, res2, res3, res4, res5, res6, res7, filt;
  3132.  
  3133.     mask = LD_SB(&mc_filt_mask_arr[0]);
  3134.  
  3135.     /* rearranging filter */
  3136.     filt = LD_UH(filter);
  3137.     filt0 = (v16u8) __msa_splati_h((v8i16) filt, 0);
  3138.  
  3139.     for (loop_cnt = (height >> 1); loop_cnt--;) {
  3140.         src0 = LD_SB(src);
  3141.         src2 = LD_SB(src + 16);
  3142.         src3 = LD_SB(src + 24);
  3143.         src1 = __msa_sldi_b(src2, src0, 8);
  3144.         src += src_stride;
  3145.         src4 = LD_SB(src);
  3146.         src6 = LD_SB(src + 16);
  3147.         src7 = LD_SB(src + 24);
  3148.         src5 = __msa_sldi_b(src6, src4, 8);
  3149.         src += src_stride;
  3150.  
  3151.         VSHF_B2_UB(src0, src0, src1, src1, mask, mask, vec0, vec1);
  3152.         VSHF_B2_UB(src2, src2, src3, src3, mask, mask, vec2, vec3);
  3153.         VSHF_B2_UB(src4, src4, src5, src5, mask, mask, vec4, vec5);
  3154.         VSHF_B2_UB(src6, src6, src7, src7, mask, mask, vec6, vec7);
  3155.         DOTP_UB4_UH(vec0, vec1, vec2, vec3, filt0, filt0, filt0, filt0,
  3156.                     res0, res1, res2, res3);
  3157.         DOTP_UB4_UH(vec4, vec5, vec6, vec7, filt0, filt0, filt0, filt0,
  3158.                     res4, res5, res6, res7);
  3159.         SRARI_H4_UH(res0, res1, res2, res3, 7);
  3160.         SRARI_H4_UH(res4, res5, res6, res7, 7);
  3161.         LD_UB2(dst, 16, dst0, dst1);
  3162.         PCKEV_AVG_ST_UB(res1, res0, dst0, dst);
  3163.         PCKEV_AVG_ST_UB(res3, res2, dst1, (dst + 16));
  3164.         dst += dst_stride;
  3165.         LD_UB2(dst, 16, dst2, dst3);
  3166.         PCKEV_AVG_ST_UB(res5, res4, dst2, dst);
  3167.         PCKEV_AVG_ST_UB(res7, res6, dst3, (dst + 16));
  3168.         dst += dst_stride;
  3169.     }
  3170. }
  3171.  
  3172. void ff_avg_bilin_64h_msa(uint8_t *dst, ptrdiff_t dst_stride,
  3173.                           const uint8_t *src, ptrdiff_t src_stride,
  3174.                           int height, int mx, int my)
  3175. {
  3176.     uint32_t loop_cnt;
  3177.     const int8_t *filter = vp9_bilinear_filters_msa[mx - 1];
  3178.     v16i8 src0, src1, src2, src3, src4, src5, src6, src7, mask;
  3179.     v16u8 filt0, dst0, dst1, dst2, dst3;
  3180.     v16u8 vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7;
  3181.     v8u16 out0, out1, out2, out3, out4, out5, out6, out7, filt;
  3182.  
  3183.     mask = LD_SB(&mc_filt_mask_arr[0]);
  3184.  
  3185.     /* rearranging filter */
  3186.     filt = LD_UH(filter);
  3187.     filt0 = (v16u8) __msa_splati_h((v8i16) filt, 0);
  3188.  
  3189.     for (loop_cnt = height; loop_cnt--;) {
  3190.         LD_SB4(src, 16, src0, src2, src4, src6);
  3191.         src7 = LD_SB(src + 56);
  3192.         SLDI_B3_SB(src2, src4, src6, src0, src2, src4, src1, src3, src5, 8);
  3193.         src += src_stride;
  3194.  
  3195.         VSHF_B2_UB(src0, src0, src1, src1, mask, mask, vec0, vec1);
  3196.         VSHF_B2_UB(src2, src2, src3, src3, mask, mask, vec2, vec3);
  3197.         VSHF_B2_UB(src4, src4, src5, src5, mask, mask, vec4, vec5);
  3198.         VSHF_B2_UB(src6, src6, src7, src7, mask, mask, vec6, vec7);
  3199.         DOTP_UB4_UH(vec0, vec1, vec2, vec3, filt0, filt0, filt0, filt0,
  3200.                     out0, out1, out2, out3);
  3201.         DOTP_UB4_UH(vec4, vec5, vec6, vec7, filt0, filt0, filt0, filt0,
  3202.                     out4, out5, out6, out7);
  3203.         SRARI_H4_UH(out0, out1, out2, out3, 7);
  3204.         SRARI_H4_UH(out4, out5, out6, out7, 7);
  3205.         LD_UB4(dst, 16, dst0, dst1, dst2, dst3);
  3206.         PCKEV_AVG_ST_UB(out1, out0, dst0, dst);
  3207.         PCKEV_AVG_ST_UB(out3, out2, dst1, dst + 16);
  3208.         PCKEV_AVG_ST_UB(out5, out4, dst2, dst + 32);
  3209.         PCKEV_AVG_ST_UB(out7, out6, dst3, dst + 48);
  3210.         dst += dst_stride;
  3211.     }
  3212. }
  3213.  
  3214. static void common_vt_2t_and_aver_dst_4x4_msa(const uint8_t *src,
  3215.                                               int32_t src_stride,
  3216.                                               uint8_t *dst, int32_t dst_stride,
  3217.                                               const int8_t *filter)
  3218. {
  3219.     v16i8 src0, src1, src2, src3, src4;
  3220.     v16u8 dst0, dst1, dst2, dst3, out, filt0, src2110, src4332;
  3221.     v16i8 src10_r, src32_r, src21_r, src43_r;
  3222.     v8i16 filt;
  3223.     v8u16 tmp0, tmp1;
  3224.  
  3225.     filt = LD_SH(filter);
  3226.     filt0 = (v16u8) __msa_splati_h(filt, 0);
  3227.  
  3228.     LD_SB4(src, src_stride, src0, src1, src2, src3);
  3229.     src += (4 * src_stride);
  3230.  
  3231.     src4 = LD_SB(src);
  3232.     src += src_stride;
  3233.  
  3234.     LD_UB4(dst, dst_stride, dst0, dst1, dst2, dst3);
  3235.     ILVR_W2_UB(dst1, dst0, dst3, dst2, dst0, dst1);
  3236.     dst0 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
  3237.     ILVR_B4_SB(src1, src0, src2, src1, src3, src2, src4, src3,
  3238.                src10_r, src21_r, src32_r, src43_r);
  3239.     ILVR_D2_UB(src21_r, src10_r, src43_r, src32_r, src2110, src4332);
  3240.     DOTP_UB2_UH(src2110, src4332, filt0, filt0, tmp0, tmp1);
  3241.     SRARI_H2_UH(tmp0, tmp1, 7);
  3242.     SAT_UH2_UH(tmp0, tmp1, 7);
  3243.  
  3244.     out = (v16u8) __msa_pckev_b((v16i8) tmp1, (v16i8) tmp0);
  3245.     out = __msa_aver_u_b(out, dst0);
  3246.  
  3247.     ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
  3248. }
  3249.  
  3250. static void common_vt_2t_and_aver_dst_4x8_msa(const uint8_t *src,
  3251.                                               int32_t src_stride,
  3252.                                               uint8_t *dst, int32_t dst_stride,
  3253.                                               const int8_t *filter)
  3254. {
  3255.     v16u8 dst0, dst1, dst2, dst3, dst4, dst5, dst6, dst7;
  3256.     v16i8 src0, src1, src2, src3, src4, src5, src6, src7, src8, src87_r;
  3257.     v16i8 src10_r, src32_r, src54_r, src76_r, src21_r, src43_r, src65_r;
  3258.     v16u8 src2110, src4332, src6554, src8776, filt0;
  3259.     v8u16 tmp0, tmp1, tmp2, tmp3;
  3260.     v8i16 filt;
  3261.  
  3262.     filt = LD_SH(filter);
  3263.     filt0 = (v16u8) __msa_splati_h(filt, 0);
  3264.  
  3265.     LD_SB8(src, src_stride, src0, src1, src2, src3, src4, src5, src6, src7);
  3266.     src += (8 * src_stride);
  3267.     src8 = LD_SB(src);
  3268.  
  3269.     LD_UB8(dst, dst_stride, dst0, dst1, dst2, dst3, dst4, dst5, dst6, dst7);
  3270.     ILVR_W4_UB(dst1, dst0, dst3, dst2, dst5, dst4, dst7, dst6, dst0, dst1,
  3271.                dst2, dst3);
  3272.     ILVR_D2_UB(dst1, dst0, dst3, dst2, dst0, dst1);
  3273.     ILVR_B4_SB(src1, src0, src2, src1, src3, src2, src4, src3, src10_r, src21_r,
  3274.                src32_r, src43_r);
  3275.     ILVR_B4_SB(src5, src4, src6, src5, src7, src6, src8, src7, src54_r, src65_r,
  3276.                src76_r, src87_r);
  3277.     ILVR_D4_UB(src21_r, src10_r, src43_r, src32_r, src65_r, src54_r,
  3278.                src87_r, src76_r, src2110, src4332, src6554, src8776);
  3279.     DOTP_UB4_UH(src2110, src4332, src6554, src8776, filt0, filt0, filt0, filt0,
  3280.                 tmp0, tmp1, tmp2, tmp3);
  3281.     SRARI_H4_UH(tmp0, tmp1, tmp2, tmp3, 7);
  3282.     SAT_UH4_UH(tmp0, tmp1, tmp2, tmp3, 7);
  3283.     PCKEV_B2_UB(tmp1, tmp0, tmp3, tmp2, src2110, src4332);
  3284.     AVER_UB2_UB(src2110, dst0, src4332, dst1, src2110, src4332);
  3285.     ST4x4_UB(src2110, src2110, 0, 1, 2, 3, dst, dst_stride);
  3286.     dst += (4 * dst_stride);
  3287.     ST4x4_UB(src4332, src4332, 0, 1, 2, 3, dst, dst_stride);
  3288. }
  3289.  
  3290. void ff_avg_bilin_4v_msa(uint8_t *dst, ptrdiff_t dst_stride,
  3291.                          const uint8_t *src, ptrdiff_t src_stride,
  3292.                          int height, int mx, int my)
  3293. {
  3294.     const int8_t *filter = vp9_bilinear_filters_msa[my - 1];
  3295.  
  3296.     if (4 == height) {
  3297.         common_vt_2t_and_aver_dst_4x4_msa(src, src_stride, dst, dst_stride,
  3298.                                           filter);
  3299.     } else if (8 == height) {
  3300.         common_vt_2t_and_aver_dst_4x8_msa(src, src_stride, dst, dst_stride,
  3301.                                           filter);
  3302.     }
  3303. }
  3304.  
  3305. static void common_vt_2t_and_aver_dst_8x4_msa(const uint8_t *src,
  3306.                                               int32_t src_stride,
  3307.                                               uint8_t *dst,
  3308.                                               int32_t dst_stride,
  3309.                                               const int8_t *filter)
  3310. {
  3311.     v16u8 src0, src1, src2, src3, src4;
  3312.     v16u8 dst0, dst1, dst2, dst3, vec0, vec1, vec2, vec3, filt0;
  3313.     v8u16 tmp0, tmp1, tmp2, tmp3;
  3314.     v8i16 filt;
  3315.  
  3316.     /* rearranging filter_y */
  3317.     filt = LD_SH(filter);
  3318.     filt0 = (v16u8) __msa_splati_h(filt, 0);
  3319.  
  3320.     LD_UB5(src, src_stride, src0, src1, src2, src3, src4);
  3321.     LD_UB4(dst, dst_stride, dst0, dst1, dst2, dst3);
  3322.     ILVR_B2_UB(src1, src0, src2, src1, vec0, vec1);
  3323.     ILVR_B2_UB(src3, src2, src4, src3, vec2, vec3);
  3324.     DOTP_UB4_UH(vec0, vec1, vec2, vec3, filt0, filt0, filt0, filt0,
  3325.                 tmp0, tmp1, tmp2, tmp3);
  3326.     SRARI_H4_UH(tmp0, tmp1, tmp2, tmp3, 7);
  3327.     SAT_UH4_UH(tmp0, tmp1, tmp2, tmp3, 7);
  3328.     PCKEV_AVG_ST8x4_UB(tmp0, dst0, tmp1, dst1, tmp2, dst2, tmp3, dst3,
  3329.                        dst, dst_stride);
  3330. }
  3331.  
  3332. static void common_vt_2t_and_aver_dst_8x8mult_msa(const uint8_t *src,
  3333.                                                   int32_t src_stride,
  3334.                                                   uint8_t *dst,
  3335.                                                   int32_t dst_stride,
  3336.                                                   const int8_t *filter,
  3337.                                                   int32_t height)
  3338. {
  3339.     uint32_t loop_cnt;
  3340.     v16u8 src0, src1, src2, src3, src4, src5, src6, src7, src8;
  3341.     v16u8 dst1, dst2, dst3, dst4, dst5, dst6, dst7, dst8;
  3342.     v16u8 vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7, filt0;
  3343.     v8u16 tmp0, tmp1, tmp2, tmp3;
  3344.     v8i16 filt;
  3345.  
  3346.     /* rearranging filter_y */
  3347.     filt = LD_SH(filter);
  3348.     filt0 = (v16u8) __msa_splati_h(filt, 0);
  3349.  
  3350.     src0 = LD_UB(src);
  3351.     src += src_stride;
  3352.  
  3353.     for (loop_cnt = (height >> 3); loop_cnt--;) {
  3354.         LD_UB8(src, src_stride, src1, src2, src3, src4, src5, src6, src7, src8);
  3355.         src += (8 * src_stride);
  3356.         LD_UB8(dst, dst_stride, dst1, dst2, dst3, dst4, dst5, dst6, dst7, dst8);
  3357.  
  3358.         ILVR_B4_UB(src1, src0, src2, src1, src3, src2, src4, src3,
  3359.                    vec0, vec1, vec2, vec3);
  3360.         ILVR_B4_UB(src5, src4, src6, src5, src7, src6, src8, src7,
  3361.                    vec4, vec5, vec6, vec7);
  3362.         DOTP_UB4_UH(vec0, vec1, vec2, vec3, filt0, filt0, filt0, filt0,
  3363.                     tmp0, tmp1, tmp2, tmp3);
  3364.         SRARI_H4_UH(tmp0, tmp1, tmp2, tmp3, 7);
  3365.         SAT_UH4_UH(tmp0, tmp1, tmp2, tmp3, 7);
  3366.         PCKEV_AVG_ST8x4_UB(tmp0, dst1, tmp1, dst2, tmp2, dst3, tmp3,
  3367.                            dst4, dst, dst_stride);
  3368.         dst += (4 * dst_stride);
  3369.  
  3370.         DOTP_UB4_UH(vec4, vec5, vec6, vec7, filt0, filt0, filt0, filt0,
  3371.                     tmp0, tmp1, tmp2, tmp3);
  3372.         SRARI_H4_UH(tmp0, tmp1, tmp2, tmp3, 7);
  3373.         SAT_UH4_UH(tmp0, tmp1, tmp2, tmp3, 7);
  3374.         PCKEV_AVG_ST8x4_UB(tmp0, dst5, tmp1, dst6, tmp2, dst7, tmp3,
  3375.                            dst8, dst, dst_stride);
  3376.         dst += (4 * dst_stride);
  3377.  
  3378.         src0 = src8;
  3379.     }
  3380. }
  3381.  
  3382. void ff_avg_bilin_8v_msa(uint8_t *dst, ptrdiff_t dst_stride,
  3383.                          const uint8_t *src, ptrdiff_t src_stride,
  3384.                          int height, int mx, int my)
  3385. {
  3386.     const int8_t *filter = vp9_bilinear_filters_msa[my - 1];
  3387.  
  3388.     if (4 == height) {
  3389.         common_vt_2t_and_aver_dst_8x4_msa(src, src_stride, dst, dst_stride,
  3390.                                           filter);
  3391.     } else {
  3392.         common_vt_2t_and_aver_dst_8x8mult_msa(src, src_stride, dst, dst_stride,
  3393.                                               filter, height);
  3394.     }
  3395. }
  3396.  
  3397. void ff_avg_bilin_16v_msa(uint8_t *dst, ptrdiff_t dst_stride,
  3398.                           const uint8_t *src, ptrdiff_t src_stride,
  3399.                           int height, int mx, int my)
  3400. {
  3401.     uint32_t loop_cnt;
  3402.     const int8_t *filter = vp9_bilinear_filters_msa[my - 1];
  3403.     v16u8 src0, src1, src2, src3, src4, dst0, dst1, dst2, dst3, filt0;
  3404.     v16u8 vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7;
  3405.     v8u16 tmp0, tmp1, tmp2, tmp3, filt;
  3406.  
  3407.     /* rearranging filter_y */
  3408.     filt = LD_UH(filter);
  3409.     filt0 = (v16u8) __msa_splati_h((v8i16) filt, 0);
  3410.  
  3411.     src0 = LD_UB(src);
  3412.     src += src_stride;
  3413.  
  3414.     for (loop_cnt = (height >> 2); loop_cnt--;) {
  3415.         LD_UB4(src, src_stride, src1, src2, src3, src4);
  3416.         src += (4 * src_stride);
  3417.  
  3418.         LD_UB4(dst, dst_stride, dst0, dst1, dst2, dst3);
  3419.         ILVR_B2_UB(src1, src0, src2, src1, vec0, vec2);
  3420.         ILVL_B2_UB(src1, src0, src2, src1, vec1, vec3);
  3421.         DOTP_UB2_UH(vec0, vec1, filt0, filt0, tmp0, tmp1);
  3422.         SRARI_H2_UH(tmp0, tmp1, 7);
  3423.         SAT_UH2_UH(tmp0, tmp1, 7);
  3424.         PCKEV_AVG_ST_UB(tmp1, tmp0, dst0, dst);
  3425.         dst += dst_stride;
  3426.  
  3427.         ILVR_B2_UB(src3, src2, src4, src3, vec4, vec6);
  3428.         ILVL_B2_UB(src3, src2, src4, src3, vec5, vec7);
  3429.         DOTP_UB2_UH(vec2, vec3, filt0, filt0, tmp2, tmp3);
  3430.         SRARI_H2_UH(tmp2, tmp3, 7);
  3431.         SAT_UH2_UH(tmp2, tmp3, 7);
  3432.         PCKEV_AVG_ST_UB(tmp3, tmp2, dst1, dst);
  3433.         dst += dst_stride;
  3434.  
  3435.         DOTP_UB2_UH(vec4, vec5, filt0, filt0, tmp0, tmp1);
  3436.         SRARI_H2_UH(tmp0, tmp1, 7);
  3437.         SAT_UH2_UH(tmp0, tmp1, 7);
  3438.         PCKEV_AVG_ST_UB(tmp1, tmp0, dst2, dst);
  3439.         dst += dst_stride;
  3440.  
  3441.         DOTP_UB2_UH(vec6, vec7, filt0, filt0, tmp2, tmp3);
  3442.         SRARI_H2_UH(tmp2, tmp3, 7);
  3443.         SAT_UH2_UH(tmp2, tmp3, 7);
  3444.         PCKEV_AVG_ST_UB(tmp3, tmp2, dst3, dst);
  3445.         dst += dst_stride;
  3446.  
  3447.         src0 = src4;
  3448.     }
  3449. }
  3450.  
  3451. void ff_avg_bilin_32v_msa(uint8_t *dst, ptrdiff_t dst_stride,
  3452.                           const uint8_t *src, ptrdiff_t src_stride,
  3453.                           int height, int mx, int my)
  3454. {
  3455.     uint32_t loop_cnt;
  3456.     const int8_t *filter = vp9_bilinear_filters_msa[my - 1];
  3457.     v16u8 src0, src1, src2, src3, src4, src5, src6, src7, src8, src9;
  3458.     v16u8 dst0, dst1, dst2, dst3, dst4, dst5, dst6, dst7;
  3459.     v16u8 vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7, filt0;
  3460.     v8u16 tmp0, tmp1, tmp2, tmp3, filt;
  3461.  
  3462.     /* rearranging filter_y */
  3463.     filt = LD_UH(filter);
  3464.     filt0 = (v16u8) __msa_splati_h((v8i16) filt, 0);
  3465.  
  3466.     LD_UB2(src, 16, src0, src5);
  3467.     src += src_stride;
  3468.  
  3469.     for (loop_cnt = (height >> 2); loop_cnt--;) {
  3470.         LD_UB4(src, src_stride, src1, src2, src3, src4);
  3471.         LD_UB4(dst, dst_stride, dst0, dst1, dst2, dst3);
  3472.         ILVR_B2_UB(src1, src0, src2, src1, vec0, vec2);
  3473.         ILVL_B2_UB(src1, src0, src2, src1, vec1, vec3);
  3474.  
  3475.         LD_UB4(src + 16, src_stride, src6, src7, src8, src9);
  3476.         LD_UB4(dst + 16, dst_stride, dst4, dst5, dst6, dst7);
  3477.         src += (4 * src_stride);
  3478.  
  3479.         DOTP_UB2_UH(vec0, vec1, filt0, filt0, tmp0, tmp1);
  3480.         SRARI_H2_UH(tmp0, tmp1, 7);
  3481.         SAT_UH2_UH(tmp0, tmp1, 7);
  3482.         PCKEV_AVG_ST_UB(tmp1, tmp0, dst0, dst);
  3483.  
  3484.         DOTP_UB2_UH(vec2, vec3, filt0, filt0, tmp2, tmp3);
  3485.         SRARI_H2_UH(tmp2, tmp3, 7);
  3486.         SAT_UH2_UH(tmp2, tmp3, 7);
  3487.         PCKEV_AVG_ST_UB(tmp3, tmp2, dst1, dst + dst_stride);
  3488.  
  3489.         ILVR_B2_UB(src3, src2, src4, src3, vec4, vec6);
  3490.         ILVL_B2_UB(src3, src2, src4, src3, vec5, vec7);
  3491.         DOTP_UB2_UH(vec4, vec5, filt0, filt0, tmp0, tmp1);
  3492.         SRARI_H2_UH(tmp0, tmp1, 7);
  3493.         SAT_UH2_UH(tmp0, tmp1, 7);
  3494.         PCKEV_AVG_ST_UB(tmp1, tmp0, dst2, dst + 2 * dst_stride);
  3495.  
  3496.         DOTP_UB2_UH(vec6, vec7, filt0, filt0, tmp2, tmp3);
  3497.         SRARI_H2_UH(tmp2, tmp3, 7);
  3498.         SAT_UH2_UH(tmp2, tmp3, 7);
  3499.         PCKEV_AVG_ST_UB(tmp3, tmp2, dst3, dst + 3 * dst_stride);
  3500.  
  3501.         ILVR_B2_UB(src6, src5, src7, src6, vec0, vec2);
  3502.         ILVL_B2_UB(src6, src5, src7, src6, vec1, vec3);
  3503.         DOTP_UB2_UH(vec0, vec1, filt0, filt0, tmp0, tmp1);
  3504.         SRARI_H2_UH(tmp0, tmp1, 7);
  3505.         SAT_UH2_UH(tmp0, tmp1, 7);
  3506.         PCKEV_AVG_ST_UB(tmp1, tmp0, dst4, dst + 16);
  3507.  
  3508.         DOTP_UB2_UH(vec2, vec3, filt0, filt0, tmp2, tmp3);
  3509.         SRARI_H2_UH(tmp2, tmp3, 7);
  3510.         SAT_UH2_UH(tmp2, tmp3, 7);
  3511.         PCKEV_AVG_ST_UB(tmp3, tmp2, dst5, dst + 16 + dst_stride);
  3512.  
  3513.         ILVR_B2_UB(src8, src7, src9, src8, vec4, vec6);
  3514.         ILVL_B2_UB(src8, src7, src9, src8, vec5, vec7);
  3515.         DOTP_UB2_UH(vec4, vec5, filt0, filt0, tmp0, tmp1);
  3516.         SRARI_H2_UH(tmp0, tmp1, 7);
  3517.         SAT_UH2_UH(tmp0, tmp1, 7);
  3518.         PCKEV_AVG_ST_UB(tmp1, tmp0, dst6, dst + 16 + 2 * dst_stride);
  3519.  
  3520.         DOTP_UB2_UH(vec6, vec7, filt0, filt0, tmp2, tmp3);
  3521.         SRARI_H2_UH(tmp2, tmp3, 7);
  3522.         SAT_UH2_UH(tmp2, tmp3, 7);
  3523.         PCKEV_AVG_ST_UB(tmp3, tmp2, dst7, dst + 16 + 3 * dst_stride);
  3524.         dst += (4 * dst_stride);
  3525.  
  3526.         src0 = src4;
  3527.         src5 = src9;
  3528.     }
  3529. }
  3530.  
  3531. void ff_avg_bilin_64v_msa(uint8_t *dst, ptrdiff_t dst_stride,
  3532.                           const uint8_t *src, ptrdiff_t src_stride,
  3533.                           int height, int mx, int my)
  3534. {
  3535.     uint32_t loop_cnt;
  3536.     const int8_t *filter = vp9_bilinear_filters_msa[my - 1];
  3537.     v16u8 src0, src1, src2, src3, src4, src5;
  3538.     v16u8 src6, src7, src8, src9, src10, src11, filt0;
  3539.     v16u8 dst0, dst1, dst2, dst3, dst4, dst5, dst6, dst7;
  3540.     v16u8 vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7;
  3541.     v8u16 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
  3542.     v8u16 filt;
  3543.  
  3544.     /* rearranging filter_y */
  3545.     filt = LD_UH(filter);
  3546.     filt0 = (v16u8) __msa_splati_h((v8i16) filt, 0);
  3547.  
  3548.     LD_UB4(src, 16, src0, src3, src6, src9);
  3549.     src += src_stride;
  3550.  
  3551.     for (loop_cnt = (height >> 1); loop_cnt--;) {
  3552.         LD_UB2(src, src_stride, src1, src2);
  3553.         LD_UB2(dst, dst_stride, dst0, dst1);
  3554.         LD_UB2(src + 16, src_stride, src4, src5);
  3555.         LD_UB2(dst + 16, dst_stride, dst2, dst3);
  3556.         LD_UB2(src + 32, src_stride, src7, src8);
  3557.         LD_UB2(dst + 32, dst_stride, dst4, dst5);
  3558.         LD_UB2(src + 48, src_stride, src10, src11);
  3559.         LD_UB2(dst + 48, dst_stride, dst6, dst7);
  3560.         src += (2 * src_stride);
  3561.  
  3562.         ILVR_B2_UB(src1, src0, src2, src1, vec0, vec2);
  3563.         ILVL_B2_UB(src1, src0, src2, src1, vec1, vec3);
  3564.         DOTP_UB2_UH(vec0, vec1, filt0, filt0, tmp0, tmp1);
  3565.         SRARI_H2_UH(tmp0, tmp1, 7);
  3566.         SAT_UH2_UH(tmp0, tmp1, 7);
  3567.         PCKEV_AVG_ST_UB(tmp1, tmp0, dst0, dst);
  3568.  
  3569.         DOTP_UB2_UH(vec2, vec3, filt0, filt0, tmp2, tmp3);
  3570.         SRARI_H2_UH(tmp2, tmp3, 7);
  3571.         SAT_UH2_UH(tmp2, tmp3, 7);
  3572.         PCKEV_AVG_ST_UB(tmp3, tmp2, dst1, dst + dst_stride);
  3573.  
  3574.         ILVR_B2_UB(src4, src3, src5, src4, vec4, vec6);
  3575.         ILVL_B2_UB(src4, src3, src5, src4, vec5, vec7);
  3576.         DOTP_UB2_UH(vec4, vec5, filt0, filt0, tmp4, tmp5);
  3577.         SRARI_H2_UH(tmp4, tmp5, 7);
  3578.         SAT_UH2_UH(tmp4, tmp5, 7);
  3579.         PCKEV_AVG_ST_UB(tmp5, tmp4, dst2, dst + 16);
  3580.  
  3581.         DOTP_UB2_UH(vec6, vec7, filt0, filt0, tmp6, tmp7);
  3582.         SRARI_H2_UH(tmp6, tmp7, 7);
  3583.         SAT_UH2_UH(tmp6, tmp7, 7);
  3584.         PCKEV_AVG_ST_UB(tmp7, tmp6, dst3, dst + 16 + dst_stride);
  3585.  
  3586.         ILVR_B2_UB(src7, src6, src8, src7, vec0, vec2);
  3587.         ILVL_B2_UB(src7, src6, src8, src7, vec1, vec3);
  3588.         DOTP_UB2_UH(vec0, vec1, filt0, filt0, tmp0, tmp1);
  3589.         SRARI_H2_UH(tmp0, tmp1, 7);
  3590.         SAT_UH2_UH(tmp0, tmp1, 7);
  3591.         PCKEV_AVG_ST_UB(tmp1, tmp0, dst4, dst + 32);
  3592.  
  3593.         DOTP_UB2_UH(vec2, vec3, filt0, filt0, tmp2, tmp3);
  3594.         SRARI_H2_UH(tmp2, tmp3, 7);
  3595.         SAT_UH2_UH(tmp2, tmp3, 7);
  3596.         PCKEV_AVG_ST_UB(tmp3, tmp2, dst5, dst + 32 + dst_stride);
  3597.  
  3598.         ILVR_B2_UB(src10, src9, src11, src10, vec4, vec6);
  3599.         ILVL_B2_UB(src10, src9, src11, src10, vec5, vec7);
  3600.         DOTP_UB2_UH(vec4, vec5, filt0, filt0, tmp4, tmp5);
  3601.         SRARI_H2_UH(tmp4, tmp5, 7);
  3602.         SAT_UH2_UH(tmp4, tmp5, 7);
  3603.         PCKEV_AVG_ST_UB(tmp5, tmp4, dst6, (dst + 48));
  3604.  
  3605.         DOTP_UB2_UH(vec6, vec7, filt0, filt0, tmp6, tmp7);
  3606.         SRARI_H2_UH(tmp6, tmp7, 7);
  3607.         SAT_UH2_UH(tmp6, tmp7, 7);
  3608.         PCKEV_AVG_ST_UB(tmp7, tmp6, dst7, dst + 48 + dst_stride);
  3609.         dst += (2 * dst_stride);
  3610.  
  3611.         src0 = src2;
  3612.         src3 = src5;
  3613.         src6 = src8;
  3614.         src9 = src11;
  3615.     }
  3616. }
  3617.  
  3618. static void common_hv_2ht_2vt_and_aver_dst_4x4_msa(const uint8_t *src,
  3619.                                                    int32_t src_stride,
  3620.                                                    uint8_t *dst,
  3621.                                                    int32_t dst_stride,
  3622.                                                    const int8_t *filter_horiz,
  3623.                                                    const int8_t *filter_vert)
  3624. {
  3625.     v16i8 src0, src1, src2, src3, src4, mask;
  3626.     v16u8 filt_hz, filt_vt, vec0, vec1;
  3627.     v16u8 dst0, dst1, dst2, dst3, res0, res1;
  3628.     v8u16 hz_out0, hz_out1, hz_out2, hz_out3, hz_out4, tmp0, tmp1, filt;
  3629.  
  3630.     mask = LD_SB(&mc_filt_mask_arr[16]);
  3631.  
  3632.     /* rearranging filter */
  3633.     filt = LD_UH(filter_horiz);
  3634.     filt_hz = (v16u8) __msa_splati_h((v8i16) filt, 0);
  3635.  
  3636.     filt = LD_UH(filter_vert);
  3637.     filt_vt = (v16u8) __msa_splati_h((v8i16) filt, 0);
  3638.  
  3639.     LD_SB5(src, src_stride, src0, src1, src2, src3, src4);
  3640.  
  3641.     hz_out0 = HORIZ_2TAP_FILT_UH(src0, src1, mask, filt_hz, 7);
  3642.     hz_out2 = HORIZ_2TAP_FILT_UH(src2, src3, mask, filt_hz, 7);
  3643.     hz_out4 = HORIZ_2TAP_FILT_UH(src4, src4, mask, filt_hz, 7);
  3644.     hz_out1 = (v8u16) __msa_sldi_b((v16i8) hz_out2, (v16i8) hz_out0, 8);
  3645.     hz_out3 = (v8u16) __msa_pckod_d((v2i64) hz_out4, (v2i64) hz_out2);
  3646.     ILVEV_B2_UB(hz_out0, hz_out1, hz_out2, hz_out3, vec0, vec1);
  3647.  
  3648.     LD_UB4(dst, dst_stride, dst0, dst1, dst2, dst3);
  3649.     ILVR_W2_UB(dst1, dst0, dst3, dst2, dst0, dst2);
  3650.     DOTP_UB2_UH(vec0, vec1, filt_vt, filt_vt, tmp0, tmp1);
  3651.     SRARI_H2_UH(tmp0, tmp1, 7);
  3652.     SAT_UH2_UH(tmp0, tmp1, 7);
  3653.     PCKEV_B2_UB(tmp0, tmp0, tmp1, tmp1, res0, res1);
  3654.     AVER_UB2_UB(res0, dst0, res1, dst2, res0, res1);
  3655.     ST4x4_UB(res0, res1, 0, 1, 0, 1, dst, dst_stride);
  3656. }
  3657.  
  3658. static void common_hv_2ht_2vt_and_aver_dst_4x8_msa(const uint8_t *src,
  3659.                                                    int32_t src_stride,
  3660.                                                    uint8_t *dst,
  3661.                                                    int32_t dst_stride,
  3662.                                                    const int8_t *filter_horiz,
  3663.                                                    const int8_t *filter_vert)
  3664. {
  3665.     v16i8 src0, src1, src2, src3, src4, src5, src6, src7, src8, mask;
  3666.     v16u8 filt_hz, filt_vt, vec0, vec1, vec2, vec3, res0, res1, res2, res3;
  3667.     v16u8 dst0, dst1, dst2, dst3, dst4, dst5, dst6, dst7;
  3668.     v8u16 hz_out0, hz_out1, hz_out2, hz_out3, hz_out4, hz_out5, hz_out6;
  3669.     v8u16 hz_out7, hz_out8, tmp0, tmp1, tmp2, tmp3;
  3670.     v8i16 filt;
  3671.  
  3672.     mask = LD_SB(&mc_filt_mask_arr[16]);
  3673.  
  3674.     /* rearranging filter */
  3675.     filt = LD_SH(filter_horiz);
  3676.     filt_hz = (v16u8) __msa_splati_h(filt, 0);
  3677.  
  3678.     filt = LD_SH(filter_vert);
  3679.     filt_vt = (v16u8) __msa_splati_h(filt, 0);
  3680.  
  3681.     LD_SB8(src, src_stride, src0, src1, src2, src3, src4, src5, src6, src7);
  3682.     src += (8 * src_stride);
  3683.     src8 = LD_SB(src);
  3684.  
  3685.     hz_out0 = HORIZ_2TAP_FILT_UH(src0, src1, mask, filt_hz, 7);
  3686.     hz_out2 = HORIZ_2TAP_FILT_UH(src2, src3, mask, filt_hz, 7);
  3687.     hz_out4 = HORIZ_2TAP_FILT_UH(src4, src5, mask, filt_hz, 7);
  3688.     hz_out6 = HORIZ_2TAP_FILT_UH(src6, src7, mask, filt_hz, 7);
  3689.     hz_out8 = HORIZ_2TAP_FILT_UH(src8, src8, mask, filt_hz, 7);
  3690.     SLDI_B3_UH(hz_out2, hz_out4, hz_out6, hz_out0, hz_out2, hz_out4, hz_out1,
  3691.                hz_out3, hz_out5, 8);
  3692.     hz_out7 = (v8u16) __msa_pckod_d((v2i64) hz_out8, (v2i64) hz_out6);
  3693.  
  3694.     LD_UB8(dst, dst_stride, dst0, dst1, dst2, dst3, dst4, dst5, dst6, dst7);
  3695.     ILVR_W4_UB(dst1, dst0, dst3, dst2, dst5, dst4, dst7, dst6, dst0, dst2,
  3696.                dst4, dst6);
  3697.     ILVEV_B2_UB(hz_out0, hz_out1, hz_out2, hz_out3, vec0, vec1);
  3698.     ILVEV_B2_UB(hz_out4, hz_out5, hz_out6, hz_out7, vec2, vec3);
  3699.     DOTP_UB4_UH(vec0, vec1, vec2, vec3, filt_vt, filt_vt, filt_vt, filt_vt,
  3700.                 tmp0, tmp1, tmp2, tmp3);
  3701.     SRARI_H4_UH(tmp0, tmp1, tmp2, tmp3, 7);
  3702.     SAT_UH4_UH(tmp0, tmp1, tmp2, tmp3, 7);
  3703.     PCKEV_B4_UB(tmp0, tmp0, tmp1, tmp1, tmp2, tmp2, tmp3, tmp3, res0, res1,
  3704.                 res2, res3);
  3705.     AVER_UB4_UB(res0, dst0, res1, dst2, res2, dst4, res3, dst6, res0, res1,
  3706.                 res2, res3);
  3707.     ST4x4_UB(res0, res1, 0, 1, 0, 1, dst, dst_stride);
  3708.     dst += (4 * dst_stride);
  3709.     ST4x4_UB(res2, res3, 0, 1, 0, 1, dst, dst_stride);
  3710. }
  3711.  
  3712. void ff_avg_bilin_4hv_msa(uint8_t *dst, ptrdiff_t dst_stride,
  3713.                           const uint8_t *src, ptrdiff_t src_stride,
  3714.                           int height, int mx, int my)
  3715. {
  3716.     const int8_t *filter_horiz = vp9_bilinear_filters_msa[mx - 1];
  3717.     const int8_t *filter_vert = vp9_bilinear_filters_msa[my - 1];
  3718.  
  3719.     if (4 == height) {
  3720.         common_hv_2ht_2vt_and_aver_dst_4x4_msa(src, src_stride, dst, dst_stride,
  3721.                                                filter_horiz, filter_vert);
  3722.     } else if (8 == height) {
  3723.         common_hv_2ht_2vt_and_aver_dst_4x8_msa(src, src_stride, dst, dst_stride,
  3724.                                                filter_horiz, filter_vert);
  3725.     }
  3726. }
  3727.  
  3728. static void common_hv_2ht_2vt_and_aver_dst_8x4_msa(const uint8_t *src,
  3729.                                                    int32_t src_stride,
  3730.                                                    uint8_t *dst,
  3731.                                                    int32_t dst_stride,
  3732.                                                    const int8_t *filter_horiz,
  3733.                                                    const int8_t *filter_vert)
  3734. {
  3735.     v16i8 src0, src1, src2, src3, src4, mask;
  3736.     v16u8 filt_hz, filt_vt, dst0, dst1, dst2, dst3, vec0, vec1, vec2, vec3;
  3737.     v8u16 hz_out0, hz_out1, tmp0, tmp1, tmp2, tmp3;
  3738.     v8i16 filt;
  3739.  
  3740.     mask = LD_SB(&mc_filt_mask_arr[0]);
  3741.  
  3742.     /* rearranging filter */
  3743.     filt = LD_SH(filter_horiz);
  3744.     filt_hz = (v16u8) __msa_splati_h(filt, 0);
  3745.  
  3746.     filt = LD_SH(filter_vert);
  3747.     filt_vt = (v16u8) __msa_splati_h(filt, 0);
  3748.  
  3749.     LD_SB5(src, src_stride, src0, src1, src2, src3, src4);
  3750.     src += (5 * src_stride);
  3751.  
  3752.     LD_UB4(dst, dst_stride, dst0, dst1, dst2, dst3);
  3753.     hz_out0 = HORIZ_2TAP_FILT_UH(src0, src0, mask, filt_hz, 7);
  3754.     hz_out1 = HORIZ_2TAP_FILT_UH(src1, src1, mask, filt_hz, 7);
  3755.     vec0 = (v16u8) __msa_ilvev_b((v16i8) hz_out1, (v16i8) hz_out0);
  3756.     tmp0 = __msa_dotp_u_h(vec0, filt_vt);
  3757.  
  3758.     hz_out0 = HORIZ_2TAP_FILT_UH(src2, src2, mask, filt_hz, 7);
  3759.     vec1 = (v16u8) __msa_ilvev_b((v16i8) hz_out0, (v16i8) hz_out1);
  3760.     tmp1 = __msa_dotp_u_h(vec1, filt_vt);
  3761.  
  3762.     hz_out1 = HORIZ_2TAP_FILT_UH(src3, src3, mask, filt_hz, 7);
  3763.     vec2 = (v16u8) __msa_ilvev_b((v16i8) hz_out1, (v16i8) hz_out0);
  3764.     tmp2 = __msa_dotp_u_h(vec2, filt_vt);
  3765.  
  3766.     hz_out0 = HORIZ_2TAP_FILT_UH(src4, src4, mask, filt_hz, 7);
  3767.     vec3 = (v16u8) __msa_ilvev_b((v16i8) hz_out0, (v16i8) hz_out1);
  3768.     tmp3 = __msa_dotp_u_h(vec3, filt_vt);
  3769.  
  3770.     SRARI_H4_UH(tmp0, tmp1, tmp2, tmp3, 7);
  3771.     SAT_UH4_UH(tmp0, tmp1, tmp2, tmp3, 7);
  3772.     PCKEV_AVG_ST8x4_UB(tmp0, dst0, tmp1, dst1, tmp2, dst2, tmp3, dst3,
  3773.                        dst, dst_stride);
  3774. }
  3775.  
  3776. static void common_hv_2ht_2vt_and_aver_dst_8x8mult_msa(const uint8_t *src,
  3777.                                                        int32_t src_stride,
  3778.                                                        uint8_t *dst,
  3779.                                                        int32_t dst_stride,
  3780.                                                        const int8_t *filter_horiz,
  3781.                                                        const int8_t *filter_vert,
  3782.                                                        int32_t height)
  3783. {
  3784.     uint32_t loop_cnt;
  3785.     v16i8 src0, src1, src2, src3, src4, mask;
  3786.     v16u8 filt_hz, filt_vt, vec0, dst0, dst1, dst2, dst3;
  3787.     v8u16 hz_out0, hz_out1, tmp0, tmp1, tmp2, tmp3;
  3788.     v8i16 filt;
  3789.  
  3790.     mask = LD_SB(&mc_filt_mask_arr[0]);
  3791.  
  3792.     /* rearranging filter */
  3793.     filt = LD_SH(filter_horiz);
  3794.     filt_hz = (v16u8) __msa_splati_h(filt, 0);
  3795.  
  3796.     filt = LD_SH(filter_vert);
  3797.     filt_vt = (v16u8) __msa_splati_h(filt, 0);
  3798.  
  3799.     src0 = LD_SB(src);
  3800.     src += src_stride;
  3801.  
  3802.     hz_out0 = HORIZ_2TAP_FILT_UH(src0, src0, mask, filt_hz, 7);
  3803.  
  3804.     for (loop_cnt = (height >> 2); loop_cnt--;) {
  3805.         LD_SB4(src, src_stride, src1, src2, src3, src4);
  3806.         src += (4 * src_stride);
  3807.  
  3808.         hz_out1 = HORIZ_2TAP_FILT_UH(src1, src1, mask, filt_hz, 7);
  3809.         vec0 = (v16u8) __msa_ilvev_b((v16i8) hz_out1, (v16i8) hz_out0);
  3810.         tmp0 = __msa_dotp_u_h(vec0, filt_vt);
  3811.  
  3812.         hz_out0 = HORIZ_2TAP_FILT_UH(src2, src2, mask, filt_hz, 7);
  3813.         vec0 = (v16u8) __msa_ilvev_b((v16i8) hz_out0, (v16i8) hz_out1);
  3814.         tmp1 = __msa_dotp_u_h(vec0, filt_vt);
  3815.  
  3816.         SRARI_H2_UH(tmp0, tmp1, 7);
  3817.         SAT_UH2_UH(tmp0, tmp1, 7);
  3818.  
  3819.         hz_out1 = HORIZ_2TAP_FILT_UH(src3, src3, mask, filt_hz, 7);
  3820.         vec0 = (v16u8) __msa_ilvev_b((v16i8) hz_out1, (v16i8) hz_out0);
  3821.         tmp2 = __msa_dotp_u_h(vec0, filt_vt);
  3822.  
  3823.         hz_out0 = HORIZ_2TAP_FILT_UH(src4, src4, mask, filt_hz, 7);
  3824.         vec0 = (v16u8) __msa_ilvev_b((v16i8) hz_out0, (v16i8) hz_out1);
  3825.         tmp3 = __msa_dotp_u_h(vec0, filt_vt);
  3826.  
  3827.         SRARI_H2_UH(tmp2, tmp3, 7);
  3828.         SAT_UH2_UH(tmp2, tmp3, 7);
  3829.         LD_UB4(dst, dst_stride, dst0, dst1, dst2, dst3);
  3830.         PCKEV_AVG_ST8x4_UB(tmp0, dst0, tmp1, dst1, tmp2, dst2, tmp3,
  3831.                            dst3, dst, dst_stride);
  3832.         dst += (4 * dst_stride);
  3833.     }
  3834. }
  3835.  
  3836. void ff_avg_bilin_8hv_msa(uint8_t *dst, ptrdiff_t dst_stride,
  3837.                           const uint8_t *src, ptrdiff_t src_stride,
  3838.                           int height, int mx, int my)
  3839. {
  3840.     const int8_t *filter_horiz = vp9_bilinear_filters_msa[mx - 1];
  3841.     const int8_t *filter_vert = vp9_bilinear_filters_msa[my - 1];
  3842.  
  3843.     if (4 == height) {
  3844.         common_hv_2ht_2vt_and_aver_dst_8x4_msa(src, src_stride, dst, dst_stride,
  3845.                                                filter_horiz, filter_vert);
  3846.     } else {
  3847.         common_hv_2ht_2vt_and_aver_dst_8x8mult_msa(src, src_stride,
  3848.                                                    dst, dst_stride,
  3849.                                                    filter_horiz, filter_vert,
  3850.                                                    height);
  3851.     }
  3852. }
  3853.  
  3854. void ff_avg_bilin_16hv_msa(uint8_t *dst, ptrdiff_t dst_stride,
  3855.                            const uint8_t *src, ptrdiff_t src_stride,
  3856.                            int height, int mx, int my)
  3857. {
  3858.     uint32_t loop_cnt;
  3859.     const int8_t *filter_horiz = vp9_bilinear_filters_msa[mx - 1];
  3860.     const int8_t *filter_vert = vp9_bilinear_filters_msa[my - 1];
  3861.     v16i8 src0, src1, src2, src3, src4, src5, src6, src7, mask;
  3862.     v16u8 filt_hz, filt_vt, vec0, vec1, dst0, dst1, dst2, dst3;
  3863.     v8u16 hz_out0, hz_out1, hz_out2, hz_out3, tmp0, tmp1;
  3864.     v8i16 filt;
  3865.  
  3866.     mask = LD_SB(&mc_filt_mask_arr[0]);
  3867.  
  3868.     /* rearranging filter */
  3869.     filt = LD_SH(filter_horiz);
  3870.     filt_hz = (v16u8) __msa_splati_h(filt, 0);
  3871.  
  3872.     filt = LD_SH(filter_vert);
  3873.     filt_vt = (v16u8) __msa_splati_h(filt, 0);
  3874.  
  3875.     LD_SB2(src, 8, src0, src1);
  3876.     src += src_stride;
  3877.  
  3878.     hz_out0 = HORIZ_2TAP_FILT_UH(src0, src0, mask, filt_hz, 7);
  3879.     hz_out2 = HORIZ_2TAP_FILT_UH(src1, src1, mask, filt_hz, 7);
  3880.  
  3881.     for (loop_cnt = (height >> 2); loop_cnt--;) {
  3882.         LD_SB4(src, src_stride, src0, src2, src4, src6);
  3883.         LD_SB4(src + 8, src_stride, src1, src3, src5, src7);
  3884.         src += (4 * src_stride);
  3885.         LD_UB4(dst, dst_stride, dst0, dst1, dst2, dst3);
  3886.  
  3887.         hz_out1 = HORIZ_2TAP_FILT_UH(src0, src0, mask, filt_hz, 7);
  3888.         hz_out3 = HORIZ_2TAP_FILT_UH(src1, src1, mask, filt_hz, 7);
  3889.         ILVEV_B2_UB(hz_out0, hz_out1, hz_out2, hz_out3, vec0, vec1);
  3890.         DOTP_UB2_UH(vec0, vec1, filt_vt, filt_vt, tmp0, tmp1);
  3891.         SRARI_H2_UH(tmp0, tmp1, 7);
  3892.         SAT_UH2_UH(tmp0, tmp1, 7);
  3893.         PCKEV_AVG_ST_UB(tmp1, tmp0, dst0, dst);
  3894.         dst += dst_stride;
  3895.  
  3896.         hz_out0 = HORIZ_2TAP_FILT_UH(src2, src2, mask, filt_hz, 7);
  3897.         hz_out2 = HORIZ_2TAP_FILT_UH(src3, src3, mask, filt_hz, 7);
  3898.         ILVEV_B2_UB(hz_out1, hz_out0, hz_out3, hz_out2, vec0, vec1);
  3899.         DOTP_UB2_UH(vec0, vec1, filt_vt, filt_vt, tmp0, tmp1);
  3900.         SRARI_H2_UH(tmp0, tmp1, 7);
  3901.         SAT_UH2_UH(tmp0, tmp1, 7);
  3902.         PCKEV_AVG_ST_UB(tmp1, tmp0, dst1, dst);
  3903.         dst += dst_stride;
  3904.  
  3905.         hz_out1 = HORIZ_2TAP_FILT_UH(src4, src4, mask, filt_hz, 7);
  3906.         hz_out3 = HORIZ_2TAP_FILT_UH(src5, src5, mask, filt_hz, 7);
  3907.         ILVEV_B2_UB(hz_out0, hz_out1, hz_out2, hz_out3, vec0, vec1);
  3908.         DOTP_UB2_UH(vec0, vec1, filt_vt, filt_vt, tmp0, tmp1);
  3909.         SRARI_H2_UH(tmp0, tmp1, 7);
  3910.         SAT_UH2_UH(tmp0, tmp1, 7);
  3911.         PCKEV_AVG_ST_UB(tmp1, tmp0, dst2, dst);
  3912.         dst += dst_stride;
  3913.  
  3914.         hz_out0 = HORIZ_2TAP_FILT_UH(src6, src6, mask, filt_hz, 7);
  3915.         hz_out2 = HORIZ_2TAP_FILT_UH(src7, src7, mask, filt_hz, 7);
  3916.         ILVEV_B2_UB(hz_out1, hz_out0, hz_out3, hz_out2, vec0, vec1);
  3917.         DOTP_UB2_UH(vec0, vec1, filt_vt, filt_vt, tmp0, tmp1);
  3918.         SRARI_H2_UH(tmp0, tmp1, 7);
  3919.         SAT_UH2_UH(tmp0, tmp1, 7);
  3920.         PCKEV_AVG_ST_UB(tmp1, tmp0, dst3, dst);
  3921.         dst += dst_stride;
  3922.     }
  3923. }
  3924.  
  3925. void ff_avg_bilin_32hv_msa(uint8_t *dst, ptrdiff_t dst_stride,
  3926.                            const uint8_t *src, ptrdiff_t src_stride,
  3927.                            int height, int mx, int my)
  3928. {
  3929.     int32_t multiple8_cnt;
  3930.  
  3931.     for (multiple8_cnt = 2; multiple8_cnt--;) {
  3932.         ff_avg_bilin_16hv_msa(dst, dst_stride, src, src_stride, height, mx, my);
  3933.  
  3934.         src += 16;
  3935.         dst += 16;
  3936.     }
  3937. }
  3938.  
  3939. void ff_avg_bilin_64hv_msa(uint8_t *dst, ptrdiff_t dst_stride,
  3940.                            const uint8_t *src, ptrdiff_t src_stride,
  3941.                            int height, int mx, int my)
  3942. {
  3943.     int32_t multiple8_cnt;
  3944.  
  3945.     for (multiple8_cnt = 4; multiple8_cnt--;) {
  3946.         ff_avg_bilin_16hv_msa(dst, dst_stride, src, src_stride, height, mx, my);
  3947.  
  3948.         src += 16;
  3949.         dst += 16;
  3950.     }
  3951. }
  3952.  
  3953. static void copy_width8_msa(const uint8_t *src, int32_t src_stride,
  3954.                             uint8_t *dst, int32_t dst_stride,
  3955.                             int32_t height)
  3956. {
  3957.     int32_t cnt;
  3958.     uint64_t out0, out1, out2, out3, out4, out5, out6, out7;
  3959.     v16u8 src0, src1, src2, src3, src4, src5, src6, src7;
  3960.  
  3961.     if (0 == height % 12) {
  3962.         for (cnt = (height / 12); cnt--;) {
  3963.             LD_UB8(src, src_stride,
  3964.                    src0, src1, src2, src3, src4, src5, src6, src7);
  3965.             src += (8 * src_stride);
  3966.  
  3967.             out0 = __msa_copy_u_d((v2i64) src0, 0);
  3968.             out1 = __msa_copy_u_d((v2i64) src1, 0);
  3969.             out2 = __msa_copy_u_d((v2i64) src2, 0);
  3970.             out3 = __msa_copy_u_d((v2i64) src3, 0);
  3971.             out4 = __msa_copy_u_d((v2i64) src4, 0);
  3972.             out5 = __msa_copy_u_d((v2i64) src5, 0);
  3973.             out6 = __msa_copy_u_d((v2i64) src6, 0);
  3974.             out7 = __msa_copy_u_d((v2i64) src7, 0);
  3975.  
  3976.             SD4(out0, out1, out2, out3, dst, dst_stride);
  3977.             dst += (4 * dst_stride);
  3978.             SD4(out4, out5, out6, out7, dst, dst_stride);
  3979.             dst += (4 * dst_stride);
  3980.  
  3981.             LD_UB4(src, src_stride, src0, src1, src2, src3);
  3982.             src += (4 * src_stride);
  3983.  
  3984.             out0 = __msa_copy_u_d((v2i64) src0, 0);
  3985.             out1 = __msa_copy_u_d((v2i64) src1, 0);
  3986.             out2 = __msa_copy_u_d((v2i64) src2, 0);
  3987.             out3 = __msa_copy_u_d((v2i64) src3, 0);
  3988.  
  3989.             SD4(out0, out1, out2, out3, dst, dst_stride);
  3990.             dst += (4 * dst_stride);
  3991.         }
  3992.     } else if (0 == height % 8) {
  3993.         for (cnt = height >> 3; cnt--;) {
  3994.             LD_UB8(src, src_stride,
  3995.                    src0, src1, src2, src3, src4, src5, src6, src7);
  3996.             src += (8 * src_stride);
  3997.  
  3998.             out0 = __msa_copy_u_d((v2i64) src0, 0);
  3999.             out1 = __msa_copy_u_d((v2i64) src1, 0);
  4000.             out2 = __msa_copy_u_d((v2i64) src2, 0);
  4001.             out3 = __msa_copy_u_d((v2i64) src3, 0);
  4002.             out4 = __msa_copy_u_d((v2i64) src4, 0);
  4003.             out5 = __msa_copy_u_d((v2i64) src5, 0);
  4004.             out6 = __msa_copy_u_d((v2i64) src6, 0);
  4005.             out7 = __msa_copy_u_d((v2i64) src7, 0);
  4006.  
  4007.             SD4(out0, out1, out2, out3, dst, dst_stride);
  4008.             dst += (4 * dst_stride);
  4009.             SD4(out4, out5, out6, out7, dst, dst_stride);
  4010.             dst += (4 * dst_stride);
  4011.         }
  4012.     } else if (0 == height % 4) {
  4013.         for (cnt = (height / 4); cnt--;) {
  4014.             LD_UB4(src, src_stride, src0, src1, src2, src3);
  4015.             src += (4 * src_stride);
  4016.             out0 = __msa_copy_u_d((v2i64) src0, 0);
  4017.             out1 = __msa_copy_u_d((v2i64) src1, 0);
  4018.             out2 = __msa_copy_u_d((v2i64) src2, 0);
  4019.             out3 = __msa_copy_u_d((v2i64) src3, 0);
  4020.  
  4021.             SD4(out0, out1, out2, out3, dst, dst_stride);
  4022.             dst += (4 * dst_stride);
  4023.         }
  4024.     } else if (0 == height % 2) {
  4025.         for (cnt = (height / 2); cnt--;) {
  4026.             LD_UB2(src, src_stride, src0, src1);
  4027.             src += (2 * src_stride);
  4028.             out0 = __msa_copy_u_d((v2i64) src0, 0);
  4029.             out1 = __msa_copy_u_d((v2i64) src1, 0);
  4030.  
  4031.             SD(out0, dst);
  4032.             dst += dst_stride;
  4033.             SD(out1, dst);
  4034.             dst += dst_stride;
  4035.         }
  4036.     }
  4037. }
  4038.  
  4039. static void copy_16multx8mult_msa(const uint8_t *src, int32_t src_stride,
  4040.                                   uint8_t *dst, int32_t dst_stride,
  4041.                                   int32_t height, int32_t width)
  4042. {
  4043.     int32_t cnt, loop_cnt;
  4044.     const uint8_t *src_tmp;
  4045.     uint8_t *dst_tmp;
  4046.     v16u8 src0, src1, src2, src3, src4, src5, src6, src7;
  4047.  
  4048.     for (cnt = (width >> 4); cnt--;) {
  4049.         src_tmp = src;
  4050.         dst_tmp = dst;
  4051.  
  4052.         for (loop_cnt = (height >> 3); loop_cnt--;) {
  4053.             LD_UB8(src_tmp, src_stride,
  4054.                    src0, src1, src2, src3, src4, src5, src6, src7);
  4055.             src_tmp += (8 * src_stride);
  4056.  
  4057.             ST_UB8(src0, src1, src2, src3, src4, src5, src6, src7,
  4058.                    dst_tmp, dst_stride);
  4059.             dst_tmp += (8 * dst_stride);
  4060.         }
  4061.  
  4062.         src += 16;
  4063.         dst += 16;
  4064.     }
  4065. }
  4066.  
  4067. static void copy_width16_msa(const uint8_t *src, int32_t src_stride,
  4068.                              uint8_t *dst, int32_t dst_stride,
  4069.                              int32_t height)
  4070. {
  4071.     int32_t cnt;
  4072.     v16u8 src0, src1, src2, src3, src4, src5, src6, src7;
  4073.  
  4074.     if (0 == height % 12) {
  4075.         for (cnt = (height / 12); cnt--;) {
  4076.             LD_UB8(src, src_stride,
  4077.                    src0, src1, src2, src3, src4, src5, src6, src7);
  4078.             src += (8 * src_stride);
  4079.             ST_UB8(src0, src1, src2, src3, src4, src5, src6, src7,
  4080.                    dst, dst_stride);
  4081.             dst += (8 * dst_stride);
  4082.  
  4083.             LD_UB4(src, src_stride, src0, src1, src2, src3);
  4084.             src += (4 * src_stride);
  4085.             ST_UB4(src0, src1, src2, src3, dst, dst_stride);
  4086.             dst += (4 * dst_stride);
  4087.         }
  4088.     } else if (0 == height % 8) {
  4089.         copy_16multx8mult_msa(src, src_stride, dst, dst_stride, height, 16);
  4090.     } else if (0 == height % 4) {
  4091.         for (cnt = (height >> 2); cnt--;) {
  4092.             LD_UB4(src, src_stride, src0, src1, src2, src3);
  4093.             src += (4 * src_stride);
  4094.  
  4095.             ST_UB4(src0, src1, src2, src3, dst, dst_stride);
  4096.             dst += (4 * dst_stride);
  4097.         }
  4098.     }
  4099. }
  4100.  
  4101. static void copy_width32_msa(const uint8_t *src, int32_t src_stride,
  4102.                              uint8_t *dst, int32_t dst_stride,
  4103.                              int32_t height)
  4104. {
  4105.     int32_t cnt;
  4106.     v16u8 src0, src1, src2, src3, src4, src5, src6, src7;
  4107.  
  4108.     if (0 == height % 12) {
  4109.         for (cnt = (height / 12); cnt--;) {
  4110.             LD_UB4(src, src_stride, src0, src1, src2, src3);
  4111.             LD_UB4(src + 16, src_stride, src4, src5, src6, src7);
  4112.             src += (4 * src_stride);
  4113.             ST_UB4(src0, src1, src2, src3, dst, dst_stride);
  4114.             ST_UB4(src4, src5, src6, src7, dst + 16, dst_stride);
  4115.             dst += (4 * dst_stride);
  4116.  
  4117.             LD_UB4(src, src_stride, src0, src1, src2, src3);
  4118.             LD_UB4(src + 16, src_stride, src4, src5, src6, src7);
  4119.             src += (4 * src_stride);
  4120.             ST_UB4(src0, src1, src2, src3, dst, dst_stride);
  4121.             ST_UB4(src4, src5, src6, src7, dst + 16, dst_stride);
  4122.             dst += (4 * dst_stride);
  4123.  
  4124.             LD_UB4(src, src_stride, src0, src1, src2, src3);
  4125.             LD_UB4(src + 16, src_stride, src4, src5, src6, src7);
  4126.             src += (4 * src_stride);
  4127.             ST_UB4(src0, src1, src2, src3, dst, dst_stride);
  4128.             ST_UB4(src4, src5, src6, src7, dst + 16, dst_stride);
  4129.             dst += (4 * dst_stride);
  4130.         }
  4131.     } else if (0 == height % 8) {
  4132.         copy_16multx8mult_msa(src, src_stride, dst, dst_stride, height, 32);
  4133.     } else if (0 == height % 4) {
  4134.         for (cnt = (height >> 2); cnt--;) {
  4135.             LD_UB4(src, src_stride, src0, src1, src2, src3);
  4136.             LD_UB4(src + 16, src_stride, src4, src5, src6, src7);
  4137.             src += (4 * src_stride);
  4138.             ST_UB4(src0, src1, src2, src3, dst, dst_stride);
  4139.             ST_UB4(src4, src5, src6, src7, dst + 16, dst_stride);
  4140.             dst += (4 * dst_stride);
  4141.         }
  4142.     }
  4143. }
  4144.  
  4145. static void copy_width64_msa(const uint8_t *src, int32_t src_stride,
  4146.                              uint8_t *dst, int32_t dst_stride,
  4147.                              int32_t height)
  4148. {
  4149.     copy_16multx8mult_msa(src, src_stride, dst, dst_stride, height, 64);
  4150. }
  4151.  
  4152. static void avg_width4_msa(const uint8_t *src, int32_t src_stride,
  4153.                            uint8_t *dst, int32_t dst_stride,
  4154.                            int32_t height)
  4155. {
  4156.     int32_t cnt;
  4157.     uint32_t out0, out1, out2, out3;
  4158.     v16u8 src0, src1, src2, src3;
  4159.     v16u8 dst0, dst1, dst2, dst3;
  4160.  
  4161.     if (0 == (height % 4)) {
  4162.         for (cnt = (height / 4); cnt--;) {
  4163.             LD_UB4(src, src_stride, src0, src1, src2, src3);
  4164.             src += (4 * src_stride);
  4165.  
  4166.             LD_UB4(dst, dst_stride, dst0, dst1, dst2, dst3);
  4167.  
  4168.             AVER_UB4_UB(src0, dst0, src1, dst1, src2, dst2, src3, dst3,
  4169.                         dst0, dst1, dst2, dst3);
  4170.  
  4171.             out0 = __msa_copy_u_w((v4i32) dst0, 0);
  4172.             out1 = __msa_copy_u_w((v4i32) dst1, 0);
  4173.             out2 = __msa_copy_u_w((v4i32) dst2, 0);
  4174.             out3 = __msa_copy_u_w((v4i32) dst3, 0);
  4175.             SW4(out0, out1, out2, out3, dst, dst_stride);
  4176.             dst += (4 * dst_stride);
  4177.         }
  4178.     } else if (0 == (height % 2)) {
  4179.         for (cnt = (height / 2); cnt--;) {
  4180.             LD_UB2(src, src_stride, src0, src1);
  4181.             src += (2 * src_stride);
  4182.  
  4183.             LD_UB2(dst, dst_stride, dst0, dst1);
  4184.  
  4185.             AVER_UB2_UB(src0, dst0, src1, dst1, dst0, dst1);
  4186.  
  4187.             out0 = __msa_copy_u_w((v4i32) dst0, 0);
  4188.             out1 = __msa_copy_u_w((v4i32) dst1, 0);
  4189.             SW(out0, dst);
  4190.             dst += dst_stride;
  4191.             SW(out1, dst);
  4192.             dst += dst_stride;
  4193.         }
  4194.     }
  4195. }
  4196.  
  4197. static void avg_width8_msa(const uint8_t *src, int32_t src_stride,
  4198.                            uint8_t *dst, int32_t dst_stride,
  4199.                            int32_t height)
  4200. {
  4201.     int32_t cnt;
  4202.     uint64_t out0, out1, out2, out3;
  4203.     v16u8 src0, src1, src2, src3;
  4204.     v16u8 dst0, dst1, dst2, dst3;
  4205.  
  4206.     for (cnt = (height / 4); cnt--;) {
  4207.         LD_UB4(src, src_stride, src0, src1, src2, src3);
  4208.         src += (4 * src_stride);
  4209.         LD_UB4(dst, dst_stride, dst0, dst1, dst2, dst3);
  4210.  
  4211.         AVER_UB4_UB(src0, dst0, src1, dst1, src2, dst2, src3, dst3,
  4212.                     dst0, dst1, dst2, dst3);
  4213.  
  4214.         out0 = __msa_copy_u_d((v2i64) dst0, 0);
  4215.         out1 = __msa_copy_u_d((v2i64) dst1, 0);
  4216.         out2 = __msa_copy_u_d((v2i64) dst2, 0);
  4217.         out3 = __msa_copy_u_d((v2i64) dst3, 0);
  4218.         SD4(out0, out1, out2, out3, dst, dst_stride);
  4219.         dst += (4 * dst_stride);
  4220.     }
  4221. }
  4222.  
  4223. static void avg_width16_msa(const uint8_t *src, int32_t src_stride,
  4224.                             uint8_t *dst, int32_t dst_stride,
  4225.                             int32_t height)
  4226. {
  4227.     int32_t cnt;
  4228.     v16u8 src0, src1, src2, src3, src4, src5, src6, src7;
  4229.     v16u8 dst0, dst1, dst2, dst3, dst4, dst5, dst6, dst7;
  4230.  
  4231.     for (cnt = (height / 8); cnt--;) {
  4232.         LD_UB8(src, src_stride, src0, src1, src2, src3, src4, src5, src6, src7);
  4233.         src += (8 * src_stride);
  4234.         LD_UB8(dst, dst_stride, dst0, dst1, dst2, dst3, dst4, dst5, dst6, dst7);
  4235.  
  4236.         AVER_UB4_UB(src0, dst0, src1, dst1, src2, dst2, src3, dst3,
  4237.                     dst0, dst1, dst2, dst3);
  4238.         AVER_UB4_UB(src4, dst4, src5, dst5, src6, dst6, src7, dst7,
  4239.                     dst4, dst5, dst6, dst7);
  4240.         ST_UB8(dst0, dst1, dst2, dst3, dst4, dst5, dst6, dst7, dst, dst_stride);
  4241.         dst += (8 * dst_stride);
  4242.     }
  4243. }
  4244.  
  4245. static void avg_width32_msa(const uint8_t *src, int32_t src_stride,
  4246.                             uint8_t *dst, int32_t dst_stride,
  4247.                             int32_t height)
  4248. {
  4249.     int32_t cnt;
  4250.     uint8_t *dst_dup = dst;
  4251.     v16u8 src0, src1, src2, src3, src4, src5, src6, src7;
  4252.     v16u8 src8, src9, src10, src11, src12, src13, src14, src15;
  4253.     v16u8 dst0, dst1, dst2, dst3, dst4, dst5, dst6, dst7;
  4254.     v16u8 dst8, dst9, dst10, dst11, dst12, dst13, dst14, dst15;
  4255.  
  4256.     for (cnt = (height / 8); cnt--;) {
  4257.         LD_UB4(src, src_stride, src0, src2, src4, src6);
  4258.         LD_UB4(src + 16, src_stride, src1, src3, src5, src7);
  4259.         src += (4 * src_stride);
  4260.         LD_UB4(dst_dup, dst_stride, dst0, dst2, dst4, dst6);
  4261.         LD_UB4(dst_dup + 16, dst_stride, dst1, dst3, dst5, dst7);
  4262.         dst_dup += (4 * dst_stride);
  4263.         LD_UB4(src, src_stride, src8, src10, src12, src14);
  4264.         LD_UB4(src + 16, src_stride, src9, src11, src13, src15);
  4265.         src += (4 * src_stride);
  4266.         LD_UB4(dst_dup, dst_stride, dst8, dst10, dst12, dst14);
  4267.         LD_UB4(dst_dup + 16, dst_stride, dst9, dst11, dst13, dst15);
  4268.         dst_dup += (4 * dst_stride);
  4269.  
  4270.         AVER_UB4_UB(src0, dst0, src1, dst1, src2, dst2, src3, dst3,
  4271.                     dst0, dst1, dst2, dst3);
  4272.         AVER_UB4_UB(src4, dst4, src5, dst5, src6, dst6, src7, dst7,
  4273.                     dst4, dst5, dst6, dst7);
  4274.         AVER_UB4_UB(src8, dst8, src9, dst9, src10, dst10, src11, dst11,
  4275.                     dst8, dst9, dst10, dst11);
  4276.         AVER_UB4_UB(src12, dst12, src13, dst13, src14, dst14, src15, dst15,
  4277.                     dst12, dst13, dst14, dst15);
  4278.  
  4279.         ST_UB4(dst0, dst2, dst4, dst6, dst, dst_stride);
  4280.         ST_UB4(dst1, dst3, dst5, dst7, dst + 16, dst_stride);
  4281.         dst += (4 * dst_stride);
  4282.         ST_UB4(dst8, dst10, dst12, dst14, dst, dst_stride);
  4283.         ST_UB4(dst9, dst11, dst13, dst15, dst + 16, dst_stride);
  4284.         dst += (4 * dst_stride);
  4285.     }
  4286. }
  4287.  
  4288. static void avg_width64_msa(const uint8_t *src, int32_t src_stride,
  4289.                             uint8_t *dst, int32_t dst_stride,
  4290.                             int32_t height)
  4291. {
  4292.     int32_t cnt;
  4293.     uint8_t *dst_dup = dst;
  4294.     v16u8 src0, src1, src2, src3, src4, src5, src6, src7;
  4295.     v16u8 src8, src9, src10, src11, src12, src13, src14, src15;
  4296.     v16u8 dst0, dst1, dst2, dst3, dst4, dst5, dst6, dst7;
  4297.     v16u8 dst8, dst9, dst10, dst11, dst12, dst13, dst14, dst15;
  4298.  
  4299.     for (cnt = (height / 4); cnt--;) {
  4300.         LD_UB4(src, 16, src0, src1, src2, src3);
  4301.         src += src_stride;
  4302.         LD_UB4(src, 16, src4, src5, src6, src7);
  4303.         src += src_stride;
  4304.         LD_UB4(src, 16, src8, src9, src10, src11);
  4305.         src += src_stride;
  4306.         LD_UB4(src, 16, src12, src13, src14, src15);
  4307.         src += src_stride;
  4308.  
  4309.         LD_UB4(dst_dup, 16, dst0, dst1, dst2, dst3);
  4310.         dst_dup += dst_stride;
  4311.         LD_UB4(dst_dup, 16, dst4, dst5, dst6, dst7);
  4312.         dst_dup += dst_stride;
  4313.         LD_UB4(dst_dup, 16, dst8, dst9, dst10, dst11);
  4314.         dst_dup += dst_stride;
  4315.         LD_UB4(dst_dup, 16, dst12, dst13, dst14, dst15);
  4316.         dst_dup += dst_stride;
  4317.  
  4318.         AVER_UB4_UB(src0, dst0, src1, dst1, src2, dst2, src3, dst3,
  4319.                     dst0, dst1, dst2, dst3);
  4320.         AVER_UB4_UB(src4, dst4, src5, dst5, src6, dst6, src7, dst7,
  4321.                     dst4, dst5, dst6, dst7);
  4322.         AVER_UB4_UB(src8, dst8, src9, dst9, src10, dst10, src11, dst11,
  4323.                     dst8, dst9, dst10, dst11);
  4324.         AVER_UB4_UB(src12, dst12, src13, dst13, src14, dst14, src15, dst15,
  4325.                     dst12, dst13, dst14, dst15);
  4326.  
  4327.         ST_UB4(dst0, dst1, dst2, dst3, dst, 16);
  4328.         dst += dst_stride;
  4329.         ST_UB4(dst4, dst5, dst6, dst7, dst, 16);
  4330.         dst += dst_stride;
  4331.         ST_UB4(dst8, dst9, dst10, dst11, dst, 16);
  4332.         dst += dst_stride;
  4333.         ST_UB4(dst12, dst13, dst14, dst15, dst, 16);
  4334.         dst += dst_stride;
  4335.     }
  4336. }
  4337.  
  4338. static const int8_t vp9_subpel_filters_msa[3][15][8] = {
  4339.     [FILTER_8TAP_REGULAR] = {
  4340.          {0, 1, -5, 126, 8, -3, 1, 0},
  4341.          {-1, 3, -10, 122, 18, -6, 2, 0},
  4342.          {-1, 4, -13, 118, 27, -9, 3, -1},
  4343.          {-1, 4, -16, 112, 37, -11, 4, -1},
  4344.          {-1, 5, -18, 105, 48, -14, 4, -1},
  4345.          {-1, 5, -19, 97, 58, -16, 5, -1},
  4346.          {-1, 6, -19, 88, 68, -18, 5, -1},
  4347.          {-1, 6, -19, 78, 78, -19, 6, -1},
  4348.          {-1, 5, -18, 68, 88, -19, 6, -1},
  4349.          {-1, 5, -16, 58, 97, -19, 5, -1},
  4350.          {-1, 4, -14, 48, 105, -18, 5, -1},
  4351.          {-1, 4, -11, 37, 112, -16, 4, -1},
  4352.          {-1, 3, -9, 27, 118, -13, 4, -1},
  4353.          {0, 2, -6, 18, 122, -10, 3, -1},
  4354.          {0, 1, -3, 8, 126, -5, 1, 0},
  4355.     }, [FILTER_8TAP_SHARP] = {
  4356.         {-1, 3, -7, 127, 8, -3, 1, 0},
  4357.         {-2, 5, -13, 125, 17, -6, 3, -1},
  4358.         {-3, 7, -17, 121, 27, -10, 5, -2},
  4359.         {-4, 9, -20, 115, 37, -13, 6, -2},
  4360.         {-4, 10, -23, 108, 48, -16, 8, -3},
  4361.         {-4, 10, -24, 100, 59, -19, 9, -3},
  4362.         {-4, 11, -24, 90, 70, -21, 10, -4},
  4363.         {-4, 11, -23, 80, 80, -23, 11, -4},
  4364.         {-4, 10, -21, 70, 90, -24, 11, -4},
  4365.         {-3, 9, -19, 59, 100, -24, 10, -4},
  4366.         {-3, 8, -16, 48, 108, -23, 10, -4},
  4367.         {-2, 6, -13, 37, 115, -20, 9, -4},
  4368.         {-2, 5, -10, 27, 121, -17, 7, -3},
  4369.         {-1, 3, -6, 17, 125, -13, 5, -2},
  4370.         {0, 1, -3, 8, 127, -7, 3, -1},
  4371.     }, [FILTER_8TAP_SMOOTH] = {
  4372.         {-3, -1, 32, 64, 38, 1, -3, 0},
  4373.         {-2, -2, 29, 63, 41, 2, -3, 0},
  4374.         {-2, -2, 26, 63, 43, 4, -4, 0},
  4375.         {-2, -3, 24, 62, 46, 5, -4, 0},
  4376.         {-2, -3, 21, 60, 49, 7, -4, 0},
  4377.         {-1, -4, 18, 59, 51, 9, -4, 0},
  4378.         {-1, -4, 16, 57, 53, 12, -4, -1},
  4379.         {-1, -4, 14, 55, 55, 14, -4, -1},
  4380.         {-1, -4, 12, 53, 57, 16, -4, -1},
  4381.         {0, -4, 9, 51, 59, 18, -4, -1},
  4382.         {0, -4, 7, 49, 60, 21, -3, -2},
  4383.         {0, -4, 5, 46, 62, 24, -3, -2},
  4384.         {0, -4, 4, 43, 63, 26, -2, -2},
  4385.         {0, -3, 2, 41, 63, 29, -2, -2},
  4386.         {0, -3, 1, 38, 64, 32, -1, -3},
  4387.     }
  4388. };
  4389.  
  4390. #define VP9_8TAP_MIPS_MSA_FUNC(SIZE, type, type_idx)                           \
  4391. void ff_put_8tap_##type##_##SIZE##h_msa(uint8_t *dst, ptrdiff_t dststride,     \
  4392.                                         const uint8_t *src,                    \
  4393.                                         ptrdiff_t srcstride,                   \
  4394.                                         int h, int mx, int my)                 \
  4395. {                                                                              \
  4396.     const int8_t *filter = vp9_subpel_filters_msa[type_idx][mx-1];             \
  4397.                                                                                \
  4398.     common_hz_8t_##SIZE##w_msa(src, srcstride, dst, dststride, filter, h);     \
  4399. }                                                                              \
  4400.                                                                                \
  4401. void ff_put_8tap_##type##_##SIZE##v_msa(uint8_t *dst, ptrdiff_t dststride,     \
  4402.                                         const uint8_t *src,                    \
  4403.                                         ptrdiff_t srcstride,                   \
  4404.                                         int h, int mx, int my)                 \
  4405. {                                                                              \
  4406.     const int8_t *filter = vp9_subpel_filters_msa[type_idx][my-1];             \
  4407.                                                                                \
  4408.     common_vt_8t_##SIZE##w_msa(src, srcstride, dst, dststride, filter, h);     \
  4409. }                                                                              \
  4410.                                                                                \
  4411. void ff_put_8tap_##type##_##SIZE##hv_msa(uint8_t *dst, ptrdiff_t dststride,    \
  4412.                                          const uint8_t *src,                   \
  4413.                                          ptrdiff_t srcstride,                  \
  4414.                                          int h, int mx, int my)                \
  4415. {                                                                              \
  4416.     const uint8_t *hfilter = vp9_subpel_filters_msa[type_idx][mx-1];           \
  4417.     const uint8_t *vfilter = vp9_subpel_filters_msa[type_idx][my-1];           \
  4418.                                                                                \
  4419.     common_hv_8ht_8vt_##SIZE##w_msa(src, srcstride, dst, dststride, hfilter,   \
  4420.                                     vfilter, h);                               \
  4421. }                                                                              \
  4422.                                                                                \
  4423. void ff_avg_8tap_##type##_##SIZE##h_msa(uint8_t *dst, ptrdiff_t dststride,     \
  4424.                                         const uint8_t *src,                    \
  4425.                                         ptrdiff_t srcstride,                   \
  4426.                                         int h, int mx, int my)                 \
  4427. {                                                                              \
  4428.     const int8_t *filter = vp9_subpel_filters_msa[type_idx][mx-1];             \
  4429.                                                                                \
  4430.     common_hz_8t_and_aver_dst_##SIZE##w_msa(src, srcstride, dst,               \
  4431.                                             dststride, filter, h);             \
  4432. }                                                                              \
  4433.                                                                                \
  4434. void ff_avg_8tap_##type##_##SIZE##v_msa(uint8_t *dst, ptrdiff_t dststride,     \
  4435.                                         const uint8_t *src,                    \
  4436.                                         ptrdiff_t srcstride,                   \
  4437.                                         int h, int mx, int my)                 \
  4438. {                                                                              \
  4439.     const int8_t *filter = vp9_subpel_filters_msa[type_idx][my-1];             \
  4440.                                                                                \
  4441.     common_vt_8t_and_aver_dst_##SIZE##w_msa(src, srcstride, dst, dststride,    \
  4442.                                             filter, h);                        \
  4443. }                                                                              \
  4444.                                                                                \
  4445. void ff_avg_8tap_##type##_##SIZE##hv_msa(uint8_t *dst, ptrdiff_t dststride,    \
  4446.                                          const uint8_t *src,                   \
  4447.                                          ptrdiff_t srcstride,                  \
  4448.                                          int h, int mx, int my)                \
  4449. {                                                                              \
  4450.     const uint8_t *hfilter = vp9_subpel_filters_msa[type_idx][mx-1];           \
  4451.     const uint8_t *vfilter = vp9_subpel_filters_msa[type_idx][my-1];           \
  4452.                                                                                \
  4453.     common_hv_8ht_8vt_and_aver_dst_##SIZE##w_msa(src, srcstride, dst,          \
  4454.                                                  dststride, hfilter,           \
  4455.                                                  vfilter, h);                  \
  4456. }
  4457.  
  4458. #define VP9_COPY_AVG_MIPS_MSA_FUNC(SIZE)                           \
  4459. void ff_copy##SIZE##_msa(uint8_t *dst, ptrdiff_t dststride,        \
  4460.                          const uint8_t *src, ptrdiff_t srcstride,  \
  4461.                          int h, int mx, int my)                    \
  4462. {                                                                  \
  4463.                                                                    \
  4464.     copy_width##SIZE##_msa(src, srcstride, dst, dststride, h);     \
  4465. }                                                                  \
  4466.                                                                    \
  4467. void ff_avg##SIZE##_msa(uint8_t *dst, ptrdiff_t dststride,         \
  4468.                         const uint8_t *src, ptrdiff_t srcstride,   \
  4469.                         int h, int mx, int my)                     \
  4470. {                                                                  \
  4471.                                                                    \
  4472.     avg_width##SIZE##_msa(src, srcstride, dst, dststride, h);      \
  4473. }
  4474.  
  4475. #define VP9_AVG_MIPS_MSA_FUNC(SIZE)                               \
  4476. void ff_avg##SIZE##_msa(uint8_t *dst, ptrdiff_t dststride,        \
  4477.                         const uint8_t *src, ptrdiff_t srcstride,  \
  4478.                         int h, int mx, int my)                    \
  4479. {                                                                 \
  4480.                                                                   \
  4481.     avg_width##SIZE##_msa(src, srcstride, dst, dststride, h);     \
  4482. }
  4483.  
  4484. VP9_8TAP_MIPS_MSA_FUNC(64, regular, FILTER_8TAP_REGULAR);
  4485. VP9_8TAP_MIPS_MSA_FUNC(32, regular, FILTER_8TAP_REGULAR);
  4486. VP9_8TAP_MIPS_MSA_FUNC(16, regular, FILTER_8TAP_REGULAR);
  4487. VP9_8TAP_MIPS_MSA_FUNC(8, regular, FILTER_8TAP_REGULAR);
  4488. VP9_8TAP_MIPS_MSA_FUNC(4, regular, FILTER_8TAP_REGULAR);
  4489.  
  4490. VP9_8TAP_MIPS_MSA_FUNC(64, sharp, FILTER_8TAP_SHARP);
  4491. VP9_8TAP_MIPS_MSA_FUNC(32, sharp, FILTER_8TAP_SHARP);
  4492. VP9_8TAP_MIPS_MSA_FUNC(16, sharp, FILTER_8TAP_SHARP);
  4493. VP9_8TAP_MIPS_MSA_FUNC(8, sharp, FILTER_8TAP_SHARP);
  4494. VP9_8TAP_MIPS_MSA_FUNC(4, sharp, FILTER_8TAP_SHARP);
  4495.  
  4496. VP9_8TAP_MIPS_MSA_FUNC(64, smooth, FILTER_8TAP_SMOOTH);
  4497. VP9_8TAP_MIPS_MSA_FUNC(32, smooth, FILTER_8TAP_SMOOTH);
  4498. VP9_8TAP_MIPS_MSA_FUNC(16, smooth, FILTER_8TAP_SMOOTH);
  4499. VP9_8TAP_MIPS_MSA_FUNC(8, smooth, FILTER_8TAP_SMOOTH);
  4500. VP9_8TAP_MIPS_MSA_FUNC(4, smooth, FILTER_8TAP_SMOOTH);
  4501.  
  4502. VP9_COPY_AVG_MIPS_MSA_FUNC(64);
  4503. VP9_COPY_AVG_MIPS_MSA_FUNC(32);
  4504. VP9_COPY_AVG_MIPS_MSA_FUNC(16);
  4505. VP9_COPY_AVG_MIPS_MSA_FUNC(8);
  4506. VP9_AVG_MIPS_MSA_FUNC(4);
  4507.  
  4508. #undef VP9_8TAP_MIPS_MSA_FUNC
  4509. #undef VP9_COPY_AVG_MIPS_MSA_FUNC
  4510. #undef VP9_AVG_MIPS_MSA_FUNC
  4511.