Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * Copyright (c) 2015 Parag Salasakar (Parag.Salasakar@imgtec.com)
  3.  *
  4.  * This file is part of FFmpeg.
  5.  *
  6.  * FFmpeg is free software; you can redistribute it and/or
  7.  * modify it under the terms of the GNU Lesser General Public
  8.  * License as published by the Free Software Foundation; either
  9.  * version 2.1 of the License, or (at your option) any later version.
  10.  *
  11.  * FFmpeg is distributed in the hope that it will be useful,
  12.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  14.  * Lesser General Public License for more details.
  15.  *
  16.  * You should have received a copy of the GNU Lesser General Public
  17.  * License along with FFmpeg; if not, write to the Free Software
  18.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  19.  */
  20.  
  21. #include "libavutil/mips/generic_macros_msa.h"
  22. #include "qpeldsp_mips.h"
  23.  
  24. #define APPLY_HORIZ_QPEL_FILTER(inp0, inp1, mask, coef0, coef1, coef2)  \
  25. ( {                                                                     \
  26.     v16u8 out, tmp0, tmp1;                                              \
  27.     v16u8 data0, data1, data2, data3, data4, data5;                     \
  28.     v8i16 res_r, res_l;                                                 \
  29.     v8u16 sum0_r, sum1_r, sum2_r, sum3_r;                               \
  30.     v8u16 sum0_l, sum1_l, sum2_l, sum3_l;                               \
  31.                                                                         \
  32.     VSHF_B2_UB(inp0, inp0, inp1, inp1, mask, mask, tmp0, tmp1);         \
  33.     ILVRL_B2_UH(inp1, inp0, sum0_r, sum0_l);                            \
  34.     data0 = (v16u8) __msa_sldi_b((v16i8) inp0, (v16i8) tmp0, 15);       \
  35.     data3 = (v16u8) __msa_sldi_b((v16i8) tmp1, (v16i8) inp1, 1);        \
  36.     HADD_UB2_UH(sum0_r, sum0_l, sum0_r, sum0_l);                        \
  37.     ILVRL_B2_UH(data3, data0, sum1_r, sum1_l);                          \
  38.     data1 = (v16u8) __msa_sldi_b((v16i8) inp0, (v16i8) tmp0, 14);       \
  39.     data4 = (v16u8) __msa_sldi_b((v16i8) tmp1, (v16i8) inp1, 2);        \
  40.     sum0_r *= (v8u16) (coef0);                                          \
  41.     sum0_l *= (v8u16) (coef0);                                          \
  42.     ILVRL_B2_UH(data4, data1, sum2_r, sum2_l);                          \
  43.     data2 = (v16u8) __msa_sldi_b((v16i8) inp0, (v16i8) tmp0, 13);       \
  44.     data5 = (v16u8) __msa_sldi_b((v16i8) tmp1, (v16i8) inp1, 3);        \
  45.     DPADD_UB2_UH(sum2_r, sum2_l, coef2, coef2, sum0_r, sum0_l);         \
  46.     ILVRL_B2_UH(data5, data2, sum3_r, sum3_l);                          \
  47.     HADD_UB2_UH(sum3_r, sum3_l, sum3_r, sum3_l);                        \
  48.     DPADD_UB2_UH(sum1_r, sum1_l, coef1, coef1, sum3_r, sum3_l);         \
  49.     res_r = (v8i16) (sum0_r - sum3_r);                                  \
  50.     res_l = (v8i16) (sum0_l - sum3_l);                                  \
  51.     SRARI_H2_SH(res_r, res_l, 5);                                       \
  52.     CLIP_SH2_0_255(res_r, res_l);                                       \
  53.     out = (v16u8) __msa_pckev_b((v16i8) res_l, (v16i8) res_r);          \
  54.                                                                         \
  55.     out;                                                                \
  56. } )
  57.  
  58. #define APPLY_HORIZ_QPEL_FILTER_8BYTE(inp0, inp1,                       \
  59.                                       mask0, mask1, mask2, mask3,       \
  60.                                       coef0, coef1, coef2)              \
  61. ( {                                                                     \
  62.     v16u8 out;                                                          \
  63.     v8u16 sum0_r, sum1_r, sum2_r, sum3_r;                               \
  64.     v8u16 sum4_r, sum5_r, sum6_r, sum7_r;                               \
  65.     v8i16 res0_r, res1_r;                                               \
  66.                                                                         \
  67.     VSHF_B2_UH(inp0, inp0, inp1, inp1, mask0, mask0, sum0_r, sum4_r);   \
  68.     VSHF_B2_UH(inp0, inp0, inp1, inp1, mask3, mask3, sum3_r, sum7_r);   \
  69.     HADD_UB2_UH(sum3_r, sum7_r, sum3_r, sum7_r);                        \
  70.     DOTP_UB2_UH(sum0_r, sum4_r, coef0, coef0, sum0_r, sum4_r);          \
  71.     VSHF_B2_UH(inp0, inp0, inp1, inp1, mask2, mask2, sum2_r, sum6_r);   \
  72.     VSHF_B2_UH(inp0, inp0, inp1, inp1, mask1, mask1, sum1_r, sum5_r);   \
  73.     DPADD_UB2_UH(sum2_r, sum6_r, coef2, coef2, sum0_r, sum4_r);         \
  74.     DPADD_UB2_UH(sum1_r, sum5_r, coef1, coef1, sum3_r, sum7_r);         \
  75.     res0_r = (v8i16) (sum0_r - sum3_r);                                 \
  76.     res1_r = (v8i16) (sum4_r - sum7_r);                                 \
  77.     SRARI_H2_SH(res0_r, res1_r, 5);                                     \
  78.     CLIP_SH2_0_255(res0_r, res1_r);                                     \
  79.     out = (v16u8) __msa_pckev_b((v16i8) res1_r, (v16i8) res0_r);        \
  80.                                                                         \
  81.     out;                                                                \
  82. } )
  83.  
  84. #define APPLY_HORIZ_QPEL_FILTER_8BYTE_1ROW(inp0,                        \
  85.                                            mask0, mask1, mask2, mask3,  \
  86.                                            coef0, coef1, coef2)         \
  87. ( {                                                                     \
  88.     v16u8 out;                                                          \
  89.     v8i16 res0_r;                                                       \
  90.     v8u16 sum0_r, sum1_r, sum2_r, sum3_r;                               \
  91.                                                                         \
  92.     VSHF_B2_UH(inp0, inp0, inp0, inp0, mask0, mask3, sum0_r, sum3_r);   \
  93.     sum3_r = __msa_hadd_u_h((v16u8) sum3_r, (v16u8) sum3_r);            \
  94.     sum0_r = __msa_dotp_u_h((v16u8) sum0_r, (v16u8) coef0);             \
  95.     VSHF_B2_UH(inp0, inp0, inp0, inp0, mask2, mask1, sum2_r, sum1_r);   \
  96.     DPADD_UB2_UH(sum2_r, sum1_r, coef2, coef1, sum0_r, sum3_r);         \
  97.     res0_r = (v8i16) (sum0_r - sum3_r);                                 \
  98.     res0_r = __msa_srari_h(res0_r, 5);                                  \
  99.     res0_r = CLIP_SH_0_255(res0_r);                                     \
  100.     out = (v16u8) __msa_pckev_b((v16i8) res0_r, (v16i8) res0_r);        \
  101.                                                                         \
  102.     out;                                                                \
  103. } )
  104.  
  105. #define APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE_1ROW(inp0, mask0, mask1,   \
  106.                                                     mask2, mask3, coef0,  \
  107.                                                     coef1, coef2)         \
  108. ( {                                                                       \
  109.     v16u8 out;                                                            \
  110.     v8i16 res0_r;                                                         \
  111.     v8u16 sum0_r, sum1_r, sum2_r, sum3_r;                                 \
  112.                                                                           \
  113.     VSHF_B2_UH(inp0, inp0, inp0, inp0, mask0, mask3, sum0_r, sum3_r);     \
  114.     sum3_r = __msa_hadd_u_h((v16u8) sum3_r, (v16u8) sum3_r);              \
  115.     sum0_r = __msa_dotp_u_h((v16u8) sum0_r, (v16u8) coef0);               \
  116.     VSHF_B2_UH(inp0, inp0, inp0, inp0, mask2, mask1, sum2_r, sum1_r);     \
  117.     DPADD_UB2_UH(sum2_r, sum1_r, coef2, coef1, sum0_r, sum3_r);           \
  118.     res0_r = (v8i16) (sum0_r - sum3_r);                                   \
  119.     res0_r += 15;                                                         \
  120.     res0_r >>= 5;                                                         \
  121.     res0_r = CLIP_SH_0_255(res0_r);                                       \
  122.     out = (v16u8) __msa_pckev_b((v16i8) res0_r, (v16i8) res0_r);          \
  123.                                                                           \
  124.     out;                                                                  \
  125. } )
  126.  
  127. #define APPLY_HORIZ_QPEL_NO_ROUND_FILTER(inp0, inp1, mask,              \
  128.                                          coef0, coef1, coef2)           \
  129. ( {                                                                     \
  130.     v16u8 out, tmp0, tmp1;                                              \
  131.     v16u8 data0, data1, data2, data3, data4, data5;                     \
  132.     v8i16 res_r, res_l;                                                 \
  133.     v8u16 sum0_r, sum1_r, sum2_r, sum3_r;                               \
  134.     v8u16 sum0_l, sum1_l, sum2_l, sum3_l;                               \
  135.                                                                         \
  136.     VSHF_B2_UB(inp0, inp0, inp1, inp1, mask, mask, tmp0, tmp1);         \
  137.     ILVRL_B2_UH(inp1, inp0, sum0_r, sum0_l);                            \
  138.     data0 = (v16u8) __msa_sldi_b((v16i8) inp0, (v16i8) tmp0, 15);       \
  139.     data3 = (v16u8) __msa_sldi_b((v16i8) tmp1, (v16i8) inp1, 1);        \
  140.     HADD_UB2_UH(sum0_r, sum0_l, sum0_r, sum0_l);                        \
  141.     ILVRL_B2_UH(data3, data0, sum1_r, sum1_l);                          \
  142.     data1 = (v16u8) __msa_sldi_b((v16i8) inp0, (v16i8) tmp0, 14);       \
  143.     data4 = (v16u8) __msa_sldi_b((v16i8) tmp1, (v16i8) inp1, 2);        \
  144.     sum0_r *= (v8u16) (coef0);                                          \
  145.     sum0_l *= (v8u16) (coef0);                                          \
  146.     ILVRL_B2_UH(data4, data1, sum2_r, sum2_l);                          \
  147.     data2 = (v16u8) __msa_sldi_b((v16i8) inp0, (v16i8) tmp0, 13);       \
  148.     data5 = (v16u8) __msa_sldi_b((v16i8) tmp1, (v16i8) inp1, 3);        \
  149.     DPADD_UB2_UH(sum2_r, sum2_l, coef2, coef2, sum0_r, sum0_l);         \
  150.     ILVRL_B2_UH(data5, data2, sum3_r, sum3_l);                          \
  151.     HADD_UB2_UH(sum3_r, sum3_l, sum3_r, sum3_l);                        \
  152.     DPADD_UB2_UH(sum1_r, sum1_l, coef1, coef1, sum3_r, sum3_l);         \
  153.     res_r = (v8i16) (sum0_r - sum3_r);                                  \
  154.     res_l = (v8i16) (sum0_l - sum3_l);                                  \
  155.     res_r += 15;                                                        \
  156.     res_l += 15;                                                        \
  157.     res_r >>= 5;                                                        \
  158.     res_l >>= 5;                                                        \
  159.     CLIP_SH2_0_255(res_r, res_l);                                       \
  160.     out = (v16u8) __msa_pckev_b((v16i8) res_l, (v16i8) res_r);          \
  161.                                                                         \
  162.     out;                                                                \
  163. } )
  164.  
  165. #define APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp0, inp1,                  \
  166.                                                mask0, mask1, mask2, mask3,  \
  167.                                                coef0, coef1, coef2)         \
  168. ( {                                                                         \
  169.     v16u8 out;                                                              \
  170.     v8i16 res0_r, res1_r;                                                   \
  171.     v8u16 sum0_r, sum1_r, sum2_r, sum3_r;                                   \
  172.     v8u16 sum4_r, sum5_r, sum6_r, sum7_r;                                   \
  173.                                                                             \
  174.     VSHF_B2_UH(inp0, inp0, inp1, inp1, mask0, mask0, sum0_r, sum4_r);       \
  175.     VSHF_B2_UH(inp0, inp0, inp1, inp1, mask3, mask3, sum3_r, sum7_r);       \
  176.     HADD_UB2_UH(sum3_r, sum7_r, sum3_r, sum7_r);                            \
  177.     DOTP_UB2_UH(sum0_r, sum4_r, coef0, coef0, sum0_r, sum4_r);              \
  178.     VSHF_B2_UH(inp0, inp0, inp1, inp1, mask2, mask2, sum2_r, sum6_r);       \
  179.     VSHF_B2_UH(inp0, inp0, inp1, inp1, mask1, mask1, sum1_r, sum5_r);       \
  180.     DPADD_UB2_UH(sum2_r, sum6_r, coef2, coef2, sum0_r, sum4_r);             \
  181.     DPADD_UB2_UH(sum1_r, sum5_r, coef1, coef1, sum3_r, sum7_r);             \
  182.     res0_r = (v8i16) (sum0_r - sum3_r);                                     \
  183.     res1_r = (v8i16) (sum4_r - sum7_r);                                     \
  184.     res0_r += 15;                                                           \
  185.     res1_r += 15;                                                           \
  186.     res0_r >>= 5;                                                           \
  187.     res1_r >>= 5;                                                           \
  188.     CLIP_SH2_0_255(res0_r, res1_r);                                         \
  189.     out = (v16u8) __msa_pckev_b((v16i8) res1_r, (v16i8) res0_r);            \
  190.                                                                             \
  191.     out;                                                                    \
  192. } )
  193.  
  194. #define APPLY_VERT_QPEL_FILTER(inp0, inp1, inp2, inp3,                  \
  195.                                inp4, inp5, inp6, inp7,                  \
  196.                                coef0, coef1, coef2)                     \
  197. ( {                                                                     \
  198.     v16u8 res;                                                          \
  199.     v8i16 res_r, res_l;                                                 \
  200.     v8u16 sum0_r, sum1_r, sum2_r, sum3_r;                               \
  201.     v8u16 sum0_l, sum1_l, sum2_l, sum3_l;                               \
  202.                                                                         \
  203.     ILVRL_B2_UH(inp4, inp0, sum0_r, sum0_l);                            \
  204.     ILVRL_B2_UH(inp7, inp3, sum3_r, sum3_l);                            \
  205.     DOTP_UB2_UH(sum0_r, sum0_l, coef0, coef0, sum0_r, sum0_l);          \
  206.     HADD_UB2_UH(sum3_r, sum3_l, sum3_r, sum3_l);                        \
  207.     ILVRL_B2_UH(inp6, inp2, sum2_r, sum2_l);                            \
  208.     ILVRL_B2_UH(inp5, inp1, sum1_r, sum1_l);                            \
  209.     DPADD_UB2_UH(sum2_r, sum2_l, coef2, coef2, sum0_r, sum0_l);         \
  210.     DPADD_UB2_UH(sum1_r, sum1_l, coef1, coef1, sum3_r, sum3_l);         \
  211.     res_r = (v8i16) (sum0_r - sum3_r);                                  \
  212.     res_l = (v8i16) (sum0_l - sum3_l);                                  \
  213.     SRARI_H2_SH(res_r, res_l, 5);                                       \
  214.     CLIP_SH2_0_255(res_r, res_l);                                       \
  215.     res = (v16u8) __msa_pckev_b((v16i8) res_l, (v16i8) res_r);          \
  216.                                                                         \
  217.     res;                                                                \
  218. } )
  219.  
  220. #define APPLY_VERT_QPEL_FILTER_8BYTE(inp00, inp01, inp02, inp03,        \
  221.                                      inp04, inp05, inp06, inp07,        \
  222.                                      inp10, inp11, inp12, inp13,        \
  223.                                      inp14, inp15, inp16, inp17,        \
  224.                                      coef0, coef1, coef2)               \
  225. ( {                                                                     \
  226.     v16u8 res;                                                          \
  227.     v8i16 val0, val1;                                                   \
  228.     v8u16 sum00, sum01, sum02, sum03;                                   \
  229.     v8u16 sum10, sum11, sum12, sum13;                                   \
  230.                                                                         \
  231.     ILVR_B4_UH(inp04, inp00, inp14, inp10, inp07, inp03, inp17, inp13,  \
  232.                sum00, sum10, sum03, sum13);                             \
  233.     DOTP_UB2_UH(sum00, sum10, coef0, coef0, sum00, sum10);              \
  234.     HADD_UB2_UH(sum03, sum13, sum03, sum13);                            \
  235.     ILVR_B4_UH(inp06, inp02, inp16, inp12, inp05, inp01, inp15, inp11,  \
  236.                sum02, sum12, sum01, sum11);                             \
  237.     DPADD_UB2_UH(sum02, sum12, coef2, coef2, sum00, sum10);             \
  238.     DPADD_UB2_UH(sum01, sum11, coef1, coef1, sum03, sum13);             \
  239.     val0 = (v8i16) (sum00 - sum03);                                     \
  240.     val1 = (v8i16) (sum10 - sum13);                                     \
  241.     SRARI_H2_SH(val0, val1, 5);                                         \
  242.     CLIP_SH2_0_255(val0, val1);                                         \
  243.     res = (v16u8) __msa_pckev_b((v16i8) val1, (v16i8) val0);            \
  244.                                                                         \
  245.     res;                                                                \
  246. } )
  247.  
  248. #define APPLY_VERT_QPEL_NO_ROUND_FILTER(inp0, inp1, inp2, inp3,         \
  249.                                         inp4, inp5, inp6, inp7,         \
  250.                                         coef0, coef1, coef2)            \
  251. ( {                                                                     \
  252.     v16u8 res;                                                          \
  253.     v8i16 res_r, res_l;                                                 \
  254.     v8u16 sum0_r, sum1_r, sum2_r, sum3_r;                               \
  255.     v8u16 sum0_l, sum1_l, sum2_l, sum3_l;                               \
  256.                                                                         \
  257.     ILVRL_B2_UH(inp4, inp0, sum0_r, sum0_l);                            \
  258.     ILVRL_B2_UH(inp7, inp3, sum3_r, sum3_l);                            \
  259.     DOTP_UB2_UH(sum0_r, sum0_l, coef0, coef0, sum0_r, sum0_l);          \
  260.     HADD_UB2_UH(sum3_r, sum3_l, sum3_r, sum3_l);                        \
  261.     ILVRL_B2_UH(inp6, inp2, sum2_r, sum2_l);                            \
  262.     ILVRL_B2_UH(inp5, inp1, sum1_r, sum1_l);                            \
  263.     DPADD_UB2_UH(sum2_r, sum2_l, coef2, coef2, sum0_r, sum0_l);         \
  264.     DPADD_UB2_UH(sum1_r, sum1_l, coef1, coef1, sum3_r, sum3_l);         \
  265.     res_r = (v8i16) (sum0_r - sum3_r);                                  \
  266.     res_l = (v8i16) (sum0_l - sum3_l);                                  \
  267.     res_r += 15;                                                        \
  268.     res_l += 15;                                                        \
  269.     res_r >>= 5;                                                        \
  270.     res_l >>= 5;                                                        \
  271.     CLIP_SH2_0_255(res_r, res_l);                                       \
  272.     res = (v16u8) __msa_pckev_b((v16i8) res_l, (v16i8) res_r);          \
  273.                                                                         \
  274.     res;                                                                \
  275. } )
  276.  
  277. #define APPLY_VERT_QPEL_NO_ROUND_FILTER_8BYTE(inp00, inp01, inp02, inp03,  \
  278.                                               inp04, inp05, inp06, inp07,  \
  279.                                               inp10, inp11, inp12, inp13,  \
  280.                                               inp14, inp15, inp16, inp17,  \
  281.                                               coef0, coef1, coef2)         \
  282. ( {                                                                        \
  283.     v16u8 res;                                                             \
  284.     v8i16 val0, val1;                                                      \
  285.     v8u16 sum00, sum01, sum02, sum03;                                      \
  286.     v8u16 sum10, sum11, sum12, sum13;                                      \
  287.                                                                            \
  288.     ILVR_B4_UH(inp04, inp00, inp14, inp10, inp07, inp03, inp17, inp13,     \
  289.                sum00, sum10, sum03, sum13);                                \
  290.     DOTP_UB2_UH(sum00, sum10, coef0, coef0, sum00, sum10);                 \
  291.     HADD_UB2_UH(sum03, sum13, sum03, sum13);                               \
  292.     ILVR_B4_UH(inp06, inp02, inp16, inp12, inp05, inp01, inp15, inp11,     \
  293.                sum02, sum12, sum01, sum11);                                \
  294.     DPADD_UB2_UH(sum02, sum12, coef2, coef2, sum00, sum10);                \
  295.     DPADD_UB2_UH(sum01, sum11, coef1, coef1, sum03, sum13);                \
  296.     val0 = (v8i16) (sum00 - sum03);                                        \
  297.     val1 = (v8i16) (sum10 - sum13);                                        \
  298.     val0 += 15;                                                            \
  299.     val1 += 15;                                                            \
  300.     val0 >>= 5;                                                            \
  301.     val1 >>= 5;                                                            \
  302.     CLIP_SH2_0_255(val0, val1);                                            \
  303.     res = (v16u8) __msa_pckev_b((v16i8) val1, (v16i8) val0);               \
  304.                                                                            \
  305.     res;                                                                   \
  306. } )
  307.  
  308. static void horiz_mc_qpel_aver_src0_8width_msa(const uint8_t *src,
  309.                                                int32_t src_stride,
  310.                                                uint8_t *dst,
  311.                                                int32_t dst_stride,
  312.                                                int32_t height)
  313. {
  314.     uint8_t loop_count;
  315.     v16u8 inp0, inp1, inp2, inp3;
  316.     v16u8 res0, res1;
  317.     v16u8 mask0 = { 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8 };
  318.     v16u8 mask1 = { 0, 2, 0, 3, 1, 4, 2, 5, 3, 6, 4, 7, 5, 8, 6, 8 };
  319.     v16u8 mask2 = { 1, 3, 0, 4, 0, 5, 1, 6, 2, 7, 3, 8, 4, 8, 5, 7 };
  320.     v16u8 mask3 = { 2, 4, 1, 5, 0, 6, 0, 7, 1, 8, 2, 8, 3, 7, 4, 6 };
  321.     v16u8 const20 = (v16u8) __msa_ldi_b(20);
  322.     v16u8 const6 = (v16u8) __msa_ldi_b(6);
  323.     v16u8 const3 = (v16u8) __msa_ldi_b(3);
  324.  
  325.     for (loop_count = (height >> 2); loop_count--;) {
  326.         LD_UB4(src, src_stride, inp0, inp1, inp2, inp3);
  327.         src += (4 * src_stride);
  328.         res0 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp0, inp1,
  329.                                              mask0, mask1, mask2, mask3,
  330.                                              const20, const6, const3);
  331.         res1 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp2, inp3,
  332.                                              mask0, mask1, mask2, mask3,
  333.                                              const20, const6, const3);
  334.         inp0 = (v16u8) __msa_insve_d((v2i64) inp0, 1, (v2i64) inp1);
  335.         inp2 = (v16u8) __msa_insve_d((v2i64) inp2, 1, (v2i64) inp3);
  336.         AVER_UB2_UB(inp0, res0, inp2, res1, res0, res1);
  337.         ST8x4_UB(res0, res1, dst, dst_stride);
  338.         dst += (4 * dst_stride);
  339.     }
  340. }
  341.  
  342. static void horiz_mc_qpel_aver_src0_16width_msa(const uint8_t *src,
  343.                                                 int32_t src_stride,
  344.                                                 uint8_t *dst,
  345.                                                 int32_t dst_stride,
  346.                                                 int32_t height)
  347. {
  348.     uint8_t loop_count;
  349.     v16u8 inp0, inp1, inp2, inp3, inp4, inp5, inp6, inp7;
  350.     v16u8 res;
  351.     v16u8 mask = { 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
  352.     v16u8 const6 = (v16u8) __msa_ldi_b(6);
  353.     v16u8 const3 = (v16u8) __msa_ldi_b(3);
  354.     v8u16 const20 = (v8u16) __msa_ldi_h(20);
  355.  
  356.     for (loop_count = (height >> 2); loop_count--;) {
  357.         LD_UB4(src, src_stride, inp0, inp2, inp4, inp6);
  358.         LD_UB4((src + 1), src_stride, inp1, inp3, inp5, inp7);
  359.         src += (4 * src_stride);
  360.         res = APPLY_HORIZ_QPEL_FILTER(inp0, inp1, mask,
  361.                                       const20, const6, const3);
  362.         res = __msa_aver_u_b(inp0, res);
  363.         ST_UB(res, dst);
  364.         dst += dst_stride;
  365.  
  366.         res = APPLY_HORIZ_QPEL_FILTER(inp2, inp3, mask,
  367.                                       const20, const6, const3);
  368.         res = __msa_aver_u_b(inp2, res);
  369.         ST_UB(res, dst);
  370.         dst += dst_stride;
  371.  
  372.         res = APPLY_HORIZ_QPEL_FILTER(inp4, inp5, mask,
  373.                                       const20, const6, const3);
  374.         res = __msa_aver_u_b(inp4, res);
  375.         ST_UB(res, dst);
  376.         dst += dst_stride;
  377.  
  378.         res = APPLY_HORIZ_QPEL_FILTER(inp6, inp7, mask,
  379.                                       const20, const6, const3);
  380.         res = __msa_aver_u_b(inp6, res);
  381.         ST_UB(res, dst);
  382.         dst += dst_stride;
  383.     }
  384. }
  385.  
  386. static void horiz_mc_qpel_8width_msa(const uint8_t *src,
  387.                                      int32_t src_stride,
  388.                                      uint8_t *dst,
  389.                                      int32_t dst_stride,
  390.                                      int32_t height)
  391. {
  392.     uint8_t loop_count;
  393.     v16u8 inp0, inp1, inp2, inp3;
  394.     v16u8 res0, res1;
  395.     v16u8 mask0 = { 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8 };
  396.     v16u8 mask1 = { 0, 2, 0, 3, 1, 4, 2, 5, 3, 6, 4, 7, 5, 8, 6, 8 };
  397.     v16u8 mask2 = { 1, 3, 0, 4, 0, 5, 1, 6, 2, 7, 3, 8, 4, 8, 5, 7 };
  398.     v16u8 mask3 = { 2, 4, 1, 5, 0, 6, 0, 7, 1, 8, 2, 8, 3, 7, 4, 6 };
  399.     v16u8 const20 = (v16u8) __msa_ldi_b(20);
  400.     v16u8 const6 = (v16u8) __msa_ldi_b(6);
  401.     v16u8 const3 = (v16u8) __msa_ldi_b(3);
  402.  
  403.     for (loop_count = (height >> 2); loop_count--;) {
  404.         LD_UB4(src, src_stride, inp0, inp1, inp2, inp3);
  405.         src += (4 * src_stride);
  406.         res0 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp0, inp1,
  407.                                              mask0, mask1, mask2, mask3,
  408.                                              const20, const6, const3);
  409.         res1 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp2, inp3,
  410.                                              mask0, mask1, mask2, mask3,
  411.                                              const20, const6, const3);
  412.         ST8x4_UB(res0, res1, dst, dst_stride);
  413.         dst += (4 * dst_stride);
  414.     }
  415. }
  416.  
  417. static void horiz_mc_qpel_16width_msa(const uint8_t *src,
  418.                                       int32_t src_stride,
  419.                                       uint8_t *dst,
  420.                                       int32_t dst_stride,
  421.                                       int32_t height)
  422. {
  423.     uint8_t loop_count;
  424.     v16u8 inp0, inp1, inp2, inp3, inp4, inp5, inp6, inp7;
  425.     v16u8 res;
  426.     v16u8 mask = { 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
  427.     v8u16 const20 = (v8u16) __msa_ldi_h(20);
  428.     v16u8 const6 = (v16u8) __msa_ldi_b(6);
  429.     v16u8 const3 = (v16u8) __msa_ldi_b(3);
  430.  
  431.     for (loop_count = (height >> 2); loop_count--;) {
  432.         LD_UB4(src, src_stride, inp0, inp2, inp4, inp6);
  433.         LD_UB4((src + 1), src_stride, inp1, inp3, inp5, inp7);
  434.         src += (4 * src_stride);
  435.         res = APPLY_HORIZ_QPEL_FILTER(inp0, inp1, mask,
  436.                                       const20, const6, const3);
  437.         ST_UB(res, dst);
  438.         dst += dst_stride;
  439.  
  440.         res = APPLY_HORIZ_QPEL_FILTER(inp2, inp3, mask,
  441.                                       const20, const6, const3);
  442.         ST_UB(res, dst);
  443.         dst += dst_stride;
  444.  
  445.         res = APPLY_HORIZ_QPEL_FILTER(inp4, inp5, mask,
  446.                                       const20, const6, const3);
  447.         ST_UB(res, dst);
  448.         dst += dst_stride;
  449.  
  450.         res = APPLY_HORIZ_QPEL_FILTER(inp6, inp7, mask,
  451.                                       const20, const6, const3);
  452.         ST_UB(res, dst);
  453.         dst += dst_stride;
  454.     }
  455. }
  456.  
  457. static void horiz_mc_qpel_aver_src1_8width_msa(const uint8_t *src,
  458.                                                int32_t src_stride,
  459.                                                uint8_t *dst,
  460.                                                int32_t dst_stride,
  461.                                                int32_t height)
  462. {
  463.     uint8_t loop_count;
  464.     v16u8 inp0, inp1, inp2, inp3;
  465.     v16u8 res0, res1;
  466.     v16u8 mask0 = { 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8 };
  467.     v16u8 mask1 = { 0, 2, 0, 3, 1, 4, 2, 5, 3, 6, 4, 7, 5, 8, 6, 8 };
  468.     v16u8 mask2 = { 1, 3, 0, 4, 0, 5, 1, 6, 2, 7, 3, 8, 4, 8, 5, 7 };
  469.     v16u8 mask3 = { 2, 4, 1, 5, 0, 6, 0, 7, 1, 8, 2, 8, 3, 7, 4, 6 };
  470.     v16u8 const20 = (v16u8) __msa_ldi_b(20);
  471.     v16u8 const6 = (v16u8) __msa_ldi_b(6);
  472.     v16u8 const3 = (v16u8) __msa_ldi_b(3);
  473.  
  474.     for (loop_count = (height >> 2); loop_count--;) {
  475.         LD_UB4(src, src_stride, inp0, inp1, inp2, inp3);
  476.         src += (4 * src_stride);
  477.         res0 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp0, inp1,
  478.                                              mask0, mask1, mask2, mask3,
  479.                                              const20, const6, const3);
  480.         res1 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp2, inp3,
  481.                                              mask0, mask1, mask2, mask3,
  482.                                              const20, const6, const3);
  483.         SLDI_B2_UB(inp0, inp1, inp0, inp1, inp0, inp1, 1);
  484.         SLDI_B2_UB(inp2, inp3, inp2, inp3, inp2, inp3, 1);
  485.         inp0 = (v16u8) __msa_insve_d((v2i64) inp0, 1, (v2i64) inp1);
  486.         inp2 = (v16u8) __msa_insve_d((v2i64) inp2, 1, (v2i64) inp3);
  487.         AVER_UB2_UB(inp0, res0, inp2, res1, res0, res1);
  488.         ST8x4_UB(res0, res1, dst, dst_stride);
  489.         dst += (4 * dst_stride);
  490.     }
  491. }
  492.  
  493. static void horiz_mc_qpel_aver_src1_16width_msa(const uint8_t *src,
  494.                                                 int32_t src_stride,
  495.                                                 uint8_t *dst,
  496.                                                 int32_t dst_stride,
  497.                                                 int32_t height)
  498. {
  499.     uint8_t loop_count;
  500.     v16u8 inp0, inp1, inp2, inp3, inp4, inp5, inp6, inp7;
  501.     v16u8 res;
  502.     v16u8 mask = { 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
  503.     v8u16 const20 = (v8u16) __msa_ldi_h(20);
  504.     v16u8 const6 = (v16u8) __msa_ldi_b(6);
  505.     v16u8 const3 = (v16u8) __msa_ldi_b(3);
  506.  
  507.     for (loop_count = (height >> 2); loop_count--;) {
  508.         LD_UB4(src, src_stride, inp0, inp2, inp4, inp6);
  509.         LD_UB4((src + 1), src_stride, inp1, inp3, inp5, inp7);
  510.         src += (4 * src_stride);
  511.         res = APPLY_HORIZ_QPEL_FILTER(inp0, inp1, mask,
  512.                                       const20, const6, const3);
  513.         res = __msa_aver_u_b(res, inp1);
  514.         ST_UB(res, dst);
  515.         dst += dst_stride;
  516.  
  517.         res = APPLY_HORIZ_QPEL_FILTER(inp2, inp3, mask,
  518.                                       const20, const6, const3);
  519.         res = __msa_aver_u_b(res, inp3);
  520.         ST_UB(res, dst);
  521.         dst += dst_stride;
  522.  
  523.         res = APPLY_HORIZ_QPEL_FILTER(inp4, inp5, mask,
  524.                                       const20, const6, const3);
  525.         res = __msa_aver_u_b(res, inp5);
  526.         ST_UB(res, dst);
  527.         dst += dst_stride;
  528.  
  529.         res = APPLY_HORIZ_QPEL_FILTER(inp6, inp7, mask,
  530.                                       const20, const6, const3);
  531.         res = __msa_aver_u_b(res, inp7);
  532.         ST_UB(res, dst);
  533.         dst += dst_stride;
  534.     }
  535. }
  536.  
  537. static void horiz_mc_qpel_no_rnd_aver_src0_8width_msa(const uint8_t *src,
  538.                                                       int32_t src_stride,
  539.                                                       uint8_t *dst,
  540.                                                       int32_t dst_stride,
  541.                                                       int32_t height)
  542. {
  543.     uint8_t loop_count;
  544.     v16u8 inp0, inp1, inp2, inp3;
  545.     v16u8 res0, res1;
  546.     v16u8 mask0 = { 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8 };
  547.     v16u8 mask1 = { 0, 2, 0, 3, 1, 4, 2, 5, 3, 6, 4, 7, 5, 8, 6, 8 };
  548.     v16u8 mask2 = { 1, 3, 0, 4, 0, 5, 1, 6, 2, 7, 3, 8, 4, 8, 5, 7 };
  549.     v16u8 mask3 = { 2, 4, 1, 5, 0, 6, 0, 7, 1, 8, 2, 8, 3, 7, 4, 6 };
  550.     v16u8 const20 = (v16u8) __msa_ldi_b(20);
  551.     v16u8 const6 = (v16u8) __msa_ldi_b(6);
  552.     v16u8 const3 = (v16u8) __msa_ldi_b(3);
  553.  
  554.     for (loop_count = (height >> 2); loop_count--;) {
  555.         LD_UB4(src, src_stride, inp0, inp1, inp2, inp3);
  556.         src += (4 * src_stride);
  557.         res0 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp0, inp1, mask0, mask1,
  558.                                                       mask2, mask3, const20,
  559.                                                       const6, const3);
  560.         res1 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp2, inp3, mask0, mask1,
  561.                                                       mask2, mask3, const20,
  562.                                                       const6, const3);
  563.         inp0 = (v16u8) __msa_insve_d((v2i64) inp0, 1, (v2i64) inp1);
  564.         inp2 = (v16u8) __msa_insve_d((v2i64) inp2, 1, (v2i64) inp3);
  565.         res0 = __msa_ave_u_b(inp0, res0);
  566.         res1 = __msa_ave_u_b(inp2, res1);
  567.         ST8x4_UB(res0, res1, dst, dst_stride);
  568.         dst += (4 * dst_stride);
  569.     }
  570. }
  571.  
  572. static void horiz_mc_qpel_no_rnd_aver_src0_16width_msa(const uint8_t *src,
  573.                                                        int32_t src_stride,
  574.                                                        uint8_t *dst,
  575.                                                        int32_t dst_stride,
  576.                                                        int32_t height)
  577. {
  578.     uint8_t loop_count;
  579.     v16u8 inp0, inp1, inp2, inp3, inp4, inp5, inp6, inp7;
  580.     v16u8 res;
  581.     v16u8 mask = { 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
  582.     v8u16 const20 = (v8u16) __msa_ldi_h(20);
  583.     v16u8 const6 = (v16u8) __msa_ldi_b(6);
  584.     v16u8 const3 = (v16u8) __msa_ldi_b(3);
  585.  
  586.     for (loop_count = (height >> 2); loop_count--;) {
  587.         LD_UB4(src, src_stride, inp0, inp2, inp4, inp6);
  588.         LD_UB4((src + 1), src_stride, inp1, inp3, inp5, inp7);
  589.         src += (4 * src_stride);
  590.         res = APPLY_HORIZ_QPEL_NO_ROUND_FILTER(inp0, inp1, mask,
  591.                                                const20, const6, const3);
  592.         res = __msa_ave_u_b(inp0, res);
  593.         ST_UB(res, dst);
  594.         dst += dst_stride;
  595.  
  596.         res = APPLY_HORIZ_QPEL_NO_ROUND_FILTER(inp2, inp3, mask,
  597.                                                const20, const6, const3);
  598.         res = __msa_ave_u_b(inp2, res);
  599.         ST_UB(res, dst);
  600.         dst += dst_stride;
  601.  
  602.         res = APPLY_HORIZ_QPEL_NO_ROUND_FILTER(inp4, inp5, mask,
  603.                                                const20, const6, const3);
  604.         res = __msa_ave_u_b(inp4, res);
  605.         ST_UB(res, dst);
  606.         dst += dst_stride;
  607.  
  608.         res = APPLY_HORIZ_QPEL_NO_ROUND_FILTER(inp6, inp7, mask,
  609.                                                const20, const6, const3);
  610.         res = __msa_ave_u_b(inp6, res);
  611.         ST_UB(res, dst);
  612.         dst += dst_stride;
  613.     }
  614. }
  615.  
  616. static void horiz_mc_qpel_no_rnd_8width_msa(const uint8_t *src,
  617.                                             int32_t src_stride,
  618.                                             uint8_t *dst,
  619.                                             int32_t dst_stride,
  620.                                             int32_t height)
  621. {
  622.     uint8_t loop_count;
  623.     v16u8 inp0, inp1, inp2, inp3;
  624.     v16u8 res0, res1;
  625.     v16u8 mask0 = { 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8 };
  626.     v16u8 mask1 = { 0, 2, 0, 3, 1, 4, 2, 5, 3, 6, 4, 7, 5, 8, 6, 8 };
  627.     v16u8 mask2 = { 1, 3, 0, 4, 0, 5, 1, 6, 2, 7, 3, 8, 4, 8, 5, 7 };
  628.     v16u8 mask3 = { 2, 4, 1, 5, 0, 6, 0, 7, 1, 8, 2, 8, 3, 7, 4, 6 };
  629.     v16u8 const20 = (v16u8) __msa_ldi_b(20);
  630.     v16u8 const6 = (v16u8) __msa_ldi_b(6);
  631.     v16u8 const3 = (v16u8) __msa_ldi_b(3);
  632.  
  633.     for (loop_count = (height >> 2); loop_count--;) {
  634.         LD_UB4(src, src_stride, inp0, inp1, inp2, inp3);
  635.         src += (4 * src_stride);
  636.         res0 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp0, inp1, mask0, mask1,
  637.                                                       mask2, mask3, const20,
  638.                                                       const6, const3);
  639.         res1 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp2, inp3, mask0, mask1,
  640.                                                       mask2, mask3, const20,
  641.                                                       const6, const3);
  642.         ST8x4_UB(res0, res1, dst, dst_stride);
  643.         dst += (4 * dst_stride);
  644.     }
  645. }
  646.  
  647. static void horiz_mc_qpel_no_rnd_16width_msa(const uint8_t *src,
  648.                                              int32_t src_stride,
  649.                                              uint8_t *dst,
  650.                                              int32_t dst_stride,
  651.                                              int32_t height)
  652. {
  653.     uint8_t loop_count;
  654.     v16u8 inp0, inp1, inp2, inp3, inp4, inp5, inp6, inp7;
  655.     v16u8 res;
  656.     v16u8 mask = { 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
  657.     v16u8 const6 = (v16u8) __msa_ldi_b(6);
  658.     v16u8 const3 = (v16u8) __msa_ldi_b(3);
  659.     v8u16 const20 = (v8u16) __msa_ldi_h(20);
  660.  
  661.     for (loop_count = (height >> 2); loop_count--;) {
  662.         LD_UB4(src, src_stride, inp0, inp2, inp4, inp6);
  663.         LD_UB4((src + 1), src_stride, inp1, inp3, inp5, inp7);
  664.         src += (4 * src_stride);
  665.         res = APPLY_HORIZ_QPEL_NO_ROUND_FILTER(inp0, inp1, mask,
  666.                                                const20, const6, const3);
  667.         ST_UB(res, dst);
  668.         dst += dst_stride;
  669.  
  670.         res = APPLY_HORIZ_QPEL_NO_ROUND_FILTER(inp2, inp3, mask,
  671.                                                const20, const6, const3);
  672.         ST_UB(res, dst);
  673.         dst += dst_stride;
  674.  
  675.         res = APPLY_HORIZ_QPEL_NO_ROUND_FILTER(inp4, inp5, mask,
  676.                                                const20, const6, const3);
  677.         ST_UB(res, dst);
  678.         dst += dst_stride;
  679.  
  680.         res = APPLY_HORIZ_QPEL_NO_ROUND_FILTER(inp6, inp7, mask,
  681.                                                const20, const6, const3);
  682.         ST_UB(res, dst);
  683.         dst += dst_stride;
  684.     }
  685. }
  686.  
  687. static void horiz_mc_qpel_no_rnd_aver_src1_8width_msa(const uint8_t *src,
  688.                                                       int32_t src_stride,
  689.                                                       uint8_t *dst,
  690.                                                       int32_t dst_stride,
  691.                                                       int32_t height)
  692. {
  693.     uint8_t loop_count;
  694.     v16u8 inp0, inp1, inp2, inp3;
  695.     v16u8 res0, res1;
  696.     v16u8 mask0 = { 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8 };
  697.     v16u8 mask1 = { 0, 2, 0, 3, 1, 4, 2, 5, 3, 6, 4, 7, 5, 8, 6, 8 };
  698.     v16u8 mask2 = { 1, 3, 0, 4, 0, 5, 1, 6, 2, 7, 3, 8, 4, 8, 5, 7 };
  699.     v16u8 mask3 = { 2, 4, 1, 5, 0, 6, 0, 7, 1, 8, 2, 8, 3, 7, 4, 6 };
  700.     v16u8 const20 = (v16u8) __msa_ldi_b(20);
  701.     v16u8 const6 = (v16u8) __msa_ldi_b(6);
  702.     v16u8 const3 = (v16u8) __msa_ldi_b(3);
  703.  
  704.     for (loop_count = (height >> 2); loop_count--;) {
  705.         LD_UB4(src, src_stride, inp0, inp1, inp2, inp3);
  706.         src += (4 * src_stride);
  707.         res0 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp0, inp1, mask0, mask1,
  708.                                                       mask2, mask3, const20,
  709.                                                       const6, const3);
  710.         res1 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp2, inp3, mask0, mask1,
  711.                                                       mask2, mask3, const20,
  712.                                                       const6, const3);
  713.         SLDI_B2_UB(inp0, inp1, inp0, inp1, inp0, inp1, 1);
  714.         SLDI_B2_UB(inp2, inp3, inp2, inp3, inp2, inp3, 1);
  715.         inp0 = (v16u8) __msa_insve_d((v2i64) inp0, 1, (v2i64) inp1);
  716.         inp2 = (v16u8) __msa_insve_d((v2i64) inp2, 1, (v2i64) inp3);
  717.         res0 = __msa_ave_u_b(inp0, res0);
  718.         res1 = __msa_ave_u_b(inp2, res1);
  719.         ST8x4_UB(res0, res1, dst, dst_stride);
  720.         dst += (4 * dst_stride);
  721.     }
  722. }
  723.  
  724. static void horiz_mc_qpel_no_rnd_aver_src1_16width_msa(const uint8_t *src,
  725.                                                        int32_t src_stride,
  726.                                                        uint8_t *dst,
  727.                                                        int32_t dst_stride,
  728.                                                        int32_t height)
  729. {
  730.     uint8_t loop_count;
  731.     v16u8 inp0, inp1, inp2, inp3, inp4, inp5, inp6, inp7;
  732.     v16u8 res;
  733.     v16u8 mask = { 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
  734.     v16u8 const6 = (v16u8) __msa_ldi_b(6);
  735.     v16u8 const3 = (v16u8) __msa_ldi_b(3);
  736.     v8u16 const20 = (v8u16) __msa_ldi_h(20);
  737.  
  738.     for (loop_count = (height >> 2); loop_count--;) {
  739.         LD_UB4(src, src_stride, inp0, inp2, inp4, inp6);
  740.         LD_UB4((src + 1), src_stride, inp1, inp3, inp5, inp7);
  741.         src += (4 * src_stride);
  742.         res = APPLY_HORIZ_QPEL_NO_ROUND_FILTER(inp0, inp1, mask,
  743.                                                const20, const6, const3);
  744.         res = __msa_ave_u_b(res, inp1);
  745.         ST_UB(res, dst);
  746.         dst += dst_stride;
  747.  
  748.         res = APPLY_HORIZ_QPEL_NO_ROUND_FILTER(inp2, inp3, mask,
  749.                                                const20, const6, const3);
  750.         res = __msa_ave_u_b(res, inp3);
  751.         ST_UB(res, dst);
  752.         dst += dst_stride;
  753.  
  754.         res = APPLY_HORIZ_QPEL_NO_ROUND_FILTER(inp4, inp5, mask,
  755.                                                const20, const6, const3);
  756.         res = __msa_ave_u_b(res, inp5);
  757.         ST_UB(res, dst);
  758.         dst += dst_stride;
  759.  
  760.         res = APPLY_HORIZ_QPEL_NO_ROUND_FILTER(inp6, inp7, mask,
  761.                                                const20, const6, const3);
  762.         res = __msa_ave_u_b(res, inp7);
  763.         ST_UB(res, dst);
  764.         dst += dst_stride;
  765.     }
  766. }
  767.  
  768. static void horiz_mc_qpel_avg_dst_aver_src0_8width_msa(const uint8_t *src,
  769.                                                        int32_t src_stride,
  770.                                                        uint8_t *dst,
  771.                                                        int32_t dst_stride,
  772.                                                        int32_t height)
  773. {
  774.     uint8_t loop_count;
  775.     v16u8 inp0, inp1, inp2, inp3;
  776.     v16u8 dst0, dst1, dst2, dst3;
  777.     v16u8 res0, res1;
  778.     v16u8 mask0 = { 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8 };
  779.     v16u8 mask1 = { 0, 2, 0, 3, 1, 4, 2, 5, 3, 6, 4, 7, 5, 8, 6, 8 };
  780.     v16u8 mask2 = { 1, 3, 0, 4, 0, 5, 1, 6, 2, 7, 3, 8, 4, 8, 5, 7 };
  781.     v16u8 mask3 = { 2, 4, 1, 5, 0, 6, 0, 7, 1, 8, 2, 8, 3, 7, 4, 6 };
  782.     v16u8 const20 = (v16u8) __msa_ldi_b(20);
  783.     v16u8 const6 = (v16u8) __msa_ldi_b(6);
  784.     v16u8 const3 = (v16u8) __msa_ldi_b(3);
  785.  
  786.     for (loop_count = (height >> 2); loop_count--;) {
  787.         LD_UB4(src, src_stride, inp0, inp1, inp2, inp3);
  788.         src += (4 * src_stride);
  789.         res0 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp0, inp1,
  790.                                              mask0, mask1, mask2, mask3,
  791.                                              const20, const6, const3);
  792.         res1 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp2, inp3,
  793.                                              mask0, mask1, mask2, mask3,
  794.                                              const20, const6, const3);
  795.         LD_UB4(dst, dst_stride, dst0, dst1, dst2, dst3);
  796.         inp0 = (v16u8) __msa_insve_d((v2i64) inp0, 1, (v2i64) inp1);
  797.         inp2 = (v16u8) __msa_insve_d((v2i64) inp2, 1, (v2i64) inp3);
  798.         dst0 = (v16u8) __msa_insve_d((v2i64) dst0, 1, (v2i64) dst1);
  799.         dst2 = (v16u8) __msa_insve_d((v2i64) dst2, 1, (v2i64) dst3);
  800.         AVER_UB2_UB(inp0, res0, inp2, res1, res0, res1);
  801.         AVER_UB2_UB(dst0, res0, dst2, res1, res0, res1);
  802.         ST8x4_UB(res0, res1, dst, dst_stride);
  803.         dst += (4 * dst_stride);
  804.     }
  805. }
  806.  
  807. static void horiz_mc_qpel_avg_dst_aver_src0_16width_msa(const uint8_t *src,
  808.                                                         int32_t src_stride,
  809.                                                         uint8_t *dst,
  810.                                                         int32_t dst_stride,
  811.                                                         int32_t height)
  812. {
  813.     uint8_t loop_count;
  814.     v16u8 inp0, inp1, inp2, inp3, inp4, inp5, inp6, inp7;
  815.     v16u8 res0, res1;
  816.     v16u8 dst0, dst1;
  817.     v16u8 mask = { 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
  818.     v16u8 const6 = (v16u8) __msa_ldi_b(6);
  819.     v16u8 const3 = (v16u8) __msa_ldi_b(3);
  820.     v8u16 const20 = (v8u16) __msa_ldi_h(20);
  821.  
  822.     for (loop_count = (height >> 2); loop_count--;) {
  823.         LD_UB4(src, src_stride, inp0, inp2, inp4, inp6);
  824.         LD_UB4((src + 1), src_stride, inp1, inp3, inp5, inp7);
  825.         src += (4 * src_stride);
  826.         res0 = APPLY_HORIZ_QPEL_FILTER(inp0, inp1, mask,
  827.                                        const20, const6, const3);
  828.         res1 = APPLY_HORIZ_QPEL_FILTER(inp2, inp3, mask,
  829.                                        const20, const6, const3);
  830.         LD_UB2(dst, dst_stride, dst0, dst1);
  831.         AVER_UB2_UB(inp0, res0, inp2, res1, res0, res1);
  832.         AVER_UB2_UB(dst0, res0, dst1, res1, res0, res1);
  833.         ST_UB2(res0, res1, dst, dst_stride);
  834.         dst += (2 * dst_stride);
  835.  
  836.         res0 = APPLY_HORIZ_QPEL_FILTER(inp4, inp5, mask,
  837.                                        const20, const6, const3);
  838.         res1 = APPLY_HORIZ_QPEL_FILTER(inp6, inp7, mask,
  839.                                        const20, const6, const3);
  840.         LD_UB2(dst, dst_stride, dst0, dst1);
  841.         AVER_UB2_UB(inp4, res0, inp6, res1, res0, res1);
  842.         AVER_UB2_UB(dst0, res0, dst1, res1, res0, res1);
  843.         ST_UB2(res0, res1, dst, dst_stride);
  844.         dst += (2 * dst_stride);
  845.     }
  846. }
  847.  
  848. static void horiz_mc_qpel_avg_dst_8width_msa(const uint8_t *src,
  849.                                              int32_t src_stride,
  850.                                              uint8_t *dst,
  851.                                              int32_t dst_stride,
  852.                                              int32_t height)
  853. {
  854.     uint8_t loop_count;
  855.     v16u8 inp0, inp1, inp2, inp3;
  856.     v16u8 dst0, dst1, dst2, dst3;
  857.     v16u8 res0, res1;
  858.     v16u8 mask0 = { 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8 };
  859.     v16u8 mask1 = { 0, 2, 0, 3, 1, 4, 2, 5, 3, 6, 4, 7, 5, 8, 6, 8 };
  860.     v16u8 mask2 = { 1, 3, 0, 4, 0, 5, 1, 6, 2, 7, 3, 8, 4, 8, 5, 7 };
  861.     v16u8 mask3 = { 2, 4, 1, 5, 0, 6, 0, 7, 1, 8, 2, 8, 3, 7, 4, 6 };
  862.     v16u8 const20 = (v16u8) __msa_ldi_b(20);
  863.     v16u8 const6 = (v16u8) __msa_ldi_b(6);
  864.     v16u8 const3 = (v16u8) __msa_ldi_b(3);
  865.  
  866.     for (loop_count = (height >> 2); loop_count--;) {
  867.         LD_UB4(src, src_stride, inp0, inp1, inp2, inp3);
  868.         src += (4 * src_stride);
  869.         res0 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp0, inp1,
  870.                                              mask0, mask1, mask2, mask3,
  871.                                              const20, const6, const3);
  872.         res1 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp2, inp3,
  873.                                              mask0, mask1, mask2, mask3,
  874.                                              const20, const6, const3);
  875.         LD_UB4(dst, dst_stride, dst0, dst1, dst2, dst3);
  876.         dst0 = (v16u8) __msa_insve_d((v2i64) dst0, 1, (v2i64) dst1);
  877.         dst2 = (v16u8) __msa_insve_d((v2i64) dst2, 1, (v2i64) dst3);
  878.         AVER_UB2_UB(dst0, res0, dst2, res1, res0, res1);
  879.         ST8x4_UB(res0, res1, dst, dst_stride);
  880.         dst += (4 * dst_stride);
  881.     }
  882. }
  883.  
  884. static void horiz_mc_qpel_avg_dst_16width_msa(const uint8_t *src,
  885.                                               int32_t src_stride,
  886.                                               uint8_t *dst,
  887.                                               int32_t dst_stride,
  888.                                               int32_t height)
  889. {
  890.     uint8_t loop_count;
  891.     v16u8 inp0, inp1, inp2, inp3, inp4, inp5, inp6, inp7;
  892.     v16u8 res0, res1;
  893.     v16u8 dst0, dst1;
  894.     v16u8 mask = { 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
  895.     v16u8 const6 = (v16u8) __msa_ldi_b(6);
  896.     v16u8 const3 = (v16u8) __msa_ldi_b(3);
  897.     v8u16 const20 = (v8u16) __msa_ldi_h(20);
  898.  
  899.     for (loop_count = (height >> 2); loop_count--;) {
  900.         LD_UB4(src, src_stride, inp0, inp2, inp4, inp6);
  901.         LD_UB4((src + 1), src_stride, inp1, inp3, inp5, inp7);
  902.         src += (4 * src_stride);
  903.         res0 = APPLY_HORIZ_QPEL_FILTER(inp0, inp1, mask,
  904.                                        const20, const6, const3);
  905.         res1 = APPLY_HORIZ_QPEL_FILTER(inp2, inp3, mask,
  906.                                        const20, const6, const3);
  907.         LD_UB2(dst, dst_stride, dst0, dst1);
  908.         AVER_UB2_UB(dst0, res0, dst1, res1, res0, res1);
  909.         ST_UB2(res0, res1, dst, dst_stride);
  910.         dst += (2 * dst_stride);
  911.  
  912.         res0 = APPLY_HORIZ_QPEL_FILTER(inp4, inp5, mask,
  913.                                        const20, const6, const3);
  914.         res1 = APPLY_HORIZ_QPEL_FILTER(inp6, inp7, mask,
  915.                                        const20, const6, const3);
  916.         LD_UB2(dst, dst_stride, dst0, dst1);
  917.         AVER_UB2_UB(dst0, res0, dst1, res1, res0, res1);
  918.         ST_UB2(res0, res1, dst, dst_stride);
  919.         dst += (2 * dst_stride);
  920.     }
  921. }
  922.  
  923. static void horiz_mc_qpel_avg_dst_aver_src1_8width_msa(const uint8_t *src,
  924.                                                        int32_t src_stride,
  925.                                                        uint8_t *dst,
  926.                                                        int32_t dst_stride,
  927.                                                        int32_t height)
  928. {
  929.     uint8_t loop_count;
  930.     v16u8 inp0, inp1, inp2, inp3;
  931.     v16u8 dst0, dst1, dst2, dst3;
  932.     v16u8 res0, res1;
  933.     v16u8 mask0 = { 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8 };
  934.     v16u8 mask1 = { 0, 2, 0, 3, 1, 4, 2, 5, 3, 6, 4, 7, 5, 8, 6, 8 };
  935.     v16u8 mask2 = { 1, 3, 0, 4, 0, 5, 1, 6, 2, 7, 3, 8, 4, 8, 5, 7 };
  936.     v16u8 mask3 = { 2, 4, 1, 5, 0, 6, 0, 7, 1, 8, 2, 8, 3, 7, 4, 6 };
  937.     v16u8 const20 = (v16u8) __msa_ldi_b(20);
  938.     v16u8 const6 = (v16u8) __msa_ldi_b(6);
  939.     v16u8 const3 = (v16u8) __msa_ldi_b(3);
  940.  
  941.     for (loop_count = (height >> 2); loop_count--;) {
  942.         LD_UB4(src, src_stride, inp0, inp1, inp2, inp3);
  943.         src += (4 * src_stride);
  944.         res0 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp0, inp1,
  945.                                              mask0, mask1, mask2, mask3,
  946.                                              const20, const6, const3);
  947.         res1 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp2, inp3,
  948.                                              mask0, mask1, mask2, mask3,
  949.                                              const20, const6, const3);
  950.         LD_UB4(dst, dst_stride, dst0, dst1, dst2, dst3);
  951.         SLDI_B2_UB(inp0, inp1, inp0, inp1, inp0, inp1, 1);
  952.         SLDI_B2_UB(inp2, inp3, inp2, inp3, inp2, inp3, 1);
  953.         inp0 = (v16u8) __msa_insve_d((v2i64) inp0, 1, (v2i64) inp1);
  954.         inp2 = (v16u8) __msa_insve_d((v2i64) inp2, 1, (v2i64) inp3);
  955.         dst0 = (v16u8) __msa_insve_d((v2i64) dst0, 1, (v2i64) dst1);
  956.         dst2 = (v16u8) __msa_insve_d((v2i64) dst2, 1, (v2i64) dst3);
  957.         AVER_UB2_UB(inp0, res0, inp2, res1, res0, res1);
  958.         AVER_UB2_UB(dst0, res0, dst2, res1, res0, res1);
  959.         ST8x4_UB(res0, res1, dst, dst_stride);
  960.         dst += (4 * dst_stride);
  961.     }
  962. }
  963.  
  964. static void horiz_mc_qpel_avg_dst_aver_src1_16width_msa(const uint8_t *src,
  965.                                                         int32_t src_stride,
  966.                                                         uint8_t *dst,
  967.                                                         int32_t dst_stride,
  968.                                                         int32_t height)
  969. {
  970.     uint8_t loop_count;
  971.     v16u8 inp0, inp1, inp2, inp3, inp4, inp5, inp6, inp7;
  972.     v16u8 res0, res1, dst0, dst1;
  973.     v16u8 mask = { 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
  974.     v16u8 const6 = (v16u8) __msa_ldi_b(6);
  975.     v16u8 const3 = (v16u8) __msa_ldi_b(3);
  976.     v8u16 const20 = (v8u16) __msa_ldi_h(20);
  977.  
  978.     for (loop_count = (height >> 2); loop_count--;) {
  979.         LD_UB4(src, src_stride, inp0, inp2, inp4, inp6);
  980.         LD_UB4((src + 1), src_stride, inp1, inp3, inp5, inp7);
  981.         src += (4 * src_stride);
  982.         res0 = APPLY_HORIZ_QPEL_FILTER(inp0, inp1, mask,
  983.                                        const20, const6, const3);
  984.         res1 = APPLY_HORIZ_QPEL_FILTER(inp2, inp3, mask,
  985.                                        const20, const6, const3);
  986.         LD_UB2(dst, dst_stride, dst0, dst1);
  987.         AVER_UB2_UB(res0, inp1, res1, inp3, res0, res1);
  988.         AVER_UB2_UB(dst0, res0, dst1, res1, res0, res1);
  989.         ST_UB2(res0, res1, dst, dst_stride);
  990.         dst += (2 * dst_stride);
  991.         res0 = APPLY_HORIZ_QPEL_FILTER(inp4, inp5, mask,
  992.                                        const20, const6, const3);
  993.         res1 = APPLY_HORIZ_QPEL_FILTER(inp6, inp7, mask,
  994.                                        const20, const6, const3);
  995.         LD_UB2(dst, dst_stride, dst0, dst1);
  996.         AVER_UB2_UB(res0, inp5, res1, inp7, res0, res1);
  997.         AVER_UB2_UB(dst0, res0, dst1, res1, res0, res1);
  998.         ST_UB2(res0, res1, dst, dst_stride);
  999.         dst += (2 * dst_stride);
  1000.     }
  1001. }
  1002.  
  1003.  
  1004. static void vert_mc_qpel_aver_src0_8x8_msa(const uint8_t *src,
  1005.                                            int32_t src_stride,
  1006.                                            uint8_t *dst,
  1007.                                            int32_t dst_stride)
  1008. {
  1009.     v16u8 inp0, inp1, inp2, inp3, inp4, inp5, inp6, inp7, inp8;
  1010.     v16u8 tmp0, tmp1, res0, res1;
  1011.     v16u8 const20 = (v16u8) __msa_ldi_b(20);
  1012.     v16u8 const6 = (v16u8) __msa_ldi_b(6);
  1013.     v16u8 const3 = (v16u8) __msa_ldi_b(3);
  1014.  
  1015.     LD_UB4(src, src_stride, inp0, inp1, inp2, inp3);
  1016.     src += (4 * src_stride);
  1017.     LD_UB2(src, src_stride, inp4, inp5);
  1018.     src += (2 * src_stride);
  1019.     res0 = APPLY_VERT_QPEL_FILTER_8BYTE(inp0, inp0, inp1, inp2,
  1020.                                         inp1, inp2, inp3, inp4,
  1021.                                         inp1, inp0, inp0, inp1,
  1022.                                         inp2, inp3, inp4, inp5,
  1023.                                         const20, const6, const3);
  1024.     LD_UB2(src, src_stride, inp6, inp7);
  1025.     src += (2 * src_stride);
  1026.     res1 = APPLY_VERT_QPEL_FILTER_8BYTE(inp2, inp1, inp0, inp0,
  1027.                                         inp3, inp4, inp5, inp6,
  1028.                                         inp3, inp2, inp1, inp0,
  1029.                                         inp4, inp5, inp6, inp7,
  1030.                                         const20, const6, const3);
  1031.     tmp0 = (v16u8) __msa_insve_d((v2i64) inp0, 1, (v2i64) inp1);
  1032.     tmp1 = (v16u8) __msa_insve_d((v2i64) inp2, 1, (v2i64) inp3);
  1033.     AVER_UB2_UB(res0, tmp0, res1, tmp1, res0, res1);
  1034.     ST8x4_UB(res0, res1, dst, dst_stride);
  1035.     dst += (4 * dst_stride);
  1036.  
  1037.     inp8 = LD_UB(src);
  1038.     res0 = APPLY_VERT_QPEL_FILTER_8BYTE(inp4, inp3, inp2, inp1,
  1039.                                         inp5, inp6, inp7, inp8,
  1040.                                         inp5, inp4, inp3, inp2,
  1041.                                         inp6, inp7, inp8, inp8,
  1042.                                         const20, const6, const3);
  1043.     res1 = APPLY_VERT_QPEL_FILTER_8BYTE(inp6, inp5, inp4, inp3,
  1044.                                         inp7, inp8, inp8, inp7,
  1045.                                         inp7, inp6, inp5, inp4,
  1046.                                         inp8, inp8, inp7, inp6,
  1047.                                         const20, const6, const3);
  1048.     tmp0 = (v16u8) __msa_insve_d((v2i64) inp4, 1, (v2i64) inp5);
  1049.     tmp1 = (v16u8) __msa_insve_d((v2i64) inp6, 1, (v2i64) inp7);
  1050.     AVER_UB2_UB(res0, tmp0, res1, tmp1, res0, res1);
  1051.     ST8x4_UB(res0, res1, dst, dst_stride);
  1052.     dst += (4 * dst_stride);
  1053. }
  1054.  
  1055. static void vert_mc_qpel_aver_src0_16x16_msa(const uint8_t *src,
  1056.                                              int32_t src_stride,
  1057.                                              uint8_t *dst,
  1058.                                              int32_t dst_stride)
  1059. {
  1060.     v16u8 inp0, inp1, inp2, inp3, inp4, inp5, inp6, inp7, inp8;
  1061.     v16u8 inp9, inp10, inp11, inp12, inp13, inp14, inp15, inp16;
  1062.     v16u8 res0;
  1063.     v16u8 const20 = (v16u8) __msa_ldi_b(20);
  1064.     v16u8 const6 = (v16u8) __msa_ldi_b(6);
  1065.     v16u8 const3 = (v16u8) __msa_ldi_b(3);
  1066.  
  1067.     LD_UB5(src, src_stride, inp0, inp1, inp2, inp3, inp4);
  1068.     src += (5 * src_stride);
  1069.     res0 = APPLY_VERT_QPEL_FILTER(inp0, inp0, inp1, inp2,
  1070.                                   inp1, inp2, inp3, inp4,
  1071.                                   const20, const6, const3);
  1072.     res0 = __msa_aver_u_b(res0, inp0);
  1073.     ST_UB(res0, dst);
  1074.     dst += dst_stride;
  1075.  
  1076.     inp5 = LD_UB(src);
  1077.     src += src_stride;
  1078.     res0 = APPLY_VERT_QPEL_FILTER(inp1, inp0, inp0, inp1,
  1079.                                   inp2, inp3, inp4, inp5,
  1080.                                   const20, const6, const3);
  1081.     res0 = __msa_aver_u_b(res0, inp1);
  1082.     ST_UB(res0, dst);
  1083.     dst += dst_stride;
  1084.  
  1085.     inp6 = LD_UB(src);
  1086.     src += src_stride;
  1087.     res0 = APPLY_VERT_QPEL_FILTER(inp2, inp1, inp0, inp0,
  1088.                                   inp3, inp4, inp5, inp6,
  1089.                                   const20, const6, const3);
  1090.     res0 = __msa_aver_u_b(res0, inp2);
  1091.     ST_UB(res0, dst);
  1092.     dst += dst_stride;
  1093.  
  1094.     inp7 = LD_UB(src);
  1095.     src += src_stride;
  1096.     res0 = APPLY_VERT_QPEL_FILTER(inp3, inp2, inp1, inp0,
  1097.                                   inp4, inp5, inp6, inp7,
  1098.                                   const20, const6, const3);
  1099.     res0 = __msa_aver_u_b(res0, inp3);
  1100.     ST_UB(res0, dst);
  1101.     dst += dst_stride;
  1102.  
  1103.     LD_UB2(src, src_stride, inp8, inp9);
  1104.     src += (2 * src_stride);
  1105.     res0 = APPLY_VERT_QPEL_FILTER(inp4, inp3, inp2, inp1,
  1106.                                   inp5, inp6, inp7, inp8,
  1107.                                   const20, const6, const3);
  1108.     res0 = __msa_aver_u_b(res0, inp4);
  1109.     ST_UB(res0, dst);
  1110.     dst += dst_stride;
  1111.  
  1112.     res0 = APPLY_VERT_QPEL_FILTER(inp5, inp4, inp3, inp2,
  1113.                                   inp6, inp7, inp8, inp9,
  1114.                                   const20, const6, const3);
  1115.     res0 = __msa_aver_u_b(res0, inp5);
  1116.     ST_UB(res0, dst);
  1117.     dst += dst_stride;
  1118.  
  1119.     LD_UB2(src, src_stride, inp10, inp11);
  1120.     src += (2 * src_stride);
  1121.     res0 = APPLY_VERT_QPEL_FILTER(inp6, inp5, inp4, inp3,
  1122.                                   inp7, inp8, inp9, inp10,
  1123.                                   const20, const6, const3);
  1124.     res0 = __msa_aver_u_b(res0, inp6);
  1125.     ST_UB(res0, dst);
  1126.     dst += dst_stride;
  1127.  
  1128.     res0 = APPLY_VERT_QPEL_FILTER(inp7, inp6, inp5, inp4,
  1129.                                   inp8, inp9, inp10, inp11,
  1130.                                   const20, const6, const3);
  1131.     res0 = __msa_aver_u_b(res0, inp7);
  1132.     ST_UB(res0, dst);
  1133.     dst += dst_stride;
  1134.  
  1135.     LD_UB2(src, src_stride, inp12, inp13);
  1136.     src += (2 * src_stride);
  1137.     res0 = APPLY_VERT_QPEL_FILTER(inp8, inp7, inp6, inp5,
  1138.                                   inp9, inp10, inp11, inp12,
  1139.                                   const20, const6, const3);
  1140.     res0 = __msa_aver_u_b(res0, inp8);
  1141.     ST_UB(res0, dst);
  1142.     dst += dst_stride;
  1143.  
  1144.     res0 = APPLY_VERT_QPEL_FILTER(inp9, inp8, inp7, inp6,
  1145.                                   inp10, inp11, inp12, inp13,
  1146.                                   const20, const6, const3);
  1147.     res0 = __msa_aver_u_b(res0, inp9);
  1148.     ST_UB(res0, dst);
  1149.     dst += dst_stride;
  1150.  
  1151.     LD_UB2(src, src_stride, inp14, inp15);
  1152.     src += (2 * src_stride);
  1153.     res0 = APPLY_VERT_QPEL_FILTER(inp10, inp9, inp8, inp7,
  1154.                                   inp11, inp12, inp13, inp14,
  1155.                                   const20, const6, const3);
  1156.     res0 = __msa_aver_u_b(res0, inp10);
  1157.     ST_UB(res0, dst);
  1158.     dst += dst_stride;
  1159.  
  1160.     res0 = APPLY_VERT_QPEL_FILTER(inp11, inp10, inp9, inp8,
  1161.                                   inp12, inp13, inp14, inp15,
  1162.                                   const20, const6, const3);
  1163.     res0 = __msa_aver_u_b(res0, inp11);
  1164.     ST_UB(res0, dst);
  1165.     dst += dst_stride;
  1166.  
  1167.     inp16 = LD_UB(src);
  1168.     res0 = APPLY_VERT_QPEL_FILTER(inp12, inp11, inp10, inp9,
  1169.                                   inp13, inp14, inp15, inp16,
  1170.                                   const20, const6, const3);
  1171.     res0 = __msa_aver_u_b(res0, inp12);
  1172.     ST_UB(res0, dst);
  1173.     dst += dst_stride;
  1174.  
  1175.     res0 = APPLY_VERT_QPEL_FILTER(inp13, inp12, inp11, inp10,
  1176.                                   inp14, inp15, inp16, inp16,
  1177.                                   const20, const6, const3);
  1178.     res0 = __msa_aver_u_b(res0, inp13);
  1179.     ST_UB(res0, dst);
  1180.     dst += dst_stride;
  1181.  
  1182.     res0 = APPLY_VERT_QPEL_FILTER(inp14, inp13, inp12, inp11,
  1183.                                   inp15, inp16, inp16, inp15,
  1184.                                   const20, const6, const3);
  1185.     res0 = __msa_aver_u_b(res0, inp14);
  1186.     ST_UB(res0, dst);
  1187.     dst += dst_stride;
  1188.  
  1189.     res0 = APPLY_VERT_QPEL_FILTER(inp15, inp14, inp13, inp12,
  1190.                                   inp16, inp16, inp15, inp14,
  1191.                                   const20, const6, const3);
  1192.     res0 = __msa_aver_u_b(res0, inp15);
  1193.     ST_UB(res0, dst);
  1194. }
  1195.  
  1196. static void vert_mc_qpel_8x8_msa(const uint8_t *src,
  1197.                                  int32_t src_stride,
  1198.                                  uint8_t *dst,
  1199.                                  int32_t dst_stride)
  1200. {
  1201.     v16u8 inp0, inp1, inp2, inp3, inp4, inp5, inp6, inp7, inp8;
  1202.     v16u8 res0, res1;
  1203.     v16u8 const20 = (v16u8) __msa_ldi_b(20);
  1204.     v16u8 const6 = (v16u8) __msa_ldi_b(6);
  1205.     v16u8 const3 = (v16u8) __msa_ldi_b(3);
  1206.  
  1207.     LD_UB4(src, src_stride, inp0, inp1, inp2, inp3);
  1208.     src += (4 * src_stride);
  1209.     LD_UB2(src, src_stride, inp4, inp5);
  1210.     src += (2 * src_stride);
  1211.     res0 = APPLY_VERT_QPEL_FILTER_8BYTE(inp0, inp0, inp1, inp2,
  1212.                                         inp1, inp2, inp3, inp4,
  1213.                                         inp1, inp0, inp0, inp1,
  1214.                                         inp2, inp3, inp4, inp5,
  1215.                                         const20, const6, const3);
  1216.     LD_UB2(src, src_stride, inp6, inp7);
  1217.     src += (2 * src_stride);
  1218.     res1 = APPLY_VERT_QPEL_FILTER_8BYTE(inp2, inp1, inp0, inp0,
  1219.                                         inp3, inp4, inp5, inp6,
  1220.                                         inp3, inp2, inp1, inp0,
  1221.                                         inp4, inp5, inp6, inp7,
  1222.                                         const20, const6, const3);
  1223.     ST8x4_UB(res0, res1, dst, dst_stride);
  1224.     dst += (4 * dst_stride);
  1225.  
  1226.     inp8 = LD_UB(src);
  1227.     res0 = APPLY_VERT_QPEL_FILTER_8BYTE(inp4, inp3, inp2, inp1,
  1228.                                         inp5, inp6, inp7, inp8,
  1229.                                         inp5, inp4, inp3, inp2,
  1230.                                         inp6, inp7, inp8, inp8,
  1231.                                         const20, const6, const3);
  1232.     res1 = APPLY_VERT_QPEL_FILTER_8BYTE(inp6, inp5, inp4, inp3,
  1233.                                         inp7, inp8, inp8, inp7,
  1234.                                         inp7, inp6, inp5, inp4,
  1235.                                         inp8, inp8, inp7, inp6,
  1236.                                         const20, const6, const3);
  1237.     ST8x4_UB(res0, res1, dst, dst_stride);
  1238.     dst += (4 * dst_stride);
  1239. }
  1240.  
  1241. static void vert_mc_qpel_16x16_msa(const uint8_t *src,
  1242.                                    int32_t src_stride,
  1243.                                    uint8_t *dst,
  1244.                                    int32_t dst_stride)
  1245. {
  1246.     v16u8 inp0, inp1, inp2, inp3, inp4, inp5, inp6, inp7, inp8;
  1247.     v16u8 inp9, inp10, inp11, inp12, inp13, inp14, inp15, inp16;
  1248.     v16u8 res0;
  1249.     v16u8 const20 = (v16u8) __msa_ldi_b(20);
  1250.     v16u8 const6 = (v16u8) __msa_ldi_b(6);
  1251.     v16u8 const3 = (v16u8) __msa_ldi_b(3);
  1252.  
  1253.     LD_UB4(src, src_stride, inp0, inp1, inp2, inp3);
  1254.     src += (4 * src_stride);
  1255.     inp4 = LD_UB(src);
  1256.     src += src_stride;
  1257.     res0 = APPLY_VERT_QPEL_FILTER(inp0, inp0, inp1, inp2,
  1258.                                   inp1, inp2, inp3, inp4,
  1259.                                   const20, const6, const3);
  1260.     ST_UB(res0, dst);
  1261.     dst += dst_stride;
  1262.  
  1263.     inp5 = LD_UB(src);
  1264.     src += src_stride;
  1265.     res0 = APPLY_VERT_QPEL_FILTER(inp1, inp0, inp0, inp1,
  1266.                                   inp2, inp3, inp4, inp5,
  1267.                                   const20, const6, const3);
  1268.     ST_UB(res0, dst);
  1269.     dst += dst_stride;
  1270.  
  1271.     inp6 = LD_UB(src);
  1272.     src += src_stride;
  1273.     res0 = APPLY_VERT_QPEL_FILTER(inp2, inp1, inp0, inp0,
  1274.                                   inp3, inp4, inp5, inp6,
  1275.                                   const20, const6, const3);
  1276.     ST_UB(res0, dst);
  1277.     dst += dst_stride;
  1278.  
  1279.     inp7 = LD_UB(src);
  1280.     src += src_stride;
  1281.     res0 = APPLY_VERT_QPEL_FILTER(inp3, inp2, inp1, inp0,
  1282.                                   inp4, inp5, inp6, inp7,
  1283.                                   const20, const6, const3);
  1284.     ST_UB(res0, dst);
  1285.     dst += dst_stride;
  1286.  
  1287.     inp8 = LD_UB(src);
  1288.     src += src_stride;
  1289.     res0 = APPLY_VERT_QPEL_FILTER(inp4, inp3, inp2, inp1,
  1290.                                   inp5, inp6, inp7, inp8,
  1291.                                   const20, const6, const3);
  1292.     ST_UB(res0, dst);
  1293.     dst += dst_stride;
  1294.  
  1295.     inp9 = LD_UB(src);
  1296.     src += src_stride;
  1297.     res0 = APPLY_VERT_QPEL_FILTER(inp5, inp4, inp3, inp2,
  1298.                                   inp6, inp7, inp8, inp9,
  1299.                                   const20, const6, const3);
  1300.     ST_UB(res0, dst);
  1301.     dst += dst_stride;
  1302.  
  1303.     inp10 = LD_UB(src);
  1304.     src += src_stride;
  1305.     res0 = APPLY_VERT_QPEL_FILTER(inp6, inp5, inp4, inp3,
  1306.                                   inp7, inp8, inp9, inp10,
  1307.                                   const20, const6, const3);
  1308.     ST_UB(res0, dst);
  1309.     dst += dst_stride;
  1310.  
  1311.     inp11 = LD_UB(src);
  1312.     src += src_stride;
  1313.     res0 = APPLY_VERT_QPEL_FILTER(inp7, inp6, inp5, inp4,
  1314.                                   inp8, inp9, inp10, inp11,
  1315.                                   const20, const6, const3);
  1316.     ST_UB(res0, dst);
  1317.     dst += dst_stride;
  1318.  
  1319.     inp12 = LD_UB(src);
  1320.     src += src_stride;
  1321.     res0 = APPLY_VERT_QPEL_FILTER(inp8, inp7, inp6, inp5,
  1322.                                   inp9, inp10, inp11, inp12,
  1323.                                   const20, const6, const3);
  1324.     ST_UB(res0, dst);
  1325.     dst += dst_stride;
  1326.  
  1327.     inp13 = LD_UB(src);
  1328.     src += src_stride;
  1329.     res0 = APPLY_VERT_QPEL_FILTER(inp9, inp8, inp7, inp6,
  1330.                                   inp10, inp11, inp12, inp13,
  1331.                                   const20, const6, const3);
  1332.     ST_UB(res0, dst);
  1333.     dst += dst_stride;
  1334.  
  1335.     inp14 = LD_UB(src);
  1336.     src += src_stride;
  1337.     res0 = APPLY_VERT_QPEL_FILTER(inp10, inp9, inp8, inp7,
  1338.                                   inp11, inp12, inp13, inp14,
  1339.                                   const20, const6, const3);
  1340.     ST_UB(res0, dst);
  1341.     dst += dst_stride;
  1342.  
  1343.     inp15 = LD_UB(src);
  1344.     src += src_stride;
  1345.     res0 = APPLY_VERT_QPEL_FILTER(inp11, inp10, inp9, inp8,
  1346.                                   inp12, inp13, inp14, inp15,
  1347.                                   const20, const6, const3);
  1348.     ST_UB(res0, dst);
  1349.     dst += dst_stride;
  1350.  
  1351.     inp16 = LD_UB(src);
  1352.     res0 = APPLY_VERT_QPEL_FILTER(inp12, inp11, inp10, inp9,
  1353.                                   inp13, inp14, inp15, inp16,
  1354.                                   const20, const6, const3);
  1355.     ST_UB(res0, dst);
  1356.     dst += dst_stride;
  1357.  
  1358.     res0 = APPLY_VERT_QPEL_FILTER(inp13, inp12, inp11, inp10,
  1359.                                   inp14, inp15, inp16, inp16,
  1360.                                   const20, const6, const3);
  1361.     ST_UB(res0, dst);
  1362.     dst += dst_stride;
  1363.  
  1364.     res0 = APPLY_VERT_QPEL_FILTER(inp14, inp13, inp12, inp11,
  1365.                                   inp15, inp16, inp16, inp15,
  1366.                                   const20, const6, const3);
  1367.     ST_UB(res0, dst);
  1368.     dst += dst_stride;
  1369.  
  1370.     res0 = APPLY_VERT_QPEL_FILTER(inp15, inp14, inp13, inp12,
  1371.                                   inp16, inp16, inp15, inp14,
  1372.                                   const20, const6, const3);
  1373.     ST_UB(res0, dst);
  1374.     dst += dst_stride;
  1375. }
  1376.  
  1377. static void vert_mc_qpel_aver_src1_8x8_msa(const uint8_t *src,
  1378.                                            int32_t src_stride,
  1379.                                            uint8_t *dst,
  1380.                                            int32_t dst_stride)
  1381. {
  1382.     v16u8 inp0, inp1, inp2, inp3, inp4, inp5, inp6, inp7, inp8;
  1383.     v16u8 tmp0, tmp1, res0, res1;
  1384.     v16u8 const20 = (v16u8) __msa_ldi_b(20);
  1385.     v16u8 const6 = (v16u8) __msa_ldi_b(6);
  1386.     v16u8 const3 = (v16u8) __msa_ldi_b(3);
  1387.  
  1388.     LD_UB4(src, src_stride, inp0, inp1, inp2, inp3);
  1389.     src += (4 * src_stride);
  1390.     LD_UB2(src, src_stride, inp4, inp5);
  1391.     src += (2 * src_stride);
  1392.     res0 = APPLY_VERT_QPEL_FILTER_8BYTE(inp0, inp0, inp1, inp2,
  1393.                                         inp1, inp2, inp3, inp4,
  1394.                                         inp1, inp0, inp0, inp1,
  1395.                                         inp2, inp3, inp4, inp5,
  1396.                                         const20, const6, const3);
  1397.  
  1398.     LD_UB2(src, src_stride, inp6, inp7);
  1399.     src += (2 * src_stride);
  1400.     res1 = APPLY_VERT_QPEL_FILTER_8BYTE(inp2, inp1, inp0, inp0,
  1401.                                         inp3, inp4, inp5, inp6,
  1402.                                         inp3, inp2, inp1, inp0,
  1403.                                         inp4, inp5, inp6, inp7,
  1404.                                         const20, const6, const3);
  1405.     tmp0 = (v16u8) __msa_insve_d((v2i64) inp1, 1, (v2i64) inp2);
  1406.     tmp1 = (v16u8) __msa_insve_d((v2i64) inp3, 1, (v2i64) inp4);
  1407.     AVER_UB2_UB(res0, tmp0, res1, tmp1, res0, res1);
  1408.     ST8x4_UB(res0, res1, dst, dst_stride);
  1409.     dst += (4 * dst_stride);
  1410.  
  1411.     inp8 = LD_UB(src);
  1412.     res0 = APPLY_VERT_QPEL_FILTER_8BYTE(inp4, inp3, inp2, inp1,
  1413.                                         inp5, inp6, inp7, inp8,
  1414.                                         inp5, inp4, inp3, inp2,
  1415.                                         inp6, inp7, inp8, inp8,
  1416.                                         const20, const6, const3);
  1417.     res1 = APPLY_VERT_QPEL_FILTER_8BYTE(inp6, inp5, inp4, inp3,
  1418.                                         inp7, inp8, inp8, inp7,
  1419.                                         inp7, inp6, inp5, inp4,
  1420.                                         inp8, inp8, inp7, inp6,
  1421.                                         const20, const6, const3);
  1422.     tmp0 = (v16u8) __msa_insve_d((v2i64) inp5, 1, (v2i64) inp6);
  1423.     tmp1 = (v16u8) __msa_insve_d((v2i64) inp7, 1, (v2i64) inp8);
  1424.     AVER_UB2_UB(res0, tmp0, res1, tmp1, res0, res1);
  1425.     ST8x4_UB(res0, res1, dst, dst_stride);
  1426. }
  1427.  
  1428. static void vert_mc_qpel_aver_src1_16x16_msa(const uint8_t *src,
  1429.                                              int32_t src_stride,
  1430.                                              uint8_t *dst,
  1431.                                              int32_t dst_stride)
  1432. {
  1433.     v16u8 inp0, inp1, inp2, inp3, inp4, inp5, inp6, inp7, inp8;
  1434.     v16u8 inp9, inp10, inp11, inp12, inp13, inp14, inp15, inp16;
  1435.     v16u8 res0;
  1436.     v16u8 const20 = (v16u8) __msa_ldi_b(20);
  1437.     v16u8 const6 = (v16u8) __msa_ldi_b(6);
  1438.     v16u8 const3 = (v16u8) __msa_ldi_b(3);
  1439.  
  1440.     LD_UB4(src, src_stride, inp0, inp1, inp2, inp3);
  1441.     src += (4 * src_stride);
  1442.     inp4 = LD_UB(src);
  1443.     src += src_stride;
  1444.     res0 = APPLY_VERT_QPEL_FILTER(inp0, inp0, inp1, inp2,
  1445.                                   inp1, inp2, inp3, inp4,
  1446.                                   const20, const6, const3);
  1447.     res0 = __msa_aver_u_b(res0, inp1);
  1448.     ST_UB(res0, dst);
  1449.     dst += dst_stride;
  1450.  
  1451.     inp5 = LD_UB(src);
  1452.     src += src_stride;
  1453.     res0 = APPLY_VERT_QPEL_FILTER(inp1, inp0, inp0, inp1,
  1454.                                   inp2, inp3, inp4, inp5,
  1455.                                   const20, const6, const3);
  1456.     res0 = __msa_aver_u_b(res0, inp2);
  1457.     ST_UB(res0, dst);
  1458.     dst += dst_stride;
  1459.  
  1460.     inp6 = LD_UB(src);
  1461.     src += src_stride;
  1462.     res0 = APPLY_VERT_QPEL_FILTER(inp2, inp1, inp0, inp0,
  1463.                                   inp3, inp4, inp5, inp6,
  1464.                                   const20, const6, const3);
  1465.     res0 = __msa_aver_u_b(res0, inp3);
  1466.     ST_UB(res0, dst);
  1467.     dst += dst_stride;
  1468.  
  1469.     inp7 = LD_UB(src);
  1470.     src += src_stride;
  1471.     res0 = APPLY_VERT_QPEL_FILTER(inp3, inp2, inp1, inp0,
  1472.                                   inp4, inp5, inp6, inp7,
  1473.                                   const20, const6, const3);
  1474.     res0 = __msa_aver_u_b(res0, inp4);
  1475.     ST_UB(res0, dst);
  1476.     dst += dst_stride;
  1477.  
  1478.     inp8 = LD_UB(src);
  1479.     src += src_stride;
  1480.     res0 = APPLY_VERT_QPEL_FILTER(inp4, inp3, inp2, inp1,
  1481.                                   inp5, inp6, inp7, inp8,
  1482.                                   const20, const6, const3);
  1483.     res0 = __msa_aver_u_b(res0, inp5);
  1484.     ST_UB(res0, dst);
  1485.     dst += dst_stride;
  1486.  
  1487.     inp9 = LD_UB(src);
  1488.     src += src_stride;
  1489.     res0 = APPLY_VERT_QPEL_FILTER(inp5, inp4, inp3, inp2,
  1490.                                   inp6, inp7, inp8, inp9,
  1491.                                   const20, const6, const3);
  1492.     res0 = __msa_aver_u_b(res0, inp6);
  1493.     ST_UB(res0, dst);
  1494.     dst += dst_stride;
  1495.  
  1496.     inp10 = LD_UB(src);
  1497.     src += src_stride;
  1498.     res0 = APPLY_VERT_QPEL_FILTER(inp6, inp5, inp4, inp3,
  1499.                                   inp7, inp8, inp9, inp10,
  1500.                                   const20, const6, const3);
  1501.     res0 = __msa_aver_u_b(res0, inp7);
  1502.     ST_UB(res0, dst);
  1503.     dst += dst_stride;
  1504.  
  1505.     inp11 = LD_UB(src);
  1506.     src += src_stride;
  1507.     res0 = APPLY_VERT_QPEL_FILTER(inp7, inp6, inp5, inp4,
  1508.                                   inp8, inp9, inp10, inp11,
  1509.                                   const20, const6, const3);
  1510.     res0 = __msa_aver_u_b(res0, inp8);
  1511.     ST_UB(res0, dst);
  1512.     dst += dst_stride;
  1513.  
  1514.     inp12 = LD_UB(src);
  1515.     src += src_stride;
  1516.     res0 = APPLY_VERT_QPEL_FILTER(inp8, inp7, inp6, inp5,
  1517.                                   inp9, inp10, inp11, inp12,
  1518.                                   const20, const6, const3);
  1519.     res0 = __msa_aver_u_b(res0, inp9);
  1520.     ST_UB(res0, dst);
  1521.     dst += dst_stride;
  1522.  
  1523.     inp13 = LD_UB(src);
  1524.     src += src_stride;
  1525.     res0 = APPLY_VERT_QPEL_FILTER(inp9, inp8, inp7, inp6,
  1526.                                   inp10, inp11, inp12, inp13,
  1527.                                   const20, const6, const3);
  1528.     res0 = __msa_aver_u_b(res0, inp10);
  1529.     ST_UB(res0, dst);
  1530.     dst += dst_stride;
  1531.  
  1532.     inp14 = LD_UB(src);
  1533.     src += src_stride;
  1534.     res0 = APPLY_VERT_QPEL_FILTER(inp10, inp9, inp8, inp7,
  1535.                                   inp11, inp12, inp13, inp14,
  1536.                                   const20, const6, const3);
  1537.     res0 = __msa_aver_u_b(res0, inp11);
  1538.     ST_UB(res0, dst);
  1539.     dst += dst_stride;
  1540.  
  1541.     inp15 = LD_UB(src);
  1542.     src += src_stride;
  1543.     res0 = APPLY_VERT_QPEL_FILTER(inp11, inp10, inp9, inp8,
  1544.                                   inp12, inp13, inp14, inp15,
  1545.                                   const20, const6, const3);
  1546.     res0 = __msa_aver_u_b(res0, inp12);
  1547.     ST_UB(res0, dst);
  1548.     dst += dst_stride;
  1549.  
  1550.     inp16 = LD_UB(src);
  1551.     res0 = APPLY_VERT_QPEL_FILTER(inp12, inp11, inp10, inp9,
  1552.                                   inp13, inp14, inp15, inp16,
  1553.                                   const20, const6, const3);
  1554.     res0 = __msa_aver_u_b(res0, inp13);
  1555.     ST_UB(res0, dst);
  1556.     dst += dst_stride;
  1557.  
  1558.     res0 = APPLY_VERT_QPEL_FILTER(inp13, inp12, inp11, inp10,
  1559.                                   inp14, inp15, inp16, inp16,
  1560.                                   const20, const6, const3);
  1561.     res0 = __msa_aver_u_b(res0, inp14);
  1562.     ST_UB(res0, dst);
  1563.     dst += dst_stride;
  1564.  
  1565.     res0 = APPLY_VERT_QPEL_FILTER(inp14, inp13, inp12, inp11,
  1566.                                   inp15, inp16, inp16, inp15,
  1567.                                   const20, const6, const3);
  1568.     res0 = __msa_aver_u_b(res0, inp15);
  1569.     ST_UB(res0, dst);
  1570.     dst += dst_stride;
  1571.  
  1572.     res0 = APPLY_VERT_QPEL_FILTER(inp15, inp14, inp13, inp12,
  1573.                                   inp16, inp16, inp15, inp14,
  1574.                                   const20, const6, const3);
  1575.     res0 = __msa_aver_u_b(res0, inp16);
  1576.     ST_UB(res0, dst);
  1577. }
  1578.  
  1579. static void vert_mc_qpel_no_rnd_aver_src0_8x8_msa(const uint8_t *src,
  1580.                                                   int32_t src_stride,
  1581.                                                   uint8_t *dst,
  1582.                                                   int32_t dst_stride)
  1583. {
  1584.     v16u8 inp0, inp1, inp2, inp3, inp4, inp5, inp6, inp7, inp8;
  1585.     v16u8 tmp0, tmp1, res0, res1;
  1586.     v16u8 const20 = (v16u8) __msa_ldi_b(20);
  1587.     v16u8 const6 = (v16u8) __msa_ldi_b(6);
  1588.     v16u8 const3 = (v16u8) __msa_ldi_b(3);
  1589.  
  1590.     LD_UB4(src, src_stride, inp0, inp1, inp2, inp3);
  1591.     src += (4 * src_stride);
  1592.     LD_UB2(src, src_stride, inp4, inp5);
  1593.     src += (2 * src_stride);
  1594.     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER_8BYTE(inp0, inp0, inp1, inp2,
  1595.                                                  inp1, inp2, inp3, inp4,
  1596.                                                  inp1, inp0, inp0, inp1,
  1597.                                                  inp2, inp3, inp4, inp5,
  1598.                                                  const20, const6, const3);
  1599.     LD_UB2(src, src_stride, inp6, inp7);
  1600.     src += (2 * src_stride);
  1601.     res1 = APPLY_VERT_QPEL_NO_ROUND_FILTER_8BYTE(inp2, inp1, inp0, inp0,
  1602.                                                  inp3, inp4, inp5, inp6,
  1603.                                                  inp3, inp2, inp1, inp0,
  1604.                                                  inp4, inp5, inp6, inp7,
  1605.                                                  const20, const6, const3);
  1606.     tmp0 = (v16u8) __msa_insve_d((v2i64) inp0, 1, (v2i64) inp1);
  1607.     tmp1 = (v16u8) __msa_insve_d((v2i64) inp2, 1, (v2i64) inp3);
  1608.     res0 = __msa_ave_u_b(res0, tmp0);
  1609.     res1 = __msa_ave_u_b(res1, tmp1);
  1610.     ST8x4_UB(res0, res1, dst, dst_stride);
  1611.     dst += (4 * dst_stride);
  1612.  
  1613.     inp8 = LD_UB(src);
  1614.     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER_8BYTE(inp4, inp3, inp2, inp1,
  1615.                                                  inp5, inp6, inp7, inp8,
  1616.                                                  inp5, inp4, inp3, inp2,
  1617.                                                  inp6, inp7, inp8, inp8,
  1618.                                                  const20, const6, const3);
  1619.     res1 = APPLY_VERT_QPEL_NO_ROUND_FILTER_8BYTE(inp6, inp5, inp4, inp3,
  1620.                                                  inp7, inp8, inp8, inp7,
  1621.                                                  inp7, inp6, inp5, inp4,
  1622.                                                  inp8, inp8, inp7, inp6,
  1623.                                                  const20, const6, const3);
  1624.     tmp0 = (v16u8) __msa_insve_d((v2i64) inp4, 1, (v2i64) inp5);
  1625.     tmp1 = (v16u8) __msa_insve_d((v2i64) inp6, 1, (v2i64) inp7);
  1626.     res0 = __msa_ave_u_b(res0, tmp0);
  1627.     res1 = __msa_ave_u_b(res1, tmp1);
  1628.     ST8x4_UB(res0, res1, dst, dst_stride);
  1629.     dst += (4 * dst_stride);
  1630. }
  1631.  
  1632. static void vert_mc_qpel_no_rnd_aver_src0_16x16_msa(const uint8_t *src,
  1633.                                                     int32_t src_stride,
  1634.                                                     uint8_t *dst,
  1635.                                                     int32_t dst_stride)
  1636. {
  1637.     v16u8 inp0, inp1, inp2, inp3, inp4, inp5, inp6, inp7, inp8;
  1638.     v16u8 inp9, inp10, inp11, inp12, inp13, inp14, inp15, inp16;
  1639.     v16u8 res0;
  1640.     v16u8 const20 = (v16u8) __msa_ldi_b(20);
  1641.     v16u8 const6 = (v16u8) __msa_ldi_b(6);
  1642.     v16u8 const3 = (v16u8) __msa_ldi_b(3);
  1643.  
  1644.     LD_UB5(src, src_stride, inp0, inp1, inp2, inp3, inp4);
  1645.     src += (5 * src_stride);
  1646.     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER(inp0, inp0, inp1, inp2,
  1647.                                            inp1, inp2, inp3, inp4,
  1648.                                            const20, const6, const3);
  1649.     res0 = __msa_ave_u_b(res0, inp0);
  1650.     ST_UB(res0, dst);
  1651.     dst += dst_stride;
  1652.  
  1653.     inp5 = LD_UB(src);
  1654.     src += src_stride;
  1655.     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER(inp1, inp0, inp0, inp1,
  1656.                                            inp2, inp3, inp4, inp5,
  1657.                                            const20, const6, const3);
  1658.     res0 = __msa_ave_u_b(res0, inp1);
  1659.     ST_UB(res0, dst);
  1660.     dst += dst_stride;
  1661.  
  1662.     inp6 = LD_UB(src);
  1663.     src += src_stride;
  1664.     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER(inp2, inp1, inp0, inp0,
  1665.                                            inp3, inp4, inp5, inp6,
  1666.                                            const20, const6, const3);
  1667.     res0 = __msa_ave_u_b(res0, inp2);
  1668.     ST_UB(res0, dst);
  1669.     dst += dst_stride;
  1670.  
  1671.     inp7 = LD_UB(src);
  1672.     src += src_stride;
  1673.     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER(inp3, inp2, inp1, inp0,
  1674.                                            inp4, inp5, inp6, inp7,
  1675.                                            const20, const6, const3);
  1676.     res0 = __msa_ave_u_b(res0, inp3);
  1677.     ST_UB(res0, dst);
  1678.     dst += dst_stride;
  1679.  
  1680.     inp8 = LD_UB(src);
  1681.     src += src_stride;
  1682.     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER(inp4, inp3, inp2, inp1,
  1683.                                            inp5, inp6, inp7, inp8,
  1684.                                            const20, const6, const3);
  1685.     res0 = __msa_ave_u_b(res0, inp4);
  1686.     ST_UB(res0, dst);
  1687.     dst += dst_stride;
  1688.  
  1689.     inp9 = LD_UB(src);
  1690.     src += src_stride;
  1691.     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER(inp5, inp4, inp3, inp2,
  1692.                                            inp6, inp7, inp8, inp9,
  1693.                                            const20, const6, const3);
  1694.     res0 = __msa_ave_u_b(res0, inp5);
  1695.     ST_UB(res0, dst);
  1696.     dst += dst_stride;
  1697.  
  1698.     inp10 = LD_UB(src);
  1699.     src += src_stride;
  1700.     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER(inp6, inp5, inp4, inp3,
  1701.                                            inp7, inp8, inp9, inp10,
  1702.                                            const20, const6, const3);
  1703.     res0 = __msa_ave_u_b(res0, inp6);
  1704.     ST_UB(res0, dst);
  1705.     dst += dst_stride;
  1706.  
  1707.     inp11 = LD_UB(src);
  1708.     src += src_stride;
  1709.     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER(inp7, inp6, inp5, inp4,
  1710.                                            inp8, inp9, inp10, inp11,
  1711.                                            const20, const6, const3);
  1712.     res0 = __msa_ave_u_b(res0, inp7);
  1713.     ST_UB(res0, dst);
  1714.     dst += dst_stride;
  1715.  
  1716.     inp12 = LD_UB(src);
  1717.     src += src_stride;
  1718.     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER(inp8, inp7, inp6, inp5,
  1719.                                            inp9, inp10, inp11, inp12,
  1720.                                            const20, const6, const3);
  1721.     res0 = __msa_ave_u_b(res0, inp8);
  1722.     ST_UB(res0, dst);
  1723.     dst += dst_stride;
  1724.  
  1725.     inp13 = LD_UB(src);
  1726.     src += src_stride;
  1727.     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER(inp9, inp8, inp7, inp6,
  1728.                                            inp10, inp11, inp12, inp13,
  1729.                                            const20, const6, const3);
  1730.     res0 = __msa_ave_u_b(res0, inp9);
  1731.     ST_UB(res0, dst);
  1732.     dst += dst_stride;
  1733.  
  1734.     inp14 = LD_UB(src);
  1735.     src += src_stride;
  1736.     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER(inp10, inp9, inp8, inp7,
  1737.                                            inp11, inp12, inp13, inp14,
  1738.                                            const20, const6, const3);
  1739.     res0 = __msa_ave_u_b(res0, inp10);
  1740.     ST_UB(res0, dst);
  1741.     dst += dst_stride;
  1742.  
  1743.     inp15 = LD_UB(src);
  1744.     src += src_stride;
  1745.     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER(inp11, inp10, inp9, inp8,
  1746.                                            inp12, inp13, inp14, inp15,
  1747.                                            const20, const6, const3);
  1748.     res0 = __msa_ave_u_b(res0, inp11);
  1749.     ST_UB(res0, dst);
  1750.     dst += dst_stride;
  1751.  
  1752.     inp16 = LD_UB(src);
  1753.     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER(inp12, inp11, inp10, inp9,
  1754.                                            inp13, inp14, inp15, inp16,
  1755.                                            const20, const6, const3);
  1756.     res0 = __msa_ave_u_b(res0, inp12);
  1757.     ST_UB(res0, dst);
  1758.     dst += dst_stride;
  1759.  
  1760.     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER(inp13, inp12, inp11, inp10,
  1761.                                            inp14, inp15, inp16, inp16,
  1762.                                            const20, const6, const3);
  1763.     res0 = __msa_ave_u_b(res0, inp13);
  1764.     ST_UB(res0, dst);
  1765.     dst += dst_stride;
  1766.  
  1767.     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER(inp14, inp13, inp12, inp11,
  1768.                                            inp15, inp16, inp16, inp15,
  1769.                                            const20, const6, const3);
  1770.     res0 = __msa_ave_u_b(res0, inp14);
  1771.     ST_UB(res0, dst);
  1772.     dst += dst_stride;
  1773.  
  1774.     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER(inp15, inp14, inp13, inp12,
  1775.                                            inp16, inp16, inp15, inp14,
  1776.                                            const20, const6, const3);
  1777.     res0 = __msa_ave_u_b(res0, inp15);
  1778.     ST_UB(res0, dst);
  1779.     dst += dst_stride;
  1780. }
  1781.  
  1782. static void vert_mc_qpel_no_rnd_8x8_msa(const uint8_t *src,
  1783.                                         int32_t src_stride,
  1784.                                         uint8_t *dst,
  1785.                                         int32_t dst_stride)
  1786. {
  1787.     v16u8 inp0, inp1, inp2, inp3, inp4, inp5, inp6, inp7, inp8;
  1788.     v16u8 res0, res1;
  1789.     v16u8 const20 = (v16u8) __msa_ldi_b(20);
  1790.     v16u8 const6 = (v16u8) __msa_ldi_b(6);
  1791.     v16u8 const3 = (v16u8) __msa_ldi_b(3);
  1792.  
  1793.     LD_UB4(src, src_stride, inp0, inp1, inp2, inp3);
  1794.     src += (4 * src_stride);
  1795.     LD_UB2(src, src_stride, inp4, inp5);
  1796.     src += (2 * src_stride);
  1797.     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER_8BYTE(inp0, inp0, inp1, inp2,
  1798.                                                  inp1, inp2, inp3, inp4,
  1799.                                                  inp1, inp0, inp0, inp1,
  1800.                                                  inp2, inp3, inp4, inp5,
  1801.                                                  const20, const6, const3);
  1802.     LD_UB2(src, src_stride, inp6, inp7);
  1803.     src += (2 * src_stride);
  1804.     res1 = APPLY_VERT_QPEL_NO_ROUND_FILTER_8BYTE(inp2, inp1, inp0, inp0,
  1805.                                                  inp3, inp4, inp5, inp6,
  1806.                                                  inp3, inp2, inp1, inp0,
  1807.                                                  inp4, inp5, inp6, inp7,
  1808.                                                  const20, const6, const3);
  1809.     ST8x4_UB(res0, res1, dst, dst_stride);
  1810.     dst += (4 * dst_stride);
  1811.  
  1812.     inp8 = LD_UB(src);
  1813.     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER_8BYTE(inp4, inp3, inp2, inp1,
  1814.                                                  inp5, inp6, inp7, inp8,
  1815.                                                  inp5, inp4, inp3, inp2,
  1816.                                                  inp6, inp7, inp8, inp8,
  1817.                                                  const20, const6, const3);
  1818.     res1 = APPLY_VERT_QPEL_NO_ROUND_FILTER_8BYTE(inp6, inp5, inp4, inp3,
  1819.                                                  inp7, inp8, inp8, inp7,
  1820.                                                  inp7, inp6, inp5, inp4,
  1821.                                                  inp8, inp8, inp7, inp6,
  1822.                                                  const20, const6, const3);
  1823.     ST8x4_UB(res0, res1, dst, dst_stride);
  1824.     dst += (4 * dst_stride);
  1825. }
  1826.  
  1827. static void vert_mc_qpel_no_rnd_16x16_msa(const uint8_t *src,
  1828.                                           int32_t src_stride,
  1829.                                           uint8_t *dst,
  1830.                                           int32_t dst_stride)
  1831. {
  1832.     v16u8 inp0, inp1, inp2, inp3, inp4, inp5, inp6, inp7, inp8;
  1833.     v16u8 inp9, inp10, inp11, inp12, inp13, inp14, inp15, inp16;
  1834.     v16u8 res0;
  1835.     v16u8 const20 = (v16u8) __msa_ldi_b(20);
  1836.     v16u8 const6 = (v16u8) __msa_ldi_b(6);
  1837.     v16u8 const3 = (v16u8) __msa_ldi_b(3);
  1838.  
  1839.     LD_UB5(src, src_stride, inp0, inp1, inp2, inp3, inp4);
  1840.     src += (5 * src_stride);
  1841.     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER(inp0, inp0, inp1, inp2,
  1842.                                            inp1, inp2, inp3, inp4,
  1843.                                            const20, const6, const3);
  1844.     ST_UB(res0, dst);
  1845.     dst += dst_stride;
  1846.  
  1847.     inp5 = LD_UB(src);
  1848.     src += src_stride;
  1849.     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER(inp1, inp0, inp0, inp1,
  1850.                                            inp2, inp3, inp4, inp5,
  1851.                                            const20, const6, const3);
  1852.     ST_UB(res0, dst);
  1853.     dst += dst_stride;
  1854.  
  1855.     inp6 = LD_UB(src);
  1856.     src += src_stride;
  1857.     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER(inp2, inp1, inp0, inp0,
  1858.                                            inp3, inp4, inp5, inp6,
  1859.                                            const20, const6, const3);
  1860.     ST_UB(res0, dst);
  1861.     dst += dst_stride;
  1862.  
  1863.     inp7 = LD_UB(src);
  1864.     src += src_stride;
  1865.     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER(inp3, inp2, inp1, inp0,
  1866.                                            inp4, inp5, inp6, inp7,
  1867.                                            const20, const6, const3);
  1868.     ST_UB(res0, dst);
  1869.     dst += dst_stride;
  1870.  
  1871.     inp8 = LD_UB(src);
  1872.     src += src_stride;
  1873.     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER(inp4, inp3, inp2, inp1,
  1874.                                            inp5, inp6, inp7, inp8,
  1875.                                            const20, const6, const3);
  1876.     ST_UB(res0, dst);
  1877.     dst += dst_stride;
  1878.  
  1879.     inp9 = LD_UB(src);
  1880.     src += src_stride;
  1881.     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER(inp5, inp4, inp3, inp2,
  1882.                                            inp6, inp7, inp8, inp9,
  1883.                                            const20, const6, const3);
  1884.     ST_UB(res0, dst);
  1885.     dst += dst_stride;
  1886.  
  1887.     inp10 = LD_UB(src);
  1888.     src += src_stride;
  1889.     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER(inp6, inp5, inp4, inp3,
  1890.                                            inp7, inp8, inp9, inp10,
  1891.                                            const20, const6, const3);
  1892.     ST_UB(res0, dst);
  1893.     dst += dst_stride;
  1894.  
  1895.     inp11 = LD_UB(src);
  1896.     src += src_stride;
  1897.     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER(inp7, inp6, inp5, inp4,
  1898.                                            inp8, inp9, inp10, inp11,
  1899.                                            const20, const6, const3);
  1900.     ST_UB(res0, dst);
  1901.     dst += dst_stride;
  1902.  
  1903.     inp12 = LD_UB(src);
  1904.     src += src_stride;
  1905.     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER(inp8, inp7, inp6, inp5,
  1906.                                            inp9, inp10, inp11, inp12,
  1907.                                            const20, const6, const3);
  1908.     ST_UB(res0, dst);
  1909.     dst += dst_stride;
  1910.  
  1911.     inp13 = LD_UB(src);
  1912.     src += src_stride;
  1913.     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER(inp9, inp8, inp7, inp6,
  1914.                                            inp10, inp11, inp12, inp13,
  1915.                                            const20, const6, const3);
  1916.     ST_UB(res0, dst);
  1917.     dst += dst_stride;
  1918.  
  1919.     inp14 = LD_UB(src);
  1920.     src += src_stride;
  1921.     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER(inp10, inp9, inp8, inp7,
  1922.                                            inp11, inp12, inp13, inp14,
  1923.                                            const20, const6, const3);
  1924.     ST_UB(res0, dst);
  1925.     dst += dst_stride;
  1926.  
  1927.     inp15 = LD_UB(src);
  1928.     src += src_stride;
  1929.     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER(inp11, inp10, inp9, inp8,
  1930.                                            inp12, inp13, inp14, inp15,
  1931.                                            const20, const6, const3);
  1932.     ST_UB(res0, dst);
  1933.     dst += dst_stride;
  1934.  
  1935.     inp16 = LD_UB(src);
  1936.     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER(inp12, inp11, inp10, inp9,
  1937.                                            inp13, inp14, inp15, inp16,
  1938.                                            const20, const6, const3);
  1939.     ST_UB(res0, dst);
  1940.     dst += dst_stride;
  1941.  
  1942.     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER(inp13, inp12, inp11, inp10,
  1943.                                            inp14, inp15, inp16, inp16,
  1944.                                            const20, const6, const3);
  1945.     ST_UB(res0, dst);
  1946.     dst += dst_stride;
  1947.  
  1948.     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER(inp14, inp13, inp12, inp11,
  1949.                                            inp15, inp16, inp16, inp15,
  1950.                                            const20, const6, const3);
  1951.     ST_UB(res0, dst);
  1952.     dst += dst_stride;
  1953.  
  1954.     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER(inp15, inp14, inp13, inp12,
  1955.                                            inp16, inp16, inp15, inp14,
  1956.                                            const20, const6, const3);
  1957.     ST_UB(res0, dst);
  1958. }
  1959.  
  1960. static void vert_mc_qpel_no_rnd_aver_src1_8x8_msa(const uint8_t *src,
  1961.                                                   int32_t src_stride,
  1962.                                                   uint8_t *dst,
  1963.                                                   int32_t dst_stride)
  1964. {
  1965.     v16u8 inp0, inp1, inp2, inp3, inp4, inp5, inp6, inp7, inp8;
  1966.     v16u8 tmp0, tmp1, res0, res1;
  1967.     v16u8 const20 = (v16u8) __msa_ldi_b(20);
  1968.     v16u8 const6 = (v16u8) __msa_ldi_b(6);
  1969.     v16u8 const3 = (v16u8) __msa_ldi_b(3);
  1970.  
  1971.     LD_UB4(src, src_stride, inp0, inp1, inp2, inp3);
  1972.     src += (4 * src_stride);
  1973.     LD_UB2(src, src_stride, inp4, inp5);
  1974.     src += (2 * src_stride);
  1975.     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER_8BYTE(inp0, inp0, inp1, inp2,
  1976.                                                  inp1, inp2, inp3, inp4,
  1977.                                                  inp1, inp0, inp0, inp1,
  1978.                                                  inp2, inp3, inp4, inp5,
  1979.                                                  const20, const6, const3);
  1980.     LD_UB2(src, src_stride, inp6, inp7);
  1981.     src += (2 * src_stride);
  1982.     res1 = APPLY_VERT_QPEL_NO_ROUND_FILTER_8BYTE(inp2, inp1, inp0, inp0,
  1983.                                                  inp3, inp4, inp5, inp6,
  1984.                                                  inp3, inp2, inp1, inp0,
  1985.                                                  inp4, inp5, inp6, inp7,
  1986.                                                  const20, const6, const3);
  1987.     tmp0 = (v16u8) __msa_insve_d((v2i64) inp1, 1, (v2i64) inp2);
  1988.     tmp1 = (v16u8) __msa_insve_d((v2i64) inp3, 1, (v2i64) inp4);
  1989.     res0 = __msa_ave_u_b(res0, tmp0);
  1990.     res1 = __msa_ave_u_b(res1, tmp1);
  1991.     ST8x4_UB(res0, res1, dst, dst_stride);
  1992.     dst += (4 * dst_stride);
  1993.  
  1994.     inp8 = LD_UB(src);
  1995.     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER_8BYTE(inp4, inp3, inp2, inp1,
  1996.                                                  inp5, inp6, inp7, inp8,
  1997.                                                  inp5, inp4, inp3, inp2,
  1998.                                                  inp6, inp7, inp8, inp8,
  1999.                                                  const20, const6, const3);
  2000.     res1 = APPLY_VERT_QPEL_NO_ROUND_FILTER_8BYTE(inp6, inp5, inp4, inp3,
  2001.                                                  inp7, inp8, inp8, inp7,
  2002.                                                  inp7, inp6, inp5, inp4,
  2003.                                                  inp8, inp8, inp7, inp6,
  2004.                                                  const20, const6, const3);
  2005.     tmp0 = (v16u8) __msa_insve_d((v2i64) inp5, 1, (v2i64) inp6);
  2006.     tmp1 = (v16u8) __msa_insve_d((v2i64) inp7, 1, (v2i64) inp8);
  2007.     res0 = __msa_ave_u_b(res0, tmp0);
  2008.     res1 = __msa_ave_u_b(res1, tmp1);
  2009.     ST8x4_UB(res0, res1, dst, dst_stride);
  2010. }
  2011.  
  2012. static void vert_mc_qpel_no_rnd_aver_src1_16x16_msa(const uint8_t *src,
  2013.                                                     int32_t src_stride,
  2014.                                                     uint8_t *dst,
  2015.                                                     int32_t dst_stride)
  2016. {
  2017.     v16u8 inp0, inp1, inp2, inp3, inp4, inp5, inp6, inp7, inp8;
  2018.     v16u8 inp9, inp10, inp11, inp12, inp13, inp14, inp15, inp16;
  2019.     v16u8 res0;
  2020.     v16u8 const20 = (v16u8) __msa_ldi_b(20);
  2021.     v16u8 const6 = (v16u8) __msa_ldi_b(6);
  2022.     v16u8 const3 = (v16u8) __msa_ldi_b(3);
  2023.  
  2024.     LD_UB5(src, src_stride, inp0, inp1, inp2, inp3, inp4);
  2025.     src += (5 * src_stride);
  2026.     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER(inp0, inp0, inp1, inp2,
  2027.                                            inp1, inp2, inp3, inp4,
  2028.                                            const20, const6, const3);
  2029.     res0 = __msa_ave_u_b(res0, inp1);
  2030.     ST_UB(res0, dst);
  2031.     dst += dst_stride;
  2032.  
  2033.     inp5 = LD_UB(src);
  2034.     src += src_stride;
  2035.     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER(inp1, inp0, inp0, inp1,
  2036.                                            inp2, inp3, inp4, inp5,
  2037.                                            const20, const6, const3);
  2038.     res0 = __msa_ave_u_b(res0, inp2);
  2039.     ST_UB(res0, dst);
  2040.     dst += dst_stride;
  2041.  
  2042.     inp6 = LD_UB(src);
  2043.     src += src_stride;
  2044.     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER(inp2, inp1, inp0, inp0,
  2045.                                            inp3, inp4, inp5, inp6,
  2046.                                            const20, const6, const3);
  2047.     res0 = __msa_ave_u_b(res0, inp3);
  2048.     ST_UB(res0, dst);
  2049.     dst += dst_stride;
  2050.  
  2051.     inp7 = LD_UB(src);
  2052.     src += src_stride;
  2053.     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER(inp3, inp2, inp1, inp0,
  2054.                                            inp4, inp5, inp6, inp7,
  2055.                                            const20, const6, const3);
  2056.     res0 = __msa_ave_u_b(res0, inp4);
  2057.     ST_UB(res0, dst);
  2058.     dst += dst_stride;
  2059.  
  2060.     inp8 = LD_UB(src);
  2061.     src += src_stride;
  2062.     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER(inp4, inp3, inp2, inp1,
  2063.                                            inp5, inp6, inp7, inp8,
  2064.                                            const20, const6, const3);
  2065.     res0 = __msa_ave_u_b(res0, inp5);
  2066.     ST_UB(res0, dst);
  2067.     dst += dst_stride;
  2068.  
  2069.     inp9 = LD_UB(src);
  2070.     src += src_stride;
  2071.     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER(inp5, inp4, inp3, inp2,
  2072.                                            inp6, inp7, inp8, inp9,
  2073.                                            const20, const6, const3);
  2074.     res0 = __msa_ave_u_b(res0, inp6);
  2075.     ST_UB(res0, dst);
  2076.     dst += dst_stride;
  2077.  
  2078.     inp10 = LD_UB(src);
  2079.     src += src_stride;
  2080.     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER(inp6, inp5, inp4, inp3,
  2081.                                            inp7, inp8, inp9, inp10,
  2082.                                            const20, const6, const3);
  2083.     res0 = __msa_ave_u_b(res0, inp7);
  2084.     ST_UB(res0, dst);
  2085.     dst += dst_stride;
  2086.  
  2087.     inp11 = LD_UB(src);
  2088.     src += src_stride;
  2089.     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER(inp7, inp6, inp5, inp4,
  2090.                                            inp8, inp9, inp10, inp11,
  2091.                                            const20, const6, const3);
  2092.     res0 = __msa_ave_u_b(res0, inp8);
  2093.     ST_UB(res0, dst);
  2094.     dst += dst_stride;
  2095.  
  2096.     inp12 = LD_UB(src);
  2097.     src += src_stride;
  2098.     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER(inp8, inp7, inp6, inp5,
  2099.                                            inp9, inp10, inp11, inp12,
  2100.                                            const20, const6, const3);
  2101.     res0 = __msa_ave_u_b(res0, inp9);
  2102.     ST_UB(res0, dst);
  2103.     dst += dst_stride;
  2104.  
  2105.     inp13 = LD_UB(src);
  2106.     src += src_stride;
  2107.     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER(inp9, inp8, inp7, inp6,
  2108.                                            inp10, inp11, inp12, inp13,
  2109.                                            const20, const6, const3);
  2110.     res0 = __msa_ave_u_b(res0, inp10);
  2111.     ST_UB(res0, dst);
  2112.     dst += dst_stride;
  2113.  
  2114.     inp14 = LD_UB(src);
  2115.     src += src_stride;
  2116.     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER(inp10, inp9, inp8, inp7,
  2117.                                            inp11, inp12, inp13, inp14,
  2118.                                            const20, const6, const3);
  2119.     res0 = __msa_ave_u_b(res0, inp11);
  2120.     ST_UB(res0, dst);
  2121.     dst += dst_stride;
  2122.  
  2123.     inp15 = LD_UB(src);
  2124.     src += src_stride;
  2125.     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER(inp11, inp10, inp9, inp8,
  2126.                                            inp12, inp13, inp14, inp15,
  2127.                                            const20, const6, const3);
  2128.     res0 = __msa_ave_u_b(res0, inp12);
  2129.     ST_UB(res0, dst);
  2130.     dst += dst_stride;
  2131.  
  2132.     inp16 = LD_UB(src);
  2133.     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER(inp12, inp11, inp10, inp9,
  2134.                                            inp13, inp14, inp15, inp16,
  2135.                                            const20, const6, const3);
  2136.     res0 = __msa_ave_u_b(res0, inp13);
  2137.     ST_UB(res0, dst);
  2138.     dst += dst_stride;
  2139.  
  2140.     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER(inp13, inp12, inp11, inp10,
  2141.                                            inp14, inp15, inp16, inp16,
  2142.                                            const20, const6, const3);
  2143.     res0 = __msa_ave_u_b(res0, inp14);
  2144.     ST_UB(res0, dst);
  2145.     dst += dst_stride;
  2146.  
  2147.     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER(inp14, inp13, inp12, inp11,
  2148.                                            inp15, inp16, inp16, inp15,
  2149.                                            const20, const6, const3);
  2150.     res0 = __msa_ave_u_b(res0, inp15);
  2151.     ST_UB(res0, dst);
  2152.     dst += dst_stride;
  2153.  
  2154.     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER(inp15, inp14, inp13, inp12,
  2155.                                            inp16, inp16, inp15, inp14,
  2156.                                            const20, const6, const3);
  2157.     res0 = __msa_ave_u_b(res0, inp16);
  2158.     ST_UB(res0, dst);
  2159. }
  2160.  
  2161. static void vert_mc_qpel_avg_dst_aver_src0_8x8_msa(const uint8_t *src,
  2162.                                                    int32_t src_stride,
  2163.                                                    uint8_t *dst,
  2164.                                                    int32_t dst_stride)
  2165. {
  2166.     v16u8 inp0, inp1, inp2, inp3, inp4, inp5, inp6, inp7, inp8;
  2167.     v16u8 dst0, dst1, dst2, dst3;
  2168.     v16u8 tmp0, tmp1, res0, res1;
  2169.     v16u8 const20 = (v16u8) __msa_ldi_b(20);
  2170.     v16u8 const6 = (v16u8) __msa_ldi_b(6);
  2171.     v16u8 const3 = (v16u8) __msa_ldi_b(3);
  2172.  
  2173.     LD_UB4(src, src_stride, inp0, inp1, inp2, inp3);
  2174.     src += (4 * src_stride);
  2175.     LD_UB2(src, src_stride, inp4, inp5);
  2176.     src += (2 * src_stride);
  2177.     res0 = APPLY_VERT_QPEL_FILTER_8BYTE(inp0, inp0, inp1, inp2,
  2178.                                         inp1, inp2, inp3, inp4,
  2179.                                         inp1, inp0, inp0, inp1,
  2180.                                         inp2, inp3, inp4, inp5,
  2181.                                         const20, const6, const3);
  2182.  
  2183.     LD_UB2(src, src_stride, inp6, inp7);
  2184.     src += (2 * src_stride);
  2185.     res1 = APPLY_VERT_QPEL_FILTER_8BYTE(inp2, inp1, inp0, inp0,
  2186.                                         inp3, inp4, inp5, inp6,
  2187.                                         inp3, inp2, inp1, inp0,
  2188.                                         inp4, inp5, inp6, inp7,
  2189.                                         const20, const6, const3);
  2190.  
  2191.     LD_UB4(dst, dst_stride, dst0, dst1, dst2, dst3);
  2192.     tmp0 = (v16u8) __msa_insve_d((v2i64) inp0, 1, (v2i64) inp1);
  2193.     tmp1 = (v16u8) __msa_insve_d((v2i64) inp2, 1, (v2i64) inp3);
  2194.     dst0 = (v16u8) __msa_insve_d((v2i64) dst0, 1, (v2i64) dst1);
  2195.     dst2 = (v16u8) __msa_insve_d((v2i64) dst2, 1, (v2i64) dst3);
  2196.     AVER_UB2_UB(res0, tmp0, res1, tmp1, res0, res1);
  2197.     AVER_UB2_UB(dst0, res0, dst2, res1, res0, res1);
  2198.     ST8x4_UB(res0, res1, dst, dst_stride);
  2199.     dst += (4 * dst_stride);
  2200.  
  2201.     inp8 = LD_UB(src);
  2202.     res0 = APPLY_VERT_QPEL_FILTER_8BYTE(inp4, inp3, inp2, inp1,
  2203.                                         inp5, inp6, inp7, inp8,
  2204.                                         inp5, inp4, inp3, inp2,
  2205.                                         inp6, inp7, inp8, inp8,
  2206.                                         const20, const6, const3);
  2207.     res1 = APPLY_VERT_QPEL_FILTER_8BYTE(inp6, inp5, inp4, inp3,
  2208.                                         inp7, inp8, inp8, inp7,
  2209.                                         inp7, inp6, inp5, inp4,
  2210.                                         inp8, inp8, inp7, inp6,
  2211.                                         const20, const6, const3);
  2212.  
  2213.     LD_UB4(dst, dst_stride, dst0, dst1, dst2, dst3);
  2214.     tmp0 = (v16u8) __msa_insve_d((v2i64) inp4, 1, (v2i64) inp5);
  2215.     tmp1 = (v16u8) __msa_insve_d((v2i64) inp6, 1, (v2i64) inp7);
  2216.     dst0 = (v16u8) __msa_insve_d((v2i64) dst0, 1, (v2i64) dst1);
  2217.     dst2 = (v16u8) __msa_insve_d((v2i64) dst2, 1, (v2i64) dst3);
  2218.     AVER_UB2_UB(res0, tmp0, res1, tmp1, res0, res1);
  2219.     AVER_UB2_UB(dst0, res0, dst2, res1, res0, res1);
  2220.     ST8x4_UB(res0, res1, dst, dst_stride);
  2221. }
  2222.  
  2223. static void vert_mc_qpel_avg_dst_aver_src0_16x16_msa(const uint8_t *src,
  2224.                                                      int32_t src_stride,
  2225.                                                      uint8_t *dst,
  2226.                                                      int32_t dst_stride)
  2227. {
  2228.     v16u8 inp0, inp1, inp2, inp3, inp4, inp5, inp6, inp7, inp8;
  2229.     v16u8 inp9, inp10, inp11, inp12, inp13, inp14, inp15, inp16;
  2230.     v16u8 res0, res1, dst0, dst1;
  2231.     v16u8 const20 = (v16u8) __msa_ldi_b(20);
  2232.     v16u8 const6 = (v16u8) __msa_ldi_b(6);
  2233.     v16u8 const3 = (v16u8) __msa_ldi_b(3);
  2234.  
  2235.     LD_UB5(src, src_stride, inp0, inp1, inp2, inp3, inp4);
  2236.     src += (5 * src_stride);
  2237.     res0 = APPLY_VERT_QPEL_FILTER(inp0, inp0, inp1, inp2,
  2238.                                   inp1, inp2, inp3, inp4,
  2239.                                   const20, const6, const3);
  2240.  
  2241.     inp5 = LD_UB(src);
  2242.     src += src_stride;
  2243.     res1 = APPLY_VERT_QPEL_FILTER(inp1, inp0, inp0, inp1,
  2244.                                   inp2, inp3, inp4, inp5,
  2245.                                   const20, const6, const3);
  2246.  
  2247.     LD_UB2(dst, dst_stride, dst0, dst1);
  2248.     AVER_UB2_UB(res0, inp0, res1, inp1, res0, res1);
  2249.     AVER_UB2_UB(res0, dst0, res1, dst1, res0, res1);
  2250.     ST_UB2(res0, res1, dst, dst_stride);
  2251.     dst += (2 * dst_stride);
  2252.  
  2253.     inp6 = LD_UB(src);
  2254.     src += src_stride;
  2255.     res0 = APPLY_VERT_QPEL_FILTER(inp2, inp1, inp0, inp0,
  2256.                                   inp3, inp4, inp5, inp6,
  2257.                                   const20, const6, const3);
  2258.  
  2259.     inp7 = LD_UB(src);
  2260.     src += src_stride;
  2261.     res1 = APPLY_VERT_QPEL_FILTER(inp3, inp2, inp1, inp0,
  2262.                                   inp4, inp5, inp6, inp7,
  2263.                                   const20, const6, const3);
  2264.  
  2265.     LD_UB2(dst, dst_stride, dst0, dst1);
  2266.     AVER_UB2_UB(res0, inp2, res1, inp3, res0, res1);
  2267.     AVER_UB2_UB(res0, dst0, res1, dst1, res0, res1);
  2268.     ST_UB2(res0, res1, dst, dst_stride);
  2269.     dst += (2 * dst_stride);
  2270.  
  2271.     LD_UB2(src, src_stride, inp8, inp9);
  2272.     src += (2 * src_stride);
  2273.     res0 = APPLY_VERT_QPEL_FILTER(inp4, inp3, inp2, inp1,
  2274.                                   inp5, inp6, inp7, inp8,
  2275.                                   const20, const6, const3);
  2276.     res1 = APPLY_VERT_QPEL_FILTER(inp5, inp4, inp3, inp2,
  2277.                                   inp6, inp7, inp8, inp9,
  2278.                                   const20, const6, const3);
  2279.  
  2280.     LD_UB2(dst, dst_stride, dst0, dst1);
  2281.     AVER_UB2_UB(res0, inp4, res1, inp5, res0, res1);
  2282.     AVER_UB2_UB(res0, dst0, res1, dst1, res0, res1);
  2283.     ST_UB2(res0, res1, dst, dst_stride);
  2284.     dst += (2 * dst_stride);
  2285.  
  2286.     LD_UB2(src, src_stride, inp10, inp11);
  2287.     src += (2 * src_stride);
  2288.     res0 = APPLY_VERT_QPEL_FILTER(inp6, inp5, inp4, inp3,
  2289.                                   inp7, inp8, inp9, inp10,
  2290.                                   const20, const6, const3);
  2291.     res1 = APPLY_VERT_QPEL_FILTER(inp7, inp6, inp5, inp4,
  2292.                                   inp8, inp9, inp10, inp11,
  2293.                                   const20, const6, const3);
  2294.  
  2295.     LD_UB2(dst, dst_stride, dst0, dst1);
  2296.     AVER_UB2_UB(res0, inp6, res1, inp7, res0, res1);
  2297.     AVER_UB2_UB(res0, dst0, res1, dst1, res0, res1);
  2298.     ST_UB2(res0, res1, dst, dst_stride);
  2299.     dst += (2 * dst_stride);
  2300.  
  2301.     LD_UB2(src, src_stride, inp12, inp13);
  2302.     src += (2 * src_stride);
  2303.     res0 = APPLY_VERT_QPEL_FILTER(inp8, inp7, inp6, inp5,
  2304.                                   inp9, inp10, inp11, inp12,
  2305.                                   const20, const6, const3);
  2306.     res1 = APPLY_VERT_QPEL_FILTER(inp9, inp8, inp7, inp6,
  2307.                                   inp10, inp11, inp12, inp13,
  2308.                                   const20, const6, const3);
  2309.     LD_UB2(dst, dst_stride, dst0, dst1);
  2310.     AVER_UB2_UB(res0, inp8, res1, inp9, res0, res1);
  2311.     AVER_UB2_UB(res0, dst0, res1, dst1, res0, res1);
  2312.     ST_UB2(res0, res1, dst, dst_stride);
  2313.     dst += (2 * dst_stride);
  2314.  
  2315.     LD_UB2(src, src_stride, inp14, inp15);
  2316.     src += (2 * src_stride);
  2317.     res0 = APPLY_VERT_QPEL_FILTER(inp10, inp9, inp8, inp7,
  2318.                                   inp11, inp12, inp13, inp14,
  2319.                                   const20, const6, const3);
  2320.     res1 = APPLY_VERT_QPEL_FILTER(inp11, inp10, inp9, inp8,
  2321.                                   inp12, inp13, inp14, inp15,
  2322.                                   const20, const6, const3);
  2323.  
  2324.     LD_UB2(dst, dst_stride, dst0, dst1);
  2325.     AVER_UB2_UB(res0, inp10, res1, inp11, res0, res1);
  2326.     AVER_UB2_UB(res0, dst0, res1, dst1, res0, res1);
  2327.     ST_UB2(res0, res1, dst, dst_stride);
  2328.     dst += (2 * dst_stride);
  2329.  
  2330.     inp16 = LD_UB(src);
  2331.     res0 = APPLY_VERT_QPEL_FILTER(inp12, inp11, inp10, inp9,
  2332.                                   inp13, inp14, inp15, inp16,
  2333.                                   const20, const6, const3);
  2334.     res1 = APPLY_VERT_QPEL_FILTER(inp13, inp12, inp11, inp10,
  2335.                                   inp14, inp15, inp16, inp16,
  2336.                                   const20, const6, const3);
  2337.     LD_UB2(dst, dst_stride, dst0, dst1);
  2338.     AVER_UB2_UB(res0, inp12, res1, inp13, res0, res1);
  2339.     AVER_UB2_UB(res0, dst0, res1, dst1, res0, res1);
  2340.     ST_UB2(res0, res1, dst, dst_stride);
  2341.     dst += (2 * dst_stride);
  2342.  
  2343.     res0 = APPLY_VERT_QPEL_FILTER(inp14, inp13, inp12, inp11,
  2344.                                   inp15, inp16, inp16, inp15,
  2345.                                   const20, const6, const3);
  2346.     res1 = APPLY_VERT_QPEL_FILTER(inp15, inp14, inp13, inp12,
  2347.                                   inp16, inp16, inp15, inp14,
  2348.                                   const20, const6, const3);
  2349.     LD_UB2(dst, dst_stride, dst0, dst1);
  2350.     AVER_UB2_UB(res0, inp14, res1, inp15, res0, res1);
  2351.     AVER_UB2_UB(res0, dst0, res1, dst1, res0, res1);
  2352.     ST_UB2(res0, res1, dst, dst_stride);
  2353. }
  2354.  
  2355. static void vert_mc_qpel_avg_dst_8x8_msa(const uint8_t *src,
  2356.                                          int32_t src_stride,
  2357.                                          uint8_t *dst,
  2358.                                          int32_t dst_stride)
  2359. {
  2360.     v16u8 inp0, inp1, inp2, inp3, inp4, inp5, inp6, inp7, inp8;
  2361.     v16u8 dst0, dst1, dst2, dst3;
  2362.     v16u8 res0, res1;
  2363.     v16u8 const20 = (v16u8) __msa_ldi_b(20);
  2364.     v16u8 const6 = (v16u8) __msa_ldi_b(6);
  2365.     v16u8 const3 = (v16u8) __msa_ldi_b(3);
  2366.  
  2367.     LD_UB4(src, src_stride, inp0, inp1, inp2, inp3);
  2368.     src += (4 * src_stride);
  2369.     LD_UB2(src, src_stride, inp4, inp5);
  2370.     src += (2 * src_stride);
  2371.     res0 = APPLY_VERT_QPEL_FILTER_8BYTE(inp0, inp0, inp1, inp2,
  2372.                                         inp1, inp2, inp3, inp4,
  2373.                                         inp1, inp0, inp0, inp1,
  2374.                                         inp2, inp3, inp4, inp5,
  2375.                                         const20, const6, const3);
  2376.     LD_UB2(src, src_stride, inp6, inp7);
  2377.     src += (2 * src_stride);
  2378.     res1 = APPLY_VERT_QPEL_FILTER_8BYTE(inp2, inp1, inp0, inp0,
  2379.                                         inp3, inp4, inp5, inp6,
  2380.                                         inp3, inp2, inp1, inp0,
  2381.                                         inp4, inp5, inp6, inp7,
  2382.                                         const20, const6, const3);
  2383.     LD_UB4(dst, dst_stride, dst0, dst1, dst2, dst3);
  2384.     dst0 = (v16u8) __msa_insve_d((v2i64) dst0, 1, (v2i64) dst1);
  2385.     dst2 = (v16u8) __msa_insve_d((v2i64) dst2, 1, (v2i64) dst3);
  2386.     AVER_UB2_UB(dst0, res0, dst2, res1, res0, res1);
  2387.     ST8x4_UB(res0, res1, dst, dst_stride);
  2388.     dst += (4 * dst_stride);
  2389.  
  2390.     inp8 = LD_UB(src);
  2391.     res0 = APPLY_VERT_QPEL_FILTER_8BYTE(inp4, inp3, inp2, inp1,
  2392.                                         inp5, inp6, inp7, inp8,
  2393.                                         inp5, inp4, inp3, inp2,
  2394.                                         inp6, inp7, inp8, inp8,
  2395.                                         const20, const6, const3);
  2396.     res1 = APPLY_VERT_QPEL_FILTER_8BYTE(inp6, inp5, inp4, inp3,
  2397.                                         inp7, inp8, inp8, inp7,
  2398.                                         inp7, inp6, inp5, inp4,
  2399.                                         inp8, inp8, inp7, inp6,
  2400.                                         const20, const6, const3);
  2401.     LD_UB4(dst, dst_stride, dst0, dst1, dst2, dst3);
  2402.     dst0 = (v16u8) __msa_insve_d((v2i64) dst0, 1, (v2i64) dst1);
  2403.     dst2 = (v16u8) __msa_insve_d((v2i64) dst2, 1, (v2i64) dst3);
  2404.     AVER_UB2_UB(dst0, res0, dst2, res1, res0, res1);
  2405.     ST8x4_UB(res0, res1, dst, dst_stride);
  2406.     dst += (4 * dst_stride);
  2407. }
  2408.  
  2409. static void vert_mc_qpel_avg_dst_16x16_msa(const uint8_t *src,
  2410.                                            int32_t src_stride,
  2411.                                            uint8_t *dst,
  2412.                                            int32_t dst_stride)
  2413. {
  2414.     v16u8 inp0, inp1, inp2, inp3, inp4, inp5, inp6, inp7, inp8;
  2415.     v16u8 inp9, inp10, inp11, inp12, inp13, inp14, inp15, inp16;
  2416.     v16u8 res0, res1, dst0, dst1;
  2417.     v16u8 const20 = (v16u8) __msa_ldi_b(20);
  2418.     v16u8 const6 = (v16u8) __msa_ldi_b(6);
  2419.     v16u8 const3 = (v16u8) __msa_ldi_b(3);
  2420.  
  2421.     LD_UB5(src, src_stride, inp0, inp1, inp2, inp3, inp4);
  2422.     src += (5 * src_stride);
  2423.     res0 = APPLY_VERT_QPEL_FILTER(inp0, inp0, inp1, inp2,
  2424.                                   inp1, inp2, inp3, inp4,
  2425.                                   const20, const6, const3);
  2426.     inp5 = LD_UB(src);
  2427.     src += src_stride;
  2428.     res1 = APPLY_VERT_QPEL_FILTER(inp1, inp0, inp0, inp1,
  2429.                                   inp2, inp3, inp4, inp5,
  2430.                                   const20, const6, const3);
  2431.     LD_UB2(dst, dst_stride, dst0, dst1);
  2432.     AVER_UB2_UB(res0, dst0, res1, dst1, res0, res1);
  2433.     ST_UB2(res0, res1, dst, dst_stride);
  2434.     dst += (2 * dst_stride);
  2435.  
  2436.     inp6 = LD_UB(src);
  2437.     src += src_stride;
  2438.     res0 = APPLY_VERT_QPEL_FILTER(inp2, inp1, inp0, inp0,
  2439.                                   inp3, inp4, inp5, inp6,
  2440.                                   const20, const6, const3);
  2441.     inp7 = LD_UB(src);
  2442.     src += src_stride;
  2443.     res1 = APPLY_VERT_QPEL_FILTER(inp3, inp2, inp1, inp0,
  2444.                                   inp4, inp5, inp6, inp7,
  2445.                                   const20, const6, const3);
  2446.     LD_UB2(dst, dst_stride, dst0, dst1);
  2447.     AVER_UB2_UB(res0, dst0, res1, dst1, res0, res1);
  2448.     ST_UB2(res0, res1, dst, dst_stride);
  2449.     dst += (2 * dst_stride);
  2450.  
  2451.     inp8 = LD_UB(src);
  2452.     src += src_stride;
  2453.     res0 = APPLY_VERT_QPEL_FILTER(inp4, inp3, inp2, inp1,
  2454.                                   inp5, inp6, inp7, inp8,
  2455.                                   const20, const6, const3);
  2456.     inp9 = LD_UB(src);
  2457.     src += src_stride;
  2458.     res1 = APPLY_VERT_QPEL_FILTER(inp5, inp4, inp3, inp2,
  2459.                                   inp6, inp7, inp8, inp9,
  2460.                                   const20, const6, const3);
  2461.     LD_UB2(dst, dst_stride, dst0, dst1);
  2462.     AVER_UB2_UB(res0, dst0, res1, dst1, res0, res1);
  2463.     ST_UB2(res0, res1, dst, dst_stride);
  2464.     dst += (2 * dst_stride);
  2465.  
  2466.     inp10 = LD_UB(src);
  2467.     src += src_stride;
  2468.     res0 = APPLY_VERT_QPEL_FILTER(inp6, inp5, inp4, inp3,
  2469.                                   inp7, inp8, inp9, inp10,
  2470.                                   const20, const6, const3);
  2471.     inp11 = LD_UB(src);
  2472.     src += src_stride;
  2473.     res1 = APPLY_VERT_QPEL_FILTER(inp7, inp6, inp5, inp4,
  2474.                                   inp8, inp9, inp10, inp11,
  2475.                                   const20, const6, const3);
  2476.     LD_UB2(dst, dst_stride, dst0, dst1);
  2477.     AVER_UB2_UB(res0, dst0, res1, dst1, res0, res1);
  2478.     ST_UB2(res0, res1, dst, dst_stride);
  2479.     dst += (2 * dst_stride);
  2480.  
  2481.     inp12 = LD_UB(src);
  2482.     src += src_stride;
  2483.     res0 = APPLY_VERT_QPEL_FILTER(inp8, inp7, inp6, inp5,
  2484.                                   inp9, inp10, inp11, inp12,
  2485.                                   const20, const6, const3);
  2486.     inp13 = LD_UB(src);
  2487.     src += src_stride;
  2488.     res1 = APPLY_VERT_QPEL_FILTER(inp9, inp8, inp7, inp6,
  2489.                                   inp10, inp11, inp12, inp13,
  2490.                                   const20, const6, const3);
  2491.     LD_UB2(dst, dst_stride, dst0, dst1);
  2492.     AVER_UB2_UB(res0, dst0, res1, dst1, res0, res1);
  2493.     ST_UB2(res0, res1, dst, dst_stride);
  2494.     dst += (2 * dst_stride);
  2495.  
  2496.     inp14 = LD_UB(src);
  2497.     src += src_stride;
  2498.     res0 = APPLY_VERT_QPEL_FILTER(inp10, inp9, inp8, inp7,
  2499.                                   inp11, inp12, inp13, inp14,
  2500.                                   const20, const6, const3);
  2501.     inp15 = LD_UB(src);
  2502.     src += src_stride;
  2503.     res1 = APPLY_VERT_QPEL_FILTER(inp11, inp10, inp9, inp8,
  2504.                                   inp12, inp13, inp14, inp15,
  2505.                                   const20, const6, const3);
  2506.     LD_UB2(dst, dst_stride, dst0, dst1);
  2507.     AVER_UB2_UB(res0, dst0, res1, dst1, res0, res1);
  2508.     ST_UB2(res0, res1, dst, dst_stride);
  2509.     dst += (2 * dst_stride);
  2510.  
  2511.     inp16 = LD_UB(src);
  2512.     res0 = APPLY_VERT_QPEL_FILTER(inp12, inp11, inp10, inp9,
  2513.                                   inp13, inp14, inp15, inp16,
  2514.                                   const20, const6, const3);
  2515.     res1 = APPLY_VERT_QPEL_FILTER(inp13, inp12, inp11, inp10,
  2516.                                   inp14, inp15, inp16, inp16,
  2517.                                   const20, const6, const3);
  2518.     LD_UB2(dst, dst_stride, dst0, dst1);
  2519.     AVER_UB2_UB(res0, dst0, res1, dst1, res0, res1);
  2520.     ST_UB2(res0, res1, dst, dst_stride);
  2521.     dst += (2 * dst_stride);
  2522.  
  2523.     res0 = APPLY_VERT_QPEL_FILTER(inp14, inp13, inp12, inp11,
  2524.                                   inp15, inp16, inp16, inp15,
  2525.                                   const20, const6, const3);
  2526.     res1 = APPLY_VERT_QPEL_FILTER(inp15, inp14, inp13, inp12,
  2527.                                   inp16, inp16, inp15, inp14,
  2528.                                   const20, const6, const3);
  2529.     LD_UB2(dst, dst_stride, dst0, dst1);
  2530.     AVER_UB2_UB(res0, dst0, res1, dst1, res0, res1);
  2531.     ST_UB2(res0, res1, dst, dst_stride);
  2532. }
  2533.  
  2534. static void vert_mc_qpel_avg_dst_aver_src1_8x8_msa(const uint8_t *src,
  2535.                                                    int32_t src_stride,
  2536.                                                    uint8_t *dst,
  2537.                                                    int32_t dst_stride)
  2538. {
  2539.     v16u8 inp0, inp1, inp2, inp3, inp4, inp5, inp6, inp7, inp8;
  2540.     v16u8 dst0, dst1, dst2, dst3;
  2541.     v16u8 tmp0, tmp1, res0, res1;
  2542.     v16u8 const20 = (v16u8) __msa_ldi_b(20);
  2543.     v16u8 const6 = (v16u8) __msa_ldi_b(6);
  2544.     v16u8 const3 = (v16u8) __msa_ldi_b(3);
  2545.  
  2546.     LD_UB4(src, src_stride, inp0, inp1, inp2, inp3);
  2547.     src += (4 * src_stride);
  2548.     LD_UB2(src, src_stride, inp4, inp5);
  2549.     src += (2 * src_stride);
  2550.     res0 = APPLY_VERT_QPEL_FILTER_8BYTE(inp0, inp0, inp1, inp2,
  2551.                                         inp1, inp2, inp3, inp4,
  2552.                                         inp1, inp0, inp0, inp1,
  2553.                                         inp2, inp3, inp4, inp5,
  2554.                                         const20, const6, const3);
  2555.     LD_UB2(src, src_stride, inp6, inp7);
  2556.     src += (2 * src_stride);
  2557.     res1 = APPLY_VERT_QPEL_FILTER_8BYTE(inp2, inp1, inp0, inp0,
  2558.                                         inp3, inp4, inp5, inp6,
  2559.                                         inp3, inp2, inp1, inp0,
  2560.                                         inp4, inp5, inp6, inp7,
  2561.                                         const20, const6, const3);
  2562.     LD_UB4(dst, dst_stride, dst0, dst1, dst2, dst3);
  2563.     tmp0 = (v16u8) __msa_insve_d((v2i64) inp1, 1, (v2i64) inp2);
  2564.     tmp1 = (v16u8) __msa_insve_d((v2i64) inp3, 1, (v2i64) inp4);
  2565.     dst0 = (v16u8) __msa_insve_d((v2i64) dst0, 1, (v2i64) dst1);
  2566.     dst2 = (v16u8) __msa_insve_d((v2i64) dst2, 1, (v2i64) dst3);
  2567.     AVER_UB2_UB(res0, tmp0, res1, tmp1, res0, res1);
  2568.     AVER_UB2_UB(dst0, res0, dst2, res1, res0, res1);
  2569.     ST8x4_UB(res0, res1, dst, dst_stride);
  2570.     dst += (4 * dst_stride);
  2571.  
  2572.     inp8 = LD_UB(src);
  2573.     res0 = APPLY_VERT_QPEL_FILTER_8BYTE(inp4, inp3, inp2, inp1,
  2574.                                         inp5, inp6, inp7, inp8,
  2575.                                         inp5, inp4, inp3, inp2,
  2576.                                         inp6, inp7, inp8, inp8,
  2577.                                         const20, const6, const3);
  2578.     res1 = APPLY_VERT_QPEL_FILTER_8BYTE(inp6, inp5, inp4, inp3,
  2579.                                         inp7, inp8, inp8, inp7,
  2580.                                         inp7, inp6, inp5, inp4,
  2581.                                         inp8, inp8, inp7, inp6,
  2582.                                         const20, const6, const3);
  2583.     LD_UB4(dst, dst_stride, dst0, dst1, dst2, dst3);
  2584.     tmp0 = (v16u8) __msa_insve_d((v2i64) inp5, 1, (v2i64) inp6);
  2585.     tmp1 = (v16u8) __msa_insve_d((v2i64) inp7, 1, (v2i64) inp8);
  2586.     dst0 = (v16u8) __msa_insve_d((v2i64) dst0, 1, (v2i64) dst1);
  2587.     dst2 = (v16u8) __msa_insve_d((v2i64) dst2, 1, (v2i64) dst3);
  2588.     AVER_UB2_UB(res0, tmp0, res1, tmp1, res0, res1);
  2589.     AVER_UB2_UB(dst0, res0, dst2, res1, res0, res1);
  2590.     ST8x4_UB(res0, res1, dst, dst_stride);
  2591. }
  2592.  
  2593. static void vert_mc_qpel_avg_dst_aver_src1_16x16_msa(const uint8_t *src,
  2594.                                                      int32_t src_stride,
  2595.                                                      uint8_t *dst,
  2596.                                                      int32_t dst_stride)
  2597. {
  2598.     v16u8 inp0, inp1, inp2, inp3, inp4, inp5, inp6, inp7, inp8;
  2599.     v16u8 inp9, inp10, inp11, inp12, inp13, inp14, inp15, inp16;
  2600.     v16u8 res0, res1, dst0, dst1;
  2601.     v16u8 const20 = (v16u8) __msa_ldi_b(20);
  2602.     v16u8 const6 = (v16u8) __msa_ldi_b(6);
  2603.     v16u8 const3 = (v16u8) __msa_ldi_b(3);
  2604.  
  2605.     LD_UB5(src, src_stride, inp0, inp1, inp2, inp3, inp4);
  2606.     src += (5 * src_stride);
  2607.     res0 = APPLY_VERT_QPEL_FILTER(inp0, inp0, inp1, inp2,
  2608.                                   inp1, inp2, inp3, inp4,
  2609.                                   const20, const6, const3);
  2610.     inp5 = LD_UB(src);
  2611.     src += src_stride;
  2612.     res1 = APPLY_VERT_QPEL_FILTER(inp1, inp0, inp0, inp1,
  2613.                                   inp2, inp3, inp4, inp5,
  2614.                                   const20, const6, const3);
  2615.     LD_UB2(dst, dst_stride, dst0, dst1);
  2616.     AVER_UB2_UB(res0, inp1, res1, inp2, res0, res1);
  2617.     AVER_UB2_UB(res0, dst0, res1, dst1, res0, res1);
  2618.     ST_UB2(res0, res1, dst, dst_stride);
  2619.     dst += (2 * dst_stride);
  2620.  
  2621.     inp6 = LD_UB(src);
  2622.     src += src_stride;
  2623.     res0 = APPLY_VERT_QPEL_FILTER(inp2, inp1, inp0, inp0,
  2624.                                   inp3, inp4, inp5, inp6,
  2625.                                   const20, const6, const3);
  2626.     inp7 = LD_UB(src);
  2627.     src += src_stride;
  2628.     res1 = APPLY_VERT_QPEL_FILTER(inp3, inp2, inp1, inp0,
  2629.                                   inp4, inp5, inp6, inp7,
  2630.                                   const20, const6, const3);
  2631.     LD_UB2(dst, dst_stride, dst0, dst1);
  2632.     AVER_UB2_UB(res0, inp3, res1, inp4, res0, res1);
  2633.     AVER_UB2_UB(res0, dst0, res1, dst1, res0, res1);
  2634.     ST_UB2(res0, res1, dst, dst_stride);
  2635.     dst += (2 * dst_stride);
  2636.  
  2637.     inp8 = LD_UB(src);
  2638.     src += src_stride;
  2639.     res0 = APPLY_VERT_QPEL_FILTER(inp4, inp3, inp2, inp1,
  2640.                                   inp5, inp6, inp7, inp8,
  2641.                                   const20, const6, const3);
  2642.     inp9 = LD_UB(src);
  2643.     src += src_stride;
  2644.     res1 = APPLY_VERT_QPEL_FILTER(inp5, inp4, inp3, inp2,
  2645.                                   inp6, inp7, inp8, inp9,
  2646.                                   const20, const6, const3);
  2647.     LD_UB2(dst, dst_stride, dst0, dst1);
  2648.     AVER_UB2_UB(res0, inp5, res1, inp6, res0, res1);
  2649.     AVER_UB2_UB(res0, dst0, res1, dst1, res0, res1);
  2650.     ST_UB2(res0, res1, dst, dst_stride);
  2651.     dst += (2 * dst_stride);
  2652.  
  2653.     inp10 = LD_UB(src);
  2654.     src += src_stride;
  2655.     res0 = APPLY_VERT_QPEL_FILTER(inp6, inp5, inp4, inp3,
  2656.                                   inp7, inp8, inp9, inp10,
  2657.                                   const20, const6, const3);
  2658.     inp11 = LD_UB(src);
  2659.     src += src_stride;
  2660.     res1 = APPLY_VERT_QPEL_FILTER(inp7, inp6, inp5, inp4,
  2661.                                   inp8, inp9, inp10, inp11,
  2662.                                   const20, const6, const3);
  2663.     LD_UB2(dst, dst_stride, dst0, dst1);
  2664.     AVER_UB2_UB(res0, inp7, res1, inp8, res0, res1);
  2665.     AVER_UB2_UB(res0, dst0, res1, dst1, res0, res1);
  2666.     ST_UB2(res0, res1, dst, dst_stride);
  2667.     dst += (2 * dst_stride);
  2668.  
  2669.     inp12 = LD_UB(src);
  2670.     src += src_stride;
  2671.     res0 = APPLY_VERT_QPEL_FILTER(inp8, inp7, inp6, inp5,
  2672.                                   inp9, inp10, inp11, inp12,
  2673.                                   const20, const6, const3);
  2674.     inp13 = LD_UB(src);
  2675.     src += src_stride;
  2676.     res1 = APPLY_VERT_QPEL_FILTER(inp9, inp8, inp7, inp6,
  2677.                                   inp10, inp11, inp12, inp13,
  2678.                                   const20, const6, const3);
  2679.     LD_UB2(dst, dst_stride, dst0, dst1);
  2680.     AVER_UB2_UB(res0, inp9, res1, inp10, res0, res1);
  2681.     AVER_UB2_UB(res0, dst0, res1, dst1, res0, res1);
  2682.     ST_UB2(res0, res1, dst, dst_stride);
  2683.     dst += (2 * dst_stride);
  2684.  
  2685.     inp14 = LD_UB(src);
  2686.     src += src_stride;
  2687.     res0 = APPLY_VERT_QPEL_FILTER(inp10, inp9, inp8, inp7,
  2688.                                   inp11, inp12, inp13, inp14,
  2689.                                   const20, const6, const3);
  2690.     inp15 = LD_UB(src);
  2691.     src += src_stride;
  2692.     res1 = APPLY_VERT_QPEL_FILTER(inp11, inp10, inp9, inp8,
  2693.                                   inp12, inp13, inp14, inp15,
  2694.                                   const20, const6, const3);
  2695.     LD_UB2(dst, dst_stride, dst0, dst1);
  2696.     AVER_UB2_UB(res0, inp11, res1, inp12, res0, res1);
  2697.     AVER_UB2_UB(res0, dst0, res1, dst1, res0, res1);
  2698.     ST_UB2(res0, res1, dst, dst_stride);
  2699.     dst += (2 * dst_stride);
  2700.  
  2701.     inp16 = LD_UB(src);
  2702.     res0 = APPLY_VERT_QPEL_FILTER(inp12, inp11, inp10, inp9,
  2703.                                   inp13, inp14, inp15, inp16,
  2704.                                   const20, const6, const3);
  2705.     res1 = APPLY_VERT_QPEL_FILTER(inp13, inp12, inp11, inp10,
  2706.                                   inp14, inp15, inp16, inp16,
  2707.                                   const20, const6, const3);
  2708.     LD_UB2(dst, dst_stride, dst0, dst1);
  2709.     AVER_UB2_UB(res0, inp13, res1, inp14, res0, res1);
  2710.     AVER_UB2_UB(res0, dst0, res1, dst1, res0, res1);
  2711.     ST_UB2(res0, res1, dst, dst_stride);
  2712.     dst += (2 * dst_stride);
  2713.  
  2714.     res0 = APPLY_VERT_QPEL_FILTER(inp14, inp13, inp12, inp11,
  2715.                                   inp15, inp16, inp16, inp15,
  2716.                                   const20, const6, const3);
  2717.     res1 = APPLY_VERT_QPEL_FILTER(inp15, inp14, inp13, inp12,
  2718.                                   inp16, inp16, inp15, inp14,
  2719.                                   const20, const6, const3);
  2720.     LD_UB2(dst, dst_stride, dst0, dst1);
  2721.     AVER_UB2_UB(res0, inp15, res1, inp16, res0, res1);
  2722.     AVER_UB2_UB(res0, dst0, res1, dst1, res0, res1);
  2723.     ST_UB2(res0, res1, dst, dst_stride);
  2724. }
  2725.  
  2726. static void hv_mc_qpel_no_rnd_horiz_src0_16x16_msa(const uint8_t *src,
  2727.                                                    int32_t src_stride,
  2728.                                                    uint8_t *dst,
  2729.                                                    int32_t dst_stride,
  2730.                                                    int32_t height)
  2731. {
  2732.     uint8_t loop_count;
  2733.     v16u8 inp0, inp1, inp2, inp3, inp4, inp5, inp6, inp7;
  2734.     v16u8 res;
  2735.     v16u8 mask = { 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
  2736.     v16u8 const6 = (v16u8) __msa_ldi_b(6);
  2737.     v16u8 const3 = (v16u8) __msa_ldi_b(3);
  2738.     v8u16 const20 = (v8u16) __msa_ldi_h(20);
  2739.  
  2740.     for (loop_count = (height >> 2); loop_count--;) {
  2741.         LD_UB4(src, src_stride, inp0, inp2, inp4, inp6);
  2742.         LD_UB4((src + 1), src_stride, inp1, inp3, inp5, inp7);
  2743.         src += (4 * src_stride);
  2744.         res = APPLY_HORIZ_QPEL_NO_ROUND_FILTER(inp0, inp1, mask,
  2745.                                                const20, const6, const3);
  2746.         res = __msa_ave_u_b(inp0, res);
  2747.         ST_UB(res, dst);
  2748.         dst += dst_stride;
  2749.  
  2750.         res = APPLY_HORIZ_QPEL_NO_ROUND_FILTER(inp2, inp3, mask,
  2751.                                                const20, const6, const3);
  2752.         res = __msa_ave_u_b(inp2, res);
  2753.         ST_UB(res, dst);
  2754.         dst += dst_stride;
  2755.  
  2756.         res = APPLY_HORIZ_QPEL_NO_ROUND_FILTER(inp4, inp5, mask,
  2757.                                                const20, const6, const3);
  2758.         res = __msa_ave_u_b(inp4, res);
  2759.         ST_UB(res, dst);
  2760.         dst += dst_stride;
  2761.  
  2762.         res = APPLY_HORIZ_QPEL_NO_ROUND_FILTER(inp6, inp7, mask,
  2763.                                                const20, const6, const3);
  2764.         res = __msa_ave_u_b(inp6, res);
  2765.         ST_UB(res, dst);
  2766.         dst += dst_stride;
  2767.     }
  2768.  
  2769.     LD_UB2(src, 1, inp0, inp1);
  2770.     res = APPLY_HORIZ_QPEL_NO_ROUND_FILTER(inp0, inp1, mask,
  2771.                                            const20, const6, const3);
  2772.     res = __msa_ave_u_b(inp0, res);
  2773.     ST_UB(res, dst);
  2774. }
  2775.  
  2776. static void hv_mc_qpel_no_rnd_aver_hv_src00_16x16_msa(const uint8_t *src,
  2777.                                                       int32_t src_stride,
  2778.                                                       uint8_t *dst,
  2779.                                                       int32_t dst_stride)
  2780. {
  2781.     uint8_t buff[272];
  2782.  
  2783.     hv_mc_qpel_no_rnd_horiz_src0_16x16_msa(src, src_stride, buff, 16, 16);
  2784.     vert_mc_qpel_no_rnd_aver_src0_16x16_msa(buff, 16, dst, dst_stride);
  2785. }
  2786.  
  2787. static void hv_mc_qpel_no_rnd_aver_hv_src00_8x8_msa(const uint8_t *src,
  2788.                                                     int32_t src_stride,
  2789.                                                     uint8_t *dst,
  2790.                                                     int32_t dst_stride)
  2791. {
  2792.     v16u8 inp0, inp1, inp2, inp3;
  2793.     v16u8 res0, res1, avg0, avg1;
  2794.     v16u8 horiz0, horiz1, horiz2, horiz3;
  2795.     v16u8 horiz4, horiz5, horiz6, horiz7, horiz8;
  2796.     v16u8 mask0 = { 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8 };
  2797.     v16u8 mask1 = { 0, 2, 0, 3, 1, 4, 2, 5, 3, 6, 4, 7, 5, 8, 6, 8 };
  2798.     v16u8 mask2 = { 1, 3, 0, 4, 0, 5, 1, 6, 2, 7, 3, 8, 4, 8, 5, 7 };
  2799.     v16u8 mask3 = { 2, 4, 1, 5, 0, 6, 0, 7, 1, 8, 2, 8, 3, 7, 4, 6 };
  2800.     v16u8 const20 = (v16u8) __msa_ldi_b(20);
  2801.     v16u8 const6 = (v16u8) __msa_ldi_b(6);
  2802.     v16u8 const3 = (v16u8) __msa_ldi_b(3);
  2803.  
  2804.     LD_UB2(src, src_stride, inp0, inp1);
  2805.     src += (2 * src_stride);
  2806.     res0 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp0, inp1, mask0, mask1,
  2807.                                                   mask2, mask3, const20,
  2808.                                                   const6, const3);
  2809.     inp0 = (v16u8) __msa_ilvr_d((v2i64) inp1, (v2i64) inp0);
  2810.     horiz0 = __msa_ave_u_b(inp0, res0);
  2811.     horiz1 = (v16u8) __msa_splati_d((v2i64) horiz0, 1);
  2812.     LD_UB2(src, src_stride, inp2, inp3);
  2813.     src += (2 * src_stride);
  2814.     res1 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp2, inp3, mask0, mask1,
  2815.                                                   mask2, mask3, const20,
  2816.                                                   const6, const3);
  2817.     inp2 = (v16u8) __msa_ilvr_d((v2i64) inp3, (v2i64) inp2);
  2818.     horiz2 = __msa_ave_u_b(inp2, res1);
  2819.     horiz3 = (v16u8) __msa_splati_d((v2i64) horiz2, 1);
  2820.     LD_UB2(src, src_stride, inp0, inp1);
  2821.     src += (2 * src_stride);
  2822.     res0 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp0, inp1, mask0, mask1,
  2823.                                                   mask2, mask3, const20,
  2824.                                                   const6, const3);
  2825.     inp0 = (v16u8) __msa_ilvr_d((v2i64) inp1, (v2i64) inp0);
  2826.     horiz4 = __msa_ave_u_b(inp0, res0);
  2827.     horiz5 = (v16u8) __msa_splati_d((v2i64) horiz4, 1);
  2828.     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER_8BYTE(horiz0, horiz0, horiz1, horiz2,
  2829.                                                  horiz1, horiz2, horiz3, horiz4,
  2830.                                                  horiz1, horiz0, horiz0, horiz1,
  2831.                                                  horiz2, horiz3, horiz4, horiz5,
  2832.                                                  const20, const6, const3);
  2833.     avg0 = (v16u8) __msa_ilvr_d((v2i64) horiz1, (v2i64) horiz0);
  2834.     res0 = __msa_ave_u_b(avg0, res0);
  2835.     ST8x2_UB(res0, dst, dst_stride);
  2836.     dst += (2 * dst_stride);
  2837.  
  2838.     LD_UB2(src, src_stride, inp2, inp3);
  2839.     src += (2 * src_stride);
  2840.     res1 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp2, inp3, mask0, mask1,
  2841.                                                   mask2, mask3, const20,
  2842.                                                   const6, const3);
  2843.     inp2 = (v16u8) __msa_ilvr_d((v2i64) inp3, (v2i64) inp2);
  2844.     horiz6 = __msa_ave_u_b(inp2, res1);
  2845.     horiz7 = (v16u8) __msa_splati_d((v2i64) horiz6, 1);
  2846.     inp0 = LD_UB(src);
  2847.     res0 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE_1ROW(inp0, mask0, mask1,
  2848.                                                        mask2, mask3, const20,
  2849.                                                        const6, const3);
  2850.     horiz8 = __msa_ave_u_b(inp0, res0);
  2851.     res1 = APPLY_VERT_QPEL_NO_ROUND_FILTER_8BYTE(horiz2, horiz1, horiz0, horiz0,
  2852.                                                  horiz3, horiz4, horiz5, horiz6,
  2853.                                                  horiz3, horiz2, horiz1, horiz0,
  2854.                                                  horiz4, horiz5, horiz6, horiz7,
  2855.                                                  const20, const6, const3);
  2856.     avg1 = (v16u8) __msa_ilvr_d((v2i64) horiz3, (v2i64) horiz2);
  2857.     res1 = __msa_ave_u_b(avg1, res1);
  2858.     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER_8BYTE(horiz4, horiz3, horiz2, horiz1,
  2859.                                                  horiz5, horiz6, horiz7, horiz8,
  2860.                                                  horiz5, horiz4, horiz3, horiz2,
  2861.                                                  horiz6, horiz7, horiz8, horiz8,
  2862.                                                  const20, const6, const3);
  2863.     ST8x2_UB(res1, dst, dst_stride);
  2864.     dst += 2 * dst_stride;
  2865.  
  2866.     avg0 = (v16u8) __msa_ilvr_d((v2i64) horiz5, (v2i64) horiz4);
  2867.     res0 = __msa_ave_u_b(avg0, res0);
  2868.     res1 = APPLY_VERT_QPEL_NO_ROUND_FILTER_8BYTE(horiz6, horiz5, horiz4, horiz3,
  2869.                                                  horiz7, horiz8, horiz8, horiz7,
  2870.                                                  horiz7, horiz6, horiz5, horiz4,
  2871.                                                  horiz8, horiz8, horiz7, horiz6,
  2872.                                                  const20, const6, const3);
  2873.     ST8x2_UB(res0, dst, dst_stride);
  2874.     dst += 2 * dst_stride;
  2875.  
  2876.     avg1 = (v16u8) __msa_ilvr_d((v2i64) horiz7, (v2i64) horiz6);
  2877.     res1 = __msa_ave_u_b(avg1, res1);
  2878.     ST8x2_UB(res1, dst, dst_stride);
  2879. }
  2880.  
  2881. static void hv_mc_qpel_no_rnd_horiz_16x16_msa(const uint8_t *src,
  2882.                                               int32_t src_stride,
  2883.                                               uint8_t *dst,
  2884.                                               int32_t dst_stride,
  2885.                                               int32_t height)
  2886. {
  2887.     uint8_t loop_count;
  2888.     v16u8 inp0, inp1, inp2, inp3, inp4, inp5, inp6, inp7;
  2889.     v16u8 res;
  2890.     v16u8 mask = { 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
  2891.     v16u8 const6 = (v16u8) __msa_ldi_b(6);
  2892.     v16u8 const3 = (v16u8) __msa_ldi_b(3);
  2893.     v8u16 const20 = (v8u16) __msa_ldi_h(20);
  2894.  
  2895.     for (loop_count = (height >> 2); loop_count--;) {
  2896.         LD_UB4(src, src_stride, inp0, inp2, inp4, inp6);
  2897.         LD_UB4((src + 1), src_stride, inp1, inp3, inp5, inp7);
  2898.         src += (4 * src_stride);
  2899.         res = APPLY_HORIZ_QPEL_NO_ROUND_FILTER(inp0, inp1, mask,
  2900.                                                const20, const6, const3);
  2901.         ST_UB(res, dst);
  2902.         dst += dst_stride;
  2903.  
  2904.         res = APPLY_HORIZ_QPEL_NO_ROUND_FILTER(inp2, inp3, mask,
  2905.                                                const20, const6, const3);
  2906.         ST_UB(res, dst);
  2907.         dst += dst_stride;
  2908.  
  2909.         res = APPLY_HORIZ_QPEL_NO_ROUND_FILTER(inp4, inp5, mask,
  2910.                                                const20, const6, const3);
  2911.         ST_UB(res, dst);
  2912.         dst += dst_stride;
  2913.  
  2914.         res = APPLY_HORIZ_QPEL_NO_ROUND_FILTER(inp6, inp7, mask,
  2915.                                                const20, const6, const3);
  2916.         ST_UB(res, dst);
  2917.         dst += dst_stride;
  2918.     }
  2919.  
  2920.     LD_UB2(src, 1, inp0, inp1);
  2921.     res = APPLY_HORIZ_QPEL_NO_ROUND_FILTER(inp0, inp1, mask,
  2922.                                            const20, const6, const3);
  2923.     ST_UB(res, dst);
  2924. }
  2925.  
  2926. static void hv_mc_qpel_no_rnd_aver_v_src0_16x16_msa(const uint8_t *src,
  2927.                                                     int32_t src_stride,
  2928.                                                     uint8_t *dst,
  2929.                                                     int32_t dst_stride)
  2930. {
  2931.     uint8_t buff[272];
  2932.  
  2933.     hv_mc_qpel_no_rnd_horiz_16x16_msa(src, src_stride, buff, 16, 16);
  2934.     vert_mc_qpel_no_rnd_aver_src0_16x16_msa(buff, 16, dst, dst_stride);
  2935. }
  2936.  
  2937. static void hv_mc_qpel_no_rnd_aver_v_src0_8x8_msa(const uint8_t *src,
  2938.                                                   int32_t src_stride,
  2939.                                                   uint8_t *dst,
  2940.                                                   int32_t dst_stride)
  2941. {
  2942.     v16u8 inp0, inp1, inp2, inp3;
  2943.     v16u8 res0, res1, avg0, avg1;
  2944.     v16u8 horiz0, horiz1, horiz2, horiz3;
  2945.     v16u8 horiz4, horiz5, horiz6, horiz7, horiz8;
  2946.     v16u8 mask0 = { 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8 };
  2947.     v16u8 mask1 = { 0, 2, 0, 3, 1, 4, 2, 5, 3, 6, 4, 7, 5, 8, 6, 8 };
  2948.     v16u8 mask2 = { 1, 3, 0, 4, 0, 5, 1, 6, 2, 7, 3, 8, 4, 8, 5, 7 };
  2949.     v16u8 mask3 = { 2, 4, 1, 5, 0, 6, 0, 7, 1, 8, 2, 8, 3, 7, 4, 6 };
  2950.     v16u8 const20 = (v16u8) __msa_ldi_b(20);
  2951.     v16u8 const6 = (v16u8) __msa_ldi_b(6);
  2952.     v16u8 const3 = (v16u8) __msa_ldi_b(3);
  2953.  
  2954.     LD_UB2(src, src_stride, inp0, inp1);
  2955.     src += (2 * src_stride);
  2956.     horiz0 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp0, inp1, mask0, mask1,
  2957.                                                     mask2, mask3, const20,
  2958.                                                     const6, const3);
  2959.     horiz1 = (v16u8) __msa_splati_d((v2i64) horiz0, 1);
  2960.  
  2961.     LD_UB2(src, src_stride, inp2, inp3);
  2962.     src += (2 * src_stride);
  2963.     horiz2 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp2, inp3, mask0, mask1,
  2964.                                                     mask2, mask3, const20,
  2965.                                                     const6, const3);
  2966.     horiz3 = (v16u8) __msa_splati_d((v2i64) horiz2, 1);
  2967.     LD_UB2(src, src_stride, inp0, inp1);
  2968.     src += (2 * src_stride);
  2969.     horiz4 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp0, inp1, mask0, mask1,
  2970.                                                     mask2, mask3, const20,
  2971.                                                     const6, const3);
  2972.     horiz5 = (v16u8) __msa_splati_d((v2i64) horiz4, 1);
  2973.     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER_8BYTE(horiz0, horiz0, horiz1, horiz2,
  2974.                                                  horiz1, horiz2, horiz3, horiz4,
  2975.                                                  horiz1, horiz0, horiz0, horiz1,
  2976.                                                  horiz2, horiz3, horiz4, horiz5,
  2977.                                                  const20, const6, const3);
  2978.     avg0 = (v16u8) __msa_ilvr_d((v2i64) horiz1, (v2i64) horiz0);
  2979.     res0 = __msa_ave_u_b(avg0, res0);
  2980.     ST8x2_UB(res0, dst, dst_stride);
  2981.     dst += (2 * dst_stride);
  2982.  
  2983.     LD_UB2(src, src_stride, inp2, inp3);
  2984.     src += (2 * src_stride);
  2985.     horiz6 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp2, inp3, mask0, mask1,
  2986.                                                     mask2, mask3, const20,
  2987.                                                     const6, const3);
  2988.     horiz7 = (v16u8) __msa_splati_d((v2i64) horiz6, 1);
  2989.     inp0 = LD_UB(src);
  2990.     horiz8 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE_1ROW(inp0, mask0, mask1,
  2991.                                                          mask2, mask3, const20,
  2992.                                                          const6, const3);
  2993.     res1 = APPLY_VERT_QPEL_NO_ROUND_FILTER_8BYTE(horiz2, horiz1, horiz0, horiz0,
  2994.                                                  horiz3, horiz4, horiz5, horiz6,
  2995.                                                  horiz3, horiz2, horiz1, horiz0,
  2996.                                                  horiz4, horiz5, horiz6, horiz7,
  2997.                                                  const20, const6, const3);
  2998.     avg1 = (v16u8) __msa_ilvr_d((v2i64) horiz3, (v2i64) horiz2);
  2999.     res1 = __msa_ave_u_b(avg1, res1);
  3000.     avg0 = (v16u8) __msa_ilvr_d((v2i64) horiz1, (v2i64) horiz0);
  3001.     res0 = __msa_ave_u_b(avg0, res0);
  3002.     ST8x2_UB(res1, dst, dst_stride);
  3003.     dst += (2 * dst_stride);
  3004.  
  3005.     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER_8BYTE(horiz4, horiz3, horiz2, horiz1,
  3006.                                                  horiz5, horiz6, horiz7, horiz8,
  3007.                                                  horiz5, horiz4, horiz3, horiz2,
  3008.                                                  horiz6, horiz7, horiz8, horiz8,
  3009.                                                  const20, const6, const3);
  3010.     avg0 = (v16u8) __msa_ilvr_d((v2i64) horiz5, (v2i64) horiz4);
  3011.     res0 = __msa_ave_u_b(avg0, res0);
  3012.     ST8x2_UB(res0, dst, dst_stride);
  3013.     dst += (2 * dst_stride);
  3014.  
  3015.     res1 = APPLY_VERT_QPEL_NO_ROUND_FILTER_8BYTE(horiz6, horiz5, horiz4, horiz3,
  3016.                                                  horiz7, horiz8, horiz8, horiz7,
  3017.                                                  horiz7, horiz6, horiz5, horiz4,
  3018.                                                  horiz8, horiz8, horiz7, horiz6,
  3019.                                                  const20, const6, const3);
  3020.     avg1 = (v16u8) __msa_ilvr_d((v2i64) horiz7, (v2i64) horiz6);
  3021.     res1 = __msa_ave_u_b(avg1, res1);
  3022.     ST8x2_UB(res1, dst, dst_stride);
  3023. }
  3024.  
  3025. static void hv_mc_qpel_no_rnd_horiz_src1_16x16_msa(const uint8_t *src,
  3026.                                                    int32_t src_stride,
  3027.                                                    uint8_t *dst,
  3028.                                                    int32_t dst_stride,
  3029.                                                    int32_t height)
  3030. {
  3031.     uint8_t loop_count;
  3032.     v16u8 inp0, inp1, inp2, inp3, inp4, inp5, inp6, inp7;
  3033.     v16u8 res;
  3034.     v16u8 mask = { 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
  3035.     v16u8 const6 = (v16u8) __msa_ldi_b(6);
  3036.     v16u8 const3 = (v16u8) __msa_ldi_b(3);
  3037.     v8u16 const20 = (v8u16) __msa_ldi_h(20);
  3038.  
  3039.     for (loop_count = (height >> 2); loop_count--;) {
  3040.         LD_UB4(src, src_stride, inp0, inp2, inp4, inp6);
  3041.         LD_UB4((src + 1), src_stride, inp1, inp3, inp5, inp7);
  3042.         src += (4 * src_stride);
  3043.         res = APPLY_HORIZ_QPEL_NO_ROUND_FILTER(inp0, inp1, mask,
  3044.                                                const20, const6, const3);
  3045.         res = __msa_ave_u_b(res, inp1);
  3046.         ST_UB(res, dst);
  3047.         dst += dst_stride;
  3048.  
  3049.         res = APPLY_HORIZ_QPEL_NO_ROUND_FILTER(inp2, inp3, mask,
  3050.                                                const20, const6, const3);
  3051.         res = __msa_ave_u_b(res, inp3);
  3052.         ST_UB(res, dst);
  3053.         dst += dst_stride;
  3054.  
  3055.         res = APPLY_HORIZ_QPEL_NO_ROUND_FILTER(inp4, inp5, mask,
  3056.                                                const20, const6, const3);
  3057.         res = __msa_ave_u_b(res, inp5);
  3058.         ST_UB(res, dst);
  3059.         dst += dst_stride;
  3060.  
  3061.         res = APPLY_HORIZ_QPEL_NO_ROUND_FILTER(inp6, inp7, mask,
  3062.                                                const20, const6, const3);
  3063.         res = __msa_ave_u_b(res, inp7);
  3064.         ST_UB(res, dst);
  3065.         dst += dst_stride;
  3066.     }
  3067.  
  3068.     LD_UB2(src, 1, inp0, inp1);
  3069.     res = APPLY_HORIZ_QPEL_NO_ROUND_FILTER(inp0, inp1, mask,
  3070.                                            const20, const6, const3);
  3071.     res = __msa_ave_u_b(inp1, res);
  3072.     ST_UB(res, dst);
  3073. }
  3074.  
  3075. static void hv_mc_qpel_no_rnd_aver_hv_src10_16x16_msa(const uint8_t *src,
  3076.                                                       int32_t src_stride,
  3077.                                                       uint8_t *dst,
  3078.                                                       int32_t dst_stride)
  3079. {
  3080.     uint8_t buff[272];
  3081.  
  3082.     hv_mc_qpel_no_rnd_horiz_src1_16x16_msa(src, src_stride, buff, 16, 16);
  3083.     vert_mc_qpel_no_rnd_aver_src0_16x16_msa(buff, 16, dst, dst_stride);
  3084. }
  3085.  
  3086. static void hv_mc_qpel_no_rnd_aver_hv_src10_8x8_msa(const uint8_t *src,
  3087.                                                     int32_t src_stride,
  3088.                                                     uint8_t *dst,
  3089.                                                     int32_t dst_stride)
  3090. {
  3091.     v16u8 inp0, inp1, inp2, inp3;
  3092.     v16u8 res0, res1, avg0, avg1;
  3093.     v16u8 horiz0, horiz1, horiz2, horiz3;
  3094.     v16u8 horiz4, horiz5, horiz6, horiz7, horiz8;
  3095.     v16u8 mask0 = { 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8 };
  3096.     v16u8 mask1 = { 0, 2, 0, 3, 1, 4, 2, 5, 3, 6, 4, 7, 5, 8, 6, 8 };
  3097.     v16u8 mask2 = { 1, 3, 0, 4, 0, 5, 1, 6, 2, 7, 3, 8, 4, 8, 5, 7 };
  3098.     v16u8 mask3 = { 2, 4, 1, 5, 0, 6, 0, 7, 1, 8, 2, 8, 3, 7, 4, 6 };
  3099.     v16u8 const20 = (v16u8) __msa_ldi_b(20);
  3100.     v16u8 const6 = (v16u8) __msa_ldi_b(6);
  3101.     v16u8 const3 = (v16u8) __msa_ldi_b(3);
  3102.  
  3103.     LD_UB2(src, src_stride, inp0, inp1);
  3104.     src += (2 * src_stride);
  3105.     res0 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp0, inp1, mask0, mask1,
  3106.                                                   mask2, mask3, const20,
  3107.                                                   const6, const3);
  3108.     SLDI_B2_UB(inp0, inp1, inp0, inp1, inp0, inp1, 1);
  3109.  
  3110.     inp0 = (v16u8) __msa_insve_d((v2i64) inp0, 1, (v2i64) inp1);
  3111.     horiz0 = __msa_ave_u_b(inp0, res0);
  3112.     horiz1 = (v16u8) __msa_splati_d((v2i64) horiz0, 1);
  3113.     LD_UB2(src, src_stride, inp2, inp3);
  3114.     src += (2 * src_stride);
  3115.     res1 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp2, inp3, mask0, mask1,
  3116.                                                   mask2, mask3, const20,
  3117.                                                   const6, const3);
  3118.     SLDI_B2_UB(inp2, inp3, inp2, inp3, inp2, inp3, 1);
  3119.  
  3120.     inp2 = (v16u8) __msa_insve_d((v2i64) inp2, 1, (v2i64) inp3);
  3121.     horiz2 = __msa_ave_u_b(inp2, res1);
  3122.     horiz3 = (v16u8) __msa_splati_d((v2i64) horiz2, 1);
  3123.     LD_UB2(src, src_stride, inp0, inp1);
  3124.     src += (2 * src_stride);
  3125.     res0 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp0, inp1, mask0, mask1,
  3126.                                                   mask2, mask3, const20,
  3127.                                                   const6, const3);
  3128.     SLDI_B2_UB(inp0, inp1, inp0, inp1, inp0, inp1, 1);
  3129.  
  3130.     inp0 = (v16u8) __msa_insve_d((v2i64) inp0, 1, (v2i64) inp1);
  3131.     horiz4 = __msa_ave_u_b(inp0, res0);
  3132.     horiz5 = (v16u8) __msa_splati_d((v2i64) horiz4, 1);
  3133.     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER_8BYTE(horiz0, horiz0, horiz1, horiz2,
  3134.                                                  horiz1, horiz2, horiz3, horiz4,
  3135.                                                  horiz1, horiz0, horiz0, horiz1,
  3136.                                                  horiz2, horiz3, horiz4, horiz5,
  3137.                                                  const20, const6, const3);
  3138.     avg0 = (v16u8) __msa_ilvr_d((v2i64) horiz1, (v2i64) horiz0);
  3139.     res0 = __msa_ave_u_b(avg0, res0);
  3140.     ST8x2_UB(res0, dst, dst_stride);
  3141.     dst += (2 * dst_stride);
  3142.  
  3143.     LD_UB2(src, src_stride, inp2, inp3);
  3144.     src += (2 * src_stride);
  3145.     res1 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp2, inp3, mask0, mask1,
  3146.                                                   mask2, mask3, const20,
  3147.                                                   const6, const3);
  3148.     SLDI_B2_UB(inp2, inp3, inp2, inp3, inp2, inp3, 1);
  3149.  
  3150.     inp2 = (v16u8) __msa_insve_d((v2i64) inp2, 1, (v2i64) inp3);
  3151.     horiz6 = __msa_ave_u_b(inp2, res1);
  3152.     horiz7 = (v16u8) __msa_splati_d((v2i64) horiz6, 1);
  3153.     inp0 = LD_UB(src);
  3154.     res0 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE_1ROW(inp0, mask0, mask1,
  3155.                                                        mask2, mask3, const20,
  3156.                                                        const6, const3);
  3157.     inp0 = (v16u8) __msa_sldi_b((v16i8) inp0, (v16i8) inp0, 1);
  3158.     horiz8 = __msa_ave_u_b(inp0, res0);
  3159.     res1 = APPLY_VERT_QPEL_NO_ROUND_FILTER_8BYTE(horiz2, horiz1, horiz0, horiz0,
  3160.                                                  horiz3, horiz4, horiz5, horiz6,
  3161.                                                  horiz3, horiz2, horiz1, horiz0,
  3162.                                                  horiz4, horiz5, horiz6, horiz7,
  3163.                                                  const20, const6, const3);
  3164.     avg1 = (v16u8) __msa_ilvr_d((v2i64) horiz3, (v2i64) horiz2);
  3165.     res1 = __msa_ave_u_b(avg1, res1);
  3166.     ST8x2_UB(res1, dst, dst_stride);
  3167.     dst += (2 * dst_stride);
  3168.  
  3169.     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER_8BYTE(horiz4, horiz3, horiz2, horiz1,
  3170.                                                  horiz5, horiz6, horiz7, horiz8,
  3171.                                                  horiz5, horiz4, horiz3, horiz2,
  3172.                                                  horiz6, horiz7, horiz8, horiz8,
  3173.                                                  const20, const6, const3);
  3174.     avg0 = (v16u8) __msa_ilvr_d((v2i64) horiz5, (v2i64) horiz4);
  3175.     res0 = __msa_ave_u_b(avg0, res0);
  3176.     ST8x2_UB(res0, dst, dst_stride);
  3177.     dst += (2 * dst_stride);
  3178.  
  3179.     res1 = APPLY_VERT_QPEL_NO_ROUND_FILTER_8BYTE(horiz6, horiz5, horiz4, horiz3,
  3180.                                                  horiz7, horiz8, horiz8, horiz7,
  3181.                                                  horiz7, horiz6, horiz5, horiz4,
  3182.                                                  horiz8, horiz8, horiz7, horiz6,
  3183.                                                  const20, const6, const3);
  3184.     avg1 = (v16u8) __msa_ilvr_d((v2i64) horiz7, (v2i64) horiz6);
  3185.     res1 = __msa_ave_u_b(avg1, res1);
  3186.     ST8x2_UB(res1, dst, dst_stride);
  3187. }
  3188.  
  3189. static void hv_mc_qpel_no_rnd_aver_h_src0_16x16_msa(const uint8_t *src,
  3190.                                                     int32_t src_stride,
  3191.                                                     uint8_t *dst,
  3192.                                                     int32_t dst_stride)
  3193. {
  3194.     uint8_t buff[272];
  3195.  
  3196.     hv_mc_qpel_no_rnd_horiz_src0_16x16_msa(src, src_stride, buff, 16, 16);
  3197.     vert_mc_qpel_no_rnd_16x16_msa(buff, 16, dst, dst_stride);
  3198. }
  3199.  
  3200. static void hv_mc_qpel_no_rnd_aver_h_src0_8x8_msa(const uint8_t *src,
  3201.                                                   int32_t src_stride,
  3202.                                                   uint8_t *dst,
  3203.                                                   int32_t dst_stride)
  3204. {
  3205.     v16u8 inp0, inp1, inp2, inp3;
  3206.     v16u8 res0, res1;
  3207.     v16u8 horiz0, horiz1, horiz2, horiz3;
  3208.     v16u8 horiz4, horiz5, horiz6, horiz7, horiz8;
  3209.     v16u8 mask0 = { 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8 };
  3210.     v16u8 mask1 = { 0, 2, 0, 3, 1, 4, 2, 5, 3, 6, 4, 7, 5, 8, 6, 8 };
  3211.     v16u8 mask2 = { 1, 3, 0, 4, 0, 5, 1, 6, 2, 7, 3, 8, 4, 8, 5, 7 };
  3212.     v16u8 mask3 = { 2, 4, 1, 5, 0, 6, 0, 7, 1, 8, 2, 8, 3, 7, 4, 6 };
  3213.     v16u8 const20 = (v16u8) __msa_ldi_b(20);
  3214.     v16u8 const6 = (v16u8) __msa_ldi_b(6);
  3215.     v16u8 const3 = (v16u8) __msa_ldi_b(3);
  3216.  
  3217.     LD_UB2(src, src_stride, inp0, inp1);
  3218.     src += (2 * src_stride);
  3219.     res0 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp0, inp1, mask0, mask1,
  3220.                                                   mask2, mask3, const20,
  3221.                                                   const6, const3);
  3222.     inp0 = (v16u8) __msa_ilvr_d((v2i64) inp1, (v2i64) inp0);
  3223.     horiz0 = __msa_ave_u_b(inp0, res0);
  3224.     horiz1 = (v16u8) __msa_splati_d((v2i64) horiz0, 1);
  3225.     LD_UB2(src, src_stride, inp2, inp3);
  3226.     src += (2 * src_stride);
  3227.     res1 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp2, inp3, mask0, mask1,
  3228.                                                   mask2, mask3, const20,
  3229.                                                   const6, const3);
  3230.     inp2 = (v16u8) __msa_ilvr_d((v2i64) inp3, (v2i64) inp2);
  3231.     horiz2 = __msa_ave_u_b(inp2, res1);
  3232.     horiz3 = (v16u8) __msa_splati_d((v2i64) horiz2, 1);
  3233.     LD_UB2(src, src_stride, inp0, inp1);
  3234.     src += (2 * src_stride);
  3235.     res0 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp0, inp1, mask0, mask1,
  3236.                                                   mask2, mask3, const20,
  3237.                                                   const6, const3);
  3238.     inp0 = (v16u8) __msa_ilvr_d((v2i64) inp1, (v2i64) inp0);
  3239.     horiz4 = __msa_ave_u_b(inp0, res0);
  3240.     horiz5 = (v16u8) __msa_splati_d((v2i64) horiz4, 1);
  3241.     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER_8BYTE(horiz0, horiz0, horiz1, horiz2,
  3242.                                                  horiz1, horiz2, horiz3, horiz4,
  3243.                                                  horiz1, horiz0, horiz0, horiz1,
  3244.                                                  horiz2, horiz3, horiz4, horiz5,
  3245.                                                  const20, const6, const3);
  3246.  
  3247.     LD_UB2(src, src_stride, inp2, inp3);
  3248.     src += (2 * src_stride);
  3249.     ST8x2_UB(res0, dst, dst_stride);
  3250.     dst += 2 * dst_stride;
  3251.  
  3252.     res1 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp2, inp3, mask0, mask1,
  3253.                                                   mask2, mask3, const20,
  3254.                                                   const6, const3);
  3255.     inp2 = (v16u8) __msa_ilvr_d((v2i64) inp3, (v2i64) inp2);
  3256.     horiz6 = __msa_ave_u_b(inp2, res1);
  3257.     horiz7 = (v16u8) __msa_splati_d((v2i64) horiz6, 1);
  3258.     inp0 = LD_UB(src);
  3259.     res0 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE_1ROW(inp0, mask0, mask1,
  3260.                                                        mask2, mask3, const20,
  3261.                                                        const6, const3);
  3262.     horiz8 = __msa_ave_u_b(inp0, res0);
  3263.     res1 = APPLY_VERT_QPEL_NO_ROUND_FILTER_8BYTE(horiz2, horiz1, horiz0, horiz0,
  3264.                                                  horiz3, horiz4, horiz5, horiz6,
  3265.                                                  horiz3, horiz2, horiz1, horiz0,
  3266.                                                  horiz4, horiz5, horiz6, horiz7,
  3267.                                                  const20, const6, const3);
  3268.     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER_8BYTE(horiz4, horiz3, horiz2, horiz1,
  3269.                                                  horiz5, horiz6, horiz7, horiz8,
  3270.                                                  horiz5, horiz4, horiz3, horiz2,
  3271.                                                  horiz6, horiz7, horiz8, horiz8,
  3272.                                                  const20, const6, const3);
  3273.     ST8x2_UB(res1, dst, dst_stride);
  3274.     dst += 2 * dst_stride;
  3275.  
  3276.     ST8x2_UB(res0, dst, dst_stride);
  3277.     dst += (2 * dst_stride);
  3278.  
  3279.     res1 = APPLY_VERT_QPEL_NO_ROUND_FILTER_8BYTE(horiz6, horiz5, horiz4, horiz3,
  3280.                                                  horiz7, horiz8, horiz8, horiz7,
  3281.                                                  horiz7, horiz6, horiz5, horiz4,
  3282.                                                  horiz8, horiz8, horiz7, horiz6,
  3283.                                                  const20, const6, const3);
  3284.     ST8x2_UB(res1, dst, dst_stride);
  3285. }
  3286.  
  3287. static void hv_mc_qpel_no_rnd_16x16_msa(const uint8_t *src,
  3288.                                         int32_t src_stride,
  3289.                                         uint8_t *dst,
  3290.                                         int32_t dst_stride)
  3291. {
  3292.     uint8_t buff[272];
  3293.  
  3294.     hv_mc_qpel_no_rnd_horiz_16x16_msa(src, src_stride, buff, 16, 16);
  3295.     vert_mc_qpel_no_rnd_16x16_msa(buff, 16, dst, dst_stride);
  3296. }
  3297.  
  3298. static void hv_mc_qpel_no_rnd_8x8_msa(const uint8_t *src,
  3299.                                       int32_t src_stride,
  3300.                                       uint8_t *dst,
  3301.                                       int32_t dst_stride)
  3302. {
  3303.     v16u8 inp0, inp1, inp2, inp3;
  3304.     v16u8 res0, res1;
  3305.     v16u8 horiz0, horiz1, horiz2, horiz3;
  3306.     v16u8 horiz4, horiz5, horiz6, horiz7, horiz8;
  3307.     v16u8 mask0 = { 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8 };
  3308.     v16u8 mask1 = { 0, 2, 0, 3, 1, 4, 2, 5, 3, 6, 4, 7, 5, 8, 6, 8 };
  3309.     v16u8 mask2 = { 1, 3, 0, 4, 0, 5, 1, 6, 2, 7, 3, 8, 4, 8, 5, 7 };
  3310.     v16u8 mask3 = { 2, 4, 1, 5, 0, 6, 0, 7, 1, 8, 2, 8, 3, 7, 4, 6 };
  3311.     v16u8 const20 = (v16u8) __msa_ldi_b(20);
  3312.     v16u8 const6 = (v16u8) __msa_ldi_b(6);
  3313.     v16u8 const3 = (v16u8) __msa_ldi_b(3);
  3314.  
  3315.     LD_UB2(src, src_stride, inp0, inp1);
  3316.     src += (2 * src_stride);
  3317.     horiz0 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp0, inp1, mask0, mask1,
  3318.                                                     mask2, mask3, const20,
  3319.                                                     const6, const3);
  3320.     horiz1 = (v16u8) __msa_splati_d((v2i64) horiz0, 1);
  3321.     LD_UB2(src, src_stride, inp2, inp3);
  3322.     src += (2 * src_stride);
  3323.     horiz2 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp2, inp3, mask0, mask1,
  3324.                                                     mask2, mask3, const20,
  3325.                                                     const6, const3);
  3326.     horiz3 = (v16u8) __msa_splati_d((v2i64) horiz2, 1);
  3327.     LD_UB2(src, src_stride, inp0, inp1);
  3328.     src += (2 * src_stride);
  3329.     horiz4 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp0, inp1, mask0, mask1,
  3330.                                                     mask2, mask3, const20,
  3331.                                                     const6, const3);
  3332.     horiz5 = (v16u8) __msa_splati_d((v2i64) horiz4, 1);
  3333.     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER_8BYTE(horiz0, horiz0, horiz1, horiz2,
  3334.                                                  horiz1, horiz2, horiz3, horiz4,
  3335.                                                  horiz1, horiz0, horiz0, horiz1,
  3336.                                                  horiz2, horiz3, horiz4, horiz5,
  3337.                                                  const20, const6, const3);
  3338.     LD_UB2(src, src_stride, inp2, inp3);
  3339.     src += (2 * src_stride);
  3340.     ST8x2_UB(res0, dst, dst_stride);
  3341.     dst += 2 * dst_stride;
  3342.  
  3343.     horiz6 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp2, inp3, mask0, mask1,
  3344.                                                     mask2, mask3, const20,
  3345.                                                     const6, const3);
  3346.     horiz7 = (v16u8) __msa_splati_d((v2i64) horiz6, 1);
  3347.     inp0 = LD_UB(src);
  3348.     horiz8 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE_1ROW(inp0, mask0, mask1,
  3349.                                                          mask2, mask3, const20,
  3350.                                                          const6, const3);
  3351.     res1 = APPLY_VERT_QPEL_NO_ROUND_FILTER_8BYTE(horiz2, horiz1, horiz0, horiz0,
  3352.                                                  horiz3, horiz4, horiz5, horiz6,
  3353.                                                  horiz3, horiz2, horiz1, horiz0,
  3354.                                                  horiz4, horiz5, horiz6, horiz7,
  3355.                                                  const20, const6, const3);
  3356.     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER_8BYTE(horiz4, horiz3, horiz2, horiz1,
  3357.                                                  horiz5, horiz6, horiz7, horiz8,
  3358.                                                  horiz5, horiz4, horiz3, horiz2,
  3359.                                                  horiz6, horiz7, horiz8, horiz8,
  3360.                                                  const20, const6, const3);
  3361.     ST8x2_UB(res1, dst, dst_stride);
  3362.     dst += 2 * dst_stride;
  3363.  
  3364.  
  3365.     res1 = APPLY_VERT_QPEL_NO_ROUND_FILTER_8BYTE(horiz6, horiz5, horiz4, horiz3,
  3366.                                                  horiz7, horiz8, horiz8, horiz7,
  3367.                                                  horiz7, horiz6, horiz5, horiz4,
  3368.                                                  horiz8, horiz8, horiz7, horiz6,
  3369.                                                  const20, const6, const3);
  3370.     ST8x2_UB(res0, dst, dst_stride);
  3371.     dst += 2 * dst_stride;
  3372.     ST8x2_UB(res1, dst, dst_stride);
  3373. }
  3374.  
  3375. static void hv_mc_qpel_no_rnd_aver_h_src1_16x16_msa(const uint8_t *src,
  3376.                                                     int32_t src_stride,
  3377.                                                     uint8_t *dst,
  3378.                                                     int32_t dst_stride)
  3379. {
  3380.     uint8_t buff[272];
  3381.  
  3382.     hv_mc_qpel_no_rnd_horiz_src1_16x16_msa(src, src_stride, buff, 16, 16);
  3383.     vert_mc_qpel_no_rnd_16x16_msa(buff, 16, dst, dst_stride);
  3384. }
  3385.  
  3386. static void hv_mc_qpel_no_rnd_aver_h_src1_8x8_msa(const uint8_t *src,
  3387.                                                   int32_t src_stride,
  3388.                                                   uint8_t *dst,
  3389.                                                   int32_t dst_stride)
  3390. {
  3391.     v16u8 inp0, inp1, inp2, inp3;
  3392.     v16u8 res0, res1;
  3393.     v16u8 horiz0, horiz1, horiz2, horiz3;
  3394.     v16u8 horiz4, horiz5, horiz6, horiz7, horiz8;
  3395.     v16u8 mask0 = { 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8 };
  3396.     v16u8 mask1 = { 0, 2, 0, 3, 1, 4, 2, 5, 3, 6, 4, 7, 5, 8, 6, 8 };
  3397.     v16u8 mask2 = { 1, 3, 0, 4, 0, 5, 1, 6, 2, 7, 3, 8, 4, 8, 5, 7 };
  3398.     v16u8 mask3 = { 2, 4, 1, 5, 0, 6, 0, 7, 1, 8, 2, 8, 3, 7, 4, 6 };
  3399.     v16u8 const20 = (v16u8) __msa_ldi_b(20);
  3400.     v16u8 const6 = (v16u8) __msa_ldi_b(6);
  3401.     v16u8 const3 = (v16u8) __msa_ldi_b(3);
  3402.  
  3403.     LD_UB2(src, src_stride, inp0, inp1);
  3404.     src += (2 * src_stride);
  3405.     res0 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp0, inp1, mask0, mask1,
  3406.                                                   mask2, mask3, const20,
  3407.                                                   const6, const3);
  3408.     SLDI_B2_UB(inp0, inp1, inp0, inp1, inp0, inp1, 1);
  3409.  
  3410.     inp0 = (v16u8) __msa_insve_d((v2i64) inp0, 1, (v2i64) inp1);
  3411.     horiz0 = __msa_ave_u_b(inp0, res0);
  3412.     horiz1 = (v16u8) __msa_splati_d((v2i64) horiz0, 1);
  3413.     LD_UB2(src, src_stride, inp2, inp3);
  3414.     src += (2 * src_stride);
  3415.     res1 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp2, inp3, mask0, mask1,
  3416.                                                   mask2, mask3, const20,
  3417.                                                   const6, const3);
  3418.     SLDI_B2_UB(inp2, inp3, inp2, inp3, inp2, inp3, 1);
  3419.  
  3420.     inp2 = (v16u8) __msa_insve_d((v2i64) inp2, 1, (v2i64) inp3);
  3421.     horiz2 = __msa_ave_u_b(inp2, res1);
  3422.     horiz3 = (v16u8) __msa_splati_d((v2i64) horiz2, 1);
  3423.     LD_UB2(src, src_stride, inp0, inp1);
  3424.     src += (2 * src_stride);
  3425.     res0 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp0, inp1, mask0, mask1,
  3426.                                                   mask2, mask3, const20,
  3427.                                                   const6, const3);
  3428.     SLDI_B2_UB(inp0, inp1, inp0, inp1, inp0, inp1, 1);
  3429.  
  3430.     inp0 = (v16u8) __msa_insve_d((v2i64) inp0, 1, (v2i64) inp1);
  3431.     horiz4 = __msa_ave_u_b(inp0, res0);
  3432.     horiz5 = (v16u8) __msa_splati_d((v2i64) horiz4, 1);
  3433.     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER_8BYTE(horiz0, horiz0, horiz1, horiz2,
  3434.                                                  horiz1, horiz2, horiz3, horiz4,
  3435.                                                  horiz1, horiz0, horiz0, horiz1,
  3436.                                                  horiz2, horiz3, horiz4, horiz5,
  3437.                                                  const20, const6, const3);
  3438.     LD_UB2(src, src_stride, inp2, inp3);
  3439.     src += (2 * src_stride);
  3440.     ST8x2_UB(res0, dst, dst_stride);
  3441.     dst += 2 * dst_stride;
  3442.  
  3443.     res1 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp2, inp3, mask0, mask1,
  3444.                                                   mask2, mask3, const20,
  3445.                                                   const6, const3);
  3446.     SLDI_B2_UB(inp2, inp3, inp2, inp3, inp2, inp3, 1);
  3447.  
  3448.     inp2 = (v16u8) __msa_insve_d((v2i64) inp2, 1, (v2i64) inp3);
  3449.     horiz6 = __msa_ave_u_b(inp2, res1);
  3450.     horiz7 = (v16u8) __msa_splati_d((v2i64) horiz6, 1);
  3451.     inp0 = LD_UB(src);
  3452.     res0 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE_1ROW(inp0, mask0, mask1,
  3453.                                                        mask2, mask3, const20,
  3454.                                                        const6, const3);
  3455.     inp0 = (v16u8) __msa_sldi_b((v16i8) inp0, (v16i8) inp0, 1);
  3456.     horiz8 = __msa_ave_u_b(inp0, res0);
  3457.     res1 = APPLY_VERT_QPEL_NO_ROUND_FILTER_8BYTE(horiz2, horiz1, horiz0, horiz0,
  3458.                                                  horiz3, horiz4, horiz5, horiz6,
  3459.                                                  horiz3, horiz2, horiz1, horiz0,
  3460.                                                  horiz4, horiz5, horiz6, horiz7,
  3461.                                                  const20, const6, const3);
  3462.     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER_8BYTE(horiz4, horiz3, horiz2, horiz1,
  3463.                                                  horiz5, horiz6, horiz7, horiz8,
  3464.                                                  horiz5, horiz4, horiz3, horiz2,
  3465.                                                  horiz6, horiz7, horiz8, horiz8,
  3466.                                                  const20, const6, const3);
  3467.     ST8x2_UB(res1, dst, dst_stride);
  3468.     dst += 2 * dst_stride;
  3469.  
  3470.     res1 = APPLY_VERT_QPEL_NO_ROUND_FILTER_8BYTE(horiz6, horiz5, horiz4, horiz3,
  3471.                                                  horiz7, horiz8, horiz8, horiz7,
  3472.                                                  horiz7, horiz6, horiz5, horiz4,
  3473.                                                  horiz8, horiz8, horiz7, horiz6,
  3474.                                                  const20, const6, const3);
  3475.     ST8x2_UB(res0, dst, dst_stride);
  3476.     dst += 2 * dst_stride;
  3477.     ST8x2_UB(res1, dst, dst_stride);
  3478. }
  3479.  
  3480. static void hv_mc_qpel_no_rnd_aver_hv_src01_16x16_msa(const uint8_t *src,
  3481.                                                       int32_t src_stride,
  3482.                                                       uint8_t *dst,
  3483.                                                       int32_t dst_stride)
  3484. {
  3485.     uint8_t buff[272];
  3486.  
  3487.     hv_mc_qpel_no_rnd_horiz_src0_16x16_msa(src, src_stride, buff, 16, 16);
  3488.     vert_mc_qpel_no_rnd_aver_src1_16x16_msa(buff, 16, dst, dst_stride);
  3489. }
  3490.  
  3491. static void hv_mc_qpel_no_rnd_aver_hv_src01_8x8_msa(const uint8_t *src,
  3492.                                                     int32_t src_stride,
  3493.                                                     uint8_t *dst,
  3494.                                                     int32_t dst_stride)
  3495. {
  3496.     v16u8 inp0, inp1, inp2, inp3;
  3497.     v16u8 res0, res1, avg0, avg1;
  3498.     v16u8 horiz0, horiz1, horiz2, horiz3;
  3499.     v16u8 horiz4, horiz5, horiz6, horiz7, horiz8;
  3500.     v16u8 mask0 = { 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8 };
  3501.     v16u8 mask1 = { 0, 2, 0, 3, 1, 4, 2, 5, 3, 6, 4, 7, 5, 8, 6, 8 };
  3502.     v16u8 mask2 = { 1, 3, 0, 4, 0, 5, 1, 6, 2, 7, 3, 8, 4, 8, 5, 7 };
  3503.     v16u8 mask3 = { 2, 4, 1, 5, 0, 6, 0, 7, 1, 8, 2, 8, 3, 7, 4, 6 };
  3504.     v16u8 const20 = (v16u8) __msa_ldi_b(20);
  3505.     v16u8 const6 = (v16u8) __msa_ldi_b(6);
  3506.     v16u8 const3 = (v16u8) __msa_ldi_b(3);
  3507.  
  3508.     LD_UB2(src, src_stride, inp0, inp1);
  3509.     src += (2 * src_stride);
  3510.     res0 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp0, inp1, mask0, mask1,
  3511.                                                   mask2, mask3, const20,
  3512.                                                   const6, const3);
  3513.     inp0 = (v16u8) __msa_ilvr_d((v2i64) inp1, (v2i64) inp0);
  3514.     horiz0 = __msa_ave_u_b(inp0, res0);
  3515.     horiz1 = (v16u8) __msa_splati_d((v2i64) horiz0, 1);
  3516.     LD_UB2(src, src_stride, inp2, inp3);
  3517.     src += (2 * src_stride);
  3518.     res1 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp2, inp3, mask0, mask1,
  3519.                                                   mask2, mask3, const20,
  3520.                                                   const6, const3);
  3521.     inp2 = (v16u8) __msa_ilvr_d((v2i64) inp3, (v2i64) inp2);
  3522.     horiz2 = __msa_ave_u_b(inp2, res1);
  3523.     horiz3 = (v16u8) __msa_splati_d((v2i64) horiz2, 1);
  3524.     LD_UB2(src, src_stride, inp0, inp1);
  3525.     src += (2 * src_stride);
  3526.     res0 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp0, inp1, mask0, mask1,
  3527.                                                   mask2, mask3, const20,
  3528.                                                   const6, const3);
  3529.     inp0 = (v16u8) __msa_ilvr_d((v2i64) inp1, (v2i64) inp0);
  3530.     horiz4 = __msa_ave_u_b(inp0, res0);
  3531.     horiz5 = (v16u8) __msa_splati_d((v2i64) horiz4, 1);
  3532.     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER_8BYTE(horiz0, horiz0, horiz1, horiz2,
  3533.                                                  horiz1, horiz2, horiz3, horiz4,
  3534.                                                  horiz1, horiz0, horiz0, horiz1,
  3535.                                                  horiz2, horiz3, horiz4, horiz5,
  3536.                                                  const20, const6, const3);
  3537.     avg0 = (v16u8) __msa_ilvr_d((v2i64) horiz2, (v2i64) horiz1);
  3538.     res0 = __msa_ave_u_b(avg0, res0);
  3539.     ST8x2_UB(res0, dst, dst_stride);
  3540.     dst += (2 * dst_stride);
  3541.  
  3542.     LD_UB2(src, src_stride, inp2, inp3);
  3543.     src += (2 * src_stride);
  3544.     res1 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp2, inp3, mask0, mask1,
  3545.                                                   mask2, mask3, const20,
  3546.                                                   const6, const3);
  3547.     inp2 = (v16u8) __msa_ilvr_d((v2i64) inp3, (v2i64) inp2);
  3548.     horiz6 = __msa_ave_u_b(inp2, res1);
  3549.     horiz7 = (v16u8) __msa_splati_d((v2i64) horiz6, 1);
  3550.     inp0 = LD_UB(src);
  3551.     res0 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE_1ROW(inp0, mask0, mask1,
  3552.                                                        mask2, mask3, const20,
  3553.                                                        const6, const3);
  3554.     horiz8 = __msa_ave_u_b(inp0, res0);
  3555.     res1 = APPLY_VERT_QPEL_NO_ROUND_FILTER_8BYTE(horiz2, horiz1, horiz0, horiz0,
  3556.                                                  horiz3, horiz4, horiz5, horiz6,
  3557.                                                  horiz3, horiz2, horiz1, horiz0,
  3558.                                                  horiz4, horiz5, horiz6, horiz7,
  3559.                                                  const20, const6, const3);
  3560.     avg1 = (v16u8) __msa_ilvr_d((v2i64) horiz4, (v2i64) horiz3);
  3561.     res1 = __msa_ave_u_b(avg1, res1);
  3562.     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER_8BYTE(horiz4, horiz3, horiz2, horiz1,
  3563.                                                  horiz5, horiz6, horiz7, horiz8,
  3564.                                                  horiz5, horiz4, horiz3, horiz2,
  3565.                                                  horiz6, horiz7, horiz8, horiz8,
  3566.                                                  const20, const6, const3);
  3567.     ST8x2_UB(res1, dst, dst_stride);
  3568.     dst += 2 * dst_stride;
  3569.  
  3570.     avg0 = (v16u8) __msa_ilvr_d((v2i64) horiz6, (v2i64) horiz5);
  3571.     res0 = __msa_ave_u_b(avg0, res0);
  3572.  
  3573.     res1 = APPLY_VERT_QPEL_NO_ROUND_FILTER_8BYTE(horiz6, horiz5, horiz4, horiz3,
  3574.                                                  horiz7, horiz8, horiz8, horiz7,
  3575.                                                  horiz7, horiz6, horiz5, horiz4,
  3576.                                                  horiz8, horiz8, horiz7, horiz6,
  3577.                                                  const20, const6, const3);
  3578.     ST8x2_UB(res0, dst, dst_stride);
  3579.     dst += 2 * dst_stride;
  3580.  
  3581.     avg1 = (v16u8) __msa_ilvr_d((v2i64) horiz8, (v2i64) horiz7);
  3582.     res1 = __msa_ave_u_b(avg1, res1);
  3583.     ST8x2_UB(res1, dst, dst_stride);
  3584. }
  3585.  
  3586. static void hv_mc_qpel_no_rnd_aver_v_src1_16x16_msa(const uint8_t *src,
  3587.                                                     int32_t src_stride,
  3588.                                                     uint8_t *dst,
  3589.                                                     int32_t dst_stride)
  3590. {
  3591.     uint8_t buff[272];
  3592.  
  3593.     hv_mc_qpel_no_rnd_horiz_16x16_msa(src, src_stride, buff, 16, 16);
  3594.     vert_mc_qpel_no_rnd_aver_src1_16x16_msa(buff, 16, dst, dst_stride);
  3595. }
  3596.  
  3597. static void hv_mc_qpel_no_rnd_aver_v_src1_8x8_msa(const uint8_t *src,
  3598.                                                   int32_t src_stride,
  3599.                                                   uint8_t *dst,
  3600.                                                   int32_t dst_stride)
  3601. {
  3602.     v16u8 inp0, inp1, inp2, inp3;
  3603.     v16u8 res0, res1, avg0, avg1;
  3604.     v16u8 horiz0, horiz1, horiz2, horiz3;
  3605.     v16u8 horiz4, horiz5, horiz6, horiz7, horiz8;
  3606.     v16u8 mask0 = { 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8 };
  3607.     v16u8 mask1 = { 0, 2, 0, 3, 1, 4, 2, 5, 3, 6, 4, 7, 5, 8, 6, 8 };
  3608.     v16u8 mask2 = { 1, 3, 0, 4, 0, 5, 1, 6, 2, 7, 3, 8, 4, 8, 5, 7 };
  3609.     v16u8 mask3 = { 2, 4, 1, 5, 0, 6, 0, 7, 1, 8, 2, 8, 3, 7, 4, 6 };
  3610.     v16u8 const20 = (v16u8) __msa_ldi_b(20);
  3611.     v16u8 const6 = (v16u8) __msa_ldi_b(6);
  3612.     v16u8 const3 = (v16u8) __msa_ldi_b(3);
  3613.  
  3614.     LD_UB2(src, src_stride, inp0, inp1);
  3615.     src += (2 * src_stride);
  3616.     horiz0 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp0, inp1, mask0, mask1,
  3617.                                                     mask2, mask3, const20,
  3618.                                                     const6, const3);
  3619.     horiz1 = (v16u8) __msa_splati_d((v2i64) horiz0, 1);
  3620.     LD_UB2(src, src_stride, inp2, inp3);
  3621.     src += (2 * src_stride);
  3622.     horiz2 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp2, inp3, mask0, mask1,
  3623.                                                     mask2, mask3, const20,
  3624.                                                     const6, const3);
  3625.     horiz3 = (v16u8) __msa_splati_d((v2i64) horiz2, 1);
  3626.     LD_UB2(src, src_stride, inp0, inp1);
  3627.     src += (2 * src_stride);
  3628.     horiz4 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp0, inp1, mask0, mask1,
  3629.                                                     mask2, mask3, const20,
  3630.                                                     const6, const3);
  3631.     horiz5 = (v16u8) __msa_splati_d((v2i64) horiz4, 1);
  3632.     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER_8BYTE(horiz0, horiz0, horiz1, horiz2,
  3633.                                                  horiz1, horiz2, horiz3, horiz4,
  3634.                                                  horiz1, horiz0, horiz0, horiz1,
  3635.                                                  horiz2, horiz3, horiz4, horiz5,
  3636.                                                  const20, const6, const3);
  3637.     avg0 = (v16u8) __msa_ilvr_d((v2i64) horiz2, (v2i64) horiz1);
  3638.     res0 = __msa_ave_u_b(avg0, res0);
  3639.     LD_UB2(src, src_stride, inp2, inp3);
  3640.     src += (2 * src_stride);
  3641.     ST8x2_UB(res0, dst, dst_stride);
  3642.     dst += 2 * dst_stride;
  3643.  
  3644.     horiz6 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp2, inp3, mask0, mask1,
  3645.                                                     mask2, mask3, const20,
  3646.                                                     const6, const3);
  3647.     horiz7 = (v16u8) __msa_splati_d((v2i64) horiz6, 1);
  3648.     res1 = APPLY_VERT_QPEL_NO_ROUND_FILTER_8BYTE(horiz2, horiz1, horiz0, horiz0,
  3649.                                                  horiz3, horiz4, horiz5, horiz6,
  3650.                                                  horiz3, horiz2, horiz1, horiz0,
  3651.                                                  horiz4, horiz5, horiz6, horiz7,
  3652.                                                  const20, const6, const3);
  3653.     avg1 = (v16u8) __msa_ilvr_d((v2i64) horiz4, (v2i64) horiz3);
  3654.     res1 = __msa_ave_u_b(avg1, res1);
  3655.     inp0 = LD_UB(src);
  3656.     horiz8 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE_1ROW(inp0, mask0, mask1,
  3657.                                                          mask2, mask3, const20,
  3658.                                                          const6, const3);
  3659.     ST8x2_UB(res1, dst, dst_stride);
  3660.     dst += 2 * dst_stride;
  3661.  
  3662.     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER_8BYTE(horiz4, horiz3, horiz2, horiz1,
  3663.                                                  horiz5, horiz6, horiz7, horiz8,
  3664.                                                  horiz5, horiz4, horiz3, horiz2,
  3665.                                                  horiz6, horiz7, horiz8, horiz8,
  3666.                                                  const20, const6, const3);
  3667.     avg0 = (v16u8) __msa_ilvr_d((v2i64) horiz6, (v2i64) horiz5);
  3668.     res0 = __msa_ave_u_b(avg0, res0);
  3669.     res1 = APPLY_VERT_QPEL_NO_ROUND_FILTER_8BYTE(horiz6, horiz5, horiz4, horiz3,
  3670.                                                  horiz7, horiz8, horiz8, horiz7,
  3671.                                                  horiz7, horiz6, horiz5, horiz4,
  3672.                                                  horiz8, horiz8, horiz7, horiz6,
  3673.                                                  const20, const6, const3);
  3674.     ST8x2_UB(res0, dst, dst_stride);
  3675.     dst += 2 * dst_stride;
  3676.  
  3677.     avg1 = (v16u8) __msa_ilvr_d((v2i64) horiz8, (v2i64) horiz7);
  3678.     res1 = __msa_ave_u_b(avg1, res1);
  3679.     ST8x2_UB(res1, dst, dst_stride);
  3680. }
  3681.  
  3682. static void hv_mc_qpel_no_rnd_aver_hv_src11_16x16_msa(const uint8_t *src,
  3683.                                                       int32_t src_stride,
  3684.                                                       uint8_t *dst,
  3685.                                                       int32_t dst_stride)
  3686. {
  3687.     uint8_t buff[272];
  3688.  
  3689.     hv_mc_qpel_no_rnd_horiz_src1_16x16_msa(src, src_stride, buff, 16, 16);
  3690.     vert_mc_qpel_no_rnd_aver_src1_16x16_msa(buff, 16, dst, dst_stride);
  3691. }
  3692.  
  3693. static void hv_mc_qpel_no_rnd_aver_hv_src11_8x8_msa(const uint8_t *src,
  3694.                                                     int32_t src_stride,
  3695.                                                     uint8_t *dst,
  3696.                                                     int32_t dst_stride)
  3697. {
  3698.     v16u8 inp0, inp1, inp2, inp3;
  3699.     v16u8 res0, res1, avg0, avg1;
  3700.     v16u8 horiz0, horiz1, horiz2, horiz3;
  3701.     v16u8 horiz4, horiz5, horiz6, horiz7, horiz8;
  3702.     v16u8 mask0 = { 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8 };
  3703.     v16u8 mask1 = { 0, 2, 0, 3, 1, 4, 2, 5, 3, 6, 4, 7, 5, 8, 6, 8 };
  3704.     v16u8 mask2 = { 1, 3, 0, 4, 0, 5, 1, 6, 2, 7, 3, 8, 4, 8, 5, 7 };
  3705.     v16u8 mask3 = { 2, 4, 1, 5, 0, 6, 0, 7, 1, 8, 2, 8, 3, 7, 4, 6 };
  3706.     v16u8 const20 = (v16u8) __msa_ldi_b(20);
  3707.     v16u8 const6 = (v16u8) __msa_ldi_b(6);
  3708.     v16u8 const3 = (v16u8) __msa_ldi_b(3);
  3709.  
  3710.     LD_UB2(src, src_stride, inp0, inp1);
  3711.     src += (2 * src_stride);
  3712.     res0 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp0, inp1, mask0, mask1,
  3713.                                                   mask2, mask3, const20,
  3714.                                                   const6, const3);
  3715.     SLDI_B2_UB(inp0, inp1, inp0, inp1, inp0, inp1, 1);
  3716.  
  3717.     inp0 = (v16u8) __msa_insve_d((v2i64) inp0, 1, (v2i64) inp1);
  3718.     horiz0 = __msa_ave_u_b(inp0, res0);
  3719.     horiz1 = (v16u8) __msa_splati_d((v2i64) horiz0, 1);
  3720.     LD_UB2(src, src_stride, inp2, inp3);
  3721.     src += (2 * src_stride);
  3722.     res1 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp2, inp3, mask0, mask1,
  3723.                                                   mask2, mask3, const20,
  3724.                                                   const6, const3);
  3725.     SLDI_B2_UB(inp2, inp3, inp2, inp3, inp2, inp3, 1);
  3726.  
  3727.     inp2 = (v16u8) __msa_insve_d((v2i64) inp2, 1, (v2i64) inp3);
  3728.     horiz2 = __msa_ave_u_b(inp2, res1);
  3729.     horiz3 = (v16u8) __msa_splati_d((v2i64) horiz2, 1);
  3730.     LD_UB2(src, src_stride, inp0, inp1);
  3731.     src += (2 * src_stride);
  3732.     res0 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp0, inp1, mask0, mask1,
  3733.                                                   mask2, mask3, const20,
  3734.                                                   const6, const3);
  3735.  
  3736.     SLDI_B2_UB(inp0, inp1, inp0, inp1, inp0, inp1, 1);
  3737.     inp0 = (v16u8) __msa_insve_d((v2i64) inp0, 1, (v2i64) inp1);
  3738.     horiz4 = __msa_ave_u_b(inp0, res0);
  3739.     horiz5 = (v16u8) __msa_splati_d((v2i64) horiz4, 1);
  3740.     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER_8BYTE(horiz0, horiz0, horiz1, horiz2,
  3741.                                                  horiz1, horiz2, horiz3, horiz4,
  3742.                                                  horiz1, horiz0, horiz0, horiz1,
  3743.                                                  horiz2, horiz3, horiz4, horiz5,
  3744.                                                  const20, const6, const3);
  3745.     avg0 = (v16u8) __msa_ilvr_d((v2i64) horiz2, (v2i64) horiz1);
  3746.     res0 = __msa_ave_u_b(avg0, res0);
  3747.     ST8x2_UB(res0, dst, dst_stride);
  3748.     dst += (2 * dst_stride);
  3749.  
  3750.     LD_UB2(src, src_stride, inp2, inp3);
  3751.     src += (2 * src_stride);
  3752.     res1 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp2, inp3, mask0, mask1,
  3753.                                                   mask2, mask3, const20,
  3754.                                                   const6, const3);
  3755.     SLDI_B2_UB(inp2, inp3, inp2, inp3, inp2, inp3, 1);
  3756.  
  3757.     inp2 = (v16u8) __msa_insve_d((v2i64) inp2, 1, (v2i64) inp3);
  3758.     horiz6 = __msa_ave_u_b(inp2, res1);
  3759.     horiz7 = (v16u8) __msa_splati_d((v2i64) horiz6, 1);
  3760.     res1 = APPLY_VERT_QPEL_NO_ROUND_FILTER_8BYTE(horiz2, horiz1, horiz0, horiz0,
  3761.                                                  horiz3, horiz4, horiz5, horiz6,
  3762.                                                  horiz3, horiz2, horiz1, horiz0,
  3763.                                                  horiz4, horiz5, horiz6, horiz7,
  3764.                                                  const20, const6, const3);
  3765.     avg1 = (v16u8) __msa_ilvr_d((v2i64) horiz4, (v2i64) horiz3);
  3766.     res1 = __msa_ave_u_b(avg1, res1);
  3767.     ST8x2_UB(res1, dst, dst_stride);
  3768.     dst += (2 * dst_stride);
  3769.  
  3770.     inp0 = LD_UB(src);
  3771.     res0 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE_1ROW(inp0, mask0, mask1,
  3772.                                                        mask2, mask3, const20,
  3773.                                                        const6, const3);
  3774.     inp0 = (v16u8) __msa_sldi_b((v16i8) inp0, (v16i8) inp0, 1);
  3775.     horiz8 = __msa_ave_u_b(inp0, res0);
  3776.     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER_8BYTE(horiz4, horiz3, horiz2, horiz1,
  3777.                                                  horiz5, horiz6, horiz7, horiz8,
  3778.                                                  horiz5, horiz4, horiz3, horiz2,
  3779.                                                  horiz6, horiz7, horiz8, horiz8,
  3780.                                                  const20, const6, const3);
  3781.     res1 = APPLY_VERT_QPEL_NO_ROUND_FILTER_8BYTE(horiz6, horiz5, horiz4, horiz3,
  3782.                                                  horiz7, horiz8, horiz8, horiz7,
  3783.                                                  horiz7, horiz6, horiz5, horiz4,
  3784.                                                  horiz8, horiz8, horiz7, horiz6,
  3785.                                                  const20, const6, const3);
  3786.     avg0 = (v16u8) __msa_ilvr_d((v2i64) horiz6, (v2i64) horiz5);
  3787.     res0 = __msa_ave_u_b(avg0, res0);
  3788.     avg1 = (v16u8) __msa_ilvr_d((v2i64) horiz8, (v2i64) horiz7);
  3789.     res1 = __msa_ave_u_b(avg1, res1);
  3790.     ST8x4_UB(res0, res1, dst, dst_stride);
  3791. }
  3792.  
  3793. static void hv_mc_qpel_aver_horiz_src0_16x16_msa(const uint8_t *src,
  3794.                                                  int32_t src_stride,
  3795.                                                  uint8_t *dst,
  3796.                                                  int32_t dst_stride,
  3797.                                                  int32_t height)
  3798. {
  3799.     uint8_t loop_count;
  3800.     v16u8 inp0, inp1, inp2, inp3, inp4, inp5, inp6, inp7;
  3801.     v16u8 res;
  3802.     v16u8 mask = { 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
  3803.     v16u8 const6 = (v16u8) __msa_ldi_b(6);
  3804.     v16u8 const3 = (v16u8) __msa_ldi_b(3);
  3805.     v8u16 const20 = (v8u16) __msa_ldi_h(20);
  3806.  
  3807.     for (loop_count = (height >> 2); loop_count--;) {
  3808.         LD_UB4(src, src_stride, inp0, inp2, inp4, inp6);
  3809.         LD_UB4((src + 1), src_stride, inp1, inp3, inp5, inp7);
  3810.         src += (4 * src_stride);
  3811.         res = APPLY_HORIZ_QPEL_FILTER(inp0, inp1, mask,
  3812.                                       const20, const6, const3);
  3813.         res = __msa_aver_u_b(inp0, res);
  3814.         ST_UB(res, dst);
  3815.         dst += dst_stride;
  3816.  
  3817.         res = APPLY_HORIZ_QPEL_FILTER(inp2, inp3, mask,
  3818.                                       const20, const6, const3);
  3819.         res = __msa_aver_u_b(inp2, res);
  3820.         ST_UB(res, dst);
  3821.         dst += dst_stride;
  3822.  
  3823.         res = APPLY_HORIZ_QPEL_FILTER(inp4, inp5, mask,
  3824.                                       const20, const6, const3);
  3825.         res = __msa_aver_u_b(inp4, res);
  3826.         ST_UB(res, dst);
  3827.         dst += dst_stride;
  3828.  
  3829.         res = APPLY_HORIZ_QPEL_FILTER(inp6, inp7, mask,
  3830.                                       const20, const6, const3);
  3831.         res = __msa_aver_u_b(inp6, res);
  3832.         ST_UB(res, dst);
  3833.         dst += dst_stride;
  3834.     }
  3835.  
  3836.     LD_UB2(src, 1, inp0, inp1);
  3837.     res = APPLY_HORIZ_QPEL_FILTER(inp0, inp1, mask, const20, const6, const3);
  3838.     res = __msa_aver_u_b(inp0, res);
  3839.     ST_UB(res, dst);
  3840. }
  3841.  
  3842. static void hv_mc_qpel_aver_hv_src00_16x16_msa(const uint8_t *src,
  3843.                                                int32_t src_stride,
  3844.                                                uint8_t *dst,
  3845.                                                int32_t dst_stride)
  3846. {
  3847.     uint8_t buff[272];
  3848.  
  3849.     hv_mc_qpel_aver_horiz_src0_16x16_msa(src, src_stride, buff, 16, 16);
  3850.     vert_mc_qpel_aver_src0_16x16_msa(buff, 16, dst, dst_stride);
  3851. }
  3852.  
  3853. static void hv_mc_qpel_aver_hv_src00_8x8_msa(const uint8_t *src,
  3854.                                              int32_t src_stride,
  3855.                                              uint8_t *dst,
  3856.                                              int32_t dst_stride)
  3857. {
  3858.     v16u8 inp0, inp1, inp2, inp3;
  3859.     v16u8 res0, res1, avg0, avg1;
  3860.     v16u8 horiz0, horiz1, horiz2, horiz3;
  3861.     v16u8 horiz4, horiz5, horiz6, horiz7, horiz8;
  3862.     v16u8 mask0 = { 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8 };
  3863.     v16u8 mask1 = { 0, 2, 0, 3, 1, 4, 2, 5, 3, 6, 4, 7, 5, 8, 6, 8 };
  3864.     v16u8 mask2 = { 1, 3, 0, 4, 0, 5, 1, 6, 2, 7, 3, 8, 4, 8, 5, 7 };
  3865.     v16u8 mask3 = { 2, 4, 1, 5, 0, 6, 0, 7, 1, 8, 2, 8, 3, 7, 4, 6 };
  3866.     v16u8 const20 = (v16u8) __msa_ldi_b(20);
  3867.     v16u8 const6 = (v16u8) __msa_ldi_b(6);
  3868.     v16u8 const3 = (v16u8) __msa_ldi_b(3);
  3869.  
  3870.     LD_UB4(src, src_stride, inp0, inp1, inp2, inp3);
  3871.     src += (4 * src_stride);
  3872.     res0 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp0, inp1, mask0, mask1, mask2, mask3,
  3873.                                          const20, const6, const3);
  3874.     res1 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp2, inp3, mask0, mask1, mask2, mask3,
  3875.                                          const20, const6, const3);
  3876.     inp0 = (v16u8) __msa_ilvr_d((v2i64) inp1, (v2i64) inp0);
  3877.     horiz0 = __msa_aver_u_b(inp0, res0);
  3878.     horiz1 = (v16u8) __msa_splati_d((v2i64) horiz0, 1);
  3879.     inp2 = (v16u8) __msa_ilvr_d((v2i64) inp3, (v2i64) inp2);
  3880.     horiz2 = __msa_aver_u_b(inp2, res1);
  3881.     horiz3 = (v16u8) __msa_splati_d((v2i64) horiz2, 1);
  3882.     LD_UB2(src, src_stride, inp0, inp1);
  3883.     src += (2 * src_stride);
  3884.     res0 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp0, inp1, mask0, mask1, mask2, mask3,
  3885.                                          const20, const6, const3);
  3886.     inp0 = (v16u8) __msa_ilvr_d((v2i64) inp1, (v2i64) inp0);
  3887.     horiz4 = __msa_aver_u_b(inp0, res0);
  3888.     horiz5 = (v16u8) __msa_splati_d((v2i64) horiz4, 1);
  3889.     res0 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz0, horiz0, horiz1, horiz2,
  3890.                                         horiz1, horiz2, horiz3, horiz4,
  3891.                                         horiz1, horiz0, horiz0, horiz1,
  3892.                                         horiz2, horiz3, horiz4, horiz5,
  3893.                                         const20, const6, const3);
  3894.     avg0 = (v16u8) __msa_ilvr_d((v2i64) horiz1, (v2i64) horiz0);
  3895.     res0 = __msa_aver_u_b(avg0, res0);
  3896.     ST8x2_UB(res0, dst, dst_stride);
  3897.     dst += (2 * dst_stride);
  3898.  
  3899.     LD_UB2(src, src_stride, inp2, inp3);
  3900.     src += (2 * src_stride);
  3901.     res1 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp2, inp3, mask0, mask1, mask2, mask3,
  3902.                                          const20, const6, const3);
  3903.     inp2 = (v16u8) __msa_ilvr_d((v2i64) inp3, (v2i64) inp2);
  3904.     horiz6 = __msa_aver_u_b(inp2, res1);
  3905.     horiz7 = (v16u8) __msa_splati_d((v2i64) horiz6, 1);
  3906.     res1 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz2, horiz1, horiz0, horiz0,
  3907.                                         horiz3, horiz4, horiz5, horiz6,
  3908.                                         horiz3, horiz2, horiz1, horiz0,
  3909.                                         horiz4, horiz5, horiz6, horiz7,
  3910.                                         const20, const6, const3);
  3911.     avg1 = (v16u8) __msa_ilvr_d((v2i64) horiz3, (v2i64) horiz2);
  3912.     res1 = __msa_aver_u_b(avg1, res1);
  3913.  
  3914.     inp0 = LD_UB(src);
  3915.     res0 = APPLY_HORIZ_QPEL_FILTER_8BYTE_1ROW(inp0, mask0, mask1, mask2, mask3,
  3916.                                               const20, const6, const3);
  3917.     horiz8 = __msa_aver_u_b(inp0, res0);
  3918.     ST8x2_UB(res1, dst, dst_stride);
  3919.     dst += 2 * dst_stride;
  3920.  
  3921.     res0 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz4, horiz3, horiz2, horiz1,
  3922.                                         horiz5, horiz6, horiz7, horiz8,
  3923.                                         horiz5, horiz4, horiz3, horiz2,
  3924.                                         horiz6, horiz7, horiz8, horiz8,
  3925.                                         const20, const6, const3);
  3926.     avg0 = (v16u8) __msa_ilvr_d((v2i64) horiz5, (v2i64) horiz4);
  3927.     res0 = __msa_aver_u_b(avg0, res0);
  3928.     res1 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz6, horiz5, horiz4, horiz3,
  3929.                                         horiz7, horiz8, horiz8, horiz7,
  3930.                                         horiz7, horiz6, horiz5, horiz4,
  3931.                                         horiz8, horiz8, horiz7, horiz6,
  3932.                                         const20, const6, const3);
  3933.     ST8x2_UB(res0, dst, dst_stride);
  3934.     dst += 2 * dst_stride;
  3935.     avg1 = (v16u8) __msa_ilvr_d((v2i64) horiz7, (v2i64) horiz6);
  3936.     res1 = __msa_aver_u_b(avg1, res1);
  3937.     ST8x2_UB(res1, dst, dst_stride);
  3938. }
  3939.  
  3940. static void hv_mc_qpel_aver_horiz_16x16_msa(const uint8_t *src,
  3941.                                             int32_t src_stride,
  3942.                                             uint8_t *dst,
  3943.                                             int32_t dst_stride,
  3944.                                             int32_t height)
  3945. {
  3946.     uint8_t loop_count;
  3947.     v16u8 inp0, inp1, inp2, inp3, inp4, inp5, inp6, inp7;
  3948.     v16u8 res;
  3949.     v16u8 mask = { 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
  3950.     v16u8 const6 = (v16u8) __msa_ldi_b(6);
  3951.     v16u8 const3 = (v16u8) __msa_ldi_b(3);
  3952.     v8u16 const20 = (v8u16) __msa_ldi_h(20);
  3953.  
  3954.     for (loop_count = (height >> 2); loop_count--;) {
  3955.         LD_UB4(src, src_stride, inp0, inp2, inp4, inp6);
  3956.         LD_UB4((src + 1), src_stride, inp1, inp3, inp5, inp7);
  3957.         src += (4 * src_stride);
  3958.         res = APPLY_HORIZ_QPEL_FILTER(inp0, inp1, mask,
  3959.                                       const20, const6, const3);
  3960.         ST_UB(res, dst);
  3961.         dst += dst_stride;
  3962.  
  3963.         res = APPLY_HORIZ_QPEL_FILTER(inp2, inp3, mask,
  3964.                                       const20, const6, const3);
  3965.         ST_UB(res, dst);
  3966.         dst += dst_stride;
  3967.  
  3968.         res = APPLY_HORIZ_QPEL_FILTER(inp4, inp5, mask,
  3969.                                       const20, const6, const3);
  3970.         ST_UB(res, dst);
  3971.         dst += dst_stride;
  3972.  
  3973.         res = APPLY_HORIZ_QPEL_FILTER(inp6, inp7, mask,
  3974.                                       const20, const6, const3);
  3975.         ST_UB(res, dst);
  3976.         dst += dst_stride;
  3977.     }
  3978.  
  3979.     LD_UB2(src, 1, inp0, inp1);
  3980.     res = APPLY_HORIZ_QPEL_FILTER(inp0, inp1, mask, const20, const6, const3);
  3981.     ST_UB(res, dst);
  3982. }
  3983.  
  3984. static void hv_mc_qpel_aver_v_src0_16x16_msa(const uint8_t *src,
  3985.                                              int32_t src_stride,
  3986.                                              uint8_t *dst,
  3987.                                              int32_t dst_stride)
  3988. {
  3989.     uint8_t buff[272];
  3990.  
  3991.     hv_mc_qpel_aver_horiz_16x16_msa(src, src_stride, buff, 16, 16);
  3992.     vert_mc_qpel_aver_src0_16x16_msa(buff, 16, dst, dst_stride);
  3993. }
  3994.  
  3995. static void hv_mc_qpel_aver_v_src0_8x8_msa(const uint8_t *src,
  3996.                                            int32_t src_stride,
  3997.                                            uint8_t *dst,
  3998.                                            int32_t dst_stride)
  3999. {
  4000.     v16u8 inp0, inp1, inp2, inp3;
  4001.     v16u8 res0, res1, avg0, avg1;
  4002.     v16u8 horiz0, horiz1, horiz2, horiz3;
  4003.     v16u8 horiz4, horiz5, horiz6, horiz7, horiz8;
  4004.     v16u8 mask0 = { 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8 };
  4005.     v16u8 mask1 = { 0, 2, 0, 3, 1, 4, 2, 5, 3, 6, 4, 7, 5, 8, 6, 8 };
  4006.     v16u8 mask2 = { 1, 3, 0, 4, 0, 5, 1, 6, 2, 7, 3, 8, 4, 8, 5, 7 };
  4007.     v16u8 mask3 = { 2, 4, 1, 5, 0, 6, 0, 7, 1, 8, 2, 8, 3, 7, 4, 6 };
  4008.     v16u8 const20 = (v16u8) __msa_ldi_b(20);
  4009.     v16u8 const6 = (v16u8) __msa_ldi_b(6);
  4010.     v16u8 const3 = (v16u8) __msa_ldi_b(3);
  4011.  
  4012.     LD_UB2(src, src_stride, inp0, inp1);
  4013.     src += (2 * src_stride);
  4014.     horiz0 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp0, inp1,
  4015.                                            mask0, mask1, mask2, mask3,
  4016.                                            const20, const6, const3);
  4017.     horiz1 = (v16u8) __msa_splati_d((v2i64) horiz0, 1);
  4018.     LD_UB2(src, src_stride, inp2, inp3);
  4019.     src += (2 * src_stride);
  4020.     horiz2 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp2, inp3,
  4021.                                            mask0, mask1, mask2, mask3,
  4022.                                            const20, const6, const3);
  4023.     horiz3 = (v16u8) __msa_splati_d((v2i64) horiz2, 1);
  4024.     LD_UB2(src, src_stride, inp0, inp1);
  4025.     src += (2 * src_stride);
  4026.     horiz4 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp0, inp1,
  4027.                                            mask0, mask1, mask2, mask3,
  4028.                                            const20, const6, const3);
  4029.     horiz5 = (v16u8) __msa_splati_d((v2i64) horiz4, 1);
  4030.     res0 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz0, horiz0, horiz1, horiz2,
  4031.                                         horiz1, horiz2, horiz3, horiz4,
  4032.                                         horiz1, horiz0, horiz0, horiz1,
  4033.                                         horiz2, horiz3, horiz4, horiz5,
  4034.                                         const20, const6, const3);
  4035.     avg0 = (v16u8) __msa_ilvr_d((v2i64) horiz1, (v2i64) horiz0);
  4036.     res0 = __msa_aver_u_b(avg0, res0);
  4037.     ST8x2_UB(res0, dst, dst_stride);
  4038.     dst += (2 * dst_stride);
  4039.  
  4040.     LD_UB2(src, src_stride, inp2, inp3);
  4041.     src += (2 * src_stride);
  4042.     horiz6 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp2, inp3,
  4043.                                            mask0, mask1, mask2, mask3,
  4044.                                            const20, const6, const3);
  4045.     horiz7 = (v16u8) __msa_splati_d((v2i64) horiz6, 1);
  4046.     res1 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz2, horiz1, horiz0, horiz0,
  4047.                                         horiz3, horiz4, horiz5, horiz6,
  4048.                                         horiz3, horiz2, horiz1, horiz0,
  4049.                                         horiz4, horiz5, horiz6, horiz7,
  4050.                                         const20, const6, const3);
  4051.     inp0 = LD_UB(src);
  4052.     horiz8 = APPLY_HORIZ_QPEL_FILTER_8BYTE_1ROW(inp0,
  4053.                                                 mask0, mask1, mask2, mask3,
  4054.                                                 const20, const6, const3);
  4055.     avg1 = (v16u8) __msa_ilvr_d((v2i64) horiz3, (v2i64) horiz2);
  4056.     res1 = __msa_aver_u_b(avg1, res1);
  4057.     res0 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz4, horiz3, horiz2, horiz1,
  4058.                                         horiz5, horiz6, horiz7, horiz8,
  4059.                                         horiz5, horiz4, horiz3, horiz2,
  4060.                                         horiz6, horiz7, horiz8, horiz8,
  4061.                                         const20, const6, const3);
  4062.     ST8x2_UB(res1, dst, dst_stride);
  4063.     dst += 2 * dst_stride;
  4064.  
  4065.     avg0 = (v16u8) __msa_ilvr_d((v2i64) horiz5, (v2i64) horiz4);
  4066.     res0 = __msa_aver_u_b(avg0, res0);
  4067.     res1 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz6, horiz5, horiz4, horiz3,
  4068.                                         horiz7, horiz8, horiz8, horiz7,
  4069.                                         horiz7, horiz6, horiz5, horiz4,
  4070.                                         horiz8, horiz8, horiz7, horiz6,
  4071.                                         const20, const6, const3);
  4072.     ST8x2_UB(res0, dst, dst_stride);
  4073.     dst += 2 * dst_stride;
  4074.     avg1 = (v16u8) __msa_ilvr_d((v2i64) horiz7, (v2i64) horiz6);
  4075.     res1 = __msa_aver_u_b(avg1, res1);
  4076.     ST8x2_UB(res1, dst, dst_stride);
  4077. }
  4078.  
  4079. static void hv_mc_qpel_aver_horiz_src1_16x16_msa(const uint8_t *src,
  4080.                                                  int32_t src_stride,
  4081.                                                  uint8_t *dst,
  4082.                                                  int32_t dst_stride,
  4083.                                                  int32_t height)
  4084. {
  4085.     uint8_t loop_count;
  4086.     v16u8 inp0, inp1, inp2, inp3, inp4, inp5, inp6, inp7;
  4087.     v16u8 res;
  4088.     v16u8 mask = { 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
  4089.     v16u8 const6 = (v16u8) __msa_ldi_b(6);
  4090.     v16u8 const3 = (v16u8) __msa_ldi_b(3);
  4091.     v8u16 const20 = (v8u16) __msa_ldi_h(20);
  4092.  
  4093.     for (loop_count = (height >> 2); loop_count--;) {
  4094.         LD_UB4(src, src_stride, inp0, inp2, inp4, inp6);
  4095.         LD_UB4((src + 1), src_stride, inp1, inp3, inp5, inp7);
  4096.         src += (4 * src_stride);
  4097.         res = APPLY_HORIZ_QPEL_FILTER(inp0, inp1, mask,
  4098.                                       const20, const6, const3);
  4099.         res = __msa_aver_u_b(res, inp1);
  4100.         ST_UB(res, dst);
  4101.         dst += dst_stride;
  4102.  
  4103.         res = APPLY_HORIZ_QPEL_FILTER(inp2, inp3, mask,
  4104.                                       const20, const6, const3);
  4105.         res = __msa_aver_u_b(res, inp3);
  4106.         ST_UB(res, dst);
  4107.         dst += dst_stride;
  4108.  
  4109.         res = APPLY_HORIZ_QPEL_FILTER(inp4, inp5, mask,
  4110.                                       const20, const6, const3);
  4111.         res = __msa_aver_u_b(res, inp5);
  4112.         ST_UB(res, dst);
  4113.         dst += dst_stride;
  4114.  
  4115.         res = APPLY_HORIZ_QPEL_FILTER(inp6, inp7, mask,
  4116.                                       const20, const6, const3);
  4117.         res = __msa_aver_u_b(res, inp7);
  4118.         ST_UB(res, dst);
  4119.         dst += dst_stride;
  4120.     }
  4121.  
  4122.     LD_UB2(src, 1, inp0, inp1);
  4123.     res = APPLY_HORIZ_QPEL_FILTER(inp0, inp1, mask, const20, const6, const3);
  4124.     res = __msa_aver_u_b(inp1, res);
  4125.     ST_UB(res, dst);
  4126. }
  4127.  
  4128. static void hv_mc_qpel_aver_hv_src10_16x16_msa(const uint8_t *src,
  4129.                                                int32_t src_stride,
  4130.                                                uint8_t *dst,
  4131.                                                int32_t dst_stride)
  4132. {
  4133.     uint8_t buff[272];
  4134.  
  4135.     hv_mc_qpel_aver_horiz_src1_16x16_msa(src, src_stride, buff, 16, 16);
  4136.     vert_mc_qpel_aver_src0_16x16_msa(buff, 16, dst, dst_stride);
  4137. }
  4138.  
  4139. static void hv_mc_qpel_aver_hv_src10_8x8_msa(const uint8_t *src,
  4140.                                              int32_t src_stride,
  4141.                                              uint8_t *dst,
  4142.                                              int32_t dst_stride)
  4143. {
  4144.     v16u8 inp0, inp1, inp2, inp3;
  4145.     v16u8 res0, res1, avg0, avg1;
  4146.     v16u8 horiz0, horiz1, horiz2, horiz3;
  4147.     v16u8 horiz4, horiz5, horiz6, horiz7, horiz8;
  4148.     v16u8 mask0 = { 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8 };
  4149.     v16u8 mask1 = { 0, 2, 0, 3, 1, 4, 2, 5, 3, 6, 4, 7, 5, 8, 6, 8 };
  4150.     v16u8 mask2 = { 1, 3, 0, 4, 0, 5, 1, 6, 2, 7, 3, 8, 4, 8, 5, 7 };
  4151.     v16u8 mask3 = { 2, 4, 1, 5, 0, 6, 0, 7, 1, 8, 2, 8, 3, 7, 4, 6 };
  4152.     v16u8 const20 = (v16u8) __msa_ldi_b(20);
  4153.     v16u8 const6 = (v16u8) __msa_ldi_b(6);
  4154.     v16u8 const3 = (v16u8) __msa_ldi_b(3);
  4155.  
  4156.     LD_UB4(src, src_stride, inp0, inp1, inp2, inp3);
  4157.     src += (4 * src_stride);
  4158.     res0 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp0, inp1, mask0, mask1, mask2, mask3,
  4159.                                          const20, const6, const3);
  4160.     res1 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp2, inp3, mask0, mask1, mask2, mask3,
  4161.                                          const20, const6, const3);
  4162.     SLDI_B2_UB(inp0, inp1, inp0, inp1, inp0, inp1, 1);
  4163.  
  4164.     inp0 = (v16u8) __msa_insve_d((v2i64) inp0, 1, (v2i64) inp1);
  4165.     horiz0 = __msa_aver_u_b(inp0, res0);
  4166.     horiz1 = (v16u8) __msa_splati_d((v2i64) horiz0, 1);
  4167.     SLDI_B2_UB(inp2, inp3, inp2, inp3, inp2, inp3, 1);
  4168.  
  4169.     inp2 = (v16u8) __msa_insve_d((v2i64) inp2, 1, (v2i64) inp3);
  4170.     horiz2 = __msa_aver_u_b(inp2, res1);
  4171.     horiz3 = (v16u8) __msa_splati_d((v2i64) horiz2, 1);
  4172.     LD_UB4(src, src_stride, inp0, inp1, inp2, inp3);
  4173.     src += (4 * src_stride);
  4174.     res0 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp0, inp1, mask0, mask1, mask2, mask3,
  4175.                                          const20, const6, const3);
  4176.     res1 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp2, inp3, mask0, mask1, mask2, mask3,
  4177.                                          const20, const6, const3);
  4178.     SLDI_B2_UB(inp0, inp1, inp0, inp1, inp0, inp1, 1);
  4179.  
  4180.     inp0 = (v16u8) __msa_insve_d((v2i64) inp0, 1, (v2i64) inp1);
  4181.     horiz4 = __msa_aver_u_b(inp0, res0);
  4182.     horiz5 = (v16u8) __msa_splati_d((v2i64) horiz4, 1);
  4183.     SLDI_B2_UB(inp2, inp3, inp2, inp3, inp2, inp3, 1);
  4184.  
  4185.     inp2 = (v16u8) __msa_insve_d((v2i64) inp2, 1, (v2i64) inp3);
  4186.     horiz6 = __msa_aver_u_b(inp2, res1);
  4187.     horiz7 = (v16u8) __msa_splati_d((v2i64) horiz6, 1);
  4188.     res0 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz0, horiz0, horiz1, horiz2,
  4189.                                         horiz1, horiz2, horiz3, horiz4,
  4190.                                         horiz1, horiz0, horiz0, horiz1,
  4191.                                         horiz2, horiz3, horiz4, horiz5,
  4192.                                         const20, const6, const3);
  4193.     avg0 = (v16u8) __msa_ilvr_d((v2i64) horiz1, (v2i64) horiz0);
  4194.     res0 = __msa_aver_u_b(avg0, res0);
  4195.     res1 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz2, horiz1, horiz0, horiz0,
  4196.                                         horiz3, horiz4, horiz5, horiz6,
  4197.                                         horiz3, horiz2, horiz1, horiz0,
  4198.                                         horiz4, horiz5, horiz6, horiz7,
  4199.                                         const20, const6, const3);
  4200.     ST8x2_UB(res0, dst, dst_stride);
  4201.     dst += 2 * dst_stride;
  4202.  
  4203.     inp0 = LD_UB(src);
  4204.     res0 = APPLY_HORIZ_QPEL_FILTER_8BYTE_1ROW(inp0, mask0, mask1, mask2, mask3,
  4205.                                               const20, const6, const3);
  4206.     avg1 = (v16u8) __msa_ilvr_d((v2i64) horiz3, (v2i64) horiz2);
  4207.     res1 = __msa_aver_u_b(avg1, res1);
  4208.     inp0 = (v16u8) __msa_sldi_b((v16i8) inp0, (v16i8) inp0, 1);
  4209.     horiz8 = __msa_aver_u_b(inp0, res0);
  4210.     res0 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz4, horiz3, horiz2, horiz1,
  4211.                                         horiz5, horiz6, horiz7, horiz8,
  4212.                                         horiz5, horiz4, horiz3, horiz2,
  4213.                                         horiz6, horiz7, horiz8, horiz8,
  4214.                                         const20, const6, const3);
  4215.     ST8x2_UB(res1, dst, dst_stride);
  4216.     dst += 2 * dst_stride;
  4217.  
  4218.     avg0 = (v16u8) __msa_ilvr_d((v2i64) horiz5, (v2i64) horiz4);
  4219.     res0 = __msa_aver_u_b(avg0, res0);
  4220.     res1 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz6, horiz5, horiz4, horiz3,
  4221.                                         horiz7, horiz8, horiz8, horiz7,
  4222.                                         horiz7, horiz6, horiz5, horiz4,
  4223.                                         horiz8, horiz8, horiz7, horiz6,
  4224.                                         const20, const6, const3);
  4225.     ST8x2_UB(res0, dst, dst_stride);
  4226.     dst += 2 * dst_stride;
  4227.  
  4228.     avg1 = (v16u8) __msa_ilvr_d((v2i64) horiz7, (v2i64) horiz6);
  4229.     res1 = __msa_aver_u_b(avg1, res1);
  4230.     ST8x2_UB(res1, dst, dst_stride);
  4231. }
  4232.  
  4233. static void hv_mc_qpel_aver_h_src0_16x16_msa(const uint8_t *src,
  4234.                                              int32_t src_stride,
  4235.                                              uint8_t *dst,
  4236.                                              int32_t dst_stride)
  4237. {
  4238.     uint8_t buff[272];
  4239.  
  4240.     hv_mc_qpel_aver_horiz_src0_16x16_msa(src, src_stride, buff, 16, 16);
  4241.     vert_mc_qpel_16x16_msa(buff, 16, dst, dst_stride);
  4242. }
  4243.  
  4244. static void hv_mc_qpel_aver_h_src0_8x8_msa(const uint8_t *src,
  4245.                                            int32_t src_stride,
  4246.                                            uint8_t *dst,
  4247.                                            int32_t dst_stride)
  4248. {
  4249.     v16u8 inp0, inp1, inp2, inp3;
  4250.     v16u8 res0, res1;
  4251.     v16u8 horiz0, horiz1, horiz2, horiz3;
  4252.     v16u8 horiz4, horiz5, horiz6, horiz7, horiz8;
  4253.     v16u8 mask0 = { 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8 };
  4254.     v16u8 mask1 = { 0, 2, 0, 3, 1, 4, 2, 5, 3, 6, 4, 7, 5, 8, 6, 8 };
  4255.     v16u8 mask2 = { 1, 3, 0, 4, 0, 5, 1, 6, 2, 7, 3, 8, 4, 8, 5, 7 };
  4256.     v16u8 mask3 = { 2, 4, 1, 5, 0, 6, 0, 7, 1, 8, 2, 8, 3, 7, 4, 6 };
  4257.     v16u8 const20 = (v16u8) __msa_ldi_b(20);
  4258.     v16u8 const6 = (v16u8) __msa_ldi_b(6);
  4259.     v16u8 const3 = (v16u8) __msa_ldi_b(3);
  4260.  
  4261.     LD_UB2(src, src_stride, inp0, inp1);
  4262.     src += (2 * src_stride);
  4263.     res0 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp0, inp1, mask0, mask1, mask2, mask3,
  4264.                                          const20, const6, const3);
  4265.     inp0 = (v16u8) __msa_ilvr_d((v2i64) inp1, (v2i64) inp0);
  4266.     horiz0 = __msa_aver_u_b(inp0, res0);
  4267.     horiz1 = (v16u8) __msa_splati_d((v2i64) horiz0, 1);
  4268.  
  4269.     LD_UB2(src, src_stride, inp2, inp3);
  4270.     src += (2 * src_stride);
  4271.     res1 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp2, inp3, mask0, mask1, mask2, mask3,
  4272.                                          const20, const6, const3);
  4273.     inp2 = (v16u8) __msa_ilvr_d((v2i64) inp3, (v2i64) inp2);
  4274.     horiz2 = __msa_aver_u_b(inp2, res1);
  4275.     horiz3 = (v16u8) __msa_splati_d((v2i64) horiz2, 1);
  4276.     LD_UB2(src, src_stride, inp0, inp1);
  4277.     src += (2 * src_stride);
  4278.     res0 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp0, inp1, mask0, mask1, mask2, mask3,
  4279.                                          const20, const6, const3);
  4280.     inp0 = (v16u8) __msa_ilvr_d((v2i64) inp1, (v2i64) inp0);
  4281.     horiz4 = __msa_aver_u_b(inp0, res0);
  4282.     horiz5 = (v16u8) __msa_splati_d((v2i64) horiz4, 1);
  4283.     res0 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz0, horiz0, horiz1, horiz2,
  4284.                                         horiz1, horiz2, horiz3, horiz4,
  4285.                                         horiz1, horiz0, horiz0, horiz1,
  4286.                                         horiz2, horiz3, horiz4, horiz5,
  4287.                                         const20, const6, const3);
  4288.     ST8x2_UB(res0, dst, dst_stride);
  4289.     dst += (2 * dst_stride);
  4290.  
  4291.     LD_UB2(src, src_stride, inp2, inp3);
  4292.     src += (2 * src_stride);
  4293.     res1 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp2, inp3, mask0, mask1, mask2, mask3,
  4294.                                          const20, const6, const3);
  4295.     inp2 = (v16u8) __msa_ilvr_d((v2i64) inp3, (v2i64) inp2);
  4296.     horiz6 = __msa_aver_u_b(inp2, res1);
  4297.     horiz7 = (v16u8) __msa_splati_d((v2i64) horiz6, 1);
  4298.     res1 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz2, horiz1, horiz0, horiz0,
  4299.                                         horiz3, horiz4, horiz5, horiz6,
  4300.                                         horiz3, horiz2, horiz1, horiz0,
  4301.                                         horiz4, horiz5, horiz6, horiz7,
  4302.                                         const20, const6, const3);
  4303.     inp0 = LD_UB(src);
  4304.     res0 = APPLY_HORIZ_QPEL_FILTER_8BYTE_1ROW(inp0, mask0, mask1, mask2, mask3,
  4305.                                               const20, const6, const3);
  4306.     horiz8 = __msa_aver_u_b(inp0, res0);
  4307.     res0 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz4, horiz3, horiz2, horiz1,
  4308.                                         horiz5, horiz6, horiz7, horiz8,
  4309.                                         horiz5, horiz4, horiz3, horiz2,
  4310.                                         horiz6, horiz7, horiz8, horiz8,
  4311.                                         const20, const6, const3);
  4312.     ST8x2_UB(res1, dst, dst_stride);
  4313.     dst += 2 * dst_stride;
  4314.  
  4315.     res1 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz6, horiz5, horiz4, horiz3,
  4316.                                         horiz7, horiz8, horiz8, horiz7,
  4317.                                         horiz7, horiz6, horiz5, horiz4,
  4318.                                         horiz8, horiz8, horiz7, horiz6,
  4319.                                         const20, const6, const3);
  4320.     ST8x2_UB(res0, dst, dst_stride);
  4321.     dst += 2 * dst_stride;
  4322.     ST8x2_UB(res1, dst, dst_stride);
  4323. }
  4324.  
  4325. static void hv_mc_qpel_16x16_msa(const uint8_t *src,
  4326.                                  int32_t src_stride,
  4327.                                  uint8_t *dst,
  4328.                                  int32_t dst_stride)
  4329. {
  4330.     uint8_t buff[272];
  4331.  
  4332.     hv_mc_qpel_aver_horiz_16x16_msa(src, src_stride, buff, 16, 16);
  4333.     vert_mc_qpel_16x16_msa(buff, 16, dst, dst_stride);
  4334. }
  4335.  
  4336. static void hv_mc_qpel_8x8_msa(const uint8_t *src, int32_t src_stride,
  4337.                                uint8_t *dst, int32_t dst_stride)
  4338. {
  4339.     v16u8 inp0, inp1, inp2, inp3;
  4340.     v16u8 res0, res1;
  4341.     v16u8 horiz0, horiz1, horiz2, horiz3;
  4342.     v16u8 horiz4, horiz5, horiz6, horiz7, horiz8;
  4343.     v16u8 mask0 = { 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8 };
  4344.     v16u8 mask1 = { 0, 2, 0, 3, 1, 4, 2, 5, 3, 6, 4, 7, 5, 8, 6, 8 };
  4345.     v16u8 mask2 = { 1, 3, 0, 4, 0, 5, 1, 6, 2, 7, 3, 8, 4, 8, 5, 7 };
  4346.     v16u8 mask3 = { 2, 4, 1, 5, 0, 6, 0, 7, 1, 8, 2, 8, 3, 7, 4, 6 };
  4347.     v16u8 const20 = (v16u8) __msa_ldi_b(20);
  4348.     v16u8 const6 = (v16u8) __msa_ldi_b(6);
  4349.     v16u8 const3 = (v16u8) __msa_ldi_b(3);
  4350.  
  4351.     LD_UB2(src, src_stride, inp0, inp1);
  4352.     src += (2 * src_stride);
  4353.     horiz0 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp0, inp1,
  4354.                                            mask0, mask1, mask2, mask3,
  4355.                                            const20, const6, const3);
  4356.     horiz1 = (v16u8) __msa_splati_d((v2i64) horiz0, 1);
  4357.     LD_UB2(src, src_stride, inp2, inp3);
  4358.     src += (2 * src_stride);
  4359.     horiz2 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp2, inp3,
  4360.                                            mask0, mask1, mask2, mask3,
  4361.                                            const20, const6, const3);
  4362.     horiz3 = (v16u8) __msa_splati_d((v2i64) horiz2, 1);
  4363.     LD_UB2(src, src_stride, inp0, inp1);
  4364.     src += (2 * src_stride);
  4365.     horiz4 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp0, inp1,
  4366.                                            mask0, mask1, mask2, mask3,
  4367.                                            const20, const6, const3);
  4368.     horiz5 = (v16u8) __msa_splati_d((v2i64) horiz4, 1);
  4369.     res0 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz0, horiz0, horiz1, horiz2,
  4370.                                         horiz1, horiz2, horiz3, horiz4,
  4371.                                         horiz1, horiz0, horiz0, horiz1,
  4372.                                         horiz2, horiz3, horiz4, horiz5,
  4373.                                         const20, const6, const3);
  4374.     ST8x2_UB(res0, dst, dst_stride);
  4375.     dst += (2 * dst_stride);
  4376.  
  4377.     LD_UB2(src, src_stride, inp2, inp3);
  4378.     src += (2 * src_stride);
  4379.     horiz6 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp2, inp3,
  4380.                                            mask0, mask1, mask2, mask3,
  4381.                                            const20, const6, const3);
  4382.     horiz7 = (v16u8) __msa_splati_d((v2i64) horiz6, 1);
  4383.     res1 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz2, horiz1, horiz0, horiz0,
  4384.                                         horiz3, horiz4, horiz5, horiz6,
  4385.                                         horiz3, horiz2, horiz1, horiz0,
  4386.                                         horiz4, horiz5, horiz6, horiz7,
  4387.                                         const20, const6, const3);
  4388.     inp0 = LD_UB(src);
  4389.     horiz8 = APPLY_HORIZ_QPEL_FILTER_8BYTE_1ROW(inp0,
  4390.                                                 mask0, mask1, mask2, mask3,
  4391.                                                 const20, const6, const3);
  4392.     ST8x2_UB(res1, dst, dst_stride);
  4393.     dst += 2 * dst_stride;
  4394.  
  4395.     res0 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz4, horiz3, horiz2, horiz1,
  4396.                                         horiz5, horiz6, horiz7, horiz8,
  4397.                                         horiz5, horiz4, horiz3, horiz2,
  4398.                                         horiz6, horiz7, horiz8, horiz8,
  4399.                                         const20, const6, const3);
  4400.     res1 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz6, horiz5, horiz4, horiz3,
  4401.                                         horiz7, horiz8, horiz8, horiz7,
  4402.                                         horiz7, horiz6, horiz5, horiz4,
  4403.                                         horiz8, horiz8, horiz7, horiz6,
  4404.                                         const20, const6, const3);
  4405.     ST8x2_UB(res0, dst, dst_stride);
  4406.     dst += 2 * dst_stride;
  4407.     ST8x2_UB(res1, dst, dst_stride);
  4408. }
  4409.  
  4410. static void hv_mc_qpel_aver_h_src1_16x16_msa(const uint8_t *src,
  4411.                                              int32_t src_stride,
  4412.                                              uint8_t *dst,
  4413.                                              int32_t dst_stride)
  4414. {
  4415.     uint8_t buff[272];
  4416.  
  4417.     hv_mc_qpel_aver_horiz_src1_16x16_msa(src, src_stride, buff, 16, 16);
  4418.     vert_mc_qpel_16x16_msa(buff, 16, dst, dst_stride);
  4419. }
  4420.  
  4421. static void hv_mc_qpel_aver_h_src1_8x8_msa(const uint8_t *src,
  4422.                                            int32_t src_stride,
  4423.                                            uint8_t *dst,
  4424.                                            int32_t dst_stride)
  4425. {
  4426.     v16u8 inp0, inp1, inp2, inp3;
  4427.     v16u8 res0, res1;
  4428.     v16u8 horiz0, horiz1, horiz2, horiz3;
  4429.     v16u8 horiz4, horiz5, horiz6, horiz7, horiz8;
  4430.     v16u8 mask0 = { 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8 };
  4431.     v16u8 mask1 = { 0, 2, 0, 3, 1, 4, 2, 5, 3, 6, 4, 7, 5, 8, 6, 8 };
  4432.     v16u8 mask2 = { 1, 3, 0, 4, 0, 5, 1, 6, 2, 7, 3, 8, 4, 8, 5, 7 };
  4433.     v16u8 mask3 = { 2, 4, 1, 5, 0, 6, 0, 7, 1, 8, 2, 8, 3, 7, 4, 6 };
  4434.     v16u8 const20 = (v16u8) __msa_ldi_b(20);
  4435.     v16u8 const6 = (v16u8) __msa_ldi_b(6);
  4436.     v16u8 const3 = (v16u8) __msa_ldi_b(3);
  4437.  
  4438.     LD_UB4(src, src_stride, inp0, inp1, inp2, inp3);
  4439.     src += (4 * src_stride);
  4440.  
  4441.     res0 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp0, inp1, mask0, mask1, mask2, mask3,
  4442.                                          const20, const6, const3);
  4443.     res1 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp2, inp3, mask0, mask1, mask2, mask3,
  4444.                                          const20, const6, const3);
  4445.     SLDI_B2_UB(inp0, inp1, inp0, inp1, inp0, inp1, 1);
  4446.  
  4447.     inp0 = (v16u8) __msa_insve_d((v2i64) inp0, 1, (v2i64) inp1);
  4448.     horiz0 = __msa_aver_u_b(inp0, res0);
  4449.     horiz1 = (v16u8) __msa_splati_d((v2i64) horiz0, 1);
  4450.     SLDI_B2_UB(inp2, inp3, inp2, inp3, inp2, inp3, 1);
  4451.  
  4452.     inp2 = (v16u8) __msa_insve_d((v2i64) inp2, 1, (v2i64) inp3);
  4453.     horiz2 = __msa_aver_u_b(inp2, res1);
  4454.     horiz3 = (v16u8) __msa_splati_d((v2i64) horiz2, 1);
  4455.     LD_UB4(src, src_stride, inp0, inp1, inp2, inp3);
  4456.     src += (4 * src_stride);
  4457.     res0 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp0, inp1, mask0, mask1, mask2, mask3,
  4458.                                          const20, const6, const3);
  4459.     res1 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp2, inp3, mask0, mask1, mask2, mask3,
  4460.                                          const20, const6, const3);
  4461.     SLDI_B2_UB(inp0, inp1, inp0, inp1, inp0, inp1, 1);
  4462.  
  4463.     inp0 = (v16u8) __msa_insve_d((v2i64) inp0, 1, (v2i64) inp1);
  4464.     horiz4 = __msa_aver_u_b(inp0, res0);
  4465.     horiz5 = (v16u8) __msa_splati_d((v2i64) horiz4, 1);
  4466.     SLDI_B2_UB(inp2, inp3, inp2, inp3, inp2, inp3, 1);
  4467.  
  4468.     inp2 = (v16u8) __msa_insve_d((v2i64) inp2, 1, (v2i64) inp3);
  4469.     horiz6 = __msa_aver_u_b(inp2, res1);
  4470.     horiz7 = (v16u8) __msa_splati_d((v2i64) horiz6, 1);
  4471.     inp0 = LD_UB(src);
  4472.     res0 = APPLY_HORIZ_QPEL_FILTER_8BYTE_1ROW(inp0, mask0, mask1, mask2, mask3,
  4473.                                               const20, const6, const3);
  4474.     inp0 = (v16u8) __msa_sldi_b((v16i8) inp0, (v16i8) inp0, 1);
  4475.     horiz8 = __msa_aver_u_b(inp0, res0);
  4476.     res0 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz0, horiz0, horiz1, horiz2,
  4477.                                         horiz1, horiz2, horiz3, horiz4,
  4478.                                         horiz1, horiz0, horiz0, horiz1,
  4479.                                         horiz2, horiz3, horiz4, horiz5,
  4480.                                         const20, const6, const3);
  4481.     ST8x2_UB(res0, dst, dst_stride);
  4482.     dst += (2 * dst_stride);
  4483.  
  4484.     res1 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz2, horiz1, horiz0, horiz0,
  4485.                                         horiz3, horiz4, horiz5, horiz6,
  4486.                                         horiz3, horiz2, horiz1, horiz0,
  4487.                                         horiz4, horiz5, horiz6, horiz7,
  4488.                                         const20, const6, const3);
  4489.     ST8x2_UB(res1, dst, dst_stride);
  4490.     dst += (2 * dst_stride);
  4491.  
  4492.     res0 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz4, horiz3, horiz2, horiz1,
  4493.                                         horiz5, horiz6, horiz7, horiz8,
  4494.                                         horiz5, horiz4, horiz3, horiz2,
  4495.                                         horiz6, horiz7, horiz8, horiz8,
  4496.                                         const20, const6, const3);
  4497.     ST8x2_UB(res0, dst, dst_stride);
  4498.     dst += (2 * dst_stride);
  4499.  
  4500.     res1 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz6, horiz5, horiz4, horiz3,
  4501.                                         horiz7, horiz8, horiz8, horiz7,
  4502.                                         horiz7, horiz6, horiz5, horiz4,
  4503.                                         horiz8, horiz8, horiz7, horiz6,
  4504.                                         const20, const6, const3);
  4505.     ST8x2_UB(res1, dst, dst_stride);
  4506. }
  4507.  
  4508. static void hv_mc_qpel_aver_hv_src01_16x16_msa(const uint8_t *src,
  4509.                                                int32_t src_stride,
  4510.                                                uint8_t *dst,
  4511.                                                int32_t dst_stride)
  4512. {
  4513.     uint8_t buff[272];
  4514.  
  4515.     hv_mc_qpel_aver_horiz_src0_16x16_msa(src, src_stride, buff, 16, 16);
  4516.     vert_mc_qpel_aver_src1_16x16_msa(buff, 16, dst, dst_stride);
  4517. }
  4518.  
  4519. static void hv_mc_qpel_aver_hv_src01_8x8_msa(const uint8_t *src,
  4520.                                              int32_t src_stride,
  4521.                                              uint8_t *dst,
  4522.                                              int32_t dst_stride)
  4523. {
  4524.     v16u8 inp0, inp1, inp2, inp3;
  4525.     v16u8 res0, res1, avg0, avg1;
  4526.     v16u8 horiz0, horiz1, horiz2, horiz3;
  4527.     v16u8 horiz4, horiz5, horiz6, horiz7, horiz8;
  4528.     v16u8 mask0 = { 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8 };
  4529.     v16u8 mask1 = { 0, 2, 0, 3, 1, 4, 2, 5, 3, 6, 4, 7, 5, 8, 6, 8 };
  4530.     v16u8 mask2 = { 1, 3, 0, 4, 0, 5, 1, 6, 2, 7, 3, 8, 4, 8, 5, 7 };
  4531.     v16u8 mask3 = { 2, 4, 1, 5, 0, 6, 0, 7, 1, 8, 2, 8, 3, 7, 4, 6 };
  4532.     v16u8 const20 = (v16u8) __msa_ldi_b(20);
  4533.     v16u8 const6 = (v16u8) __msa_ldi_b(6);
  4534.     v16u8 const3 = (v16u8) __msa_ldi_b(3);
  4535.  
  4536.     LD_UB4(src, src_stride, inp0, inp1, inp2, inp3);
  4537.     src += (4 * src_stride);
  4538.  
  4539.     res0 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp0, inp1, mask0, mask1, mask2, mask3,
  4540.                                          const20, const6, const3);
  4541.     res1 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp2, inp3, mask0, mask1, mask2, mask3,
  4542.                                          const20, const6, const3);
  4543.     inp0 = (v16u8) __msa_ilvr_d((v2i64) inp1, (v2i64) inp0);
  4544.     horiz0 = __msa_aver_u_b(inp0, res0);
  4545.     horiz1 = (v16u8) __msa_splati_d((v2i64) horiz0, 1);
  4546.     inp2 = (v16u8) __msa_ilvr_d((v2i64) inp3, (v2i64) inp2);
  4547.     horiz2 = __msa_aver_u_b(inp2, res1);
  4548.     horiz3 = (v16u8) __msa_splati_d((v2i64) horiz2, 1);
  4549.     LD_UB2(src, src_stride, inp0, inp1);
  4550.     src += (2 * src_stride);
  4551.  
  4552.     res0 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp0, inp1, mask0, mask1, mask2, mask3,
  4553.                                          const20, const6, const3);
  4554.     inp0 = (v16u8) __msa_ilvr_d((v2i64) inp1, (v2i64) inp0);
  4555.     horiz4 = __msa_aver_u_b(inp0, res0);
  4556.     horiz5 = (v16u8) __msa_splati_d((v2i64) horiz4, 1);
  4557.     res0 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz0, horiz0, horiz1, horiz2,
  4558.                                         horiz1, horiz2, horiz3, horiz4,
  4559.                                         horiz1, horiz0, horiz0, horiz1,
  4560.                                         horiz2, horiz3, horiz4, horiz5,
  4561.                                         const20, const6, const3);
  4562.     avg0 = (v16u8) __msa_insve_d((v2i64) horiz1, 1, (v2i64) horiz2);
  4563.     res0 = __msa_aver_u_b(avg0, res0);
  4564.     ST8x2_UB(res0, dst, dst_stride);
  4565.     dst += (2 * dst_stride);
  4566.  
  4567.     LD_UB2(src, src_stride, inp2, inp3);
  4568.     src += (2 * src_stride);
  4569.     res1 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp2, inp3, mask0, mask1, mask2, mask3,
  4570.                                          const20, const6, const3);
  4571.     inp2 = (v16u8) __msa_ilvr_d((v2i64) inp3, (v2i64) inp2);
  4572.     horiz6 = __msa_aver_u_b(inp2, res1);
  4573.     horiz7 = (v16u8) __msa_splati_d((v2i64) horiz6, 1);
  4574.     inp0 = LD_UB(src);
  4575.     res0 = APPLY_HORIZ_QPEL_FILTER_8BYTE_1ROW(inp0, mask0, mask1, mask2, mask3,
  4576.                                               const20, const6, const3);
  4577.     horiz8 = __msa_aver_u_b(inp0, res0);
  4578.     res1 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz2, horiz1, horiz0, horiz0,
  4579.                                         horiz3, horiz4, horiz5, horiz6,
  4580.                                         horiz3, horiz2, horiz1, horiz0,
  4581.                                         horiz4, horiz5, horiz6, horiz7,
  4582.                                         const20, const6, const3);
  4583.     avg1 = (v16u8) __msa_insve_d((v2i64) horiz3, 1, (v2i64) horiz4);
  4584.     res1 = __msa_aver_u_b(avg1, res1);
  4585.     res0 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz4, horiz3, horiz2, horiz1,
  4586.                                         horiz5, horiz6, horiz7, horiz8,
  4587.                                         horiz5, horiz4, horiz3, horiz2,
  4588.                                         horiz6, horiz7, horiz8, horiz8,
  4589.                                         const20, const6, const3);
  4590.     ST8x2_UB(res1, dst, dst_stride);
  4591.     dst += 2 * dst_stride;
  4592.  
  4593.     avg0 = (v16u8) __msa_insve_d((v2i64) horiz5, 1, (v2i64) horiz6);
  4594.     res0 = __msa_aver_u_b(avg0, res0);
  4595.     res1 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz6, horiz5, horiz4, horiz3,
  4596.                                         horiz7, horiz8, horiz8, horiz7,
  4597.                                         horiz7, horiz6, horiz5, horiz4,
  4598.                                         horiz8, horiz8, horiz7, horiz6,
  4599.                                         const20, const6, const3);
  4600.     ST8x2_UB(res0, dst, dst_stride);
  4601.     dst += 2 * dst_stride;
  4602.  
  4603.     avg1 = (v16u8) __msa_insve_d((v2i64) horiz7, 1, (v2i64) horiz8);
  4604.     res1 = __msa_aver_u_b(avg1, res1);
  4605.     ST8x2_UB(res1, dst, dst_stride);
  4606.     dst += (2 * dst_stride);
  4607. }
  4608.  
  4609. static void hv_mc_qpel_aver_v_src1_16x16_msa(const uint8_t *src,
  4610.                                              int32_t src_stride,
  4611.                                              uint8_t *dst,
  4612.                                              int32_t dst_stride)
  4613. {
  4614.     uint8_t buff[272];
  4615.  
  4616.     hv_mc_qpel_aver_horiz_16x16_msa(src, src_stride, buff, 16, 16);
  4617.     vert_mc_qpel_aver_src1_16x16_msa(buff, 16, dst, dst_stride);
  4618. }
  4619.  
  4620. static void hv_mc_qpel_aver_v_src1_8x8_msa(const uint8_t *src,
  4621.                                            int32_t src_stride,
  4622.                                            uint8_t *dst,
  4623.                                            int32_t dst_stride)
  4624. {
  4625.     v16u8 inp0, inp1, inp2, inp3;
  4626.     v16u8 res0, res1, avg0, avg1;
  4627.     v16u8 horiz0, horiz1, horiz2, horiz3;
  4628.     v16u8 horiz4, horiz5, horiz6, horiz7, horiz8;
  4629.     v16u8 mask0 = { 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8 };
  4630.     v16u8 mask1 = { 0, 2, 0, 3, 1, 4, 2, 5, 3, 6, 4, 7, 5, 8, 6, 8 };
  4631.     v16u8 mask2 = { 1, 3, 0, 4, 0, 5, 1, 6, 2, 7, 3, 8, 4, 8, 5, 7 };
  4632.     v16u8 mask3 = { 2, 4, 1, 5, 0, 6, 0, 7, 1, 8, 2, 8, 3, 7, 4, 6 };
  4633.     v16u8 const20 = (v16u8) __msa_ldi_b(20);
  4634.     v16u8 const6 = (v16u8) __msa_ldi_b(6);
  4635.     v16u8 const3 = (v16u8) __msa_ldi_b(3);
  4636.  
  4637.     LD_UB2(src, src_stride, inp0, inp1);
  4638.     src += (2 * src_stride);
  4639.     horiz0 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp0, inp1,
  4640.                                            mask0, mask1, mask2, mask3,
  4641.                                            const20, const6, const3);
  4642.     horiz1 = (v16u8) __msa_splati_d((v2i64) horiz0, 1);
  4643.     LD_UB2(src, src_stride, inp2, inp3);
  4644.     src += (2 * src_stride);
  4645.     horiz2 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp2, inp3,
  4646.                                            mask0, mask1, mask2, mask3,
  4647.                                            const20, const6, const3);
  4648.     horiz3 = (v16u8) __msa_splati_d((v2i64) horiz2, 1);
  4649.     LD_UB2(src, src_stride, inp0, inp1);
  4650.     src += (2 * src_stride);
  4651.     horiz4 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp0, inp1,
  4652.                                            mask0, mask1, mask2, mask3,
  4653.                                            const20, const6, const3);
  4654.     horiz5 = (v16u8) __msa_splati_d((v2i64) horiz4, 1);
  4655.     horiz5 = (v16u8) __msa_splati_d((v2i64) horiz4, 1);
  4656.     res0 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz0, horiz0, horiz1, horiz2,
  4657.                                         horiz1, horiz2, horiz3, horiz4,
  4658.                                         horiz1, horiz0, horiz0, horiz1,
  4659.                                         horiz2, horiz3, horiz4, horiz5,
  4660.                                         const20, const6, const3);
  4661.     avg0 = (v16u8) __msa_insve_d((v2i64) horiz1, 1, (v2i64) horiz2);
  4662.     res0 = __msa_aver_u_b(avg0, res0);
  4663.     ST8x2_UB(res0, dst, dst_stride);
  4664.     dst += (2 * dst_stride);
  4665.  
  4666.     LD_UB2(src, src_stride, inp2, inp3);
  4667.     src += (2 * src_stride);
  4668.     horiz6 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp2, inp3,
  4669.                                            mask0, mask1, mask2, mask3,
  4670.                                            const20, const6, const3);
  4671.     horiz7 = (v16u8) __msa_splati_d((v2i64) horiz6, 1);
  4672.     res1 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz2, horiz1, horiz0, horiz0,
  4673.                                         horiz3, horiz4, horiz5, horiz6,
  4674.                                         horiz3, horiz2, horiz1, horiz0,
  4675.                                         horiz4, horiz5, horiz6, horiz7,
  4676.                                         const20, const6, const3);
  4677.     inp0 = LD_UB(src);
  4678.     horiz8 = APPLY_HORIZ_QPEL_FILTER_8BYTE_1ROW(inp0,
  4679.                                                 mask0, mask1, mask2, mask3,
  4680.                                                 const20, const6, const3);
  4681.     avg1 = (v16u8) __msa_insve_d((v2i64) horiz3, 1, (v2i64) horiz4);
  4682.     res1 = __msa_aver_u_b(avg1, res1);
  4683.     res0 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz4, horiz3, horiz2, horiz1,
  4684.                                         horiz5, horiz6, horiz7, horiz8,
  4685.                                         horiz5, horiz4, horiz3, horiz2,
  4686.                                         horiz6, horiz7, horiz8, horiz8,
  4687.                                         const20, const6, const3);
  4688.     ST8x2_UB(res1, dst, dst_stride);
  4689.     dst += 2 * dst_stride;
  4690.     avg0 = (v16u8) __msa_insve_d((v2i64) horiz5, 1, (v2i64) horiz6);
  4691.     res0 = __msa_aver_u_b(avg0, res0);
  4692.  
  4693.     res1 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz6, horiz5, horiz4, horiz3,
  4694.                                         horiz7, horiz8, horiz8, horiz7,
  4695.                                         horiz7, horiz6, horiz5, horiz4,
  4696.                                         horiz8, horiz8, horiz7, horiz6,
  4697.                                         const20, const6, const3);
  4698.     ST8x2_UB(res0, dst, dst_stride);
  4699.     dst += 2 * dst_stride;
  4700.     avg1 = (v16u8) __msa_insve_d((v2i64) horiz7, 1, (v2i64) horiz8);
  4701.     res1 = __msa_aver_u_b(avg1, res1);
  4702.     ST8x2_UB(res1, dst, dst_stride);
  4703. }
  4704.  
  4705. static void hv_mc_qpel_aver_hv_src11_16x16_msa(const uint8_t *src,
  4706.                                                int32_t src_stride,
  4707.                                                uint8_t *dst,
  4708.                                                int32_t dst_stride)
  4709. {
  4710.     uint8_t buff[272];
  4711.  
  4712.     hv_mc_qpel_aver_horiz_src1_16x16_msa(src, src_stride, buff, 16, 16);
  4713.     vert_mc_qpel_aver_src1_16x16_msa(buff, 16, dst, dst_stride);
  4714. }
  4715.  
  4716. static void hv_mc_qpel_aver_hv_src11_8x8_msa(const uint8_t *src,
  4717.                                              int32_t src_stride,
  4718.                                              uint8_t *dst, int32_t dst_stride)
  4719. {
  4720.     v16u8 inp0, inp1, inp2, inp3;
  4721.     v16u8 res0, res1, avg0, avg1;
  4722.     v16u8 horiz0, horiz1, horiz2, horiz3;
  4723.     v16u8 horiz4, horiz5, horiz6, horiz7, horiz8;
  4724.     v16u8 mask0 = { 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8 };
  4725.     v16u8 mask1 = { 0, 2, 0, 3, 1, 4, 2, 5, 3, 6, 4, 7, 5, 8, 6, 8 };
  4726.     v16u8 mask2 = { 1, 3, 0, 4, 0, 5, 1, 6, 2, 7, 3, 8, 4, 8, 5, 7 };
  4727.     v16u8 mask3 = { 2, 4, 1, 5, 0, 6, 0, 7, 1, 8, 2, 8, 3, 7, 4, 6 };
  4728.     v16u8 const20 = (v16u8) __msa_ldi_b(20);
  4729.     v16u8 const6 = (v16u8) __msa_ldi_b(6);
  4730.     v16u8 const3 = (v16u8) __msa_ldi_b(3);
  4731.  
  4732.     LD_UB4(src, src_stride, inp0, inp1, inp2, inp3);
  4733.     src += (4 * src_stride);
  4734.     res0 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp0, inp1,
  4735.                                          mask0, mask1, mask2, mask3,
  4736.                                          const20, const6, const3);
  4737.     SLDI_B2_UB(inp0, inp1, inp0, inp1, inp0, inp1, 1);
  4738.  
  4739.     inp0 = (v16u8) __msa_insve_d((v2i64) inp0, 1, (v2i64) inp1);
  4740.     horiz0 = __msa_aver_u_b(inp0, res0);
  4741.     horiz1 = (v16u8) __msa_splati_d((v2i64) horiz0, 1);
  4742.     res1 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp2, inp3, mask0, mask1, mask2, mask3,
  4743.                                          const20, const6, const3);
  4744.     SLDI_B2_UB(inp2, inp3, inp2, inp3, inp2, inp3, 1);
  4745.  
  4746.     inp2 = (v16u8) __msa_insve_d((v2i64) inp2, 1, (v2i64) inp3);
  4747.     horiz2 = __msa_aver_u_b(inp2, res1);
  4748.     horiz3 = (v16u8) __msa_splati_d((v2i64) horiz2, 1);
  4749.     LD_UB2(src, src_stride, inp0, inp1);
  4750.     src += (2 * src_stride);
  4751.     res0 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp0, inp1, mask0, mask1, mask2, mask3,
  4752.                                          const20, const6, const3);
  4753.     SLDI_B2_UB(inp0, inp1, inp0, inp1, inp0, inp1, 1);
  4754.  
  4755.     inp0 = (v16u8) __msa_insve_d((v2i64) inp0, 1, (v2i64) inp1);
  4756.     horiz4 = __msa_aver_u_b(inp0, res0);
  4757.     horiz5 = (v16u8) __msa_splati_d((v2i64) horiz4, 1);
  4758.     res0 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz0, horiz0, horiz1, horiz2,
  4759.                                         horiz1, horiz2, horiz3, horiz4,
  4760.                                         horiz1, horiz0, horiz0, horiz1,
  4761.                                         horiz2, horiz3, horiz4, horiz5,
  4762.                                         const20, const6, const3);
  4763.     avg0 = (v16u8) __msa_ilvr_d((v2i64) horiz2, (v2i64) horiz1);
  4764.     res0 = __msa_aver_u_b(avg0, res0);
  4765.     LD_UB2(src, src_stride, inp2, inp3);
  4766.     src += (2 * src_stride);
  4767.     ST8x2_UB(res0, dst, dst_stride);
  4768.     dst += 2 * dst_stride;
  4769.  
  4770.     res1 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp2, inp3, mask0, mask1, mask2, mask3,
  4771.                                          const20, const6, const3);
  4772.     SLDI_B2_UB(inp2, inp3, inp2, inp3, inp2, inp3, 1);
  4773.  
  4774.     inp2 = (v16u8) __msa_insve_d((v2i64) inp2, 1, (v2i64) inp3);
  4775.     horiz6 = __msa_aver_u_b(inp2, res1);
  4776.     horiz7 = (v16u8) __msa_splati_d((v2i64) horiz6, 1);
  4777.     res1 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz2, horiz1, horiz0, horiz0,
  4778.                                         horiz3, horiz4, horiz5, horiz6,
  4779.                                         horiz3, horiz2, horiz1, horiz0,
  4780.                                         horiz4, horiz5, horiz6, horiz7,
  4781.                                         const20, const6, const3);
  4782.     avg1 = (v16u8) __msa_ilvr_d((v2i64) horiz4, (v2i64) horiz3);
  4783.     res1 = __msa_aver_u_b(avg1, res1);
  4784.     inp0 = LD_UB(src);
  4785.     res0 = APPLY_HORIZ_QPEL_FILTER_8BYTE_1ROW(inp0, mask0, mask1, mask2, mask3,
  4786.                                               const20, const6, const3);
  4787.     inp0 = (v16u8) __msa_sldi_b((v16i8) inp0, (v16i8) inp0, 1);
  4788.     horiz8 = __msa_aver_u_b(inp0, res0);
  4789.     res0 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz4, horiz3, horiz2, horiz1,
  4790.                                         horiz5, horiz6, horiz7, horiz8,
  4791.                                         horiz5, horiz4, horiz3, horiz2,
  4792.                                         horiz6, horiz7, horiz8, horiz8,
  4793.                                         const20, const6, const3);
  4794.     ST8x2_UB(res1, dst, dst_stride);
  4795.     dst += 2 * dst_stride;
  4796.  
  4797.     avg0 = (v16u8) __msa_ilvr_d((v2i64) horiz6, (v2i64) horiz5);
  4798.     res0 = __msa_aver_u_b(avg0, res0);
  4799.     res1 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz6, horiz5, horiz4, horiz3,
  4800.                                         horiz7, horiz8, horiz8, horiz7,
  4801.                                         horiz7, horiz6, horiz5, horiz4,
  4802.                                         horiz8, horiz8, horiz7, horiz6,
  4803.                                         const20, const6, const3);
  4804.     ST8x2_UB(res0, dst, dst_stride);
  4805.     dst += 2 * dst_stride;
  4806.  
  4807.     avg1 = (v16u8) __msa_ilvr_d((v2i64) horiz8, (v2i64) horiz7);
  4808.     res1 = __msa_aver_u_b(avg1, res1);
  4809.     ST8x2_UB(res1, dst, dst_stride);
  4810. }
  4811.  
  4812. static void hv_mc_qpel_avg_dst_aver_hv_src00_16x16_msa(const uint8_t *src,
  4813.                                                        int32_t src_stride,
  4814.                                                        uint8_t *dst,
  4815.                                                        int32_t dst_stride)
  4816. {
  4817.     uint8_t buff[272];
  4818.  
  4819.     hv_mc_qpel_aver_horiz_src0_16x16_msa(src, src_stride, buff, 16, 16);
  4820.     vert_mc_qpel_avg_dst_aver_src0_16x16_msa(buff, 16, dst, dst_stride);
  4821. }
  4822.  
  4823. static void hv_mc_qpel_avg_dst_aver_hv_src00_8x8_msa(const uint8_t *src,
  4824.                                                      int32_t src_stride,
  4825.                                                      uint8_t *dst,
  4826.                                                      int32_t dst_stride)
  4827. {
  4828.     v16u8 inp0, inp1, inp2, inp3;
  4829.     v16u8 res0, res1, avg0, avg1;
  4830.     v16u8 horiz0, horiz1, horiz2, horiz3;
  4831.     v16u8 horiz4, horiz5, horiz6, horiz7, horiz8;
  4832.     v16u8 dst0, dst1;
  4833.     v16u8 mask0 = { 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8 };
  4834.     v16u8 mask1 = { 0, 2, 0, 3, 1, 4, 2, 5, 3, 6, 4, 7, 5, 8, 6, 8 };
  4835.     v16u8 mask2 = { 1, 3, 0, 4, 0, 5, 1, 6, 2, 7, 3, 8, 4, 8, 5, 7 };
  4836.     v16u8 mask3 = { 2, 4, 1, 5, 0, 6, 0, 7, 1, 8, 2, 8, 3, 7, 4, 6 };
  4837.     v16u8 const20 = (v16u8) __msa_ldi_b(20);
  4838.     v16u8 const6 = (v16u8) __msa_ldi_b(6);
  4839.     v16u8 const3 = (v16u8) __msa_ldi_b(3);
  4840.  
  4841.     LD_UB2(src, src_stride, inp0, inp1);
  4842.     src += (2 * src_stride);
  4843.     res0 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp0, inp1, mask0, mask1, mask2, mask3,
  4844.                                          const20, const6, const3);
  4845.     LD_UB2(src, src_stride, inp2, inp3);
  4846.     src += (2 * src_stride);
  4847.     inp0 = (v16u8) __msa_ilvr_d((v2i64) inp1, (v2i64) inp0);
  4848.     horiz0 = __msa_aver_u_b(inp0, res0);
  4849.     horiz1 = (v16u8) __msa_splati_d((v2i64) horiz0, 1);
  4850.     res1 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp2, inp3, mask0, mask1, mask2, mask3,
  4851.                                          const20, const6, const3);
  4852.     LD_UB2(src, src_stride, inp0, inp1);
  4853.     src += (2 * src_stride);
  4854.     inp2 = (v16u8) __msa_ilvr_d((v2i64) inp3, (v2i64) inp2);
  4855.     horiz2 = __msa_aver_u_b(inp2, res1);
  4856.     horiz3 = (v16u8) __msa_splati_d((v2i64) horiz2, 1);
  4857.     res0 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp0, inp1, mask0, mask1, mask2, mask3,
  4858.                                          const20, const6, const3);
  4859.     inp0 = (v16u8) __msa_ilvr_d((v2i64) inp1, (v2i64) inp0);
  4860.     horiz4 = __msa_aver_u_b(inp0, res0);
  4861.     horiz5 = (v16u8) __msa_splati_d((v2i64) horiz4, 1);
  4862.     LD_UB2(dst, dst_stride, dst0, dst1);
  4863.     avg0 = (v16u8) __msa_ilvr_d((v2i64) horiz1, (v2i64) horiz0);
  4864.     res0 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz0, horiz0, horiz1, horiz2,
  4865.                                         horiz1, horiz2, horiz3, horiz4,
  4866.                                         horiz1, horiz0, horiz0, horiz1,
  4867.                                         horiz2, horiz3, horiz4, horiz5,
  4868.                                         const20, const6, const3);
  4869.     res0 = __msa_aver_u_b(avg0, res0);
  4870.     avg0 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
  4871.     res0 = __msa_aver_u_b(avg0, res0);
  4872.     ST8x2_UB(res0, dst, dst_stride);
  4873.     dst += (2 * dst_stride);
  4874.  
  4875.     LD_UB2(src, src_stride, inp2, inp3);
  4876.     src += (2 * src_stride);
  4877.     res1 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp2, inp3, mask0, mask1, mask2, mask3,
  4878.                                          const20, const6, const3);
  4879.     inp2 = (v16u8) __msa_ilvr_d((v2i64) inp3, (v2i64) inp2);
  4880.     horiz6 = __msa_aver_u_b(inp2, res1);
  4881.     horiz7 = (v16u8) __msa_splati_d((v2i64) horiz6, 1);
  4882.     LD_UB2(dst, dst_stride, dst0, dst1);
  4883.     avg1 = (v16u8) __msa_ilvr_d((v2i64) horiz3, (v2i64) horiz2);
  4884.     res1 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz2, horiz1, horiz0, horiz0,
  4885.                                         horiz3, horiz4, horiz5, horiz6,
  4886.                                         horiz3, horiz2, horiz1, horiz0,
  4887.                                         horiz4, horiz5, horiz6, horiz7,
  4888.                                         const20, const6, const3);
  4889.     res1 = __msa_aver_u_b(avg1, res1);
  4890.     avg1 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
  4891.     res1 = __msa_aver_u_b(avg1, res1);
  4892.     ST8x2_UB(res1, dst, dst_stride);
  4893.     dst += (2 * dst_stride);
  4894.  
  4895.     inp0 = LD_UB(src);
  4896.     res0 = APPLY_HORIZ_QPEL_FILTER_8BYTE_1ROW(inp0, mask0, mask1, mask2, mask3,
  4897.                                               const20, const6, const3);
  4898.     horiz8 = __msa_aver_u_b(inp0, res0);
  4899.     LD_UB2(dst, dst_stride, dst0, dst1);
  4900.     avg0 = (v16u8) __msa_ilvr_d((v2i64) horiz5, (v2i64) horiz4);
  4901.     res0 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz4, horiz3, horiz2, horiz1,
  4902.                                         horiz5, horiz6, horiz7, horiz8,
  4903.                                         horiz5, horiz4, horiz3, horiz2,
  4904.                                         horiz6, horiz7, horiz8, horiz8,
  4905.                                         const20, const6, const3);
  4906.     res0 = __msa_aver_u_b(avg0, res0);
  4907.     avg0 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
  4908.     res0 = __msa_aver_u_b(avg0, res0);
  4909.     ST8x2_UB(res0, dst, dst_stride);
  4910.     dst += (2 * dst_stride);
  4911.  
  4912.     LD_UB2(dst, dst_stride, dst0, dst1);
  4913.     avg1 = (v16u8) __msa_ilvr_d((v2i64) horiz7, (v2i64) horiz6);
  4914.     res1 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz6, horiz5, horiz4, horiz3,
  4915.                                         horiz7, horiz8, horiz8, horiz7,
  4916.                                         horiz7, horiz6, horiz5, horiz4,
  4917.                                         horiz8, horiz8, horiz7, horiz6,
  4918.                                         const20, const6, const3);
  4919.     res1 = __msa_aver_u_b(avg1, res1);
  4920.     avg1 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
  4921.     res1 = __msa_aver_u_b(avg1, res1);
  4922.     ST8x2_UB(res1, dst, dst_stride);
  4923. }
  4924.  
  4925. static void hv_mc_qpel_avg_dst_aver_v_src0_16x16_msa(const uint8_t *src,
  4926.                                                      int32_t src_stride,
  4927.                                                      uint8_t *dst,
  4928.                                                      int32_t dst_stride)
  4929. {
  4930.     uint8_t buff[272];
  4931.  
  4932.     hv_mc_qpel_aver_horiz_16x16_msa(src, src_stride, buff, 16, 16);
  4933.     vert_mc_qpel_avg_dst_aver_src0_16x16_msa(buff, 16, dst, dst_stride);
  4934. }
  4935.  
  4936. static void hv_mc_qpel_avg_dst_aver_v_src0_8x8_msa(const uint8_t *src,
  4937.                                                    int32_t src_stride,
  4938.                                                    uint8_t *dst,
  4939.                                                    int32_t dst_stride)
  4940. {
  4941.     v16u8 inp0, inp1, inp2, inp3;
  4942.     v16u8 res0, res1, avg0, avg1;
  4943.     v16u8 horiz0, horiz1, horiz2, horiz3;
  4944.     v16u8 horiz4, horiz5, horiz6, horiz7, horiz8;
  4945.     v16u8 dst0, dst1;
  4946.     v16u8 mask0 = { 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8 };
  4947.     v16u8 mask1 = { 0, 2, 0, 3, 1, 4, 2, 5, 3, 6, 4, 7, 5, 8, 6, 8 };
  4948.     v16u8 mask2 = { 1, 3, 0, 4, 0, 5, 1, 6, 2, 7, 3, 8, 4, 8, 5, 7 };
  4949.     v16u8 mask3 = { 2, 4, 1, 5, 0, 6, 0, 7, 1, 8, 2, 8, 3, 7, 4, 6 };
  4950.     v16u8 const20 = (v16u8) __msa_ldi_b(20);
  4951.     v16u8 const6 = (v16u8) __msa_ldi_b(6);
  4952.     v16u8 const3 = (v16u8) __msa_ldi_b(3);
  4953.  
  4954.     LD_UB2(src, src_stride, inp0, inp1);
  4955.     src += (2 * src_stride);
  4956.     horiz0 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp0, inp1,
  4957.                                            mask0, mask1, mask2, mask3,
  4958.                                            const20, const6, const3);
  4959.     LD_UB2(src, src_stride, inp2, inp3);
  4960.     src += (2 * src_stride);
  4961.     horiz1 = (v16u8) __msa_splati_d((v2i64) horiz0, 1);
  4962.     horiz2 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp2, inp3,
  4963.                                            mask0, mask1, mask2, mask3,
  4964.                                            const20, const6, const3);
  4965.     LD_UB2(src, src_stride, inp0, inp1);
  4966.     src += (2 * src_stride);
  4967.     horiz3 = (v16u8) __msa_splati_d((v2i64) horiz2, 1);
  4968.     horiz4 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp0, inp1,
  4969.                                            mask0, mask1, mask2, mask3,
  4970.                                            const20, const6, const3);
  4971.     horiz5 = (v16u8) __msa_splati_d((v2i64) horiz4, 1);
  4972.     LD_UB2(dst, dst_stride, dst0, dst1);
  4973.     avg0 = (v16u8) __msa_ilvr_d((v2i64) horiz1, (v2i64) horiz0);
  4974.     res0 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz0, horiz0, horiz1, horiz2,
  4975.                                         horiz1, horiz2, horiz3, horiz4,
  4976.                                         horiz1, horiz0, horiz0, horiz1,
  4977.                                         horiz2, horiz3, horiz4, horiz5,
  4978.                                         const20, const6, const3);
  4979.     res0 = __msa_aver_u_b(avg0, res0);
  4980.     avg0 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
  4981.     res0 = __msa_aver_u_b(avg0, res0);
  4982.     ST8x2_UB(res0, dst, dst_stride);
  4983.     dst += (2 * dst_stride);
  4984.  
  4985.     LD_UB2(src, src_stride, inp2, inp3);
  4986.     src += (2 * src_stride);
  4987.     horiz6 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp2, inp3,
  4988.                                            mask0, mask1, mask2, mask3,
  4989.                                            const20, const6, const3);
  4990.     horiz7 = (v16u8) __msa_splati_d((v2i64) horiz6, 1);
  4991.     LD_UB2(dst, dst_stride, dst0, dst1);
  4992.     avg1 = (v16u8) __msa_ilvr_d((v2i64) horiz3, (v2i64) horiz2);
  4993.     res1 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz2, horiz1, horiz0, horiz0,
  4994.                                         horiz3, horiz4, horiz5, horiz6,
  4995.                                         horiz3, horiz2, horiz1, horiz0,
  4996.                                         horiz4, horiz5, horiz6, horiz7,
  4997.                                         const20, const6, const3);
  4998.     res1 = __msa_aver_u_b(avg1, res1);
  4999.     avg1 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
  5000.     res1 = __msa_aver_u_b(avg1, res1);
  5001.     ST8x2_UB(res1, dst, dst_stride);
  5002.     dst += (2 * dst_stride);
  5003.  
  5004.     inp0 = LD_UB(src);
  5005.     horiz8 = APPLY_HORIZ_QPEL_FILTER_8BYTE_1ROW(inp0,
  5006.                                                 mask0, mask1, mask2, mask3,
  5007.                                                 const20, const6, const3);
  5008.     LD_UB2(dst, dst_stride, dst0, dst1);
  5009.     avg0 = (v16u8) __msa_ilvr_d((v2i64) horiz5, (v2i64) horiz4);
  5010.     res0 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz4, horiz3, horiz2, horiz1,
  5011.                                         horiz5, horiz6, horiz7, horiz8,
  5012.                                         horiz5, horiz4, horiz3, horiz2,
  5013.                                         horiz6, horiz7, horiz8, horiz8,
  5014.                                         const20, const6, const3);
  5015.     res0 = __msa_aver_u_b(avg0, res0);
  5016.     avg0 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
  5017.     res0 = __msa_aver_u_b(avg0, res0);
  5018.     ST8x2_UB(res0, dst, dst_stride);
  5019.     dst += (2 * dst_stride);
  5020.  
  5021.     LD_UB2(dst, dst_stride, dst0, dst1);
  5022.     avg1 = (v16u8) __msa_ilvr_d((v2i64) horiz7, (v2i64) horiz6);
  5023.     res1 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz6, horiz5, horiz4, horiz3,
  5024.                                         horiz7, horiz8, horiz8, horiz7,
  5025.                                         horiz7, horiz6, horiz5, horiz4,
  5026.                                         horiz8, horiz8, horiz7, horiz6,
  5027.                                         const20, const6, const3);
  5028.     res1 = __msa_aver_u_b(avg1, res1);
  5029.     avg1 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
  5030.     res1 = __msa_aver_u_b(avg1, res1);
  5031.     ST8x2_UB(res1, dst, dst_stride);
  5032. }
  5033.  
  5034. static void hv_mc_qpel_avg_dst_aver_hv_src10_16x16_msa(const uint8_t *src,
  5035.                                                        int32_t src_stride,
  5036.                                                        uint8_t *dst,
  5037.                                                        int32_t dst_stride)
  5038. {
  5039.     uint8_t buff[272];
  5040.  
  5041.     hv_mc_qpel_aver_horiz_src1_16x16_msa(src, src_stride, buff, 16, 16);
  5042.     vert_mc_qpel_avg_dst_aver_src0_16x16_msa(buff, 16, dst, dst_stride);
  5043. }
  5044.  
  5045. static void hv_mc_qpel_avg_dst_aver_hv_src10_8x8_msa(const uint8_t *src,
  5046.                                                      int32_t src_stride,
  5047.                                                      uint8_t *dst,
  5048.                                                      int32_t dst_stride)
  5049. {
  5050.     v16u8 inp0, inp1, inp2, inp3;
  5051.     v16u8 res0, res1, avg0, avg1;
  5052.     v16u8 horiz0, horiz1, horiz2, horiz3;
  5053.     v16u8 horiz4, horiz5, horiz6, horiz7, horiz8;
  5054.     v16u8 dst0, dst1;
  5055.     v16u8 mask0 = { 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8 };
  5056.     v16u8 mask1 = { 0, 2, 0, 3, 1, 4, 2, 5, 3, 6, 4, 7, 5, 8, 6, 8 };
  5057.     v16u8 mask2 = { 1, 3, 0, 4, 0, 5, 1, 6, 2, 7, 3, 8, 4, 8, 5, 7 };
  5058.     v16u8 mask3 = { 2, 4, 1, 5, 0, 6, 0, 7, 1, 8, 2, 8, 3, 7, 4, 6 };
  5059.     v16u8 const20 = (v16u8) __msa_ldi_b(20);
  5060.     v16u8 const6 = (v16u8) __msa_ldi_b(6);
  5061.     v16u8 const3 = (v16u8) __msa_ldi_b(3);
  5062.  
  5063.     LD_UB2(src, src_stride, inp0, inp1);
  5064.     src += (2 * src_stride);
  5065.     res0 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp0, inp1, mask0, mask1, mask2, mask3,
  5066.                                          const20, const6, const3);
  5067.  
  5068.     LD_UB2(src, src_stride, inp2, inp3);
  5069.     src += (2 * src_stride);
  5070.     SLDI_B2_UB(inp0, inp1, inp0, inp1, inp0, inp1, 1);
  5071.  
  5072.     inp0 = (v16u8) __msa_ilvr_d((v2i64) inp1, (v2i64) inp0);
  5073.     horiz0 = __msa_aver_u_b(inp0, res0);
  5074.     horiz1 = (v16u8) __msa_splati_d((v2i64) horiz0, 1);
  5075.     res1 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp2, inp3, mask0, mask1, mask2, mask3,
  5076.                                          const20, const6, const3);
  5077.     LD_UB2(src, src_stride, inp0, inp1);
  5078.     src += (2 * src_stride);
  5079.     SLDI_B2_UB(inp2, inp3, inp2, inp3, inp2, inp3, 1);
  5080.  
  5081.     inp2 = (v16u8) __msa_ilvr_d((v2i64) inp3, (v2i64) inp2);
  5082.     horiz2 = __msa_aver_u_b(inp2, res1);
  5083.     horiz3 = (v16u8) __msa_splati_d((v2i64) horiz2, 1);
  5084.     res0 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp0, inp1, mask0, mask1, mask2, mask3,
  5085.                                          const20, const6, const3);
  5086.  
  5087.     SLDI_B2_UB(inp0, inp1, inp0, inp1, inp0, inp1, 1);
  5088.  
  5089.     inp0 = (v16u8) __msa_ilvr_d((v2i64) inp1, (v2i64) inp0);
  5090.     horiz4 = __msa_aver_u_b(inp0, res0);
  5091.     horiz5 = (v16u8) __msa_splati_d((v2i64) horiz4, 1);
  5092.     LD_UB2(dst, dst_stride, dst0, dst1);
  5093.     avg0 = (v16u8) __msa_ilvr_d((v2i64) horiz1, (v2i64) horiz0);
  5094.     res0 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz0, horiz0, horiz1, horiz2,
  5095.                                         horiz1, horiz2, horiz3, horiz4,
  5096.                                         horiz1, horiz0, horiz0, horiz1,
  5097.                                         horiz2, horiz3, horiz4, horiz5,
  5098.                                         const20, const6, const3);
  5099.     res0 = __msa_aver_u_b(avg0, res0);
  5100.     avg0 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
  5101.     res0 = __msa_aver_u_b(avg0, res0);
  5102.     ST8x2_UB(res0, dst, dst_stride);
  5103.     dst += (2 * dst_stride);
  5104.  
  5105.     LD_UB2(src, src_stride, inp2, inp3);
  5106.     src += (2 * src_stride);
  5107.     res1 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp2, inp3, mask0, mask1, mask2, mask3,
  5108.                                          const20, const6, const3);
  5109.  
  5110.     SLDI_B2_UB(inp2, inp3, inp2, inp3, inp2, inp3, 1);
  5111.  
  5112.     inp2 = (v16u8) __msa_ilvr_d((v2i64) inp3, (v2i64) inp2);
  5113.     horiz6 = __msa_aver_u_b(inp2, res1);
  5114.     horiz7 = (v16u8) __msa_splati_d((v2i64) horiz6, 1);
  5115.     LD_UB2(dst, dst_stride, dst0, dst1);
  5116.     avg1 = (v16u8) __msa_ilvr_d((v2i64) horiz3, (v2i64) horiz2);
  5117.     res1 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz2, horiz1, horiz0, horiz0,
  5118.                                         horiz3, horiz4, horiz5, horiz6,
  5119.                                         horiz3, horiz2, horiz1, horiz0,
  5120.                                         horiz4, horiz5, horiz6, horiz7,
  5121.                                         const20, const6, const3);
  5122.     res1 = __msa_aver_u_b(avg1, res1);
  5123.     avg1 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
  5124.     res1 = __msa_aver_u_b(avg1, res1);
  5125.     ST8x2_UB(res1, dst, dst_stride);
  5126.     dst += (2 * dst_stride);
  5127.  
  5128.     inp0 = LD_UB(src);
  5129.     res0 = APPLY_HORIZ_QPEL_FILTER_8BYTE_1ROW(inp0, mask0, mask1, mask2, mask3,
  5130.                                               const20, const6, const3);
  5131.     inp0 = (v16u8) __msa_sldi_b((v16i8) inp0, (v16i8) inp0, 1);
  5132.     horiz8 = __msa_aver_u_b(inp0, res0);
  5133.     LD_UB2(dst, dst_stride, dst0, dst1);
  5134.     avg0 = (v16u8) __msa_ilvr_d((v2i64) horiz5, (v2i64) horiz4);
  5135.     res0 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz4, horiz3, horiz2, horiz1,
  5136.                                         horiz5, horiz6, horiz7, horiz8,
  5137.                                         horiz5, horiz4, horiz3, horiz2,
  5138.                                         horiz6, horiz7, horiz8, horiz8,
  5139.                                         const20, const6, const3);
  5140.     res0 = __msa_aver_u_b(avg0, res0);
  5141.     avg0 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
  5142.     res0 = __msa_aver_u_b(avg0, res0);
  5143.     ST8x2_UB(res0, dst, dst_stride);
  5144.     dst += (2 * dst_stride);
  5145.  
  5146.     LD_UB2(dst, dst_stride, dst0, dst1);
  5147.     avg1 = (v16u8) __msa_ilvr_d((v2i64) horiz7, (v2i64) horiz6);
  5148.     res1 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz6, horiz5, horiz4, horiz3,
  5149.                                         horiz7, horiz8, horiz8, horiz7,
  5150.                                         horiz7, horiz6, horiz5, horiz4,
  5151.                                         horiz8, horiz8, horiz7, horiz6,
  5152.                                         const20, const6, const3);
  5153.     res1 = __msa_aver_u_b(avg1, res1);
  5154.     avg1 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
  5155.     res1 = __msa_aver_u_b(avg1, res1);
  5156.     ST8x2_UB(res1, dst, dst_stride);
  5157. }
  5158.  
  5159. static void hv_mc_qpel_avg_dst_aver_h_src0_16x16_msa(const uint8_t *src,
  5160.                                                      int32_t src_stride,
  5161.                                                      uint8_t *dst,
  5162.                                                      int32_t dst_stride)
  5163. {
  5164.     uint8_t buff[272];
  5165.  
  5166.     hv_mc_qpel_aver_horiz_src0_16x16_msa(src, src_stride, buff, 16, 16);
  5167.     vert_mc_qpel_avg_dst_16x16_msa(buff, 16, dst, dst_stride);
  5168. }
  5169.  
  5170. static void hv_mc_qpel_avg_dst_aver_h_src0_8x8_msa(const uint8_t *src,
  5171.                                                    int32_t src_stride,
  5172.                                                    uint8_t *dst,
  5173.                                                    int32_t dst_stride)
  5174. {
  5175.     v16u8 inp0, inp1, inp2, inp3;
  5176.     v16u8 res0, res1, avg0, avg1;
  5177.     v16u8 horiz0, horiz1, horiz2, horiz3;
  5178.     v16u8 horiz4, horiz5, horiz6, horiz7, horiz8;
  5179.     v16u8 dst0, dst1;
  5180.     v16u8 mask0 = { 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8 };
  5181.     v16u8 mask1 = { 0, 2, 0, 3, 1, 4, 2, 5, 3, 6, 4, 7, 5, 8, 6, 8 };
  5182.     v16u8 mask2 = { 1, 3, 0, 4, 0, 5, 1, 6, 2, 7, 3, 8, 4, 8, 5, 7 };
  5183.     v16u8 mask3 = { 2, 4, 1, 5, 0, 6, 0, 7, 1, 8, 2, 8, 3, 7, 4, 6 };
  5184.     v16u8 const20 = (v16u8) __msa_ldi_b(20);
  5185.     v16u8 const6 = (v16u8) __msa_ldi_b(6);
  5186.     v16u8 const3 = (v16u8) __msa_ldi_b(3);
  5187.  
  5188.     LD_UB2(src, src_stride, inp0, inp1);
  5189.     src += (2 * src_stride);
  5190.     res0 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp0, inp1, mask0, mask1, mask2, mask3,
  5191.                                          const20, const6, const3);
  5192.     LD_UB2(src, src_stride, inp2, inp3);
  5193.     src += (2 * src_stride);
  5194.     inp0 = (v16u8) __msa_ilvr_d((v2i64) inp1, (v2i64) inp0);
  5195.     horiz0 = __msa_aver_u_b(inp0, res0);
  5196.     horiz1 = (v16u8) __msa_splati_d((v2i64) horiz0, 1);
  5197.     res1 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp2, inp3, mask0, mask1, mask2, mask3,
  5198.                                          const20, const6, const3);
  5199.     LD_UB2(src, src_stride, inp0, inp1);
  5200.     src += (2 * src_stride);
  5201.     inp2 = (v16u8) __msa_ilvr_d((v2i64) inp3, (v2i64) inp2);
  5202.     horiz2 = __msa_aver_u_b(inp2, res1);
  5203.     horiz3 = (v16u8) __msa_splati_d((v2i64) horiz2, 1);
  5204.     res0 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp0, inp1, mask0, mask1, mask2, mask3,
  5205.                                          const20, const6, const3);
  5206.     inp0 = (v16u8) __msa_ilvr_d((v2i64) inp1, (v2i64) inp0);
  5207.     horiz4 = __msa_aver_u_b(inp0, res0);
  5208.     horiz5 = (v16u8) __msa_splati_d((v2i64) horiz4, 1);
  5209.     LD_UB2(dst, dst_stride, dst0, dst1);
  5210.     res0 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz0, horiz0, horiz1, horiz2,
  5211.                                         horiz1, horiz2, horiz3, horiz4,
  5212.                                         horiz1, horiz0, horiz0, horiz1,
  5213.                                         horiz2, horiz3, horiz4, horiz5,
  5214.                                         const20, const6, const3);
  5215.     avg0 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
  5216.     res0 = __msa_aver_u_b(avg0, res0);
  5217.     ST8x2_UB(res0, dst, dst_stride);
  5218.     dst += (2 * dst_stride);
  5219.  
  5220.     LD_UB2(src, src_stride, inp2, inp3);
  5221.     src += (2 * src_stride);
  5222.     res1 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp2, inp3, mask0, mask1, mask2, mask3,
  5223.                                          const20, const6, const3);
  5224.     inp2 = (v16u8) __msa_ilvr_d((v2i64) inp3, (v2i64) inp2);
  5225.     horiz6 = __msa_aver_u_b(inp2, res1);
  5226.     horiz7 = (v16u8) __msa_splati_d((v2i64) horiz6, 1);
  5227.     LD_UB2(dst, dst_stride, dst0, dst1);
  5228.     res1 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz2, horiz1, horiz0, horiz0,
  5229.                                         horiz3, horiz4, horiz5, horiz6,
  5230.                                         horiz3, horiz2, horiz1, horiz0,
  5231.                                         horiz4, horiz5, horiz6, horiz7,
  5232.                                         const20, const6, const3);
  5233.     avg1 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
  5234.     res1 = __msa_aver_u_b(avg1, res1);
  5235.     ST8x2_UB(res1, dst, dst_stride);
  5236.     dst += (2 * dst_stride);
  5237.  
  5238.     inp0 = LD_UB(src);
  5239.     res0 = APPLY_HORIZ_QPEL_FILTER_8BYTE_1ROW(inp0, mask0, mask1, mask2, mask3,
  5240.                                               const20, const6, const3);
  5241.     horiz8 = __msa_aver_u_b(inp0, res0);
  5242.     LD_UB2(dst, dst_stride, dst0, dst1);
  5243.     res0 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz4, horiz3, horiz2, horiz1,
  5244.                                         horiz5, horiz6, horiz7, horiz8,
  5245.                                         horiz5, horiz4, horiz3, horiz2,
  5246.                                         horiz6, horiz7, horiz8, horiz8,
  5247.                                         const20, const6, const3);
  5248.     avg0 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
  5249.     res0 = __msa_aver_u_b(avg0, res0);
  5250.     ST8x2_UB(res0, dst, dst_stride);
  5251.     dst += (2 * dst_stride);
  5252.  
  5253.     LD_UB2(dst, dst_stride, dst0, dst1);
  5254.     res1 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz6, horiz5, horiz4, horiz3,
  5255.                                         horiz7, horiz8, horiz8, horiz7,
  5256.                                         horiz7, horiz6, horiz5, horiz4,
  5257.                                         horiz8, horiz8, horiz7, horiz6,
  5258.                                         const20, const6, const3);
  5259.     avg1 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
  5260.     res1 = __msa_aver_u_b(avg1, res1);
  5261.     ST8x2_UB(res1, dst, dst_stride);
  5262.     dst += (2 * dst_stride);
  5263. }
  5264.  
  5265. static void hv_mc_qpel_avg_dst_16x16_msa(const uint8_t *src, int32_t src_stride,
  5266.                                          uint8_t *dst, int32_t dst_stride)
  5267. {
  5268.     uint8_t buff[272];
  5269.  
  5270.     hv_mc_qpel_aver_horiz_16x16_msa(src, src_stride, buff, 16, 16);
  5271.     vert_mc_qpel_avg_dst_16x16_msa(buff, 16, dst, dst_stride);
  5272.  
  5273. }
  5274.  
  5275. static void hv_mc_qpel_avg_dst_8x8_msa(const uint8_t *src, int32_t src_stride,
  5276.                                        uint8_t *dst, int32_t dst_stride)
  5277. {
  5278.     v16u8 inp0, inp1, inp2, inp3;
  5279.     v16u8 res0, res1, avg0, avg1;
  5280.     v16u8 horiz0, horiz1, horiz2, horiz3;
  5281.     v16u8 horiz4, horiz5, horiz6, horiz7, horiz8;
  5282.     v16u8 dst0, dst1;
  5283.     v16u8 mask0 = { 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8 };
  5284.     v16u8 mask1 = { 0, 2, 0, 3, 1, 4, 2, 5, 3, 6, 4, 7, 5, 8, 6, 8 };
  5285.     v16u8 mask2 = { 1, 3, 0, 4, 0, 5, 1, 6, 2, 7, 3, 8, 4, 8, 5, 7 };
  5286.     v16u8 mask3 = { 2, 4, 1, 5, 0, 6, 0, 7, 1, 8, 2, 8, 3, 7, 4, 6 };
  5287.     v16u8 const20 = (v16u8) __msa_ldi_b(20);
  5288.     v16u8 const6 = (v16u8) __msa_ldi_b(6);
  5289.     v16u8 const3 = (v16u8) __msa_ldi_b(3);
  5290.  
  5291.     LD_UB2(src, src_stride, inp0, inp1);
  5292.     src += (2 * src_stride);
  5293.     horiz0 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp0, inp1,
  5294.                                            mask0, mask1, mask2, mask3,
  5295.                                            const20, const6, const3);
  5296.     LD_UB2(src, src_stride, inp2, inp3);
  5297.     src += (2 * src_stride);
  5298.     horiz1 = (v16u8) __msa_splati_d((v2i64) horiz0, 1);
  5299.     horiz2 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp2, inp3,
  5300.                                            mask0, mask1, mask2, mask3,
  5301.                                            const20, const6, const3);
  5302.     LD_UB2(src, src_stride, inp0, inp1);
  5303.     src += (2 * src_stride);
  5304.     horiz3 = (v16u8) __msa_splati_d((v2i64) horiz2, 1);
  5305.     horiz4 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp0, inp1,
  5306.                                            mask0, mask1, mask2, mask3,
  5307.                                            const20, const6, const3);
  5308.     horiz5 = (v16u8) __msa_splati_d((v2i64) horiz4, 1);
  5309.     LD_UB2(src, src_stride, inp2, inp3);
  5310.     src += (2 * src_stride);
  5311.     horiz6 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp2, inp3,
  5312.                                            mask0, mask1, mask2, mask3,
  5313.                                            const20, const6, const3);
  5314.     horiz7 = (v16u8) __msa_splati_d((v2i64) horiz6, 1);
  5315.     inp0 = LD_UB(src);
  5316.     horiz8 = APPLY_HORIZ_QPEL_FILTER_8BYTE_1ROW(inp0,
  5317.                                                 mask0, mask1, mask2, mask3,
  5318.                                                 const20, const6, const3);
  5319.     LD_UB2(dst, dst_stride, dst0, dst1);
  5320.     res0 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz0, horiz0, horiz1, horiz2,
  5321.                                         horiz1, horiz2, horiz3, horiz4,
  5322.                                         horiz1, horiz0, horiz0, horiz1,
  5323.                                         horiz2, horiz3, horiz4, horiz5,
  5324.                                         const20, const6, const3);
  5325.     avg0 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
  5326.     res0 = __msa_aver_u_b(avg0, res0);
  5327.     ST8x2_UB(res0, dst, dst_stride);
  5328.     dst += (2 * dst_stride);
  5329.  
  5330.     LD_UB2(dst, dst_stride, dst0, dst1);
  5331.     res1 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz2, horiz1, horiz0, horiz0,
  5332.                                         horiz3, horiz4, horiz5, horiz6,
  5333.                                         horiz3, horiz2, horiz1, horiz0,
  5334.                                         horiz4, horiz5, horiz6, horiz7,
  5335.                                         const20, const6, const3);
  5336.     avg1 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
  5337.     res1 = __msa_aver_u_b(avg1, res1);
  5338.     ST8x2_UB(res1, dst, dst_stride);
  5339.     dst += (2 * dst_stride);
  5340.  
  5341.     LD_UB2(dst, dst_stride, dst0, dst1);
  5342.     res0 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz4, horiz3, horiz2, horiz1,
  5343.                                         horiz5, horiz6, horiz7, horiz8,
  5344.                                         horiz5, horiz4, horiz3, horiz2,
  5345.                                         horiz6, horiz7, horiz8, horiz8,
  5346.                                         const20, const6, const3);
  5347.     avg0 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
  5348.     res0 = __msa_aver_u_b(avg0, res0);
  5349.     ST8x2_UB(res0, dst, dst_stride);
  5350.     dst += (2 * dst_stride);
  5351.  
  5352.     LD_UB2(dst, dst_stride, dst0, dst1);
  5353.     res1 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz6, horiz5, horiz4, horiz3,
  5354.                                         horiz7, horiz8, horiz8, horiz7,
  5355.                                         horiz7, horiz6, horiz5, horiz4,
  5356.                                         horiz8, horiz8, horiz7, horiz6,
  5357.                                         const20, const6, const3);
  5358.     avg1 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
  5359.     res1 = __msa_aver_u_b(avg1, res1);
  5360.     ST8x2_UB(res1, dst, dst_stride);
  5361. }
  5362.  
  5363. static void hv_mc_qpel_avg_dst_aver_h_src1_16x16_msa(const uint8_t *src,
  5364.                                                      int32_t src_stride,
  5365.                                                      uint8_t *dst,
  5366.                                                      int32_t dst_stride)
  5367. {
  5368.     uint8_t buff[272];
  5369.  
  5370.     hv_mc_qpel_aver_horiz_src1_16x16_msa(src, src_stride, buff, 16, 16);
  5371.     vert_mc_qpel_avg_dst_16x16_msa(buff, 16, dst, dst_stride);
  5372. }
  5373.  
  5374. static void hv_mc_qpel_avg_dst_aver_h_src1_8x8_msa(const uint8_t *src,
  5375.                                                    int32_t src_stride,
  5376.                                                    uint8_t *dst,
  5377.                                                    int32_t dst_stride)
  5378. {
  5379.     v16u8 inp0, inp1, inp2, inp3;
  5380.     v16u8 res0, res1, avg0, avg1;
  5381.     v16u8 horiz0, horiz1, horiz2, horiz3;
  5382.     v16u8 horiz4, horiz5, horiz6, horiz7, horiz8;
  5383.     v16u8 dst0, dst1;
  5384.     v16u8 mask0 = { 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8 };
  5385.     v16u8 mask1 = { 0, 2, 0, 3, 1, 4, 2, 5, 3, 6, 4, 7, 5, 8, 6, 8 };
  5386.     v16u8 mask2 = { 1, 3, 0, 4, 0, 5, 1, 6, 2, 7, 3, 8, 4, 8, 5, 7 };
  5387.     v16u8 mask3 = { 2, 4, 1, 5, 0, 6, 0, 7, 1, 8, 2, 8, 3, 7, 4, 6 };
  5388.     v16u8 const20 = (v16u8) __msa_ldi_b(20);
  5389.     v16u8 const6 = (v16u8) __msa_ldi_b(6);
  5390.     v16u8 const3 = (v16u8) __msa_ldi_b(3);
  5391.  
  5392.     LD_UB2(src, src_stride, inp0, inp1);
  5393.     src += (2 * src_stride);
  5394.     res0 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp0, inp1, mask0, mask1, mask2, mask3,
  5395.                                          const20, const6, const3);
  5396.     LD_UB2(src, src_stride, inp2, inp3);
  5397.     src += (2 * src_stride);
  5398.     SLDI_B2_UB(inp0, inp1, inp0, inp1, inp0, inp1, 1);
  5399.  
  5400.     inp0 = (v16u8) __msa_ilvr_d((v2i64) inp1, (v2i64) inp0);
  5401.     horiz0 = __msa_aver_u_b(inp0, res0);
  5402.     horiz1 = (v16u8) __msa_splati_d((v2i64) horiz0, 1);
  5403.     res1 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp2, inp3, mask0, mask1, mask2, mask3,
  5404.                                          const20, const6, const3);
  5405.     LD_UB2(src, src_stride, inp0, inp1);
  5406.     src += (2 * src_stride);
  5407.     SLDI_B2_UB(inp2, inp3, inp2, inp3, inp2, inp3, 1);
  5408.  
  5409.     inp2 = (v16u8) __msa_ilvr_d((v2i64) inp3, (v2i64) inp2);
  5410.     horiz2 = __msa_aver_u_b(inp2, res1);
  5411.     horiz3 = (v16u8) __msa_splati_d((v2i64) horiz2, 1);
  5412.     res0 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp0, inp1, mask0, mask1, mask2, mask3,
  5413.                                          const20, const6, const3);
  5414.  
  5415.     SLDI_B2_UB(inp0, inp1, inp0, inp1, inp0, inp1, 1);
  5416.  
  5417.     inp0 = (v16u8) __msa_ilvr_d((v2i64) inp1, (v2i64) inp0);
  5418.     horiz4 = __msa_aver_u_b(inp0, res0);
  5419.     horiz5 = (v16u8) __msa_splati_d((v2i64) horiz4, 1);
  5420.     LD_UB2(dst, dst_stride, dst0, dst1);
  5421.     res0 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz0, horiz0, horiz1, horiz2,
  5422.                                         horiz1, horiz2, horiz3, horiz4,
  5423.                                         horiz1, horiz0, horiz0, horiz1,
  5424.                                         horiz2, horiz3, horiz4, horiz5,
  5425.                                         const20, const6, const3);
  5426.     avg0 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
  5427.     res0 = __msa_aver_u_b(avg0, res0);
  5428.     ST8x2_UB(res0, dst, dst_stride);
  5429.     dst += (2 * dst_stride);
  5430.  
  5431.     LD_UB2(src, src_stride, inp2, inp3);
  5432.     src += (2 * src_stride);
  5433.     res1 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp2, inp3, mask0, mask1, mask2, mask3,
  5434.                                          const20, const6, const3);
  5435.  
  5436.     SLDI_B2_UB(inp2, inp3, inp2, inp3, inp2, inp3, 1);
  5437.  
  5438.     inp2 = (v16u8) __msa_ilvr_d((v2i64) inp3, (v2i64) inp2);
  5439.     horiz6 = __msa_aver_u_b(inp2, res1);
  5440.     horiz7 = (v16u8) __msa_splati_d((v2i64) horiz6, 1);
  5441.     LD_UB2(dst, dst_stride, dst0, dst1);
  5442.     res1 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz2, horiz1, horiz0, horiz0,
  5443.                                         horiz3, horiz4, horiz5, horiz6,
  5444.                                         horiz3, horiz2, horiz1, horiz0,
  5445.                                         horiz4, horiz5, horiz6, horiz7,
  5446.                                         const20, const6, const3);
  5447.     avg1 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
  5448.     res1 = __msa_aver_u_b(avg1, res1);
  5449.     ST8x2_UB(res1, dst, dst_stride);
  5450.     dst += (2 * dst_stride);
  5451.  
  5452.     inp0 = LD_UB(src);
  5453.     res0 = APPLY_HORIZ_QPEL_FILTER_8BYTE_1ROW(inp0, mask0, mask1, mask2, mask3,
  5454.                                               const20, const6, const3);
  5455.     inp0 = (v16u8) __msa_sldi_b((v16i8) inp0, (v16i8) inp0, 1);
  5456.     horiz8 = __msa_aver_u_b(inp0, res0);
  5457.     LD_UB2(dst, dst_stride, dst0, dst1);
  5458.     res0 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz4, horiz3, horiz2, horiz1,
  5459.                                         horiz5, horiz6, horiz7, horiz8,
  5460.                                         horiz5, horiz4, horiz3, horiz2,
  5461.                                         horiz6, horiz7, horiz8, horiz8,
  5462.                                         const20, const6, const3);
  5463.     avg0 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
  5464.     res0 = __msa_aver_u_b(avg0, res0);
  5465.     ST8x2_UB(res0, dst, dst_stride);
  5466.     dst += (2 * dst_stride);
  5467.  
  5468.     LD_UB2(dst, dst_stride, dst0, dst1);
  5469.     res1 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz6, horiz5, horiz4, horiz3,
  5470.                                         horiz7, horiz8, horiz8, horiz7,
  5471.                                         horiz7, horiz6, horiz5, horiz4,
  5472.                                         horiz8, horiz8, horiz7, horiz6,
  5473.                                         const20, const6, const3);
  5474.     avg1 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
  5475.     res1 = __msa_aver_u_b(avg1, res1);
  5476.     ST8x2_UB(res1, dst, dst_stride);
  5477. }
  5478.  
  5479. static void hv_mc_qpel_avg_dst_aver_hv_src01_16x16_msa(const uint8_t *src,
  5480.                                                        int32_t src_stride,
  5481.                                                        uint8_t *dst,
  5482.                                                        int32_t dst_stride)
  5483. {
  5484.     uint8_t buff[272];
  5485.  
  5486.     hv_mc_qpel_aver_horiz_src0_16x16_msa(src, src_stride, buff, 16, 16);
  5487.     vert_mc_qpel_avg_dst_aver_src1_16x16_msa(buff, 16, dst, dst_stride);
  5488. }
  5489.  
  5490. static void hv_mc_qpel_avg_dst_aver_hv_src01_8x8_msa(const uint8_t *src,
  5491.                                                      int32_t src_stride,
  5492.                                                      uint8_t *dst,
  5493.                                                      int32_t dst_stride)
  5494. {
  5495.     v16u8 inp0, inp1, inp2, inp3;
  5496.     v16u8 res0, res1, avg0, avg1;
  5497.     v16u8 horiz0, horiz1, horiz2, horiz3;
  5498.     v16u8 horiz4, horiz5, horiz6, horiz7, horiz8;
  5499.     v16u8 dst0, dst1;
  5500.     v16u8 mask0 = { 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8 };
  5501.     v16u8 mask1 = { 0, 2, 0, 3, 1, 4, 2, 5, 3, 6, 4, 7, 5, 8, 6, 8 };
  5502.     v16u8 mask2 = { 1, 3, 0, 4, 0, 5, 1, 6, 2, 7, 3, 8, 4, 8, 5, 7 };
  5503.     v16u8 mask3 = { 2, 4, 1, 5, 0, 6, 0, 7, 1, 8, 2, 8, 3, 7, 4, 6 };
  5504.     v16u8 const20 = (v16u8) __msa_ldi_b(20);
  5505.     v16u8 const6 = (v16u8) __msa_ldi_b(6);
  5506.     v16u8 const3 = (v16u8) __msa_ldi_b(3);
  5507.  
  5508.     LD_UB2(src, src_stride, inp0, inp1);
  5509.     src += (2 * src_stride);
  5510.  
  5511.     res0 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp0, inp1, mask0, mask1, mask2, mask3,
  5512.                                          const20, const6, const3);
  5513.     inp0 = (v16u8) __msa_ilvr_d((v2i64) inp1, (v2i64) inp0);
  5514.     horiz0 = __msa_aver_u_b(inp0, res0);
  5515.     horiz1 = (v16u8) __msa_splati_d((v2i64) horiz0, 1);
  5516.     LD_UB2(src, src_stride, inp2, inp3);
  5517.     src += (2 * src_stride);
  5518.     res1 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp2, inp3, mask0, mask1, mask2, mask3,
  5519.                                          const20, const6, const3);
  5520.     inp2 = (v16u8) __msa_ilvr_d((v2i64) inp3, (v2i64) inp2);
  5521.     horiz2 = __msa_aver_u_b(inp2, res1);
  5522.     horiz3 = (v16u8) __msa_splati_d((v2i64) horiz2, 1);
  5523.     LD_UB2(dst, dst_stride, dst0, dst1);
  5524.     LD_UB2(src, src_stride, inp0, inp1);
  5525.     src += (2 * src_stride);
  5526.     res0 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp0, inp1, mask0, mask1, mask2, mask3,
  5527.                                          const20, const6, const3);
  5528.     inp0 = (v16u8) __msa_ilvr_d((v2i64) inp1, (v2i64) inp0);
  5529.     horiz4 = __msa_aver_u_b(inp0, res0);
  5530.     horiz5 = (v16u8) __msa_splati_d((v2i64) horiz4, 1);
  5531.     res0 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz0, horiz0, horiz1, horiz2,
  5532.                                         horiz1, horiz2, horiz3, horiz4,
  5533.                                         horiz1, horiz0, horiz0, horiz1,
  5534.                                         horiz2, horiz3, horiz4, horiz5,
  5535.                                         const20, const6, const3);
  5536.     avg0 = (v16u8) __msa_ilvr_d((v2i64) horiz2, (v2i64) horiz1);
  5537.     res0 = __msa_aver_u_b(avg0, res0);
  5538.     avg0 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
  5539.     res0 = __msa_aver_u_b(avg0, res0);
  5540.     ST8x2_UB(res0, dst, dst_stride);
  5541.     dst += (2 * dst_stride);
  5542.  
  5543.     LD_UB2(dst, dst_stride, dst0, dst1);
  5544.     LD_UB2(src, src_stride, inp2, inp3);
  5545.     src += (2 * src_stride);
  5546.     res1 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp2, inp3, mask0, mask1, mask2, mask3,
  5547.                                          const20, const6, const3);
  5548.     inp2 = (v16u8) __msa_ilvr_d((v2i64) inp3, (v2i64) inp2);
  5549.     horiz6 = __msa_aver_u_b(inp2, res1);
  5550.     horiz7 = (v16u8) __msa_splati_d((v2i64) horiz6, 1);
  5551.     res1 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz2, horiz1, horiz0, horiz0,
  5552.                                         horiz3, horiz4, horiz5, horiz6,
  5553.                                         horiz3, horiz2, horiz1, horiz0,
  5554.                                         horiz4, horiz5, horiz6, horiz7,
  5555.                                         const20, const6, const3);
  5556.     avg1 = (v16u8) __msa_ilvr_d((v2i64) horiz4, (v2i64) horiz3);
  5557.     res1 = __msa_aver_u_b(avg1, res1);
  5558.     avg1 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
  5559.     res1 = __msa_aver_u_b(avg1, res1);
  5560.     ST8x2_UB(res1, dst, dst_stride);
  5561.     dst += (2 * dst_stride);
  5562.  
  5563.     inp0 = LD_UB(src);
  5564.     res0 = APPLY_HORIZ_QPEL_FILTER_8BYTE_1ROW(inp0, mask0, mask1, mask2, mask3,
  5565.                                               const20, const6, const3);
  5566.     horiz8 = __msa_aver_u_b(inp0, res0);
  5567.     res0 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz4, horiz3, horiz2, horiz1,
  5568.                                         horiz5, horiz6, horiz7, horiz8,
  5569.                                         horiz5, horiz4, horiz3, horiz2,
  5570.                                         horiz6, horiz7, horiz8, horiz8,
  5571.                                         const20, const6, const3);
  5572.     res1 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz6, horiz5, horiz4, horiz3,
  5573.                                         horiz7, horiz8, horiz8, horiz7,
  5574.                                         horiz7, horiz6, horiz5, horiz4,
  5575.                                         horiz8, horiz8, horiz7, horiz6,
  5576.                                         const20, const6, const3);
  5577.     avg0 = (v16u8) __msa_ilvr_d((v2i64) horiz6, (v2i64) horiz5);
  5578.     res0 = __msa_aver_u_b(avg0, res0);
  5579.     LD_UB2(dst, dst_stride, dst0, dst1);
  5580.     avg0 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
  5581.     res0 = __msa_aver_u_b(avg0, res0);
  5582.     ST8x2_UB(res0, dst, dst_stride);
  5583.     dst += (2 * dst_stride);
  5584.  
  5585.     avg1 = (v16u8) __msa_ilvr_d((v2i64) horiz8, (v2i64) horiz7);
  5586.     res1 = __msa_aver_u_b(avg1, res1);
  5587.     LD_UB2(dst, dst_stride, dst0, dst1);
  5588.     avg1 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
  5589.     res1 = __msa_aver_u_b(avg1, res1);
  5590.     ST8x2_UB(res1, dst, dst_stride);
  5591. }
  5592.  
  5593. static void hv_mc_qpel_avg_dst_aver_v_src1_16x16_msa(const uint8_t *src,
  5594.                                                      int32_t src_stride,
  5595.                                                      uint8_t *dst,
  5596.                                                      int32_t dst_stride)
  5597. {
  5598.     uint8_t buff[272];
  5599.  
  5600.     hv_mc_qpel_aver_horiz_16x16_msa(src, src_stride, buff, 16, 16);
  5601.     vert_mc_qpel_avg_dst_aver_src1_16x16_msa(buff, 16, dst, dst_stride);
  5602. }
  5603.  
  5604. static void hv_mc_qpel_avg_dst_aver_v_src1_8x8_msa(const uint8_t *src,
  5605.                                                    int32_t src_stride,
  5606.                                                    uint8_t *dst,
  5607.                                                    int32_t dst_stride)
  5608. {
  5609.     v16u8 inp0, inp1, inp2, inp3;
  5610.     v16u8 res0, res1, avg0, avg1;
  5611.     v16u8 horiz0, horiz1, horiz2, horiz3;
  5612.     v16u8 horiz4, horiz5, horiz6, horiz7, horiz8;
  5613.     v16u8 dst0, dst1;
  5614.     v16u8 mask0 = { 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8 };
  5615.     v16u8 mask1 = { 0, 2, 0, 3, 1, 4, 2, 5, 3, 6, 4, 7, 5, 8, 6, 8 };
  5616.     v16u8 mask2 = { 1, 3, 0, 4, 0, 5, 1, 6, 2, 7, 3, 8, 4, 8, 5, 7 };
  5617.     v16u8 mask3 = { 2, 4, 1, 5, 0, 6, 0, 7, 1, 8, 2, 8, 3, 7, 4, 6 };
  5618.     v16u8 const20 = (v16u8) __msa_ldi_b(20);
  5619.     v16u8 const6 = (v16u8) __msa_ldi_b(6);
  5620.     v16u8 const3 = (v16u8) __msa_ldi_b(3);
  5621.  
  5622.     LD_UB2(src, src_stride, inp0, inp1);
  5623.     src += (2 * src_stride);
  5624.     horiz0 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp0, inp1,
  5625.                                            mask0, mask1, mask2, mask3,
  5626.                                            const20, const6, const3);
  5627.     horiz1 = (v16u8) __msa_splati_d((v2i64) horiz0, 1);
  5628.     LD_UB2(src, src_stride, inp2, inp3);
  5629.     src += (2 * src_stride);
  5630.     horiz2 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp2, inp3,
  5631.                                            mask0, mask1, mask2, mask3,
  5632.                                            const20, const6, const3);
  5633.     horiz3 = (v16u8) __msa_splati_d((v2i64) horiz2, 1);
  5634.     LD_UB2(dst, dst_stride, dst0, dst1);
  5635.     LD_UB2(src, src_stride, inp0, inp1);
  5636.     src += (2 * src_stride);
  5637.     horiz4 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp0, inp1,
  5638.                                            mask0, mask1, mask2, mask3,
  5639.                                            const20, const6, const3);
  5640.     horiz5 = (v16u8) __msa_splati_d((v2i64) horiz4, 1);
  5641.     res0 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz0, horiz0, horiz1, horiz2,
  5642.                                         horiz1, horiz2, horiz3, horiz4,
  5643.                                         horiz1, horiz0, horiz0, horiz1,
  5644.                                         horiz2, horiz3, horiz4, horiz5,
  5645.                                         const20, const6, const3);
  5646.     avg0 = (v16u8) __msa_ilvr_d((v2i64) horiz2, (v2i64) horiz1);
  5647.     res0 = __msa_aver_u_b(avg0, res0);
  5648.     avg0 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
  5649.     res0 = __msa_aver_u_b(avg0, res0);
  5650.     ST8x2_UB(res0, dst, dst_stride);
  5651.     dst += (2 * dst_stride);
  5652.  
  5653.     LD_UB2(dst, dst_stride, dst0, dst1);
  5654.     LD_UB2(src, src_stride, inp2, inp3);
  5655.     src += (2 * src_stride);
  5656.     horiz6 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp2, inp3,
  5657.                                            mask0, mask1, mask2, mask3,
  5658.                                            const20, const6, const3);
  5659.     horiz7 = (v16u8) __msa_splati_d((v2i64) horiz6, 1);
  5660.     res1 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz2, horiz1, horiz0, horiz0,
  5661.                                         horiz3, horiz4, horiz5, horiz6,
  5662.                                         horiz3, horiz2, horiz1, horiz0,
  5663.                                         horiz4, horiz5, horiz6, horiz7,
  5664.                                         const20, const6, const3);
  5665.     avg1 = (v16u8) __msa_ilvr_d((v2i64) horiz4, (v2i64) horiz3);
  5666.     res1 = __msa_aver_u_b(avg1, res1);
  5667.     avg1 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
  5668.     res1 = __msa_aver_u_b(avg1, res1);
  5669.     ST8x2_UB(res1, dst, dst_stride);
  5670.     dst += (2 * dst_stride);
  5671.  
  5672.     inp0 = LD_UB(src);
  5673.     horiz8 = APPLY_HORIZ_QPEL_FILTER_8BYTE_1ROW(inp0,
  5674.                                                 mask0, mask1, mask2, mask3,
  5675.                                                 const20, const6, const3);
  5676.     res0 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz4, horiz3, horiz2, horiz1, horiz5,
  5677.                                         horiz6, horiz7, horiz8, horiz5, horiz4,
  5678.                                         horiz3, horiz2, horiz6, horiz7, horiz8,
  5679.                                         horiz8, const20, const6, const3);
  5680.     res1 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz6, horiz5, horiz4, horiz3, horiz7,
  5681.                                         horiz8, horiz8, horiz7, horiz7, horiz6,
  5682.                                         horiz5, horiz4, horiz8, horiz8, horiz7,
  5683.                                         horiz6, const20, const6, const3);
  5684.     avg0 = (v16u8) __msa_ilvr_d((v2i64) horiz6, (v2i64) horiz5);
  5685.     res0 = __msa_aver_u_b(avg0, res0);
  5686.     LD_UB2(dst, dst_stride, dst0, dst1);
  5687.     avg0 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
  5688.     res0 = __msa_aver_u_b(avg0, res0);
  5689.     ST8x2_UB(res0, dst, dst_stride);
  5690.     dst += (2 * dst_stride);
  5691.  
  5692.     avg1 = (v16u8) __msa_ilvr_d((v2i64) horiz8, (v2i64) horiz7);
  5693.     res1 = __msa_aver_u_b(avg1, res1);
  5694.     LD_UB2(dst, dst_stride, dst0, dst1);
  5695.     avg1 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
  5696.     res1 = __msa_aver_u_b(avg1, res1);
  5697.     ST8x2_UB(res1, dst, dst_stride);
  5698. }
  5699.  
  5700. static void hv_mc_qpel_avg_dst_aver_hv_src11_16x16_msa(const uint8_t *src,
  5701.                                                        int32_t src_stride,
  5702.                                                        uint8_t *dst,
  5703.                                                        int32_t dst_stride)
  5704. {
  5705.     uint8_t buff[272];
  5706.  
  5707.     hv_mc_qpel_aver_horiz_src1_16x16_msa(src, src_stride, buff, 16, 16);
  5708.     vert_mc_qpel_avg_dst_aver_src1_16x16_msa(buff, 16, dst, dst_stride);
  5709. }
  5710.  
  5711. static void hv_mc_qpel_avg_dst_aver_hv_src11_8x8_msa(const uint8_t *src,
  5712.                                                      int32_t src_stride,
  5713.                                                      uint8_t *dst,
  5714.                                                      int32_t dst_stride)
  5715. {
  5716.     v16u8 inp0, inp1, inp2, inp3;
  5717.     v16u8 res0, res1, avg0, avg1;
  5718.     v16u8 horiz0, horiz1, horiz2, horiz3;
  5719.     v16u8 horiz4, horiz5, horiz6, horiz7, horiz8;
  5720.     v16u8 dst0, dst1;
  5721.     v16u8 mask0 = { 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8 };
  5722.     v16u8 mask1 = { 0, 2, 0, 3, 1, 4, 2, 5, 3, 6, 4, 7, 5, 8, 6, 8 };
  5723.     v16u8 mask2 = { 1, 3, 0, 4, 0, 5, 1, 6, 2, 7, 3, 8, 4, 8, 5, 7 };
  5724.     v16u8 mask3 = { 2, 4, 1, 5, 0, 6, 0, 7, 1, 8, 2, 8, 3, 7, 4, 6 };
  5725.     v16u8 const20 = (v16u8) __msa_ldi_b(20);
  5726.     v16u8 const6 = (v16u8) __msa_ldi_b(6);
  5727.     v16u8 const3 = (v16u8) __msa_ldi_b(3);
  5728.  
  5729.     LD_UB2(src, src_stride, inp0, inp1);
  5730.     src += (2 * src_stride);
  5731.     res0 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp0, inp1, mask0, mask1, mask2, mask3,
  5732.                                          const20, const6, const3);
  5733.     LD_UB2(src, src_stride, inp2, inp3);
  5734.     src += (2 * src_stride);
  5735.     SLDI_B2_UB(inp0, inp1, inp0, inp1, inp0, inp1, 1);
  5736.  
  5737.     inp0 = (v16u8) __msa_ilvr_d((v2i64) inp1, (v2i64) inp0);
  5738.     horiz0 = __msa_aver_u_b(inp0, res0);
  5739.     horiz1 = (v16u8) __msa_splati_d((v2i64) horiz0, 1);
  5740.     res1 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp2, inp3, mask0, mask1, mask2, mask3,
  5741.                                          const20, const6, const3);
  5742.     LD_UB2(src, src_stride, inp0, inp1);
  5743.     src += (2 * src_stride);
  5744.     SLDI_B2_UB(inp2, inp3, inp2, inp3, inp2, inp3, 1);
  5745.  
  5746.     inp2 = (v16u8) __msa_ilvr_d((v2i64) inp3, (v2i64) inp2);
  5747.     horiz2 = __msa_aver_u_b(inp2, res1);
  5748.     horiz3 = (v16u8) __msa_splati_d((v2i64) horiz2, 1);
  5749.     res0 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp0, inp1, mask0, mask1, mask2, mask3,
  5750.                                          const20, const6, const3);
  5751.     SLDI_B2_UB(inp0, inp1, inp0, inp1, inp0, inp1, 1);
  5752.  
  5753.     inp0 = (v16u8) __msa_ilvr_d((v2i64) inp1, (v2i64) inp0);
  5754.     horiz4 = __msa_aver_u_b(inp0, res0);
  5755.     horiz5 = (v16u8) __msa_splati_d((v2i64) horiz4, 1);
  5756.     LD_UB2(dst, dst_stride, dst0, dst1);
  5757.     avg0 = (v16u8) __msa_ilvr_d((v2i64) horiz2, (v2i64) horiz1);
  5758.     res0 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz0, horiz0, horiz1, horiz2, horiz1,
  5759.                                         horiz2, horiz3, horiz4, horiz1, horiz0,
  5760.                                         horiz0, horiz1, horiz2, horiz3, horiz4,
  5761.                                         horiz5, const20, const6, const3);
  5762.     res0 = __msa_aver_u_b(avg0, res0);
  5763.     avg0 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
  5764.     res0 = __msa_aver_u_b(avg0, res0);
  5765.     ST8x2_UB(res0, dst, dst_stride);
  5766.     dst += (2 * dst_stride);
  5767.  
  5768.     LD_UB2(src, src_stride, inp2, inp3);
  5769.     src += (2 * src_stride);
  5770.     res1 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp2, inp3, mask0, mask1, mask2, mask3,
  5771.                                          const20, const6, const3);
  5772.     SLDI_B2_UB(inp2, inp3, inp2, inp3, inp2, inp3, 1);
  5773.  
  5774.     inp2 = (v16u8) __msa_ilvr_d((v2i64) inp3, (v2i64) inp2);
  5775.     horiz6 = __msa_aver_u_b(inp2, res1);
  5776.     horiz7 = (v16u8) __msa_splati_d((v2i64) horiz6, 1);
  5777.     LD_UB2(dst, dst_stride, dst0, dst1);
  5778.     avg1 = (v16u8) __msa_ilvr_d((v2i64) horiz4, (v2i64) horiz3);
  5779.     res1 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz2, horiz1, horiz0, horiz0, horiz3,
  5780.                                         horiz4, horiz5, horiz6, horiz3, horiz2,
  5781.                                         horiz1, horiz0, horiz4, horiz5, horiz6,
  5782.                                         horiz7, const20, const6, const3);
  5783.     res1 = __msa_aver_u_b(avg1, res1);
  5784.     avg1 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
  5785.     res1 = __msa_aver_u_b(avg1, res1);
  5786.     ST8x2_UB(res1, dst, dst_stride);
  5787.     dst += (2 * dst_stride);
  5788.  
  5789.     inp0 = LD_UB(src);
  5790.     res0 = APPLY_HORIZ_QPEL_FILTER_8BYTE_1ROW(inp0, mask0, mask1, mask2, mask3,
  5791.                                               const20, const6, const3);
  5792.     inp0 = (v16u8) __msa_sldi_b((v16i8) inp0, (v16i8) inp0, 1);
  5793.     horiz8 = __msa_aver_u_b(inp0, res0);
  5794.     LD_UB2(dst, dst_stride, dst0, dst1);
  5795.     avg0 = (v16u8) __msa_ilvr_d((v2i64) horiz6, (v2i64) horiz5);
  5796.     res0 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz4, horiz3, horiz2, horiz1, horiz5,
  5797.                                         horiz6, horiz7, horiz8, horiz5, horiz4,
  5798.                                         horiz3, horiz2, horiz6, horiz7, horiz8,
  5799.                                         horiz8, const20, const6, const3);
  5800.     res0 = __msa_aver_u_b(avg0, res0);
  5801.     avg0 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
  5802.     res0 = __msa_aver_u_b(avg0, res0);
  5803.     ST8x2_UB(res0, dst, dst_stride);
  5804.     dst += (2 * dst_stride);
  5805.  
  5806.     LD_UB2(dst, dst_stride, dst0, dst1);
  5807.     avg1 = (v16u8) __msa_ilvr_d((v2i64) horiz8, (v2i64) horiz7);
  5808.     res1 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz6, horiz5, horiz4, horiz3, horiz7,
  5809.                                         horiz8, horiz8, horiz7, horiz7, horiz6,
  5810.                                         horiz5, horiz4, horiz8, horiz8, horiz7,
  5811.                                         horiz6, const20, const6, const3);
  5812.     res1 = __msa_aver_u_b(avg1, res1);
  5813.     avg1 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
  5814.     res1 = __msa_aver_u_b(avg1, res1);
  5815.     ST8x2_UB(res1, dst, dst_stride);
  5816. }
  5817.  
  5818. static void copy_8x8_msa(const uint8_t *src, int32_t src_stride,
  5819.                          uint8_t *dst, int32_t dst_stride)
  5820. {
  5821.     uint64_t src0, src1;
  5822.     int32_t loop_cnt;
  5823.  
  5824.     for (loop_cnt = 4; loop_cnt--;) {
  5825.         src0 = LD(src);
  5826.         src += src_stride;
  5827.         src1 = LD(src);
  5828.         src += src_stride;
  5829.  
  5830.         SD(src0, dst);
  5831.         dst += dst_stride;
  5832.         SD(src1, dst);
  5833.         dst += dst_stride;
  5834.     }
  5835. }
  5836.  
  5837. static void copy_16x16_msa(const uint8_t *src, int32_t src_stride,
  5838.                            uint8_t *dst, int32_t dst_stride)
  5839. {
  5840.     v16u8 src0, src1, src2, src3, src4, src5, src6, src7;
  5841.     v16u8 src8, src9, src10, src11, src12, src13, src14, src15;
  5842.  
  5843.     LD_UB8(src, src_stride, src0, src1, src2, src3, src4, src5, src6, src7);
  5844.     src += (8 * src_stride);
  5845.     LD_UB8(src, src_stride,
  5846.            src8, src9, src10, src11, src12, src13, src14, src15);
  5847.  
  5848.     ST_UB8(src0, src1, src2, src3, src4, src5, src6, src7, dst, dst_stride);
  5849.     dst += (8 * dst_stride);
  5850.     ST_UB8(src8, src9, src10, src11, src12, src13, src14, src15,
  5851.            dst, dst_stride);
  5852. }
  5853.  
  5854. static void avg_width8_msa(const uint8_t *src, int32_t src_stride,
  5855.                            uint8_t *dst, int32_t dst_stride,
  5856.                            int32_t height)
  5857. {
  5858.     int32_t cnt;
  5859.     uint64_t out0, out1, out2, out3;
  5860.     v16u8 src0, src1, src2, src3;
  5861.     v16u8 dst0, dst1, dst2, dst3;
  5862.  
  5863.     for (cnt = (height / 4); cnt--;) {
  5864.         LD_UB4(src, src_stride, src0, src1, src2, src3);
  5865.         src += (4 * src_stride);
  5866.         LD_UB4(dst, dst_stride, dst0, dst1, dst2, dst3);
  5867.  
  5868.         AVER_UB4_UB(src0, dst0, src1, dst1, src2, dst2, src3, dst3,
  5869.                     dst0, dst1, dst2, dst3);
  5870.  
  5871.         out0 = __msa_copy_u_d((v2i64) dst0, 0);
  5872.         out1 = __msa_copy_u_d((v2i64) dst1, 0);
  5873.         out2 = __msa_copy_u_d((v2i64) dst2, 0);
  5874.         out3 = __msa_copy_u_d((v2i64) dst3, 0);
  5875.         SD4(out0, out1, out2, out3, dst, dst_stride);
  5876.         dst += (4 * dst_stride);
  5877.     }
  5878. }
  5879.  
  5880. static void avg_width16_msa(const uint8_t *src, int32_t src_stride,
  5881.                             uint8_t *dst, int32_t dst_stride,
  5882.                             int32_t height)
  5883. {
  5884.     int32_t cnt;
  5885.     v16u8 src0, src1, src2, src3, src4, src5, src6, src7;
  5886.     v16u8 dst0, dst1, dst2, dst3, dst4, dst5, dst6, dst7;
  5887.  
  5888.     for (cnt = (height / 8); cnt--;) {
  5889.         LD_UB8(src, src_stride, src0, src1, src2, src3, src4, src5, src6, src7);
  5890.         src += (8 * src_stride);
  5891.         LD_UB8(dst, dst_stride, dst0, dst1, dst2, dst3, dst4, dst5, dst6, dst7);
  5892.  
  5893.         AVER_UB4_UB(src0, dst0, src1, dst1, src2, dst2, src3, dst3,
  5894.                     dst0, dst1, dst2, dst3);
  5895.         AVER_UB4_UB(src4, dst4, src5, dst5, src6, dst6, src7, dst7,
  5896.                     dst4, dst5, dst6, dst7);
  5897.         ST_UB8(dst0, dst1, dst2, dst3, dst4, dst5, dst6, dst7, dst, dst_stride);
  5898.         dst += (8 * dst_stride);
  5899.     }
  5900. }
  5901.  
  5902. void ff_copy_16x16_msa(uint8_t *dest, const uint8_t *src, ptrdiff_t stride)
  5903. {
  5904.     copy_16x16_msa(src, stride, dest, stride);
  5905. }
  5906.  
  5907. void ff_copy_8x8_msa(uint8_t *dest, const uint8_t *src, ptrdiff_t stride)
  5908. {
  5909.     copy_8x8_msa(src, stride, dest, stride);
  5910. }
  5911.  
  5912. void ff_horiz_mc_qpel_aver_src0_8width_msa(uint8_t *dest,
  5913.                                            const uint8_t *src,
  5914.                                            ptrdiff_t stride)
  5915. {
  5916.     horiz_mc_qpel_aver_src0_8width_msa(src, stride, dest, stride, 8);
  5917. }
  5918.  
  5919. void ff_horiz_mc_qpel_aver_src0_16width_msa(uint8_t *dest,
  5920.                                             const uint8_t *src,
  5921.                                             ptrdiff_t stride)
  5922. {
  5923.     horiz_mc_qpel_aver_src0_16width_msa(src, stride, dest, stride, 16);
  5924. }
  5925.  
  5926. void ff_horiz_mc_qpel_8width_msa(uint8_t *dest, const uint8_t *src,
  5927.                                  ptrdiff_t stride)
  5928. {
  5929.     horiz_mc_qpel_8width_msa(src, stride, dest, stride, 8);
  5930. }
  5931.  
  5932. void ff_horiz_mc_qpel_16width_msa(uint8_t *dest,
  5933.                                   const uint8_t *src, ptrdiff_t stride)
  5934. {
  5935.     horiz_mc_qpel_16width_msa(src, stride, dest, stride, 16);
  5936. }
  5937.  
  5938. void ff_horiz_mc_qpel_aver_src1_8width_msa(uint8_t *dest,
  5939.                                            const uint8_t *src,
  5940.                                            ptrdiff_t stride)
  5941. {
  5942.     horiz_mc_qpel_aver_src1_8width_msa(src, stride, dest, stride, 8);
  5943. }
  5944.  
  5945. void ff_horiz_mc_qpel_aver_src1_16width_msa(uint8_t *dest,
  5946.                                             const uint8_t *src,
  5947.                                             ptrdiff_t stride)
  5948. {
  5949.     horiz_mc_qpel_aver_src1_16width_msa(src, stride, dest, stride, 16);
  5950. }
  5951.  
  5952. void ff_horiz_mc_qpel_no_rnd_aver_src0_8width_msa(uint8_t *dest,
  5953.                                                   const uint8_t *src,
  5954.                                                   ptrdiff_t stride)
  5955. {
  5956.     horiz_mc_qpel_no_rnd_aver_src0_8width_msa(src, stride, dest, stride, 8);
  5957. }
  5958.  
  5959. void ff_horiz_mc_qpel_no_rnd_aver_src0_16width_msa(uint8_t *dest,
  5960.                                                    const uint8_t *src,
  5961.                                                    ptrdiff_t stride)
  5962. {
  5963.     horiz_mc_qpel_no_rnd_aver_src0_16width_msa(src, stride, dest, stride, 16);
  5964. }
  5965.  
  5966. void ff_horiz_mc_qpel_no_rnd_8width_msa(uint8_t *dest,
  5967.                                         const uint8_t *src, ptrdiff_t stride)
  5968. {
  5969.     horiz_mc_qpel_no_rnd_8width_msa(src, stride, dest, stride, 8);
  5970. }
  5971.  
  5972. void ff_horiz_mc_qpel_no_rnd_16width_msa(uint8_t *dest,
  5973.                                          const uint8_t *src, ptrdiff_t stride)
  5974. {
  5975.     horiz_mc_qpel_no_rnd_16width_msa(src, stride, dest, stride, 16);
  5976. }
  5977.  
  5978. void ff_horiz_mc_qpel_no_rnd_aver_src1_8width_msa(uint8_t *dest,
  5979.                                                   const uint8_t *src,
  5980.                                                   ptrdiff_t stride)
  5981. {
  5982.     horiz_mc_qpel_no_rnd_aver_src1_8width_msa(src, stride, dest, stride, 8);
  5983. }
  5984.  
  5985. void ff_horiz_mc_qpel_no_rnd_aver_src1_16width_msa(uint8_t *dest,
  5986.                                                    const uint8_t *src,
  5987.                                                    ptrdiff_t stride)
  5988. {
  5989.     horiz_mc_qpel_no_rnd_aver_src1_16width_msa(src, stride, dest, stride, 16);
  5990. }
  5991.  
  5992. void ff_avg_width8_msa(uint8_t *dest, const uint8_t *src, ptrdiff_t stride)
  5993. {
  5994.     avg_width8_msa(src, stride, dest, stride, 8);
  5995. }
  5996.  
  5997. void ff_avg_width16_msa(uint8_t *dest, const uint8_t *src, ptrdiff_t stride)
  5998. {
  5999.     avg_width16_msa(src, stride, dest, stride, 16);
  6000. }
  6001.  
  6002. void ff_horiz_mc_qpel_avg_dst_aver_src0_8width_msa(uint8_t *dest,
  6003.                                                    const uint8_t *src,
  6004.                                                    ptrdiff_t stride)
  6005. {
  6006.     horiz_mc_qpel_avg_dst_aver_src0_8width_msa(src, stride, dest, stride, 8);
  6007. }
  6008.  
  6009. void ff_horiz_mc_qpel_avg_dst_aver_src0_16width_msa(uint8_t *dest,
  6010.                                                     const uint8_t *src,
  6011.                                                     ptrdiff_t stride)
  6012. {
  6013.     horiz_mc_qpel_avg_dst_aver_src0_16width_msa(src, stride, dest, stride, 16);
  6014. }
  6015.  
  6016. void ff_horiz_mc_qpel_avg_dst_8width_msa(uint8_t *dest,
  6017.                                          const uint8_t *src, ptrdiff_t stride)
  6018. {
  6019.     horiz_mc_qpel_avg_dst_8width_msa(src, stride, dest, stride, 8);
  6020. }
  6021.  
  6022. void ff_horiz_mc_qpel_avg_dst_16width_msa(uint8_t *dest,
  6023.                                           const uint8_t *src, ptrdiff_t stride)
  6024. {
  6025.     horiz_mc_qpel_avg_dst_16width_msa(src, stride, dest, stride, 16);
  6026. }
  6027.  
  6028. void ff_horiz_mc_qpel_avg_dst_aver_src1_8width_msa(uint8_t *dest,
  6029.                                                    const uint8_t *src,
  6030.                                                    ptrdiff_t stride)
  6031. {
  6032.     horiz_mc_qpel_avg_dst_aver_src1_8width_msa(src, stride, dest, stride, 8);
  6033. }
  6034.  
  6035. void ff_horiz_mc_qpel_avg_dst_aver_src1_16width_msa(uint8_t *dest,
  6036.                                                     const uint8_t *src,
  6037.                                                     ptrdiff_t stride)
  6038. {
  6039.     horiz_mc_qpel_avg_dst_aver_src1_16width_msa(src, stride, dest, stride, 16);
  6040. }
  6041.  
  6042.  
  6043. void ff_vert_mc_qpel_aver_src0_8x8_msa(uint8_t *dest,
  6044.                                        const uint8_t *src, ptrdiff_t stride)
  6045. {
  6046.     vert_mc_qpel_aver_src0_8x8_msa(src, stride, dest, stride);
  6047. }
  6048.  
  6049. void ff_vert_mc_qpel_aver_src0_16x16_msa(uint8_t *dest,
  6050.                                          const uint8_t *src, ptrdiff_t stride)
  6051. {
  6052.     vert_mc_qpel_aver_src0_16x16_msa(src, stride, dest, stride);
  6053. }
  6054.  
  6055. void ff_vert_mc_qpel_8x8_msa(uint8_t *dest, const uint8_t *src,
  6056.                              ptrdiff_t stride)
  6057. {
  6058.     vert_mc_qpel_8x8_msa(src, stride, dest, stride);
  6059. }
  6060.  
  6061. void ff_vert_mc_qpel_16x16_msa(uint8_t *dest, const uint8_t *src,
  6062.                                ptrdiff_t stride)
  6063. {
  6064.     vert_mc_qpel_16x16_msa(src, stride, dest, stride);
  6065. }
  6066.  
  6067. void ff_vert_mc_qpel_aver_src1_8x8_msa(uint8_t *dest,
  6068.                                        const uint8_t *src, ptrdiff_t stride)
  6069. {
  6070.     vert_mc_qpel_aver_src1_8x8_msa(src, stride, dest, stride);
  6071. }
  6072.  
  6073. void ff_vert_mc_qpel_aver_src1_16x16_msa(uint8_t *dest,
  6074.                                          const uint8_t *src, ptrdiff_t stride)
  6075. {
  6076.     vert_mc_qpel_aver_src1_16x16_msa(src, stride, dest, stride);
  6077. }
  6078.  
  6079. void ff_vert_mc_qpel_no_rnd_aver_src0_8x8_msa(uint8_t *dest,
  6080.                                               const uint8_t *src,
  6081.                                               ptrdiff_t stride)
  6082. {
  6083.     vert_mc_qpel_no_rnd_aver_src0_8x8_msa(src, stride, dest, stride);
  6084. }
  6085.  
  6086. void ff_vert_mc_qpel_no_rnd_aver_src0_16x16_msa(uint8_t *dest,
  6087.                                                 const uint8_t *src,
  6088.                                                 ptrdiff_t stride)
  6089. {
  6090.     vert_mc_qpel_no_rnd_aver_src0_16x16_msa(src, stride, dest, stride);
  6091. }
  6092.  
  6093. void ff_vert_mc_qpel_no_rnd_8x8_msa(uint8_t *dest,
  6094.                                     const uint8_t *src, ptrdiff_t stride)
  6095. {
  6096.     vert_mc_qpel_no_rnd_8x8_msa(src, stride, dest, stride);
  6097. }
  6098.  
  6099. void ff_vert_mc_qpel_no_rnd_16x16_msa(uint8_t *dest,
  6100.                                       const uint8_t *src, ptrdiff_t stride)
  6101. {
  6102.     vert_mc_qpel_no_rnd_16x16_msa(src, stride, dest, stride);
  6103. }
  6104.  
  6105. void ff_vert_mc_qpel_no_rnd_aver_src1_8x8_msa(uint8_t *dest,
  6106.                                               const uint8_t *src,
  6107.                                               ptrdiff_t stride)
  6108. {
  6109.     vert_mc_qpel_no_rnd_aver_src1_8x8_msa(src, stride, dest, stride);
  6110. }
  6111.  
  6112. void ff_vert_mc_qpel_no_rnd_aver_src1_16x16_msa(uint8_t *dest,
  6113.                                                 const uint8_t *src,
  6114.                                                 ptrdiff_t stride)
  6115. {
  6116.     vert_mc_qpel_no_rnd_aver_src1_16x16_msa(src, stride, dest, stride);
  6117. }
  6118.  
  6119. void ff_vert_mc_qpel_avg_dst_aver_src0_8x8_msa(uint8_t *dest,
  6120.                                                const uint8_t *src,
  6121.                                                ptrdiff_t stride)
  6122. {
  6123.     vert_mc_qpel_avg_dst_aver_src0_8x8_msa(src, stride, dest, stride);
  6124. }
  6125.  
  6126. void ff_vert_mc_qpel_avg_dst_aver_src0_16x16_msa(uint8_t *dest,
  6127.                                                  const uint8_t *src,
  6128.                                                  ptrdiff_t stride)
  6129. {
  6130.     vert_mc_qpel_avg_dst_aver_src0_16x16_msa(src, stride, dest, stride);
  6131. }
  6132.  
  6133. void ff_vert_mc_qpel_avg_dst_8x8_msa(uint8_t *dest,
  6134.                                      const uint8_t *src, ptrdiff_t stride)
  6135. {
  6136.     vert_mc_qpel_avg_dst_8x8_msa(src, stride, dest, stride);
  6137. }
  6138.  
  6139. void ff_vert_mc_qpel_avg_dst_16x16_msa(uint8_t *dest,
  6140.                                        const uint8_t *src, ptrdiff_t stride)
  6141. {
  6142.     vert_mc_qpel_avg_dst_16x16_msa(src, stride, dest, stride);
  6143. }
  6144.  
  6145. void ff_vert_mc_qpel_avg_dst_aver_src1_8x8_msa(uint8_t *dest,
  6146.                                                const uint8_t *src,
  6147.                                                ptrdiff_t stride)
  6148. {
  6149.     vert_mc_qpel_avg_dst_aver_src1_8x8_msa(src, stride, dest, stride);
  6150. }
  6151.  
  6152. void ff_vert_mc_qpel_avg_dst_aver_src1_16x16_msa(uint8_t *dest,
  6153.                                                  const uint8_t *src,
  6154.                                                  ptrdiff_t stride)
  6155. {
  6156.     vert_mc_qpel_avg_dst_aver_src1_16x16_msa(src, stride, dest, stride);
  6157. }
  6158.  
  6159. /* HV cases */
  6160. void ff_hv_mc_qpel_aver_hv_src00_16x16_msa(uint8_t *dest,
  6161.                                            const uint8_t *src,
  6162.                                            ptrdiff_t stride)
  6163. {
  6164.     hv_mc_qpel_aver_hv_src00_16x16_msa(src, stride, dest, stride);
  6165. }
  6166.  
  6167. void ff_hv_mc_qpel_aver_hv_src00_8x8_msa(uint8_t *dest,
  6168.                                          const uint8_t *src, ptrdiff_t stride)
  6169. {
  6170.     hv_mc_qpel_aver_hv_src00_8x8_msa(src, stride, dest, stride);
  6171. }
  6172.  
  6173. void ff_hv_mc_qpel_aver_v_src0_16x16_msa(uint8_t *dest,
  6174.                                          const uint8_t *src, ptrdiff_t stride)
  6175. {
  6176.     hv_mc_qpel_aver_v_src0_16x16_msa(src, stride, dest, stride);
  6177. }
  6178.  
  6179. void ff_hv_mc_qpel_aver_v_src0_8x8_msa(uint8_t *dest,
  6180.                                        const uint8_t *src, ptrdiff_t stride)
  6181. {
  6182.     hv_mc_qpel_aver_v_src0_8x8_msa(src, stride, dest, stride);
  6183. }
  6184.  
  6185. void ff_hv_mc_qpel_aver_hv_src10_16x16_msa(uint8_t *dest,
  6186.                                            const uint8_t *src,
  6187.                                            ptrdiff_t stride)
  6188. {
  6189.     hv_mc_qpel_aver_hv_src10_16x16_msa(src, stride, dest, stride);
  6190. }
  6191.  
  6192. void ff_hv_mc_qpel_aver_hv_src10_8x8_msa(uint8_t *dest,
  6193.                                          const uint8_t *src, ptrdiff_t stride)
  6194. {
  6195.     hv_mc_qpel_aver_hv_src10_8x8_msa(src, stride, dest, stride);
  6196. }
  6197.  
  6198. void ff_hv_mc_qpel_aver_h_src0_16x16_msa(uint8_t *dest,
  6199.                                          const uint8_t *src, ptrdiff_t stride)
  6200. {
  6201.     hv_mc_qpel_aver_h_src0_16x16_msa(src, stride, dest, stride);
  6202. }
  6203.  
  6204. void ff_hv_mc_qpel_aver_h_src0_8x8_msa(uint8_t *dest,
  6205.                                        const uint8_t *src, ptrdiff_t stride)
  6206. {
  6207.     hv_mc_qpel_aver_h_src0_8x8_msa(src, stride, dest, stride);
  6208. }
  6209.  
  6210. void ff_hv_mc_qpel_16x16_msa(uint8_t *dest, const uint8_t *src,
  6211.                              ptrdiff_t stride)
  6212. {
  6213.     hv_mc_qpel_16x16_msa(src, stride, dest, stride);
  6214. }
  6215.  
  6216. void ff_hv_mc_qpel_8x8_msa(uint8_t *dest, const uint8_t *src,
  6217.                            ptrdiff_t stride)
  6218. {
  6219.     hv_mc_qpel_8x8_msa(src, stride, dest, stride);
  6220. }
  6221.  
  6222. void ff_hv_mc_qpel_aver_h_src1_16x16_msa(uint8_t *dest,
  6223.                                          const uint8_t *src, ptrdiff_t stride)
  6224. {
  6225.     hv_mc_qpel_aver_h_src1_16x16_msa(src, stride, dest, stride);
  6226. }
  6227.  
  6228. void ff_hv_mc_qpel_aver_h_src1_8x8_msa(uint8_t *dest,
  6229.                                        const uint8_t *src, ptrdiff_t stride)
  6230. {
  6231.     hv_mc_qpel_aver_h_src1_8x8_msa(src, stride, dest, stride);
  6232. }
  6233.  
  6234. void ff_hv_mc_qpel_aver_hv_src01_16x16_msa(uint8_t *dest,
  6235.                                            const uint8_t *src,
  6236.                                            ptrdiff_t stride)
  6237. {
  6238.     hv_mc_qpel_aver_hv_src01_16x16_msa(src, stride, dest, stride);
  6239. }
  6240.  
  6241. void ff_hv_mc_qpel_aver_hv_src01_8x8_msa(uint8_t *dest,
  6242.                                          const uint8_t *src, ptrdiff_t stride)
  6243. {
  6244.     hv_mc_qpel_aver_hv_src01_8x8_msa(src, stride, dest, stride);
  6245. }
  6246.  
  6247. void ff_hv_mc_qpel_aver_v_src1_16x16_msa(uint8_t *dest,
  6248.                                          const uint8_t *src, ptrdiff_t stride)
  6249. {
  6250.     hv_mc_qpel_aver_v_src1_16x16_msa(src, stride, dest, stride);
  6251. }
  6252.  
  6253. void ff_hv_mc_qpel_aver_v_src1_8x8_msa(uint8_t *dest,
  6254.                                        const uint8_t *src, ptrdiff_t stride)
  6255. {
  6256.     hv_mc_qpel_aver_v_src1_8x8_msa(src, stride, dest, stride);
  6257. }
  6258.  
  6259. void ff_hv_mc_qpel_aver_hv_src11_16x16_msa(uint8_t *dest,
  6260.                                            const uint8_t *src,
  6261.                                            ptrdiff_t stride)
  6262. {
  6263.     hv_mc_qpel_aver_hv_src11_16x16_msa(src, stride, dest, stride);
  6264. }
  6265.  
  6266. void ff_hv_mc_qpel_aver_hv_src11_8x8_msa(uint8_t *dest,
  6267.                                          const uint8_t *src, ptrdiff_t stride)
  6268. {
  6269.     hv_mc_qpel_aver_hv_src11_8x8_msa(src, stride, dest, stride);
  6270. }
  6271.  
  6272. void ff_hv_mc_qpel_avg_dst_aver_hv_src00_16x16_msa(uint8_t *dest,
  6273.                                                    const uint8_t *src,
  6274.                                                    ptrdiff_t stride)
  6275. {
  6276.     hv_mc_qpel_avg_dst_aver_hv_src00_16x16_msa(src, stride, dest, stride);
  6277. }
  6278.  
  6279. void ff_hv_mc_qpel_avg_dst_aver_hv_src00_8x8_msa(uint8_t *dest,
  6280.                                                  const uint8_t *src,
  6281.                                                  ptrdiff_t stride)
  6282. {
  6283.     hv_mc_qpel_avg_dst_aver_hv_src00_8x8_msa(src, stride, dest, stride);
  6284. }
  6285.  
  6286. void ff_hv_mc_qpel_avg_dst_aver_v_src0_16x16_msa(uint8_t *dest,
  6287.                                                  const uint8_t *src,
  6288.                                                  ptrdiff_t stride)
  6289. {
  6290.     hv_mc_qpel_avg_dst_aver_v_src0_16x16_msa(src, stride, dest, stride);
  6291. }
  6292.  
  6293. void ff_hv_mc_qpel_avg_dst_aver_v_src0_8x8_msa(uint8_t *dest,
  6294.                                                const uint8_t *src,
  6295.                                                ptrdiff_t stride)
  6296. {
  6297.     hv_mc_qpel_avg_dst_aver_v_src0_8x8_msa(src, stride, dest, stride);
  6298. }
  6299.  
  6300. void ff_hv_mc_qpel_avg_dst_aver_hv_src10_16x16_msa(uint8_t *dest,
  6301.                                                    const uint8_t *src,
  6302.                                                    ptrdiff_t stride)
  6303. {
  6304.     hv_mc_qpel_avg_dst_aver_hv_src10_16x16_msa(src, stride, dest, stride);
  6305. }
  6306.  
  6307. void ff_hv_mc_qpel_avg_dst_aver_hv_src10_8x8_msa(uint8_t *dest,
  6308.                                                  const uint8_t *src,
  6309.                                                  ptrdiff_t stride)
  6310. {
  6311.     hv_mc_qpel_avg_dst_aver_hv_src10_8x8_msa(src, stride, dest, stride);
  6312. }
  6313.  
  6314. void ff_hv_mc_qpel_avg_dst_aver_h_src0_16x16_msa(uint8_t *dest,
  6315.                                                  const uint8_t *src,
  6316.                                                  ptrdiff_t stride)
  6317. {
  6318.     hv_mc_qpel_avg_dst_aver_h_src0_16x16_msa(src, stride, dest, stride);
  6319. }
  6320.  
  6321. void ff_hv_mc_qpel_avg_dst_aver_h_src0_8x8_msa(uint8_t *dest,
  6322.                                                const uint8_t *src,
  6323.                                                ptrdiff_t stride)
  6324. {
  6325.     hv_mc_qpel_avg_dst_aver_h_src0_8x8_msa(src, stride, dest, stride);
  6326. }
  6327.  
  6328. void ff_hv_mc_qpel_avg_dst_16x16_msa(uint8_t *dest,
  6329.                                      const uint8_t *src, ptrdiff_t stride)
  6330. {
  6331.     hv_mc_qpel_avg_dst_16x16_msa(src, stride, dest, stride);
  6332. }
  6333.  
  6334. void ff_hv_mc_qpel_avg_dst_8x8_msa(uint8_t *dest,
  6335.                                    const uint8_t *src, ptrdiff_t stride)
  6336. {
  6337.     hv_mc_qpel_avg_dst_8x8_msa(src, stride, dest, stride);
  6338. }
  6339.  
  6340. void ff_hv_mc_qpel_avg_dst_aver_h_src1_16x16_msa(uint8_t *dest,
  6341.                                                  const uint8_t *src,
  6342.                                                  ptrdiff_t stride)
  6343. {
  6344.     hv_mc_qpel_avg_dst_aver_h_src1_16x16_msa(src, stride, dest, stride);
  6345. }
  6346.  
  6347. void ff_hv_mc_qpel_avg_dst_aver_h_src1_8x8_msa(uint8_t *dest,
  6348.                                                const uint8_t *src,
  6349.                                                ptrdiff_t stride)
  6350. {
  6351.     hv_mc_qpel_avg_dst_aver_h_src1_8x8_msa(src, stride, dest, stride);
  6352. }
  6353.  
  6354. void ff_hv_mc_qpel_avg_dst_aver_hv_src01_16x16_msa(uint8_t *dest,
  6355.                                                    const uint8_t *src,
  6356.                                                    ptrdiff_t stride)
  6357. {
  6358.     hv_mc_qpel_avg_dst_aver_hv_src01_16x16_msa(src, stride, dest, stride);
  6359. }
  6360.  
  6361. void ff_hv_mc_qpel_avg_dst_aver_hv_src01_8x8_msa(uint8_t *dest,
  6362.                                                  const uint8_t *src,
  6363.                                                  ptrdiff_t stride)
  6364. {
  6365.     hv_mc_qpel_avg_dst_aver_hv_src01_8x8_msa(src, stride, dest, stride);
  6366. }
  6367.  
  6368. void ff_hv_mc_qpel_avg_dst_aver_v_src1_16x16_msa(uint8_t *dest,
  6369.                                                  const uint8_t *src,
  6370.                                                  ptrdiff_t stride)
  6371. {
  6372.     hv_mc_qpel_avg_dst_aver_v_src1_16x16_msa(src, stride, dest, stride);
  6373. }
  6374.  
  6375. void ff_hv_mc_qpel_avg_dst_aver_v_src1_8x8_msa(uint8_t *dest,
  6376.                                                const uint8_t *src,
  6377.                                                ptrdiff_t stride)
  6378. {
  6379.     hv_mc_qpel_avg_dst_aver_v_src1_8x8_msa(src, stride, dest, stride);
  6380. }
  6381.  
  6382. void ff_hv_mc_qpel_avg_dst_aver_hv_src11_16x16_msa(uint8_t *dest,
  6383.                                                    const uint8_t *src,
  6384.                                                    ptrdiff_t stride)
  6385. {
  6386.     hv_mc_qpel_avg_dst_aver_hv_src11_16x16_msa(src, stride, dest, stride);
  6387. }
  6388.  
  6389. void ff_hv_mc_qpel_avg_dst_aver_hv_src11_8x8_msa(uint8_t *dest,
  6390.                                                  const uint8_t *src,
  6391.                                                  ptrdiff_t stride)
  6392. {
  6393.     hv_mc_qpel_avg_dst_aver_hv_src11_8x8_msa(src, stride, dest, stride);
  6394. }
  6395.  
  6396. void ff_hv_mc_qpel_no_rnd_aver_hv_src00_16x16_msa(uint8_t *dest,
  6397.                                                   const uint8_t *src,
  6398.                                                   ptrdiff_t stride)
  6399. {
  6400.     hv_mc_qpel_no_rnd_aver_hv_src00_16x16_msa(src, stride, dest, stride);
  6401. }
  6402.  
  6403. void ff_hv_mc_qpel_no_rnd_aver_hv_src00_8x8_msa(uint8_t *dest,
  6404.                                                 const uint8_t *src,
  6405.                                                 ptrdiff_t stride)
  6406. {
  6407.     hv_mc_qpel_no_rnd_aver_hv_src00_8x8_msa(src, stride, dest, stride);
  6408. }
  6409.  
  6410. void ff_hv_mc_qpel_no_rnd_aver_v_src0_16x16_msa(uint8_t *dest,
  6411.                                                 const uint8_t *src,
  6412.                                                 ptrdiff_t stride)
  6413. {
  6414.     hv_mc_qpel_no_rnd_aver_v_src0_16x16_msa(src, stride, dest, stride);
  6415. }
  6416.  
  6417. void ff_hv_mc_qpel_no_rnd_aver_v_src0_8x8_msa(uint8_t *dest,
  6418.                                               const uint8_t *src,
  6419.                                               ptrdiff_t stride)
  6420. {
  6421.     hv_mc_qpel_no_rnd_aver_v_src0_8x8_msa(src, stride, dest, stride);
  6422. }
  6423.  
  6424. void ff_hv_mc_qpel_no_rnd_aver_hv_src10_16x16_msa(uint8_t *dest,
  6425.                                                   const uint8_t *src,
  6426.                                                   ptrdiff_t stride)
  6427. {
  6428.     hv_mc_qpel_no_rnd_aver_hv_src10_16x16_msa(src, stride, dest, stride);
  6429. }
  6430.  
  6431. void ff_hv_mc_qpel_no_rnd_aver_hv_src10_8x8_msa(uint8_t *dest,
  6432.                                                 const uint8_t *src,
  6433.                                                 ptrdiff_t stride)
  6434. {
  6435.     hv_mc_qpel_no_rnd_aver_hv_src10_8x8_msa(src, stride, dest, stride);
  6436. }
  6437.  
  6438. void ff_hv_mc_qpel_no_rnd_aver_h_src0_16x16_msa(uint8_t *dest,
  6439.                                                 const uint8_t *src,
  6440.                                                 ptrdiff_t stride)
  6441. {
  6442.     hv_mc_qpel_no_rnd_aver_h_src0_16x16_msa(src, stride, dest, stride);
  6443. }
  6444.  
  6445. void ff_hv_mc_qpel_no_rnd_aver_h_src0_8x8_msa(uint8_t *dest,
  6446.                                               const uint8_t *src,
  6447.                                               ptrdiff_t stride)
  6448. {
  6449.     hv_mc_qpel_no_rnd_aver_h_src0_8x8_msa(src, stride, dest, stride);
  6450. }
  6451.  
  6452. void ff_hv_mc_qpel_no_rnd_16x16_msa(uint8_t *dest,
  6453.                                     const uint8_t *src, ptrdiff_t stride)
  6454. {
  6455.     hv_mc_qpel_no_rnd_16x16_msa(src, stride, dest, stride);
  6456. }
  6457.  
  6458. void ff_hv_mc_qpel_no_rnd_8x8_msa(uint8_t *dest,
  6459.                                   const uint8_t *src, ptrdiff_t stride)
  6460. {
  6461.     hv_mc_qpel_no_rnd_8x8_msa(src, stride, dest, stride);
  6462. }
  6463.  
  6464. void ff_hv_mc_qpel_no_rnd_aver_h_src1_16x16_msa(uint8_t *dest,
  6465.                                                 const uint8_t *src,
  6466.                                                 ptrdiff_t stride)
  6467. {
  6468.     hv_mc_qpel_no_rnd_aver_h_src1_16x16_msa(src, stride, dest, stride);
  6469. }
  6470.  
  6471. void ff_hv_mc_qpel_no_rnd_aver_h_src1_8x8_msa(uint8_t *dest,
  6472.                                               const uint8_t *src,
  6473.                                               ptrdiff_t stride)
  6474. {
  6475.     hv_mc_qpel_no_rnd_aver_h_src1_8x8_msa(src, stride, dest, stride);
  6476. }
  6477.  
  6478. void ff_hv_mc_qpel_no_rnd_aver_hv_src01_16x16_msa(uint8_t *dest,
  6479.                                                   const uint8_t *src,
  6480.                                                   ptrdiff_t stride)
  6481. {
  6482.     hv_mc_qpel_no_rnd_aver_hv_src01_16x16_msa(src, stride, dest, stride);
  6483. }
  6484.  
  6485. void ff_hv_mc_qpel_no_rnd_aver_hv_src01_8x8_msa(uint8_t *dest,
  6486.                                                 const uint8_t *src,
  6487.                                                 ptrdiff_t stride)
  6488. {
  6489.     hv_mc_qpel_no_rnd_aver_hv_src01_8x8_msa(src, stride, dest, stride);
  6490. }
  6491.  
  6492. void ff_hv_mc_qpel_no_rnd_aver_v_src1_16x16_msa(uint8_t *dest,
  6493.                                                 const uint8_t *src,
  6494.                                                 ptrdiff_t stride)
  6495. {
  6496.     hv_mc_qpel_no_rnd_aver_v_src1_16x16_msa(src, stride, dest, stride);
  6497. }
  6498.  
  6499. void ff_hv_mc_qpel_no_rnd_aver_v_src1_8x8_msa(uint8_t *dest,
  6500.                                               const uint8_t *src,
  6501.                                               ptrdiff_t stride)
  6502. {
  6503.     hv_mc_qpel_no_rnd_aver_v_src1_8x8_msa(src, stride, dest, stride);
  6504. }
  6505.  
  6506. void ff_hv_mc_qpel_no_rnd_aver_hv_src11_16x16_msa(uint8_t *dest,
  6507.                                                   const uint8_t *src,
  6508.                                                   ptrdiff_t stride)
  6509. {
  6510.     hv_mc_qpel_no_rnd_aver_hv_src11_16x16_msa(src, stride, dest, stride);
  6511. }
  6512.  
  6513. void ff_hv_mc_qpel_no_rnd_aver_hv_src11_8x8_msa(uint8_t *dest,
  6514.                                                 const uint8_t *src,
  6515.                                                 ptrdiff_t stride)
  6516. {
  6517.     hv_mc_qpel_no_rnd_aver_hv_src11_8x8_msa(src, stride, dest, stride);
  6518. }
  6519.