diff -uNra ffmpeg-4.1.6.orig/debian/patches/series ffmpeg-4.1.6/debian/patches/series
--- ffmpeg-4.1.6.orig/debian/patches/series	1970-01-01 08:00:00.000000000 +0800
+++ ffmpeg-4.1.6/debian/patches/series	2020-07-19 18:34:49.005398159 +0800
@@ -0,0 +1,2 @@
+0001-loongson_mmi.patch
diff -uNra ffmpeg-4.1.6.orig/debian/rules ffmpeg-4.1.6/debian/rules
--- ffmpeg-4.1.6.orig/debian/rules	2019-05-19 23:17:54.000000000 +0800
+++ ffmpeg-4.1.6/debian/rules	2020-07-19 18:33:01.004316405 +0800
@@ -184,14 +184,8 @@
 endif
 
 ifneq (,$(filter mips%, $(DEB_HOST_ARCH)))
-	CONFIG += --disable-mipsdsp \
-		--disable-mipsdspr2 \
-		--disable-loongson2 \
-		--disable-loongson3 \
-		--disable-mmi \
-		--disable-mips32r5 \
+	CONFIG += --disable-mips32r5 \
 		$(MIPS_R2_R6_CONFIG) \
-		--disable-msa
 endif
 
 # Disable mipsfpu on mips and mipsel, because it is not compatible with the FPXX ABI
--- ffmpeg-4.1.6.orig/debian/changelog	2020-07-08 00:50:33.000000000 +0800
+++ ffmpeg-4.1.6/debian/changelog	2020-07-19 19:59:25.325920873 +0800
@@ -1,3 +1,10 @@
+ffmpeg (7:4.1.6-1~deb10u1loongson) buster; urgency=medium
+
+  * Non-maintainer upload.
+  * https://gitee.com/flygoat/FFmpeg/tree/for-buster, by Jiaxun Yang <jiaxun.yang@flygoat.com>
+
+ -- liu shiwei <liushiwei@gmail.com>  Sun, 19 Jul 2020 19:56:44 +0800
+
 ffmpeg (7:4.1.6-1~deb10u1) buster-security; urgency=medium
 
   * New upstream release
diff -uNra ffmpeg-4.1.6.orig/debian/patches/0001-loongson_mmi.patch ffmpeg-4.1.6/debian/patches/0001-loongson_mmi.patch
--- ffmpeg-4.1.6.orig/debian/patches/0001-loongson_mmi.patch	1970-01-01 08:00:00.000000000 +0800
+++ ffmpeg-4.1.6/debian/patches/0001-loongson_mmi.patch	2020-07-19 18:31:43.449745231 +0800
@@ -0,0 +1,19166 @@
+diff -uNra ffmpeg-4.1.6/ffbuild/common.mak FFmpeg/ffbuild/common.mak
+--- a/ffbuild/common.mak	2020-07-05 06:36:01.000000000 +0800
++++ b/ffbuild/common.mak	2020-07-19 18:19:52.568669890 +0800
+@@ -45,7 +45,7 @@
+ 
+ define COMPILE
+        $(call $(1)DEP,$(1))
+-       $($(1)) $($(1)FLAGS) $($(1)_DEPFLAGS) $($(1)_C) $($(1)_O) $(patsubst $(SRC_PATH)/%,$(SRC_LINK)/%,$<)
++       $($(1)) $($(1)FLAGS) $($(2)) $($(1)_DEPFLAGS) $($(1)_C) $($(1)_O) $(patsubst $(SRC_PATH)/%,$(SRC_LINK)/%,$<)
+ endef
+ 
+ COMPILE_C = $(call COMPILE,CC)
+@@ -55,6 +55,14 @@
+ COMPILE_X86ASM = $(call COMPILE,X86ASM)
+ COMPILE_HOSTC = $(call COMPILE,HOSTCC)
+ COMPILE_NVCC = $(call COMPILE,NVCC)
++COMPILE_MMI = $(call COMPILE,CC,MMIFLAGS)
++COMPILE_MSA = $(call COMPILE,CC,MSAFLAGS)
++
++%_mmi.o: %_mmi.c
++	$(COMPILE_MMI)
++
++%_msa.o: %_msa.c
++	$(COMPILE_MSA)
+ 
+ %.o: %.c
+ 	$(COMPILE_C)
+diff -uNra ffmpeg-4.1.6/libavcodec/mips/aacdec_mips.c FFmpeg/libavcodec/mips/aacdec_mips.c
+--- a/libavcodec/mips/aacdec_mips.c	2020-07-03 01:22:31.000000000 +0800
++++ b/libavcodec/mips/aacdec_mips.c	2020-07-19 18:13:57.434942372 +0800
+@@ -59,6 +59,7 @@
+ #include "libavutil/mips/asmdefs.h"
+ 
+ #if HAVE_INLINE_ASM
++#if HAVE_MIPSFPU
+ static av_always_inline void float_copy(float *dst, const float *src, int count)
+ {
+     // Copy 'count' floats from src to dst
+@@ -237,9 +238,9 @@
+ 
+         if (ltp->lag < 1024)
+             num_samples = ltp->lag + 1024;
+-            j = (2048 - num_samples) >> 2;
+-            k = (2048 - num_samples) & 3;
+-            p_predTime = &predTime[num_samples];
++        j = (2048 - num_samples) >> 2;
++        k = (2048 - num_samples) & 3;
++        p_predTime = &predTime[num_samples];
+ 
+         for (i = 0; i < num_samples; i++)
+             predTime[i] = sce->ltp_state[i + 2048 - ltp->lag] * ltp->coef;
+@@ -282,7 +283,6 @@
+     }
+ }
+ 
+-#if HAVE_MIPSFPU
+ static av_always_inline void fmul_and_reverse(float *dst, const float *src0, const float *src1, int count)
+ {
+     /* Multiply 'count' floats in src0 by src1 and store the results in dst in reverse */
+@@ -433,9 +433,9 @@
+ void ff_aacdec_init_mips(AACContext *c)
+ {
+ #if HAVE_INLINE_ASM
++#if HAVE_MIPSFPU
+     c->imdct_and_windowing         = imdct_and_windowing_mips;
+     c->apply_ltp                   = apply_ltp_mips;
+-#if HAVE_MIPSFPU
+     c->update_ltp                  = update_ltp_mips;
+ #endif /* HAVE_MIPSFPU */
+ #endif /* HAVE_INLINE_ASM */
+diff -uNra ffmpeg-4.1.6/libavcodec/mips/aacpsdsp_mips.c FFmpeg/libavcodec/mips/aacpsdsp_mips.c
+--- a/libavcodec/mips/aacpsdsp_mips.c	2020-07-03 01:22:31.000000000 +0800
++++ b/libavcodec/mips/aacpsdsp_mips.c	2020-07-19 18:13:57.434942372 +0800
+@@ -57,6 +57,7 @@
+ #include "libavutil/mips/asmdefs.h"
+ 
+ #if HAVE_INLINE_ASM
++#if HAVE_MIPSFPU
+ static void ps_hybrid_analysis_ileave_mips(float (*out)[32][2], float L[2][38][64],
+                                         int i, int len)
+ {
+@@ -187,7 +188,6 @@
+     }
+ }
+ 
+-#if HAVE_MIPSFPU
+ #if !HAVE_MIPS32R6 && !HAVE_MIPS64R6
+ static void ps_add_squares_mips(float *dst, const float (*src)[2], int n)
+ {
+@@ -450,9 +450,9 @@
+ void ff_psdsp_init_mips(PSDSPContext *s)
+ {
+ #if HAVE_INLINE_ASM
++#if HAVE_MIPSFPU
+     s->hybrid_analysis_ileave = ps_hybrid_analysis_ileave_mips;
+     s->hybrid_synthesis_deint = ps_hybrid_synthesis_deint_mips;
+-#if HAVE_MIPSFPU
+ #if !HAVE_MIPS32R6 && !HAVE_MIPS64R6
+     s->add_squares            = ps_add_squares_mips;
+     s->mul_pair_single        = ps_mul_pair_single_mips;
+diff -uNra ffmpeg-4.1.6/libavcodec/mips/aacsbr_mips.c FFmpeg/libavcodec/mips/aacsbr_mips.c
+--- a/libavcodec/mips/aacsbr_mips.c	2020-07-03 01:22:31.000000000 +0800
++++ b/libavcodec/mips/aacsbr_mips.c	2020-07-19 18:13:57.434942372 +0800
+@@ -58,6 +58,7 @@
+ #define ENVELOPE_ADJUSTMENT_OFFSET 2
+ 
+ #if HAVE_INLINE_ASM
++#if HAVE_MIPSFPU
+ static int sbr_lf_gen_mips(AACContext *ac, SpectralBandReplication *sbr,
+                       float X_low[32][40][2], const float W[2][32][32][2],
+                       int buf_idx)
+@@ -310,7 +311,6 @@
+       return 0;
+ }
+ 
+-#if HAVE_MIPSFPU
+ #if !HAVE_MIPS32R6 && !HAVE_MIPS64R6
+ static void sbr_hf_assemble_mips(float Y1[38][64][2],
+                             const float X_high[64][40][2],
+@@ -611,9 +611,9 @@
+ void ff_aacsbr_func_ptr_init_mips(AACSBRContext *c)
+ {
+ #if HAVE_INLINE_ASM
++#if HAVE_MIPSFPU
+     c->sbr_lf_gen            = sbr_lf_gen_mips;
+     c->sbr_x_gen             = sbr_x_gen_mips;
+-#if HAVE_MIPSFPU
+ #if !HAVE_MIPS32R6 && !HAVE_MIPS64R6
+     c->sbr_hf_inverse_filter = sbr_hf_inverse_filter_mips;
+     c->sbr_hf_assemble       = sbr_hf_assemble_mips;
+diff -uNra ffmpeg-4.1.6/libavcodec/mips/blockdsp_init_mips.c FFmpeg/libavcodec/mips/blockdsp_init_mips.c
+--- a/libavcodec/mips/blockdsp_init_mips.c	2020-07-03 01:22:31.000000000 +0800
++++ b/libavcodec/mips/blockdsp_init_mips.c	2020-07-19 18:19:52.752365140 +0800
+@@ -19,36 +19,26 @@
+  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+  */
+ 
++#include "libavutil/mips/cpu.h"
+ #include "blockdsp_mips.h"
+ 
+-#if HAVE_MSA
+-static av_cold void blockdsp_init_msa(BlockDSPContext *c)
+-{
+-    c->clear_block = ff_clear_block_msa;
+-    c->clear_blocks = ff_clear_blocks_msa;
+-
+-    c->fill_block_tab[0] = ff_fill_block16_msa;
+-    c->fill_block_tab[1] = ff_fill_block8_msa;
+-}
+-#endif  // #if HAVE_MSA
+-
+-#if HAVE_MMI
+-static av_cold void blockdsp_init_mmi(BlockDSPContext *c)
+-{
+-    c->clear_block = ff_clear_block_mmi;
+-    c->clear_blocks = ff_clear_blocks_mmi;
+-
+-    c->fill_block_tab[0] = ff_fill_block16_mmi;
+-    c->fill_block_tab[1] = ff_fill_block8_mmi;
+-}
+-#endif /* HAVE_MMI */
+-
+ void ff_blockdsp_init_mips(BlockDSPContext *c)
+ {
+-#if HAVE_MSA
+-    blockdsp_init_msa(c);
+-#endif  // #if HAVE_MSA
+-#if HAVE_MMI
+-    blockdsp_init_mmi(c);
+-#endif /* HAVE_MMI */
++    int cpu_flags = av_get_cpu_flags();
++
++    if (have_mmi(cpu_flags)) {
++        c->clear_block = ff_clear_block_mmi;
++        c->clear_blocks = ff_clear_blocks_mmi;
++
++        c->fill_block_tab[0] = ff_fill_block16_mmi;
++        c->fill_block_tab[1] = ff_fill_block8_mmi;
++    }
++
++    if (have_msa(cpu_flags)) {
++        c->clear_block = ff_clear_block_msa;
++        c->clear_blocks = ff_clear_blocks_msa;
++
++        c->fill_block_tab[0] = ff_fill_block16_msa;
++        c->fill_block_tab[1] = ff_fill_block8_msa;
++    }
+ }
+diff -uNra ffmpeg-4.1.6/libavcodec/mips/cabac.h FFmpeg/libavcodec/mips/cabac.h
+--- a/libavcodec/mips/cabac.h	2020-07-05 06:36:01.000000000 +0800
++++ b/libavcodec/mips/cabac.h	2020-07-19 18:13:57.438850781 +0800
+@@ -25,11 +25,11 @@
+ #define AVCODEC_MIPS_CABAC_H
+ 
+ #include "libavcodec/cabac.h"
+-#include "libavutil/mips/mmiutils.h"
++#include "libavutil/mips/asmdefs.h"
+ #include "config.h"
+ 
+ #define get_cabac_inline get_cabac_inline_mips
+-static av_always_inline int get_cabac_inline(CABACContext *c,
++static av_always_inline int get_cabac_inline_mips(CABACContext *c,
+                                              uint8_t * const state){
+     mips_reg tmp0, tmp1, tmp2, bit;
+ 
+@@ -72,7 +72,7 @@
+ 
+         "and          %[tmp0],       %[c_low],       %[cabac_mask] \n\t"
+         "bnez         %[tmp0],       1f                            \n\t"
+-        PTR_ADDI     "%[tmp0],       %[c_low],       -0X01         \n\t"
++        PTR_ADDIU    "%[tmp0],       %[c_low],       -0x01         \n\t"
+         "xor          %[tmp0],       %[c_low],       %[tmp0]       \n\t"
+         PTR_SRA      "%[tmp0],       %[tmp0],        0x0f          \n\t"
+         PTR_ADDU     "%[tmp0],       %[tmp0],        %[tables]     \n\t"
+diff -uNra ffmpeg-4.1.6/libavcodec/mips/h263dsp_init_mips.c FFmpeg/libavcodec/mips/h263dsp_init_mips.c
+--- a/libavcodec/mips/h263dsp_init_mips.c	2020-04-28 05:48:15.000000000 +0800
++++ b/libavcodec/mips/h263dsp_init_mips.c	2020-07-19 18:19:52.752365140 +0800
+@@ -18,19 +18,15 @@
+  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+  */
+ 
++#include "libavutil/mips/cpu.h"
+ #include "h263dsp_mips.h"
+ 
+-#if HAVE_MSA
+-static av_cold void h263dsp_init_msa(H263DSPContext *c)
+-{
+-    c->h263_h_loop_filter = ff_h263_h_loop_filter_msa;
+-    c->h263_v_loop_filter = ff_h263_v_loop_filter_msa;
+-}
+-#endif  // #if HAVE_MSA
+-
+ av_cold void ff_h263dsp_init_mips(H263DSPContext *c)
+ {
+-#if HAVE_MSA
+-    h263dsp_init_msa(c);
+-#endif  // #if HAVE_MSA
++    int cpu_flags = av_get_cpu_flags();
++
++    if (have_msa(cpu_flags)){
++        c->h263_h_loop_filter = ff_h263_h_loop_filter_msa;
++        c->h263_v_loop_filter = ff_h263_v_loop_filter_msa;
++    }
+ }
+diff -uNra ffmpeg-4.1.6/libavcodec/mips/h263dsp_msa.c FFmpeg/libavcodec/mips/h263dsp_msa.c
+--- a/libavcodec/mips/h263dsp_msa.c	2020-07-03 01:22:31.000000000 +0800
++++ b/libavcodec/mips/h263dsp_msa.c	2020-07-19 18:13:57.442759191 +0800
+@@ -86,10 +86,7 @@
+     ILVR_B2_SH(in3, in0, in1, in2, temp0, temp1);
+     in0 = (v16u8) __msa_ilvr_h(temp1, temp0);
+     in3 = (v16u8) __msa_ilvl_h(temp1, temp0);
+-    ST4x4_UB(in0, in0, 0, 1, 2, 3, src, stride);
+-    src += 4 * stride;
+-    ST4x4_UB(in3, in3, 0, 1, 2, 3, src, stride);
+-    src += 4 * stride;
++    ST_W8(in0, in3, 0, 1, 2, 3, 0, 1, 2, 3, src, stride);
+ }
+ 
+ static void h263_v_loop_filter_msa(uint8_t *src, int32_t stride, int32_t qscale)
+diff -uNra ffmpeg-4.1.6/libavcodec/mips/h264chroma_init_mips.c FFmpeg/libavcodec/mips/h264chroma_init_mips.c
+--- a/libavcodec/mips/h264chroma_init_mips.c	2020-07-03 01:22:31.000000000 +0800
++++ b/libavcodec/mips/h264chroma_init_mips.c	2020-07-19 18:19:52.752365140 +0800
+@@ -19,45 +19,34 @@
+  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+  */
+ 
++#include "libavutil/mips/cpu.h"
+ #include "h264chroma_mips.h"
+ 
+-#if HAVE_MSA
+-static av_cold void h264chroma_init_msa(H264ChromaContext *c, int bit_depth)
+-{
+-    const int high_bit_depth = bit_depth > 8;
+ 
+-    if (!high_bit_depth) {
+-        c->put_h264_chroma_pixels_tab[0] = ff_put_h264_chroma_mc8_msa;
+-        c->put_h264_chroma_pixels_tab[1] = ff_put_h264_chroma_mc4_msa;
+-        c->put_h264_chroma_pixels_tab[2] = ff_put_h264_chroma_mc2_msa;
+-
+-        c->avg_h264_chroma_pixels_tab[0] = ff_avg_h264_chroma_mc8_msa;
+-        c->avg_h264_chroma_pixels_tab[1] = ff_avg_h264_chroma_mc4_msa;
+-        c->avg_h264_chroma_pixels_tab[2] = ff_avg_h264_chroma_mc2_msa;
+-    }
+-}
+-#endif  // #if HAVE_MSA
+-
+-#if HAVE_MMI
+-static av_cold void h264chroma_init_mmi(H264ChromaContext *c, int bit_depth)
++av_cold void ff_h264chroma_init_mips(H264ChromaContext *c, int bit_depth)
+ {
++    int cpu_flags = av_get_cpu_flags();
+     int high_bit_depth = bit_depth > 8;
+ 
+-    if (!high_bit_depth) {
+-        c->put_h264_chroma_pixels_tab[0] = ff_put_h264_chroma_mc8_mmi;
+-        c->avg_h264_chroma_pixels_tab[0] = ff_avg_h264_chroma_mc8_mmi;
+-        c->put_h264_chroma_pixels_tab[1] = ff_put_h264_chroma_mc4_mmi;
+-        c->avg_h264_chroma_pixels_tab[1] = ff_avg_h264_chroma_mc4_mmi;
++    /* MMI apears to be faster than MSA here */
++    if (have_msa(cpu_flags)) {
++        if (!high_bit_depth) {
++            c->put_h264_chroma_pixels_tab[0] = ff_put_h264_chroma_mc8_msa;
++            c->put_h264_chroma_pixels_tab[1] = ff_put_h264_chroma_mc4_msa;
++            c->put_h264_chroma_pixels_tab[2] = ff_put_h264_chroma_mc2_msa;
++
++            c->avg_h264_chroma_pixels_tab[0] = ff_avg_h264_chroma_mc8_msa;
++            c->avg_h264_chroma_pixels_tab[1] = ff_avg_h264_chroma_mc4_msa;
++            c->avg_h264_chroma_pixels_tab[2] = ff_avg_h264_chroma_mc2_msa;
++        }
+     }
+-}
+-#endif /* HAVE_MMI */
+ 
+-av_cold void ff_h264chroma_init_mips(H264ChromaContext *c, int bit_depth)
+-{
+-#if HAVE_MSA
+-    h264chroma_init_msa(c, bit_depth);
+-#endif  // #if HAVE_MSA
+-#if HAVE_MMI
+-    h264chroma_init_mmi(c, bit_depth);
+-#endif /* HAVE_MMI */
++    if (have_mmi(cpu_flags)) {
++        if (!high_bit_depth) {
++            c->put_h264_chroma_pixels_tab[0] = ff_put_h264_chroma_mc8_mmi;
++            c->avg_h264_chroma_pixels_tab[0] = ff_avg_h264_chroma_mc8_mmi;
++            c->put_h264_chroma_pixels_tab[1] = ff_put_h264_chroma_mc4_mmi;
++            c->avg_h264_chroma_pixels_tab[1] = ff_avg_h264_chroma_mc4_mmi;
++        }
++    }
+ }
+diff -uNra ffmpeg-4.1.6/libavcodec/mips/h264chroma_mmi.c FFmpeg/libavcodec/mips/h264chroma_mmi.c
+--- a/libavcodec/mips/h264chroma_mmi.c	2020-07-05 06:36:01.000000000 +0800
++++ b/libavcodec/mips/h264chroma_mmi.c	2020-07-19 18:13:57.450576010 +0800
+@@ -30,74 +30,177 @@
+         int h, int x, int y)
+ {
+     int A = 64, B, C, D, E;
+-    double ftmp[10];
++    double ftmp[12];
+     uint64_t tmp[1];
+ 
+     if (!(x || y)) {
+         /* x=0, y=0, A=64 */
+         __asm__ volatile (
+-            "xor        %[ftmp0],   %[ftmp0],       %[ftmp0]           \n\t"
+-            "dli        %[tmp0],    0x06                               \n\t"
+-            "mtc1       %[tmp0],    %[ftmp4]                           \n\t"
+-
+             "1:                                                        \n\t"
++            MMI_ULDC1(%[ftmp0], %[src], 0x00)
++            PTR_ADDU   "%[src],     %[src],         %[stride]          \n\t"
+             MMI_ULDC1(%[ftmp1], %[src], 0x00)
+-            "addi       %[h],       %[h],           -0x04              \n\t"
+             PTR_ADDU   "%[src],     %[src],         %[stride]          \n\t"
+-            MMI_ULDC1(%[ftmp5], %[src], 0x00)
++            MMI_ULDC1(%[ftmp2], %[src], 0x00)
+             PTR_ADDU   "%[src],     %[src],         %[stride]          \n\t"
+-            MMI_ULDC1(%[ftmp6], %[src], 0x00)
++            MMI_ULDC1(%[ftmp3], %[src], 0x00)
+             PTR_ADDU   "%[src],     %[src],         %[stride]          \n\t"
+-            MMI_ULDC1(%[ftmp7], %[src], 0x00)
+ 
+-            "punpcklbh  %[ftmp2],   %[ftmp1],       %[ftmp0]           \n\t"
+-            "punpckhbh  %[ftmp3],   %[ftmp1],       %[ftmp0]           \n\t"
+-            "psllh      %[ftmp1],   %[ftmp2],       %[ftmp4]           \n\t"
+-            "psllh      %[ftmp2],   %[ftmp3],       %[ftmp4]           \n\t"
+-            "paddh      %[ftmp1],   %[ftmp1],       %[ff_pw_32]        \n\t"
+-            "paddh      %[ftmp2],   %[ftmp2],       %[ff_pw_32]        \n\t"
+-            "psrlh      %[ftmp1],   %[ftmp1],       %[ftmp4]           \n\t"
+-            "psrlh      %[ftmp2],   %[ftmp2],       %[ftmp4]           \n\t"
+-            "packushb   %[ftmp1],   %[ftmp1],       %[ftmp2]           \n\t"
+-            MMI_SDC1(%[ftmp1], %[dst], 0x00)
++            "addi       %[h],       %[h],           -0x04              \n\t"
+ 
+-            "punpcklbh  %[ftmp2],   %[ftmp5],       %[ftmp0]           \n\t"
+-            "punpckhbh  %[ftmp3],   %[ftmp5],       %[ftmp0]           \n\t"
+-            "psllh      %[ftmp1],   %[ftmp2],       %[ftmp4]           \n\t"
+-            "psllh      %[ftmp2],   %[ftmp3],       %[ftmp4]           \n\t"
+-            "paddh      %[ftmp1],   %[ftmp1],       %[ff_pw_32]        \n\t"
+-            "paddh      %[ftmp2],   %[ftmp2],       %[ff_pw_32]        \n\t"
+-            "psrlh      %[ftmp1],   %[ftmp1],       %[ftmp4]           \n\t"
+-            "psrlh      %[ftmp2],   %[ftmp2],       %[ftmp4]           \n\t"
+-            "packushb   %[ftmp1],   %[ftmp1],       %[ftmp2]           \n\t"
++            MMI_SDC1(%[ftmp0], %[dst], 0x00)
+             PTR_ADDU   "%[dst],     %[dst],         %[stride]          \n\t"
+             MMI_SDC1(%[ftmp1], %[dst], 0x00)
++            PTR_ADDU   "%[dst],     %[dst],         %[stride]          \n\t"
++            MMI_SDC1(%[ftmp2], %[dst], 0x00)
++            PTR_ADDU   "%[dst],     %[dst],         %[stride]          \n\t"
++            MMI_SDC1(%[ftmp3], %[dst], 0x00)
++            PTR_ADDU   "%[dst],     %[dst],         %[stride]          \n\t"
++            "bnez       %[h],       1b                                 \n\t"
++            : [ftmp0]"=&f"(ftmp[0]),        [ftmp1]"=&f"(ftmp[1]),
++              [ftmp2]"=&f"(ftmp[2]),        [ftmp3]"=&f"(ftmp[3]),
++              [dst]"+&r"(dst),              [src]"+&r"(src),
++              [h]"+&r"(h)
++            : [stride]"r"((mips_reg)stride)
++            : "memory"
++        );
++    } else if (x && y) {
++        /* x!=0, y!=0 */
++        D = x * y;
++        B = (x << 3) - D;
++        C = (y << 3) - D;
++        A = 64 - D - B - C;
+ 
+-            "punpcklbh  %[ftmp2],   %[ftmp6],       %[ftmp0]           \n\t"
+-            "punpckhbh  %[ftmp3],   %[ftmp6],       %[ftmp0]           \n\t"
+-            "psllh      %[ftmp1],   %[ftmp2],       %[ftmp4]           \n\t"
+-            "psllh      %[ftmp2],   %[ftmp3],       %[ftmp4]           \n\t"
++        __asm__ volatile (
++            "xor        %[ftmp0],   %[ftmp0],       %[ftmp0]           \n\t"
++            "dli        %[tmp0],    0x06                               \n\t"
++            "pshufh     %[A],       %[A],           %[ftmp0]           \n\t"
++            "pshufh     %[B],       %[B],           %[ftmp0]           \n\t"
++            "mtc1       %[tmp0],    %[ftmp9]                           \n\t"
++            "pshufh     %[C],       %[C],           %[ftmp0]           \n\t"
++            "pshufh     %[D],       %[D],           %[ftmp0]           \n\t"
++
++            "1:                                                        \n\t"
++            MMI_ULDC1(%[ftmp1], %[src], 0x00)
++            MMI_ULDC1(%[ftmp2], %[src], 0x01)
++            PTR_ADDU   "%[src],     %[src],         %[stride]          \n\t"
++            MMI_ULDC1(%[ftmp3], %[src], 0x00)
++            MMI_ULDC1(%[ftmp4], %[src], 0x01)
++            PTR_ADDU   "%[src],     %[src],         %[stride]          \n\t"
++            MMI_ULDC1(%[ftmp10], %[src], 0x00)
++            MMI_ULDC1(%[ftmp11], %[src], 0x01)
++            "addi       %[h],       %[h],           -0x02              \n\t"
++
++            "punpcklbh  %[ftmp5],   %[ftmp1],       %[ftmp0]           \n\t"
++            "punpckhbh  %[ftmp6],   %[ftmp1],       %[ftmp0]           \n\t"
++            "punpcklbh  %[ftmp7],   %[ftmp2],       %[ftmp0]           \n\t"
++            "punpckhbh  %[ftmp8],   %[ftmp2],       %[ftmp0]           \n\t"
++            "pmullh     %[ftmp5],   %[ftmp5],       %[A]               \n\t"
++            "pmullh     %[ftmp7],   %[ftmp7],       %[B]               \n\t"
++            "paddh      %[ftmp1],   %[ftmp5],       %[ftmp7]           \n\t"
++            "pmullh     %[ftmp6],   %[ftmp6],       %[A]               \n\t"
++            "pmullh     %[ftmp8],   %[ftmp8],       %[B]               \n\t"
++            "paddh      %[ftmp2],   %[ftmp6],       %[ftmp8]           \n\t"
++            "punpcklbh  %[ftmp5],   %[ftmp3],       %[ftmp0]           \n\t"
++            "punpckhbh  %[ftmp6],   %[ftmp3],       %[ftmp0]           \n\t"
++            "punpcklbh  %[ftmp7],   %[ftmp4],       %[ftmp0]           \n\t"
++            "punpckhbh  %[ftmp8],   %[ftmp4],       %[ftmp0]           \n\t"
++            "pmullh     %[ftmp5],   %[ftmp5],       %[C]               \n\t"
++            "pmullh     %[ftmp7],   %[ftmp7],       %[D]               \n\t"
++            "paddh      %[ftmp5],   %[ftmp5],       %[ftmp7]           \n\t"
++            "pmullh     %[ftmp6],   %[ftmp6],       %[C]               \n\t"
++            "pmullh     %[ftmp8],   %[ftmp8],       %[D]               \n\t"
++            "paddh      %[ftmp6],   %[ftmp6],       %[ftmp8]           \n\t"
++            "paddh      %[ftmp1],   %[ftmp1],       %[ftmp5]           \n\t"
++            "paddh      %[ftmp2],   %[ftmp2],       %[ftmp6]           \n\t"
+             "paddh      %[ftmp1],   %[ftmp1],       %[ff_pw_32]        \n\t"
+             "paddh      %[ftmp2],   %[ftmp2],       %[ff_pw_32]        \n\t"
+-            "psrlh      %[ftmp1],   %[ftmp1],       %[ftmp4]           \n\t"
+-            "psrlh      %[ftmp2],   %[ftmp2],       %[ftmp4]           \n\t"
++            "psrlh      %[ftmp1],   %[ftmp1],       %[ftmp9]           \n\t"
++            "psrlh      %[ftmp2],   %[ftmp2],       %[ftmp9]           \n\t"
+             "packushb   %[ftmp1],   %[ftmp1],       %[ftmp2]           \n\t"
+-            PTR_ADDU   "%[dst],     %[dst],         %[stride]          \n\t"
++
++            "punpcklbh  %[ftmp5],   %[ftmp3],       %[ftmp0]           \n\t"
++            "punpckhbh  %[ftmp6],   %[ftmp3],       %[ftmp0]           \n\t"
++            "punpcklbh  %[ftmp7],   %[ftmp4],       %[ftmp0]           \n\t"
++            "punpckhbh  %[ftmp8],   %[ftmp4],       %[ftmp0]           \n\t"
++            "pmullh     %[ftmp5],   %[ftmp5],       %[A]               \n\t"
++            "pmullh     %[ftmp7],   %[ftmp7],       %[B]               \n\t"
++            "paddh      %[ftmp3],   %[ftmp5],       %[ftmp7]           \n\t"
++            "pmullh     %[ftmp6],   %[ftmp6],       %[A]               \n\t"
++            "pmullh     %[ftmp8],   %[ftmp8],       %[B]               \n\t"
++            "paddh      %[ftmp4],   %[ftmp6],       %[ftmp8]           \n\t"
++            "punpcklbh  %[ftmp5],   %[ftmp10],      %[ftmp0]           \n\t"
++            "punpckhbh  %[ftmp6],   %[ftmp10],      %[ftmp0]           \n\t"
++            "punpcklbh  %[ftmp7],   %[ftmp11],      %[ftmp0]           \n\t"
++            "punpckhbh  %[ftmp8],   %[ftmp11],      %[ftmp0]           \n\t"
++            "pmullh     %[ftmp5],   %[ftmp5],       %[C]               \n\t"
++            "pmullh     %[ftmp7],   %[ftmp7],       %[D]               \n\t"
++            "paddh      %[ftmp5],   %[ftmp5],       %[ftmp7]           \n\t"
++            "pmullh     %[ftmp6],   %[ftmp6],       %[C]               \n\t"
++            "pmullh     %[ftmp8],   %[ftmp8],       %[D]               \n\t"
++            "paddh      %[ftmp6],   %[ftmp6],       %[ftmp8]           \n\t"
++            "paddh      %[ftmp3],   %[ftmp3],       %[ftmp5]           \n\t"
++            "paddh      %[ftmp4],   %[ftmp4],       %[ftmp6]           \n\t"
++            "paddh      %[ftmp3],   %[ftmp3],       %[ff_pw_32]        \n\t"
++            "paddh      %[ftmp4],   %[ftmp4],       %[ff_pw_32]        \n\t"
++            "psrlh      %[ftmp3],   %[ftmp3],       %[ftmp9]           \n\t"
++            "psrlh      %[ftmp4],   %[ftmp4],       %[ftmp9]           \n\t"
++            "packushb   %[ftmp3],   %[ftmp3],       %[ftmp4]           \n\t"
++
+             MMI_SDC1(%[ftmp1], %[dst], 0x00)
++            PTR_ADDU   "%[dst],     %[dst],         %[stride]          \n\t"
++            MMI_SDC1(%[ftmp3], %[dst], 0x00)
++            PTR_ADDU   "%[dst],     %[dst],         %[stride]          \n\t"
++            "bnez       %[h],       1b                                 \n\t"
++            : [ftmp0]"=&f"(ftmp[0]),        [ftmp1]"=&f"(ftmp[1]),
++              [ftmp2]"=&f"(ftmp[2]),        [ftmp3]"=&f"(ftmp[3]),
++              [ftmp4]"=&f"(ftmp[4]),        [ftmp5]"=&f"(ftmp[5]),
++              [ftmp6]"=&f"(ftmp[6]),        [ftmp7]"=&f"(ftmp[7]),
++              [ftmp8]"=&f"(ftmp[8]),        [ftmp9]"=&f"(ftmp[9]),
++              [ftmp10]"=&f"(ftmp[10]),      [ftmp11]"=&f"(ftmp[11]),
++              [tmp0]"=&r"(tmp[0]),
++              [dst]"+&r"(dst),              [src]"+&r"(src),
++              [h]"+&r"(h)
++            : [stride]"r"((mips_reg)stride),[ff_pw_32]"f"(ff_pw_32),
++              [A]"f"(A),                    [B]"f"(B),
++              [C]"f"(C),                    [D]"f"(D)
++            : "memory"
++        );
++    } else if (x) {
++        /* x!=0, y==0 */
++        E = x << 3;
++        A = 64 - E;
++
++        __asm__ volatile (
++            "xor        %[ftmp0],   %[ftmp0],       %[ftmp0]           \n\t"
++            "dli        %[tmp0],    0x06                               \n\t"
++            "pshufh     %[A],       %[A],           %[ftmp0]           \n\t"
++            "pshufh     %[E],       %[E],           %[ftmp0]           \n\t"
++            "mtc1       %[tmp0],    %[ftmp7]                           \n\t"
++
++            "1:                                                        \n\t"
++            MMI_ULDC1(%[ftmp1], %[src], 0x00)
++            MMI_ULDC1(%[ftmp2], %[src], 0x01)
++            "addi       %[h],       %[h],           -0x01              \n\t"
++            PTR_ADDU   "%[src],     %[src],         %[stride]          \n\t"
++
++            "punpcklbh  %[ftmp3],   %[ftmp1],       %[ftmp0]           \n\t"
++            "punpckhbh  %[ftmp4],   %[ftmp1],       %[ftmp0]           \n\t"
++            "punpcklbh  %[ftmp5],   %[ftmp2],       %[ftmp0]           \n\t"
++            "punpckhbh  %[ftmp6],   %[ftmp2],       %[ftmp0]           \n\t"
++            "pmullh     %[ftmp3],   %[ftmp3],       %[A]               \n\t"
++            "pmullh     %[ftmp5],   %[ftmp5],       %[E]               \n\t"
++            "paddh      %[ftmp1],   %[ftmp3],       %[ftmp5]           \n\t"
++            "pmullh     %[ftmp4],   %[ftmp4],       %[A]               \n\t"
++            "pmullh     %[ftmp6],   %[ftmp6],       %[E]               \n\t"
++            "paddh      %[ftmp2],   %[ftmp4],       %[ftmp6]           \n\t"
+ 
+-            "punpcklbh  %[ftmp2],   %[ftmp7],       %[ftmp0]           \n\t"
+-            "punpckhbh  %[ftmp3],   %[ftmp7],       %[ftmp0]           \n\t"
+-            "psllh      %[ftmp1],   %[ftmp2],       %[ftmp4]           \n\t"
+-            "psllh      %[ftmp2],   %[ftmp3],       %[ftmp4]           \n\t"
+             "paddh      %[ftmp1],   %[ftmp1],       %[ff_pw_32]        \n\t"
+             "paddh      %[ftmp2],   %[ftmp2],       %[ff_pw_32]        \n\t"
+-            "psrlh      %[ftmp1],   %[ftmp1],       %[ftmp4]           \n\t"
+-            "psrlh      %[ftmp2],   %[ftmp2],       %[ftmp4]           \n\t"
++            "psrlh      %[ftmp1],   %[ftmp1],       %[ftmp7]           \n\t"
++            "psrlh      %[ftmp2],   %[ftmp2],       %[ftmp7]           \n\t"
+             "packushb   %[ftmp1],   %[ftmp1],       %[ftmp2]           \n\t"
+-            PTR_ADDU   "%[dst],     %[dst],         %[stride]          \n\t"
+             MMI_SDC1(%[ftmp1], %[dst], 0x00)
+-
+-            PTR_ADDU   "%[src],     %[src],         %[stride]          \n\t"
+             PTR_ADDU   "%[dst],     %[dst],         %[stride]          \n\t"
+             "bnez       %[h],       1b                                 \n\t"
+             : [ftmp0]"=&f"(ftmp[0]),        [ftmp1]"=&f"(ftmp[1]),
+@@ -107,220 +210,80 @@
+               [tmp0]"=&r"(tmp[0]),
+               [dst]"+&r"(dst),              [src]"+&r"(src),
+               [h]"+&r"(h)
+-            : [stride]"r"((mips_reg)stride),[ff_pw_32]"f"(ff_pw_32)
++            : [stride]"r"((mips_reg)stride),
++              [ff_pw_32]"f"(ff_pw_32),
++              [A]"f"(A),                    [E]"f"(E)
+             : "memory"
+         );
+     } else {
+-        if (x && y) {
+-            /* x!=0, y!=0 */
+-            D = x * y;
+-            B = (x << 3) - D;
+-            C = (y << 3) - D;
+-            A = 64 - D - B - C;
+-
+-            __asm__ volatile (
+-                "xor        %[ftmp0],   %[ftmp0],       %[ftmp0]           \n\t"
+-                "dli        %[tmp0],    0x06                               \n\t"
+-                "pshufh     %[A],       %[A],           %[ftmp0]           \n\t"
+-                "pshufh     %[B],       %[B],           %[ftmp0]           \n\t"
+-                "mtc1       %[tmp0],    %[ftmp9]                           \n\t"
+-                "pshufh     %[C],       %[C],           %[ftmp0]           \n\t"
+-                "pshufh     %[D],       %[D],           %[ftmp0]           \n\t"
+-
+-                "1:                                                        \n\t"
+-                MMI_ULDC1(%[ftmp1], %[src], 0x00)
+-                MMI_ULDC1(%[ftmp2], %[src], 0x01)
+-                PTR_ADDU   "%[src],     %[src],         %[stride]          \n\t"
+-                MMI_ULDC1(%[ftmp3], %[src], 0x00)
+-                MMI_ULDC1(%[ftmp4], %[src], 0x01)
+-                "addi       %[h],       %[h],           -0x02              \n\t"
+-
+-                "punpcklbh  %[ftmp5],   %[ftmp1],       %[ftmp0]           \n\t"
+-                "punpckhbh  %[ftmp6],   %[ftmp1],       %[ftmp0]           \n\t"
+-                "punpcklbh  %[ftmp7],   %[ftmp2],       %[ftmp0]           \n\t"
+-                "punpckhbh  %[ftmp8],   %[ftmp2],       %[ftmp0]           \n\t"
+-                "pmullh     %[ftmp5],   %[ftmp5],       %[A]               \n\t"
+-                "pmullh     %[ftmp7],   %[ftmp7],       %[B]               \n\t"
+-                "paddh      %[ftmp1],   %[ftmp5],       %[ftmp7]           \n\t"
+-                "pmullh     %[ftmp6],   %[ftmp6],       %[A]               \n\t"
+-                "pmullh     %[ftmp8],   %[ftmp8],       %[B]               \n\t"
+-                "paddh      %[ftmp2],   %[ftmp6],       %[ftmp8]           \n\t"
+-
+-                "punpcklbh  %[ftmp5],   %[ftmp3],       %[ftmp0]           \n\t"
+-                "punpckhbh  %[ftmp6],   %[ftmp3],       %[ftmp0]           \n\t"
+-                "punpcklbh  %[ftmp7],   %[ftmp4],       %[ftmp0]           \n\t"
+-                "punpckhbh  %[ftmp8],   %[ftmp4],       %[ftmp0]           \n\t"
+-                "pmullh     %[ftmp5],   %[ftmp5],       %[C]               \n\t"
+-                "pmullh     %[ftmp7],   %[ftmp7],       %[D]               \n\t"
+-                "paddh      %[ftmp3],   %[ftmp5],       %[ftmp7]           \n\t"
+-                "pmullh     %[ftmp6],   %[ftmp6],       %[C]               \n\t"
+-                "pmullh     %[ftmp8],   %[ftmp8],       %[D]               \n\t"
+-                "paddh      %[ftmp4],   %[ftmp6],       %[ftmp8]           \n\t"
+-
+-                "paddh      %[ftmp1],   %[ftmp1],       %[ftmp3]           \n\t"
+-                "paddh      %[ftmp2],   %[ftmp2],       %[ftmp4]           \n\t"
+-                "paddh      %[ftmp1],   %[ftmp1],       %[ff_pw_32]        \n\t"
+-                "paddh      %[ftmp2],   %[ftmp2],       %[ff_pw_32]        \n\t"
+-                "psrlh      %[ftmp1],   %[ftmp1],       %[ftmp9]           \n\t"
+-                "psrlh      %[ftmp2],   %[ftmp2],       %[ftmp9]           \n\t"
+-                "packushb   %[ftmp1],   %[ftmp1],       %[ftmp2]           \n\t"
+-                MMI_SDC1(%[ftmp1], %[dst], 0x00)
+-                PTR_ADDU   "%[dst],     %[dst],         %[stride]          \n\t"
+-
+-                MMI_ULDC1(%[ftmp1], %[src], 0x00)
+-                MMI_ULDC1(%[ftmp2], %[src], 0x01)
+-                PTR_ADDU   "%[src],     %[src],         %[stride]          \n\t"
+-                MMI_ULDC1(%[ftmp3], %[src], 0x00)
+-                MMI_ULDC1(%[ftmp4], %[src], 0x01)
+-
+-                "punpcklbh  %[ftmp5],   %[ftmp1],       %[ftmp0]           \n\t"
+-                "punpckhbh  %[ftmp6],   %[ftmp1],       %[ftmp0]           \n\t"
+-                "punpcklbh  %[ftmp7],   %[ftmp2],       %[ftmp0]           \n\t"
+-                "punpckhbh  %[ftmp8],   %[ftmp2],       %[ftmp0]           \n\t"
+-                "pmullh     %[ftmp5],   %[ftmp5],       %[A]               \n\t"
+-                "pmullh     %[ftmp7],   %[ftmp7],       %[B]               \n\t"
+-                "paddh      %[ftmp1],   %[ftmp5],       %[ftmp7]           \n\t"
+-                "pmullh     %[ftmp6],   %[ftmp6],       %[A]               \n\t"
+-                "pmullh     %[ftmp8],   %[ftmp8],       %[B]               \n\t"
+-                "paddh      %[ftmp2],   %[ftmp6],       %[ftmp8]           \n\t"
+-
+-                "punpcklbh  %[ftmp5],   %[ftmp3],       %[ftmp0]           \n\t"
+-                "punpckhbh  %[ftmp6],   %[ftmp3],       %[ftmp0]           \n\t"
+-                "punpcklbh  %[ftmp7],   %[ftmp4],       %[ftmp0]           \n\t"
+-                "punpckhbh  %[ftmp8],   %[ftmp4],       %[ftmp0]           \n\t"
+-                "pmullh     %[ftmp5],   %[ftmp5],       %[C]               \n\t"
+-                "pmullh     %[ftmp7],   %[ftmp7],       %[D]               \n\t"
+-                "paddh      %[ftmp3],   %[ftmp5],       %[ftmp7]           \n\t"
+-                "pmullh     %[ftmp6],   %[ftmp6],       %[C]               \n\t"
+-                "pmullh     %[ftmp8],   %[ftmp8],       %[D]               \n\t"
+-                "paddh      %[ftmp4],   %[ftmp6],       %[ftmp8]           \n\t"
+-
+-                "paddh      %[ftmp1],   %[ftmp1],       %[ftmp3]           \n\t"
+-                "paddh      %[ftmp2],   %[ftmp2],       %[ftmp4]           \n\t"
+-                "paddh      %[ftmp1],   %[ftmp1],       %[ff_pw_32]        \n\t"
+-                "paddh      %[ftmp2],   %[ftmp2],       %[ff_pw_32]        \n\t"
+-                "psrlh      %[ftmp1],   %[ftmp1],       %[ftmp9]           \n\t"
+-                "psrlh      %[ftmp2],   %[ftmp2],       %[ftmp9]           \n\t"
+-                "packushb   %[ftmp1],   %[ftmp1],       %[ftmp2]           \n\t"
+-                MMI_SDC1(%[ftmp1], %[dst], 0x00)
+-                PTR_ADDU   "%[dst],     %[dst],         %[stride]          \n\t"
+-
+-                "bnez       %[h],       1b                                 \n\t"
+-                : [ftmp0]"=&f"(ftmp[0]),        [ftmp1]"=&f"(ftmp[1]),
+-                  [ftmp2]"=&f"(ftmp[2]),        [ftmp3]"=&f"(ftmp[3]),
+-                  [ftmp4]"=&f"(ftmp[4]),        [ftmp5]"=&f"(ftmp[5]),
+-                  [ftmp6]"=&f"(ftmp[6]),        [ftmp7]"=&f"(ftmp[7]),
+-                  [ftmp8]"=&f"(ftmp[8]),        [ftmp9]"=&f"(ftmp[9]),
+-                  [tmp0]"=&r"(tmp[0]),
+-                  [dst]"+&r"(dst),              [src]"+&r"(src),
+-                  [h]"+&r"(h)
+-                : [stride]"r"((mips_reg)stride),[ff_pw_32]"f"(ff_pw_32),
+-                  [A]"f"(A),                    [B]"f"(B),
+-                  [C]"f"(C),                    [D]"f"(D)
+-                : "memory"
+-            );
+-        } else {
+-            if (x) {
+-                /* x!=0, y==0 */
+-                E = x << 3;
+-                A = 64 - E;
+-
+-                __asm__ volatile (
+-                    "xor        %[ftmp0],   %[ftmp0],       %[ftmp0]           \n\t"
+-                    "dli        %[tmp0],    0x06                               \n\t"
+-                    "pshufh     %[A],       %[A],           %[ftmp0]           \n\t"
+-                    "pshufh     %[E],       %[E],           %[ftmp0]           \n\t"
+-                    "mtc1       %[tmp0],    %[ftmp7]                           \n\t"
+-
+-                    "1:                                                        \n\t"
+-                    MMI_ULDC1(%[ftmp1], %[src], 0x00)
+-                    MMI_ULDC1(%[ftmp2], %[src], 0x01)
+-                    "addi       %[h],       %[h],           -0x01              \n\t"
+-                    PTR_ADDU   "%[src],     %[src],         %[stride]          \n\t"
+-
+-                    "punpcklbh  %[ftmp3],   %[ftmp1],       %[ftmp0]           \n\t"
+-                    "punpckhbh  %[ftmp4],   %[ftmp1],       %[ftmp0]           \n\t"
+-                    "punpcklbh  %[ftmp5],   %[ftmp2],       %[ftmp0]           \n\t"
+-                    "punpckhbh  %[ftmp6],   %[ftmp2],       %[ftmp0]           \n\t"
+-                    "pmullh     %[ftmp3],   %[ftmp3],       %[A]               \n\t"
+-                    "pmullh     %[ftmp5],   %[ftmp5],       %[E]               \n\t"
+-                    "paddh      %[ftmp1],   %[ftmp3],       %[ftmp5]           \n\t"
+-                    "pmullh     %[ftmp4],   %[ftmp4],       %[A]               \n\t"
+-                    "pmullh     %[ftmp6],   %[ftmp6],       %[E]               \n\t"
+-                    "paddh      %[ftmp2],   %[ftmp4],       %[ftmp6]           \n\t"
+-
+-                    "paddh      %[ftmp1],   %[ftmp1],       %[ff_pw_32]        \n\t"
+-                    "paddh      %[ftmp2],   %[ftmp2],       %[ff_pw_32]        \n\t"
+-                    "psrlh      %[ftmp1],   %[ftmp1],       %[ftmp7]           \n\t"
+-                    "psrlh      %[ftmp2],   %[ftmp2],       %[ftmp7]           \n\t"
+-                    "packushb   %[ftmp1],   %[ftmp1],       %[ftmp2]           \n\t"
+-                    MMI_SDC1(%[ftmp1], %[dst], 0x00)
+-                    PTR_ADDU   "%[dst],     %[dst],         %[stride]          \n\t"
+-                    "bnez       %[h],       1b                                 \n\t"
+-                    : [ftmp0]"=&f"(ftmp[0]),        [ftmp1]"=&f"(ftmp[1]),
+-                      [ftmp2]"=&f"(ftmp[2]),        [ftmp3]"=&f"(ftmp[3]),
+-                      [ftmp4]"=&f"(ftmp[4]),        [ftmp5]"=&f"(ftmp[5]),
+-                      [ftmp6]"=&f"(ftmp[6]),        [ftmp7]"=&f"(ftmp[7]),
+-                      [tmp0]"=&r"(tmp[0]),
+-                      [dst]"+&r"(dst),              [src]"+&r"(src),
+-                      [h]"+&r"(h)
+-                    : [stride]"r"((mips_reg)stride),
+-                      [ff_pw_32]"f"(ff_pw_32),
+-                      [A]"f"(A),                    [E]"f"(E)
+-                    : "memory"
+-                );
+-            } else {
+-                /* x==0, y!=0 */
+-                E = y << 3;
+-                A = 64 - E;
+-
+-                __asm__ volatile (
+-                    "xor        %[ftmp0],   %[ftmp0],       %[ftmp0]           \n\t"
+-                    "dli        %[tmp0],    0x06                               \n\t"
+-                    "pshufh     %[A],       %[A],           %[ftmp0]           \n\t"
+-                    "pshufh     %[E],       %[E],           %[ftmp0]           \n\t"
+-                    "mtc1       %[tmp0],    %[ftmp7]                           \n\t"
+-
+-                    "1:                                                        \n\t"
+-                    MMI_ULDC1(%[ftmp1], %[src], 0x00)
+-                    PTR_ADDU   "%[src],     %[src],         %[stride]          \n\t"
+-                    MMI_ULDC1(%[ftmp2], %[src], 0x00)
+-                    "addi       %[h],       %[h],           -0x01              \n\t"
+-
+-                    "punpcklbh  %[ftmp3],   %[ftmp1],       %[ftmp0]           \n\t"
+-                    "punpckhbh  %[ftmp4],   %[ftmp1],       %[ftmp0]           \n\t"
+-                    "punpcklbh  %[ftmp5],   %[ftmp2],       %[ftmp0]           \n\t"
+-                    "punpckhbh  %[ftmp6],   %[ftmp2],       %[ftmp0]           \n\t"
+-                    "pmullh     %[ftmp3],   %[ftmp3],       %[A]               \n\t"
+-                    "pmullh     %[ftmp5],   %[ftmp5],       %[E]               \n\t"
+-                    "paddh      %[ftmp1],   %[ftmp3],       %[ftmp5]           \n\t"
+-                    "pmullh     %[ftmp4],   %[ftmp4],       %[A]               \n\t"
+-                    "pmullh     %[ftmp6],   %[ftmp6],       %[E]               \n\t"
+-                    "paddh      %[ftmp2],   %[ftmp4],       %[ftmp6]           \n\t"
+-
+-                    "paddh      %[ftmp1],   %[ftmp1],       %[ff_pw_32]        \n\t"
+-                    "paddh      %[ftmp2],   %[ftmp2],       %[ff_pw_32]        \n\t"
+-                    "psrlh      %[ftmp1],   %[ftmp1],       %[ftmp7]           \n\t"
+-                    "psrlh      %[ftmp2],   %[ftmp2],       %[ftmp7]           \n\t"
+-                    "packushb   %[ftmp1],   %[ftmp1],       %[ftmp2]           \n\t"
+-                    MMI_SDC1(%[ftmp1], %[dst], 0x00)
+-
+-                    PTR_ADDU   "%[dst],     %[dst],         %[stride]          \n\t"
+-                    "bnez       %[h],       1b                                 \n\t"
+-                    : [ftmp0]"=&f"(ftmp[0]),        [ftmp1]"=&f"(ftmp[1]),
+-                      [ftmp2]"=&f"(ftmp[2]),        [ftmp3]"=&f"(ftmp[3]),
+-                      [ftmp4]"=&f"(ftmp[4]),        [ftmp5]"=&f"(ftmp[5]),
+-                      [ftmp6]"=&f"(ftmp[6]),        [ftmp7]"=&f"(ftmp[7]),
+-                      [tmp0]"=&r"(tmp[0]),
+-                      [dst]"+&r"(dst),              [src]"+&r"(src),
+-                      [h]"+&r"(h)
+-                    : [stride]"r"((mips_reg)stride),
+-                      [ff_pw_32]"f"(ff_pw_32),
+-                      [A]"f"(A),                    [E]"f"(E)
+-                    : "memory"
+-                );
+-            }
+-        }
++        /* x==0, y!=0 */
++        E = y << 3;
++        A = 64 - E;
++
++        __asm__ volatile (
++            "xor        %[ftmp0],   %[ftmp0],       %[ftmp0]           \n\t"
++            "dli        %[tmp0],    0x06                               \n\t"
++            "pshufh     %[A],       %[A],           %[ftmp0]           \n\t"
++            "pshufh     %[E],       %[E],           %[ftmp0]           \n\t"
++            "mtc1       %[tmp0],    %[ftmp7]                           \n\t"
++
++            "1:                                                        \n\t"
++            MMI_ULDC1(%[ftmp1], %[src], 0x00)
++            PTR_ADDU   "%[src],     %[src],         %[stride]          \n\t"
++            MMI_ULDC1(%[ftmp2], %[src], 0x00)
++            PTR_ADDU   "%[src],     %[src],         %[stride]          \n\t"
++            MMI_ULDC1(%[ftmp8], %[src], 0x00)
++            "addi       %[h],       %[h],           -0x02              \n\t"
++
++            "punpcklbh  %[ftmp3],   %[ftmp1],       %[ftmp0]           \n\t"
++            "punpckhbh  %[ftmp4],   %[ftmp1],       %[ftmp0]           \n\t"
++            "punpcklbh  %[ftmp5],   %[ftmp2],       %[ftmp0]           \n\t"
++            "punpckhbh  %[ftmp6],   %[ftmp2],       %[ftmp0]           \n\t"
++            "pmullh     %[ftmp3],   %[ftmp3],       %[A]               \n\t"
++            "pmullh     %[ftmp5],   %[ftmp5],       %[E]               \n\t"
++            "paddh      %[ftmp3],   %[ftmp3],       %[ftmp5]           \n\t"
++            "pmullh     %[ftmp4],   %[ftmp4],       %[A]               \n\t"
++            "pmullh     %[ftmp6],   %[ftmp6],       %[E]               \n\t"
++            "paddh      %[ftmp4],   %[ftmp4],       %[ftmp6]           \n\t"
++            "paddh      %[ftmp3],   %[ftmp3],       %[ff_pw_32]        \n\t"
++            "paddh      %[ftmp4],   %[ftmp4],       %[ff_pw_32]        \n\t"
++            "psrlh      %[ftmp3],   %[ftmp3],       %[ftmp7]           \n\t"
++            "psrlh      %[ftmp4],   %[ftmp4],       %[ftmp7]           \n\t"
++            "packushb   %[ftmp1],   %[ftmp3],       %[ftmp4]           \n\t"
++
++            "punpcklbh  %[ftmp3],   %[ftmp2],       %[ftmp0]           \n\t"
++            "punpckhbh  %[ftmp4],   %[ftmp2],       %[ftmp0]           \n\t"
++            "punpcklbh  %[ftmp5],   %[ftmp8],       %[ftmp0]           \n\t"
++            "punpckhbh  %[ftmp6],   %[ftmp8],       %[ftmp0]           \n\t"
++            "pmullh     %[ftmp3],   %[ftmp3],       %[A]               \n\t"
++            "pmullh     %[ftmp5],   %[ftmp5],       %[E]               \n\t"
++            "paddh      %[ftmp3],   %[ftmp3],       %[ftmp5]           \n\t"
++            "pmullh     %[ftmp4],   %[ftmp4],       %[A]               \n\t"
++            "pmullh     %[ftmp6],   %[ftmp6],       %[E]               \n\t"
++            "paddh      %[ftmp4],   %[ftmp4],       %[ftmp6]           \n\t"
++            "paddh      %[ftmp3],   %[ftmp3],       %[ff_pw_32]        \n\t"
++            "paddh      %[ftmp4],   %[ftmp4],       %[ff_pw_32]        \n\t"
++            "psrlh      %[ftmp3],   %[ftmp3],       %[ftmp7]           \n\t"
++            "psrlh      %[ftmp4],   %[ftmp4],       %[ftmp7]           \n\t"
++            "packushb   %[ftmp2],   %[ftmp3],       %[ftmp4]           \n\t"
++
++            MMI_SDC1(%[ftmp1], %[dst], 0x00)
++            PTR_ADDU   "%[dst],     %[dst],         %[stride]          \n\t"
++            MMI_SDC1(%[ftmp2], %[dst], 0x00)
++            PTR_ADDU   "%[dst],     %[dst],         %[stride]          \n\t"
++            "bnez       %[h],       1b                                 \n\t"
++            : [ftmp0]"=&f"(ftmp[0]),        [ftmp1]"=&f"(ftmp[1]),
++              [ftmp2]"=&f"(ftmp[2]),        [ftmp3]"=&f"(ftmp[3]),
++              [ftmp4]"=&f"(ftmp[4]),        [ftmp5]"=&f"(ftmp[5]),
++              [ftmp6]"=&f"(ftmp[6]),        [ftmp7]"=&f"(ftmp[7]),
++              [ftmp8]"=&f"(ftmp[8]),        [tmp0]"=&r"(tmp[0]),
++              [dst]"+&r"(dst),              [src]"+&r"(src),
++              [h]"+&r"(h)
++            : [stride]"r"((mips_reg)stride),
++              [ff_pw_32]"f"(ff_pw_32),
++              [A]"f"(A),                    [E]"f"(E)
++            : "memory"
++        );
+     }
+ }
+ 
+@@ -334,231 +297,200 @@
+     if(!(x || y)){
+         /* x=0, y=0, A=64 */
+         __asm__ volatile (
+-            "xor        %[ftmp0],   %[ftmp0],       %[ftmp0]            \n\t"
+-            "dli        %[tmp0],    0x06                                \n\t"
+-            "pshufh     %[A],       %[A],           %[ftmp0]            \n\t"
+-            "mtc1       %[tmp0],    %[ftmp4]                            \n\t"
+-
+             "1:                                                         \n\t"
+-            MMI_ULDC1(%[ftmp1], %[src], 0x00)
++            MMI_ULDC1(%[ftmp0], %[src], 0x00)
+             PTR_ADDU   "%[src],     %[src],         %[stride]           \n\t"
+-            MMI_ULDC1(%[ftmp5], %[src], 0x00)
++            MMI_ULDC1(%[ftmp1], %[src], 0x00)
+             PTR_ADDU   "%[src],     %[src],         %[stride]           \n\t"
+-
+-            "punpcklbh  %[ftmp2],   %[ftmp1],       %[ftmp0]            \n\t"
+-            "punpckhbh  %[ftmp3],   %[ftmp1],       %[ftmp0]            \n\t"
+-            "pmullh     %[ftmp1],   %[ftmp2],       %[A]                \n\t"
+-            "pmullh     %[ftmp2],   %[ftmp3],       %[A]                \n\t"
+-            "paddh      %[ftmp1],   %[ftmp1],       %[ff_pw_32]         \n\t"
+-            "paddh      %[ftmp2],   %[ftmp2],       %[ff_pw_32]         \n\t"
+-            "psrlh      %[ftmp1],   %[ftmp1],       %[ftmp4]            \n\t"
+-            "psrlh      %[ftmp2],   %[ftmp2],       %[ftmp4]            \n\t"
+-            "packushb   %[ftmp1],   %[ftmp1],       %[ftmp2]            \n\t"
+             MMI_LDC1(%[ftmp2], %[dst], 0x00)
+-            "pavgb      %[ftmp1],   %[ftmp1],       %[ftmp2]            \n\t"
+-            MMI_SDC1(%[ftmp1], %[dst], 0x00)
+             PTR_ADDU   "%[dst],     %[dst],         %[stride]           \n\t"
+-
+-            "punpcklbh  %[ftmp2],   %[ftmp5],       %[ftmp0]            \n\t"
+-            "punpckhbh  %[ftmp3],   %[ftmp5],       %[ftmp0]            \n\t"
+-            "pmullh     %[ftmp1],   %[ftmp2],       %[A]                \n\t"
+-            "pmullh     %[ftmp2],   %[ftmp3],       %[A]                \n\t"
+-            "paddh      %[ftmp1],   %[ftmp1],       %[ff_pw_32]         \n\t"
+-            "paddh      %[ftmp2],   %[ftmp2],       %[ff_pw_32]         \n\t"
+-            "psrlh      %[ftmp1],   %[ftmp1],       %[ftmp4]            \n\t"
+-            "psrlh      %[ftmp2],   %[ftmp2],       %[ftmp4]            \n\t"
+-            "packushb   %[ftmp1],   %[ftmp1],       %[ftmp2]            \n\t"
+-            MMI_LDC1(%[ftmp2], %[dst], 0x00)
+-            "pavgb      %[ftmp1],   %[ftmp1],       %[ftmp2]            \n\t"
++            MMI_LDC1(%[ftmp3], %[dst], 0x00)
++            PTR_SUBU   "%[dst],     %[dst],         %[stride]           \n\t"
++            "pavgb      %[ftmp0],   %[ftmp0],       %[ftmp2]            \n\t"
++            "pavgb      %[ftmp1],   %[ftmp1],       %[ftmp3]            \n\t"
++            MMI_SDC1(%[ftmp0], %[dst], 0x00)
++            PTR_ADDU   "%[dst],     %[dst],         %[stride]           \n\t"
+             MMI_SDC1(%[ftmp1], %[dst], 0x00)
+             PTR_ADDU   "%[dst],     %[dst],         %[stride]           \n\t"
+-
+             "addi       %[h],       %[h],           -0x02               \n\t"
+             "bnez       %[h],       1b                                  \n\t"
+             : [ftmp0]"=&f"(ftmp[0]),        [ftmp1]"=&f"(ftmp[1]),
+               [ftmp2]"=&f"(ftmp[2]),        [ftmp3]"=&f"(ftmp[3]),
++              [dst]"+&r"(dst),              [src]"+&r"(src),
++              [h]"+&r"(h)
++            : [stride]"r"((mips_reg)stride)
++            : "memory"
++        );
++    } else if (x && y) {
++        /* x!=0, y!=0 */
++        D = x * y;
++        B = (x << 3) - D;
++        C = (y << 3) - D;
++        A = 64 - D - B - C;
++        __asm__ volatile (
++            "xor        %[ftmp0],   %[ftmp0],       %[ftmp0]       \n\t"
++            "dli        %[tmp0],    0x06                           \n\t"
++            "pshufh     %[A],       %[A],           %[ftmp0]       \n\t"
++            "pshufh     %[B],       %[B],           %[ftmp0]       \n\t"
++            "mtc1       %[tmp0],    %[ftmp9]                       \n\t"
++            "pshufh     %[C],       %[C],           %[ftmp0]       \n\t"
++            "pshufh     %[D],       %[D],           %[ftmp0]       \n\t"
++
++            "1:                                                    \n\t"
++            MMI_ULDC1(%[ftmp1], %[src], 0x00)
++            MMI_ULDC1(%[ftmp2], %[src], 0x01)
++            PTR_ADDU   "%[src],     %[src],         %[stride]      \n\t"
++            MMI_ULDC1(%[ftmp3], %[src], 0x00)
++            MMI_ULDC1(%[ftmp4], %[src], 0x01)
++            "addi       %[h],       %[h],           -0x01          \n\t"
++
++            "punpcklbh  %[ftmp5],   %[ftmp1],       %[ftmp0]       \n\t"
++            "punpckhbh  %[ftmp6],   %[ftmp1],       %[ftmp0]       \n\t"
++            "punpcklbh  %[ftmp7],   %[ftmp2],       %[ftmp0]       \n\t"
++            "punpckhbh  %[ftmp8],   %[ftmp2],       %[ftmp0]       \n\t"
++            "pmullh     %[ftmp5],   %[ftmp5],       %[A]           \n\t"
++            "pmullh     %[ftmp7],   %[ftmp7],       %[B]           \n\t"
++            "paddh      %[ftmp1],   %[ftmp5],       %[ftmp7]       \n\t"
++            "pmullh     %[ftmp6],   %[ftmp6],       %[A]           \n\t"
++            "pmullh     %[ftmp8],   %[ftmp8],       %[B]           \n\t"
++            "paddh      %[ftmp2],   %[ftmp6],       %[ftmp8]       \n\t"
++
++            "punpcklbh  %[ftmp5],   %[ftmp3],       %[ftmp0]       \n\t"
++            "punpckhbh  %[ftmp6],   %[ftmp3],       %[ftmp0]       \n\t"
++            "punpcklbh  %[ftmp7],   %[ftmp4],       %[ftmp0]       \n\t"
++            "punpckhbh  %[ftmp8],   %[ftmp4],       %[ftmp0]       \n\t"
++            "pmullh     %[ftmp5],   %[ftmp5],       %[C]           \n\t"
++            "pmullh     %[ftmp7],   %[ftmp7],       %[D]           \n\t"
++            "paddh      %[ftmp3],   %[ftmp5],       %[ftmp7]       \n\t"
++            "pmullh     %[ftmp6],   %[ftmp6],       %[C]           \n\t"
++            "pmullh     %[ftmp8],   %[ftmp8],       %[D]           \n\t"
++            "paddh      %[ftmp4],   %[ftmp6],       %[ftmp8]       \n\t"
++
++            "paddh      %[ftmp1],   %[ftmp1],       %[ftmp3]       \n\t"
++            "paddh      %[ftmp2],   %[ftmp2],       %[ftmp4]       \n\t"
++            "paddh      %[ftmp1],   %[ftmp1],       %[ff_pw_32]    \n\t"
++            "paddh      %[ftmp2],   %[ftmp2],       %[ff_pw_32]    \n\t"
++            "psrlh      %[ftmp1],   %[ftmp1],       %[ftmp9]       \n\t"
++            "psrlh      %[ftmp2],   %[ftmp2],       %[ftmp9]       \n\t"
++            "packushb   %[ftmp1],   %[ftmp1],       %[ftmp2]       \n\t"
++            MMI_LDC1(%[ftmp2], %[dst], 0x00)
++            "pavgb      %[ftmp1],   %[ftmp1],       %[ftmp2]       \n\t"
++            MMI_SDC1(%[ftmp1], %[dst], 0x00)
++            PTR_ADDU   "%[dst],     %[dst],         %[stride]      \n\t"
++            "bnez       %[h],       1b                             \n\t"
++            : [ftmp0]"=&f"(ftmp[0]),        [ftmp1]"=&f"(ftmp[1]),
++              [ftmp2]"=&f"(ftmp[2]),        [ftmp3]"=&f"(ftmp[3]),
+               [ftmp4]"=&f"(ftmp[4]),        [ftmp5]"=&f"(ftmp[5]),
++              [ftmp6]"=&f"(ftmp[6]),        [ftmp7]"=&f"(ftmp[7]),
++              [ftmp8]"=&f"(ftmp[8]),        [ftmp9]"=&f"(ftmp[9]),
+               [tmp0]"=&r"(tmp[0]),
+               [dst]"+&r"(dst),              [src]"+&r"(src),
+               [h]"+&r"(h)
+             : [stride]"r"((mips_reg)stride),[ff_pw_32]"f"(ff_pw_32),
+-              [A]"f"(A)
++              [A]"f"(A),                    [B]"f"(B),
++              [C]"f"(C),                    [D]"f"(D)
++            : "memory"
++        );
++    } else if (x) {
++        /* x!=0, y==0 */
++        E = x << 3;
++        A = 64 - E;
++        __asm__ volatile (
++            "xor        %[ftmp0],   %[ftmp0],       %[ftmp0]       \n\t"
++            "dli        %[tmp0],    0x06                           \n\t"
++            "pshufh     %[A],       %[A],           %[ftmp0]       \n\t"
++            "pshufh     %[E],       %[E],           %[ftmp0]       \n\t"
++            "mtc1       %[tmp0],    %[ftmp7]                       \n\t"
++
++            "1:                                                    \n\t"
++            MMI_ULDC1(%[ftmp1], %[src], 0x00)
++            MMI_ULDC1(%[ftmp2], %[src], 0x01)
++            PTR_ADDU   "%[src],     %[src],         %[stride]      \n\t"
++            "addi       %[h],       %[h],           -0x01          \n\t"
++
++            "punpcklbh  %[ftmp3],   %[ftmp1],       %[ftmp0]       \n\t"
++            "punpckhbh  %[ftmp4],   %[ftmp1],       %[ftmp0]       \n\t"
++            "punpcklbh  %[ftmp5],   %[ftmp2],       %[ftmp0]       \n\t"
++            "punpckhbh  %[ftmp6],   %[ftmp2],       %[ftmp0]       \n\t"
++            "pmullh     %[ftmp3],   %[ftmp3],       %[A]           \n\t"
++            "pmullh     %[ftmp5],   %[ftmp5],       %[E]           \n\t"
++            "paddh      %[ftmp1],   %[ftmp3],       %[ftmp5]       \n\t"
++            "pmullh     %[ftmp4],   %[ftmp4],       %[A]           \n\t"
++            "pmullh     %[ftmp6],   %[ftmp6],       %[E]           \n\t"
++            "paddh      %[ftmp2],   %[ftmp4],       %[ftmp6]       \n\t"
++
++            "paddh      %[ftmp1],   %[ftmp1],       %[ff_pw_32]    \n\t"
++            "paddh      %[ftmp2],   %[ftmp2],       %[ff_pw_32]    \n\t"
++            "psrlh      %[ftmp1],   %[ftmp1],       %[ftmp7]       \n\t"
++            "psrlh      %[ftmp2],   %[ftmp2],       %[ftmp7]       \n\t"
++            "packushb   %[ftmp1],   %[ftmp1],       %[ftmp2]       \n\t"
++            MMI_LDC1(%[ftmp2], %[dst], 0x00)
++            "pavgb      %[ftmp1],   %[ftmp1],       %[ftmp2]       \n\t"
++            MMI_SDC1(%[ftmp1], %[dst], 0x00)
++            PTR_ADDU   "%[dst],     %[dst],         %[stride]      \n\t"
++            "bnez       %[h],       1b                             \n\t"
++            : [ftmp0]"=&f"(ftmp[0]),        [ftmp1]"=&f"(ftmp[1]),
++              [ftmp2]"=&f"(ftmp[2]),        [ftmp3]"=&f"(ftmp[3]),
++              [ftmp4]"=&f"(ftmp[4]),        [ftmp5]"=&f"(ftmp[5]),
++              [ftmp6]"=&f"(ftmp[6]),        [ftmp7]"=&f"(ftmp[7]),
++              [tmp0]"=&r"(tmp[0]),
++              [dst]"+&r"(dst),              [src]"+&r"(src),
++              [h]"+&r"(h)
++            : [stride]"r"((mips_reg)stride),
++              [ff_pw_32]"f"(ff_pw_32),
++              [A]"f"(A),                    [E]"f"(E)
+             : "memory"
+         );
+     } else {
+-        if(x && y) {
+-            /* x!=0, y!=0 */
+-            D = x * y;
+-            B = (x << 3) - D;
+-            C = (y << 3) - D;
+-            A = 64 - D - B - C;
+-            __asm__ volatile (
+-                "xor        %[ftmp0],   %[ftmp0],       %[ftmp0]       \n\t"
+-                "dli        %[tmp0],    0x06                           \n\t"
+-                "pshufh     %[A],       %[A],           %[ftmp0]       \n\t"
+-                "pshufh     %[B],       %[B],           %[ftmp0]       \n\t"
+-                "mtc1       %[tmp0],    %[ftmp9]                       \n\t"
+-                "pshufh     %[C],       %[C],           %[ftmp0]       \n\t"
+-                "pshufh     %[D],       %[D],           %[ftmp0]       \n\t"
+-
+-                "1:                                                    \n\t"
+-                MMI_ULDC1(%[ftmp1], %[src], 0x00)
+-                MMI_ULDC1(%[ftmp2], %[src], 0x01)
+-                PTR_ADDU   "%[src],     %[src],         %[stride]      \n\t"
+-                MMI_ULDC1(%[ftmp3], %[src], 0x00)
+-                MMI_ULDC1(%[ftmp4], %[src], 0x01)
+-                "addi       %[h],       %[h],           -0x01          \n\t"
+-
+-                "punpcklbh  %[ftmp5],   %[ftmp1],       %[ftmp0]       \n\t"
+-                "punpckhbh  %[ftmp6],   %[ftmp1],       %[ftmp0]       \n\t"
+-                "punpcklbh  %[ftmp7],   %[ftmp2],       %[ftmp0]       \n\t"
+-                "punpckhbh  %[ftmp8],   %[ftmp2],       %[ftmp0]       \n\t"
+-                "pmullh     %[ftmp5],   %[ftmp5],       %[A]           \n\t"
+-                "pmullh     %[ftmp7],   %[ftmp7],       %[B]           \n\t"
+-                "paddh      %[ftmp1],   %[ftmp5],       %[ftmp7]       \n\t"
+-                "pmullh     %[ftmp6],   %[ftmp6],       %[A]           \n\t"
+-                "pmullh     %[ftmp8],   %[ftmp8],       %[B]           \n\t"
+-                "paddh      %[ftmp2],   %[ftmp6],       %[ftmp8]       \n\t"
+-
+-                "punpcklbh  %[ftmp5],   %[ftmp3],       %[ftmp0]       \n\t"
+-                "punpckhbh  %[ftmp6],   %[ftmp3],       %[ftmp0]       \n\t"
+-                "punpcklbh  %[ftmp7],   %[ftmp4],       %[ftmp0]       \n\t"
+-                "punpckhbh  %[ftmp8],   %[ftmp4],       %[ftmp0]       \n\t"
+-                "pmullh     %[ftmp5],   %[ftmp5],       %[C]           \n\t"
+-                "pmullh     %[ftmp7],   %[ftmp7],       %[D]           \n\t"
+-                "paddh      %[ftmp3],   %[ftmp5],       %[ftmp7]       \n\t"
+-                "pmullh     %[ftmp6],   %[ftmp6],       %[C]           \n\t"
+-                "pmullh     %[ftmp8],   %[ftmp8],       %[D]           \n\t"
+-                "paddh      %[ftmp4],   %[ftmp6],       %[ftmp8]       \n\t"
+-
+-                "paddh      %[ftmp1],   %[ftmp1],       %[ftmp3]       \n\t"
+-                "paddh      %[ftmp2],   %[ftmp2],       %[ftmp4]       \n\t"
+-                "paddh      %[ftmp1],   %[ftmp1],       %[ff_pw_32]    \n\t"
+-                "paddh      %[ftmp2],   %[ftmp2],       %[ff_pw_32]    \n\t"
+-                "psrlh      %[ftmp1],   %[ftmp1],       %[ftmp9]       \n\t"
+-                "psrlh      %[ftmp2],   %[ftmp2],       %[ftmp9]       \n\t"
+-                "packushb   %[ftmp1],   %[ftmp1],       %[ftmp2]       \n\t"
+-                MMI_LDC1(%[ftmp2], %[dst], 0x00)
+-                "pavgb      %[ftmp1],   %[ftmp1],       %[ftmp2]       \n\t"
+-                MMI_SDC1(%[ftmp1], %[dst], 0x00)
+-                PTR_ADDU   "%[dst],     %[dst],         %[stride]      \n\t"
+-                "bnez       %[h],       1b                             \n\t"
+-                : [ftmp0]"=&f"(ftmp[0]),        [ftmp1]"=&f"(ftmp[1]),
+-                  [ftmp2]"=&f"(ftmp[2]),        [ftmp3]"=&f"(ftmp[3]),
+-                  [ftmp4]"=&f"(ftmp[4]),        [ftmp5]"=&f"(ftmp[5]),
+-                  [ftmp6]"=&f"(ftmp[6]),        [ftmp7]"=&f"(ftmp[7]),
+-                  [ftmp8]"=&f"(ftmp[8]),        [ftmp9]"=&f"(ftmp[9]),
+-                  [tmp0]"=&r"(tmp[0]),
+-                  [dst]"+&r"(dst),              [src]"+&r"(src),
+-                  [h]"+&r"(h)
+-                : [stride]"r"((mips_reg)stride),[ff_pw_32]"f"(ff_pw_32),
+-                  [A]"f"(A),                    [B]"f"(B),
+-                  [C]"f"(C),                    [D]"f"(D)
+-                : "memory"
+-            );
+-        } else {
+-            if(x) {
+-                /* x!=0, y==0 */
+-                E = x << 3;
+-                A = 64 - E;
+-                __asm__ volatile (
+-                    "xor        %[ftmp0],   %[ftmp0],       %[ftmp0]       \n\t"
+-                    "dli        %[tmp0],    0x06                           \n\t"
+-                    "pshufh     %[A],       %[A],           %[ftmp0]       \n\t"
+-                    "pshufh     %[E],       %[E],           %[ftmp0]       \n\t"
+-                    "mtc1       %[tmp0],    %[ftmp7]                       \n\t"
+-
+-                    "1:                                                    \n\t"
+-                    MMI_ULDC1(%[ftmp1], %[src], 0x00)
+-                    MMI_ULDC1(%[ftmp2], %[src], 0x01)
+-                    PTR_ADDU   "%[src],     %[src],         %[stride]      \n\t"
+-                    "addi       %[h],       %[h],           -0x01          \n\t"
+-
+-                    "punpcklbh  %[ftmp3],   %[ftmp1],       %[ftmp0]       \n\t"
+-                    "punpckhbh  %[ftmp4],   %[ftmp1],       %[ftmp0]       \n\t"
+-                    "punpcklbh  %[ftmp5],   %[ftmp2],       %[ftmp0]       \n\t"
+-                    "punpckhbh  %[ftmp6],   %[ftmp2],       %[ftmp0]       \n\t"
+-                    "pmullh     %[ftmp3],   %[ftmp3],       %[A]           \n\t"
+-                    "pmullh     %[ftmp5],   %[ftmp5],       %[E]           \n\t"
+-                    "paddh      %[ftmp1],   %[ftmp3],       %[ftmp5]       \n\t"
+-                    "pmullh     %[ftmp4],   %[ftmp4],       %[A]           \n\t"
+-                    "pmullh     %[ftmp6],   %[ftmp6],       %[E]           \n\t"
+-                    "paddh      %[ftmp2],   %[ftmp4],       %[ftmp6]       \n\t"
+-
+-                    "paddh      %[ftmp1],   %[ftmp1],       %[ff_pw_32]    \n\t"
+-                    "paddh      %[ftmp2],   %[ftmp2],       %[ff_pw_32]    \n\t"
+-                    "psrlh      %[ftmp1],   %[ftmp1],       %[ftmp7]       \n\t"
+-                    "psrlh      %[ftmp2],   %[ftmp2],       %[ftmp7]       \n\t"
+-                    "packushb   %[ftmp1],   %[ftmp1],       %[ftmp2]       \n\t"
+-                    MMI_LDC1(%[ftmp2], %[dst], 0x00)
+-                    "pavgb      %[ftmp1],   %[ftmp1],       %[ftmp2]       \n\t"
+-                    MMI_SDC1(%[ftmp1], %[dst], 0x00)
+-                    PTR_ADDU   "%[dst],     %[dst],         %[stride]      \n\t"
+-                    "bnez       %[h],       1b                             \n\t"
+-                    : [ftmp0]"=&f"(ftmp[0]),        [ftmp1]"=&f"(ftmp[1]),
+-                      [ftmp2]"=&f"(ftmp[2]),        [ftmp3]"=&f"(ftmp[3]),
+-                      [ftmp4]"=&f"(ftmp[4]),        [ftmp5]"=&f"(ftmp[5]),
+-                      [ftmp6]"=&f"(ftmp[6]),        [ftmp7]"=&f"(ftmp[7]),
+-                      [tmp0]"=&r"(tmp[0]),
+-                      [dst]"+&r"(dst),              [src]"+&r"(src),
+-                      [h]"+&r"(h)
+-                    : [stride]"r"((mips_reg)stride),
+-                      [ff_pw_32]"f"(ff_pw_32),
+-                      [A]"f"(A),                    [E]"f"(E)
+-                    : "memory"
+-                );
+-            } else {
+-                /* x==0, y!=0 */
+-                E = y << 3;
+-                A = 64 - E;
+-                __asm__ volatile (
+-                    "xor        %[ftmp0],   %[ftmp0],       %[ftmp0]       \n\t"
+-                    "dli        %[tmp0],    0x06                           \n\t"
+-                    "pshufh     %[A],       %[A],           %[ftmp0]       \n\t"
+-                    "pshufh     %[E],       %[E],           %[ftmp0]       \n\t"
+-                    "mtc1       %[tmp0],    %[ftmp7]                       \n\t"
+-
+-                    "1:                                                    \n\t"
+-                    MMI_ULDC1(%[ftmp1], %[src], 0x00)
+-                    PTR_ADDU   "%[src],     %[src],         %[stride]      \n\t"
+-                    MMI_ULDC1(%[ftmp2], %[src], 0x00)
+-                    "addi       %[h],       %[h],           -0x01          \n\t"
+-
+-                    "punpcklbh  %[ftmp3],   %[ftmp1],       %[ftmp0]       \n\t"
+-                    "punpckhbh  %[ftmp4],   %[ftmp1],       %[ftmp0]       \n\t"
+-                    "punpcklbh  %[ftmp5],   %[ftmp2],       %[ftmp0]       \n\t"
+-                    "punpckhbh  %[ftmp6],   %[ftmp2],       %[ftmp0]       \n\t"
+-                    "pmullh     %[ftmp3],   %[ftmp3],       %[A]           \n\t"
+-                    "pmullh     %[ftmp5],   %[ftmp5],       %[E]           \n\t"
+-                    "paddh      %[ftmp1],   %[ftmp3],       %[ftmp5]       \n\t"
+-                    "pmullh     %[ftmp4],   %[ftmp4],       %[A]           \n\t"
+-                    "pmullh     %[ftmp6],   %[ftmp6],       %[E]           \n\t"
+-                    "paddh      %[ftmp2],   %[ftmp4],       %[ftmp6]       \n\t"
+-
+-                    "paddh      %[ftmp1],   %[ftmp1],       %[ff_pw_32]    \n\t"
+-                    "paddh      %[ftmp2],   %[ftmp2],       %[ff_pw_32]    \n\t"
+-                    "psrlh      %[ftmp1],   %[ftmp1],       %[ftmp7]       \n\t"
+-                    "psrlh      %[ftmp2],   %[ftmp2],       %[ftmp7]       \n\t"
+-                    "packushb   %[ftmp1],   %[ftmp1],       %[ftmp2]       \n\t"
+-                    MMI_LDC1(%[ftmp2], %[dst], 0x00)
+-                    "pavgb      %[ftmp1],   %[ftmp1],       %[ftmp2]       \n\t"
+-                    MMI_SDC1(%[ftmp1], %[dst], 0x00)
+-                    PTR_ADDU   "%[dst],     %[dst],         %[stride]      \n\t"
+-                    "bnez       %[h],       1b                             \n\t"
+-                    : [ftmp0]"=&f"(ftmp[0]),        [ftmp1]"=&f"(ftmp[1]),
+-                      [ftmp2]"=&f"(ftmp[2]),        [ftmp3]"=&f"(ftmp[3]),
+-                      [ftmp4]"=&f"(ftmp[4]),        [ftmp5]"=&f"(ftmp[5]),
+-                      [ftmp6]"=&f"(ftmp[6]),        [ftmp7]"=&f"(ftmp[7]),
+-                      [tmp0]"=&r"(tmp[0]),
+-                      [dst]"+&r"(dst),              [src]"+&r"(src),
+-                      [h]"+&r"(h)
+-                    : [stride]"r"((mips_reg)stride),
+-                      [ff_pw_32]"f"(ff_pw_32),
+-                      [A]"f"(A),                    [E]"f"(E)
+-                    : "memory"
+-                );
+-            }
+-        }
++        /* x==0, y!=0 */
++        E = y << 3;
++        A = 64 - E;
++        __asm__ volatile (
++            "xor        %[ftmp0],   %[ftmp0],       %[ftmp0]       \n\t"
++            "dli        %[tmp0],    0x06                           \n\t"
++            "pshufh     %[A],       %[A],           %[ftmp0]       \n\t"
++            "pshufh     %[E],       %[E],           %[ftmp0]       \n\t"
++            "mtc1       %[tmp0],    %[ftmp7]                       \n\t"
++
++            "1:                                                    \n\t"
++            MMI_ULDC1(%[ftmp1], %[src], 0x00)
++            PTR_ADDU   "%[src],     %[src],         %[stride]      \n\t"
++            MMI_ULDC1(%[ftmp2], %[src], 0x00)
++            "addi       %[h],       %[h],           -0x01          \n\t"
++
++            "punpcklbh  %[ftmp3],   %[ftmp1],       %[ftmp0]       \n\t"
++            "punpckhbh  %[ftmp4],   %[ftmp1],       %[ftmp0]       \n\t"
++            "punpcklbh  %[ftmp5],   %[ftmp2],       %[ftmp0]       \n\t"
++            "punpckhbh  %[ftmp6],   %[ftmp2],       %[ftmp0]       \n\t"
++            "pmullh     %[ftmp3],   %[ftmp3],       %[A]           \n\t"
++            "pmullh     %[ftmp5],   %[ftmp5],       %[E]           \n\t"
++            "paddh      %[ftmp1],   %[ftmp3],       %[ftmp5]       \n\t"
++            "pmullh     %[ftmp4],   %[ftmp4],       %[A]           \n\t"
++            "pmullh     %[ftmp6],   %[ftmp6],       %[E]           \n\t"
++            "paddh      %[ftmp2],   %[ftmp4],       %[ftmp6]       \n\t"
++
++            "paddh      %[ftmp1],   %[ftmp1],       %[ff_pw_32]    \n\t"
++            "paddh      %[ftmp2],   %[ftmp2],       %[ff_pw_32]    \n\t"
++            "psrlh      %[ftmp1],   %[ftmp1],       %[ftmp7]       \n\t"
++            "psrlh      %[ftmp2],   %[ftmp2],       %[ftmp7]       \n\t"
++            "packushb   %[ftmp1],   %[ftmp1],       %[ftmp2]       \n\t"
++            MMI_LDC1(%[ftmp2], %[dst], 0x00)
++            "pavgb      %[ftmp1],   %[ftmp1],       %[ftmp2]       \n\t"
++            MMI_SDC1(%[ftmp1], %[dst], 0x00)
++            PTR_ADDU   "%[dst],     %[dst],         %[stride]      \n\t"
++            "bnez       %[h],       1b                             \n\t"
++            : [ftmp0]"=&f"(ftmp[0]),        [ftmp1]"=&f"(ftmp[1]),
++              [ftmp2]"=&f"(ftmp[2]),        [ftmp3]"=&f"(ftmp[3]),
++              [ftmp4]"=&f"(ftmp[4]),        [ftmp5]"=&f"(ftmp[5]),
++              [ftmp6]"=&f"(ftmp[6]),        [ftmp7]"=&f"(ftmp[7]),
++              [tmp0]"=&r"(tmp[0]),
++              [dst]"+&r"(dst),              [src]"+&r"(src),
++              [h]"+&r"(h)
++            : [stride]"r"((mips_reg)stride),
++              [ff_pw_32]"f"(ff_pw_32),
++              [A]"f"(A),                    [E]"f"(E)
++            : "memory"
++        );
+     }
+ }
+ 
+@@ -567,8 +499,8 @@
+ {
+     const int A = (8 - x) * (8 - y);
+     const int B = x * (8 - y);
+-    const int C = (8 - x) *  y;
+-    const int D = x *  y;
++    const int C = (8 - x) * y;
++    const int D = x * y;
+     const int E = B + C;
+     double ftmp[8];
+     uint64_t tmp[1];
+@@ -586,31 +518,29 @@
+             "pshufh     %[D],       %[D],           %[ftmp0]            \n\t"
+ 
+             "1:                                                         \n\t"
+-            PTR_ADDU   "%[addr0],   %[src],         %[stride]           \n\t"
+             MMI_ULWC1(%[ftmp1], %[src], 0x00)
+             MMI_ULWC1(%[ftmp2], %[src], 0x01)
+-            MMI_ULWC1(%[ftmp3], %[addr0], 0x00)
+-            MMI_ULWC1(%[ftmp4], %[addr0], 0x01)
++            PTR_ADDU   "%[src],     %[src],         %[stride]           \n\t"
++            MMI_ULWC1(%[ftmp3], %[src], 0x00)
++            MMI_ULWC1(%[ftmp4], %[src], 0x01)
+ 
+             "punpcklbh  %[ftmp5],   %[ftmp1],       %[ftmp0]            \n\t"
+             "punpcklbh  %[ftmp6],   %[ftmp2],       %[ftmp0]            \n\t"
+             "pmullh     %[ftmp5],   %[ftmp5],       %[A]                \n\t"
+             "pmullh     %[ftmp6],   %[ftmp6],       %[B]                \n\t"
+             "paddh      %[ftmp1],   %[ftmp5],       %[ftmp6]            \n\t"
+-
+             "punpcklbh  %[ftmp5],   %[ftmp3],       %[ftmp0]            \n\t"
+             "punpcklbh  %[ftmp6],   %[ftmp4],       %[ftmp0]            \n\t"
+             "pmullh     %[ftmp5],   %[ftmp5],       %[C]                \n\t"
+             "pmullh     %[ftmp6],   %[ftmp6],       %[D]                \n\t"
+             "paddh      %[ftmp2],   %[ftmp5],       %[ftmp6]            \n\t"
+-
+             "paddh      %[ftmp1],   %[ftmp1],       %[ftmp2]            \n\t"
+             "paddh      %[ftmp1],   %[ftmp1],       %[ff_pw_32]         \n\t"
+             "psrlh      %[ftmp1],   %[ftmp1],       %[ftmp7]            \n\t"
+             "packushb   %[ftmp1],   %[ftmp1],       %[ftmp0]            \n\t"
++
+             "addi       %[h],       %[h],           -0x01               \n\t"
+             MMI_SWC1(%[ftmp1], %[dst], 0x00)
+-            PTR_ADDU   "%[src],     %[src],         %[stride]           \n\t"
+             PTR_ADDU   "%[dst],     %[dst],         %[stride]           \n\t"
+             "bnez       %[h],       1b                                  \n\t"
+             : [ftmp0]"=&f"(ftmp[0]),        [ftmp1]"=&f"(ftmp[1]),
+@@ -619,7 +549,6 @@
+               [ftmp6]"=&f"(ftmp[6]),        [ftmp7]"=&f"(ftmp[7]),
+               [tmp0]"=&r"(tmp[0]),
+               RESTRICT_ASM_LOW32
+-              [addr0]"=&r"(addr[0]),
+               [dst]"+&r"(dst),              [src]"+&r"(src),
+               [h]"+&r"(h)
+             : [stride]"r"((mips_reg)stride),[ff_pw_32]"f"(ff_pw_32),
+@@ -629,7 +558,6 @@
+         );
+     } else if (E) {
+         const int step = C ? stride : 1;
+-
+         __asm__ volatile (
+             "xor        %[ftmp0],   %[ftmp0],       %[ftmp0]            \n\t"
+             "dli        %[tmp0],    0x06                                \n\t"
+@@ -638,22 +566,20 @@
+             "mtc1       %[tmp0],    %[ftmp5]                            \n\t"
+ 
+             "1:                                                         \n\t"
+-            PTR_ADDU   "%[addr0],   %[src],         %[step]             \n\t"
+             MMI_ULWC1(%[ftmp1], %[src], 0x00)
++            PTR_ADDU   "%[addr0],   %[src],         %[step]             \n\t"
+             MMI_ULWC1(%[ftmp2], %[addr0], 0x00)
+-
++            PTR_ADDU   "%[src],     %[src],         %[stride]           \n\t"
++            "addi       %[h],       %[h],           -0x01               \n\t"
+             "punpcklbh  %[ftmp3],   %[ftmp1],       %[ftmp0]            \n\t"
+             "punpcklbh  %[ftmp4],   %[ftmp2],       %[ftmp0]            \n\t"
+             "pmullh     %[ftmp3],   %[ftmp3],       %[A]                \n\t"
+             "pmullh     %[ftmp4],   %[ftmp4],       %[E]                \n\t"
+             "paddh      %[ftmp1],   %[ftmp3],       %[ftmp4]            \n\t"
+-
+             "paddh      %[ftmp1],   %[ftmp1],       %[ff_pw_32]         \n\t"
+             "psrlh      %[ftmp1],   %[ftmp1],       %[ftmp5]            \n\t"
+             "packushb   %[ftmp1],   %[ftmp1],       %[ftmp0]            \n\t"
+-            "addi       %[h],       %[h],           -0x01               \n\t"
+             MMI_SWC1(%[ftmp1], %[dst], 0x00)
+-            PTR_ADDU   "%[src],     %[src],         %[stride]           \n\t"
+             PTR_ADDU   "%[dst],     %[dst],         %[stride]           \n\t"
+             "bnez       %[h],       1b                                  \n\t"
+             : [ftmp0]"=&f"(ftmp[0]),        [ftmp1]"=&f"(ftmp[1]),
+@@ -671,42 +597,22 @@
+         );
+     } else {
+         __asm__ volatile (
+-            "xor        %[ftmp0],   %[ftmp0],       %[ftmp0]            \n\t"
+-            "dli        %[tmp0],    0x06                                \n\t"
+-            "pshufh     %[A],       %[A],           %[ftmp0]            \n\t"
+-            "mtc1       %[tmp0],    %[ftmp3]                            \n\t"
+-
+             "1:                                                         \n\t"
+-            MMI_ULWC1(%[ftmp1], %[src], 0x00)
+-            "punpcklbh  %[ftmp2],   %[ftmp1],       %[ftmp0]            \n\t"
+-            "pmullh     %[ftmp1],   %[ftmp2],       %[A]                \n\t"
+-            "paddh      %[ftmp1],   %[ftmp1],       %[ff_pw_32]         \n\t"
+-            "psrlh      %[ftmp1],   %[ftmp1],       %[ftmp3]            \n\t"
+-            "packushb   %[ftmp1],   %[ftmp1],       %[ftmp0]            \n\t"
++            MMI_ULWC1(%[ftmp0], %[src], 0x00)
+             PTR_ADDU   "%[src],     %[src],         %[stride]           \n\t"
+-            MMI_SWC1(%[ftmp1], %[dst], 0x00)
+-            PTR_ADDU   "%[dst],     %[dst],         %[stride]           \n\t"
+-
+             MMI_ULWC1(%[ftmp1], %[src], 0x00)
+-            "punpcklbh  %[ftmp2],   %[ftmp1],       %[ftmp0]            \n\t"
+-            "pmullh     %[ftmp1],   %[ftmp2],       %[A]                \n\t"
+-            "paddh      %[ftmp1],   %[ftmp1],       %[ff_pw_32]         \n\t"
+-            "psrlh      %[ftmp1],   %[ftmp1],       %[ftmp3]            \n\t"
+-            "packushb   %[ftmp1],   %[ftmp1],       %[ftmp0]            \n\t"
++            PTR_ADDU   "%[src],     %[src],         %[stride]           \n\t"
+             "addi       %[h],       %[h],           -0x02               \n\t"
++            MMI_SWC1(%[ftmp0], %[dst], 0x00)
++            PTR_ADDU   "%[dst],     %[dst],         %[stride]           \n\t"
+             MMI_SWC1(%[ftmp1], %[dst], 0x00)
+-
+-            PTR_ADDU   "%[src],     %[src],         %[stride]           \n\t"
+             PTR_ADDU   "%[dst],     %[dst],         %[stride]           \n\t"
+             "bnez       %[h],       1b                                  \n\t"
+             : [ftmp0]"=&f"(ftmp[0]),        [ftmp1]"=&f"(ftmp[1]),
+-              [ftmp2]"=&f"(ftmp[2]),        [ftmp3]"=&f"(ftmp[3]),
+-              [tmp0]"=&r"(tmp[0]),
+-              RESTRICT_ASM_LOW32
+               [dst]"+&r"(dst),              [src]"+&r"(src),
++              RESTRICT_ASM_LOW32
+               [h]"+&r"(h)
+-            : [stride]"r"((mips_reg)stride),[ff_pw_32]"f"(ff_pw_32),
+-              [A]"f"(A)
++            : [stride]"r"((mips_reg)stride)
+             : "memory"
+         );
+     }
+@@ -736,33 +642,31 @@
+             "pshufh     %[D],       %[D],           %[ftmp0]            \n\t"
+ 
+             "1:                                                         \n\t"
+-            PTR_ADDU   "%[addr0],   %[src],         %[stride]           \n\t"
+             MMI_ULWC1(%[ftmp1], %[src], 0x00)
+             MMI_ULWC1(%[ftmp2], %[src], 0x01)
+-            MMI_ULWC1(%[ftmp3], %[addr0], 0x00)
+-            MMI_ULWC1(%[ftmp4], %[addr0], 0x01)
++            PTR_ADDU   "%[src],     %[src],         %[stride]           \n\t"
++            MMI_ULWC1(%[ftmp3], %[src], 0x00)
++            MMI_ULWC1(%[ftmp4], %[src], 0x01)
+ 
+             "punpcklbh  %[ftmp5],   %[ftmp1],       %[ftmp0]            \n\t"
+             "punpcklbh  %[ftmp6],   %[ftmp2],       %[ftmp0]            \n\t"
+             "pmullh     %[ftmp5],   %[ftmp5],       %[A]                \n\t"
+             "pmullh     %[ftmp6],   %[ftmp6],       %[B]                \n\t"
+             "paddh      %[ftmp1],   %[ftmp5],       %[ftmp6]            \n\t"
+-
+             "punpcklbh  %[ftmp5],   %[ftmp3],       %[ftmp0]            \n\t"
+             "punpcklbh  %[ftmp6],   %[ftmp4],       %[ftmp0]            \n\t"
+             "pmullh     %[ftmp5],   %[ftmp5],       %[C]                \n\t"
+             "pmullh     %[ftmp6],   %[ftmp6],       %[D]                \n\t"
+             "paddh      %[ftmp2],   %[ftmp5],       %[ftmp6]            \n\t"
+-
+             "paddh      %[ftmp1],   %[ftmp1],       %[ftmp2]            \n\t"
+             "paddh      %[ftmp1],   %[ftmp1],       %[ff_pw_32]         \n\t"
+             "psrlh      %[ftmp1],   %[ftmp1],       %[ftmp7]            \n\t"
+             "packushb   %[ftmp1],   %[ftmp1],       %[ftmp0]            \n\t"
+             MMI_LWC1(%[ftmp2], %[dst], 0x00)
+             "pavgb      %[ftmp1],   %[ftmp1],       %[ftmp2]            \n\t"
++
+             "addi       %[h],       %[h],           -0x01               \n\t"
+             MMI_SWC1(%[ftmp1], %[dst], 0x00)
+-            PTR_ADDU   "%[src],     %[src],         %[stride]           \n\t"
+             PTR_ADDU   "%[dst],     %[dst],         %[stride]           \n\t"
+             "bnez       %[h],       1b                                  \n\t"
+             : [ftmp0]"=&f"(ftmp[0]),        [ftmp1]"=&f"(ftmp[1]),
+@@ -771,7 +675,6 @@
+               [ftmp6]"=&f"(ftmp[6]),        [ftmp7]"=&f"(ftmp[7]),
+               [tmp0]"=&r"(tmp[0]),
+               RESTRICT_ASM_LOW32
+-              [addr0]"=&r"(addr[0]),
+               [dst]"+&r"(dst),              [src]"+&r"(src),
+               [h]"+&r"(h)
+             : [stride]"r"((mips_reg)stride),[ff_pw_32]"f"(ff_pw_32),
+@@ -781,32 +684,30 @@
+         );
+     } else if (E) {
+         const int step = C ? stride : 1;
+-
+         __asm__ volatile (
+             "xor        %[ftmp0],   %[ftmp0],       %[ftmp0]            \n\t"
+             "dli        %[tmp0],    0x06                                \n\t"
+             "pshufh     %[A],       %[A],           %[ftmp0]            \n\t"
+             "pshufh     %[E],       %[E],           %[ftmp0]            \n\t"
+             "mtc1       %[tmp0],    %[ftmp5]                            \n\t"
++
+             "1:                                                         \n\t"
+-            PTR_ADDU   "%[addr0],   %[src],         %[step]             \n\t"
+             MMI_ULWC1(%[ftmp1], %[src], 0x00)
++            PTR_ADDU   "%[addr0],   %[src],         %[step]             \n\t"
+             MMI_ULWC1(%[ftmp2], %[addr0], 0x00)
+-
++            PTR_ADDU   "%[src],     %[src],         %[stride]           \n\t"
++            "addi       %[h],       %[h],           -0x01               \n\t"
+             "punpcklbh  %[ftmp3],   %[ftmp1],       %[ftmp0]            \n\t"
+             "punpcklbh  %[ftmp4],   %[ftmp2],       %[ftmp0]            \n\t"
+             "pmullh     %[ftmp3],   %[ftmp3],       %[A]                \n\t"
+             "pmullh     %[ftmp4],   %[ftmp4],       %[E]                \n\t"
+             "paddh      %[ftmp1],   %[ftmp3],       %[ftmp4]            \n\t"
+-
+             "paddh      %[ftmp1],   %[ftmp1],       %[ff_pw_32]         \n\t"
+             "psrlh      %[ftmp1],   %[ftmp1],       %[ftmp5]            \n\t"
+             "packushb   %[ftmp1],   %[ftmp1],       %[ftmp0]            \n\t"
+             MMI_LWC1(%[ftmp2], %[dst], 0x00)
+             "pavgb      %[ftmp1],   %[ftmp1],       %[ftmp2]            \n\t"
+-            "addi       %[h],       %[h],           -0x01               \n\t"
+             MMI_SWC1(%[ftmp1], %[dst], 0x00)
+-            PTR_ADDU   "%[src],     %[src],         %[stride]           \n\t"
+             PTR_ADDU   "%[dst],     %[dst],         %[stride]           \n\t"
+             "bnez       %[h],       1b                                  \n\t"
+             : [ftmp0]"=&f"(ftmp[0]),        [ftmp1]"=&f"(ftmp[1]),
+@@ -824,46 +725,27 @@
+         );
+     } else {
+         __asm__ volatile (
+-            "xor        %[ftmp0],   %[ftmp0],       %[ftmp0]            \n\t"
+-            "dli        %[tmp0],    0x06                                \n\t"
+-            "pshufh     %[A],       %[A],           %[ftmp0]            \n\t"
+-            "mtc1       %[tmp0],    %[ftmp3]                            \n\t"
+-
+             "1:                                                         \n\t"
+-            MMI_ULWC1(%[ftmp1], %[src], 0x00)
+-            "punpcklbh  %[ftmp2],   %[ftmp1],       %[ftmp0]            \n\t"
+-            "pmullh     %[ftmp1],   %[ftmp2],       %[A]                \n\t"
+-            "paddh      %[ftmp1],   %[ftmp1],       %[ff_pw_32]         \n\t"
+-            "psrlh      %[ftmp1],   %[ftmp1],       %[ftmp3]            \n\t"
+-            "packushb   %[ftmp1],   %[ftmp1],       %[ftmp0]            \n\t"
+-            MMI_LWC1(%[ftmp2], %[dst], 0x00)
+-            "pavgb      %[ftmp1],   %[ftmp1],       %[ftmp2]            \n\t"
++            MMI_ULWC1(%[ftmp0], %[src], 0x00)
+             PTR_ADDU   "%[src],     %[src],         %[stride]           \n\t"
+-            MMI_SWC1(%[ftmp1], %[dst], 0x00)
+-            PTR_ADDU   "%[dst],     %[dst],         %[stride]           \n\t"
+-
+             MMI_ULWC1(%[ftmp1], %[src], 0x00)
+-            "punpcklbh  %[ftmp2],   %[ftmp1],       %[ftmp0]            \n\t"
+-            "pmullh     %[ftmp1],   %[ftmp2],       %[A]                \n\t"
+-            "paddh      %[ftmp1],   %[ftmp1],       %[ff_pw_32]         \n\t"
+-            "psrlh      %[ftmp1],   %[ftmp1],       %[ftmp3]            \n\t"
+-            "packushb   %[ftmp1],   %[ftmp1],       %[ftmp0]            \n\t"
+-            MMI_LWC1(%[ftmp2], %[dst], 0x00)
+-            "pavgb      %[ftmp1],   %[ftmp1],       %[ftmp2]            \n\t"
++            PTR_ADDU   "%[src],     %[src],         %[stride]           \n\t"
+             "addi       %[h],       %[h],           -0x02               \n\t"
++            MMI_LWC1(%[ftmp2], %[dst], 0x00)
++            "pavgb      %[ftmp0],   %[ftmp0],       %[ftmp2]            \n\t"
++            MMI_SWC1(%[ftmp0], %[dst], 0x00)
++            PTR_ADDU   "%[dst],     %[dst],         %[stride]           \n\t"
++            MMI_LWC1(%[ftmp3], %[dst], 0x00)
++            "pavgb      %[ftmp1],   %[ftmp1],       %[ftmp3]            \n\t"
+             MMI_SWC1(%[ftmp1], %[dst], 0x00)
+-
+-            PTR_ADDU   "%[src],     %[src],         %[stride]           \n\t"
+             PTR_ADDU   "%[dst],     %[dst],         %[stride]           \n\t"
+             "bnez       %[h],       1b                                  \n\t"
+             : [ftmp0]"=&f"(ftmp[0]),        [ftmp1]"=&f"(ftmp[1]),
+               [ftmp2]"=&f"(ftmp[2]),        [ftmp3]"=&f"(ftmp[3]),
+-              [tmp0]"=&r"(tmp[0]),
+-              RESTRICT_ASM_LOW32
+               [dst]"+&r"(dst),              [src]"+&r"(src),
++              RESTRICT_ASM_LOW32
+               [h]"+&r"(h)
+-            : [stride]"r"((mips_reg)stride),[ff_pw_32]"f"(ff_pw_32),
+-              [A]"f"(A)
++            : [stride]"r"((mips_reg)stride)
+             : "memory"
+         );
+     }
+diff -uNra ffmpeg-4.1.6/libavcodec/mips/h264chroma_msa.c FFmpeg/libavcodec/mips/h264chroma_msa.c
+--- a/libavcodec/mips/h264chroma_msa.c	2020-07-05 06:36:01.000000000 +0800
++++ b/libavcodec/mips/h264chroma_msa.c	2020-07-19 18:13:57.450576010 +0800
+@@ -85,7 +85,7 @@
+     res_r = __msa_sat_u_h(res_r, 7);
+     res = (v8i16) __msa_pckev_b((v16i8) res_r, (v16i8) res_r);
+ 
+-    ST2x4_UB(res, 0, dst, stride);
++    ST_H4(res, 0, 1, 2, 3, dst, stride);
+ }
+ 
+ static void avc_chroma_hz_2w_msa(uint8_t *src, uint8_t *dst, int32_t stride,
+@@ -121,7 +121,7 @@
+     res_r = __msa_sat_u_h(res_r, 7);
+     res = (v4i32) __msa_pckev_b((v16i8) res_r, (v16i8) res_r);
+ 
+-    ST4x2_UB(res, dst, stride);
++    ST_W2(res, 0, 1, dst, stride);
+ }
+ 
+ static void avc_chroma_hz_4x4_msa(uint8_t *src, uint8_t *dst, int32_t stride,
+@@ -144,7 +144,7 @@
+     SRARI_H2_UH(res0_r, res1_r, 6);
+     SAT_UH2_UH(res0_r, res1_r, 7);
+     out = (v16u8) __msa_pckev_b((v16i8) res1_r, (v16i8) res0_r);
+-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, stride);
++    ST_W4(out, 0, 1, 2, 3, dst, stride);
+ }
+ 
+ static void avc_chroma_hz_4x8_msa(uint8_t *src, uint8_t *dst, int32_t stride,
+@@ -168,7 +168,7 @@
+     SRARI_H4_UH(res0, res1, res2, res3, 6);
+     SAT_UH4_UH(res0, res1, res2, res3, 7);
+     PCKEV_B2_UB(res1, res0, res3, res2, out0, out1);
+-    ST4x8_UB(out0, out1, dst, stride);
++    ST_W8(out0, out1, 0, 1, 2, 3, 0, 1, 2, 3, dst, stride);
+ }
+ 
+ static void avc_chroma_hz_4w_msa(uint8_t *src, uint8_t *dst, int32_t stride,
+@@ -204,7 +204,7 @@
+     SRARI_H4_UH(res0, res1, res2, res3, 6);
+     SAT_UH4_UH(res0, res1, res2, res3, 7);
+     PCKEV_B2_UB(res1, res0, res3, res2, out0, out1);
+-    ST8x4_UB(out0, out1, dst, stride);
++    ST_D4(out0, out1, 0, 1, 0, 1, dst, stride);
+ }
+ 
+ static void avc_chroma_hz_8x8_msa(uint8_t *src, uint8_t *dst, int32_t stride,
+@@ -237,7 +237,7 @@
+     SAT_UH4_UH(res4, res5, res6, res7, 7);
+     PCKEV_B2_UB(res1, res0, res3, res2, out0, out1);
+     PCKEV_B2_UB(res5, res4, res7, res6, out2, out3);
+-    ST8x8_UB(out0, out1, out2, out3, dst, stride);
++    ST_D8(out0, out1, out2, out3, 0, 1, 0, 1, 0, 1, 0, 1, dst, stride);
+ }
+ 
+ static void avc_chroma_hz_nonmult_msa(uint8_t *src, uint8_t *dst,
+@@ -266,7 +266,7 @@
+         SRARI_H4_UH(res0, res1, res2, res3, 6);
+         SAT_UH4_UH(res0, res1, res2, res3, 7);
+         PCKEV_B2_UB(res1, res0, res3, res2, out0, out1);
+-        ST8x4_UB(out0, out1, dst, stride);
++        ST_D4(out0, out1, 0, 1, 0, 1, dst, stride);
+         dst += (4 * stride);
+     }
+ 
+@@ -283,7 +283,7 @@
+             res0 = __msa_sat_u_h(res0, 7);
+             res0 = (v8u16) __msa_pckev_b((v16i8) res0, (v16i8) res0);
+ 
+-            ST8x1_UB(res0, dst);
++            ST_D1(res0, 0, dst);
+             dst += stride;
+         }
+     }
+@@ -359,7 +359,7 @@
+ 
+     res = (v8i16) __msa_pckev_b((v16i8) res_r, (v16i8) res_r);
+ 
+-    ST2x4_UB(res, 0, dst, stride);
++    ST_H4(res, 0, 1, 2, 3, dst, stride);
+ }
+ 
+ static void avc_chroma_vt_2w_msa(uint8_t *src, uint8_t *dst, int32_t stride,
+@@ -394,7 +394,7 @@
+     res_r = __msa_sat_u_h(res_r, 7);
+     res = (v4i32) __msa_pckev_b((v16i8) res_r, (v16i8) res_r);
+ 
+-    ST4x2_UB(res, dst, stride);
++    ST_W2(res, 0, 1, dst, stride);
+ }
+ 
+ static void avc_chroma_vt_4x4_msa(uint8_t *src, uint8_t *dst, int32_t stride,
+@@ -418,7 +418,7 @@
+     SRARI_H2_UH(res0_r, res1_r, 6);
+     SAT_UH2_UH(res0_r, res1_r, 7);
+     out = (v16u8) __msa_pckev_b((v16i8) res1_r, (v16i8) res0_r);
+-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, stride);
++    ST_W4(out, 0, 1, 2, 3, dst, stride);
+ }
+ 
+ static void avc_chroma_vt_4x8_msa(uint8_t *src, uint8_t *dst, int32_t stride,
+@@ -446,7 +446,7 @@
+     SRARI_H4_UH(res0, res1, res2, res3, 6);
+     SAT_UH4_UH(res0, res1, res2, res3, 7);
+     PCKEV_B2_UB(res1, res0, res3, res2, out0, out1);
+-    ST4x8_UB(out0, out1, dst, stride);
++    ST_W8(out0, out1, 0, 1, 2, 3, 0, 1, 2, 3, dst, stride);
+ }
+ 
+ static void avc_chroma_vt_4w_msa(uint8_t *src, uint8_t *dst, int32_t stride,
+@@ -480,7 +480,7 @@
+     SRARI_H4_UH(res0, res1, res2, res3, 6);
+     SAT_UH4_UH(res0, res1, res2, res3, 7);
+     PCKEV_B2_UB(res1, res0, res3, res2, out0, out1);
+-    ST8x4_UB(out0, out1, dst, stride);
++    ST_D4(out0, out1, 0, 1, 0, 1, dst, stride);
+ }
+ 
+ static void avc_chroma_vt_8x8_msa(uint8_t *src, uint8_t *dst, int32_t stride,
+@@ -512,7 +512,7 @@
+     SAT_UH4_UH(res0, res1, res2, res3, 7);
+     PCKEV_B2_UB(res1, res0, res3, res2, out0, out1);
+     PCKEV_B2_UB(res5, res4, res7, res6, out2, out3);
+-    ST8x8_UB(out0, out1, out2, out3, dst, stride);
++    ST_D8(out0, out1, out2, out3, 0, 1, 0, 1, 0, 1, 0, 1, dst, stride);
+ }
+ 
+ static void avc_chroma_vt_8w_msa(uint8_t *src, uint8_t *dst, int32_t stride,
+@@ -592,7 +592,7 @@
+ 
+     res = (v8i16) __msa_pckev_b((v16i8) res_vt0, (v16i8) res_vt0);
+ 
+-    ST2x4_UB(res, 0, dst, stride);
++    ST_H4(res, 0, 1, 2, 3, dst, stride);
+ }
+ 
+ static void avc_chroma_hv_2w_msa(uint8_t *src, uint8_t *dst, int32_t stride,
+@@ -634,7 +634,7 @@
+     res_vt0 = __msa_sat_u_h(res_vt0, 7);
+     res = (v4i32) __msa_pckev_b((v16i8) res_vt0, (v16i8) res_vt0);
+ 
+-    ST4x2_UB(res, dst, stride);
++    ST_W2(res, 0, 1, dst, stride);
+ }
+ 
+ static void avc_chroma_hv_4x4_msa(uint8_t *src, uint8_t *dst, int32_t stride,
+@@ -666,7 +666,8 @@
+     SRARI_H2_UH(res_vt0, res_vt1, 6);
+     SAT_UH2_UH(res_vt0, res_vt1, 7);
+     PCKEV_B2_SW(res_vt0, res_vt0, res_vt1, res_vt1, res0, res1);
+-    ST4x4_UB(res0, res1, 0, 1, 0, 1, dst, stride);
++    ST_W2(res0, 0, 1, dst, stride);
++    ST_W2(res1, 0, 1, dst + 2 * stride, stride);
+ }
+ 
+ static void avc_chroma_hv_4x8_msa(uint8_t *src, uint8_t *dst, int32_t stride,
+@@ -706,7 +707,7 @@
+     SRARI_H4_UH(res_vt0, res_vt1, res_vt2, res_vt3, 6);
+     SAT_UH4_UH(res_vt0, res_vt1, res_vt2, res_vt3, 7);
+     PCKEV_B2_UB(res_vt1, res_vt0, res_vt3, res_vt2, res0, res1);
+-    ST4x8_UB(res0, res1, dst, stride);
++    ST_W8(res0, res1, 0, 1, 2, 3, 0, 1, 2, 3, dst, stride);
+ }
+ 
+ static void avc_chroma_hv_4w_msa(uint8_t *src, uint8_t *dst, int32_t stride,
+@@ -766,7 +767,7 @@
+     SRARI_H4_UH(res_vt0, res_vt1, res_vt2, res_vt3, 6);
+     SAT_UH4_UH(res_vt0, res_vt1, res_vt2, res_vt3, 7);
+     PCKEV_B2_UB(res_vt1, res_vt0, res_vt3, res_vt2, out0, out1);
+-    ST8x4_UB(out0, out1, dst, stride);
++    ST_D4(out0, out1, 0, 1, 0, 1, dst, stride);
+ }
+ 
+ static void avc_chroma_hv_8x8_msa(uint8_t *src, uint8_t *dst, int32_t stride,
+@@ -822,7 +823,7 @@
+     SAT_UH4_UH(res_vt4, res_vt5, res_vt6, res_vt7, 7);
+     PCKEV_B2_UB(res_vt1, res_vt0, res_vt3, res_vt2, out0, out1);
+     PCKEV_B2_UB(res_vt5, res_vt4, res_vt7, res_vt6, out2, out3);
+-    ST8x8_UB(out0, out1, out2, out3, dst, stride);
++    ST_D8(out0, out1, out2, out3, 0, 1, 0, 1, 0, 1, 0, 1, dst, stride);
+ }
+ 
+ static void avc_chroma_hv_8w_msa(uint8_t *src, uint8_t *dst, int32_t stride,
+@@ -918,7 +919,7 @@
+     dst0 = (v16u8) __msa_pckev_b((v16i8) res_r, (v16i8) res_r);
+     dst0 = __msa_aver_u_b(dst0, dst_data);
+ 
+-    ST2x4_UB(dst0, 0, dst, stride);
++    ST_H4(dst0, 0, 1, 2, 3, dst, stride);
+ }
+ 
+ static void avc_chroma_hz_and_aver_dst_2w_msa(uint8_t *src, uint8_t *dst,
+@@ -962,7 +963,7 @@
+     res = __msa_pckev_b((v16i8) res_r, (v16i8) res_r);
+     dst_data = __msa_aver_u_b((v16u8) res, dst_data);
+ 
+-    ST4x2_UB(dst_data, dst, stride);
++    ST_W2(dst_data, 0, 1, dst, stride);
+ }
+ 
+ static void avc_chroma_hz_and_aver_dst_4x4_msa(uint8_t *src, uint8_t *dst,
+@@ -991,7 +992,7 @@
+     SAT_UH2_UH(res0_r, res1_r, 7);
+     out = (v16u8) __msa_pckev_b((v16i8) res1_r, (v16i8) res0_r);
+     out = __msa_aver_u_b(out, dst_data);
+-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, stride);
++    ST_W4(out, 0, 1, 2, 3, dst, stride);
+ }
+ 
+ static void avc_chroma_hz_and_aver_dst_4x8_msa(uint8_t *src, uint8_t *dst,
+@@ -1023,7 +1024,7 @@
+     SAT_UH4_UH(res0, res1, res2, res3, 7);
+     PCKEV_B2_UB(res1, res0, res3, res2, out0, out1);
+     AVER_UB2_UB(out0, dst0, out1, dst1, out0, out1);
+-    ST4x8_UB(out0, out1, dst, stride);
++    ST_W8(out0, out1, 0, 1, 2, 3, 0, 1, 2, 3, dst, stride);
+ }
+ 
+ static void avc_chroma_hz_and_aver_dst_4w_msa(uint8_t *src, uint8_t *dst,
+@@ -1066,7 +1067,7 @@
+     SAT_UH4_UH(res0, res1, res2, res3, 7);
+     PCKEV_B2_UB(res1, res0, res3, res2, out0, out1);
+     AVER_UB2_UB(out0, dst0, out1, dst1, dst0, dst1);
+-    ST8x4_UB(dst0, dst1, dst, stride);
++    ST_D4(dst0, dst1, 0, 1, 0, 1, dst, stride);
+ }
+ 
+ static void avc_chroma_hz_and_aver_dst_8x8_msa(uint8_t *src, uint8_t *dst,
+@@ -1110,7 +1111,7 @@
+     PCKEV_B2_UB(res5, res4, res7, res6, out2, out3);
+     AVER_UB2_UB(out0, dst0, out1, dst1, out0, out1);
+     AVER_UB2_UB(out2, dst2, out3, dst3, out2, out3);
+-    ST8x8_UB(out0, out1, out2, out3, dst, stride);
++    ST_D8(out0, out1, out2, out3, 0, 1, 0, 1, 0, 1, 0, 1, dst, stride);
+ }
+ 
+ static void avc_chroma_hz_and_aver_dst_8w_msa(uint8_t *src, uint8_t *dst,
+@@ -1200,7 +1201,7 @@
+     res = (v8i16) __msa_pckev_b((v16i8) res_r, (v16i8) res_r);
+     res = (v8i16) __msa_aver_u_b((v16u8) res, dst_data);
+ 
+-    ST2x4_UB(res, 0, dst, stride);
++    ST_H4(res, 0, 1, 2, 3, dst, stride);
+ }
+ 
+ static void avc_chroma_vt_and_aver_dst_2w_msa(uint8_t *src, uint8_t *dst,
+@@ -1243,7 +1244,7 @@
+     res = (v16u8) __msa_pckev_b((v16i8) res_r, (v16i8) res_r);
+     res = __msa_aver_u_b(res, dst_data);
+ 
+-    ST4x2_UB(res, dst, stride);
++    ST_W2(res, 0, 1, dst, stride);
+ }
+ 
+ static void avc_chroma_vt_and_aver_dst_4x4_msa(uint8_t *src, uint8_t *dst,
+@@ -1273,7 +1274,7 @@
+     SAT_UH2_UH(res0_r, res1_r, 7);
+     out = (v16u8) __msa_pckev_b((v16i8) res1_r, (v16i8) res0_r);
+     out = __msa_aver_u_b(out, dst0);
+-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, stride);
++    ST_W4(out, 0, 1, 2, 3, dst, stride);
+ }
+ 
+ static void avc_chroma_vt_and_aver_dst_4x8_msa(uint8_t *src, uint8_t *dst,
+@@ -1309,7 +1310,7 @@
+     SAT_UH4_UH(res0, res1, res2, res3, 7);
+     PCKEV_B2_UB(res1, res0, res3, res2, out0, out1);
+     AVER_UB2_UB(out0, dst0, out1, dst1, out0, out1);
+-    ST4x8_UB(out0, out1, dst, stride);
++    ST_W8(out0, out1, 0, 1, 2, 3, 0, 1, 2, 3, dst, stride);
+ }
+ 
+ static void avc_chroma_vt_and_aver_dst_4w_msa(uint8_t *src, uint8_t *dst,
+@@ -1351,7 +1352,7 @@
+     SAT_UH4_UH(res0, res1, res2, res3, 7);
+     PCKEV_B2_UB(res1, res0, res3, res2, out0, out1);
+     AVER_UB2_UB(out0, dst0, out1, dst1, out0, out1);
+-    ST8x4_UB(out0, out1, dst, stride);
++    ST_D4(out0, out1, 0, 1, 0, 1, dst, stride);
+ }
+ 
+ static void avc_chroma_vt_and_aver_dst_8x8_msa(uint8_t *src, uint8_t *dst,
+@@ -1394,7 +1395,7 @@
+     PCKEV_B2_UB(res5, res4, res7, res6, out2, out3);
+     AVER_UB2_UB(out0, dst0, out1, dst1, out0, out1);
+     AVER_UB2_UB(out2, dst2, out3, dst3, out2, out3);
+-    ST8x8_UB(out0, out1, out2, out3, dst, stride);
++    ST_D8(out0, out1, out2, out3, 0, 1, 0, 1, 0, 1, 0, 1, dst, stride);
+ }
+ 
+ static void avc_chroma_vt_and_aver_dst_8w_msa(uint8_t *src, uint8_t *dst,
+@@ -1492,7 +1493,7 @@
+     res = __msa_pckev_b((v16i8) res_vt0, (v16i8) res_vt0);
+     dst0 = __msa_aver_u_b((v16u8) res, dst0);
+ 
+-    ST2x4_UB(dst0, 0, dst, stride);
++    ST_H4(dst0, 0, 1, 2, 3, dst, stride);
+ }
+ 
+ static void avc_chroma_hv_and_aver_dst_2w_msa(uint8_t *src, uint8_t *dst,
+@@ -1545,7 +1546,7 @@
+     dst0 = (v16u8) __msa_pckev_b((v16i8) res_vt0, (v16i8) res_vt0);
+     dst0 = __msa_aver_u_b(dst0, dst_data);
+ 
+-    ST4x2_UB(dst0, dst, stride);
++    ST_W2(dst0, 0, 1, dst, stride);
+ }
+ 
+ static void avc_chroma_hv_and_aver_dst_4x4_msa(uint8_t *src, uint8_t *dst,
+@@ -1584,7 +1585,7 @@
+     SAT_UH2_UH(res_vt0, res_vt1, 7);
+     out = (v16u8) __msa_pckev_b((v16i8) res_vt1, (v16i8) res_vt0);
+     out = __msa_aver_u_b(out, dst_data);
+-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, stride);
++    ST_W4(out, 0, 1, 2, 3, dst, stride);
+ }
+ 
+ static void avc_chroma_hv_and_aver_dst_4x8_msa(uint8_t *src, uint8_t *dst,
+@@ -1633,7 +1634,7 @@
+     SAT_UH4_UH(res_vt0, res_vt1, res_vt2, res_vt3, 7);
+     PCKEV_B2_UB(res_vt1, res_vt0, res_vt3, res_vt2, res0, res1);
+     AVER_UB2_UB(res0, dst0, res1, dst1, res0, res1);
+-    ST4x8_UB(res0, res1, dst, stride);
++    ST_W8(res0, res1, 0, 1, 2, 3, 0, 1, 2, 3, dst, stride);
+ }
+ 
+ static void avc_chroma_hv_and_aver_dst_4w_msa(uint8_t *src, uint8_t *dst,
+@@ -1701,7 +1702,7 @@
+     SAT_UH4_UH(res_vt0, res_vt1, res_vt2, res_vt3, 7);
+     PCKEV_B2_UB(res_vt1, res_vt0, res_vt3, res_vt2, out0, out1);
+     AVER_UB2_UB(out0, dst0, out1, dst1, out0, out1);
+-    ST8x4_UB(out0, out1, dst, stride);
++    ST_D4(out0, out1, 0, 1, 0, 1, dst, stride);
+ }
+ 
+ static void avc_chroma_hv_and_aver_dst_8x8_msa(uint8_t *src, uint8_t *dst,
+@@ -1770,7 +1771,7 @@
+     PCKEV_B2_UB(res_vt5, res_vt4, res_vt7, res_vt6, out2, out3);
+     AVER_UB2_UB(out0, dst0, out1, dst1, out0, out1);
+     AVER_UB2_UB(out2, dst2, out3, dst3, out2, out3);
+-    ST8x8_UB(out0, out1, out2, out3, dst, stride);
++    ST_D8(out0, out1, out2, out3, 0, 1, 0, 1, 0, 1, 0, 1, dst, stride);
+ }
+ 
+ static void avc_chroma_hv_and_aver_dst_8w_msa(uint8_t *src, uint8_t *dst,
+@@ -1848,21 +1849,21 @@
+         LW4(dst + 4 * stride, stride, tp0, tp1, tp2, tp3);
+         INSERT_W4_UB(tp0, tp1, tp2, tp3, dst1);
+         AVER_UB2_UB(src0, dst0, src1, dst1, dst0, dst1);
+-        ST4x8_UB(dst0, dst1, dst, stride);
++        ST_W8(dst0, dst1, 0, 1, 2, 3, 0, 1, 2, 3, dst, stride);
+     } else if (4 == height) {
+         LW4(src, stride, tp0, tp1, tp2, tp3);
+         INSERT_W4_UB(tp0, tp1, tp2, tp3, src0);
+         LW4(dst, stride, tp0, tp1, tp2, tp3);
+         INSERT_W4_UB(tp0, tp1, tp2, tp3, dst0);
+         dst0 = __msa_aver_u_b(src0, dst0);
+-        ST4x4_UB(dst0, dst0, 0, 1, 2, 3, dst, stride);
++        ST_W4(dst0, 0, 1, 2, 3, dst, stride);
+     } else if (2 == height) {
+         LW2(src, stride, tp0, tp1);
+         INSERT_W2_UB(tp0, tp1, src0);
+         LW2(dst, stride, tp0, tp1);
+         INSERT_W2_UB(tp0, tp1, dst0);
+         dst0 = __msa_aver_u_b(src0, dst0);
+-        ST4x2_UB(dst0, dst, stride);
++        ST_W2(dst0, 0, 1, dst, stride);
+     }
+ }
+ 
+@@ -1889,7 +1890,7 @@
+         INSERT_D2_UB(tp6, tp7, dst3);
+         AVER_UB4_UB(src0, dst0, src1, dst1, src2, dst2, src3, dst3, dst0, dst1,
+                     dst2, dst3);
+-        ST8x8_UB(dst0, dst1, dst2, dst3, dst, stride);
++        ST_D8(dst0, dst1, dst2, dst3, 0, 1, 0, 1, 0, 1, 0, 1, dst, stride);
+     } else if (4 == height) {
+         LD4(src, stride, tp0, tp1, tp2, tp3);
+         INSERT_D2_UB(tp0, tp1, src0);
+@@ -1898,7 +1899,7 @@
+         INSERT_D2_UB(tp0, tp1, dst0);
+         INSERT_D2_UB(tp2, tp3, dst1);
+         AVER_UB2_UB(src0, dst0, src1, dst1, dst0, dst1);
+-        ST8x4_UB(dst0, dst1, dst, stride);
++        ST_D4(dst0, dst1, 0, 1, 0, 1, dst, stride);
+     }
+ }
+ 
+diff -uNra ffmpeg-4.1.6/libavcodec/mips/h264dsp_init_mips.c FFmpeg/libavcodec/mips/h264dsp_init_mips.c
+--- a/libavcodec/mips/h264dsp_init_mips.c	2020-07-03 01:22:31.000000000 +0800
++++ b/libavcodec/mips/h264dsp_init_mips.c	2020-07-19 18:19:52.752365140 +0800
+@@ -19,129 +19,116 @@
+  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+  */
+ 
++#include "libavutil/mips/cpu.h"
+ #include "h264dsp_mips.h"
+ 
+-#if HAVE_MSA
+-static av_cold void h264dsp_init_msa(H264DSPContext *c,
+-                                     const int bit_depth,
+-                                     const int chroma_format_idc)
++av_cold void ff_h264dsp_init_mips(H264DSPContext *c, const int bit_depth,
++                                  const int chroma_format_idc)
+ {
+-    if (8 == bit_depth) {
+-        c->h264_v_loop_filter_luma = ff_h264_v_lpf_luma_inter_msa;
+-        c->h264_h_loop_filter_luma = ff_h264_h_lpf_luma_inter_msa;
+-        c->h264_h_loop_filter_luma_mbaff =
+-            ff_h264_h_loop_filter_luma_mbaff_msa;
+-        c->h264_v_loop_filter_luma_intra = ff_h264_v_lpf_luma_intra_msa;
+-        c->h264_h_loop_filter_luma_intra = ff_h264_h_lpf_luma_intra_msa;
+-        c->h264_h_loop_filter_luma_mbaff_intra =
+-            ff_h264_h_loop_filter_luma_mbaff_intra_msa;
+-        c->h264_v_loop_filter_chroma = ff_h264_v_lpf_chroma_inter_msa;
+-
+-        if (chroma_format_idc <= 1)
+-            c->h264_h_loop_filter_chroma = ff_h264_h_lpf_chroma_inter_msa;
+-        else
+-            c->h264_h_loop_filter_chroma =
+-                ff_h264_h_loop_filter_chroma422_msa;
+-
+-        if (chroma_format_idc > 1)
+-            c->h264_h_loop_filter_chroma_mbaff =
+-                ff_h264_h_loop_filter_chroma422_mbaff_msa;
+-
+-        c->h264_v_loop_filter_chroma_intra =
+-            ff_h264_v_lpf_chroma_intra_msa;
+-
+-        if (chroma_format_idc <= 1)
+-            c->h264_h_loop_filter_chroma_intra =
+-                ff_h264_h_lpf_chroma_intra_msa;
+-
+-        /* Weighted MC */
+-        c->weight_h264_pixels_tab[0] = ff_weight_h264_pixels16_8_msa;
+-        c->weight_h264_pixels_tab[1] = ff_weight_h264_pixels8_8_msa;
+-        c->weight_h264_pixels_tab[2] = ff_weight_h264_pixels4_8_msa;
+-
+-        c->biweight_h264_pixels_tab[0] = ff_biweight_h264_pixels16_8_msa;
+-        c->biweight_h264_pixels_tab[1] = ff_biweight_h264_pixels8_8_msa;
+-        c->biweight_h264_pixels_tab[2] = ff_biweight_h264_pixels4_8_msa;
+-
+-        c->h264_idct_add = ff_h264_idct_add_msa;
+-        c->h264_idct8_add = ff_h264_idct8_addblk_msa;
+-        c->h264_idct_dc_add = ff_h264_idct4x4_addblk_dc_msa;
+-        c->h264_idct8_dc_add = ff_h264_idct8_dc_addblk_msa;
+-        c->h264_idct_add16 = ff_h264_idct_add16_msa;
+-        c->h264_idct8_add4 = ff_h264_idct8_add4_msa;
+-
+-        if (chroma_format_idc <= 1)
+-            c->h264_idct_add8 = ff_h264_idct_add8_msa;
+-        else
+-            c->h264_idct_add8 = ff_h264_idct_add8_422_msa;
+-
+-        c->h264_idct_add16intra = ff_h264_idct_add16_intra_msa;
+-        c->h264_luma_dc_dequant_idct = ff_h264_deq_idct_luma_dc_msa;
+-    }  // if (8 == bit_depth)
+-}
+-#endif  // #if HAVE_MSA
++    int cpu_flags = av_get_cpu_flags();
+ 
+-#if HAVE_MMI
+-static av_cold void h264dsp_init_mmi(H264DSPContext * c, const int bit_depth,
+-        const int chroma_format_idc)
+-{
+-    if (bit_depth == 8) {
+-        c->h264_add_pixels4_clear = ff_h264_add_pixels4_8_mmi;
+-        c->h264_idct_add = ff_h264_idct_add_8_mmi;
+-        c->h264_idct8_add = ff_h264_idct8_add_8_mmi;
+-        c->h264_idct_dc_add = ff_h264_idct_dc_add_8_mmi;
+-        c->h264_idct8_dc_add = ff_h264_idct8_dc_add_8_mmi;
+-        c->h264_idct_add16 = ff_h264_idct_add16_8_mmi;
+-        c->h264_idct_add16intra = ff_h264_idct_add16intra_8_mmi;
+-        c->h264_idct8_add4 = ff_h264_idct8_add4_8_mmi;
+-
+-        if (chroma_format_idc <= 1)
+-            c->h264_idct_add8 = ff_h264_idct_add8_8_mmi;
+-        else
+-            c->h264_idct_add8 = ff_h264_idct_add8_422_8_mmi;
+-
+-        c->h264_luma_dc_dequant_idct = ff_h264_luma_dc_dequant_idct_8_mmi;
+-
+-        if (chroma_format_idc <= 1)
+-            c->h264_chroma_dc_dequant_idct =
+-                ff_h264_chroma_dc_dequant_idct_8_mmi;
+-        else
+-            c->h264_chroma_dc_dequant_idct =
+-                ff_h264_chroma422_dc_dequant_idct_8_mmi;
+-
+-        c->weight_h264_pixels_tab[0] = ff_h264_weight_pixels16_8_mmi;
+-        c->weight_h264_pixels_tab[1] = ff_h264_weight_pixels8_8_mmi;
+-        c->weight_h264_pixels_tab[2] = ff_h264_weight_pixels4_8_mmi;
+-
+-        c->biweight_h264_pixels_tab[0] = ff_h264_biweight_pixels16_8_mmi;
+-        c->biweight_h264_pixels_tab[1] = ff_h264_biweight_pixels8_8_mmi;
+-        c->biweight_h264_pixels_tab[2] = ff_h264_biweight_pixels4_8_mmi;
+-
+-        c->h264_v_loop_filter_chroma       = ff_deblock_v_chroma_8_mmi;
+-        c->h264_v_loop_filter_chroma_intra = ff_deblock_v_chroma_intra_8_mmi;
+-
+-        if (chroma_format_idc <= 1) {
+-            c->h264_h_loop_filter_chroma =
+-                ff_deblock_h_chroma_8_mmi;
+-            c->h264_h_loop_filter_chroma_intra =
+-                ff_deblock_h_chroma_intra_8_mmi;
++    if (have_mmi(cpu_flags)) {
++        if (bit_depth == 8) {
++            c->h264_add_pixels4_clear = ff_h264_add_pixels4_8_mmi;
++            c->h264_idct_add = ff_h264_idct_add_8_mmi;
++            c->h264_idct8_add = ff_h264_idct8_add_8_mmi;
++            c->h264_idct_dc_add = ff_h264_idct_dc_add_8_mmi;
++            c->h264_idct8_dc_add = ff_h264_idct8_dc_add_8_mmi;
++            c->h264_idct_add16 = ff_h264_idct_add16_8_mmi;
++            c->h264_idct_add16intra = ff_h264_idct_add16intra_8_mmi;
++            c->h264_idct8_add4 = ff_h264_idct8_add4_8_mmi;
++
++            if (chroma_format_idc <= 1)
++                c->h264_idct_add8 = ff_h264_idct_add8_8_mmi;
++            else
++                c->h264_idct_add8 = ff_h264_idct_add8_422_8_mmi;
++
++            c->h264_luma_dc_dequant_idct = ff_h264_luma_dc_dequant_idct_8_mmi;
++
++            if (chroma_format_idc <= 1)
++                c->h264_chroma_dc_dequant_idct =
++                    ff_h264_chroma_dc_dequant_idct_8_mmi;
++            else
++                c->h264_chroma_dc_dequant_idct =
++                    ff_h264_chroma422_dc_dequant_idct_8_mmi;
++
++            c->weight_h264_pixels_tab[0] = ff_h264_weight_pixels16_8_mmi;
++            c->weight_h264_pixels_tab[1] = ff_h264_weight_pixels8_8_mmi;
++            c->weight_h264_pixels_tab[2] = ff_h264_weight_pixels4_8_mmi;
++
++            c->biweight_h264_pixels_tab[0] = ff_h264_biweight_pixels16_8_mmi;
++            c->biweight_h264_pixels_tab[1] = ff_h264_biweight_pixels8_8_mmi;
++            c->biweight_h264_pixels_tab[2] = ff_h264_biweight_pixels4_8_mmi;
++
++            c->h264_v_loop_filter_chroma       = ff_deblock_v_chroma_8_mmi;
++            c->h264_v_loop_filter_chroma_intra = ff_deblock_v_chroma_intra_8_mmi;
++
++            if (chroma_format_idc <= 1) {
++                c->h264_h_loop_filter_chroma =
++                    ff_deblock_h_chroma_8_mmi;
++                c->h264_h_loop_filter_chroma_intra =
++                    ff_deblock_h_chroma_intra_8_mmi;
++            }
++
++            c->h264_v_loop_filter_luma = ff_deblock_v_luma_8_mmi;
++            c->h264_v_loop_filter_luma_intra = ff_deblock_v_luma_intra_8_mmi;
++            c->h264_h_loop_filter_luma = ff_deblock_h_luma_8_mmi;
++            c->h264_h_loop_filter_luma_intra = ff_deblock_h_luma_intra_8_mmi;
+         }
+-
+-        c->h264_v_loop_filter_luma = ff_deblock_v_luma_8_mmi;
+-        c->h264_v_loop_filter_luma_intra = ff_deblock_v_luma_intra_8_mmi;
+-        c->h264_h_loop_filter_luma = ff_deblock_h_luma_8_mmi;
+-        c->h264_h_loop_filter_luma_intra = ff_deblock_h_luma_intra_8_mmi;
+     }
+-}
+-#endif /* HAVE_MMI */
+ 
+-av_cold void ff_h264dsp_init_mips(H264DSPContext *c, const int bit_depth,
+-                                  const int chroma_format_idc)
+-{
+-#if HAVE_MSA
+-    h264dsp_init_msa(c, bit_depth, chroma_format_idc);
+-#endif  // #if HAVE_MSA
+-#if HAVE_MMI
+-    h264dsp_init_mmi(c, bit_depth, chroma_format_idc);
+-#endif /* HAVE_MMI */
++    if (have_msa(cpu_flags)) {
++        if (bit_depth == 8) {
++            c->h264_v_loop_filter_luma = ff_h264_v_lpf_luma_inter_msa;
++            c->h264_h_loop_filter_luma = ff_h264_h_lpf_luma_inter_msa;
++            c->h264_h_loop_filter_luma_mbaff =
++                ff_h264_h_loop_filter_luma_mbaff_msa;
++            c->h264_v_loop_filter_luma_intra = ff_h264_v_lpf_luma_intra_msa;
++            c->h264_h_loop_filter_luma_intra = ff_h264_h_lpf_luma_intra_msa;
++            c->h264_h_loop_filter_luma_mbaff_intra =
++                ff_h264_h_loop_filter_luma_mbaff_intra_msa;
++            c->h264_v_loop_filter_chroma = ff_h264_v_lpf_chroma_inter_msa;
++
++            if (chroma_format_idc <= 1)
++                c->h264_h_loop_filter_chroma = ff_h264_h_lpf_chroma_inter_msa;
++            else
++                c->h264_h_loop_filter_chroma =
++                    ff_h264_h_loop_filter_chroma422_msa;
++
++            if (chroma_format_idc > 1)
++                c->h264_h_loop_filter_chroma_mbaff =
++                    ff_h264_h_loop_filter_chroma422_mbaff_msa;
++
++            c->h264_v_loop_filter_chroma_intra =
++                ff_h264_v_lpf_chroma_intra_msa;
++
++            if (chroma_format_idc <= 1)
++                c->h264_h_loop_filter_chroma_intra =
++                    ff_h264_h_lpf_chroma_intra_msa;
++
++            /* Weighted MC */
++            c->weight_h264_pixels_tab[0] = ff_weight_h264_pixels16_8_msa;
++            c->weight_h264_pixels_tab[1] = ff_weight_h264_pixels8_8_msa;
++            c->weight_h264_pixels_tab[2] = ff_weight_h264_pixels4_8_msa;
++
++            c->biweight_h264_pixels_tab[0] = ff_biweight_h264_pixels16_8_msa;
++            c->biweight_h264_pixels_tab[1] = ff_biweight_h264_pixels8_8_msa;
++            c->biweight_h264_pixels_tab[2] = ff_biweight_h264_pixels4_8_msa;
++
++            c->h264_idct_add = ff_h264_idct_add_msa;
++            c->h264_idct8_add = ff_h264_idct8_addblk_msa;
++            c->h264_idct_dc_add = ff_h264_idct4x4_addblk_dc_msa;
++            c->h264_idct8_dc_add = ff_h264_idct8_dc_addblk_msa;
++            c->h264_idct_add16 = ff_h264_idct_add16_msa;
++            c->h264_idct8_add4 = ff_h264_idct8_add4_msa;
++
++            if (chroma_format_idc <= 1)
++                c->h264_idct_add8 = ff_h264_idct_add8_msa;
++            else
++                c->h264_idct_add8 = ff_h264_idct_add8_422_msa;
++
++            c->h264_idct_add16intra = ff_h264_idct_add16_intra_msa;
++            c->h264_luma_dc_dequant_idct = ff_h264_deq_idct_luma_dc_msa;
++        }
++    }
+ }
+diff -uNra ffmpeg-4.1.6/libavcodec/mips/h264dsp_mips.h FFmpeg/libavcodec/mips/h264dsp_mips.h
+--- a/libavcodec/mips/h264dsp_mips.h	2020-05-21 23:55:31.000000000 +0800
++++ b/libavcodec/mips/h264dsp_mips.h	2020-07-19 18:19:52.752365140 +0800
+@@ -357,23 +357,23 @@
+ 
+ void ff_deblock_v_chroma_8_mmi(uint8_t *pix, ptrdiff_t stride, int alpha, int beta,
+         int8_t *tc0);
+-void ff_deblock_v_chroma_intra_8_mmi(uint8_t *pix, int stride, int alpha,
++void ff_deblock_v_chroma_intra_8_mmi(uint8_t *pix, ptrdiff_t stride, int alpha,
+         int beta);
+-void ff_deblock_h_chroma_8_mmi(uint8_t *pix, int stride, int alpha, int beta,
++void ff_deblock_h_chroma_8_mmi(uint8_t *pix, ptrdiff_t stride, int alpha, int beta,
+         int8_t *tc0);
+-void ff_deblock_h_chroma_intra_8_mmi(uint8_t *pix, int stride, int alpha,
++void ff_deblock_h_chroma_intra_8_mmi(uint8_t *pix, ptrdiff_t stride, int alpha,
+         int beta);
+-void ff_deblock_v_luma_8_mmi(uint8_t *pix, int stride, int alpha, int beta,
++void ff_deblock_v_luma_8_mmi(uint8_t *pix, ptrdiff_t stride, int alpha, int beta,
+         int8_t *tc0);
+-void ff_deblock_v_luma_intra_8_mmi(uint8_t *pix, int stride, int alpha,
++void ff_deblock_v_luma_intra_8_mmi(uint8_t *pix, ptrdiff_t stride, int alpha,
+         int beta);
+-void ff_deblock_h_luma_8_mmi(uint8_t *pix, int stride, int alpha, int beta,
++void ff_deblock_h_luma_8_mmi(uint8_t *pix, ptrdiff_t stride, int alpha, int beta,
+         int8_t *tc0);
+-void ff_deblock_h_luma_intra_8_mmi(uint8_t *pix, int stride, int alpha,
++void ff_deblock_h_luma_intra_8_mmi(uint8_t *pix, ptrdiff_t stride, int alpha,
+         int beta);
+-void ff_deblock_v8_luma_8_mmi(uint8_t *pix, int stride, int alpha, int beta,
++void ff_deblock_v8_luma_8_mmi(uint8_t *pix, ptrdiff_t stride, int alpha, int beta,
+         int8_t *tc0);
+-void ff_deblock_v8_luma_intra_8_mmi(uint8_t *pix, int stride, int alpha,
++void ff_deblock_v8_luma_intra_8_mmi(uint8_t *pix, ptrdiff_t stride, int alpha,
+         int beta);
+ 
+ void ff_put_h264_qpel16_mc00_mmi(uint8_t *dst, const uint8_t *src,
+diff -uNra ffmpeg-4.1.6/libavcodec/mips/h264dsp_mmi.c FFmpeg/libavcodec/mips/h264dsp_mmi.c
+--- a/libavcodec/mips/h264dsp_mmi.c	2020-07-05 06:36:01.000000000 +0800
++++ b/libavcodec/mips/h264dsp_mmi.c	2020-07-19 18:19:52.756273550 +0800
+@@ -38,6 +38,9 @@
+         MMI_LDC1(%[ftmp2], %[src], 0x08)
+         MMI_LDC1(%[ftmp3], %[src], 0x10)
+         MMI_LDC1(%[ftmp4], %[src], 0x18)
++        /* memset(src, 0, 32); */
++        "gssqc1     %[ftmp0],   %[ftmp0],       0x00(%[src])            \n\t"
++        "gssqc1     %[ftmp0],   %[ftmp0],       0x10(%[src])            \n\t"
+         MMI_ULWC1(%[ftmp5], %[dst0], 0x00)
+         MMI_ULWC1(%[ftmp6], %[dst1], 0x00)
+         MMI_ULWC1(%[ftmp7], %[dst2], 0x00)
+@@ -58,11 +61,6 @@
+         MMI_SWC1(%[ftmp2], %[dst1], 0x00)
+         MMI_SWC1(%[ftmp3], %[dst2], 0x00)
+         MMI_SWC1(%[ftmp4], %[dst3], 0x00)
+-
+-        /* memset(src, 0, 32); */
+-        "xor        %[ftmp0],   %[ftmp0],       %[ftmp0]                \n\t"
+-        "gssqc1     %[ftmp0],   %[ftmp0],       0x00(%[src])            \n\t"
+-        "gssqc1     %[ftmp0],   %[ftmp0],       0x10(%[src])            \n\t"
+         : [ftmp0]"=&f"(ftmp[0]),            [ftmp1]"=&f"(ftmp[1]),
+           [ftmp2]"=&f"(ftmp[2]),            [ftmp3]"=&f"(ftmp[3]),
+           [ftmp4]"=&f"(ftmp[4]),            [ftmp5]"=&f"(ftmp[5]),
+@@ -85,15 +83,19 @@
+     DECLARE_VAR_ADDRT;
+ 
+     __asm__ volatile (
+-        "dli        %[tmp0],    0x01                                    \n\t"
+         MMI_LDC1(%[ftmp0], %[block], 0x00)
+-        "mtc1       %[tmp0],    %[ftmp8]                                \n\t"
+         MMI_LDC1(%[ftmp1], %[block], 0x08)
+-        "dli        %[tmp0],    0x06                                    \n\t"
+         MMI_LDC1(%[ftmp2], %[block], 0x10)
++        MMI_LDC1(%[ftmp3], %[block], 0x18)
++        /* memset(block, 0, 32) */
++        "xor        %[ftmp4],   %[ftmp4],       %[ftmp4]                \n\t"
++        "gssqc1     %[ftmp4],   %[ftmp4],       0x00(%[block])          \n\t"
++        "gssqc1     %[ftmp4],   %[ftmp4],       0x10(%[block])          \n\t"
++        "dli        %[tmp0],    0x01                                    \n\t"
++        "mtc1       %[tmp0],    %[ftmp8]                                \n\t"
++        "dli        %[tmp0],    0x06                                    \n\t"
+         "mtc1       %[tmp0],    %[ftmp9]                                \n\t"
+         "psrah      %[ftmp4],   %[ftmp1],       %[ftmp8]                \n\t"
+-        MMI_LDC1(%[ftmp3], %[block], 0x18)
+         "psrah      %[ftmp5],   %[ftmp3],       %[ftmp8]                \n\t"
+         "psubh      %[ftmp4],   %[ftmp4],       %[ftmp3]                \n\t"
+         "paddh      %[ftmp5],   %[ftmp5],       %[ftmp1]                \n\t"
+@@ -121,15 +123,11 @@
+         "paddh      %[ftmp10],  %[ftmp3],       %[ftmp1]                \n\t"
+         "psubh      %[ftmp1],   %[ftmp1],       %[ftmp3]                \n\t"
+         "paddh      %[ftmp11],  %[ftmp4],       %[ftmp5]                \n\t"
+-        "xor        %[ftmp7],   %[ftmp7],       %[ftmp7]                \n\t"
+         "psubh      %[ftmp5],   %[ftmp5],       %[ftmp4]                \n\t"
+-        MMI_SDC1(%[ftmp7], %[block], 0x00)
+-        MMI_SDC1(%[ftmp7], %[block], 0x08)
+-        MMI_SDC1(%[ftmp7], %[block], 0x10)
+-        MMI_SDC1(%[ftmp7], %[block], 0x18)
+         MMI_ULWC1(%[ftmp2], %[dst], 0x00)
+-        "psrah      %[ftmp3],   %[ftmp10],      %[ftmp9]                \n\t"
+         MMI_LWXC1(%[ftmp0], %[dst], %[stride], 0x00)
++        "xor        %[ftmp7],   %[ftmp7],       %[ftmp7]                \n\t"
++        "psrah      %[ftmp3],   %[ftmp10],      %[ftmp9]                \n\t"
+         "psrah      %[ftmp4],   %[ftmp11],      %[ftmp9]                \n\t"
+         "punpcklbh  %[ftmp2],   %[ftmp2],       %[ftmp7]                \n\t"
+         "punpcklbh  %[ftmp0],   %[ftmp0],       %[ftmp7]                \n\t"
+@@ -153,11 +151,6 @@
+         MMI_SWC1(%[ftmp2], %[dst], 0x00)
+         "packushb   %[ftmp0],   %[ftmp0],       %[ftmp7]                \n\t"
+         MMI_SWXC1(%[ftmp0], %[dst], %[stride], 0x00)
+-
+-        /* memset(block, 0, 32) */
+-        "xor        %[ftmp0],   %[ftmp0],       %[ftmp0]                \n\t"
+-        "gssqc1     %[ftmp0],   %[ftmp0],       0x00(%[block])          \n\t"
+-        "gssqc1     %[ftmp0],   %[ftmp0],       0x10(%[block])          \n\t"
+         : [ftmp0]"=&f"(ftmp[0]),            [ftmp1]"=&f"(ftmp[1]),
+           [ftmp2]"=&f"(ftmp[2]),            [ftmp3]"=&f"(ftmp[3]),
+           [ftmp4]"=&f"(ftmp[4]),            [ftmp5]"=&f"(ftmp[5]),
+@@ -184,7 +177,7 @@
+ 
+     __asm__ volatile (
+         "lhu        %[tmp0],    0x00(%[block])                          \n\t"
+-        PTR_ADDI   "$29,        $29,            -0x20                   \n\t"
++        PTR_ADDI   "$sp,        $sp,            -0x20                   \n\t"
+         PTR_ADDIU  "%[tmp0],    %[tmp0],        0x20                    \n\t"
+         MMI_LDC1(%[ftmp1], %[block], 0x10)
+         "sh         %[tmp0],    0x00(%[block])                          \n\t"
+@@ -261,8 +254,8 @@
+         "punpckhwd  %[ftmp3],   %[ftmp6],       %[ftmp0]                \n\t"
+         "punpcklwd  %[ftmp6],   %[ftmp6],       %[ftmp0]                \n\t"
+         MMI_LDC1(%[ftmp0], %[block], 0x00)
+-        MMI_SDC1(%[ftmp7], $29, 0x00)
+-        MMI_SDC1(%[ftmp1], $29, 0x10)
++        MMI_SDC1(%[ftmp7], $sp, 0x00)
++        MMI_SDC1(%[ftmp1], $sp, 0x10)
+         "dmfc1      %[tmp1],    %[ftmp6]                                \n\t"
+         "dmfc1      %[tmp3],    %[ftmp3]                                \n\t"
+         "punpckhhw  %[ftmp3],   %[ftmp5],       %[ftmp2]                \n\t"
+@@ -273,8 +266,8 @@
+         "punpcklwd  %[ftmp5],   %[ftmp5],       %[ftmp4]                \n\t"
+         "punpckhwd  %[ftmp4],   %[ftmp3],       %[ftmp2]                \n\t"
+         "punpcklwd  %[ftmp3],   %[ftmp3],       %[ftmp2]                \n\t"
+-        MMI_SDC1(%[ftmp5], $29, 0x08)
+-        MMI_SDC1(%[ftmp0], $29, 0x18)
++        MMI_SDC1(%[ftmp5], $sp, 0x08)
++        MMI_SDC1(%[ftmp0], $sp, 0x18)
+         "dmfc1      %[tmp2],    %[ftmp3]                                \n\t"
+         "dmfc1      %[tmp4],    %[ftmp4]                                \n\t"
+         MMI_LDC1(%[ftmp1], %[block], 0x18)
+@@ -366,7 +359,7 @@
+         PTR_ADDIU  "%[addr0],   %[dst],         0x04                    \n\t"
+         "mov.d      %[ftmp7],   %[ftmp10]                               \n\t"
+         "dmtc1      %[tmp3],    %[ftmp6]                                \n\t"
+-        MMI_LDC1(%[ftmp1], $29, 0x10)
++        MMI_LDC1(%[ftmp1], $sp, 0x10)
+         "dmtc1      %[tmp1],    %[ftmp3]                                \n\t"
+         "mov.d      %[ftmp4],   %[ftmp1]                                \n\t"
+         "psrah      %[ftmp1],   %[ftmp1],       %[ftmp8]                \n\t"
+@@ -399,7 +392,7 @@
+         "psrah      %[ftmp0],   %[ftmp3],       %[ftmp8]                \n\t"
+         "paddh      %[ftmp2],   %[ftmp2],       %[ftmp3]                \n\t"
+         "psubh      %[ftmp0],   %[ftmp0],       %[ftmp7]                \n\t"
+-        MMI_LDC1(%[ftmp3], $29, 0x00)
++        MMI_LDC1(%[ftmp3], $sp, 0x00)
+         "dmtc1      %[tmp5],    %[ftmp7]                                \n\t"
+         "paddh      %[ftmp7],   %[ftmp7],       %[ftmp3]                \n\t"
+         "paddh      %[ftmp3],   %[ftmp3],       %[ftmp3]                \n\t"
+@@ -421,9 +414,9 @@
+         "paddh      %[ftmp1],   %[ftmp1],       %[ftmp7]                \n\t"
+         "psubh      %[ftmp3],   %[ftmp3],       %[ftmp6]                \n\t"
+         "paddh      %[ftmp7],   %[ftmp7],       %[ftmp7]                \n\t"
+-        MMI_SDC1(%[ftmp3], $29, 0x00)
++        MMI_SDC1(%[ftmp3], $sp, 0x00)
+         "psubh      %[ftmp7],   %[ftmp7],       %[ftmp1]                \n\t"
+-        MMI_SDC1(%[ftmp0], $29, 0x10)
++        MMI_SDC1(%[ftmp0], $sp, 0x10)
+         "dmfc1      %[tmp1],    %[ftmp2]                                \n\t"
+         "xor        %[ftmp2],   %[ftmp2],       %[ftmp2]                \n\t"
+         MMI_SDC1(%[ftmp2], %[block], 0x00)
+@@ -470,8 +463,8 @@
+         "packushb   %[ftmp0],   %[ftmp0],       %[ftmp2]                \n\t"
+         MMI_SWC1(%[ftmp3], %[dst], 0x00)
+         MMI_SWXC1(%[ftmp0], %[dst], %[stride], 0x00)
+-        MMI_LDC1(%[ftmp5], $29, 0x00)
+-        MMI_LDC1(%[ftmp4], $29, 0x10)
++        MMI_LDC1(%[ftmp5], $sp, 0x00)
++        MMI_LDC1(%[ftmp4], $sp, 0x10)
+         "dmtc1      %[tmp1],    %[ftmp6]                                \n\t"
+         PTR_ADDU   "%[dst],     %[dst],         %[stride]               \n\t"
+         PTR_ADDU   "%[dst],     %[dst],         %[stride]               \n\t"
+@@ -503,7 +496,7 @@
+         MMI_SWXC1(%[ftmp0], %[dst], %[stride], 0x00)
+         "dmtc1      %[tmp4],    %[ftmp1]                                \n\t"
+         "dmtc1      %[tmp2],    %[ftmp6]                                \n\t"
+-        MMI_LDC1(%[ftmp4], $29, 0x18)
++        MMI_LDC1(%[ftmp4], $sp, 0x18)
+         "mov.d      %[ftmp5],   %[ftmp4]                                \n\t"
+         "psrah      %[ftmp4],   %[ftmp4],       %[ftmp8]                \n\t"
+         "psrah      %[ftmp7],   %[ftmp11],      %[ftmp8]                \n\t"
+@@ -535,7 +528,7 @@
+         "psrah      %[ftmp7],   %[ftmp6],       %[ftmp8]                \n\t"
+         "paddh      %[ftmp0],   %[ftmp0],       %[ftmp6]                \n\t"
+         "psubh      %[ftmp7],   %[ftmp7],       %[ftmp3]                \n\t"
+-        MMI_LDC1(%[ftmp6], $29, 0x08)
++        MMI_LDC1(%[ftmp6], $sp, 0x08)
+         "dmtc1      %[tmp6],    %[ftmp3]                                \n\t"
+         "paddh      %[ftmp3],   %[ftmp3],       %[ftmp6]                \n\t"
+         "paddh      %[ftmp6],   %[ftmp6],       %[ftmp6]                \n\t"
+@@ -557,9 +550,9 @@
+         "paddh      %[ftmp4],   %[ftmp4],       %[ftmp3]                \n\t"
+         "psubh      %[ftmp6],   %[ftmp6],       %[ftmp1]                \n\t"
+         "paddh      %[ftmp3],   %[ftmp3],       %[ftmp3]                \n\t"
+-        MMI_SDC1(%[ftmp6], $29, 0x08)
++        MMI_SDC1(%[ftmp6], $sp, 0x08)
+         "psubh      %[ftmp3],   %[ftmp3],       %[ftmp4]                \n\t"
+-        MMI_SDC1(%[ftmp7], $29, 0x18)
++        MMI_SDC1(%[ftmp7], $sp, 0x18)
+         "dmfc1      %[tmp2],    %[ftmp0]                                \n\t"
+         "xor        %[ftmp0],   %[ftmp0],       %[ftmp0]                \n\t"
+         MMI_ULWC1(%[ftmp6], %[addr0], 0x00)
+@@ -588,8 +581,8 @@
+         "packushb   %[ftmp7],   %[ftmp7],       %[ftmp0]                \n\t"
+         MMI_SWC1(%[ftmp6], %[addr0], 0x00)
+         MMI_SWXC1(%[ftmp7], %[addr0], %[stride], 0x00)
+-        MMI_LDC1(%[ftmp2], $29, 0x08)
+-        MMI_LDC1(%[ftmp5], $29, 0x18)
++        MMI_LDC1(%[ftmp2], $sp, 0x08)
++        MMI_LDC1(%[ftmp5], $sp, 0x18)
+         PTR_ADDU   "%[addr0],   %[addr0],       %[stride]               \n\t"
+         "dmtc1      %[tmp2],    %[ftmp1]                                \n\t"
+         PTR_ADDU   "%[addr0],   %[addr0],       %[stride]               \n\t"
+@@ -619,18 +612,7 @@
+         "packushb   %[ftmp7],   %[ftmp7],       %[ftmp0]                \n\t"
+         MMI_SWC1(%[ftmp6], %[addr0], 0x00)
+         MMI_SWXC1(%[ftmp7], %[addr0], %[stride], 0x00)
+-        PTR_ADDIU  "$29,        $29,            0x20                    \n\t"
+-
+-        /* memset(block, 0, 128) */
+-        "xor        %[ftmp0],   %[ftmp0],       %[ftmp0]                \n\t"
+-        "gssqc1     %[ftmp0],   %[ftmp0],       0x00(%[block])          \n\t"
+-        "gssqc1     %[ftmp0],   %[ftmp0],       0x10(%[block])          \n\t"
+-        "gssqc1     %[ftmp0],   %[ftmp0],       0x20(%[block])          \n\t"
+-        "gssqc1     %[ftmp0],   %[ftmp0],       0x30(%[block])          \n\t"
+-        "gssqc1     %[ftmp0],   %[ftmp0],       0x40(%[block])          \n\t"
+-        "gssqc1     %[ftmp0],   %[ftmp0],       0x50(%[block])          \n\t"
+-        "gssqc1     %[ftmp0],   %[ftmp0],       0x60(%[block])          \n\t"
+-        "gssqc1     %[ftmp0],   %[ftmp0],       0x70(%[block])          \n\t"
++        PTR_ADDIU  "$sp,        $sp,            0x20                    \n\t"
+         : [ftmp0]"=&f"(ftmp[0]),            [ftmp1]"=&f"(ftmp[1]),
+           [ftmp2]"=&f"(ftmp[2]),            [ftmp3]"=&f"(ftmp[3]),
+           [ftmp4]"=&f"(ftmp[4]),            [ftmp5]"=&f"(ftmp[5]),
+@@ -648,7 +630,7 @@
+           [addr0]"=&r"(addr[0])
+         : [dst]"r"(dst),                    [block]"r"(block),
+           [stride]"r"((mips_reg)stride)
+-        : "$29","memory"
++        : "memory"
+     );
+ 
+ }
+@@ -1451,7 +1433,7 @@
+     }
+ }
+ 
+-void ff_deblock_v8_luma_8_mmi(uint8_t *pix, int stride, int alpha, int beta,
++void ff_deblock_v8_luma_8_mmi(uint8_t *pix, ptrdiff_t stride, int alpha, int beta,
+         int8_t *tc0)
+ {
+     double ftmp[12];
+@@ -1579,7 +1561,7 @@
+     );
+ }
+ 
+-static void deblock_v8_luma_intra_8_mmi(uint8_t *pix, int stride, int alpha,
++static void deblock_v8_luma_intra_8_mmi(uint8_t *pix, ptrdiff_t stride, int alpha,
+         int beta)
+ {
+     DECLARE_ALIGNED(8, const uint64_t, stack[0x0a]);
+@@ -1889,7 +1871,7 @@
+     );
+ }
+ 
+-void ff_deblock_v_chroma_intra_8_mmi(uint8_t *pix, int stride, int alpha,
++void ff_deblock_v_chroma_intra_8_mmi(uint8_t *pix, ptrdiff_t stride, int alpha,
+         int beta)
+ {
+     double ftmp[9];
+@@ -1967,7 +1949,7 @@
+     );
+ }
+ 
+-void ff_deblock_h_chroma_8_mmi(uint8_t *pix, int stride, int alpha, int beta,
++void ff_deblock_h_chroma_8_mmi(uint8_t *pix, ptrdiff_t stride, int alpha, int beta,
+         int8_t *tc0)
+ {
+     double ftmp[11];
+@@ -2107,7 +2089,7 @@
+     );
+ }
+ 
+-void ff_deblock_h_chroma_intra_8_mmi(uint8_t *pix, int stride, int alpha,
++void ff_deblock_h_chroma_intra_8_mmi(uint8_t *pix, ptrdiff_t stride, int alpha,
+         int beta)
+ {
+     double ftmp[11];
+@@ -2240,7 +2222,7 @@
+     );
+ }
+ 
+-void ff_deblock_v_luma_8_mmi(uint8_t *pix, int stride, int alpha, int beta,
++void ff_deblock_v_luma_8_mmi(uint8_t *pix, ptrdiff_t stride, int alpha, int beta,
+         int8_t *tc0)
+ {
+     if ((tc0[0] & tc0[1]) >= 0)
+@@ -2249,14 +2231,14 @@
+         ff_deblock_v8_luma_8_mmi(pix + 8, stride, alpha, beta, tc0 + 2);
+ }
+ 
+-void ff_deblock_v_luma_intra_8_mmi(uint8_t *pix, int stride, int alpha,
++void ff_deblock_v_luma_intra_8_mmi(uint8_t *pix, ptrdiff_t stride, int alpha,
+         int beta)
+ {
+     deblock_v8_luma_intra_8_mmi(pix + 0, stride, alpha, beta);
+     deblock_v8_luma_intra_8_mmi(pix + 8, stride, alpha, beta);
+ }
+ 
+-void ff_deblock_h_luma_8_mmi(uint8_t *pix, int stride, int alpha, int beta,
++void ff_deblock_h_luma_8_mmi(uint8_t *pix, ptrdiff_t stride, int alpha, int beta,
+         int8_t *tc0)
+ {
+     DECLARE_ALIGNED(8, const uint64_t, stack[0x0d]);
+@@ -2475,7 +2457,7 @@
+     );
+ }
+ 
+-void ff_deblock_h_luma_intra_8_mmi(uint8_t *pix, int stride, int alpha,
++void ff_deblock_h_luma_intra_8_mmi(uint8_t *pix, ptrdiff_t stride, int alpha,
+         int beta)
+ {
+     DECLARE_ALIGNED(8, const uint64_t, ptmp[0x11]);
+diff -uNra ffmpeg-4.1.6/libavcodec/mips/h264dsp_msa.c FFmpeg/libavcodec/mips/h264dsp_msa.c
+--- a/libavcodec/mips/h264dsp_msa.c	2020-07-03 23:10:59.000000000 +0800
++++ b/libavcodec/mips/h264dsp_msa.c	2020-07-19 18:13:57.454484420 +0800
+@@ -45,7 +45,7 @@
+     tmp0 = __msa_srlr_h(tmp0, denom);
+     tmp0 = (v8i16) __msa_sat_u_h((v8u16) tmp0, 7);
+     src0 = (v16u8) __msa_pckev_b((v16i8) tmp0, (v16i8) tmp0);
+-    ST4x2_UB(src0, data, stride);
++    ST_W2(src0, 0, 1, data, stride);
+ }
+ 
+ static void avc_wgt_4x4_msa(uint8_t *data, int32_t stride, int32_t log2_denom,
+@@ -71,7 +71,7 @@
+     tmp1 = __msa_srlr_h(tmp1, denom);
+     SAT_UH2_SH(tmp0, tmp1, 7);
+     src0 = (v16u8) __msa_pckev_b((v16i8) tmp1, (v16i8) tmp0);
+-    ST4x4_UB(src0, src0, 0, 1, 2, 3, data, stride);
++    ST_W4(src0, 0, 1, 2, 3, data, stride);
+ }
+ 
+ static void avc_wgt_4x8_msa(uint8_t *data, int32_t stride, int32_t log2_denom,
+@@ -102,7 +102,7 @@
+     SRLR_H4_SH(tmp0, tmp1, tmp2, tmp3, denom);
+     SAT_UH4_SH(tmp0, tmp1, tmp2, tmp3, 7);
+     PCKEV_B2_UB(tmp1, tmp0, tmp3, tmp2, src0, src1);
+-    ST4x8_UB(src0, src1, data, stride);
++    ST_W8(src0, src1, 0, 1, 2, 3, 0, 1, 2, 3, data, stride);
+ }
+ 
+ static void avc_wgt_8x4_msa(uint8_t *data, int32_t stride, int32_t log2_denom,
+@@ -133,7 +133,7 @@
+     SRLR_H4_SH(tmp0, tmp1, tmp2, tmp3, denom);
+     SAT_UH4_SH(tmp0, tmp1, tmp2, tmp3, 7);
+     PCKEV_B2_UB(tmp1, tmp0, tmp3, tmp2, src0, src1);
+-    ST8x4_UB(src0, src1, data, stride);
++    ST_D4(src0, src1, 0, 1, 0, 1, data, stride);
+ }
+ 
+ static void avc_wgt_8x8_msa(uint8_t *data, int32_t stride, int32_t log2_denom,
+@@ -175,7 +175,7 @@
+     SAT_UH8_SH(tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, 7);
+     PCKEV_B4_UB(tmp1, tmp0, tmp3, tmp2, tmp5, tmp4, tmp7, tmp6, src0, src1,
+                 src2, src3);
+-    ST8x8_UB(src0, src1, src2, src3, data, stride);
++    ST_D8(src0, src1, src2, src3, 0, 1, 0, 1, 0, 1, 0, 1, data, stride);
+ }
+ 
+ static void avc_wgt_8x16_msa(uint8_t *data, int32_t stride, int32_t log2_denom,
+@@ -218,7 +218,7 @@
+         SAT_UH8_SH(tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, 7);
+         PCKEV_B4_UB(tmp1, tmp0, tmp3, tmp2, tmp5, tmp4, tmp7, tmp6, src0, src1,
+                     src2, src3);
+-        ST8x8_UB(src0, src1, src2, src3, data, stride);
++        ST_D8(src0, src1, src2, src3, 0, 1, 0, 1, 0, 1, 0, 1, data, stride);
+         data += 8 * stride;
+     }
+ }
+@@ -253,7 +253,7 @@
+     tmp0 = __msa_maxi_s_h(tmp0, 0);
+     tmp0 = __msa_min_s_h(max255, tmp0);
+     dst0 = (v16u8) __msa_pckev_b((v16i8) tmp0, (v16i8) tmp0);
+-    ST4x2_UB(dst0, dst, stride);
++    ST_W2(dst0, 0, 1, dst, stride);
+ }
+ 
+ static void avc_biwgt_4x4_msa(uint8_t *src, uint8_t *dst, int32_t stride,
+@@ -287,7 +287,7 @@
+     tmp1 >>= denom;
+     CLIP_SH2_0_255(tmp0, tmp1);
+     dst0 = (v16u8) __msa_pckev_b((v16i8) tmp1, (v16i8) tmp0);
+-    ST4x4_UB(dst0, dst0, 0, 1, 2, 3, dst, stride);
++    ST_W4(dst0, 0, 1, 2, 3, dst, stride);
+ }
+ 
+ static void avc_biwgt_4x8_msa(uint8_t *src, uint8_t *dst, int32_t stride,
+@@ -327,7 +327,7 @@
+     SRA_4V(tmp0, tmp1, tmp2, tmp3, denom);
+     CLIP_SH4_0_255(tmp0, tmp1, tmp2, tmp3);
+     PCKEV_B2_UB(tmp1, tmp0, tmp3, tmp2, dst0, dst1);
+-    ST4x8_UB(dst0, dst1, dst, stride);
++    ST_W8(dst0, dst1, 0, 1, 2, 3, 0, 1, 2, 3, dst, stride);
+ }
+ 
+ static void avc_biwgt_8x4_msa(uint8_t *src, uint8_t *dst, int32_t stride,
+@@ -365,7 +365,7 @@
+     SRA_4V(tmp0, tmp1, tmp2, tmp3, denom);
+     CLIP_SH4_0_255(tmp0, tmp1, tmp2, tmp3);
+     PCKEV_B2_UB(tmp1, tmp0, tmp3, tmp2, dst0, dst1);
+-    ST8x4_UB(dst0, dst1, dst, stride);
++    ST_D4(dst0, dst1, 0, 1, 0, 1, dst, stride);
+ }
+ 
+ static void avc_biwgt_8x8_msa(uint8_t *src, uint8_t *dst, int32_t stride,
+@@ -413,11 +413,10 @@
+     tmp7 = __msa_dpadd_s_h(offset, wgt, vec7);
+     SRA_4V(tmp0, tmp1, tmp2, tmp3, denom);
+     SRA_4V(tmp4, tmp5, tmp6, tmp7, denom);
+-    CLIP_SH4_0_255(tmp0, tmp1, tmp2, tmp3);
+-    CLIP_SH4_0_255(tmp4, tmp5, tmp6, tmp7);
++    CLIP_SH8_0_255(tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7);
+     PCKEV_B2_UB(tmp1, tmp0, tmp3, tmp2, dst0, dst1);
+     PCKEV_B2_UB(tmp5, tmp4, tmp7, tmp6, dst2, dst3);
+-    ST8x8_UB(dst0, dst1, dst2, dst3, dst, stride);
++    ST_D8(dst0, dst1, dst2, dst3, 0, 1, 0, 1, 0, 1, 0, 1, dst, stride);
+ }
+ 
+ static void avc_biwgt_8x16_msa(uint8_t *src, uint8_t *dst, int32_t stride,
+@@ -475,11 +474,10 @@
+ 
+         SRA_4V(temp0, temp1, temp2, temp3, denom);
+         SRA_4V(temp4, temp5, temp6, temp7, denom);
+-        CLIP_SH4_0_255(temp0, temp1, temp2, temp3);
+-        CLIP_SH4_0_255(temp4, temp5, temp6, temp7);
++        CLIP_SH8_0_255(temp0, temp1, temp2, temp3, temp4, temp5, temp6, temp7);
+         PCKEV_B4_UB(temp1, temp0, temp3, temp2, temp5, temp4, temp7, temp6,
+                     dst0, dst1, dst2, dst3);
+-        ST8x8_UB(dst0, dst1, dst2, dst3, dst, stride);
++        ST_D8(dst0, dst1, dst2, dst3, 0, 1, 0, 1, 0, 1, 0, 1, dst, stride);
+         dst += 8 * stride;
+     }
+ }
+@@ -531,7 +529,7 @@
+     temp = p1_or_q1_org_in << 1;                              \
+     clip3 = clip3 - temp;                                     \
+     clip3 = __msa_ave_s_h(p2_or_q2_org_in, clip3);            \
+-    clip3 = CLIP_SH(clip3, negate_tc_in, tc_in);              \
++    CLIP_SH(clip3, negate_tc_in, tc_in);                      \
+     p1_or_q1_out = p1_or_q1_org_in + clip3;                   \
+ }
+ 
+@@ -549,7 +547,7 @@
+     delta = q0_sub_p0 + p1_sub_q1;                              \
+     delta >>= 3;                                                \
+                                                                 \
+-    delta = CLIP_SH(delta, negate_threshold_in, threshold_in);  \
++    CLIP_SH(delta, negate_threshold_in, threshold_in);          \
+                                                                 \
+     p0_or_q0_out = p0_or_q0_org_in + delta;                     \
+     q0_or_p0_out = q0_or_p0_org_in - delta;                     \
+@@ -598,7 +596,7 @@
+     delta = q0_sub_p0 + p1_sub_q1;                                       \
+     delta = __msa_srari_h(delta, 3);                                     \
+                                                                          \
+-    delta = CLIP_SH(delta, -tc, tc);                                     \
++    CLIP_SH(delta, -tc, tc);                                             \
+                                                                          \
+     ILVR_B2_SH(zeros, src1, zeros, src2, res0_r, res1_r);                \
+                                                                          \
+@@ -620,7 +618,7 @@
+                                                              \
+     out0 = (v16u8) __msa_ilvr_b((v16i8) in1, (v16i8) in0);   \
+     out1 = (v16u8) __msa_sldi_b(zero_m, (v16i8) out0, 2);    \
+-    SLDI_B2_0_UB(out1, out2, out2, out3, 2);                 \
++    SLDI_B2_UB(zero_m, out1, zero_m, out2, 2, out2, out3);   \
+ }
+ 
+ #define AVC_LPF_H_2BYTE_CHROMA_422(src, stride, tc_val, alpha, beta, res)  \
+@@ -662,7 +660,7 @@
+     q0_sub_p0 <<= 2;                                                       \
+     delta = q0_sub_p0 + p1_sub_q1;                                         \
+     delta = __msa_srari_h(delta, 3);                                       \
+-    delta = CLIP_SH(delta, -tc, tc);                                       \
++    CLIP_SH(delta, -tc, tc);                                               \
+                                                                            \
+     ILVR_B2_SH(zeros, src1, zeros, src2, res0_r, res1_r);                  \
+                                                                            \
+@@ -955,18 +953,18 @@
+         ILVRL_H2_SH(tp3, tp2, tmp6, tmp7);
+ 
+         src = data - 3;
+-        ST4x4_UB(tmp3, tmp3, 0, 1, 2, 3, src, img_width);
+-        ST2x4_UB(tmp2, 0, src + 4, img_width);
++        ST_W4(tmp3, 0, 1, 2, 3, src, img_width);
++        ST_H4(tmp2, 0, 1, 2, 3, src + 4, img_width);
+         src += 4 * img_width;
+-        ST4x4_UB(tmp4, tmp4, 0, 1, 2, 3, src, img_width);
+-        ST2x4_UB(tmp2, 4, src + 4, img_width);
++        ST_W4(tmp4, 0, 1, 2, 3, src, img_width);
++        ST_H4(tmp2, 4, 5, 6, 7, src + 4, img_width);
+         src += 4 * img_width;
+ 
+-        ST4x4_UB(tmp6, tmp6, 0, 1, 2, 3, src, img_width);
+-        ST2x4_UB(tmp5, 0, src + 4, img_width);
++        ST_W4(tmp6, 0, 1, 2, 3, src, img_width);
++        ST_H4(tmp5, 0, 1, 2, 3, src + 4, img_width);
+         src += 4 * img_width;
+-        ST4x4_UB(tmp7, tmp7, 0, 1, 2, 3, src, img_width);
+-        ST2x4_UB(tmp5, 4, src + 4, img_width);
++        ST_W4(tmp7, 0, 1, 2, 3, src, img_width);
++        ST_H4(tmp5, 4, 5, 6, 7, src + 4, img_width);
+     }
+     }
+ }
+@@ -1025,7 +1023,8 @@
+ 
+     ILVR_W2_SB(tmp2, tmp0, tmp3, tmp1, src6, src3);
+     ILVL_W2_SB(tmp2, tmp0, tmp3, tmp1, src1, src5);
+-    SLDI_B4_0_SB(src6, src1, src3, src5, src0, src2, src4, src7, 8);
++    SLDI_B4_SB(zeros, src6, zeros, src1, zeros, src3, zeros, src5,
++               8, src0, src2, src4, src7);
+ 
+     p0_asub_q0 = __msa_asub_u_b((v16u8) src2, (v16u8) src3);
+     p1_asub_p0 = __msa_asub_u_b((v16u8) src1, (v16u8) src2);
+@@ -1116,10 +1115,10 @@
+     ILVRL_H2_SH(zeros, dst2_x, tmp2, tmp3);
+ 
+     ILVR_W2_UB(tmp2, tmp0, tmp3, tmp1, dst0, dst4);
+-    SLDI_B2_0_UB(dst0, dst4, dst1, dst5, 8);
++    SLDI_B2_UB(zeros, dst0, zeros, dst4, 8, dst1, dst5);
+     dst2_x = (v16u8) __msa_ilvl_w((v4i32) tmp2, (v4i32) tmp0);
+     dst2_y = (v16u8) __msa_ilvl_w((v4i32) tmp3, (v4i32) tmp1);
+-    SLDI_B2_0_UB(dst2_x, dst2_y, dst3_x, dst3_y, 8);
++    SLDI_B2_UB(zeros, dst2_x, zeros, dst2_y, 8, dst3_x, dst3_y);
+ 
+     out0 = __msa_copy_u_w((v4i32) dst0, 0);
+     out1 = __msa_copy_u_h((v8i16) dst0, 2);
+@@ -1274,9 +1273,9 @@
+         tmp1 = (v8i16) __msa_ilvr_b((v16i8) q0_or_p0_org, (v16i8) p0_or_q0_org);
+ 
+         data_cb_or_cr -= 1;
+-        ST2x4_UB(tmp1, 0, data_cb_or_cr, img_width);
++        ST_H4(tmp1, 0, 1, 2, 3, data_cb_or_cr, img_width);
+         data_cb_or_cr += 4 * img_width;
+-        ST2x4_UB(tmp1, 4, data_cb_or_cr, img_width);
++        ST_H4(tmp1, 4, 5, 6, 7, data_cb_or_cr, img_width);
+     }
+ }
+ 
+@@ -1741,7 +1740,7 @@
+     v8i16 tc, tc_orig_r, tc_plus1;
+     v16u8 is_tc_orig1, is_tc_orig2, tc_orig = { 0 };
+     v8i16 p0_ilvr_q0, p0_add_q0, q0_sub_p0, p1_sub_q1;
+-    v8u16 src2_r, src3_r;
++    v8i16 src2_r, src3_r;
+     v8i16 p2_r, p1_r, q2_r, q1_r;
+     v16u8 p2, q2, p0, q0;
+     v4i32 dst0, dst1;
+@@ -1839,8 +1838,8 @@
+     tc_orig_r = (v8i16) __msa_ilvr_b(zeros, (v16i8) tc_orig);
+     tc = tc_orig_r;
+ 
+-    p2_r = CLIP_SH(p2_r, -tc_orig_r, tc_orig_r);
+-    q2_r = CLIP_SH(q2_r, -tc_orig_r, tc_orig_r);
++    CLIP_SH(p2_r, -tc_orig_r, tc_orig_r);
++    CLIP_SH(q2_r, -tc_orig_r, tc_orig_r);
+ 
+     p2_r += p1_r;
+     q2_r += q1_r;
+@@ -1872,14 +1871,13 @@
+                                               (v16i8) is_less_than_beta2);
+     tc = (v8i16) __msa_bmnz_v((v16u8) tc, (v16u8) tc_plus1, is_less_than_beta2);
+ 
+-    q0_sub_p0 = CLIP_SH(q0_sub_p0, -tc, tc);
++    CLIP_SH(q0_sub_p0, -tc, tc);
+ 
+-    ILVR_B2_UH(zeros, src2, zeros, src3, src2_r, src3_r);
++    ILVR_B2_SH(zeros, src2, zeros, src3, src2_r, src3_r);
+     src2_r += q0_sub_p0;
+     src3_r -= q0_sub_p0;
+ 
+-    src2_r = (v8u16) CLIP_SH_0_255(src2_r);
+-    src3_r = (v8u16) CLIP_SH_0_255(src3_r);
++    CLIP_SH2_0_255(src2_r, src3_r);
+ 
+     PCKEV_B2_UB(src2_r, src2_r, src3_r, src3_r, p0, q0);
+ 
+@@ -2110,9 +2108,9 @@
+             q0_org = __msa_bmnz_v(q0_org, q0, is_less_than);
+             tmp1 = (v8i16) __msa_ilvr_b((v16i8) q0_org, (v16i8) p0_org);
+             src = data - 1;
+-            ST2x4_UB(tmp1, 0, src, img_width);
++            ST_H4(tmp1, 0, 1, 2, 3, src, img_width);
+             src += 4 * img_width;
+-            ST2x4_UB(tmp1, 4, src, img_width);
++            ST_H4(tmp1, 4, 5, 6, 7, src, img_width);
+         }
+     }
+ }
+@@ -2136,7 +2134,7 @@
+         }
+ 
+         AVC_LPF_H_CHROMA_422(src, stride, tc_val, alpha, beta, res);
+-        ST2x4_UB(res, 0, (src - 1), stride);
++        ST_H4(res, 0, 1, 2, 3, (src - 1), stride);
+         src += (4 * stride);
+     }
+ }
+@@ -2509,10 +2507,8 @@
+     SRA_4V(tmp4, tmp5, tmp6, tmp7, denom);
+     SRA_4V(tmp8, tmp9, tmp10, tmp11, denom);
+     SRA_4V(tmp12, tmp13, tmp14, tmp15, denom);
+-    CLIP_SH4_0_255(tmp0, tmp1, tmp2, tmp3);
+-    CLIP_SH4_0_255(tmp4, tmp5, tmp6, tmp7);
+-    CLIP_SH4_0_255(tmp8, tmp9, tmp10, tmp11);
+-    CLIP_SH4_0_255(tmp12, tmp13, tmp14, tmp15);
++    CLIP_SH8_0_255(tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7);
++    CLIP_SH8_0_255(tmp8, tmp9, tmp10, tmp11, tmp12, tmp13, tmp14, tmp15);
+     PCKEV_B4_UB(tmp1, tmp0, tmp3, tmp2, tmp5, tmp4, tmp7, tmp6, dst0, dst1,
+                 dst2, dst3);
+     PCKEV_B4_UB(tmp9, tmp8, tmp11, tmp10, tmp13, tmp12, tmp15, tmp14, dst4,
+@@ -2553,10 +2549,8 @@
+         SRA_4V(tmp4, tmp5, tmp6, tmp7, denom);
+         SRA_4V(tmp8, tmp9, tmp10, tmp11, denom);
+         SRA_4V(tmp12, tmp13, tmp14, tmp15, denom);
+-        CLIP_SH4_0_255(tmp0, tmp1, tmp2, tmp3);
+-        CLIP_SH4_0_255(tmp4, tmp5, tmp6, tmp7);
+-        CLIP_SH4_0_255(tmp8, tmp9, tmp10, tmp11);
+-        CLIP_SH4_0_255(tmp12, tmp13, tmp14, tmp15);
++        CLIP_SH8_0_255(tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7);
++        CLIP_SH8_0_255(tmp8, tmp9, tmp10, tmp11, tmp12, tmp13, tmp14, tmp15);
+         PCKEV_B4_UB(tmp1, tmp0, tmp3, tmp2, tmp5, tmp4, tmp7, tmp6, dst0, dst1,
+                     dst2, dst3);
+         PCKEV_B4_UB(tmp9, tmp8, tmp11, tmp10, tmp13, tmp12, tmp15, tmp14, dst4,
+diff -uNra ffmpeg-4.1.6/libavcodec/mips/h264idct_msa.c FFmpeg/libavcodec/mips/h264idct_msa.c
+--- a/libavcodec/mips/h264idct_msa.c	2020-07-03 23:10:59.000000000 +0800
++++ b/libavcodec/mips/h264idct_msa.c	2020-07-19 18:13:57.454484420 +0800
+@@ -233,13 +233,10 @@
+          res0, res1, res2, res3);
+     ADD4(res4, tmp4, res5, tmp5, res6, tmp6, res7, tmp7,
+          res4, res5, res6, res7);
+-    CLIP_SH4_0_255(res0, res1, res2, res3);
+-    CLIP_SH4_0_255(res4, res5, res6, res7);
++    CLIP_SH8_0_255(res0, res1, res2, res3, res4, res5, res6, res7);
+     PCKEV_B4_SB(res1, res0, res3, res2, res5, res4, res7, res6,
+                 dst0, dst1, dst2, dst3);
+-    ST8x4_UB(dst0, dst1, dst, dst_stride);
+-    dst += (4 * dst_stride);
+-    ST8x4_UB(dst2, dst3, dst, dst_stride);
++    ST_D8(dst0, dst1, dst2, dst3, 0, 1, 0, 1, 0, 1, 0, 1, dst, dst_stride)
+ }
+ 
+ static void avc_idct8_dc_addblk_msa(uint8_t *dst, int16_t *src,
+@@ -265,13 +262,11 @@
+          dst0_r, dst1_r, dst2_r, dst3_r);
+     ADD4(dst4_r, dc, dst5_r, dc, dst6_r, dc, dst7_r, dc,
+          dst4_r, dst5_r, dst6_r, dst7_r);
+-    CLIP_SH4_0_255(dst0_r, dst1_r, dst2_r, dst3_r);
+-    CLIP_SH4_0_255(dst4_r, dst5_r, dst6_r, dst7_r);
++    CLIP_SH8_0_255(dst0_r, dst1_r, dst2_r, dst3_r,
++                   dst4_r, dst5_r, dst6_r, dst7_r);
+     PCKEV_B4_SB(dst1_r, dst0_r, dst3_r, dst2_r, dst5_r, dst4_r, dst7_r, dst6_r,
+                 dst0, dst1, dst2, dst3);
+-    ST8x4_UB(dst0, dst1, dst, dst_stride);
+-    dst += (4 * dst_stride);
+-    ST8x4_UB(dst2, dst3, dst, dst_stride);
++    ST_D8(dst0, dst1, dst2, dst3, 0, 1, 0, 1, 0, 1, 0, 1, dst, dst_stride)
+ }
+ 
+ void ff_h264_idct_add_msa(uint8_t *dst, int16_t *src, int32_t dst_stride)
+@@ -340,7 +335,7 @@
+     ADD2(pred_r, input_dc, pred_l, input_dc, pred_r, pred_l);
+     CLIP_SH2_0_255(pred_r, pred_l);
+     out = __msa_pckev_b((v16i8) pred_l, (v16i8) pred_r);
+-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
++    ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
+ }
+ 
+ void ff_h264_idct8_dc_addblk_msa(uint8_t *dst, int16_t *src,
+diff -uNra ffmpeg-4.1.6/libavcodec/mips/h264pred_init_mips.c FFmpeg/libavcodec/mips/h264pred_init_mips.c
+--- a/libavcodec/mips/h264pred_init_mips.c	2020-07-03 01:22:31.000000000 +0800
++++ b/libavcodec/mips/h264pred_init_mips.c	2020-07-19 18:19:52.760181959 +0800
+@@ -19,137 +19,121 @@
+  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+  */
+ 
++#include "libavutil/mips/cpu.h"
+ #include "config.h"
+ #include "h264dsp_mips.h"
+ #include "h264pred_mips.h"
+ 
+-#if HAVE_MSA
+-static av_cold void h264_pred_init_msa(H264PredContext *h, int codec_id,
+-                                       const int bit_depth,
+-                                       const int chroma_format_idc)
++av_cold void ff_h264_pred_init_mips(H264PredContext *h, int codec_id,
++                                    int bit_depth,
++                                    const int chroma_format_idc)
+ {
+-    if (8 == bit_depth) {
+-        if (chroma_format_idc == 1) {
+-            h->pred8x8[VERT_PRED8x8] = ff_h264_intra_pred_vert_8x8_msa;
+-            h->pred8x8[HOR_PRED8x8] = ff_h264_intra_pred_horiz_8x8_msa;
+-        }
++    int cpu_flags = av_get_cpu_flags();
+ 
+-        if (codec_id != AV_CODEC_ID_VP7 && codec_id != AV_CODEC_ID_VP8) {
++    if (have_mmi(cpu_flags)) {
++        if (bit_depth == 8) {
+             if (chroma_format_idc == 1) {
+-                h->pred8x8[PLANE_PRED8x8] = ff_h264_intra_predict_plane_8x8_msa;
++                h->pred8x8  [VERT_PRED8x8       ] = ff_pred8x8_vertical_8_mmi;
++                h->pred8x8  [HOR_PRED8x8        ] = ff_pred8x8_horizontal_8_mmi;
++            } else {
++                h->pred8x8  [VERT_PRED8x8       ] = ff_pred8x16_vertical_8_mmi;
++                h->pred8x8  [HOR_PRED8x8        ] = ff_pred8x16_horizontal_8_mmi;
+             }
+-        }
+-        if (codec_id != AV_CODEC_ID_RV40 && codec_id != AV_CODEC_ID_VP7
+-            && codec_id != AV_CODEC_ID_VP8) {
+-            if (chroma_format_idc == 1) {
+-                h->pred8x8[DC_PRED8x8] = ff_h264_intra_predict_dc_4blk_8x8_msa;
+-                h->pred8x8[LEFT_DC_PRED8x8] =
+-                    ff_h264_intra_predict_hor_dc_8x8_msa;
+-                h->pred8x8[TOP_DC_PRED8x8] =
+-                    ff_h264_intra_predict_vert_dc_8x8_msa;
+-                h->pred8x8[ALZHEIMER_DC_L0T_PRED8x8] =
+-                    ff_h264_intra_predict_mad_cow_dc_l0t_8x8_msa;
+-                h->pred8x8[ALZHEIMER_DC_0LT_PRED8x8] =
+-                    ff_h264_intra_predict_mad_cow_dc_0lt_8x8_msa;
+-                h->pred8x8[ALZHEIMER_DC_L00_PRED8x8] =
+-                    ff_h264_intra_predict_mad_cow_dc_l00_8x8_msa;
+-                h->pred8x8[ALZHEIMER_DC_0L0_PRED8x8] =
+-                    ff_h264_intra_predict_mad_cow_dc_0l0_8x8_msa;
+-            }
+-        } else {
+-            if (codec_id == AV_CODEC_ID_VP7 || codec_id == AV_CODEC_ID_VP8) {
+-                h->pred8x8[7] = ff_vp8_pred8x8_127_dc_8_msa;
+-                h->pred8x8[8] = ff_vp8_pred8x8_129_dc_8_msa;
+-            }
+-        }
+ 
+-        if (chroma_format_idc == 1) {
+-            h->pred8x8[DC_128_PRED8x8] = ff_h264_intra_pred_dc_128_8x8_msa;
+-        }
++            h->pred16x16[DC_PRED8x8             ] = ff_pred16x16_dc_8_mmi;
++            h->pred16x16[VERT_PRED8x8           ] = ff_pred16x16_vertical_8_mmi;
++            h->pred16x16[HOR_PRED8x8            ] = ff_pred16x16_horizontal_8_mmi;
++            // h->pred8x8l [TOP_DC_PRED            ] = ff_pred8x8l_top_dc_8_mmi; // FIXME: checkasm test failed
++            h->pred8x8l [DC_PRED                ] = ff_pred8x8l_dc_8_mmi;
++
++    #if ARCH_MIPS64
++            switch (codec_id) {
++            case AV_CODEC_ID_SVQ3:
++                h->pred16x16[PLANE_PRED8x8      ] = ff_pred16x16_plane_svq3_8_mmi;
++                break;
++            case AV_CODEC_ID_RV40:
++                h->pred16x16[PLANE_PRED8x8      ] = ff_pred16x16_plane_rv40_8_mmi;
++                break;
++            case AV_CODEC_ID_VP7:
++            case AV_CODEC_ID_VP8:
++                break;
++            default:
++                h->pred16x16[PLANE_PRED8x8      ] = ff_pred16x16_plane_h264_8_mmi;
++                break;
++            }
++    #endif
+ 
+-        h->pred16x16[DC_PRED8x8] = ff_h264_intra_pred_dc_16x16_msa;
+-        h->pred16x16[VERT_PRED8x8] = ff_h264_intra_pred_vert_16x16_msa;
+-        h->pred16x16[HOR_PRED8x8] = ff_h264_intra_pred_horiz_16x16_msa;
+-
+-        switch (codec_id) {
+-        case AV_CODEC_ID_SVQ3:
+-            ;
+-            break;
+-        case AV_CODEC_ID_RV40:
+-            ;
+-            break;
+-        case AV_CODEC_ID_VP7:
+-        case AV_CODEC_ID_VP8:
+-            h->pred16x16[7] = ff_vp8_pred16x16_127_dc_8_msa;
+-            h->pred16x16[8] = ff_vp8_pred16x16_129_dc_8_msa;
+-            break;
+-        default:
+-            h->pred16x16[PLANE_PRED8x8] =
+-                ff_h264_intra_predict_plane_16x16_msa;
+-            break;
++            if (codec_id == AV_CODEC_ID_SVQ3 || codec_id == AV_CODEC_ID_H264) {
++                if (chroma_format_idc == 1) {
++                    h->pred8x8[TOP_DC_PRED8x8   ] = ff_pred8x8_top_dc_8_mmi;
++                    h->pred8x8[DC_PRED8x8       ] = ff_pred8x8_dc_8_mmi;
++                }
++            }
+         }
+-
+-        h->pred16x16[LEFT_DC_PRED8x8] = ff_h264_intra_pred_dc_left_16x16_msa;
+-        h->pred16x16[TOP_DC_PRED8x8] = ff_h264_intra_pred_dc_top_16x16_msa;
+-        h->pred16x16[DC_128_PRED8x8] = ff_h264_intra_pred_dc_128_16x16_msa;
+     }
+-}
+-#endif  // #if HAVE_MSA
+ 
+-#if HAVE_MMI
+-static av_cold void h264_pred_init_mmi(H264PredContext *h, int codec_id,
+-        const int bit_depth, const int chroma_format_idc)
+-{
+-    if (bit_depth == 8) {
+-        if (chroma_format_idc == 1) {
+-            h->pred8x8  [VERT_PRED8x8       ] = ff_pred8x8_vertical_8_mmi;
+-            h->pred8x8  [HOR_PRED8x8        ] = ff_pred8x8_horizontal_8_mmi;
+-        } else {
+-            h->pred8x8  [VERT_PRED8x8       ] = ff_pred8x16_vertical_8_mmi;
+-            h->pred8x8  [HOR_PRED8x8        ] = ff_pred8x16_horizontal_8_mmi;
+-        }
++    if (have_msa(cpu_flags)) {
++        if (8 == bit_depth) {
++            if (chroma_format_idc == 1) {
++                h->pred8x8[VERT_PRED8x8] = ff_h264_intra_pred_vert_8x8_msa;
++                h->pred8x8[HOR_PRED8x8] = ff_h264_intra_pred_horiz_8x8_msa;
++            }
+ 
+-        h->pred16x16[DC_PRED8x8             ] = ff_pred16x16_dc_8_mmi;
+-        h->pred16x16[VERT_PRED8x8           ] = ff_pred16x16_vertical_8_mmi;
+-        h->pred16x16[HOR_PRED8x8            ] = ff_pred16x16_horizontal_8_mmi;
+-        h->pred8x8l [TOP_DC_PRED            ] = ff_pred8x8l_top_dc_8_mmi;
+-        h->pred8x8l [DC_PRED                ] = ff_pred8x8l_dc_8_mmi;
+-
+-#if ARCH_MIPS64
+-        switch (codec_id) {
+-        case AV_CODEC_ID_SVQ3:
+-            h->pred16x16[PLANE_PRED8x8      ] = ff_pred16x16_plane_svq3_8_mmi;
+-            break;
+-        case AV_CODEC_ID_RV40:
+-            h->pred16x16[PLANE_PRED8x8      ] = ff_pred16x16_plane_rv40_8_mmi;
+-            break;
+-        case AV_CODEC_ID_VP7:
+-        case AV_CODEC_ID_VP8:
+-            break;
+-        default:
+-            h->pred16x16[PLANE_PRED8x8      ] = ff_pred16x16_plane_h264_8_mmi;
+-            break;
+-        }
+-#endif
++            if (codec_id != AV_CODEC_ID_VP7 && codec_id != AV_CODEC_ID_VP8) {
++                if (chroma_format_idc == 1) {
++                    h->pred8x8[PLANE_PRED8x8] = ff_h264_intra_predict_plane_8x8_msa;
++                }
++            }
++            if (codec_id != AV_CODEC_ID_RV40 && codec_id != AV_CODEC_ID_VP7
++                && codec_id != AV_CODEC_ID_VP8) {
++                if (chroma_format_idc == 1) {
++                    h->pred8x8[DC_PRED8x8] = ff_h264_intra_predict_dc_4blk_8x8_msa;
++                    h->pred8x8[LEFT_DC_PRED8x8] =
++                        ff_h264_intra_predict_hor_dc_8x8_msa;
++                    h->pred8x8[TOP_DC_PRED8x8] =
++                        ff_h264_intra_predict_vert_dc_8x8_msa;
++                    h->pred8x8[ALZHEIMER_DC_L0T_PRED8x8] =
++                        ff_h264_intra_predict_mad_cow_dc_l0t_8x8_msa;
++                    h->pred8x8[ALZHEIMER_DC_0LT_PRED8x8] =
++                        ff_h264_intra_predict_mad_cow_dc_0lt_8x8_msa;
++                    h->pred8x8[ALZHEIMER_DC_L00_PRED8x8] =
++                        ff_h264_intra_predict_mad_cow_dc_l00_8x8_msa;
++                    h->pred8x8[ALZHEIMER_DC_0L0_PRED8x8] =
++                        ff_h264_intra_predict_mad_cow_dc_0l0_8x8_msa;
++                }
++            } else {
++                if (codec_id == AV_CODEC_ID_VP7 || codec_id == AV_CODEC_ID_VP8) {
++                    h->pred8x8[7] = ff_vp8_pred8x8_127_dc_8_msa;
++                    h->pred8x8[8] = ff_vp8_pred8x8_129_dc_8_msa;
++                }
++            }
+ 
+-        if (codec_id == AV_CODEC_ID_SVQ3 || codec_id == AV_CODEC_ID_H264) {
+             if (chroma_format_idc == 1) {
+-                h->pred8x8[TOP_DC_PRED8x8   ] = ff_pred8x8_top_dc_8_mmi;
+-                h->pred8x8[DC_PRED8x8       ] = ff_pred8x8_dc_8_mmi;
++                h->pred8x8[DC_128_PRED8x8] = ff_h264_intra_pred_dc_128_8x8_msa;
++            }
++
++            h->pred16x16[DC_PRED8x8] = ff_h264_intra_pred_dc_16x16_msa;
++            h->pred16x16[VERT_PRED8x8] = ff_h264_intra_pred_vert_16x16_msa;
++            h->pred16x16[HOR_PRED8x8] = ff_h264_intra_pred_horiz_16x16_msa;
++
++            switch (codec_id) {
++            case AV_CODEC_ID_SVQ3:
++            case AV_CODEC_ID_RV40:
++                break;
++            case AV_CODEC_ID_VP7:
++            case AV_CODEC_ID_VP8:
++                h->pred16x16[7] = ff_vp8_pred16x16_127_dc_8_msa;
++                h->pred16x16[8] = ff_vp8_pred16x16_129_dc_8_msa;
++                break;
++            default:
++                h->pred16x16[PLANE_PRED8x8] =
++                    ff_h264_intra_predict_plane_16x16_msa;
++                break;
+             }
++
++            h->pred16x16[LEFT_DC_PRED8x8] = ff_h264_intra_pred_dc_left_16x16_msa;
++            h->pred16x16[TOP_DC_PRED8x8] = ff_h264_intra_pred_dc_top_16x16_msa;
++            h->pred16x16[DC_128_PRED8x8] = ff_h264_intra_pred_dc_128_16x16_msa;
+         }
+     }
+ }
+-#endif /* HAVE_MMI */
+-
+-av_cold void ff_h264_pred_init_mips(H264PredContext *h, int codec_id,
+-                                    int bit_depth,
+-                                    const int chroma_format_idc)
+-{
+-#if HAVE_MSA
+-    h264_pred_init_msa(h, codec_id, bit_depth, chroma_format_idc);
+-#endif  // #if HAVE_MSA
+-#if HAVE_MMI
+-    h264_pred_init_mmi(h, codec_id, bit_depth, chroma_format_idc);
+-#endif /* HAVE_MMI */
+-}
+diff -uNra ffmpeg-4.1.6/libavcodec/mips/h264qpel_init_mips.c FFmpeg/libavcodec/mips/h264qpel_init_mips.c
+--- a/libavcodec/mips/h264qpel_init_mips.c	2020-07-03 01:22:31.000000000 +0800
++++ b/libavcodec/mips/h264qpel_init_mips.c	2020-07-19 18:19:52.760181959 +0800
+@@ -19,231 +19,221 @@
+  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+  */
+ 
++#include "libavutil/mips/cpu.h"
+ #include "h264dsp_mips.h"
+ 
+-#if HAVE_MSA
+-static av_cold void h264qpel_init_msa(H264QpelContext *c, int bit_depth)
++av_cold void ff_h264qpel_init_mips(H264QpelContext *c, int bit_depth)
+ {
+-    if (8 == bit_depth) {
+-        c->put_h264_qpel_pixels_tab[0][0] = ff_put_h264_qpel16_mc00_msa;
+-        c->put_h264_qpel_pixels_tab[0][1] = ff_put_h264_qpel16_mc10_msa;
+-        c->put_h264_qpel_pixels_tab[0][2] = ff_put_h264_qpel16_mc20_msa;
+-        c->put_h264_qpel_pixels_tab[0][3] = ff_put_h264_qpel16_mc30_msa;
+-        c->put_h264_qpel_pixels_tab[0][4] = ff_put_h264_qpel16_mc01_msa;
+-        c->put_h264_qpel_pixels_tab[0][5] = ff_put_h264_qpel16_mc11_msa;
+-        c->put_h264_qpel_pixels_tab[0][6] = ff_put_h264_qpel16_mc21_msa;
+-        c->put_h264_qpel_pixels_tab[0][7] = ff_put_h264_qpel16_mc31_msa;
+-        c->put_h264_qpel_pixels_tab[0][8] = ff_put_h264_qpel16_mc02_msa;
+-        c->put_h264_qpel_pixels_tab[0][9] = ff_put_h264_qpel16_mc12_msa;
+-        c->put_h264_qpel_pixels_tab[0][10] = ff_put_h264_qpel16_mc22_msa;
+-        c->put_h264_qpel_pixels_tab[0][11] = ff_put_h264_qpel16_mc32_msa;
+-        c->put_h264_qpel_pixels_tab[0][12] = ff_put_h264_qpel16_mc03_msa;
+-        c->put_h264_qpel_pixels_tab[0][13] = ff_put_h264_qpel16_mc13_msa;
+-        c->put_h264_qpel_pixels_tab[0][14] = ff_put_h264_qpel16_mc23_msa;
+-        c->put_h264_qpel_pixels_tab[0][15] = ff_put_h264_qpel16_mc33_msa;
+-
+-        c->put_h264_qpel_pixels_tab[1][0] = ff_put_h264_qpel8_mc00_msa;
+-        c->put_h264_qpel_pixels_tab[1][1] = ff_put_h264_qpel8_mc10_msa;
+-        c->put_h264_qpel_pixels_tab[1][2] = ff_put_h264_qpel8_mc20_msa;
+-        c->put_h264_qpel_pixels_tab[1][3] = ff_put_h264_qpel8_mc30_msa;
+-        c->put_h264_qpel_pixels_tab[1][4] = ff_put_h264_qpel8_mc01_msa;
+-        c->put_h264_qpel_pixels_tab[1][5] = ff_put_h264_qpel8_mc11_msa;
+-        c->put_h264_qpel_pixels_tab[1][6] = ff_put_h264_qpel8_mc21_msa;
+-        c->put_h264_qpel_pixels_tab[1][7] = ff_put_h264_qpel8_mc31_msa;
+-        c->put_h264_qpel_pixels_tab[1][8] = ff_put_h264_qpel8_mc02_msa;
+-        c->put_h264_qpel_pixels_tab[1][9] = ff_put_h264_qpel8_mc12_msa;
+-        c->put_h264_qpel_pixels_tab[1][10] = ff_put_h264_qpel8_mc22_msa;
+-        c->put_h264_qpel_pixels_tab[1][11] = ff_put_h264_qpel8_mc32_msa;
+-        c->put_h264_qpel_pixels_tab[1][12] = ff_put_h264_qpel8_mc03_msa;
+-        c->put_h264_qpel_pixels_tab[1][13] = ff_put_h264_qpel8_mc13_msa;
+-        c->put_h264_qpel_pixels_tab[1][14] = ff_put_h264_qpel8_mc23_msa;
+-        c->put_h264_qpel_pixels_tab[1][15] = ff_put_h264_qpel8_mc33_msa;
+-
+-        c->put_h264_qpel_pixels_tab[2][1] = ff_put_h264_qpel4_mc10_msa;
+-        c->put_h264_qpel_pixels_tab[2][2] = ff_put_h264_qpel4_mc20_msa;
+-        c->put_h264_qpel_pixels_tab[2][3] = ff_put_h264_qpel4_mc30_msa;
+-        c->put_h264_qpel_pixels_tab[2][4] = ff_put_h264_qpel4_mc01_msa;
+-        c->put_h264_qpel_pixels_tab[2][5] = ff_put_h264_qpel4_mc11_msa;
+-        c->put_h264_qpel_pixels_tab[2][6] = ff_put_h264_qpel4_mc21_msa;
+-        c->put_h264_qpel_pixels_tab[2][7] = ff_put_h264_qpel4_mc31_msa;
+-        c->put_h264_qpel_pixels_tab[2][8] = ff_put_h264_qpel4_mc02_msa;
+-        c->put_h264_qpel_pixels_tab[2][9] = ff_put_h264_qpel4_mc12_msa;
+-        c->put_h264_qpel_pixels_tab[2][10] = ff_put_h264_qpel4_mc22_msa;
+-        c->put_h264_qpel_pixels_tab[2][11] = ff_put_h264_qpel4_mc32_msa;
+-        c->put_h264_qpel_pixels_tab[2][12] = ff_put_h264_qpel4_mc03_msa;
+-        c->put_h264_qpel_pixels_tab[2][13] = ff_put_h264_qpel4_mc13_msa;
+-        c->put_h264_qpel_pixels_tab[2][14] = ff_put_h264_qpel4_mc23_msa;
+-        c->put_h264_qpel_pixels_tab[2][15] = ff_put_h264_qpel4_mc33_msa;
+-
+-        c->avg_h264_qpel_pixels_tab[0][0] = ff_avg_h264_qpel16_mc00_msa;
+-        c->avg_h264_qpel_pixels_tab[0][1] = ff_avg_h264_qpel16_mc10_msa;
+-        c->avg_h264_qpel_pixels_tab[0][2] = ff_avg_h264_qpel16_mc20_msa;
+-        c->avg_h264_qpel_pixels_tab[0][3] = ff_avg_h264_qpel16_mc30_msa;
+-        c->avg_h264_qpel_pixels_tab[0][4] = ff_avg_h264_qpel16_mc01_msa;
+-        c->avg_h264_qpel_pixels_tab[0][5] = ff_avg_h264_qpel16_mc11_msa;
+-        c->avg_h264_qpel_pixels_tab[0][6] = ff_avg_h264_qpel16_mc21_msa;
+-        c->avg_h264_qpel_pixels_tab[0][7] = ff_avg_h264_qpel16_mc31_msa;
+-        c->avg_h264_qpel_pixels_tab[0][8] = ff_avg_h264_qpel16_mc02_msa;
+-        c->avg_h264_qpel_pixels_tab[0][9] = ff_avg_h264_qpel16_mc12_msa;
+-        c->avg_h264_qpel_pixels_tab[0][10] = ff_avg_h264_qpel16_mc22_msa;
+-        c->avg_h264_qpel_pixels_tab[0][11] = ff_avg_h264_qpel16_mc32_msa;
+-        c->avg_h264_qpel_pixels_tab[0][12] = ff_avg_h264_qpel16_mc03_msa;
+-        c->avg_h264_qpel_pixels_tab[0][13] = ff_avg_h264_qpel16_mc13_msa;
+-        c->avg_h264_qpel_pixels_tab[0][14] = ff_avg_h264_qpel16_mc23_msa;
+-        c->avg_h264_qpel_pixels_tab[0][15] = ff_avg_h264_qpel16_mc33_msa;
+-
+-        c->avg_h264_qpel_pixels_tab[1][0] = ff_avg_h264_qpel8_mc00_msa;
+-        c->avg_h264_qpel_pixels_tab[1][1] = ff_avg_h264_qpel8_mc10_msa;
+-        c->avg_h264_qpel_pixels_tab[1][2] = ff_avg_h264_qpel8_mc20_msa;
+-        c->avg_h264_qpel_pixels_tab[1][3] = ff_avg_h264_qpel8_mc30_msa;
+-        c->avg_h264_qpel_pixels_tab[1][4] = ff_avg_h264_qpel8_mc01_msa;
+-        c->avg_h264_qpel_pixels_tab[1][5] = ff_avg_h264_qpel8_mc11_msa;
+-        c->avg_h264_qpel_pixels_tab[1][6] = ff_avg_h264_qpel8_mc21_msa;
+-        c->avg_h264_qpel_pixels_tab[1][7] = ff_avg_h264_qpel8_mc31_msa;
+-        c->avg_h264_qpel_pixels_tab[1][8] = ff_avg_h264_qpel8_mc02_msa;
+-        c->avg_h264_qpel_pixels_tab[1][9] = ff_avg_h264_qpel8_mc12_msa;
+-        c->avg_h264_qpel_pixels_tab[1][10] = ff_avg_h264_qpel8_mc22_msa;
+-        c->avg_h264_qpel_pixels_tab[1][11] = ff_avg_h264_qpel8_mc32_msa;
+-        c->avg_h264_qpel_pixels_tab[1][12] = ff_avg_h264_qpel8_mc03_msa;
+-        c->avg_h264_qpel_pixels_tab[1][13] = ff_avg_h264_qpel8_mc13_msa;
+-        c->avg_h264_qpel_pixels_tab[1][14] = ff_avg_h264_qpel8_mc23_msa;
+-        c->avg_h264_qpel_pixels_tab[1][15] = ff_avg_h264_qpel8_mc33_msa;
+-
+-        c->avg_h264_qpel_pixels_tab[2][0] = ff_avg_h264_qpel4_mc00_msa;
+-        c->avg_h264_qpel_pixels_tab[2][1] = ff_avg_h264_qpel4_mc10_msa;
+-        c->avg_h264_qpel_pixels_tab[2][2] = ff_avg_h264_qpel4_mc20_msa;
+-        c->avg_h264_qpel_pixels_tab[2][3] = ff_avg_h264_qpel4_mc30_msa;
+-        c->avg_h264_qpel_pixels_tab[2][4] = ff_avg_h264_qpel4_mc01_msa;
+-        c->avg_h264_qpel_pixels_tab[2][5] = ff_avg_h264_qpel4_mc11_msa;
+-        c->avg_h264_qpel_pixels_tab[2][6] = ff_avg_h264_qpel4_mc21_msa;
+-        c->avg_h264_qpel_pixels_tab[2][7] = ff_avg_h264_qpel4_mc31_msa;
+-        c->avg_h264_qpel_pixels_tab[2][8] = ff_avg_h264_qpel4_mc02_msa;
+-        c->avg_h264_qpel_pixels_tab[2][9] = ff_avg_h264_qpel4_mc12_msa;
+-        c->avg_h264_qpel_pixels_tab[2][10] = ff_avg_h264_qpel4_mc22_msa;
+-        c->avg_h264_qpel_pixels_tab[2][11] = ff_avg_h264_qpel4_mc32_msa;
+-        c->avg_h264_qpel_pixels_tab[2][12] = ff_avg_h264_qpel4_mc03_msa;
+-        c->avg_h264_qpel_pixels_tab[2][13] = ff_avg_h264_qpel4_mc13_msa;
+-        c->avg_h264_qpel_pixels_tab[2][14] = ff_avg_h264_qpel4_mc23_msa;
+-        c->avg_h264_qpel_pixels_tab[2][15] = ff_avg_h264_qpel4_mc33_msa;
+-    }
+-}
+-#endif  // #if HAVE_MSA
++    int cpu_flags = av_get_cpu_flags();
+ 
+-#if HAVE_MMI
+-static av_cold void h264qpel_init_mmi(H264QpelContext *c, int bit_depth)
+-{
+-    if (8 == bit_depth) {
+-        c->put_h264_qpel_pixels_tab[0][0] = ff_put_h264_qpel16_mc00_mmi;
+-        c->put_h264_qpel_pixels_tab[0][1] = ff_put_h264_qpel16_mc10_mmi;
+-        c->put_h264_qpel_pixels_tab[0][2] = ff_put_h264_qpel16_mc20_mmi;
+-        c->put_h264_qpel_pixels_tab[0][3] = ff_put_h264_qpel16_mc30_mmi;
+-        c->put_h264_qpel_pixels_tab[0][4] = ff_put_h264_qpel16_mc01_mmi;
+-        c->put_h264_qpel_pixels_tab[0][5] = ff_put_h264_qpel16_mc11_mmi;
+-        c->put_h264_qpel_pixels_tab[0][6] = ff_put_h264_qpel16_mc21_mmi;
+-        c->put_h264_qpel_pixels_tab[0][7] = ff_put_h264_qpel16_mc31_mmi;
+-        c->put_h264_qpel_pixels_tab[0][8] = ff_put_h264_qpel16_mc02_mmi;
+-        c->put_h264_qpel_pixels_tab[0][9] = ff_put_h264_qpel16_mc12_mmi;
+-        c->put_h264_qpel_pixels_tab[0][10] = ff_put_h264_qpel16_mc22_mmi;
+-        c->put_h264_qpel_pixels_tab[0][11] = ff_put_h264_qpel16_mc32_mmi;
+-        c->put_h264_qpel_pixels_tab[0][12] = ff_put_h264_qpel16_mc03_mmi;
+-        c->put_h264_qpel_pixels_tab[0][13] = ff_put_h264_qpel16_mc13_mmi;
+-        c->put_h264_qpel_pixels_tab[0][14] = ff_put_h264_qpel16_mc23_mmi;
+-        c->put_h264_qpel_pixels_tab[0][15] = ff_put_h264_qpel16_mc33_mmi;
+-
+-        c->put_h264_qpel_pixels_tab[1][0] = ff_put_h264_qpel8_mc00_mmi;
+-        c->put_h264_qpel_pixels_tab[1][1] = ff_put_h264_qpel8_mc10_mmi;
+-        c->put_h264_qpel_pixels_tab[1][2] = ff_put_h264_qpel8_mc20_mmi;
+-        c->put_h264_qpel_pixels_tab[1][3] = ff_put_h264_qpel8_mc30_mmi;
+-        c->put_h264_qpel_pixels_tab[1][4] = ff_put_h264_qpel8_mc01_mmi;
+-        c->put_h264_qpel_pixels_tab[1][5] = ff_put_h264_qpel8_mc11_mmi;
+-        c->put_h264_qpel_pixels_tab[1][6] = ff_put_h264_qpel8_mc21_mmi;
+-        c->put_h264_qpel_pixels_tab[1][7] = ff_put_h264_qpel8_mc31_mmi;
+-        c->put_h264_qpel_pixels_tab[1][8] = ff_put_h264_qpel8_mc02_mmi;
+-        c->put_h264_qpel_pixels_tab[1][9] = ff_put_h264_qpel8_mc12_mmi;
+-        c->put_h264_qpel_pixels_tab[1][10] = ff_put_h264_qpel8_mc22_mmi;
+-        c->put_h264_qpel_pixels_tab[1][11] = ff_put_h264_qpel8_mc32_mmi;
+-        c->put_h264_qpel_pixels_tab[1][12] = ff_put_h264_qpel8_mc03_mmi;
+-        c->put_h264_qpel_pixels_tab[1][13] = ff_put_h264_qpel8_mc13_mmi;
+-        c->put_h264_qpel_pixels_tab[1][14] = ff_put_h264_qpel8_mc23_mmi;
+-        c->put_h264_qpel_pixels_tab[1][15] = ff_put_h264_qpel8_mc33_mmi;
+-
+-        c->put_h264_qpel_pixels_tab[2][0] = ff_put_h264_qpel4_mc00_mmi;
+-        c->put_h264_qpel_pixels_tab[2][1] = ff_put_h264_qpel4_mc10_mmi;
+-        c->put_h264_qpel_pixels_tab[2][2] = ff_put_h264_qpel4_mc20_mmi;
+-        c->put_h264_qpel_pixels_tab[2][3] = ff_put_h264_qpel4_mc30_mmi;
+-        c->put_h264_qpel_pixels_tab[2][4] = ff_put_h264_qpel4_mc01_mmi;
+-        c->put_h264_qpel_pixels_tab[2][5] = ff_put_h264_qpel4_mc11_mmi;
+-        c->put_h264_qpel_pixels_tab[2][6] = ff_put_h264_qpel4_mc21_mmi;
+-        c->put_h264_qpel_pixels_tab[2][7] = ff_put_h264_qpel4_mc31_mmi;
+-        c->put_h264_qpel_pixels_tab[2][8] = ff_put_h264_qpel4_mc02_mmi;
+-        c->put_h264_qpel_pixels_tab[2][9] = ff_put_h264_qpel4_mc12_mmi;
+-        c->put_h264_qpel_pixels_tab[2][10] = ff_put_h264_qpel4_mc22_mmi;
+-        c->put_h264_qpel_pixels_tab[2][11] = ff_put_h264_qpel4_mc32_mmi;
+-        c->put_h264_qpel_pixels_tab[2][12] = ff_put_h264_qpel4_mc03_mmi;
+-        c->put_h264_qpel_pixels_tab[2][13] = ff_put_h264_qpel4_mc13_mmi;
+-        c->put_h264_qpel_pixels_tab[2][14] = ff_put_h264_qpel4_mc23_mmi;
+-        c->put_h264_qpel_pixels_tab[2][15] = ff_put_h264_qpel4_mc33_mmi;
+-
+-        c->avg_h264_qpel_pixels_tab[0][0] = ff_avg_h264_qpel16_mc00_mmi;
+-        c->avg_h264_qpel_pixels_tab[0][1] = ff_avg_h264_qpel16_mc10_mmi;
+-        c->avg_h264_qpel_pixels_tab[0][2] = ff_avg_h264_qpel16_mc20_mmi;
+-        c->avg_h264_qpel_pixels_tab[0][3] = ff_avg_h264_qpel16_mc30_mmi;
+-        c->avg_h264_qpel_pixels_tab[0][4] = ff_avg_h264_qpel16_mc01_mmi;
+-        c->avg_h264_qpel_pixels_tab[0][5] = ff_avg_h264_qpel16_mc11_mmi;
+-        c->avg_h264_qpel_pixels_tab[0][6] = ff_avg_h264_qpel16_mc21_mmi;
+-        c->avg_h264_qpel_pixels_tab[0][7] = ff_avg_h264_qpel16_mc31_mmi;
+-        c->avg_h264_qpel_pixels_tab[0][8] = ff_avg_h264_qpel16_mc02_mmi;
+-        c->avg_h264_qpel_pixels_tab[0][9] = ff_avg_h264_qpel16_mc12_mmi;
+-        c->avg_h264_qpel_pixels_tab[0][10] = ff_avg_h264_qpel16_mc22_mmi;
+-        c->avg_h264_qpel_pixels_tab[0][11] = ff_avg_h264_qpel16_mc32_mmi;
+-        c->avg_h264_qpel_pixels_tab[0][12] = ff_avg_h264_qpel16_mc03_mmi;
+-        c->avg_h264_qpel_pixels_tab[0][13] = ff_avg_h264_qpel16_mc13_mmi;
+-        c->avg_h264_qpel_pixels_tab[0][14] = ff_avg_h264_qpel16_mc23_mmi;
+-        c->avg_h264_qpel_pixels_tab[0][15] = ff_avg_h264_qpel16_mc33_mmi;
+-
+-        c->avg_h264_qpel_pixels_tab[1][0] = ff_avg_h264_qpel8_mc00_mmi;
+-        c->avg_h264_qpel_pixels_tab[1][1] = ff_avg_h264_qpel8_mc10_mmi;
+-        c->avg_h264_qpel_pixels_tab[1][2] = ff_avg_h264_qpel8_mc20_mmi;
+-        c->avg_h264_qpel_pixels_tab[1][3] = ff_avg_h264_qpel8_mc30_mmi;
+-        c->avg_h264_qpel_pixels_tab[1][4] = ff_avg_h264_qpel8_mc01_mmi;
+-        c->avg_h264_qpel_pixels_tab[1][5] = ff_avg_h264_qpel8_mc11_mmi;
+-        c->avg_h264_qpel_pixels_tab[1][6] = ff_avg_h264_qpel8_mc21_mmi;
+-        c->avg_h264_qpel_pixels_tab[1][7] = ff_avg_h264_qpel8_mc31_mmi;
+-        c->avg_h264_qpel_pixels_tab[1][8] = ff_avg_h264_qpel8_mc02_mmi;
+-        c->avg_h264_qpel_pixels_tab[1][9] = ff_avg_h264_qpel8_mc12_mmi;
+-        c->avg_h264_qpel_pixels_tab[1][10] = ff_avg_h264_qpel8_mc22_mmi;
+-        c->avg_h264_qpel_pixels_tab[1][11] = ff_avg_h264_qpel8_mc32_mmi;
+-        c->avg_h264_qpel_pixels_tab[1][12] = ff_avg_h264_qpel8_mc03_mmi;
+-        c->avg_h264_qpel_pixels_tab[1][13] = ff_avg_h264_qpel8_mc13_mmi;
+-        c->avg_h264_qpel_pixels_tab[1][14] = ff_avg_h264_qpel8_mc23_mmi;
+-        c->avg_h264_qpel_pixels_tab[1][15] = ff_avg_h264_qpel8_mc33_mmi;
+-
+-        c->avg_h264_qpel_pixels_tab[2][0] = ff_avg_h264_qpel4_mc00_mmi;
+-        c->avg_h264_qpel_pixels_tab[2][1] = ff_avg_h264_qpel4_mc10_mmi;
+-        c->avg_h264_qpel_pixels_tab[2][2] = ff_avg_h264_qpel4_mc20_mmi;
+-        c->avg_h264_qpel_pixels_tab[2][3] = ff_avg_h264_qpel4_mc30_mmi;
+-        c->avg_h264_qpel_pixels_tab[2][4] = ff_avg_h264_qpel4_mc01_mmi;
+-        c->avg_h264_qpel_pixels_tab[2][5] = ff_avg_h264_qpel4_mc11_mmi;
+-        c->avg_h264_qpel_pixels_tab[2][6] = ff_avg_h264_qpel4_mc21_mmi;
+-        c->avg_h264_qpel_pixels_tab[2][7] = ff_avg_h264_qpel4_mc31_mmi;
+-        c->avg_h264_qpel_pixels_tab[2][8] = ff_avg_h264_qpel4_mc02_mmi;
+-        c->avg_h264_qpel_pixels_tab[2][9] = ff_avg_h264_qpel4_mc12_mmi;
+-        c->avg_h264_qpel_pixels_tab[2][10] = ff_avg_h264_qpel4_mc22_mmi;
+-        c->avg_h264_qpel_pixels_tab[2][11] = ff_avg_h264_qpel4_mc32_mmi;
+-        c->avg_h264_qpel_pixels_tab[2][12] = ff_avg_h264_qpel4_mc03_mmi;
+-        c->avg_h264_qpel_pixels_tab[2][13] = ff_avg_h264_qpel4_mc13_mmi;
+-        c->avg_h264_qpel_pixels_tab[2][14] = ff_avg_h264_qpel4_mc23_mmi;
+-        c->avg_h264_qpel_pixels_tab[2][15] = ff_avg_h264_qpel4_mc33_mmi;
++    if (have_mmi(cpu_flags)) {
++        if (bit_depth == 8) {
++            c->put_h264_qpel_pixels_tab[0][0] = ff_put_h264_qpel16_mc00_mmi;
++            c->put_h264_qpel_pixels_tab[0][1] = ff_put_h264_qpel16_mc10_mmi;
++            c->put_h264_qpel_pixels_tab[0][2] = ff_put_h264_qpel16_mc20_mmi;
++            c->put_h264_qpel_pixels_tab[0][3] = ff_put_h264_qpel16_mc30_mmi;
++            c->put_h264_qpel_pixels_tab[0][4] = ff_put_h264_qpel16_mc01_mmi;
++            c->put_h264_qpel_pixels_tab[0][5] = ff_put_h264_qpel16_mc11_mmi;
++            c->put_h264_qpel_pixels_tab[0][6] = ff_put_h264_qpel16_mc21_mmi;
++            c->put_h264_qpel_pixels_tab[0][7] = ff_put_h264_qpel16_mc31_mmi;
++            c->put_h264_qpel_pixels_tab[0][8] = ff_put_h264_qpel16_mc02_mmi;
++            c->put_h264_qpel_pixels_tab[0][9] = ff_put_h264_qpel16_mc12_mmi;
++            c->put_h264_qpel_pixels_tab[0][10] = ff_put_h264_qpel16_mc22_mmi;
++            c->put_h264_qpel_pixels_tab[0][11] = ff_put_h264_qpel16_mc32_mmi;
++            c->put_h264_qpel_pixels_tab[0][12] = ff_put_h264_qpel16_mc03_mmi;
++            c->put_h264_qpel_pixels_tab[0][13] = ff_put_h264_qpel16_mc13_mmi;
++            c->put_h264_qpel_pixels_tab[0][14] = ff_put_h264_qpel16_mc23_mmi;
++            c->put_h264_qpel_pixels_tab[0][15] = ff_put_h264_qpel16_mc33_mmi;
++
++            c->put_h264_qpel_pixels_tab[1][0] = ff_put_h264_qpel8_mc00_mmi;
++            c->put_h264_qpel_pixels_tab[1][1] = ff_put_h264_qpel8_mc10_mmi;
++            c->put_h264_qpel_pixels_tab[1][2] = ff_put_h264_qpel8_mc20_mmi;
++            c->put_h264_qpel_pixels_tab[1][3] = ff_put_h264_qpel8_mc30_mmi;
++            c->put_h264_qpel_pixels_tab[1][4] = ff_put_h264_qpel8_mc01_mmi;
++            c->put_h264_qpel_pixels_tab[1][5] = ff_put_h264_qpel8_mc11_mmi;
++            c->put_h264_qpel_pixels_tab[1][6] = ff_put_h264_qpel8_mc21_mmi;
++            c->put_h264_qpel_pixels_tab[1][7] = ff_put_h264_qpel8_mc31_mmi;
++            c->put_h264_qpel_pixels_tab[1][8] = ff_put_h264_qpel8_mc02_mmi;
++            c->put_h264_qpel_pixels_tab[1][9] = ff_put_h264_qpel8_mc12_mmi;
++            c->put_h264_qpel_pixels_tab[1][10] = ff_put_h264_qpel8_mc22_mmi;
++            c->put_h264_qpel_pixels_tab[1][11] = ff_put_h264_qpel8_mc32_mmi;
++            c->put_h264_qpel_pixels_tab[1][12] = ff_put_h264_qpel8_mc03_mmi;
++            c->put_h264_qpel_pixels_tab[1][13] = ff_put_h264_qpel8_mc13_mmi;
++            c->put_h264_qpel_pixels_tab[1][14] = ff_put_h264_qpel8_mc23_mmi;
++            c->put_h264_qpel_pixels_tab[1][15] = ff_put_h264_qpel8_mc33_mmi;
++
++            c->put_h264_qpel_pixels_tab[2][0] = ff_put_h264_qpel4_mc00_mmi;
++            c->put_h264_qpel_pixels_tab[2][1] = ff_put_h264_qpel4_mc10_mmi;
++            c->put_h264_qpel_pixels_tab[2][2] = ff_put_h264_qpel4_mc20_mmi;
++            c->put_h264_qpel_pixels_tab[2][3] = ff_put_h264_qpel4_mc30_mmi;
++            c->put_h264_qpel_pixels_tab[2][4] = ff_put_h264_qpel4_mc01_mmi;
++            c->put_h264_qpel_pixels_tab[2][5] = ff_put_h264_qpel4_mc11_mmi;
++            c->put_h264_qpel_pixels_tab[2][6] = ff_put_h264_qpel4_mc21_mmi;
++            c->put_h264_qpel_pixels_tab[2][7] = ff_put_h264_qpel4_mc31_mmi;
++            c->put_h264_qpel_pixels_tab[2][8] = ff_put_h264_qpel4_mc02_mmi;
++            c->put_h264_qpel_pixels_tab[2][9] = ff_put_h264_qpel4_mc12_mmi;
++            c->put_h264_qpel_pixels_tab[2][10] = ff_put_h264_qpel4_mc22_mmi;
++            c->put_h264_qpel_pixels_tab[2][11] = ff_put_h264_qpel4_mc32_mmi;
++            c->put_h264_qpel_pixels_tab[2][12] = ff_put_h264_qpel4_mc03_mmi;
++            c->put_h264_qpel_pixels_tab[2][13] = ff_put_h264_qpel4_mc13_mmi;
++            c->put_h264_qpel_pixels_tab[2][14] = ff_put_h264_qpel4_mc23_mmi;
++            c->put_h264_qpel_pixels_tab[2][15] = ff_put_h264_qpel4_mc33_mmi;
++
++            c->avg_h264_qpel_pixels_tab[0][0] = ff_avg_h264_qpel16_mc00_mmi;
++            c->avg_h264_qpel_pixels_tab[0][1] = ff_avg_h264_qpel16_mc10_mmi;
++            c->avg_h264_qpel_pixels_tab[0][2] = ff_avg_h264_qpel16_mc20_mmi;
++            c->avg_h264_qpel_pixels_tab[0][3] = ff_avg_h264_qpel16_mc30_mmi;
++            c->avg_h264_qpel_pixels_tab[0][4] = ff_avg_h264_qpel16_mc01_mmi;
++            c->avg_h264_qpel_pixels_tab[0][5] = ff_avg_h264_qpel16_mc11_mmi;
++            c->avg_h264_qpel_pixels_tab[0][6] = ff_avg_h264_qpel16_mc21_mmi;
++            c->avg_h264_qpel_pixels_tab[0][7] = ff_avg_h264_qpel16_mc31_mmi;
++            c->avg_h264_qpel_pixels_tab[0][8] = ff_avg_h264_qpel16_mc02_mmi;
++            c->avg_h264_qpel_pixels_tab[0][9] = ff_avg_h264_qpel16_mc12_mmi;
++            c->avg_h264_qpel_pixels_tab[0][10] = ff_avg_h264_qpel16_mc22_mmi;
++            c->avg_h264_qpel_pixels_tab[0][11] = ff_avg_h264_qpel16_mc32_mmi;
++            c->avg_h264_qpel_pixels_tab[0][12] = ff_avg_h264_qpel16_mc03_mmi;
++            c->avg_h264_qpel_pixels_tab[0][13] = ff_avg_h264_qpel16_mc13_mmi;
++            c->avg_h264_qpel_pixels_tab[0][14] = ff_avg_h264_qpel16_mc23_mmi;
++            c->avg_h264_qpel_pixels_tab[0][15] = ff_avg_h264_qpel16_mc33_mmi;
++
++            c->avg_h264_qpel_pixels_tab[1][0] = ff_avg_h264_qpel8_mc00_mmi;
++            c->avg_h264_qpel_pixels_tab[1][1] = ff_avg_h264_qpel8_mc10_mmi;
++            c->avg_h264_qpel_pixels_tab[1][2] = ff_avg_h264_qpel8_mc20_mmi;
++            c->avg_h264_qpel_pixels_tab[1][3] = ff_avg_h264_qpel8_mc30_mmi;
++            c->avg_h264_qpel_pixels_tab[1][4] = ff_avg_h264_qpel8_mc01_mmi;
++            c->avg_h264_qpel_pixels_tab[1][5] = ff_avg_h264_qpel8_mc11_mmi;
++            c->avg_h264_qpel_pixels_tab[1][6] = ff_avg_h264_qpel8_mc21_mmi;
++            c->avg_h264_qpel_pixels_tab[1][7] = ff_avg_h264_qpel8_mc31_mmi;
++            c->avg_h264_qpel_pixels_tab[1][8] = ff_avg_h264_qpel8_mc02_mmi;
++            c->avg_h264_qpel_pixels_tab[1][9] = ff_avg_h264_qpel8_mc12_mmi;
++            c->avg_h264_qpel_pixels_tab[1][10] = ff_avg_h264_qpel8_mc22_mmi;
++            c->avg_h264_qpel_pixels_tab[1][11] = ff_avg_h264_qpel8_mc32_mmi;
++            c->avg_h264_qpel_pixels_tab[1][12] = ff_avg_h264_qpel8_mc03_mmi;
++            c->avg_h264_qpel_pixels_tab[1][13] = ff_avg_h264_qpel8_mc13_mmi;
++            c->avg_h264_qpel_pixels_tab[1][14] = ff_avg_h264_qpel8_mc23_mmi;
++            c->avg_h264_qpel_pixels_tab[1][15] = ff_avg_h264_qpel8_mc33_mmi;
++
++            c->avg_h264_qpel_pixels_tab[2][0] = ff_avg_h264_qpel4_mc00_mmi;
++            c->avg_h264_qpel_pixels_tab[2][1] = ff_avg_h264_qpel4_mc10_mmi;
++            c->avg_h264_qpel_pixels_tab[2][2] = ff_avg_h264_qpel4_mc20_mmi;
++            c->avg_h264_qpel_pixels_tab[2][3] = ff_avg_h264_qpel4_mc30_mmi;
++            c->avg_h264_qpel_pixels_tab[2][4] = ff_avg_h264_qpel4_mc01_mmi;
++            c->avg_h264_qpel_pixels_tab[2][5] = ff_avg_h264_qpel4_mc11_mmi;
++            c->avg_h264_qpel_pixels_tab[2][6] = ff_avg_h264_qpel4_mc21_mmi;
++            c->avg_h264_qpel_pixels_tab[2][7] = ff_avg_h264_qpel4_mc31_mmi;
++            c->avg_h264_qpel_pixels_tab[2][8] = ff_avg_h264_qpel4_mc02_mmi;
++            c->avg_h264_qpel_pixels_tab[2][9] = ff_avg_h264_qpel4_mc12_mmi;
++            c->avg_h264_qpel_pixels_tab[2][10] = ff_avg_h264_qpel4_mc22_mmi;
++            c->avg_h264_qpel_pixels_tab[2][11] = ff_avg_h264_qpel4_mc32_mmi;
++            c->avg_h264_qpel_pixels_tab[2][12] = ff_avg_h264_qpel4_mc03_mmi;
++            c->avg_h264_qpel_pixels_tab[2][13] = ff_avg_h264_qpel4_mc13_mmi;
++            c->avg_h264_qpel_pixels_tab[2][14] = ff_avg_h264_qpel4_mc23_mmi;
++            c->avg_h264_qpel_pixels_tab[2][15] = ff_avg_h264_qpel4_mc33_mmi;
++        }
+     }
+-}
+-#endif /* HAVE_MMI */
+ 
+-av_cold void ff_h264qpel_init_mips(H264QpelContext *c, int bit_depth)
+-{
+-#if HAVE_MSA
+-    h264qpel_init_msa(c, bit_depth);
+-#endif  // #if HAVE_MSA
+-#if HAVE_MMI
+-    h264qpel_init_mmi(c, bit_depth);
+-#endif /* HAVE_MMI */
++    if (have_msa(cpu_flags)) {
++        if (bit_depth == 8) {
++            c->put_h264_qpel_pixels_tab[0][0] = ff_put_h264_qpel16_mc00_msa;
++            c->put_h264_qpel_pixels_tab[0][1] = ff_put_h264_qpel16_mc10_msa;
++            c->put_h264_qpel_pixels_tab[0][2] = ff_put_h264_qpel16_mc20_msa;
++            c->put_h264_qpel_pixels_tab[0][3] = ff_put_h264_qpel16_mc30_msa;
++            c->put_h264_qpel_pixels_tab[0][4] = ff_put_h264_qpel16_mc01_msa;
++            c->put_h264_qpel_pixels_tab[0][5] = ff_put_h264_qpel16_mc11_msa;
++            c->put_h264_qpel_pixels_tab[0][6] = ff_put_h264_qpel16_mc21_msa;
++            c->put_h264_qpel_pixels_tab[0][7] = ff_put_h264_qpel16_mc31_msa;
++            c->put_h264_qpel_pixels_tab[0][8] = ff_put_h264_qpel16_mc02_msa;
++            c->put_h264_qpel_pixels_tab[0][9] = ff_put_h264_qpel16_mc12_msa;
++            c->put_h264_qpel_pixels_tab[0][10] = ff_put_h264_qpel16_mc22_msa;
++            c->put_h264_qpel_pixels_tab[0][11] = ff_put_h264_qpel16_mc32_msa;
++            c->put_h264_qpel_pixels_tab[0][12] = ff_put_h264_qpel16_mc03_msa;
++            c->put_h264_qpel_pixels_tab[0][13] = ff_put_h264_qpel16_mc13_msa;
++            c->put_h264_qpel_pixels_tab[0][14] = ff_put_h264_qpel16_mc23_msa;
++            c->put_h264_qpel_pixels_tab[0][15] = ff_put_h264_qpel16_mc33_msa;
++
++            c->put_h264_qpel_pixels_tab[1][0] = ff_put_h264_qpel8_mc00_msa;
++            c->put_h264_qpel_pixels_tab[1][1] = ff_put_h264_qpel8_mc10_msa;
++            c->put_h264_qpel_pixels_tab[1][2] = ff_put_h264_qpel8_mc20_msa;
++            c->put_h264_qpel_pixels_tab[1][3] = ff_put_h264_qpel8_mc30_msa;
++            c->put_h264_qpel_pixels_tab[1][4] = ff_put_h264_qpel8_mc01_msa;
++            c->put_h264_qpel_pixels_tab[1][5] = ff_put_h264_qpel8_mc11_msa;
++            c->put_h264_qpel_pixels_tab[1][6] = ff_put_h264_qpel8_mc21_msa;
++            c->put_h264_qpel_pixels_tab[1][7] = ff_put_h264_qpel8_mc31_msa;
++            c->put_h264_qpel_pixels_tab[1][8] = ff_put_h264_qpel8_mc02_msa;
++            c->put_h264_qpel_pixels_tab[1][9] = ff_put_h264_qpel8_mc12_msa;
++            c->put_h264_qpel_pixels_tab[1][10] = ff_put_h264_qpel8_mc22_msa;
++            c->put_h264_qpel_pixels_tab[1][11] = ff_put_h264_qpel8_mc32_msa;
++            c->put_h264_qpel_pixels_tab[1][12] = ff_put_h264_qpel8_mc03_msa;
++            c->put_h264_qpel_pixels_tab[1][13] = ff_put_h264_qpel8_mc13_msa;
++            c->put_h264_qpel_pixels_tab[1][14] = ff_put_h264_qpel8_mc23_msa;
++            c->put_h264_qpel_pixels_tab[1][15] = ff_put_h264_qpel8_mc33_msa;
++
++            c->put_h264_qpel_pixels_tab[2][1] = ff_put_h264_qpel4_mc10_msa;
++            c->put_h264_qpel_pixels_tab[2][2] = ff_put_h264_qpel4_mc20_msa;
++            c->put_h264_qpel_pixels_tab[2][3] = ff_put_h264_qpel4_mc30_msa;
++            c->put_h264_qpel_pixels_tab[2][4] = ff_put_h264_qpel4_mc01_msa;
++            c->put_h264_qpel_pixels_tab[2][5] = ff_put_h264_qpel4_mc11_msa;
++            c->put_h264_qpel_pixels_tab[2][6] = ff_put_h264_qpel4_mc21_msa;
++            c->put_h264_qpel_pixels_tab[2][7] = ff_put_h264_qpel4_mc31_msa;
++            c->put_h264_qpel_pixels_tab[2][8] = ff_put_h264_qpel4_mc02_msa;
++            c->put_h264_qpel_pixels_tab[2][9] = ff_put_h264_qpel4_mc12_msa;
++            c->put_h264_qpel_pixels_tab[2][10] = ff_put_h264_qpel4_mc22_msa;
++            c->put_h264_qpel_pixels_tab[2][11] = ff_put_h264_qpel4_mc32_msa;
++            c->put_h264_qpel_pixels_tab[2][12] = ff_put_h264_qpel4_mc03_msa;
++            c->put_h264_qpel_pixels_tab[2][13] = ff_put_h264_qpel4_mc13_msa;
++            c->put_h264_qpel_pixels_tab[2][14] = ff_put_h264_qpel4_mc23_msa;
++            c->put_h264_qpel_pixels_tab[2][15] = ff_put_h264_qpel4_mc33_msa;
++
++            c->avg_h264_qpel_pixels_tab[0][0] = ff_avg_h264_qpel16_mc00_msa;
++            c->avg_h264_qpel_pixels_tab[0][1] = ff_avg_h264_qpel16_mc10_msa;
++            c->avg_h264_qpel_pixels_tab[0][2] = ff_avg_h264_qpel16_mc20_msa;
++            c->avg_h264_qpel_pixels_tab[0][3] = ff_avg_h264_qpel16_mc30_msa;
++            c->avg_h264_qpel_pixels_tab[0][4] = ff_avg_h264_qpel16_mc01_msa;
++            c->avg_h264_qpel_pixels_tab[0][5] = ff_avg_h264_qpel16_mc11_msa;
++            c->avg_h264_qpel_pixels_tab[0][6] = ff_avg_h264_qpel16_mc21_msa;
++            c->avg_h264_qpel_pixels_tab[0][7] = ff_avg_h264_qpel16_mc31_msa;
++            c->avg_h264_qpel_pixels_tab[0][8] = ff_avg_h264_qpel16_mc02_msa;
++            c->avg_h264_qpel_pixels_tab[0][9] = ff_avg_h264_qpel16_mc12_msa;
++            c->avg_h264_qpel_pixels_tab[0][10] = ff_avg_h264_qpel16_mc22_msa;
++            c->avg_h264_qpel_pixels_tab[0][11] = ff_avg_h264_qpel16_mc32_msa;
++            c->avg_h264_qpel_pixels_tab[0][12] = ff_avg_h264_qpel16_mc03_msa;
++            c->avg_h264_qpel_pixels_tab[0][13] = ff_avg_h264_qpel16_mc13_msa;
++            c->avg_h264_qpel_pixels_tab[0][14] = ff_avg_h264_qpel16_mc23_msa;
++            c->avg_h264_qpel_pixels_tab[0][15] = ff_avg_h264_qpel16_mc33_msa;
++
++            c->avg_h264_qpel_pixels_tab[1][0] = ff_avg_h264_qpel8_mc00_msa;
++            c->avg_h264_qpel_pixels_tab[1][1] = ff_avg_h264_qpel8_mc10_msa;
++            c->avg_h264_qpel_pixels_tab[1][2] = ff_avg_h264_qpel8_mc20_msa;
++            c->avg_h264_qpel_pixels_tab[1][3] = ff_avg_h264_qpel8_mc30_msa;
++            c->avg_h264_qpel_pixels_tab[1][4] = ff_avg_h264_qpel8_mc01_msa;
++            c->avg_h264_qpel_pixels_tab[1][5] = ff_avg_h264_qpel8_mc11_msa;
++            c->avg_h264_qpel_pixels_tab[1][6] = ff_avg_h264_qpel8_mc21_msa;
++            c->avg_h264_qpel_pixels_tab[1][7] = ff_avg_h264_qpel8_mc31_msa;
++            c->avg_h264_qpel_pixels_tab[1][8] = ff_avg_h264_qpel8_mc02_msa;
++            c->avg_h264_qpel_pixels_tab[1][9] = ff_avg_h264_qpel8_mc12_msa;
++            c->avg_h264_qpel_pixels_tab[1][10] = ff_avg_h264_qpel8_mc22_msa;
++            c->avg_h264_qpel_pixels_tab[1][11] = ff_avg_h264_qpel8_mc32_msa;
++            c->avg_h264_qpel_pixels_tab[1][12] = ff_avg_h264_qpel8_mc03_msa;
++            c->avg_h264_qpel_pixels_tab[1][13] = ff_avg_h264_qpel8_mc13_msa;
++            c->avg_h264_qpel_pixels_tab[1][14] = ff_avg_h264_qpel8_mc23_msa;
++            c->avg_h264_qpel_pixels_tab[1][15] = ff_avg_h264_qpel8_mc33_msa;
++
++            c->avg_h264_qpel_pixels_tab[2][0] = ff_avg_h264_qpel4_mc00_msa;
++            c->avg_h264_qpel_pixels_tab[2][1] = ff_avg_h264_qpel4_mc10_msa;
++            c->avg_h264_qpel_pixels_tab[2][2] = ff_avg_h264_qpel4_mc20_msa;
++            c->avg_h264_qpel_pixels_tab[2][3] = ff_avg_h264_qpel4_mc30_msa;
++            c->avg_h264_qpel_pixels_tab[2][4] = ff_avg_h264_qpel4_mc01_msa;
++            c->avg_h264_qpel_pixels_tab[2][5] = ff_avg_h264_qpel4_mc11_msa;
++            c->avg_h264_qpel_pixels_tab[2][6] = ff_avg_h264_qpel4_mc21_msa;
++            c->avg_h264_qpel_pixels_tab[2][7] = ff_avg_h264_qpel4_mc31_msa;
++            c->avg_h264_qpel_pixels_tab[2][8] = ff_avg_h264_qpel4_mc02_msa;
++            c->avg_h264_qpel_pixels_tab[2][9] = ff_avg_h264_qpel4_mc12_msa;
++            c->avg_h264_qpel_pixels_tab[2][10] = ff_avg_h264_qpel4_mc22_msa;
++            c->avg_h264_qpel_pixels_tab[2][11] = ff_avg_h264_qpel4_mc32_msa;
++            c->avg_h264_qpel_pixels_tab[2][12] = ff_avg_h264_qpel4_mc03_msa;
++            c->avg_h264_qpel_pixels_tab[2][13] = ff_avg_h264_qpel4_mc13_msa;
++            c->avg_h264_qpel_pixels_tab[2][14] = ff_avg_h264_qpel4_mc23_msa;
++            c->avg_h264_qpel_pixels_tab[2][15] = ff_avg_h264_qpel4_mc33_msa;
++        } 
++    }
+ }
+diff -uNra ffmpeg-4.1.6/libavcodec/mips/h264qpel_msa.c FFmpeg/libavcodec/mips/h264qpel_msa.c
+--- a/libavcodec/mips/h264qpel_msa.c	2020-07-05 06:36:01.000000000 +0800
++++ b/libavcodec/mips/h264qpel_msa.c	2020-07-19 18:13:57.462301239 +0800
+@@ -149,7 +149,7 @@
+ 
+     SAT_SH2_SH(out0, out1, 7);
+     out = PCKEV_XORI128_UB(out0, out1);
+-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, stride);
++    ST_W4(out, 0, 1, 2, 3, dst, stride);
+ }
+ 
+ static void avc_luma_hv_qrt_8x8_msa(const uint8_t *src_x, const uint8_t *src_y,
+@@ -220,7 +220,7 @@
+     SAT_SH4_SH(tmp0, tmp1, tmp2, tmp3, 7);
+     out0 = PCKEV_XORI128_UB(tmp0, tmp1);
+     out1 = PCKEV_XORI128_UB(tmp2, tmp3);
+-    ST8x4_UB(out0, out1, dst, stride);
++    ST_D4(out0, out1, 0, 1, 0, 1, dst, stride);
+     dst += (4 * stride);
+ 
+     LD_SB4(src_y, stride, src_vt9, src_vt10, src_vt11, src_vt12);
+@@ -256,8 +256,7 @@
+     SAT_SH4_SH(tmp0, tmp1, tmp2, tmp3, 7);
+     out0 = PCKEV_XORI128_UB(tmp0, tmp1);
+     out1 = PCKEV_XORI128_UB(tmp2, tmp3);
+-    ST8x4_UB(out0, out1, dst, stride);
+-    dst += (4 * stride);
++    ST_D4(out0, out1, 0, 1, 0, 1, dst, stride);
+ }
+ 
+ static void avc_luma_hv_qrt_16x16_msa(const uint8_t *src_x,
+@@ -337,7 +336,7 @@
+             SAT_SH4_SH(out0, out1, out2, out3, 7);
+             tmp0 = PCKEV_XORI128_UB(out0, out1);
+             tmp1 = PCKEV_XORI128_UB(out2, out3);
+-            ST8x4_UB(tmp0, tmp1, dst, stride);
++            ST_D4(tmp0, tmp1, 0, 1, 0, 1, dst, stride);
+             dst += (4 * stride);
+ 
+             src_vt0 = src_vt4;
+@@ -419,7 +418,7 @@
+     res = PCKEV_XORI128_UB(res0, res1);
+     dst0 = __msa_aver_u_b(res, dst0);
+ 
+-    ST4x4_UB(dst0, dst0, 0, 1, 2, 3, dst, stride);
++    ST_W4(dst0, 0, 1, 2, 3, dst, stride);
+ }
+ 
+ static void avc_luma_hv_qrt_and_aver_dst_8x8_msa(const uint8_t *src_x,
+@@ -498,7 +497,7 @@
+     out0 = PCKEV_XORI128_UB(tmp0, tmp1);
+     out1 = PCKEV_XORI128_UB(tmp2, tmp3);
+     AVER_UB2_UB(out0, dst0, out1, dst1, dst0, dst1);
+-    ST8x4_UB(dst0, dst1, dst, stride);
++    ST_D4(dst0, dst1, 0, 1, 0, 1, dst, stride);
+     dst += (4 * stride);
+ 
+     LD_SB4(src_y, stride, src_vt9, src_vt10, src_vt11, src_vt12);
+@@ -539,8 +538,7 @@
+     out0 = PCKEV_XORI128_UB(tmp0, tmp1);
+     out1 = PCKEV_XORI128_UB(tmp2, tmp3);
+     AVER_UB2_UB(out0, dst0, out1, dst1, dst0, dst1);
+-    ST8x4_UB(dst0, dst1, dst, stride);
+-    dst += (4 * stride);
++    ST_D4(dst0, dst1, 0, 1, 0, 1, dst, stride);
+ }
+ 
+ static void avc_luma_hv_qrt_and_aver_dst_16x16_msa(const uint8_t *src_x,
+@@ -627,7 +625,7 @@
+             tmp0 = PCKEV_XORI128_UB(out0, out1);
+             tmp1 = PCKEV_XORI128_UB(out2, out3);
+             AVER_UB2_UB(tmp0, dst0, tmp1, dst1, dst0, dst1);
+-            ST8x4_UB(dst0, dst1, dst, stride);
++            ST_D4(dst0, dst1, 0, 1, 0, 1, dst, stride);
+             dst += (4 * stride);
+ 
+             src_vt0 = src_vt4;
+@@ -723,7 +721,7 @@
+     AVER_UB4_UB(src0, dst0, src1, dst1, src2, dst2, src3, dst3, dst0, dst1,
+                 dst2, dst3);
+ 
+-    ST8x8_UB(dst0, dst1, dst2, dst3, dst, stride);
++    ST_D8(dst0, dst1, dst2, dst3, 0, 1, 0, 1, 0, 1, 0, 1, dst, stride);
+ }
+ 
+ void ff_avg_h264_qpel4_mc00_msa(uint8_t *dst, const uint8_t *src,
+@@ -739,7 +737,7 @@
+ 
+     dst0 = __msa_aver_u_b(src0, dst0);
+ 
+-    ST4x4_UB(dst0, dst0, 0, 1, 2, 3, dst, stride);
++    ST_W4(dst0, 0, 1, 2, 3, dst, stride);
+ }
+ 
+ void ff_put_h264_qpel16_mc10_msa(uint8_t *dst, const uint8_t *src,
+@@ -792,8 +790,8 @@
+                      minus5b, res4, res5, res6, res7);
+         DPADD_SB4_SH(vec2, vec5, vec8, vec11, plus20b, plus20b, plus20b,
+                      plus20b, res4, res5, res6, res7);
+-        SLDI_B2_SB(src1, src3, src0, src2, src0, src2, 2);
+-        SLDI_B2_SB(src5, src7, src4, src6, src4, src6, 2);
++        SLDI_B4_SB(src1, src0, src3, src2, src5, src4, src7, src6, 2,
++                   src0, src2, src4, src6);
+         SRARI_H4_SH(res0, res1, res2, res3, 5);
+         SRARI_H4_SH(res4, res5, res6, res7, 5);
+         SAT_SH4_SH(res0, res1, res2, res3, 7);
+@@ -860,8 +858,8 @@
+                      minus5b, res4, res5, res6, res7);
+         DPADD_SB4_SH(vec2, vec5, vec8, vec11, plus20b, plus20b, plus20b,
+                      plus20b, res4, res5, res6, res7);
+-        SLDI_B2_SB(src1, src3, src0, src2, src0, src2, 3);
+-        SLDI_B2_SB(src5, src7, src4, src6, src4, src6, 3);
++        SLDI_B4_SB(src1, src0, src3, src2, src5, src4, src7, src6, 3,
++                   src0, src2, src4, src6);
+         SRARI_H4_SH(res0, res1, res2, res3, 5);
+         SRARI_H4_SH(res4, res5, res6, res7, 5);
+         SAT_SH4_SH(res0, res1, res2, res3, 7);
+@@ -913,10 +911,10 @@
+     VSHF_B2_SB(src6, src6, src7, src7, mask2, mask2, vec10, vec11);
+     DPADD_SB4_SH(vec8, vec9, vec10, vec11, plus20b, plus20b, plus20b, plus20b,
+                  res4, res5, res6, res7);
+-    SLDI_B2_SB(src0, src1, src0, src1, src0, src1, 2);
+-    SLDI_B2_SB(src2, src3, src2, src3, src2, src3, 2);
+-    SLDI_B2_SB(src4, src5, src4, src5, src4, src5, 2);
+-    SLDI_B2_SB(src6, src7, src6, src7, src6, src7, 2);
++    SLDI_B4_SB(src0, src0, src1, src1, src2, src2, src3, src3, 2,
++               src0, src1, src2, src3);
++    SLDI_B4_SB(src4, src4, src5, src5, src6, src6, src7, src7, 2,
++               src4, src5, src6, src7);
+     PCKEV_D2_SB(src1, src0, src3, src2, src0, src1);
+     PCKEV_D2_SB(src5, src4, src7, src6, src4, src5);
+     SRARI_H4_SH(res0, res1, res2, res3, 5);
+@@ -930,7 +928,7 @@
+     tmp2 = __msa_aver_s_b(tmp2, src4);
+     tmp3 = __msa_aver_s_b(tmp3, src5);
+     XORI_B4_128_SB(tmp0, tmp1, tmp2, tmp3);
+-    ST8x8_UB(tmp0, tmp1, tmp2, tmp3, dst, stride);
++    ST_D8(tmp0, tmp1, tmp2, tmp3, 0, 1, 0, 1, 0, 1, 0, 1, dst, stride);
+ }
+ 
+ void ff_put_h264_qpel8_mc30_msa(uint8_t *dst, const uint8_t *src,
+@@ -968,10 +966,10 @@
+     VSHF_B2_SB(src6, src6, src7, src7, mask2, mask2, vec10, vec11);
+     DPADD_SB4_SH(vec8, vec9, vec10, vec11, plus20b, plus20b, plus20b, plus20b,
+                  res4, res5, res6, res7);
+-    SLDI_B2_SB(src0, src1, src0, src1, src0, src1, 3);
+-    SLDI_B2_SB(src2, src3, src2, src3, src2, src3, 3);
+-    SLDI_B2_SB(src4, src5, src4, src5, src4, src5, 3);
+-    SLDI_B2_SB(src6, src7, src6, src7, src6, src7, 3);
++    SLDI_B4_SB(src0, src0, src1, src1, src2, src2, src3, src3, 3,
++               src0, src1, src2, src3);
++    SLDI_B4_SB(src4, src4, src5, src5, src6, src6, src7, src7, 3,
++               src4, src5, src6, src7);
+     PCKEV_D2_SB(src1, src0, src3, src2, src0, src1);
+     PCKEV_D2_SB(src5, src4, src7, src6, src4, src5);
+     SRARI_H4_SH(res0, res1, res2, res3, 5);
+@@ -985,7 +983,7 @@
+     tmp2 = __msa_aver_s_b(tmp2, src4);
+     tmp3 = __msa_aver_s_b(tmp3, src5);
+     XORI_B4_128_SB(tmp0, tmp1, tmp2, tmp3);
+-    ST8x8_UB(tmp0, tmp1, tmp2, tmp3, dst, stride);
++    ST_D8(tmp0, tmp1, tmp2, tmp3, 0, 1, 0, 1, 0, 1, 0, 1, dst, stride);
+ }
+ 
+ void ff_put_h264_qpel4_mc10_msa(uint8_t *dst, const uint8_t *src,
+@@ -1009,14 +1007,14 @@
+     SRARI_H2_SH(res0, res1, 5);
+     SAT_SH2_SH(res0, res1, 7);
+     res = __msa_pckev_b((v16i8) res1, (v16i8) res0);
+-    SLDI_B2_SB(src0, src1, src0, src1, src0, src1, 2);
+-    SLDI_B2_SB(src2, src3, src2, src3, src2, src3, 2);
++    SLDI_B4_SB(src0, src0, src1, src1, src2, src2, src3, src3, 2,
++               src0, src1, src2, src3);
+     src0 = (v16i8) __msa_insve_w((v4i32) src0, 1, (v4i32) src1);
+     src1 = (v16i8) __msa_insve_w((v4i32) src2, 1, (v4i32) src3);
+     src0 = (v16i8) __msa_insve_d((v2i64) src0, 1, (v2i64) src1);
+     res = __msa_aver_s_b(res, src0);
+     res = (v16i8) __msa_xori_b((v16u8) res, 128);
+-    ST4x4_UB(res, res, 0, 1, 2, 3, dst, stride);
++    ST_W4(res, 0, 1, 2, 3, dst, stride);
+ }
+ 
+ void ff_put_h264_qpel4_mc30_msa(uint8_t *dst, const uint8_t *src,
+@@ -1040,14 +1038,14 @@
+     SRARI_H2_SH(res0, res1, 5);
+     SAT_SH2_SH(res0, res1, 7);
+     res = __msa_pckev_b((v16i8) res1, (v16i8) res0);
+-    SLDI_B2_SB(src0, src1, src0, src1, src0, src1, 3);
+-    SLDI_B2_SB(src2, src3, src2, src3, src2, src3, 3);
++    SLDI_B4_SB(src0, src0, src1, src1, src2, src2, src3, src3, 3,
++               src0, src1, src2, src3);
+     src0 = (v16i8) __msa_insve_w((v4i32) src0, 1, (v4i32) src1);
+     src1 = (v16i8) __msa_insve_w((v4i32) src2, 1, (v4i32) src3);
+     src0 = (v16i8) __msa_insve_d((v2i64) src0, 1, (v2i64) src1);
+     res = __msa_aver_s_b(res, src0);
+     res = (v16i8) __msa_xori_b((v16u8) res, 128);
+-    ST4x4_UB(res, res, 0, 1, 2, 3, dst, stride);
++    ST_W4(res, 0, 1, 2, 3, dst, stride);
+ }
+ 
+ void ff_put_h264_qpel16_mc20_msa(uint8_t *dst, const uint8_t *src,
+@@ -1153,7 +1151,7 @@
+     out1 = PCKEV_XORI128_UB(res2, res3);
+     out2 = PCKEV_XORI128_UB(res4, res5);
+     out3 = PCKEV_XORI128_UB(res6, res7);
+-    ST8x8_UB(out0, out1, out2, out3, dst, stride);
++    ST_D8(out0, out1, out2, out3, 0, 1, 0, 1, 0, 1, 0, 1, dst, stride);
+ }
+ 
+ void ff_put_h264_qpel4_mc20_msa(uint8_t *dst, const uint8_t *src,
+@@ -1178,7 +1176,7 @@
+     SRARI_H2_SH(res0, res1, 5);
+     SAT_SH2_SH(res0, res1, 7);
+     out = PCKEV_XORI128_UB(res0, res1);
+-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, stride);
++    ST_W4(out, 0, 1, 2, 3, dst, stride);
+ }
+ 
+ void ff_put_h264_qpel16_mc01_msa(uint8_t *dst, const uint8_t *src,
+@@ -1378,7 +1376,7 @@
+     out2 = __msa_aver_s_b(out2, tmp2);
+     out3 = __msa_aver_s_b(out3, tmp3);
+     XORI_B4_128_SB(out0, out1, out2, out3);
+-    ST8x8_UB(out0, out1, out2, out3, dst, stride);
++    ST_D8(out0, out1, out2, out3, 0, 1, 0, 1, 0, 1, 0, 1, dst, stride);
+ }
+ 
+ void ff_put_h264_qpel8_mc03_msa(uint8_t *dst, const uint8_t *src,
+@@ -1431,7 +1429,7 @@
+     out2 = __msa_aver_s_b(out2, tmp2);
+     out3 = __msa_aver_s_b(out3, tmp3);
+     XORI_B4_128_SB(out0, out1, out2, out3);
+-    ST8x8_UB(out0, out1, out2, out3, dst, stride);
++    ST_D8(out0, out1, out2, out3, 0, 1, 0, 1, 0, 1, 0, 1, dst, stride);
+ }
+ 
+ void ff_put_h264_qpel4_mc01_msa(uint8_t *dst, const uint8_t *src,
+@@ -1472,7 +1470,7 @@
+     src54_r = (v16i8) __msa_insve_w((v4i32) src4, 1, (v4i32) src5);
+     src32_r = (v16i8) __msa_insve_d((v2i64) src32_r, 1, (v2i64) src54_r);
+     out = __msa_aver_u_b(out, (v16u8) src32_r);
+-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, stride);
++    ST_W4(out, 0, 1, 2, 3, dst, stride);
+ }
+ 
+ void ff_put_h264_qpel4_mc03_msa(uint8_t *dst, const uint8_t *src,
+@@ -1513,7 +1511,7 @@
+     src54_r = (v16i8) __msa_insve_w((v4i32) src5, 1, (v4i32) src6);
+     src32_r = (v16i8) __msa_insve_d((v2i64) src32_r, 1, (v2i64) src54_r);
+     out = __msa_aver_u_b(out, (v16u8) src32_r);
+-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, stride);
++    ST_W4(out, 0, 1, 2, 3, dst, stride);
+ }
+ 
+ void ff_put_h264_qpel16_mc11_msa(uint8_t *dst, const uint8_t *src,
+@@ -1691,7 +1689,7 @@
+ 
+             out0 = PCKEV_XORI128_UB(dst0, dst1);
+             out1 = PCKEV_XORI128_UB(dst2, dst3);
+-            ST8x4_UB(out0, out1, dst, stride);
++            ST_D4(out0, out1, 0, 1, 0, 1, dst, stride);
+             dst += (4 * stride);
+ 
+             hz_out0 = hz_out4;
+@@ -1804,7 +1802,7 @@
+ 
+             out0 = PCKEV_XORI128_UB(dst0, dst1);
+             out1 = PCKEV_XORI128_UB(dst2, dst3);
+-            ST8x4_UB(out0, out1, dst, stride);
++            ST_D4(out0, out1, 0, 1, 0, 1, dst, stride);
+             dst += (4 * stride);
+ 
+             hz_out0 = hz_out4;
+@@ -1905,7 +1903,7 @@
+ 
+     out0 = PCKEV_XORI128_UB(dst0, dst1);
+     out1 = PCKEV_XORI128_UB(dst2, dst3);
+-    ST8x4_UB(out0, out1, dst, stride);
++    ST_D4(out0, out1, 0, 1, 0, 1, dst, stride);
+     dst += (4 * stride);
+ 
+     LD_SB4(src, stride, src9, src10, src11, src12);
+@@ -1951,7 +1949,7 @@
+ 
+     out0 = PCKEV_XORI128_UB(dst0, dst1);
+     out1 = PCKEV_XORI128_UB(dst2, dst3);
+-    ST8x4_UB(out0, out1, dst, stride);
++    ST_D4(out0, out1, 0, 1, 0, 1, dst, stride);
+ }
+ 
+ void ff_put_h264_qpel8_mc23_msa(uint8_t *dst, const uint8_t *src,
+@@ -2040,7 +2038,7 @@
+ 
+     out0 = PCKEV_XORI128_UB(dst0, dst1);
+     out1 = PCKEV_XORI128_UB(dst2, dst3);
+-    ST8x4_UB(out0, out1, dst, stride);
++    ST_D4(out0, out1, 0, 1, 0, 1, dst, stride);
+     dst += (4 * stride);
+ 
+     LD_SB4(src, stride, src9, src10, src11, src12);
+@@ -2086,7 +2084,7 @@
+ 
+     out0 = PCKEV_XORI128_UB(dst0, dst1);
+     out1 = PCKEV_XORI128_UB(dst2, dst3);
+-    ST8x4_UB(out0, out1, dst, stride);
++    ST_D4(out0, out1, 0, 1, 0, 1, dst, stride);
+ }
+ 
+ void ff_put_h264_qpel4_mc21_msa(uint8_t *dst, const uint8_t *src,
+@@ -2150,7 +2148,7 @@
+     dst1 = __msa_aver_s_h(dst1, hz_out4);
+ 
+     res = PCKEV_XORI128_UB(dst0, dst1);
+-    ST4x4_UB(res, res, 0, 1, 2, 3, dst, stride);
++    ST_W4(res, 0, 1, 2, 3, dst, stride);
+ }
+ 
+ void ff_put_h264_qpel4_mc23_msa(uint8_t *dst, const uint8_t *src,
+@@ -2215,7 +2213,7 @@
+     dst1 = __msa_aver_s_h(dst1, hz_out1);
+ 
+     res = PCKEV_XORI128_UB(dst0, dst1);
+-    ST4x4_UB(res, res, 0, 1, 2, 3, dst, stride);
++    ST_W4(res, 0, 1, 2, 3, dst, stride);
+ }
+ 
+ void ff_put_h264_qpel16_mc02_msa(uint8_t *dst, const uint8_t *src,
+@@ -2332,7 +2330,7 @@
+     out1 = PCKEV_XORI128_UB(out2_r, out3_r);
+     out2 = PCKEV_XORI128_UB(out4_r, out5_r);
+     out3 = PCKEV_XORI128_UB(out6_r, out7_r);
+-    ST8x8_UB(out0, out1, out2, out3, dst, stride);
++    ST_D8(out0, out1, out2, out3, 0, 1, 0, 1, 0, 1, 0, 1, dst, stride);
+ }
+ 
+ void ff_put_h264_qpel4_mc02_msa(uint8_t *dst, const uint8_t *src,
+@@ -2369,7 +2367,7 @@
+     SRARI_H2_SH(out10, out32, 5);
+     SAT_SH2_SH(out10, out32, 7);
+     out = PCKEV_XORI128_UB(out10, out32);
+-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, stride);
++    ST_W4(out, 0, 1, 2, 3, dst, stride);
+ }
+ 
+ void ff_put_h264_qpel16_mc12_msa(uint8_t *dst, const uint8_t *src,
+@@ -2601,7 +2599,7 @@
+         dst0 = __msa_aver_s_h(dst2, dst0);
+         dst1 = __msa_aver_s_h(dst3, dst1);
+         out = PCKEV_XORI128_UB(dst0, dst1);
+-        ST8x2_UB(out, dst, stride);
++        ST_D2(out, 0, 1, dst, stride);
+         dst += (2 * stride);
+ 
+         src0 = src2;
+@@ -2677,7 +2675,7 @@
+         dst0 = __msa_aver_s_h(dst2, dst0);
+         dst1 = __msa_aver_s_h(dst3, dst1);
+         out = PCKEV_XORI128_UB(dst0, dst1);
+-        ST8x2_UB(out, dst, stride);
++        ST_D2(out, 0, 1, dst, stride);
+         dst += (2 * stride);
+ 
+         src0 = src2;
+@@ -2777,7 +2775,7 @@
+ 
+     PCKEV_H2_SH(hz_res1, hz_res0, hz_res3, hz_res2, dst0, dst2);
+     out = PCKEV_XORI128_UB(dst0, dst2);
+-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, stride);
++    ST_W4(out, 0, 1, 2, 3, dst, stride);
+ }
+ 
+ void ff_put_h264_qpel4_mc32_msa(uint8_t *dst, const uint8_t *src,
+@@ -2873,7 +2871,7 @@
+ 
+     PCKEV_H2_SH(hz_res1, hz_res0, hz_res3, hz_res2, dst0, dst2);
+     out = PCKEV_XORI128_UB(dst0, dst2);
+-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, stride);
++    ST_W4(out, 0, 1, 2, 3, dst, stride);
+ }
+ 
+ void ff_put_h264_qpel16_mc22_msa(uint8_t *dst, const uint8_t *src,
+@@ -2961,7 +2959,7 @@
+ 
+             out0 = PCKEV_XORI128_UB(dst0, dst1);
+             out1 = PCKEV_XORI128_UB(dst2, dst3);
+-            ST8x4_UB(out0, out1, dst, stride);
++            ST_D4(out0, out1, 0, 1, 0, 1, dst, stride);
+             dst += (4 * stride);
+ 
+             hz_out0 = hz_out4;
+@@ -3049,7 +3047,7 @@
+     dst3 = __msa_pckev_h((v8i16) tmp1, (v8i16) tmp0);
+     out0 = PCKEV_XORI128_UB(dst0, dst1);
+     out1 = PCKEV_XORI128_UB(dst2, dst3);
+-    ST8x4_UB(out0, out1, dst, stride);
++    ST_D4(out0, out1, 0, 1, 0, 1, dst, stride);
+     dst += (4 * stride);
+ 
+     LD_SB4(src, stride, src0, src1, src2, src3);
+@@ -3086,7 +3084,7 @@
+     dst3 = __msa_pckev_h((v8i16) tmp1, (v8i16) tmp0);
+     out0 = PCKEV_XORI128_UB(dst0, dst1);
+     out1 = PCKEV_XORI128_UB(dst2, dst3);
+-    ST8x4_UB(out0, out1, dst, stride);
++    ST_D4(out0, out1, 0, 1, 0, 1, dst, stride);
+ }
+ 
+ void ff_put_h264_qpel4_mc22_msa(uint8_t *dst, const uint8_t *src,
+@@ -3141,7 +3139,7 @@
+                           filt2);
+     dst1 = __msa_pckev_h((v8i16) tmp1, (v8i16) tmp0);
+     res = PCKEV_XORI128_UB(dst0, dst1);
+-    ST4x4_UB(res, res, 0, 1, 2, 3, dst, stride);
++    ST_W4(res, 0, 1, 2, 3, dst, stride);
+ }
+ 
+ void ff_avg_h264_qpel16_mc10_msa(uint8_t *dst, const uint8_t *src,
+@@ -3196,8 +3194,8 @@
+                      minus5b, res4, res5, res6, res7);
+         DPADD_SB4_SH(vec2, vec5, vec8, vec11, plus20b, plus20b, plus20b,
+                      plus20b, res4, res5, res6, res7);
+-        SLDI_B2_SB(src1, src3, src0, src2, src0, src2, 2);
+-        SLDI_B2_SB(src5, src7, src4, src6, src4, src6, 2);
++        SLDI_B4_SB(src1, src0, src3, src2, src5, src4, src7, src6, 2,
++                   src0, src2, src4, src6);
+         SRARI_H4_SH(res0, res1, res2, res3, 5);
+         SRARI_H4_SH(res4, res5, res6, res7, 5);
+         SAT_SH4_SH(res0, res1, res2, res3, 7);
+@@ -3268,8 +3266,8 @@
+                      minus5b, res4, res5, res6, res7);
+         DPADD_SB4_SH(vec2, vec5, vec8, vec11, plus20b, plus20b, plus20b,
+                      plus20b, res4, res5, res6, res7);
+-        SLDI_B2_SB(src1, src3, src0, src2, src0, src2, 3);
+-        SLDI_B2_SB(src5, src7, src4, src6, src4, src6, 3);
++        SLDI_B4_SB(src1, src0, src3, src2, src5, src4, src7, src6, 3,
++                   src0, src2, src4, src6);
+         SRARI_H4_SH(res0, res1, res2, res3, 5);
+         SRARI_H4_SH(res4, res5, res6, res7, 5);
+         SAT_SH4_SH(res0, res1, res2, res3, 7);
+@@ -3325,10 +3323,10 @@
+     VSHF_B2_SB(src6, src6, src7, src7, mask2, mask2, vec10, vec11);
+     DPADD_SB4_SH(vec8, vec9, vec10, vec11, plus20b, plus20b, plus20b, plus20b,
+                  res4, res5, res6, res7);
+-    SLDI_B2_SB(src0, src1, src0, src1, src0, src1, 2);
+-    SLDI_B2_SB(src2, src3, src2, src3, src2, src3, 2);
+-    SLDI_B2_SB(src4, src5, src4, src5, src4, src5, 2);
+-    SLDI_B2_SB(src6, src7, src6, src7, src6, src7, 2);
++    SLDI_B4_SB(src0, src0, src1, src1, src2, src2, src3, src3, 2,
++               src0, src1, src2, src3);
++    SLDI_B4_SB(src4, src4, src5, src5, src6, src6, src7, src7, 2,
++               src4, src5, src6, src7);
+     PCKEV_D2_SB(src1, src0, src3, src2, src0, src1);
+     PCKEV_D2_SB(src5, src4, src7, src6, src4, src5);
+     SRARI_H4_SH(res0, res1, res2, res3, 5);
+@@ -3350,7 +3348,7 @@
+     INSERT_D2_UB(tp2, tp3, dst3);
+     AVER_UB2_UB(tmp0, dst0, tmp1, dst1, dst0, dst1);
+     AVER_UB2_UB(tmp2, dst2, tmp3, dst3, dst2, dst3);
+-    ST8x8_UB(dst0, dst1, dst2, dst3, dst, stride);
++    ST_D8(dst0, dst1, dst2, dst3, 0, 1, 0, 1, 0, 1, 0, 1, dst, stride);
+ }
+ 
+ void ff_avg_h264_qpel8_mc30_msa(uint8_t *dst, const uint8_t *src,
+@@ -3390,10 +3388,10 @@
+     VSHF_B2_SB(src6, src6, src7, src7, mask2, mask2, vec10, vec11);
+     DPADD_SB4_SH(vec8, vec9, vec10, vec11, plus20b, plus20b, plus20b, plus20b,
+                  res4, res5, res6, res7);
+-    SLDI_B2_SB(src0, src1, src0, src1, src0, src1, 3);
+-    SLDI_B2_SB(src2, src3, src2, src3, src2, src3, 3);
+-    SLDI_B2_SB(src4, src5, src4, src5, src4, src5, 3);
+-    SLDI_B2_SB(src6, src7, src6, src7, src6, src7, 3);
++    SLDI_B4_SB(src0, src0, src1, src1, src2, src2, src3, src3, 3,
++               src0, src1, src2, src3);
++    SLDI_B4_SB(src4, src4, src5, src5, src6, src6, src7, src7, 3,
++               src4, src5, src6, src7);
+     PCKEV_D2_SB(src1, src0, src3, src2, src0, src1);
+     PCKEV_D2_SB(src5, src4, src7, src6, src4, src5);
+     SRARI_H4_SH(res0, res1, res2, res3, 5);
+@@ -3415,7 +3413,7 @@
+     INSERT_D2_UB(tp2, tp3, dst3);
+     AVER_UB2_UB(tmp0, dst0, tmp1, dst1, dst0, dst1);
+     AVER_UB2_UB(tmp2, dst2, tmp3, dst3, dst2, dst3);
+-    ST8x8_UB(dst0, dst1, dst2, dst3, dst, stride);
++    ST_D8(dst0, dst1, dst2, dst3, 0, 1, 0, 1, 0, 1, 0, 1, dst, stride);
+ }
+ 
+ void ff_avg_h264_qpel4_mc10_msa(uint8_t *dst, const uint8_t *src,
+@@ -3441,8 +3439,8 @@
+     SRARI_H2_SH(out0, out1, 5);
+     SAT_SH2_SH(out0, out1, 7);
+     res = __msa_pckev_b((v16i8) out1, (v16i8) out0);
+-    SLDI_B2_SB(src0, src1, src0, src1, src0, src1, 2);
+-    SLDI_B2_SB(src2, src3, src2, src3, src2, src3, 2);
++    SLDI_B4_SB(src0, src0, src1, src1, src2, src2, src3, src3, 2,
++               src0, src1, src2, src3);
+     src0 = (v16i8) __msa_insve_w((v4i32) src0, 1, (v4i32) src1);
+     src1 = (v16i8) __msa_insve_w((v4i32) src2, 1, (v4i32) src3);
+     src0 = (v16i8) __msa_insve_d((v2i64) src0, 1, (v2i64) src1);
+@@ -3451,7 +3449,7 @@
+     LW4(dst, stride, tp0, tp1, tp2, tp3);
+     INSERT_W4_UB(tp0, tp1, tp2, tp3, dst0);
+     dst0 = __msa_aver_u_b((v16u8) res, dst0);
+-    ST4x4_UB(dst0, dst0, 0, 1, 2, 3, dst, stride);
++    ST_W4(dst0, 0, 1, 2, 3, dst, stride);
+ }
+ 
+ void ff_avg_h264_qpel4_mc30_msa(uint8_t *dst, const uint8_t *src,
+@@ -3477,8 +3475,8 @@
+     SRARI_H2_SH(out0, out1, 5);
+     SAT_SH2_SH(out0, out1, 7);
+     res = __msa_pckev_b((v16i8) out1, (v16i8) out0);
+-    SLDI_B2_SB(src0, src1, src0, src1, src0, src1, 3);
+-    SLDI_B2_SB(src2, src3, src2, src3, src2, src3, 3);
++    SLDI_B4_SB(src0, src0, src1, src1, src2, src2, src3, src3, 3,
++               src0, src1, src2, src3);
+     src0 = (v16i8) __msa_insve_w((v4i32) src0, 1, (v4i32) src1);
+     src1 = (v16i8) __msa_insve_w((v4i32) src2, 1, (v4i32) src3);
+     src0 = (v16i8) __msa_insve_d((v2i64) src0, 1, (v2i64) src1);
+@@ -3487,7 +3485,7 @@
+     LW4(dst, stride, tp0, tp1, tp2, tp3);
+     INSERT_W4_UB(tp0, tp1, tp2, tp3, dst0);
+     dst0 = __msa_aver_u_b((v16u8) res, dst0);
+-    ST4x4_UB(dst0, dst0, 0, 1, 2, 3, dst, stride);
++    ST_W4(dst0, 0, 1, 2, 3, dst, stride);
+ }
+ 
+ void ff_avg_h264_qpel16_mc20_msa(uint8_t *dst, const uint8_t *src,
+@@ -3608,7 +3606,7 @@
+     INSERT_D2_UB(tp2, tp3, out7);
+     AVER_UB2_UB(out0, out2, out1, out3, out0, out1);
+     AVER_UB2_UB(out4, out6, out5, out7, out4, out5);
+-    ST8x8_UB(out0, out1, out4, out5, dst, stride);
++    ST_D8(out0, out1, out4, out5, 0, 1, 0, 1, 0, 1, 0, 1, dst, stride);
+ }
+ 
+ void ff_avg_h264_qpel4_mc20_msa(uint8_t *dst, const uint8_t *src,
+@@ -3637,7 +3635,7 @@
+     LW4(dst, stride, tp0, tp1, tp2, tp3);
+     INSERT_W4_UB(tp0, tp1, tp2, tp3, dst0);
+     res = __msa_aver_u_b(res, dst0);
+-    ST4x4_UB(res, res, 0, 1, 2, 3, dst, stride);
++    ST_W4(res, 0, 1, 2, 3, dst, stride);
+ }
+ 
+ void ff_avg_h264_qpel16_mc01_msa(uint8_t *dst, const uint8_t *src,
+@@ -3856,7 +3854,7 @@
+     XORI_B4_128_SB(out0, out1, out2, out3);
+     AVER_UB4_UB(out0, dst0, out1, dst1, out2, dst2, out3, dst3, dst0, dst1,
+                 dst2, dst3);
+-    ST8x8_UB(dst0, dst1, dst2, dst3, dst, stride);
++    ST_D8(dst0, dst1, dst2, dst3, 0, 1, 0, 1, 0, 1, 0, 1, dst, stride);
+ }
+ 
+ void ff_avg_h264_qpel8_mc03_msa(uint8_t *dst, const uint8_t *src,
+@@ -3922,7 +3920,7 @@
+     XORI_B4_128_SB(out0, out1, out2, out3);
+     AVER_UB4_UB(out0, dst0, out1, dst1, out2, dst2, out3, dst3, dst0, dst1,
+                 dst2, dst3);
+-    ST8x8_UB(dst0, dst1, dst2, dst3, dst, stride);
++    ST_D8(dst0, dst1, dst2, dst3, 0, 1, 0, 1, 0, 1, 0, 1, dst, stride);
+ }
+ 
+ void ff_avg_h264_qpel4_mc01_msa(uint8_t *dst, const uint8_t *src,
+@@ -3967,7 +3965,7 @@
+     res = PCKEV_XORI128_UB(out10, out32);
+     res = __msa_aver_u_b(res, (v16u8) src32_r);
+     dst0 = __msa_aver_u_b(res, dst0);
+-    ST4x4_UB(dst0, dst0, 0, 1, 2, 3, dst, stride);
++    ST_W4(dst0, 0, 1, 2, 3, dst, stride);
+ }
+ 
+ void ff_avg_h264_qpel4_mc03_msa(uint8_t *dst, const uint8_t *src,
+@@ -4013,7 +4011,7 @@
+     src32_r = (v16i8) __msa_insve_d((v2i64) src32_r, 1, (v2i64) src54_r);
+     res = __msa_aver_u_b(res, (v16u8) src32_r);
+     dst0 = __msa_aver_u_b(res, dst0);
+-    ST4x4_UB(dst0, dst0, 0, 1, 2, 3, dst, stride);
++    ST_W4(dst0, 0, 1, 2, 3, dst, stride);
+ }
+ 
+ void ff_avg_h264_qpel16_mc11_msa(uint8_t *dst, const uint8_t *src,
+@@ -4196,7 +4194,7 @@
+ 
+             out0 = PCKEV_XORI128_UB(tmp0, tmp1);
+             dst0 = __msa_aver_u_b(out0, dst0);
+-            ST8x2_UB(dst0, dst, stride);
++            ST_D2(dst0, 0, 1, dst, stride);
+             dst += (2 * stride);
+ 
+             LD_SB2(src, stride, src7, src8);
+@@ -4232,7 +4230,7 @@
+ 
+             out1 = PCKEV_XORI128_UB(tmp2, tmp3);
+             dst1 = __msa_aver_u_b(out1, dst1);
+-            ST8x2_UB(dst1, dst, stride);
++            ST_D2(dst1, 0, 1, dst, stride);
+             dst += (2 * stride);
+ 
+             hz_out0 = hz_out4;
+@@ -4326,7 +4324,7 @@
+             INSERT_D2_UB(tp0, tp1, dst0);
+             out0 = PCKEV_XORI128_UB(tmp0, tmp1);
+             dst0 = __msa_aver_u_b(out0, dst0);
+-            ST8x2_UB(dst0, dst, stride);
++            ST_D2(dst0, 0, 1, dst, stride);
+             dst += (2 * stride);
+ 
+             LD_SB2(src, stride, src7, src8);
+@@ -4361,7 +4359,7 @@
+             INSERT_D2_UB(tp2, tp3, dst1);
+             out1 = PCKEV_XORI128_UB(tmp2, tmp3);
+             dst1 = __msa_aver_u_b(out1, dst1);
+-            ST8x2_UB(dst1, dst, stride);
++            ST_D2(dst1, 0, 1, dst, stride);
+             dst += (2 * stride);
+ 
+             hz_out0 = hz_out4;
+@@ -4468,7 +4466,7 @@
+     out0 = PCKEV_XORI128_UB(tmp0, tmp1);
+     out1 = PCKEV_XORI128_UB(tmp2, tmp3);
+     AVER_UB2_UB(out0, dst0, out1, dst1, dst0, dst1);
+-    ST8x4_UB(dst0, dst1, dst, stride);
++    ST_D4(dst0, dst1, 0, 1, 0, 1, dst, stride);
+     dst += (4 * stride);
+ 
+     LD_SB4(src, stride, src9, src10, src11, src12);
+@@ -4519,7 +4517,7 @@
+     out0 = PCKEV_XORI128_UB(tmp0, tmp1);
+     out1 = PCKEV_XORI128_UB(tmp2, tmp3);
+     AVER_UB2_UB(out0, dst0, out1, dst1, dst0, dst1);
+-    ST8x4_UB(dst0, dst1, dst, stride);
++    ST_D4(dst0, dst1, 0, 1, 0, 1, dst, stride);
+ }
+ 
+ void ff_avg_h264_qpel8_mc23_msa(uint8_t *dst, const uint8_t *src,
+@@ -4614,7 +4612,7 @@
+     out0 = PCKEV_XORI128_UB(tmp0, tmp1);
+     out1 = PCKEV_XORI128_UB(tmp2, tmp3);
+     AVER_UB2_UB(out0, dst0, out1, dst1, dst0, dst1);
+-    ST8x4_UB(dst0, dst1, dst, stride);
++    ST_D4(dst0, dst1, 0, 1, 0, 1, dst, stride);
+     dst += (4 * stride);
+ 
+     LD_SB4(src, stride, src9, src10, src11, src12);
+@@ -4665,7 +4663,7 @@
+     out0 = PCKEV_XORI128_UB(tmp0, tmp1);
+     out1 = PCKEV_XORI128_UB(tmp2, tmp3);
+     AVER_UB2_UB(out0, dst0, out1, dst1, dst0, dst1);
+-    ST8x4_UB(dst0, dst1, dst, stride);
++    ST_D4(dst0, dst1, 0, 1, 0, 1, dst, stride);
+ }
+ 
+ void ff_avg_h264_qpel4_mc21_msa(uint8_t *dst, const uint8_t *src,
+@@ -4732,7 +4730,7 @@
+     INSERT_W4_UB(tp0, tp1, tp2, tp3, out);
+     res = PCKEV_XORI128_UB(dst0, dst1);
+     res = __msa_aver_u_b(res, out);
+-    ST4x4_UB(res, res, 0, 1, 2, 3, dst, stride);
++    ST_W4(res, 0, 1, 2, 3, dst, stride);
+ }
+ 
+ void ff_avg_h264_qpel4_mc23_msa(uint8_t *dst, const uint8_t *src,
+@@ -4800,7 +4798,7 @@
+     INSERT_W4_UB(tp0, tp1, tp2, tp3, out);
+     res = PCKEV_XORI128_UB(dst0, dst1);
+     res = __msa_aver_u_b(res, out);
+-    ST4x4_UB(res, res, 0, 1, 2, 3, dst, stride);
++    ST_W4(res, 0, 1, 2, 3, dst, stride);
+ }
+ 
+ void ff_avg_h264_qpel16_mc02_msa(uint8_t *dst, const uint8_t *src,
+@@ -4936,7 +4934,7 @@
+     out3 = PCKEV_XORI128_UB(out6_r, out7_r);
+     AVER_UB4_UB(out0, dst0, out1, dst1, out2, dst2, out3, dst3, dst0, dst1,
+                 dst2, dst3);
+-    ST8x8_UB(dst0, dst1, dst2, dst3, dst, stride);
++    ST_D8(dst0, dst1, dst2, dst3, 0, 1, 0, 1, 0, 1, 0, 1, dst, stride);
+ }
+ 
+ void ff_avg_h264_qpel4_mc02_msa(uint8_t *dst, const uint8_t *src,
+@@ -4977,7 +4975,7 @@
+     INSERT_W4_UB(tp0, tp1, tp2, tp3, dst0);
+     res = PCKEV_XORI128_UB(out10, out32);
+     dst0 = __msa_aver_u_b(res, dst0);
+-    ST4x4_UB(dst0, dst0, 0, 1, 2, 3, dst, stride);
++    ST_W4(dst0, 0, 1, 2, 3, dst, stride);
+ }
+ 
+ void ff_avg_h264_qpel16_mc12_msa(uint8_t *dst, const uint8_t *src,
+@@ -5217,7 +5215,7 @@
+         tmp1 = __msa_aver_s_h(tmp3, tmp1);
+         out = PCKEV_XORI128_UB(tmp0, tmp1);
+         out = __msa_aver_u_b(out, dst0);
+-        ST8x2_UB(out, dst, stride);
++        ST_D2(out, 0, 1, dst, stride);
+         dst += (2 * stride);
+ 
+         src0 = src2;
+@@ -5297,7 +5295,7 @@
+         tmp1 = __msa_aver_s_h(tmp3, tmp1);
+         out = PCKEV_XORI128_UB(tmp0, tmp1);
+         out = __msa_aver_u_b(out, dst0);
+-        ST8x2_UB(out, dst, stride);
++        ST_D2(out, 0, 1, dst, stride);
+         dst += (2 * stride);
+ 
+         src0 = src2;
+@@ -5401,7 +5399,7 @@
+     PCKEV_H2_SH(hz_res1, hz_res0, hz_res3, hz_res2, dst0, dst2);
+     out = PCKEV_XORI128_UB(dst0, dst2);
+     out = __msa_aver_u_b(out, dstv);
+-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, stride);
++    ST_W4(out, 0, 1, 2, 3, dst, stride);
+ }
+ 
+ void ff_avg_h264_qpel4_mc32_msa(uint8_t *dst, const uint8_t *src,
+@@ -5500,7 +5498,7 @@
+     PCKEV_H2_SH(hz_res1, hz_res0, hz_res3, hz_res2, dst0, dst2);
+     out = PCKEV_XORI128_UB(dst0, dst2);
+     out = __msa_aver_u_b(out, dstv);
+-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, stride);
++    ST_W4(out, 0, 1, 2, 3, dst, stride);
+ }
+ 
+ void ff_avg_h264_qpel16_mc22_msa(uint8_t *dst, const uint8_t *src,
+@@ -5592,7 +5590,7 @@
+             out0 = PCKEV_XORI128_UB(res0, res1);
+             out1 = PCKEV_XORI128_UB(res2, res3);
+             AVER_UB2_UB(out0, dst0, out1, dst1, out0, out1);
+-            ST8x4_UB(out0, out1, dst, stride);
++            ST_D4(out0, out1, 0, 1, 0, 1, dst, stride);
+             dst += (4 * stride);
+ 
+             hz_out0 = hz_out4;
+@@ -5685,7 +5683,7 @@
+     out0 = PCKEV_XORI128_UB(res0, res1);
+     out1 = PCKEV_XORI128_UB(res2, res3);
+     AVER_UB2_UB(out0, dst0, out1, dst1, dst0, dst1);
+-    ST8x4_UB(dst0, dst1, dst, stride);
++    ST_D4(dst0, dst1, 0, 1, 0, 1, dst, stride);
+     dst += (4 * stride);
+ 
+     LD_SB4(src, stride, src0, src1, src2, src3);
+@@ -5726,7 +5724,7 @@
+     out0 = PCKEV_XORI128_UB(res0, res1);
+     out1 = PCKEV_XORI128_UB(res2, res3);
+     AVER_UB2_UB(out0, dst0, out1, dst1, dst0, dst1);
+-    ST8x4_UB(dst0, dst1, dst, stride);
++    ST_D4(dst0, dst1, 0, 1, 0, 1, dst, stride);
+ }
+ 
+ void ff_avg_h264_qpel4_mc22_msa(uint8_t *dst, const uint8_t *src,
+@@ -5785,5 +5783,5 @@
+     INSERT_W4_UB(tp0, tp1, tp2, tp3, dst0);
+     res = PCKEV_XORI128_UB(res0, res1);
+     res = __msa_aver_u_b(res, dst0);
+-    ST4x4_UB(res, res, 0, 1, 2, 3, dst, stride);
++    ST_W4(res, 0, 1, 2, 3, dst, stride);
+ }
+diff -uNra ffmpeg-4.1.6/libavcodec/mips/hevcdsp_init_mips.c FFmpeg/libavcodec/mips/hevcdsp_init_mips.c
+--- a/libavcodec/mips/hevcdsp_init_mips.c	2020-07-03 23:10:59.000000000 +0800
++++ b/libavcodec/mips/hevcdsp_init_mips.c	2020-07-19 18:19:52.760181959 +0800
+@@ -18,437 +18,500 @@
+  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+  */
+ 
++#include "libavutil/mips/cpu.h"
+ #include "libavcodec/mips/hevcdsp_mips.h"
+ 
+-#if HAVE_MSA
+-static av_cold void hevc_dsp_init_msa(HEVCDSPContext *c,
+-                                      const int bit_depth)
++void ff_hevc_dsp_init_mips(HEVCDSPContext *c, const int bit_depth)
+ {
+-    if (8 == bit_depth) {
+-        c->put_hevc_qpel[1][0][0] = ff_hevc_put_hevc_pel_pixels4_8_msa;
+-        c->put_hevc_qpel[2][0][0] = ff_hevc_put_hevc_pel_pixels6_8_msa;
+-        c->put_hevc_qpel[3][0][0] = ff_hevc_put_hevc_pel_pixels8_8_msa;
+-        c->put_hevc_qpel[4][0][0] = ff_hevc_put_hevc_pel_pixels12_8_msa;
+-        c->put_hevc_qpel[5][0][0] = ff_hevc_put_hevc_pel_pixels16_8_msa;
+-        c->put_hevc_qpel[6][0][0] = ff_hevc_put_hevc_pel_pixels24_8_msa;
+-        c->put_hevc_qpel[7][0][0] = ff_hevc_put_hevc_pel_pixels32_8_msa;
+-        c->put_hevc_qpel[8][0][0] = ff_hevc_put_hevc_pel_pixels48_8_msa;
+-        c->put_hevc_qpel[9][0][0] = ff_hevc_put_hevc_pel_pixels64_8_msa;
+-
+-        c->put_hevc_qpel[1][0][1] = ff_hevc_put_hevc_qpel_h4_8_msa;
+-        c->put_hevc_qpel[3][0][1] = ff_hevc_put_hevc_qpel_h8_8_msa;
+-        c->put_hevc_qpel[4][0][1] = ff_hevc_put_hevc_qpel_h12_8_msa;
+-        c->put_hevc_qpel[5][0][1] = ff_hevc_put_hevc_qpel_h16_8_msa;
+-        c->put_hevc_qpel[6][0][1] = ff_hevc_put_hevc_qpel_h24_8_msa;
+-        c->put_hevc_qpel[7][0][1] = ff_hevc_put_hevc_qpel_h32_8_msa;
+-        c->put_hevc_qpel[8][0][1] = ff_hevc_put_hevc_qpel_h48_8_msa;
+-        c->put_hevc_qpel[9][0][1] = ff_hevc_put_hevc_qpel_h64_8_msa;
+-
+-        c->put_hevc_qpel[1][1][0] = ff_hevc_put_hevc_qpel_v4_8_msa;
+-        c->put_hevc_qpel[3][1][0] = ff_hevc_put_hevc_qpel_v8_8_msa;
+-        c->put_hevc_qpel[4][1][0] = ff_hevc_put_hevc_qpel_v12_8_msa;
+-        c->put_hevc_qpel[5][1][0] = ff_hevc_put_hevc_qpel_v16_8_msa;
+-        c->put_hevc_qpel[6][1][0] = ff_hevc_put_hevc_qpel_v24_8_msa;
+-        c->put_hevc_qpel[7][1][0] = ff_hevc_put_hevc_qpel_v32_8_msa;
+-        c->put_hevc_qpel[8][1][0] = ff_hevc_put_hevc_qpel_v48_8_msa;
+-        c->put_hevc_qpel[9][1][0] = ff_hevc_put_hevc_qpel_v64_8_msa;
+-
+-        c->put_hevc_qpel[1][1][1] = ff_hevc_put_hevc_qpel_hv4_8_msa;
+-        c->put_hevc_qpel[3][1][1] = ff_hevc_put_hevc_qpel_hv8_8_msa;
+-        c->put_hevc_qpel[4][1][1] = ff_hevc_put_hevc_qpel_hv12_8_msa;
+-        c->put_hevc_qpel[5][1][1] = ff_hevc_put_hevc_qpel_hv16_8_msa;
+-        c->put_hevc_qpel[6][1][1] = ff_hevc_put_hevc_qpel_hv24_8_msa;
+-        c->put_hevc_qpel[7][1][1] = ff_hevc_put_hevc_qpel_hv32_8_msa;
+-        c->put_hevc_qpel[8][1][1] = ff_hevc_put_hevc_qpel_hv48_8_msa;
+-        c->put_hevc_qpel[9][1][1] = ff_hevc_put_hevc_qpel_hv64_8_msa;
+-
+-        c->put_hevc_epel[1][0][0] = ff_hevc_put_hevc_pel_pixels4_8_msa;
+-        c->put_hevc_epel[2][0][0] = ff_hevc_put_hevc_pel_pixels6_8_msa;
+-        c->put_hevc_epel[3][0][0] = ff_hevc_put_hevc_pel_pixels8_8_msa;
+-        c->put_hevc_epel[4][0][0] = ff_hevc_put_hevc_pel_pixels12_8_msa;
+-        c->put_hevc_epel[5][0][0] = ff_hevc_put_hevc_pel_pixels16_8_msa;
+-        c->put_hevc_epel[6][0][0] = ff_hevc_put_hevc_pel_pixels24_8_msa;
+-        c->put_hevc_epel[7][0][0] = ff_hevc_put_hevc_pel_pixels32_8_msa;
+-
+-        c->put_hevc_epel[1][0][1] = ff_hevc_put_hevc_epel_h4_8_msa;
+-        c->put_hevc_epel[2][0][1] = ff_hevc_put_hevc_epel_h6_8_msa;
+-        c->put_hevc_epel[3][0][1] = ff_hevc_put_hevc_epel_h8_8_msa;
+-        c->put_hevc_epel[4][0][1] = ff_hevc_put_hevc_epel_h12_8_msa;
+-        c->put_hevc_epel[5][0][1] = ff_hevc_put_hevc_epel_h16_8_msa;
+-        c->put_hevc_epel[6][0][1] = ff_hevc_put_hevc_epel_h24_8_msa;
+-        c->put_hevc_epel[7][0][1] = ff_hevc_put_hevc_epel_h32_8_msa;
+-
+-        c->put_hevc_epel[1][1][0] = ff_hevc_put_hevc_epel_v4_8_msa;
+-        c->put_hevc_epel[2][1][0] = ff_hevc_put_hevc_epel_v6_8_msa;
+-        c->put_hevc_epel[3][1][0] = ff_hevc_put_hevc_epel_v8_8_msa;
+-        c->put_hevc_epel[4][1][0] = ff_hevc_put_hevc_epel_v12_8_msa;
+-        c->put_hevc_epel[5][1][0] = ff_hevc_put_hevc_epel_v16_8_msa;
+-        c->put_hevc_epel[6][1][0] = ff_hevc_put_hevc_epel_v24_8_msa;
+-        c->put_hevc_epel[7][1][0] = ff_hevc_put_hevc_epel_v32_8_msa;
+-
+-        c->put_hevc_epel[1][1][1] = ff_hevc_put_hevc_epel_hv4_8_msa;
+-        c->put_hevc_epel[2][1][1] = ff_hevc_put_hevc_epel_hv6_8_msa;
+-        c->put_hevc_epel[3][1][1] = ff_hevc_put_hevc_epel_hv8_8_msa;
+-        c->put_hevc_epel[4][1][1] = ff_hevc_put_hevc_epel_hv12_8_msa;
+-        c->put_hevc_epel[5][1][1] = ff_hevc_put_hevc_epel_hv16_8_msa;
+-        c->put_hevc_epel[6][1][1] = ff_hevc_put_hevc_epel_hv24_8_msa;
+-        c->put_hevc_epel[7][1][1] = ff_hevc_put_hevc_epel_hv32_8_msa;
+-
+-        c->put_hevc_qpel_uni[3][0][0] = ff_hevc_put_hevc_uni_pel_pixels8_8_msa;
+-        c->put_hevc_qpel_uni[4][0][0] = ff_hevc_put_hevc_uni_pel_pixels12_8_msa;
+-        c->put_hevc_qpel_uni[5][0][0] = ff_hevc_put_hevc_uni_pel_pixels16_8_msa;
+-        c->put_hevc_qpel_uni[6][0][0] = ff_hevc_put_hevc_uni_pel_pixels24_8_msa;
+-        c->put_hevc_qpel_uni[7][0][0] = ff_hevc_put_hevc_uni_pel_pixels32_8_msa;
+-        c->put_hevc_qpel_uni[8][0][0] = ff_hevc_put_hevc_uni_pel_pixels48_8_msa;
+-        c->put_hevc_qpel_uni[9][0][0] = ff_hevc_put_hevc_uni_pel_pixels64_8_msa;
+-
+-        c->put_hevc_qpel_uni[1][0][1] = ff_hevc_put_hevc_uni_qpel_h4_8_msa;
+-        c->put_hevc_qpel_uni[3][0][1] = ff_hevc_put_hevc_uni_qpel_h8_8_msa;
+-        c->put_hevc_qpel_uni[4][0][1] = ff_hevc_put_hevc_uni_qpel_h12_8_msa;
+-        c->put_hevc_qpel_uni[5][0][1] = ff_hevc_put_hevc_uni_qpel_h16_8_msa;
+-        c->put_hevc_qpel_uni[6][0][1] = ff_hevc_put_hevc_uni_qpel_h24_8_msa;
+-        c->put_hevc_qpel_uni[7][0][1] = ff_hevc_put_hevc_uni_qpel_h32_8_msa;
+-        c->put_hevc_qpel_uni[8][0][1] = ff_hevc_put_hevc_uni_qpel_h48_8_msa;
+-        c->put_hevc_qpel_uni[9][0][1] = ff_hevc_put_hevc_uni_qpel_h64_8_msa;
+-
+-        c->put_hevc_qpel_uni[1][1][0] = ff_hevc_put_hevc_uni_qpel_v4_8_msa;
+-        c->put_hevc_qpel_uni[3][1][0] = ff_hevc_put_hevc_uni_qpel_v8_8_msa;
+-        c->put_hevc_qpel_uni[4][1][0] = ff_hevc_put_hevc_uni_qpel_v12_8_msa;
+-        c->put_hevc_qpel_uni[5][1][0] = ff_hevc_put_hevc_uni_qpel_v16_8_msa;
+-        c->put_hevc_qpel_uni[6][1][0] = ff_hevc_put_hevc_uni_qpel_v24_8_msa;
+-        c->put_hevc_qpel_uni[7][1][0] = ff_hevc_put_hevc_uni_qpel_v32_8_msa;
+-        c->put_hevc_qpel_uni[8][1][0] = ff_hevc_put_hevc_uni_qpel_v48_8_msa;
+-        c->put_hevc_qpel_uni[9][1][0] = ff_hevc_put_hevc_uni_qpel_v64_8_msa;
+-
+-        c->put_hevc_qpel_uni[1][1][1] = ff_hevc_put_hevc_uni_qpel_hv4_8_msa;
+-        c->put_hevc_qpel_uni[3][1][1] = ff_hevc_put_hevc_uni_qpel_hv8_8_msa;
+-        c->put_hevc_qpel_uni[4][1][1] = ff_hevc_put_hevc_uni_qpel_hv12_8_msa;
+-        c->put_hevc_qpel_uni[5][1][1] = ff_hevc_put_hevc_uni_qpel_hv16_8_msa;
+-        c->put_hevc_qpel_uni[6][1][1] = ff_hevc_put_hevc_uni_qpel_hv24_8_msa;
+-        c->put_hevc_qpel_uni[7][1][1] = ff_hevc_put_hevc_uni_qpel_hv32_8_msa;
+-        c->put_hevc_qpel_uni[8][1][1] = ff_hevc_put_hevc_uni_qpel_hv48_8_msa;
+-        c->put_hevc_qpel_uni[9][1][1] = ff_hevc_put_hevc_uni_qpel_hv64_8_msa;
+-
+-        c->put_hevc_epel_uni[3][0][0] = ff_hevc_put_hevc_uni_pel_pixels8_8_msa;
+-        c->put_hevc_epel_uni[4][0][0] = ff_hevc_put_hevc_uni_pel_pixels12_8_msa;
+-        c->put_hevc_epel_uni[5][0][0] = ff_hevc_put_hevc_uni_pel_pixels16_8_msa;
+-        c->put_hevc_epel_uni[6][0][0] = ff_hevc_put_hevc_uni_pel_pixels24_8_msa;
+-        c->put_hevc_epel_uni[7][0][0] = ff_hevc_put_hevc_uni_pel_pixels32_8_msa;
+-
+-        c->put_hevc_epel_uni[1][0][1] = ff_hevc_put_hevc_uni_epel_h4_8_msa;
+-        c->put_hevc_epel_uni[2][0][1] = ff_hevc_put_hevc_uni_epel_h6_8_msa;
+-        c->put_hevc_epel_uni[3][0][1] = ff_hevc_put_hevc_uni_epel_h8_8_msa;
+-        c->put_hevc_epel_uni[4][0][1] = ff_hevc_put_hevc_uni_epel_h12_8_msa;
+-        c->put_hevc_epel_uni[5][0][1] = ff_hevc_put_hevc_uni_epel_h16_8_msa;
+-        c->put_hevc_epel_uni[6][0][1] = ff_hevc_put_hevc_uni_epel_h24_8_msa;
+-        c->put_hevc_epel_uni[7][0][1] = ff_hevc_put_hevc_uni_epel_h32_8_msa;
+-
+-        c->put_hevc_epel_uni[1][1][0] = ff_hevc_put_hevc_uni_epel_v4_8_msa;
+-        c->put_hevc_epel_uni[2][1][0] = ff_hevc_put_hevc_uni_epel_v6_8_msa;
+-        c->put_hevc_epel_uni[3][1][0] = ff_hevc_put_hevc_uni_epel_v8_8_msa;
+-        c->put_hevc_epel_uni[4][1][0] = ff_hevc_put_hevc_uni_epel_v12_8_msa;
+-        c->put_hevc_epel_uni[5][1][0] = ff_hevc_put_hevc_uni_epel_v16_8_msa;
+-        c->put_hevc_epel_uni[6][1][0] = ff_hevc_put_hevc_uni_epel_v24_8_msa;
+-        c->put_hevc_epel_uni[7][1][0] = ff_hevc_put_hevc_uni_epel_v32_8_msa;
+-
+-        c->put_hevc_epel_uni[1][1][1] = ff_hevc_put_hevc_uni_epel_hv4_8_msa;
+-        c->put_hevc_epel_uni[2][1][1] = ff_hevc_put_hevc_uni_epel_hv6_8_msa;
+-        c->put_hevc_epel_uni[3][1][1] = ff_hevc_put_hevc_uni_epel_hv8_8_msa;
+-        c->put_hevc_epel_uni[4][1][1] = ff_hevc_put_hevc_uni_epel_hv12_8_msa;
+-        c->put_hevc_epel_uni[5][1][1] = ff_hevc_put_hevc_uni_epel_hv16_8_msa;
+-        c->put_hevc_epel_uni[6][1][1] = ff_hevc_put_hevc_uni_epel_hv24_8_msa;
+-        c->put_hevc_epel_uni[7][1][1] = ff_hevc_put_hevc_uni_epel_hv32_8_msa;
+-
+-        c->put_hevc_qpel_uni_w[1][0][0] =
+-            ff_hevc_put_hevc_uni_w_pel_pixels4_8_msa;
+-        c->put_hevc_qpel_uni_w[3][0][0] =
+-            ff_hevc_put_hevc_uni_w_pel_pixels8_8_msa;
+-        c->put_hevc_qpel_uni_w[4][0][0] =
+-            ff_hevc_put_hevc_uni_w_pel_pixels12_8_msa;
+-        c->put_hevc_qpel_uni_w[5][0][0] =
+-            ff_hevc_put_hevc_uni_w_pel_pixels16_8_msa;
+-        c->put_hevc_qpel_uni_w[6][0][0] =
+-            ff_hevc_put_hevc_uni_w_pel_pixels24_8_msa;
+-        c->put_hevc_qpel_uni_w[7][0][0] =
+-            ff_hevc_put_hevc_uni_w_pel_pixels32_8_msa;
+-        c->put_hevc_qpel_uni_w[8][0][0] =
+-            ff_hevc_put_hevc_uni_w_pel_pixels48_8_msa;
+-        c->put_hevc_qpel_uni_w[9][0][0] =
+-            ff_hevc_put_hevc_uni_w_pel_pixels64_8_msa;
+-
+-        c->put_hevc_qpel_uni_w[1][0][1] = ff_hevc_put_hevc_uni_w_qpel_h4_8_msa;
+-        c->put_hevc_qpel_uni_w[3][0][1] = ff_hevc_put_hevc_uni_w_qpel_h8_8_msa;
+-        c->put_hevc_qpel_uni_w[4][0][1] = ff_hevc_put_hevc_uni_w_qpel_h12_8_msa;
+-        c->put_hevc_qpel_uni_w[5][0][1] = ff_hevc_put_hevc_uni_w_qpel_h16_8_msa;
+-        c->put_hevc_qpel_uni_w[6][0][1] = ff_hevc_put_hevc_uni_w_qpel_h24_8_msa;
+-        c->put_hevc_qpel_uni_w[7][0][1] = ff_hevc_put_hevc_uni_w_qpel_h32_8_msa;
+-        c->put_hevc_qpel_uni_w[8][0][1] = ff_hevc_put_hevc_uni_w_qpel_h48_8_msa;
+-        c->put_hevc_qpel_uni_w[9][0][1] = ff_hevc_put_hevc_uni_w_qpel_h64_8_msa;
+-
+-        c->put_hevc_qpel_uni_w[1][1][0] = ff_hevc_put_hevc_uni_w_qpel_v4_8_msa;
+-        c->put_hevc_qpel_uni_w[3][1][0] = ff_hevc_put_hevc_uni_w_qpel_v8_8_msa;
+-        c->put_hevc_qpel_uni_w[4][1][0] = ff_hevc_put_hevc_uni_w_qpel_v12_8_msa;
+-        c->put_hevc_qpel_uni_w[5][1][0] = ff_hevc_put_hevc_uni_w_qpel_v16_8_msa;
+-        c->put_hevc_qpel_uni_w[6][1][0] = ff_hevc_put_hevc_uni_w_qpel_v24_8_msa;
+-        c->put_hevc_qpel_uni_w[7][1][0] = ff_hevc_put_hevc_uni_w_qpel_v32_8_msa;
+-        c->put_hevc_qpel_uni_w[8][1][0] = ff_hevc_put_hevc_uni_w_qpel_v48_8_msa;
+-        c->put_hevc_qpel_uni_w[9][1][0] = ff_hevc_put_hevc_uni_w_qpel_v64_8_msa;
+-
+-        c->put_hevc_qpel_uni_w[1][1][1] = ff_hevc_put_hevc_uni_w_qpel_hv4_8_msa;
+-        c->put_hevc_qpel_uni_w[3][1][1] = ff_hevc_put_hevc_uni_w_qpel_hv8_8_msa;
+-        c->put_hevc_qpel_uni_w[4][1][1] =
+-            ff_hevc_put_hevc_uni_w_qpel_hv12_8_msa;
+-        c->put_hevc_qpel_uni_w[5][1][1] =
+-            ff_hevc_put_hevc_uni_w_qpel_hv16_8_msa;
+-        c->put_hevc_qpel_uni_w[6][1][1] =
+-            ff_hevc_put_hevc_uni_w_qpel_hv24_8_msa;
+-        c->put_hevc_qpel_uni_w[7][1][1] =
+-            ff_hevc_put_hevc_uni_w_qpel_hv32_8_msa;
+-        c->put_hevc_qpel_uni_w[8][1][1] =
+-            ff_hevc_put_hevc_uni_w_qpel_hv48_8_msa;
+-        c->put_hevc_qpel_uni_w[9][1][1] =
+-            ff_hevc_put_hevc_uni_w_qpel_hv64_8_msa;
+-
+-        c->put_hevc_epel_uni_w[1][0][0] =
+-            ff_hevc_put_hevc_uni_w_pel_pixels4_8_msa;
+-        c->put_hevc_epel_uni_w[2][0][0] =
+-            ff_hevc_put_hevc_uni_w_pel_pixels6_8_msa;
+-        c->put_hevc_epel_uni_w[3][0][0] =
+-            ff_hevc_put_hevc_uni_w_pel_pixels8_8_msa;
+-        c->put_hevc_epel_uni_w[4][0][0] =
+-            ff_hevc_put_hevc_uni_w_pel_pixels12_8_msa;
+-        c->put_hevc_epel_uni_w[5][0][0] =
+-            ff_hevc_put_hevc_uni_w_pel_pixels16_8_msa;
+-        c->put_hevc_epel_uni_w[6][0][0] =
+-            ff_hevc_put_hevc_uni_w_pel_pixels24_8_msa;
+-        c->put_hevc_epel_uni_w[7][0][0] =
+-            ff_hevc_put_hevc_uni_w_pel_pixels32_8_msa;
+-
+-        c->put_hevc_epel_uni_w[1][0][1] = ff_hevc_put_hevc_uni_w_epel_h4_8_msa;
+-        c->put_hevc_epel_uni_w[2][0][1] = ff_hevc_put_hevc_uni_w_epel_h6_8_msa;
+-        c->put_hevc_epel_uni_w[3][0][1] = ff_hevc_put_hevc_uni_w_epel_h8_8_msa;
+-        c->put_hevc_epel_uni_w[4][0][1] = ff_hevc_put_hevc_uni_w_epel_h12_8_msa;
+-        c->put_hevc_epel_uni_w[5][0][1] = ff_hevc_put_hevc_uni_w_epel_h16_8_msa;
+-        c->put_hevc_epel_uni_w[6][0][1] = ff_hevc_put_hevc_uni_w_epel_h24_8_msa;
+-        c->put_hevc_epel_uni_w[7][0][1] = ff_hevc_put_hevc_uni_w_epel_h32_8_msa;
+-
+-        c->put_hevc_epel_uni_w[1][1][0] = ff_hevc_put_hevc_uni_w_epel_v4_8_msa;
+-        c->put_hevc_epel_uni_w[2][1][0] = ff_hevc_put_hevc_uni_w_epel_v6_8_msa;
+-        c->put_hevc_epel_uni_w[3][1][0] = ff_hevc_put_hevc_uni_w_epel_v8_8_msa;
+-        c->put_hevc_epel_uni_w[4][1][0] = ff_hevc_put_hevc_uni_w_epel_v12_8_msa;
+-        c->put_hevc_epel_uni_w[5][1][0] = ff_hevc_put_hevc_uni_w_epel_v16_8_msa;
+-        c->put_hevc_epel_uni_w[6][1][0] = ff_hevc_put_hevc_uni_w_epel_v24_8_msa;
+-        c->put_hevc_epel_uni_w[7][1][0] = ff_hevc_put_hevc_uni_w_epel_v32_8_msa;
+-
+-        c->put_hevc_epel_uni_w[1][1][1] = ff_hevc_put_hevc_uni_w_epel_hv4_8_msa;
+-        c->put_hevc_epel_uni_w[2][1][1] = ff_hevc_put_hevc_uni_w_epel_hv6_8_msa;
+-        c->put_hevc_epel_uni_w[3][1][1] = ff_hevc_put_hevc_uni_w_epel_hv8_8_msa;
+-        c->put_hevc_epel_uni_w[4][1][1] =
+-            ff_hevc_put_hevc_uni_w_epel_hv12_8_msa;
+-        c->put_hevc_epel_uni_w[5][1][1] =
+-            ff_hevc_put_hevc_uni_w_epel_hv16_8_msa;
+-        c->put_hevc_epel_uni_w[6][1][1] =
+-            ff_hevc_put_hevc_uni_w_epel_hv24_8_msa;
+-        c->put_hevc_epel_uni_w[7][1][1] =
+-            ff_hevc_put_hevc_uni_w_epel_hv32_8_msa;
+-
+-        c->put_hevc_qpel_bi[1][0][0] = ff_hevc_put_hevc_bi_pel_pixels4_8_msa;
+-        c->put_hevc_qpel_bi[3][0][0] = ff_hevc_put_hevc_bi_pel_pixels8_8_msa;
+-        c->put_hevc_qpel_bi[4][0][0] = ff_hevc_put_hevc_bi_pel_pixels12_8_msa;
+-        c->put_hevc_qpel_bi[5][0][0] = ff_hevc_put_hevc_bi_pel_pixels16_8_msa;
+-        c->put_hevc_qpel_bi[6][0][0] = ff_hevc_put_hevc_bi_pel_pixels24_8_msa;
+-        c->put_hevc_qpel_bi[7][0][0] = ff_hevc_put_hevc_bi_pel_pixels32_8_msa;
+-        c->put_hevc_qpel_bi[8][0][0] = ff_hevc_put_hevc_bi_pel_pixels48_8_msa;
+-        c->put_hevc_qpel_bi[9][0][0] = ff_hevc_put_hevc_bi_pel_pixels64_8_msa;
+-
+-        c->put_hevc_qpel_bi[1][0][1] = ff_hevc_put_hevc_bi_qpel_h4_8_msa;
+-        c->put_hevc_qpel_bi[3][0][1] = ff_hevc_put_hevc_bi_qpel_h8_8_msa;
+-        c->put_hevc_qpel_bi[4][0][1] = ff_hevc_put_hevc_bi_qpel_h12_8_msa;
+-        c->put_hevc_qpel_bi[5][0][1] = ff_hevc_put_hevc_bi_qpel_h16_8_msa;
+-        c->put_hevc_qpel_bi[6][0][1] = ff_hevc_put_hevc_bi_qpel_h24_8_msa;
+-        c->put_hevc_qpel_bi[7][0][1] = ff_hevc_put_hevc_bi_qpel_h32_8_msa;
+-        c->put_hevc_qpel_bi[8][0][1] = ff_hevc_put_hevc_bi_qpel_h48_8_msa;
+-        c->put_hevc_qpel_bi[9][0][1] = ff_hevc_put_hevc_bi_qpel_h64_8_msa;
+-
+-        c->put_hevc_qpel_bi[1][1][0] = ff_hevc_put_hevc_bi_qpel_v4_8_msa;
+-        c->put_hevc_qpel_bi[3][1][0] = ff_hevc_put_hevc_bi_qpel_v8_8_msa;
+-        c->put_hevc_qpel_bi[4][1][0] = ff_hevc_put_hevc_bi_qpel_v12_8_msa;
+-        c->put_hevc_qpel_bi[5][1][0] = ff_hevc_put_hevc_bi_qpel_v16_8_msa;
+-        c->put_hevc_qpel_bi[6][1][0] = ff_hevc_put_hevc_bi_qpel_v24_8_msa;
+-        c->put_hevc_qpel_bi[7][1][0] = ff_hevc_put_hevc_bi_qpel_v32_8_msa;
+-        c->put_hevc_qpel_bi[8][1][0] = ff_hevc_put_hevc_bi_qpel_v48_8_msa;
+-        c->put_hevc_qpel_bi[9][1][0] = ff_hevc_put_hevc_bi_qpel_v64_8_msa;
+-
+-        c->put_hevc_qpel_bi[1][1][1] = ff_hevc_put_hevc_bi_qpel_hv4_8_msa;
+-        c->put_hevc_qpel_bi[3][1][1] = ff_hevc_put_hevc_bi_qpel_hv8_8_msa;
+-        c->put_hevc_qpel_bi[4][1][1] = ff_hevc_put_hevc_bi_qpel_hv12_8_msa;
+-        c->put_hevc_qpel_bi[5][1][1] = ff_hevc_put_hevc_bi_qpel_hv16_8_msa;
+-        c->put_hevc_qpel_bi[6][1][1] = ff_hevc_put_hevc_bi_qpel_hv24_8_msa;
+-        c->put_hevc_qpel_bi[7][1][1] = ff_hevc_put_hevc_bi_qpel_hv32_8_msa;
+-        c->put_hevc_qpel_bi[8][1][1] = ff_hevc_put_hevc_bi_qpel_hv48_8_msa;
+-        c->put_hevc_qpel_bi[9][1][1] = ff_hevc_put_hevc_bi_qpel_hv64_8_msa;
+-
+-        c->put_hevc_epel_bi[1][0][0] = ff_hevc_put_hevc_bi_pel_pixels4_8_msa;
+-        c->put_hevc_epel_bi[2][0][0] = ff_hevc_put_hevc_bi_pel_pixels6_8_msa;
+-        c->put_hevc_epel_bi[3][0][0] = ff_hevc_put_hevc_bi_pel_pixels8_8_msa;
+-        c->put_hevc_epel_bi[4][0][0] = ff_hevc_put_hevc_bi_pel_pixels12_8_msa;
+-        c->put_hevc_epel_bi[5][0][0] = ff_hevc_put_hevc_bi_pel_pixels16_8_msa;
+-        c->put_hevc_epel_bi[6][0][0] = ff_hevc_put_hevc_bi_pel_pixels24_8_msa;
+-        c->put_hevc_epel_bi[7][0][0] = ff_hevc_put_hevc_bi_pel_pixels32_8_msa;
+-
+-        c->put_hevc_epel_bi[1][0][1] = ff_hevc_put_hevc_bi_epel_h4_8_msa;
+-        c->put_hevc_epel_bi[2][0][1] = ff_hevc_put_hevc_bi_epel_h6_8_msa;
+-        c->put_hevc_epel_bi[3][0][1] = ff_hevc_put_hevc_bi_epel_h8_8_msa;
+-        c->put_hevc_epel_bi[4][0][1] = ff_hevc_put_hevc_bi_epel_h12_8_msa;
+-        c->put_hevc_epel_bi[5][0][1] = ff_hevc_put_hevc_bi_epel_h16_8_msa;
+-        c->put_hevc_epel_bi[6][0][1] = ff_hevc_put_hevc_bi_epel_h24_8_msa;
+-        c->put_hevc_epel_bi[7][0][1] = ff_hevc_put_hevc_bi_epel_h32_8_msa;
+-
+-        c->put_hevc_epel_bi[1][1][0] = ff_hevc_put_hevc_bi_epel_v4_8_msa;
+-        c->put_hevc_epel_bi[2][1][0] = ff_hevc_put_hevc_bi_epel_v6_8_msa;
+-        c->put_hevc_epel_bi[3][1][0] = ff_hevc_put_hevc_bi_epel_v8_8_msa;
+-        c->put_hevc_epel_bi[4][1][0] = ff_hevc_put_hevc_bi_epel_v12_8_msa;
+-        c->put_hevc_epel_bi[5][1][0] = ff_hevc_put_hevc_bi_epel_v16_8_msa;
+-        c->put_hevc_epel_bi[6][1][0] = ff_hevc_put_hevc_bi_epel_v24_8_msa;
+-        c->put_hevc_epel_bi[7][1][0] = ff_hevc_put_hevc_bi_epel_v32_8_msa;
+-
+-        c->put_hevc_epel_bi[1][1][1] = ff_hevc_put_hevc_bi_epel_hv4_8_msa;
+-        c->put_hevc_epel_bi[2][1][1] = ff_hevc_put_hevc_bi_epel_hv6_8_msa;
+-        c->put_hevc_epel_bi[3][1][1] = ff_hevc_put_hevc_bi_epel_hv8_8_msa;
+-        c->put_hevc_epel_bi[4][1][1] = ff_hevc_put_hevc_bi_epel_hv12_8_msa;
+-        c->put_hevc_epel_bi[5][1][1] = ff_hevc_put_hevc_bi_epel_hv16_8_msa;
+-        c->put_hevc_epel_bi[6][1][1] = ff_hevc_put_hevc_bi_epel_hv24_8_msa;
+-        c->put_hevc_epel_bi[7][1][1] = ff_hevc_put_hevc_bi_epel_hv32_8_msa;
+-
+-        c->put_hevc_qpel_bi_w[1][0][0] =
+-            ff_hevc_put_hevc_bi_w_pel_pixels4_8_msa;
+-        c->put_hevc_qpel_bi_w[3][0][0] =
+-            ff_hevc_put_hevc_bi_w_pel_pixels8_8_msa;
+-        c->put_hevc_qpel_bi_w[4][0][0] =
+-            ff_hevc_put_hevc_bi_w_pel_pixels12_8_msa;
+-        c->put_hevc_qpel_bi_w[5][0][0] =
+-            ff_hevc_put_hevc_bi_w_pel_pixels16_8_msa;
+-        c->put_hevc_qpel_bi_w[6][0][0] =
+-            ff_hevc_put_hevc_bi_w_pel_pixels24_8_msa;
+-        c->put_hevc_qpel_bi_w[7][0][0] =
+-            ff_hevc_put_hevc_bi_w_pel_pixels32_8_msa;
+-        c->put_hevc_qpel_bi_w[8][0][0] =
+-            ff_hevc_put_hevc_bi_w_pel_pixels48_8_msa;
+-        c->put_hevc_qpel_bi_w[9][0][0] =
+-            ff_hevc_put_hevc_bi_w_pel_pixels64_8_msa;
+-
+-        c->put_hevc_qpel_bi_w[1][0][1] = ff_hevc_put_hevc_bi_w_qpel_h4_8_msa;
+-        c->put_hevc_qpel_bi_w[3][0][1] = ff_hevc_put_hevc_bi_w_qpel_h8_8_msa;
+-        c->put_hevc_qpel_bi_w[4][0][1] = ff_hevc_put_hevc_bi_w_qpel_h12_8_msa;
+-        c->put_hevc_qpel_bi_w[5][0][1] = ff_hevc_put_hevc_bi_w_qpel_h16_8_msa;
+-        c->put_hevc_qpel_bi_w[6][0][1] = ff_hevc_put_hevc_bi_w_qpel_h24_8_msa;
+-        c->put_hevc_qpel_bi_w[7][0][1] = ff_hevc_put_hevc_bi_w_qpel_h32_8_msa;
+-        c->put_hevc_qpel_bi_w[8][0][1] = ff_hevc_put_hevc_bi_w_qpel_h48_8_msa;
+-        c->put_hevc_qpel_bi_w[9][0][1] = ff_hevc_put_hevc_bi_w_qpel_h64_8_msa;
+-
+-        c->put_hevc_qpel_bi_w[1][1][0] = ff_hevc_put_hevc_bi_w_qpel_v4_8_msa;
+-        c->put_hevc_qpel_bi_w[3][1][0] = ff_hevc_put_hevc_bi_w_qpel_v8_8_msa;
+-        c->put_hevc_qpel_bi_w[4][1][0] = ff_hevc_put_hevc_bi_w_qpel_v12_8_msa;
+-        c->put_hevc_qpel_bi_w[5][1][0] = ff_hevc_put_hevc_bi_w_qpel_v16_8_msa;
+-        c->put_hevc_qpel_bi_w[6][1][0] = ff_hevc_put_hevc_bi_w_qpel_v24_8_msa;
+-        c->put_hevc_qpel_bi_w[7][1][0] = ff_hevc_put_hevc_bi_w_qpel_v32_8_msa;
+-        c->put_hevc_qpel_bi_w[8][1][0] = ff_hevc_put_hevc_bi_w_qpel_v48_8_msa;
+-        c->put_hevc_qpel_bi_w[9][1][0] = ff_hevc_put_hevc_bi_w_qpel_v64_8_msa;
+-
+-        c->put_hevc_qpel_bi_w[1][1][1] = ff_hevc_put_hevc_bi_w_qpel_hv4_8_msa;
+-        c->put_hevc_qpel_bi_w[3][1][1] = ff_hevc_put_hevc_bi_w_qpel_hv8_8_msa;
+-        c->put_hevc_qpel_bi_w[4][1][1] = ff_hevc_put_hevc_bi_w_qpel_hv12_8_msa;
+-        c->put_hevc_qpel_bi_w[5][1][1] = ff_hevc_put_hevc_bi_w_qpel_hv16_8_msa;
+-        c->put_hevc_qpel_bi_w[6][1][1] = ff_hevc_put_hevc_bi_w_qpel_hv24_8_msa;
+-        c->put_hevc_qpel_bi_w[7][1][1] = ff_hevc_put_hevc_bi_w_qpel_hv32_8_msa;
+-        c->put_hevc_qpel_bi_w[8][1][1] = ff_hevc_put_hevc_bi_w_qpel_hv48_8_msa;
+-        c->put_hevc_qpel_bi_w[9][1][1] = ff_hevc_put_hevc_bi_w_qpel_hv64_8_msa;
+-
+-        c->put_hevc_epel_bi_w[1][0][0] =
+-            ff_hevc_put_hevc_bi_w_pel_pixels4_8_msa;
+-        c->put_hevc_epel_bi_w[2][0][0] =
+-            ff_hevc_put_hevc_bi_w_pel_pixels6_8_msa;
+-        c->put_hevc_epel_bi_w[3][0][0] =
+-            ff_hevc_put_hevc_bi_w_pel_pixels8_8_msa;
+-        c->put_hevc_epel_bi_w[4][0][0] =
+-            ff_hevc_put_hevc_bi_w_pel_pixels12_8_msa;
+-        c->put_hevc_epel_bi_w[5][0][0] =
+-            ff_hevc_put_hevc_bi_w_pel_pixels16_8_msa;
+-        c->put_hevc_epel_bi_w[6][0][0] =
+-            ff_hevc_put_hevc_bi_w_pel_pixels24_8_msa;
+-        c->put_hevc_epel_bi_w[7][0][0] =
+-            ff_hevc_put_hevc_bi_w_pel_pixels32_8_msa;
+-
+-        c->put_hevc_epel_bi_w[1][0][1] = ff_hevc_put_hevc_bi_w_epel_h4_8_msa;
+-        c->put_hevc_epel_bi_w[2][0][1] = ff_hevc_put_hevc_bi_w_epel_h6_8_msa;
+-        c->put_hevc_epel_bi_w[3][0][1] = ff_hevc_put_hevc_bi_w_epel_h8_8_msa;
+-        c->put_hevc_epel_bi_w[4][0][1] = ff_hevc_put_hevc_bi_w_epel_h12_8_msa;
+-        c->put_hevc_epel_bi_w[5][0][1] = ff_hevc_put_hevc_bi_w_epel_h16_8_msa;
+-        c->put_hevc_epel_bi_w[6][0][1] = ff_hevc_put_hevc_bi_w_epel_h24_8_msa;
+-        c->put_hevc_epel_bi_w[7][0][1] = ff_hevc_put_hevc_bi_w_epel_h32_8_msa;
+-
+-        c->put_hevc_epel_bi_w[1][1][0] = ff_hevc_put_hevc_bi_w_epel_v4_8_msa;
+-        c->put_hevc_epel_bi_w[2][1][0] = ff_hevc_put_hevc_bi_w_epel_v6_8_msa;
+-        c->put_hevc_epel_bi_w[3][1][0] = ff_hevc_put_hevc_bi_w_epel_v8_8_msa;
+-        c->put_hevc_epel_bi_w[4][1][0] = ff_hevc_put_hevc_bi_w_epel_v12_8_msa;
+-        c->put_hevc_epel_bi_w[5][1][0] = ff_hevc_put_hevc_bi_w_epel_v16_8_msa;
+-        c->put_hevc_epel_bi_w[6][1][0] = ff_hevc_put_hevc_bi_w_epel_v24_8_msa;
+-        c->put_hevc_epel_bi_w[7][1][0] = ff_hevc_put_hevc_bi_w_epel_v32_8_msa;
+-
+-        c->put_hevc_epel_bi_w[1][1][1] = ff_hevc_put_hevc_bi_w_epel_hv4_8_msa;
+-        c->put_hevc_epel_bi_w[2][1][1] = ff_hevc_put_hevc_bi_w_epel_hv6_8_msa;
+-        c->put_hevc_epel_bi_w[3][1][1] = ff_hevc_put_hevc_bi_w_epel_hv8_8_msa;
+-        c->put_hevc_epel_bi_w[4][1][1] = ff_hevc_put_hevc_bi_w_epel_hv12_8_msa;
+-        c->put_hevc_epel_bi_w[5][1][1] = ff_hevc_put_hevc_bi_w_epel_hv16_8_msa;
+-        c->put_hevc_epel_bi_w[6][1][1] = ff_hevc_put_hevc_bi_w_epel_hv24_8_msa;
+-        c->put_hevc_epel_bi_w[7][1][1] = ff_hevc_put_hevc_bi_w_epel_hv32_8_msa;
+-
+-        c->sao_band_filter[0] =
+-        c->sao_band_filter[1] =
+-        c->sao_band_filter[2] =
+-        c->sao_band_filter[3] =
+-        c->sao_band_filter[4] = ff_hevc_sao_band_filter_0_8_msa;
+-
+-        c->sao_edge_filter[0] =
+-        c->sao_edge_filter[1] =
+-        c->sao_edge_filter[2] =
+-        c->sao_edge_filter[3] =
+-        c->sao_edge_filter[4] = ff_hevc_sao_edge_filter_8_msa;
+-
+-        c->hevc_h_loop_filter_luma = ff_hevc_loop_filter_luma_h_8_msa;
+-        c->hevc_v_loop_filter_luma = ff_hevc_loop_filter_luma_v_8_msa;
+-
+-        c->hevc_h_loop_filter_chroma = ff_hevc_loop_filter_chroma_h_8_msa;
+-        c->hevc_v_loop_filter_chroma = ff_hevc_loop_filter_chroma_v_8_msa;
+-
+-        c->hevc_h_loop_filter_luma_c = ff_hevc_loop_filter_luma_h_8_msa;
+-        c->hevc_v_loop_filter_luma_c = ff_hevc_loop_filter_luma_v_8_msa;
+-
+-        c->hevc_h_loop_filter_chroma_c =
+-            ff_hevc_loop_filter_chroma_h_8_msa;
+-        c->hevc_v_loop_filter_chroma_c =
+-            ff_hevc_loop_filter_chroma_v_8_msa;
+-
+-        c->idct[0] = ff_hevc_idct_4x4_msa;
+-        c->idct[1] = ff_hevc_idct_8x8_msa;
+-        c->idct[2] = ff_hevc_idct_16x16_msa;
+-        c->idct[3] = ff_hevc_idct_32x32_msa;
+-        c->idct_dc[0] = ff_hevc_idct_dc_4x4_msa;
+-        c->idct_dc[1] = ff_hevc_idct_dc_8x8_msa;
+-        c->idct_dc[2] = ff_hevc_idct_dc_16x16_msa;
+-        c->idct_dc[3] = ff_hevc_idct_dc_32x32_msa;
+-        c->add_residual[0] = ff_hevc_addblk_4x4_msa;
+-        c->add_residual[1] = ff_hevc_addblk_8x8_msa;
+-        c->add_residual[2] = ff_hevc_addblk_16x16_msa;
+-        c->add_residual[3] = ff_hevc_addblk_32x32_msa;
+-        c->transform_4x4_luma = ff_hevc_idct_luma_4x4_msa;
++    int cpu_flags = av_get_cpu_flags();
++
++    if (have_mmi(cpu_flags)) {
++        if (bit_depth == 8) {
++            c->put_hevc_qpel[1][0][1] = ff_hevc_put_hevc_qpel_h4_8_mmi;
++            c->put_hevc_qpel[3][0][1] = ff_hevc_put_hevc_qpel_h8_8_mmi;
++            c->put_hevc_qpel[4][0][1] = ff_hevc_put_hevc_qpel_h12_8_mmi;
++            c->put_hevc_qpel[5][0][1] = ff_hevc_put_hevc_qpel_h16_8_mmi;
++            c->put_hevc_qpel[6][0][1] = ff_hevc_put_hevc_qpel_h24_8_mmi;
++            c->put_hevc_qpel[7][0][1] = ff_hevc_put_hevc_qpel_h32_8_mmi;
++            c->put_hevc_qpel[8][0][1] = ff_hevc_put_hevc_qpel_h48_8_mmi;
++            c->put_hevc_qpel[9][0][1] = ff_hevc_put_hevc_qpel_h64_8_mmi;
++
++            c->put_hevc_qpel[1][1][1] = ff_hevc_put_hevc_qpel_hv4_8_mmi;
++            c->put_hevc_qpel[3][1][1] = ff_hevc_put_hevc_qpel_hv8_8_mmi;
++            c->put_hevc_qpel[4][1][1] = ff_hevc_put_hevc_qpel_hv12_8_mmi;
++            c->put_hevc_qpel[5][1][1] = ff_hevc_put_hevc_qpel_hv16_8_mmi;
++            c->put_hevc_qpel[6][1][1] = ff_hevc_put_hevc_qpel_hv24_8_mmi;
++            c->put_hevc_qpel[7][1][1] = ff_hevc_put_hevc_qpel_hv32_8_mmi;
++            c->put_hevc_qpel[8][1][1] = ff_hevc_put_hevc_qpel_hv48_8_mmi;
++            c->put_hevc_qpel[9][1][1] = ff_hevc_put_hevc_qpel_hv64_8_mmi;
++
++            c->put_hevc_qpel_bi[1][0][1] = ff_hevc_put_hevc_qpel_bi_h4_8_mmi;
++            c->put_hevc_qpel_bi[3][0][1] = ff_hevc_put_hevc_qpel_bi_h8_8_mmi;
++            c->put_hevc_qpel_bi[4][0][1] = ff_hevc_put_hevc_qpel_bi_h12_8_mmi;
++            c->put_hevc_qpel_bi[5][0][1] = ff_hevc_put_hevc_qpel_bi_h16_8_mmi;
++            c->put_hevc_qpel_bi[6][0][1] = ff_hevc_put_hevc_qpel_bi_h24_8_mmi;
++            c->put_hevc_qpel_bi[7][0][1] = ff_hevc_put_hevc_qpel_bi_h32_8_mmi;
++            c->put_hevc_qpel_bi[8][0][1] = ff_hevc_put_hevc_qpel_bi_h48_8_mmi;
++            c->put_hevc_qpel_bi[9][0][1] = ff_hevc_put_hevc_qpel_bi_h64_8_mmi;
++
++            c->put_hevc_qpel_bi[1][1][1] = ff_hevc_put_hevc_qpel_bi_hv4_8_mmi;
++            c->put_hevc_qpel_bi[3][1][1] = ff_hevc_put_hevc_qpel_bi_hv8_8_mmi;
++            c->put_hevc_qpel_bi[4][1][1] = ff_hevc_put_hevc_qpel_bi_hv12_8_mmi;
++            c->put_hevc_qpel_bi[5][1][1] = ff_hevc_put_hevc_qpel_bi_hv16_8_mmi;
++            c->put_hevc_qpel_bi[6][1][1] = ff_hevc_put_hevc_qpel_bi_hv24_8_mmi;
++            c->put_hevc_qpel_bi[7][1][1] = ff_hevc_put_hevc_qpel_bi_hv32_8_mmi;
++            c->put_hevc_qpel_bi[8][1][1] = ff_hevc_put_hevc_qpel_bi_hv48_8_mmi;
++            c->put_hevc_qpel_bi[9][1][1] = ff_hevc_put_hevc_qpel_bi_hv64_8_mmi;
++
++            c->put_hevc_qpel_bi[3][0][0] = ff_hevc_put_hevc_pel_bi_pixels8_8_mmi;
++            c->put_hevc_qpel_bi[5][0][0] = ff_hevc_put_hevc_pel_bi_pixels16_8_mmi;
++            c->put_hevc_qpel_bi[6][0][0] = ff_hevc_put_hevc_pel_bi_pixels24_8_mmi;
++            c->put_hevc_qpel_bi[7][0][0] = ff_hevc_put_hevc_pel_bi_pixels32_8_mmi;
++            c->put_hevc_qpel_bi[8][0][0] = ff_hevc_put_hevc_pel_bi_pixels48_8_mmi;
++            c->put_hevc_qpel_bi[9][0][0] = ff_hevc_put_hevc_pel_bi_pixels64_8_mmi;
++
++            c->put_hevc_epel_bi[3][0][0] = ff_hevc_put_hevc_pel_bi_pixels8_8_mmi;
++            c->put_hevc_epel_bi[5][0][0] = ff_hevc_put_hevc_pel_bi_pixels16_8_mmi;
++            c->put_hevc_epel_bi[6][0][0] = ff_hevc_put_hevc_pel_bi_pixels24_8_mmi;
++            c->put_hevc_epel_bi[7][0][0] = ff_hevc_put_hevc_pel_bi_pixels32_8_mmi;
++
++            c->put_hevc_epel_bi[1][1][1] = ff_hevc_put_hevc_epel_bi_hv4_8_mmi;
++            c->put_hevc_epel_bi[3][1][1] = ff_hevc_put_hevc_epel_bi_hv8_8_mmi;
++            c->put_hevc_epel_bi[4][1][1] = ff_hevc_put_hevc_epel_bi_hv12_8_mmi;
++            c->put_hevc_epel_bi[5][1][1] = ff_hevc_put_hevc_epel_bi_hv16_8_mmi;
++            c->put_hevc_epel_bi[6][1][1] = ff_hevc_put_hevc_epel_bi_hv24_8_mmi;
++            c->put_hevc_epel_bi[7][1][1] = ff_hevc_put_hevc_epel_bi_hv32_8_mmi;
++
++            c->put_hevc_qpel_uni[1][1][1] = ff_hevc_put_hevc_qpel_uni_hv4_8_mmi;
++            c->put_hevc_qpel_uni[3][1][1] = ff_hevc_put_hevc_qpel_uni_hv8_8_mmi;
++            c->put_hevc_qpel_uni[4][1][1] = ff_hevc_put_hevc_qpel_uni_hv12_8_mmi;
++            c->put_hevc_qpel_uni[5][1][1] = ff_hevc_put_hevc_qpel_uni_hv16_8_mmi;
++            c->put_hevc_qpel_uni[6][1][1] = ff_hevc_put_hevc_qpel_uni_hv24_8_mmi;
++            c->put_hevc_qpel_uni[7][1][1] = ff_hevc_put_hevc_qpel_uni_hv32_8_mmi;
++            c->put_hevc_qpel_uni[8][1][1] = ff_hevc_put_hevc_qpel_uni_hv48_8_mmi;
++            c->put_hevc_qpel_uni[9][1][1] = ff_hevc_put_hevc_qpel_uni_hv64_8_mmi;
++        }
+     }
+-}
+-#endif  // #if HAVE_MSA
+ 
+-void ff_hevc_dsp_init_mips(HEVCDSPContext *c, const int bit_depth)
+-{
+-#if HAVE_MSA
+-    hevc_dsp_init_msa(c, bit_depth);
+-#endif  // #if HAVE_MSA
++    if (have_msa(cpu_flags)) {
++        if (bit_depth == 8) {
++            c->put_hevc_qpel[1][0][0] = ff_hevc_put_hevc_pel_pixels4_8_msa;
++            c->put_hevc_qpel[2][0][0] = ff_hevc_put_hevc_pel_pixels6_8_msa;
++            c->put_hevc_qpel[3][0][0] = ff_hevc_put_hevc_pel_pixels8_8_msa;
++            c->put_hevc_qpel[4][0][0] = ff_hevc_put_hevc_pel_pixels12_8_msa;
++            c->put_hevc_qpel[5][0][0] = ff_hevc_put_hevc_pel_pixels16_8_msa;
++            c->put_hevc_qpel[6][0][0] = ff_hevc_put_hevc_pel_pixels24_8_msa;
++            c->put_hevc_qpel[7][0][0] = ff_hevc_put_hevc_pel_pixels32_8_msa;
++            c->put_hevc_qpel[8][0][0] = ff_hevc_put_hevc_pel_pixels48_8_msa;
++            c->put_hevc_qpel[9][0][0] = ff_hevc_put_hevc_pel_pixels64_8_msa;
++
++            c->put_hevc_qpel[1][0][1] = ff_hevc_put_hevc_qpel_h4_8_msa;
++            c->put_hevc_qpel[3][0][1] = ff_hevc_put_hevc_qpel_h8_8_msa;
++            c->put_hevc_qpel[4][0][1] = ff_hevc_put_hevc_qpel_h12_8_msa;
++            c->put_hevc_qpel[5][0][1] = ff_hevc_put_hevc_qpel_h16_8_msa;
++            c->put_hevc_qpel[6][0][1] = ff_hevc_put_hevc_qpel_h24_8_msa;
++            c->put_hevc_qpel[7][0][1] = ff_hevc_put_hevc_qpel_h32_8_msa;
++            c->put_hevc_qpel[8][0][1] = ff_hevc_put_hevc_qpel_h48_8_msa;
++            c->put_hevc_qpel[9][0][1] = ff_hevc_put_hevc_qpel_h64_8_msa;
++
++            c->put_hevc_qpel[1][1][0] = ff_hevc_put_hevc_qpel_v4_8_msa;
++            c->put_hevc_qpel[3][1][0] = ff_hevc_put_hevc_qpel_v8_8_msa;
++            c->put_hevc_qpel[4][1][0] = ff_hevc_put_hevc_qpel_v12_8_msa;
++            c->put_hevc_qpel[5][1][0] = ff_hevc_put_hevc_qpel_v16_8_msa;
++            c->put_hevc_qpel[6][1][0] = ff_hevc_put_hevc_qpel_v24_8_msa;
++            c->put_hevc_qpel[7][1][0] = ff_hevc_put_hevc_qpel_v32_8_msa;
++            c->put_hevc_qpel[8][1][0] = ff_hevc_put_hevc_qpel_v48_8_msa;
++            c->put_hevc_qpel[9][1][0] = ff_hevc_put_hevc_qpel_v64_8_msa;
++
++            c->put_hevc_qpel[1][1][1] = ff_hevc_put_hevc_qpel_hv4_8_msa;
++            c->put_hevc_qpel[3][1][1] = ff_hevc_put_hevc_qpel_hv8_8_msa;
++            c->put_hevc_qpel[4][1][1] = ff_hevc_put_hevc_qpel_hv12_8_msa;
++            c->put_hevc_qpel[5][1][1] = ff_hevc_put_hevc_qpel_hv16_8_msa;
++            c->put_hevc_qpel[6][1][1] = ff_hevc_put_hevc_qpel_hv24_8_msa;
++            c->put_hevc_qpel[7][1][1] = ff_hevc_put_hevc_qpel_hv32_8_msa;
++            c->put_hevc_qpel[8][1][1] = ff_hevc_put_hevc_qpel_hv48_8_msa;
++            c->put_hevc_qpel[9][1][1] = ff_hevc_put_hevc_qpel_hv64_8_msa;
++
++            c->put_hevc_epel[1][0][0] = ff_hevc_put_hevc_pel_pixels4_8_msa;
++            c->put_hevc_epel[2][0][0] = ff_hevc_put_hevc_pel_pixels6_8_msa;
++            c->put_hevc_epel[3][0][0] = ff_hevc_put_hevc_pel_pixels8_8_msa;
++            c->put_hevc_epel[4][0][0] = ff_hevc_put_hevc_pel_pixels12_8_msa;
++            c->put_hevc_epel[5][0][0] = ff_hevc_put_hevc_pel_pixels16_8_msa;
++            c->put_hevc_epel[6][0][0] = ff_hevc_put_hevc_pel_pixels24_8_msa;
++            c->put_hevc_epel[7][0][0] = ff_hevc_put_hevc_pel_pixels32_8_msa;
++
++            c->put_hevc_epel[1][0][1] = ff_hevc_put_hevc_epel_h4_8_msa;
++            c->put_hevc_epel[2][0][1] = ff_hevc_put_hevc_epel_h6_8_msa;
++            c->put_hevc_epel[3][0][1] = ff_hevc_put_hevc_epel_h8_8_msa;
++            c->put_hevc_epel[4][0][1] = ff_hevc_put_hevc_epel_h12_8_msa;
++            c->put_hevc_epel[5][0][1] = ff_hevc_put_hevc_epel_h16_8_msa;
++            c->put_hevc_epel[6][0][1] = ff_hevc_put_hevc_epel_h24_8_msa;
++            c->put_hevc_epel[7][0][1] = ff_hevc_put_hevc_epel_h32_8_msa;
++
++            c->put_hevc_epel[1][1][0] = ff_hevc_put_hevc_epel_v4_8_msa;
++            c->put_hevc_epel[2][1][0] = ff_hevc_put_hevc_epel_v6_8_msa;
++            c->put_hevc_epel[3][1][0] = ff_hevc_put_hevc_epel_v8_8_msa;
++            c->put_hevc_epel[4][1][0] = ff_hevc_put_hevc_epel_v12_8_msa;
++            c->put_hevc_epel[5][1][0] = ff_hevc_put_hevc_epel_v16_8_msa;
++            c->put_hevc_epel[6][1][0] = ff_hevc_put_hevc_epel_v24_8_msa;
++            c->put_hevc_epel[7][1][0] = ff_hevc_put_hevc_epel_v32_8_msa;
++
++            c->put_hevc_epel[1][1][1] = ff_hevc_put_hevc_epel_hv4_8_msa;
++            c->put_hevc_epel[2][1][1] = ff_hevc_put_hevc_epel_hv6_8_msa;
++            c->put_hevc_epel[3][1][1] = ff_hevc_put_hevc_epel_hv8_8_msa;
++            c->put_hevc_epel[4][1][1] = ff_hevc_put_hevc_epel_hv12_8_msa;
++            c->put_hevc_epel[5][1][1] = ff_hevc_put_hevc_epel_hv16_8_msa;
++            c->put_hevc_epel[6][1][1] = ff_hevc_put_hevc_epel_hv24_8_msa;
++            c->put_hevc_epel[7][1][1] = ff_hevc_put_hevc_epel_hv32_8_msa;
++
++            c->put_hevc_qpel_uni[3][0][0] = ff_hevc_put_hevc_uni_pel_pixels8_8_msa;
++            c->put_hevc_qpel_uni[4][0][0] = ff_hevc_put_hevc_uni_pel_pixels12_8_msa;
++            c->put_hevc_qpel_uni[5][0][0] = ff_hevc_put_hevc_uni_pel_pixels16_8_msa;
++            c->put_hevc_qpel_uni[6][0][0] = ff_hevc_put_hevc_uni_pel_pixels24_8_msa;
++            c->put_hevc_qpel_uni[7][0][0] = ff_hevc_put_hevc_uni_pel_pixels32_8_msa;
++            c->put_hevc_qpel_uni[8][0][0] = ff_hevc_put_hevc_uni_pel_pixels48_8_msa;
++            c->put_hevc_qpel_uni[9][0][0] = ff_hevc_put_hevc_uni_pel_pixels64_8_msa;
++
++            c->put_hevc_qpel_uni[1][0][1] = ff_hevc_put_hevc_uni_qpel_h4_8_msa;
++            c->put_hevc_qpel_uni[3][0][1] = ff_hevc_put_hevc_uni_qpel_h8_8_msa;
++            c->put_hevc_qpel_uni[4][0][1] = ff_hevc_put_hevc_uni_qpel_h12_8_msa;
++            c->put_hevc_qpel_uni[5][0][1] = ff_hevc_put_hevc_uni_qpel_h16_8_msa;
++            c->put_hevc_qpel_uni[6][0][1] = ff_hevc_put_hevc_uni_qpel_h24_8_msa;
++            c->put_hevc_qpel_uni[7][0][1] = ff_hevc_put_hevc_uni_qpel_h32_8_msa;
++            c->put_hevc_qpel_uni[8][0][1] = ff_hevc_put_hevc_uni_qpel_h48_8_msa;
++            c->put_hevc_qpel_uni[9][0][1] = ff_hevc_put_hevc_uni_qpel_h64_8_msa;
++
++            c->put_hevc_qpel_uni[1][1][0] = ff_hevc_put_hevc_uni_qpel_v4_8_msa;
++            c->put_hevc_qpel_uni[3][1][0] = ff_hevc_put_hevc_uni_qpel_v8_8_msa;
++            c->put_hevc_qpel_uni[4][1][0] = ff_hevc_put_hevc_uni_qpel_v12_8_msa;
++            c->put_hevc_qpel_uni[5][1][0] = ff_hevc_put_hevc_uni_qpel_v16_8_msa;
++            c->put_hevc_qpel_uni[6][1][0] = ff_hevc_put_hevc_uni_qpel_v24_8_msa;
++            c->put_hevc_qpel_uni[7][1][0] = ff_hevc_put_hevc_uni_qpel_v32_8_msa;
++            c->put_hevc_qpel_uni[8][1][0] = ff_hevc_put_hevc_uni_qpel_v48_8_msa;
++            c->put_hevc_qpel_uni[9][1][0] = ff_hevc_put_hevc_uni_qpel_v64_8_msa;
++
++            c->put_hevc_qpel_uni[1][1][1] = ff_hevc_put_hevc_uni_qpel_hv4_8_msa;
++            c->put_hevc_qpel_uni[3][1][1] = ff_hevc_put_hevc_uni_qpel_hv8_8_msa;
++            c->put_hevc_qpel_uni[4][1][1] = ff_hevc_put_hevc_uni_qpel_hv12_8_msa;
++            c->put_hevc_qpel_uni[5][1][1] = ff_hevc_put_hevc_uni_qpel_hv16_8_msa;
++            c->put_hevc_qpel_uni[6][1][1] = ff_hevc_put_hevc_uni_qpel_hv24_8_msa;
++            c->put_hevc_qpel_uni[7][1][1] = ff_hevc_put_hevc_uni_qpel_hv32_8_msa;
++            c->put_hevc_qpel_uni[8][1][1] = ff_hevc_put_hevc_uni_qpel_hv48_8_msa;
++            c->put_hevc_qpel_uni[9][1][1] = ff_hevc_put_hevc_uni_qpel_hv64_8_msa;
++
++            c->put_hevc_epel_uni[3][0][0] = ff_hevc_put_hevc_uni_pel_pixels8_8_msa;
++            c->put_hevc_epel_uni[4][0][0] = ff_hevc_put_hevc_uni_pel_pixels12_8_msa;
++            c->put_hevc_epel_uni[5][0][0] = ff_hevc_put_hevc_uni_pel_pixels16_8_msa;
++            c->put_hevc_epel_uni[6][0][0] = ff_hevc_put_hevc_uni_pel_pixels24_8_msa;
++            c->put_hevc_epel_uni[7][0][0] = ff_hevc_put_hevc_uni_pel_pixels32_8_msa;
++
++            c->put_hevc_epel_uni[1][0][1] = ff_hevc_put_hevc_uni_epel_h4_8_msa;
++            c->put_hevc_epel_uni[2][0][1] = ff_hevc_put_hevc_uni_epel_h6_8_msa;
++            c->put_hevc_epel_uni[3][0][1] = ff_hevc_put_hevc_uni_epel_h8_8_msa;
++            c->put_hevc_epel_uni[4][0][1] = ff_hevc_put_hevc_uni_epel_h12_8_msa;
++            c->put_hevc_epel_uni[5][0][1] = ff_hevc_put_hevc_uni_epel_h16_8_msa;
++            c->put_hevc_epel_uni[6][0][1] = ff_hevc_put_hevc_uni_epel_h24_8_msa;
++            c->put_hevc_epel_uni[7][0][1] = ff_hevc_put_hevc_uni_epel_h32_8_msa;
++
++            c->put_hevc_epel_uni[1][1][0] = ff_hevc_put_hevc_uni_epel_v4_8_msa;
++            c->put_hevc_epel_uni[2][1][0] = ff_hevc_put_hevc_uni_epel_v6_8_msa;
++            c->put_hevc_epel_uni[3][1][0] = ff_hevc_put_hevc_uni_epel_v8_8_msa;
++            c->put_hevc_epel_uni[4][1][0] = ff_hevc_put_hevc_uni_epel_v12_8_msa;
++            c->put_hevc_epel_uni[5][1][0] = ff_hevc_put_hevc_uni_epel_v16_8_msa;
++            c->put_hevc_epel_uni[6][1][0] = ff_hevc_put_hevc_uni_epel_v24_8_msa;
++            c->put_hevc_epel_uni[7][1][0] = ff_hevc_put_hevc_uni_epel_v32_8_msa;
++
++            c->put_hevc_epel_uni[1][1][1] = ff_hevc_put_hevc_uni_epel_hv4_8_msa;
++            c->put_hevc_epel_uni[2][1][1] = ff_hevc_put_hevc_uni_epel_hv6_8_msa;
++            c->put_hevc_epel_uni[3][1][1] = ff_hevc_put_hevc_uni_epel_hv8_8_msa;
++            c->put_hevc_epel_uni[4][1][1] = ff_hevc_put_hevc_uni_epel_hv12_8_msa;
++            c->put_hevc_epel_uni[5][1][1] = ff_hevc_put_hevc_uni_epel_hv16_8_msa;
++            c->put_hevc_epel_uni[6][1][1] = ff_hevc_put_hevc_uni_epel_hv24_8_msa;
++            c->put_hevc_epel_uni[7][1][1] = ff_hevc_put_hevc_uni_epel_hv32_8_msa;
++
++            c->put_hevc_qpel_uni_w[1][0][0] =
++                ff_hevc_put_hevc_uni_w_pel_pixels4_8_msa;
++            c->put_hevc_qpel_uni_w[3][0][0] =
++                ff_hevc_put_hevc_uni_w_pel_pixels8_8_msa;
++            c->put_hevc_qpel_uni_w[4][0][0] =
++                ff_hevc_put_hevc_uni_w_pel_pixels12_8_msa;
++            c->put_hevc_qpel_uni_w[5][0][0] =
++                ff_hevc_put_hevc_uni_w_pel_pixels16_8_msa;
++            c->put_hevc_qpel_uni_w[6][0][0] =
++                ff_hevc_put_hevc_uni_w_pel_pixels24_8_msa;
++            c->put_hevc_qpel_uni_w[7][0][0] =
++                ff_hevc_put_hevc_uni_w_pel_pixels32_8_msa;
++            c->put_hevc_qpel_uni_w[8][0][0] =
++                ff_hevc_put_hevc_uni_w_pel_pixels48_8_msa;
++            c->put_hevc_qpel_uni_w[9][0][0] =
++                ff_hevc_put_hevc_uni_w_pel_pixels64_8_msa;
++
++            c->put_hevc_qpel_uni_w[1][0][1] = ff_hevc_put_hevc_uni_w_qpel_h4_8_msa;
++            c->put_hevc_qpel_uni_w[3][0][1] = ff_hevc_put_hevc_uni_w_qpel_h8_8_msa;
++            c->put_hevc_qpel_uni_w[4][0][1] = ff_hevc_put_hevc_uni_w_qpel_h12_8_msa;
++            c->put_hevc_qpel_uni_w[5][0][1] = ff_hevc_put_hevc_uni_w_qpel_h16_8_msa;
++            c->put_hevc_qpel_uni_w[6][0][1] = ff_hevc_put_hevc_uni_w_qpel_h24_8_msa;
++            c->put_hevc_qpel_uni_w[7][0][1] = ff_hevc_put_hevc_uni_w_qpel_h32_8_msa;
++            c->put_hevc_qpel_uni_w[8][0][1] = ff_hevc_put_hevc_uni_w_qpel_h48_8_msa;
++            c->put_hevc_qpel_uni_w[9][0][1] = ff_hevc_put_hevc_uni_w_qpel_h64_8_msa;
++
++            c->put_hevc_qpel_uni_w[1][1][0] = ff_hevc_put_hevc_uni_w_qpel_v4_8_msa;
++            c->put_hevc_qpel_uni_w[3][1][0] = ff_hevc_put_hevc_uni_w_qpel_v8_8_msa;
++            c->put_hevc_qpel_uni_w[4][1][0] = ff_hevc_put_hevc_uni_w_qpel_v12_8_msa;
++            c->put_hevc_qpel_uni_w[5][1][0] = ff_hevc_put_hevc_uni_w_qpel_v16_8_msa;
++            c->put_hevc_qpel_uni_w[6][1][0] = ff_hevc_put_hevc_uni_w_qpel_v24_8_msa;
++            c->put_hevc_qpel_uni_w[7][1][0] = ff_hevc_put_hevc_uni_w_qpel_v32_8_msa;
++            c->put_hevc_qpel_uni_w[8][1][0] = ff_hevc_put_hevc_uni_w_qpel_v48_8_msa;
++            c->put_hevc_qpel_uni_w[9][1][0] = ff_hevc_put_hevc_uni_w_qpel_v64_8_msa;
++
++            c->put_hevc_qpel_uni_w[1][1][1] = ff_hevc_put_hevc_uni_w_qpel_hv4_8_msa;
++            c->put_hevc_qpel_uni_w[3][1][1] = ff_hevc_put_hevc_uni_w_qpel_hv8_8_msa;
++            c->put_hevc_qpel_uni_w[4][1][1] =
++                ff_hevc_put_hevc_uni_w_qpel_hv12_8_msa;
++            c->put_hevc_qpel_uni_w[5][1][1] =
++                ff_hevc_put_hevc_uni_w_qpel_hv16_8_msa;
++            c->put_hevc_qpel_uni_w[6][1][1] =
++                ff_hevc_put_hevc_uni_w_qpel_hv24_8_msa;
++            c->put_hevc_qpel_uni_w[7][1][1] =
++                ff_hevc_put_hevc_uni_w_qpel_hv32_8_msa;
++            c->put_hevc_qpel_uni_w[8][1][1] =
++                ff_hevc_put_hevc_uni_w_qpel_hv48_8_msa;
++            c->put_hevc_qpel_uni_w[9][1][1] =
++                ff_hevc_put_hevc_uni_w_qpel_hv64_8_msa;
++
++            c->put_hevc_epel_uni_w[1][0][0] =
++                ff_hevc_put_hevc_uni_w_pel_pixels4_8_msa;
++            c->put_hevc_epel_uni_w[2][0][0] =
++                ff_hevc_put_hevc_uni_w_pel_pixels6_8_msa;
++            c->put_hevc_epel_uni_w[3][0][0] =
++                ff_hevc_put_hevc_uni_w_pel_pixels8_8_msa;
++            c->put_hevc_epel_uni_w[4][0][0] =
++                ff_hevc_put_hevc_uni_w_pel_pixels12_8_msa;
++            c->put_hevc_epel_uni_w[5][0][0] =
++                ff_hevc_put_hevc_uni_w_pel_pixels16_8_msa;
++            c->put_hevc_epel_uni_w[6][0][0] =
++                ff_hevc_put_hevc_uni_w_pel_pixels24_8_msa;
++            c->put_hevc_epel_uni_w[7][0][0] =
++                ff_hevc_put_hevc_uni_w_pel_pixels32_8_msa;
++
++            c->put_hevc_epel_uni_w[1][0][1] = ff_hevc_put_hevc_uni_w_epel_h4_8_msa;
++            c->put_hevc_epel_uni_w[2][0][1] = ff_hevc_put_hevc_uni_w_epel_h6_8_msa;
++            c->put_hevc_epel_uni_w[3][0][1] = ff_hevc_put_hevc_uni_w_epel_h8_8_msa;
++            c->put_hevc_epel_uni_w[4][0][1] = ff_hevc_put_hevc_uni_w_epel_h12_8_msa;
++            c->put_hevc_epel_uni_w[5][0][1] = ff_hevc_put_hevc_uni_w_epel_h16_8_msa;
++            c->put_hevc_epel_uni_w[6][0][1] = ff_hevc_put_hevc_uni_w_epel_h24_8_msa;
++            c->put_hevc_epel_uni_w[7][0][1] = ff_hevc_put_hevc_uni_w_epel_h32_8_msa;
++
++            c->put_hevc_epel_uni_w[1][1][0] = ff_hevc_put_hevc_uni_w_epel_v4_8_msa;
++            c->put_hevc_epel_uni_w[2][1][0] = ff_hevc_put_hevc_uni_w_epel_v6_8_msa;
++            c->put_hevc_epel_uni_w[3][1][0] = ff_hevc_put_hevc_uni_w_epel_v8_8_msa;
++            c->put_hevc_epel_uni_w[4][1][0] = ff_hevc_put_hevc_uni_w_epel_v12_8_msa;
++            c->put_hevc_epel_uni_w[5][1][0] = ff_hevc_put_hevc_uni_w_epel_v16_8_msa;
++            c->put_hevc_epel_uni_w[6][1][0] = ff_hevc_put_hevc_uni_w_epel_v24_8_msa;
++            c->put_hevc_epel_uni_w[7][1][0] = ff_hevc_put_hevc_uni_w_epel_v32_8_msa;
++
++            c->put_hevc_epel_uni_w[1][1][1] = ff_hevc_put_hevc_uni_w_epel_hv4_8_msa;
++            c->put_hevc_epel_uni_w[2][1][1] = ff_hevc_put_hevc_uni_w_epel_hv6_8_msa;
++            c->put_hevc_epel_uni_w[3][1][1] = ff_hevc_put_hevc_uni_w_epel_hv8_8_msa;
++            c->put_hevc_epel_uni_w[4][1][1] =
++                ff_hevc_put_hevc_uni_w_epel_hv12_8_msa;
++            c->put_hevc_epel_uni_w[5][1][1] =
++                ff_hevc_put_hevc_uni_w_epel_hv16_8_msa;
++            c->put_hevc_epel_uni_w[6][1][1] =
++                ff_hevc_put_hevc_uni_w_epel_hv24_8_msa;
++            c->put_hevc_epel_uni_w[7][1][1] =
++                ff_hevc_put_hevc_uni_w_epel_hv32_8_msa;
++
++            c->put_hevc_qpel_bi[1][0][0] = ff_hevc_put_hevc_bi_pel_pixels4_8_msa;
++            c->put_hevc_qpel_bi[3][0][0] = ff_hevc_put_hevc_bi_pel_pixels8_8_msa;
++            c->put_hevc_qpel_bi[4][0][0] = ff_hevc_put_hevc_bi_pel_pixels12_8_msa;
++            c->put_hevc_qpel_bi[5][0][0] = ff_hevc_put_hevc_bi_pel_pixels16_8_msa;
++            c->put_hevc_qpel_bi[6][0][0] = ff_hevc_put_hevc_bi_pel_pixels24_8_msa;
++            c->put_hevc_qpel_bi[7][0][0] = ff_hevc_put_hevc_bi_pel_pixels32_8_msa;
++            c->put_hevc_qpel_bi[8][0][0] = ff_hevc_put_hevc_bi_pel_pixels48_8_msa;
++            c->put_hevc_qpel_bi[9][0][0] = ff_hevc_put_hevc_bi_pel_pixels64_8_msa;
++
++            c->put_hevc_qpel_bi[1][0][1] = ff_hevc_put_hevc_bi_qpel_h4_8_msa;
++            c->put_hevc_qpel_bi[3][0][1] = ff_hevc_put_hevc_bi_qpel_h8_8_msa;
++            c->put_hevc_qpel_bi[4][0][1] = ff_hevc_put_hevc_bi_qpel_h12_8_msa;
++            c->put_hevc_qpel_bi[5][0][1] = ff_hevc_put_hevc_bi_qpel_h16_8_msa;
++            c->put_hevc_qpel_bi[6][0][1] = ff_hevc_put_hevc_bi_qpel_h24_8_msa;
++            c->put_hevc_qpel_bi[7][0][1] = ff_hevc_put_hevc_bi_qpel_h32_8_msa;
++            c->put_hevc_qpel_bi[8][0][1] = ff_hevc_put_hevc_bi_qpel_h48_8_msa;
++            c->put_hevc_qpel_bi[9][0][1] = ff_hevc_put_hevc_bi_qpel_h64_8_msa;
++
++            c->put_hevc_qpel_bi[1][1][0] = ff_hevc_put_hevc_bi_qpel_v4_8_msa;
++            c->put_hevc_qpel_bi[3][1][0] = ff_hevc_put_hevc_bi_qpel_v8_8_msa;
++            c->put_hevc_qpel_bi[4][1][0] = ff_hevc_put_hevc_bi_qpel_v12_8_msa;
++            c->put_hevc_qpel_bi[5][1][0] = ff_hevc_put_hevc_bi_qpel_v16_8_msa;
++            c->put_hevc_qpel_bi[6][1][0] = ff_hevc_put_hevc_bi_qpel_v24_8_msa;
++            c->put_hevc_qpel_bi[7][1][0] = ff_hevc_put_hevc_bi_qpel_v32_8_msa;
++            c->put_hevc_qpel_bi[8][1][0] = ff_hevc_put_hevc_bi_qpel_v48_8_msa;
++            c->put_hevc_qpel_bi[9][1][0] = ff_hevc_put_hevc_bi_qpel_v64_8_msa;
++
++            c->put_hevc_qpel_bi[1][1][1] = ff_hevc_put_hevc_bi_qpel_hv4_8_msa;
++            c->put_hevc_qpel_bi[3][1][1] = ff_hevc_put_hevc_bi_qpel_hv8_8_msa;
++            c->put_hevc_qpel_bi[4][1][1] = ff_hevc_put_hevc_bi_qpel_hv12_8_msa;
++            c->put_hevc_qpel_bi[5][1][1] = ff_hevc_put_hevc_bi_qpel_hv16_8_msa;
++            c->put_hevc_qpel_bi[6][1][1] = ff_hevc_put_hevc_bi_qpel_hv24_8_msa;
++            c->put_hevc_qpel_bi[7][1][1] = ff_hevc_put_hevc_bi_qpel_hv32_8_msa;
++            c->put_hevc_qpel_bi[8][1][1] = ff_hevc_put_hevc_bi_qpel_hv48_8_msa;
++            c->put_hevc_qpel_bi[9][1][1] = ff_hevc_put_hevc_bi_qpel_hv64_8_msa;
++
++            c->put_hevc_epel_bi[1][0][0] = ff_hevc_put_hevc_bi_pel_pixels4_8_msa;
++            c->put_hevc_epel_bi[2][0][0] = ff_hevc_put_hevc_bi_pel_pixels6_8_msa;
++            c->put_hevc_epel_bi[3][0][0] = ff_hevc_put_hevc_bi_pel_pixels8_8_msa;
++            c->put_hevc_epel_bi[4][0][0] = ff_hevc_put_hevc_bi_pel_pixels12_8_msa;
++            c->put_hevc_epel_bi[5][0][0] = ff_hevc_put_hevc_bi_pel_pixels16_8_msa;
++            c->put_hevc_epel_bi[6][0][0] = ff_hevc_put_hevc_bi_pel_pixels24_8_msa;
++            c->put_hevc_epel_bi[7][0][0] = ff_hevc_put_hevc_bi_pel_pixels32_8_msa;
++
++            c->put_hevc_epel_bi[1][0][1] = ff_hevc_put_hevc_bi_epel_h4_8_msa;
++            c->put_hevc_epel_bi[2][0][1] = ff_hevc_put_hevc_bi_epel_h6_8_msa;
++            c->put_hevc_epel_bi[3][0][1] = ff_hevc_put_hevc_bi_epel_h8_8_msa;
++            c->put_hevc_epel_bi[4][0][1] = ff_hevc_put_hevc_bi_epel_h12_8_msa;
++            c->put_hevc_epel_bi[5][0][1] = ff_hevc_put_hevc_bi_epel_h16_8_msa;
++            c->put_hevc_epel_bi[6][0][1] = ff_hevc_put_hevc_bi_epel_h24_8_msa;
++            c->put_hevc_epel_bi[7][0][1] = ff_hevc_put_hevc_bi_epel_h32_8_msa;
++
++            c->put_hevc_epel_bi[1][1][0] = ff_hevc_put_hevc_bi_epel_v4_8_msa;
++            c->put_hevc_epel_bi[2][1][0] = ff_hevc_put_hevc_bi_epel_v6_8_msa;
++            c->put_hevc_epel_bi[3][1][0] = ff_hevc_put_hevc_bi_epel_v8_8_msa;
++            c->put_hevc_epel_bi[4][1][0] = ff_hevc_put_hevc_bi_epel_v12_8_msa;
++            c->put_hevc_epel_bi[5][1][0] = ff_hevc_put_hevc_bi_epel_v16_8_msa;
++            c->put_hevc_epel_bi[6][1][0] = ff_hevc_put_hevc_bi_epel_v24_8_msa;
++            c->put_hevc_epel_bi[7][1][0] = ff_hevc_put_hevc_bi_epel_v32_8_msa;
++
++            c->put_hevc_epel_bi[1][1][1] = ff_hevc_put_hevc_bi_epel_hv4_8_msa;
++            c->put_hevc_epel_bi[2][1][1] = ff_hevc_put_hevc_bi_epel_hv6_8_msa;
++            c->put_hevc_epel_bi[3][1][1] = ff_hevc_put_hevc_bi_epel_hv8_8_msa;
++            c->put_hevc_epel_bi[4][1][1] = ff_hevc_put_hevc_bi_epel_hv12_8_msa;
++            c->put_hevc_epel_bi[5][1][1] = ff_hevc_put_hevc_bi_epel_hv16_8_msa;
++            c->put_hevc_epel_bi[6][1][1] = ff_hevc_put_hevc_bi_epel_hv24_8_msa;
++            c->put_hevc_epel_bi[7][1][1] = ff_hevc_put_hevc_bi_epel_hv32_8_msa;
++
++            c->put_hevc_qpel_bi_w[1][0][0] =
++                ff_hevc_put_hevc_bi_w_pel_pixels4_8_msa;
++            c->put_hevc_qpel_bi_w[3][0][0] =
++                ff_hevc_put_hevc_bi_w_pel_pixels8_8_msa;
++            c->put_hevc_qpel_bi_w[4][0][0] =
++                ff_hevc_put_hevc_bi_w_pel_pixels12_8_msa;
++            c->put_hevc_qpel_bi_w[5][0][0] =
++                ff_hevc_put_hevc_bi_w_pel_pixels16_8_msa;
++            c->put_hevc_qpel_bi_w[6][0][0] =
++                ff_hevc_put_hevc_bi_w_pel_pixels24_8_msa;
++            c->put_hevc_qpel_bi_w[7][0][0] =
++                ff_hevc_put_hevc_bi_w_pel_pixels32_8_msa;
++            c->put_hevc_qpel_bi_w[8][0][0] =
++                ff_hevc_put_hevc_bi_w_pel_pixels48_8_msa;
++            c->put_hevc_qpel_bi_w[9][0][0] =
++                ff_hevc_put_hevc_bi_w_pel_pixels64_8_msa;
++
++            c->put_hevc_qpel_bi_w[1][0][1] = ff_hevc_put_hevc_bi_w_qpel_h4_8_msa;
++            c->put_hevc_qpel_bi_w[3][0][1] = ff_hevc_put_hevc_bi_w_qpel_h8_8_msa;
++            c->put_hevc_qpel_bi_w[4][0][1] = ff_hevc_put_hevc_bi_w_qpel_h12_8_msa;
++            c->put_hevc_qpel_bi_w[5][0][1] = ff_hevc_put_hevc_bi_w_qpel_h16_8_msa;
++            c->put_hevc_qpel_bi_w[6][0][1] = ff_hevc_put_hevc_bi_w_qpel_h24_8_msa;
++            c->put_hevc_qpel_bi_w[7][0][1] = ff_hevc_put_hevc_bi_w_qpel_h32_8_msa;
++            c->put_hevc_qpel_bi_w[8][0][1] = ff_hevc_put_hevc_bi_w_qpel_h48_8_msa;
++            c->put_hevc_qpel_bi_w[9][0][1] = ff_hevc_put_hevc_bi_w_qpel_h64_8_msa;
++
++            c->put_hevc_qpel_bi_w[1][1][0] = ff_hevc_put_hevc_bi_w_qpel_v4_8_msa;
++            c->put_hevc_qpel_bi_w[3][1][0] = ff_hevc_put_hevc_bi_w_qpel_v8_8_msa;
++            c->put_hevc_qpel_bi_w[4][1][0] = ff_hevc_put_hevc_bi_w_qpel_v12_8_msa;
++            c->put_hevc_qpel_bi_w[5][1][0] = ff_hevc_put_hevc_bi_w_qpel_v16_8_msa;
++            c->put_hevc_qpel_bi_w[6][1][0] = ff_hevc_put_hevc_bi_w_qpel_v24_8_msa;
++            c->put_hevc_qpel_bi_w[7][1][0] = ff_hevc_put_hevc_bi_w_qpel_v32_8_msa;
++            c->put_hevc_qpel_bi_w[8][1][0] = ff_hevc_put_hevc_bi_w_qpel_v48_8_msa;
++            c->put_hevc_qpel_bi_w[9][1][0] = ff_hevc_put_hevc_bi_w_qpel_v64_8_msa;
++
++            c->put_hevc_qpel_bi_w[1][1][1] = ff_hevc_put_hevc_bi_w_qpel_hv4_8_msa;
++            c->put_hevc_qpel_bi_w[3][1][1] = ff_hevc_put_hevc_bi_w_qpel_hv8_8_msa;
++            c->put_hevc_qpel_bi_w[4][1][1] = ff_hevc_put_hevc_bi_w_qpel_hv12_8_msa;
++            c->put_hevc_qpel_bi_w[5][1][1] = ff_hevc_put_hevc_bi_w_qpel_hv16_8_msa;
++            c->put_hevc_qpel_bi_w[6][1][1] = ff_hevc_put_hevc_bi_w_qpel_hv24_8_msa;
++            c->put_hevc_qpel_bi_w[7][1][1] = ff_hevc_put_hevc_bi_w_qpel_hv32_8_msa;
++            c->put_hevc_qpel_bi_w[8][1][1] = ff_hevc_put_hevc_bi_w_qpel_hv48_8_msa;
++            c->put_hevc_qpel_bi_w[9][1][1] = ff_hevc_put_hevc_bi_w_qpel_hv64_8_msa;
++
++            c->put_hevc_epel_bi_w[1][0][0] =
++                ff_hevc_put_hevc_bi_w_pel_pixels4_8_msa;
++            c->put_hevc_epel_bi_w[2][0][0] =
++                ff_hevc_put_hevc_bi_w_pel_pixels6_8_msa;
++            c->put_hevc_epel_bi_w[3][0][0] =
++                ff_hevc_put_hevc_bi_w_pel_pixels8_8_msa;
++            c->put_hevc_epel_bi_w[4][0][0] =
++                ff_hevc_put_hevc_bi_w_pel_pixels12_8_msa;
++            c->put_hevc_epel_bi_w[5][0][0] =
++                ff_hevc_put_hevc_bi_w_pel_pixels16_8_msa;
++            c->put_hevc_epel_bi_w[6][0][0] =
++                ff_hevc_put_hevc_bi_w_pel_pixels24_8_msa;
++            c->put_hevc_epel_bi_w[7][0][0] =
++                ff_hevc_put_hevc_bi_w_pel_pixels32_8_msa;
++
++            c->put_hevc_epel_bi_w[1][0][1] = ff_hevc_put_hevc_bi_w_epel_h4_8_msa;
++            c->put_hevc_epel_bi_w[2][0][1] = ff_hevc_put_hevc_bi_w_epel_h6_8_msa;
++            c->put_hevc_epel_bi_w[3][0][1] = ff_hevc_put_hevc_bi_w_epel_h8_8_msa;
++            c->put_hevc_epel_bi_w[4][0][1] = ff_hevc_put_hevc_bi_w_epel_h12_8_msa;
++            c->put_hevc_epel_bi_w[5][0][1] = ff_hevc_put_hevc_bi_w_epel_h16_8_msa;
++            c->put_hevc_epel_bi_w[6][0][1] = ff_hevc_put_hevc_bi_w_epel_h24_8_msa;
++            c->put_hevc_epel_bi_w[7][0][1] = ff_hevc_put_hevc_bi_w_epel_h32_8_msa;
++
++            c->put_hevc_epel_bi_w[1][1][0] = ff_hevc_put_hevc_bi_w_epel_v4_8_msa;
++            c->put_hevc_epel_bi_w[2][1][0] = ff_hevc_put_hevc_bi_w_epel_v6_8_msa;
++            c->put_hevc_epel_bi_w[3][1][0] = ff_hevc_put_hevc_bi_w_epel_v8_8_msa;
++            c->put_hevc_epel_bi_w[4][1][0] = ff_hevc_put_hevc_bi_w_epel_v12_8_msa;
++            c->put_hevc_epel_bi_w[5][1][0] = ff_hevc_put_hevc_bi_w_epel_v16_8_msa;
++            c->put_hevc_epel_bi_w[6][1][0] = ff_hevc_put_hevc_bi_w_epel_v24_8_msa;
++            c->put_hevc_epel_bi_w[7][1][0] = ff_hevc_put_hevc_bi_w_epel_v32_8_msa;
++
++            c->put_hevc_epel_bi_w[1][1][1] = ff_hevc_put_hevc_bi_w_epel_hv4_8_msa;
++            c->put_hevc_epel_bi_w[2][1][1] = ff_hevc_put_hevc_bi_w_epel_hv6_8_msa;
++            c->put_hevc_epel_bi_w[3][1][1] = ff_hevc_put_hevc_bi_w_epel_hv8_8_msa;
++            c->put_hevc_epel_bi_w[4][1][1] = ff_hevc_put_hevc_bi_w_epel_hv12_8_msa;
++            c->put_hevc_epel_bi_w[5][1][1] = ff_hevc_put_hevc_bi_w_epel_hv16_8_msa;
++            c->put_hevc_epel_bi_w[6][1][1] = ff_hevc_put_hevc_bi_w_epel_hv24_8_msa;
++            c->put_hevc_epel_bi_w[7][1][1] = ff_hevc_put_hevc_bi_w_epel_hv32_8_msa;
++
++            c->sao_band_filter[0] =
++            c->sao_band_filter[1] =
++            c->sao_band_filter[2] =
++            c->sao_band_filter[3] =
++            c->sao_band_filter[4] = ff_hevc_sao_band_filter_0_8_msa;
++
++            c->sao_edge_filter[0] =
++            c->sao_edge_filter[1] =
++            c->sao_edge_filter[2] =
++            c->sao_edge_filter[3] =
++            c->sao_edge_filter[4] = ff_hevc_sao_edge_filter_8_msa;
++
++            c->hevc_h_loop_filter_luma = ff_hevc_loop_filter_luma_h_8_msa;
++            c->hevc_v_loop_filter_luma = ff_hevc_loop_filter_luma_v_8_msa;
++
++            c->hevc_h_loop_filter_chroma = ff_hevc_loop_filter_chroma_h_8_msa;
++            c->hevc_v_loop_filter_chroma = ff_hevc_loop_filter_chroma_v_8_msa;
++
++            c->hevc_h_loop_filter_luma_c = ff_hevc_loop_filter_luma_h_8_msa;
++            c->hevc_v_loop_filter_luma_c = ff_hevc_loop_filter_luma_v_8_msa;
++
++            c->hevc_h_loop_filter_chroma_c =
++                ff_hevc_loop_filter_chroma_h_8_msa;
++            c->hevc_v_loop_filter_chroma_c =
++                ff_hevc_loop_filter_chroma_v_8_msa;
++
++            c->idct[0] = ff_hevc_idct_4x4_msa;
++            c->idct[1] = ff_hevc_idct_8x8_msa;
++            c->idct[2] = ff_hevc_idct_16x16_msa;
++            c->idct[3] = ff_hevc_idct_32x32_msa;
++            c->idct_dc[0] = ff_hevc_idct_dc_4x4_msa;
++            c->idct_dc[1] = ff_hevc_idct_dc_8x8_msa;
++            c->idct_dc[2] = ff_hevc_idct_dc_16x16_msa;
++            c->idct_dc[3] = ff_hevc_idct_dc_32x32_msa;
++            c->add_residual[0] = ff_hevc_addblk_4x4_msa;
++            c->add_residual[1] = ff_hevc_addblk_8x8_msa;
++            c->add_residual[2] = ff_hevc_addblk_16x16_msa;
++            c->add_residual[3] = ff_hevc_addblk_32x32_msa;
++            c->transform_4x4_luma = ff_hevc_idct_luma_4x4_msa;
++        }
++    }
+ }
+diff -uNra ffmpeg-4.1.6/libavcodec/mips/hevcdsp_mips.h FFmpeg/libavcodec/mips/hevcdsp_mips.h
+--- a/libavcodec/mips/hevcdsp_mips.h	2020-07-03 01:22:31.000000000 +0800
++++ b/libavcodec/mips/hevcdsp_mips.h	2020-07-19 18:13:57.477934877 +0800
+@@ -479,4 +479,95 @@
+                               ptrdiff_t stride);
+ void ff_hevc_idct_luma_4x4_msa(int16_t *pi16Coeffs);
+ 
++/* Loongson optimization */
++#define L_MC(PEL, DIR, WIDTH, TYPE)                                          \
++void ff_hevc_put_hevc_##PEL##_##DIR##WIDTH##_8_##TYPE(int16_t *dst,          \
++                                                      uint8_t *src,          \
++                                                      ptrdiff_t src_stride,  \
++                                                      int height,            \
++                                                      intptr_t mx,           \
++                                                      intptr_t my,           \
++                                                      int width)
++L_MC(qpel, h, 4, mmi);
++L_MC(qpel, h, 8, mmi);
++L_MC(qpel, h, 12, mmi);
++L_MC(qpel, h, 16, mmi);
++L_MC(qpel, h, 24, mmi);
++L_MC(qpel, h, 32, mmi);
++L_MC(qpel, h, 48, mmi);
++L_MC(qpel, h, 64, mmi);
++
++L_MC(qpel, hv, 4, mmi);
++L_MC(qpel, hv, 8, mmi);
++L_MC(qpel, hv, 12, mmi);
++L_MC(qpel, hv, 16, mmi);
++L_MC(qpel, hv, 24, mmi);
++L_MC(qpel, hv, 32, mmi);
++L_MC(qpel, hv, 48, mmi);
++L_MC(qpel, hv, 64, mmi);
++
++#define L_BI_MC(PEL, DIR, WIDTH, TYPE)                                          \
++void ff_hevc_put_hevc_##PEL##_bi_##DIR##WIDTH##_8_##TYPE(uint8_t *dst,          \
++                                                         ptrdiff_t dst_stride,  \
++                                                         uint8_t *src,          \
++                                                         ptrdiff_t src_stride,  \
++                                                         int16_t *src2,         \
++                                                         int height,            \
++                                                         intptr_t mx,           \
++                                                         intptr_t my,           \
++                                                         int width)
++
++L_BI_MC(pel, pixels, 8, mmi);
++L_BI_MC(pel, pixels, 16, mmi);
++L_BI_MC(pel, pixels, 24, mmi);
++L_BI_MC(pel, pixels, 32, mmi);
++L_BI_MC(pel, pixels, 48, mmi);
++L_BI_MC(pel, pixels, 64, mmi);
++
++L_BI_MC(qpel, hv, 4, mmi);
++L_BI_MC(qpel, hv, 8, mmi);
++L_BI_MC(qpel, hv, 12, mmi);
++L_BI_MC(qpel, hv, 16, mmi);
++L_BI_MC(qpel, hv, 24, mmi);
++L_BI_MC(qpel, hv, 32, mmi);
++L_BI_MC(qpel, hv, 48, mmi);
++L_BI_MC(qpel, hv, 64, mmi);
++
++L_BI_MC(qpel, h, 4, mmi);
++L_BI_MC(qpel, h, 8, mmi);
++L_BI_MC(qpel, h, 12, mmi);
++L_BI_MC(qpel, h, 16, mmi);
++L_BI_MC(qpel, h, 24, mmi);
++L_BI_MC(qpel, h, 32, mmi);
++L_BI_MC(qpel, h, 48, mmi);
++L_BI_MC(qpel, h, 64, mmi);
++
++L_BI_MC(epel, hv, 4, mmi);
++L_BI_MC(epel, hv, 8, mmi);
++L_BI_MC(epel, hv, 12, mmi);
++L_BI_MC(epel, hv, 16, mmi);
++L_BI_MC(epel, hv, 24, mmi);
++L_BI_MC(epel, hv, 32, mmi);
++#undef L_BI_MC
++
++#define L_UNI_MC(PEL, DIR, WIDTH, TYPE)                                         \
++void ff_hevc_put_hevc_##PEL##_uni_##DIR##WIDTH##_8_##TYPE(uint8_t *dst,         \
++                                                          ptrdiff_t dst_stride, \
++                                                          uint8_t *src,         \
++                                                          ptrdiff_t src_stride, \
++                                                          int height,           \
++                                                          intptr_t mx,          \
++                                                          intptr_t my,          \
++                                                          int width)
++
++L_UNI_MC(qpel, hv, 4, mmi);
++L_UNI_MC(qpel, hv, 8, mmi);
++L_UNI_MC(qpel, hv, 12, mmi);
++L_UNI_MC(qpel, hv, 16, mmi);
++L_UNI_MC(qpel, hv, 24, mmi);
++L_UNI_MC(qpel, hv, 32, mmi);
++L_UNI_MC(qpel, hv, 48, mmi);
++L_UNI_MC(qpel, hv, 64, mmi);
++#undef L_UNI_MC
++
+ #endif  // #ifndef AVCODEC_MIPS_HEVCDSP_MIPS_H
+diff -uNra ffmpeg-4.1.6/libavcodec/mips/hevcdsp_mmi.c FFmpeg/libavcodec/mips/hevcdsp_mmi.c
+--- a/libavcodec/mips/hevcdsp_mmi.c	1970-01-01 08:00:00.000000000 +0800
++++ b/libavcodec/mips/hevcdsp_mmi.c	2020-07-19 18:13:57.477934877 +0800
+@@ -0,0 +1,1183 @@
++/*
++ * Copyright (c) 2019 Shiyou Yin (yinshiyou-hf@loongson.cn)
++ *
++ * This file is part of FFmpeg.
++ *
++ * FFmpeg is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * FFmpeg is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with FFmpeg; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
++ */
++
++#include "libavcodec/hevcdec.h"
++#include "libavcodec/bit_depth_template.c"
++#include "libavcodec/mips/hevcdsp_mips.h"
++#include "libavutil/mips/mmiutils.h"
++
++#define PUT_HEVC_QPEL_H(w, x_step, src_step, dst_step)                   \
++void ff_hevc_put_hevc_qpel_h##w##_8_mmi(int16_t *dst, uint8_t *_src,     \
++                                        ptrdiff_t _srcstride,            \
++                                        int height, intptr_t mx,         \
++                                        intptr_t my, int width)          \
++{                                                                        \
++    int x, y;                                                            \
++    pixel *src = (pixel*)_src - 3;                                       \
++    ptrdiff_t srcstride = _srcstride / sizeof(pixel);                    \
++    uint64_t ftmp[15];                                                   \
++    uint64_t rtmp[1];                                                    \
++    const int8_t *filter = ff_hevc_qpel_filters[mx - 1];                 \
++                                                                         \
++    x = x_step;                                                          \
++    y = height;                                                          \
++    __asm__ volatile(                                                    \
++        MMI_LDC1(%[ftmp1], %[filter], 0x00)                              \
++        "li           %[rtmp0],      0x08                       \n\t"    \
++        "dmtc1        %[rtmp0],      %[ftmp0]                   \n\t"    \
++        "punpckhbh    %[ftmp2],      %[ftmp0],      %[ftmp1]    \n\t"    \
++        "punpcklbh    %[ftmp1],      %[ftmp0],      %[ftmp1]    \n\t"    \
++        "psrah        %[ftmp1],      %[ftmp1],      %[ftmp0]    \n\t"    \
++        "psrah        %[ftmp2],      %[ftmp2],      %[ftmp0]    \n\t"    \
++        "xor          %[ftmp0],      %[ftmp0],      %[ftmp0]    \n\t"    \
++                                                                         \
++        "1:                                                     \n\t"    \
++        "2:                                                     \n\t"    \
++        "gsldlc1      %[ftmp3],      0x07(%[src])               \n\t"    \
++        "gsldrc1      %[ftmp3],      0x00(%[src])               \n\t"    \
++        "gsldlc1      %[ftmp4],      0x08(%[src])               \n\t"    \
++        "gsldrc1      %[ftmp4],      0x01(%[src])               \n\t"    \
++        "gsldlc1      %[ftmp5],      0x09(%[src])               \n\t"    \
++        "gsldrc1      %[ftmp5],      0x02(%[src])               \n\t"    \
++        "gsldlc1      %[ftmp6],      0x0a(%[src])               \n\t"    \
++        "gsldrc1      %[ftmp6],      0x03(%[src])               \n\t"    \
++        "punpcklbh    %[ftmp7],      %[ftmp3],      %[ftmp0]    \n\t"    \
++        "punpckhbh    %[ftmp8],      %[ftmp3],      %[ftmp0]    \n\t"    \
++        "pmullh       %[ftmp7],      %[ftmp7],      %[ftmp1]    \n\t"    \
++        "pmullh       %[ftmp8],      %[ftmp8],      %[ftmp2]    \n\t"    \
++        "paddh        %[ftmp3],      %[ftmp7],      %[ftmp8]    \n\t"    \
++        "punpcklbh    %[ftmp7],      %[ftmp4],      %[ftmp0]    \n\t"    \
++        "punpckhbh    %[ftmp8],      %[ftmp4],      %[ftmp0]    \n\t"    \
++        "pmullh       %[ftmp7],      %[ftmp7],      %[ftmp1]    \n\t"    \
++        "pmullh       %[ftmp8],      %[ftmp8],      %[ftmp2]    \n\t"    \
++        "paddh        %[ftmp4],      %[ftmp7],      %[ftmp8]    \n\t"    \
++        "punpcklbh    %[ftmp7],      %[ftmp5],      %[ftmp0]    \n\t"    \
++        "punpckhbh    %[ftmp8],      %[ftmp5],      %[ftmp0]    \n\t"    \
++        "pmullh       %[ftmp7],      %[ftmp7],      %[ftmp1]    \n\t"    \
++        "pmullh       %[ftmp8],      %[ftmp8],      %[ftmp2]    \n\t"    \
++        "paddh        %[ftmp5],      %[ftmp7],      %[ftmp8]    \n\t"    \
++        "punpcklbh    %[ftmp7],      %[ftmp6],      %[ftmp0]    \n\t"    \
++        "punpckhbh    %[ftmp8],      %[ftmp6],      %[ftmp0]    \n\t"    \
++        "pmullh       %[ftmp7],      %[ftmp7],      %[ftmp1]    \n\t"    \
++        "pmullh       %[ftmp8],      %[ftmp8],      %[ftmp2]    \n\t"    \
++        "paddh        %[ftmp6],      %[ftmp7],      %[ftmp8]    \n\t"    \
++        TRANSPOSE_4H(%[ftmp3], %[ftmp4], %[ftmp5], %[ftmp6],             \
++                     %[ftmp7], %[ftmp8], %[ftmp9], %[ftmp10])            \
++        "paddh        %[ftmp3],      %[ftmp3],      %[ftmp4]    \n\t"    \
++        "paddh        %[ftmp5],      %[ftmp5],      %[ftmp6]    \n\t"    \
++        "paddh        %[ftmp3],      %[ftmp3],      %[ftmp5]    \n\t"    \
++        "gssdlc1      %[ftmp3],      0x07(%[dst])               \n\t"    \
++        "gssdrc1      %[ftmp3],      0x00(%[dst])               \n\t"    \
++                                                                         \
++        "daddi        %[x],          %[x],         -0x01        \n\t"    \
++        PTR_ADDIU    "%[src],        %[src],        0x04        \n\t"    \
++        PTR_ADDIU    "%[dst],        %[dst],        0x08        \n\t"    \
++        "bnez         %[x],          2b                         \n\t"    \
++                                                                         \
++        "daddi        %[y],          %[y],         -0x01        \n\t"    \
++        "li           %[x],        " #x_step "                  \n\t"    \
++        PTR_ADDIU    "%[src],        %[src],     " #src_step "  \n\t"    \
++        PTR_ADDIU    "%[dst],        %[dst],     " #dst_step "  \n\t"    \
++        PTR_ADDU     "%[src],        %[src],        %[stride]   \n\t"    \
++        PTR_ADDIU    "%[dst],        %[dst],        0x80        \n\t"    \
++        "bnez         %[y],          1b                         \n\t"    \
++        : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]),                  \
++          [ftmp2]"=&f"(ftmp[2]), [ftmp3]"=&f"(ftmp[3]),                  \
++          [ftmp4]"=&f"(ftmp[4]), [ftmp5]"=&f"(ftmp[5]),                  \
++          [ftmp6]"=&f"(ftmp[6]), [ftmp7]"=&f"(ftmp[7]),                  \
++          [ftmp8]"=&f"(ftmp[8]), [ftmp9]"=&f"(ftmp[9]),                  \
++          [ftmp10]"=&f"(ftmp[10]), [rtmp0]"=&r"(rtmp[0]),                \
++          [src]"+&r"(src), [dst]"+&r"(dst), [y]"+&r"(y),                 \
++          [x]"+&r"(x)                                                    \
++        : [filter]"r"(filter), [stride]"r"(srcstride)                    \
++        : "memory"                                                       \
++    );                                                                   \
++}
++
++PUT_HEVC_QPEL_H(4, 1, -4, -8);
++PUT_HEVC_QPEL_H(8, 2, -8, -16);
++PUT_HEVC_QPEL_H(12, 3, -12, -24);
++PUT_HEVC_QPEL_H(16, 4, -16, -32);
++PUT_HEVC_QPEL_H(24, 6, -24, -48);
++PUT_HEVC_QPEL_H(32, 8, -32, -64);
++PUT_HEVC_QPEL_H(48, 12, -48, -96);
++PUT_HEVC_QPEL_H(64, 16, -64, -128);
++
++#define PUT_HEVC_QPEL_HV(w, x_step, src_step, dst_step)                  \
++void ff_hevc_put_hevc_qpel_hv##w##_8_mmi(int16_t *dst, uint8_t *_src,    \
++                                     ptrdiff_t _srcstride,               \
++                                     int height, intptr_t mx,            \
++                                     intptr_t my, int width)             \
++{                                                                        \
++    int x, y;                                                            \
++    const int8_t *filter;                                                \
++    pixel *src = (pixel*)_src;                                           \
++    ptrdiff_t srcstride = _srcstride / sizeof(pixel);                    \
++    int16_t tmp_array[(MAX_PB_SIZE + QPEL_EXTRA) * MAX_PB_SIZE];         \
++    int16_t *tmp = tmp_array;                                            \
++    uint64_t ftmp[15];                                                   \
++    uint64_t rtmp[1];                                                    \
++                                                                         \
++    src   -= (QPEL_EXTRA_BEFORE * srcstride + 3);                        \
++    filter = ff_hevc_qpel_filters[mx - 1];                               \
++    x = x_step;                                                          \
++    y = height + QPEL_EXTRA;                                             \
++    __asm__ volatile(                                                    \
++        MMI_LDC1(%[ftmp1], %[filter], 0x00)                              \
++        "li           %[rtmp0],      0x08                       \n\t"    \
++        "dmtc1        %[rtmp0],      %[ftmp0]                   \n\t"    \
++        "punpckhbh    %[ftmp2],      %[ftmp0],      %[ftmp1]    \n\t"    \
++        "punpcklbh    %[ftmp1],      %[ftmp0],      %[ftmp1]    \n\t"    \
++        "psrah        %[ftmp1],      %[ftmp1],      %[ftmp0]    \n\t"    \
++        "psrah        %[ftmp2],      %[ftmp2],      %[ftmp0]    \n\t"    \
++        "xor          %[ftmp0],      %[ftmp0],      %[ftmp0]    \n\t"    \
++                                                                         \
++        "1:                                                     \n\t"    \
++        "2:                                                     \n\t"    \
++        "gsldlc1      %[ftmp3],      0x07(%[src])               \n\t"    \
++        "gsldrc1      %[ftmp3],      0x00(%[src])               \n\t"    \
++        "gsldlc1      %[ftmp4],      0x08(%[src])               \n\t"    \
++        "gsldrc1      %[ftmp4],      0x01(%[src])               \n\t"    \
++        "gsldlc1      %[ftmp5],      0x09(%[src])               \n\t"    \
++        "gsldrc1      %[ftmp5],      0x02(%[src])               \n\t"    \
++        "gsldlc1      %[ftmp6],      0x0a(%[src])               \n\t"    \
++        "gsldrc1      %[ftmp6],      0x03(%[src])               \n\t"    \
++        "punpcklbh    %[ftmp7],      %[ftmp3],      %[ftmp0]    \n\t"    \
++        "punpckhbh    %[ftmp8],      %[ftmp3],      %[ftmp0]    \n\t"    \
++        "pmullh       %[ftmp7],      %[ftmp7],      %[ftmp1]    \n\t"    \
++        "pmullh       %[ftmp8],      %[ftmp8],      %[ftmp2]    \n\t"    \
++        "paddh        %[ftmp3],      %[ftmp7],      %[ftmp8]    \n\t"    \
++        "punpcklbh    %[ftmp7],      %[ftmp4],      %[ftmp0]    \n\t"    \
++        "punpckhbh    %[ftmp8],      %[ftmp4],      %[ftmp0]    \n\t"    \
++        "pmullh       %[ftmp7],      %[ftmp7],      %[ftmp1]    \n\t"    \
++        "pmullh       %[ftmp8],      %[ftmp8],      %[ftmp2]    \n\t"    \
++        "paddh        %[ftmp4],      %[ftmp7],      %[ftmp8]    \n\t"    \
++        "punpcklbh    %[ftmp7],      %[ftmp5],      %[ftmp0]    \n\t"    \
++        "punpckhbh    %[ftmp8],      %[ftmp5],      %[ftmp0]    \n\t"    \
++        "pmullh       %[ftmp7],      %[ftmp7],      %[ftmp1]    \n\t"    \
++        "pmullh       %[ftmp8],      %[ftmp8],      %[ftmp2]    \n\t"    \
++        "paddh        %[ftmp5],      %[ftmp7],      %[ftmp8]    \n\t"    \
++        "punpcklbh    %[ftmp7],      %[ftmp6],      %[ftmp0]    \n\t"    \
++        "punpckhbh    %[ftmp8],      %[ftmp6],      %[ftmp0]    \n\t"    \
++        "pmullh       %[ftmp7],      %[ftmp7],      %[ftmp1]    \n\t"    \
++        "pmullh       %[ftmp8],      %[ftmp8],      %[ftmp2]    \n\t"    \
++        "paddh        %[ftmp6],      %[ftmp7],      %[ftmp8]    \n\t"    \
++        TRANSPOSE_4H(%[ftmp3], %[ftmp4], %[ftmp5], %[ftmp6],             \
++                     %[ftmp7], %[ftmp8], %[ftmp9], %[ftmp10])            \
++        "paddh        %[ftmp3],      %[ftmp3],      %[ftmp4]    \n\t"    \
++        "paddh        %[ftmp5],      %[ftmp5],      %[ftmp6]    \n\t"    \
++        "paddh        %[ftmp3],      %[ftmp3],      %[ftmp5]    \n\t"    \
++        "gssdlc1      %[ftmp3],      0x07(%[tmp])               \n\t"    \
++        "gssdrc1      %[ftmp3],      0x00(%[tmp])               \n\t"    \
++                                                                         \
++        "daddi        %[x],          %[x],         -0x01        \n\t"    \
++        PTR_ADDIU    "%[src],        %[src],        0x04        \n\t"    \
++        PTR_ADDIU    "%[tmp],        %[tmp],        0x08        \n\t"    \
++        "bnez         %[x],          2b                         \n\t"    \
++                                                                         \
++        "daddi        %[y],          %[y],         -0x01        \n\t"    \
++        "li           %[x],        " #x_step "                  \n\t"    \
++        PTR_ADDIU    "%[src],        %[src],     " #src_step "  \n\t"    \
++        PTR_ADDIU    "%[tmp],        %[tmp],     " #dst_step "  \n\t"    \
++        PTR_ADDU     "%[src],        %[src],        %[stride]   \n\t"    \
++        PTR_ADDIU    "%[tmp],        %[tmp],        0x80        \n\t"    \
++        "bnez         %[y],          1b                         \n\t"    \
++        : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]),                  \
++          [ftmp2]"=&f"(ftmp[2]), [ftmp3]"=&f"(ftmp[3]),                  \
++          [ftmp4]"=&f"(ftmp[4]), [ftmp5]"=&f"(ftmp[5]),                  \
++          [ftmp6]"=&f"(ftmp[6]), [ftmp7]"=&f"(ftmp[7]),                  \
++          [ftmp8]"=&f"(ftmp[8]), [ftmp9]"=&f"(ftmp[9]),                  \
++          [ftmp10]"=&f"(ftmp[10]), [rtmp0]"=&r"(rtmp[0]),                \
++          [src]"+&r"(src), [tmp]"+&r"(tmp), [y]"+&r"(y),                 \
++          [x]"+&r"(x)                                                    \
++        : [filter]"r"(filter), [stride]"r"(srcstride)                    \
++        : "memory"                                                       \
++    );                                                                   \
++                                                                         \
++    tmp    = tmp_array + QPEL_EXTRA_BEFORE * 4 -12;                      \
++    filter = ff_hevc_qpel_filters[my - 1];                               \
++    x = x_step;                                                          \
++    y = height;                                                          \
++    __asm__ volatile(                                                    \
++        MMI_LDC1(%[ftmp1], %[filter], 0x00)                              \
++        "li           %[rtmp0],      0x08                       \n\t"    \
++        "dmtc1        %[rtmp0],      %[ftmp0]                   \n\t"    \
++        "punpckhbh    %[ftmp2],      %[ftmp0],      %[ftmp1]    \n\t"    \
++        "punpcklbh    %[ftmp1],      %[ftmp0],      %[ftmp1]    \n\t"    \
++        "psrah        %[ftmp1],      %[ftmp1],      %[ftmp0]    \n\t"    \
++        "psrah        %[ftmp2],      %[ftmp2],      %[ftmp0]    \n\t"    \
++        "li           %[rtmp0],      0x06                       \n\t"    \
++        "dmtc1        %[rtmp0],      %[ftmp0]                   \n\t"    \
++                                                                         \
++        "1:                                                     \n\t"    \
++        "2:                                                     \n\t"    \
++        "gsldlc1      %[ftmp3],      0x07(%[tmp])               \n\t"    \
++        "gsldrc1      %[ftmp3],      0x00(%[tmp])               \n\t"    \
++        PTR_ADDIU    "%[tmp],        %[tmp],        0x80        \n\t"    \
++        "gsldlc1      %[ftmp4],      0x07(%[tmp])               \n\t"    \
++        "gsldrc1      %[ftmp4],      0x00(%[tmp])               \n\t"    \
++        PTR_ADDIU    "%[tmp],        %[tmp],        0x80        \n\t"    \
++        "gsldlc1      %[ftmp5],      0x07(%[tmp])               \n\t"    \
++        "gsldrc1      %[ftmp5],      0x00(%[tmp])               \n\t"    \
++        PTR_ADDIU    "%[tmp],        %[tmp],        0x80        \n\t"    \
++        "gsldlc1      %[ftmp6],      0x07(%[tmp])               \n\t"    \
++        "gsldrc1      %[ftmp6],      0x00(%[tmp])               \n\t"    \
++        PTR_ADDIU    "%[tmp],        %[tmp],        0x80        \n\t"    \
++        "gsldlc1      %[ftmp7],      0x07(%[tmp])               \n\t"    \
++        "gsldrc1      %[ftmp7],      0x00(%[tmp])               \n\t"    \
++        PTR_ADDIU    "%[tmp],        %[tmp],        0x80        \n\t"    \
++        "gsldlc1      %[ftmp8],      0x07(%[tmp])               \n\t"    \
++        "gsldrc1      %[ftmp8],      0x00(%[tmp])               \n\t"    \
++        PTR_ADDIU    "%[tmp],        %[tmp],        0x80        \n\t"    \
++        "gsldlc1      %[ftmp9],      0x07(%[tmp])               \n\t"    \
++        "gsldrc1      %[ftmp9],      0x00(%[tmp])               \n\t"    \
++        PTR_ADDIU    "%[tmp],        %[tmp],        0x80        \n\t"    \
++        "gsldlc1      %[ftmp10],     0x07(%[tmp])               \n\t"    \
++        "gsldrc1      %[ftmp10],     0x00(%[tmp])               \n\t"    \
++        PTR_ADDIU    "%[tmp],        %[tmp],        -0x380      \n\t"    \
++        TRANSPOSE_4H(%[ftmp3], %[ftmp4], %[ftmp5], %[ftmp6],             \
++                     %[ftmp11], %[ftmp12], %[ftmp13], %[ftmp14])         \
++        TRANSPOSE_4H(%[ftmp7], %[ftmp8], %[ftmp9], %[ftmp10],            \
++                     %[ftmp11], %[ftmp12], %[ftmp13], %[ftmp14])         \
++        "pmaddhw      %[ftmp11],     %[ftmp3],      %[ftmp1]    \n\t"    \
++        "pmaddhw      %[ftmp12],     %[ftmp7],      %[ftmp2]    \n\t"    \
++        "pmaddhw      %[ftmp13],     %[ftmp4],      %[ftmp1]    \n\t"    \
++        "pmaddhw      %[ftmp14],     %[ftmp8],      %[ftmp2]    \n\t"    \
++        "paddw        %[ftmp11],     %[ftmp11],     %[ftmp12]   \n\t"    \
++        "paddw        %[ftmp13],     %[ftmp13],     %[ftmp14]   \n\t"    \
++        TRANSPOSE_2W(%[ftmp11], %[ftmp13], %[ftmp3], %[ftmp4])           \
++        "paddw        %[ftmp3],      %[ftmp3],      %[ftmp4]    \n\t"    \
++        "psraw        %[ftmp3],      %[ftmp3],      %[ftmp0]    \n\t"    \
++        "pmaddhw      %[ftmp11],     %[ftmp5],      %[ftmp1]    \n\t"    \
++        "pmaddhw      %[ftmp12],     %[ftmp9],      %[ftmp2]    \n\t"    \
++        "pmaddhw      %[ftmp13],     %[ftmp6],      %[ftmp1]    \n\t"    \
++        "pmaddhw      %[ftmp14],     %[ftmp10],     %[ftmp2]    \n\t"    \
++        "paddw        %[ftmp11],     %[ftmp11],     %[ftmp12]   \n\t"    \
++        "paddw        %[ftmp13],     %[ftmp13],     %[ftmp14]   \n\t"    \
++        TRANSPOSE_2W(%[ftmp11], %[ftmp13], %[ftmp5], %[ftmp6])           \
++        "paddw        %[ftmp5],      %[ftmp5],      %[ftmp6]    \n\t"    \
++        "psraw        %[ftmp5],      %[ftmp5],      %[ftmp0]    \n\t"    \
++        "packsswh     %[ftmp3],      %[ftmp3],      %[ftmp5]    \n\t"    \
++        "gssdlc1      %[ftmp3],      0x07(%[dst])               \n\t"    \
++        "gssdrc1      %[ftmp3],      0x00(%[dst])               \n\t"    \
++                                                                         \
++        "daddi        %[x],          %[x],         -0x01        \n\t"    \
++        PTR_ADDIU    "%[dst],        %[dst],        0x08        \n\t"    \
++        PTR_ADDIU    "%[tmp],        %[tmp],        0x08        \n\t"    \
++        "bnez         %[x],          2b                         \n\t"    \
++                                                                         \
++        "daddi        %[y],          %[y],         -0x01        \n\t"    \
++        "li           %[x],        " #x_step "                  \n\t"    \
++        PTR_ADDIU    "%[dst],        %[dst],     " #dst_step "  \n\t"    \
++        PTR_ADDIU    "%[tmp],        %[tmp],     " #dst_step "  \n\t"    \
++        PTR_ADDIU    "%[dst],        %[dst],        0x80        \n\t"    \
++        PTR_ADDIU    "%[tmp],        %[tmp],        0x80        \n\t"    \
++        "bnez         %[y],          1b                         \n\t"    \
++        : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]),                  \
++          [ftmp2]"=&f"(ftmp[2]), [ftmp3]"=&f"(ftmp[3]),                  \
++          [ftmp4]"=&f"(ftmp[4]), [ftmp5]"=&f"(ftmp[5]),                  \
++          [ftmp6]"=&f"(ftmp[6]), [ftmp7]"=&f"(ftmp[7]),                  \
++          [ftmp8]"=&f"(ftmp[8]), [ftmp9]"=&f"(ftmp[9]),                  \
++          [ftmp10]"=&f"(ftmp[10]), [ftmp11]"=&f"(ftmp[11]),              \
++          [ftmp12]"=&f"(ftmp[12]), [ftmp13]"=&f"(ftmp[13]),              \
++          [ftmp14]"=&f"(ftmp[14]), [rtmp0]"=&r"(rtmp[0]),                \
++          [dst]"+&r"(dst), [tmp]"+&r"(tmp), [y]"+&r"(y),                 \
++          [x]"+&r"(x)                                                    \
++        : [filter]"r"(filter), [stride]"r"(srcstride)                    \
++        : "memory"                                                       \
++    );                                                                   \
++}
++
++PUT_HEVC_QPEL_HV(4, 1, -4, -8);
++PUT_HEVC_QPEL_HV(8, 2, -8, -16);
++PUT_HEVC_QPEL_HV(12, 3, -12, -24);
++PUT_HEVC_QPEL_HV(16, 4, -16, -32);
++PUT_HEVC_QPEL_HV(24, 6, -24, -48);
++PUT_HEVC_QPEL_HV(32, 8, -32, -64);
++PUT_HEVC_QPEL_HV(48, 12, -48, -96);
++PUT_HEVC_QPEL_HV(64, 16, -64, -128);
++
++#define PUT_HEVC_QPEL_BI_H(w, x_step, src_step, src2_step, dst_step)    \
++void ff_hevc_put_hevc_qpel_bi_h##w##_8_mmi(uint8_t *_dst,               \
++                                           ptrdiff_t _dststride,        \
++                                           uint8_t *_src,               \
++                                           ptrdiff_t _srcstride,        \
++                                           int16_t *src2, int height,   \
++                                           intptr_t mx, intptr_t my,    \
++                                           int width)                   \
++{                                                                       \
++    int x, y;                                                           \
++    pixel        *src       = (pixel*)_src - 3;                         \
++    ptrdiff_t     srcstride = _srcstride / sizeof(pixel);               \
++    pixel *dst          = (pixel *)_dst;                                \
++    ptrdiff_t dststride = _dststride / sizeof(pixel);                   \
++    const int8_t *filter    = ff_hevc_qpel_filters[mx - 1];             \
++    uint64_t ftmp[20];                                                  \
++    uint64_t rtmp[1];                                                   \
++    int shift = 7;                                                      \
++    int offset = 64;                                                    \
++                                                                        \
++    x = width >> 2;                                                     \
++    y = height;                                                         \
++    __asm__ volatile(                                                   \
++        MMI_LDC1(%[ftmp1], %[filter], 0x00)                             \
++        "li           %[rtmp0],      0x08                       \n\t"   \
++        "dmtc1        %[rtmp0],      %[ftmp0]                   \n\t"   \
++        "punpckhbh    %[ftmp2],      %[ftmp0],      %[ftmp1]    \n\t"   \
++        "punpcklbh    %[ftmp1],      %[ftmp0],      %[ftmp1]    \n\t"   \
++        "psrah        %[ftmp1],      %[ftmp1],      %[ftmp0]    \n\t"   \
++        "psrah        %[ftmp2],      %[ftmp2],      %[ftmp0]    \n\t"   \
++        "xor          %[ftmp0],      %[ftmp0],      %[ftmp0]    \n\t"   \
++        "punpcklhw    %[offset],     %[offset],     %[offset]   \n\t"   \
++        "punpcklwd    %[offset],     %[offset],     %[offset]   \n\t"   \
++                                                                        \
++        "1:                                                     \n\t"   \
++        "li           %[x],        " #x_step "                  \n\t"   \
++        "2:                                                     \n\t"   \
++        "gsldlc1      %[ftmp3],      0x07(%[src])               \n\t"   \
++        "gsldrc1      %[ftmp3],      0x00(%[src])               \n\t"   \
++        "gsldlc1      %[ftmp4],      0x08(%[src])               \n\t"   \
++        "gsldrc1      %[ftmp4],      0x01(%[src])               \n\t"   \
++        "gsldlc1      %[ftmp5],      0x09(%[src])               \n\t"   \
++        "gsldrc1      %[ftmp5],      0x02(%[src])               \n\t"   \
++        "gsldlc1      %[ftmp6],      0x0a(%[src])               \n\t"   \
++        "gsldrc1      %[ftmp6],      0x03(%[src])               \n\t"   \
++        "punpcklbh    %[ftmp7],      %[ftmp3],      %[ftmp0]    \n\t"   \
++        "punpckhbh    %[ftmp8],      %[ftmp3],      %[ftmp0]    \n\t"   \
++        "pmullh       %[ftmp7],      %[ftmp7],      %[ftmp1]    \n\t"   \
++        "pmullh       %[ftmp8],      %[ftmp8],      %[ftmp2]    \n\t"   \
++        "paddh        %[ftmp3],      %[ftmp7],      %[ftmp8]    \n\t"   \
++        "punpcklbh    %[ftmp7],      %[ftmp4],      %[ftmp0]    \n\t"   \
++        "punpckhbh    %[ftmp8],      %[ftmp4],      %[ftmp0]    \n\t"   \
++        "pmullh       %[ftmp7],      %[ftmp7],      %[ftmp1]    \n\t"   \
++        "pmullh       %[ftmp8],      %[ftmp8],      %[ftmp2]    \n\t"   \
++        "paddh        %[ftmp4],      %[ftmp7],      %[ftmp8]    \n\t"   \
++        "punpcklbh    %[ftmp7],      %[ftmp5],      %[ftmp0]    \n\t"   \
++        "punpckhbh    %[ftmp8],      %[ftmp5],      %[ftmp0]    \n\t"   \
++        "pmullh       %[ftmp7],      %[ftmp7],      %[ftmp1]    \n\t"   \
++        "pmullh       %[ftmp8],      %[ftmp8],      %[ftmp2]    \n\t"   \
++        "paddh        %[ftmp5],      %[ftmp7],      %[ftmp8]    \n\t"   \
++        "punpcklbh    %[ftmp7],      %[ftmp6],      %[ftmp0]    \n\t"   \
++        "punpckhbh    %[ftmp8],      %[ftmp6],      %[ftmp0]    \n\t"   \
++        "pmullh       %[ftmp7],      %[ftmp7],      %[ftmp1]    \n\t"   \
++        "pmullh       %[ftmp8],      %[ftmp8],      %[ftmp2]    \n\t"   \
++        "paddh        %[ftmp6],      %[ftmp7],      %[ftmp8]    \n\t"   \
++        TRANSPOSE_4H(%[ftmp3], %[ftmp4], %[ftmp5], %[ftmp6],            \
++                     %[ftmp7], %[ftmp8], %[ftmp9], %[ftmp10])           \
++        "paddh        %[ftmp3],      %[ftmp3],      %[ftmp4]    \n\t"   \
++        "paddh        %[ftmp5],      %[ftmp5],      %[ftmp6]    \n\t"   \
++        "paddh        %[ftmp3],      %[ftmp3],      %[ftmp5]    \n\t"   \
++        "paddh        %[ftmp3],      %[ftmp3],      %[offset]   \n\t"   \
++        "gsldlc1      %[ftmp4],      0x07(%[src2])              \n\t"   \
++        "gsldrc1      %[ftmp4],      0x00(%[src2])              \n\t"   \
++        "li           %[rtmp0],      0x10                       \n\t"   \
++        "dmtc1        %[rtmp0],      %[ftmp8]                   \n\t"   \
++        "punpcklhw    %[ftmp5],      %[ftmp0],      %[ftmp3]    \n\t"   \
++        "punpckhhw    %[ftmp6],      %[ftmp0],      %[ftmp3]    \n\t"   \
++        "punpckhhw    %[ftmp3],      %[ftmp0],      %[ftmp4]    \n\t"   \
++        "punpcklhw    %[ftmp4],      %[ftmp0],      %[ftmp4]    \n\t"   \
++        "psraw        %[ftmp5],      %[ftmp5],      %[ftmp8]    \n\t"   \
++        "psraw        %[ftmp6],      %[ftmp6],      %[ftmp8]    \n\t"   \
++        "psraw        %[ftmp3],      %[ftmp3],      %[ftmp8]    \n\t"   \
++        "psraw        %[ftmp4],      %[ftmp4],      %[ftmp8]    \n\t"   \
++        "paddw        %[ftmp5],      %[ftmp5],      %[ftmp4]    \n\t"   \
++        "paddw        %[ftmp6],      %[ftmp6],      %[ftmp3]    \n\t"   \
++        "psraw        %[ftmp5],      %[ftmp5],      %[shift]    \n\t"   \
++        "psraw        %[ftmp6],      %[ftmp6],      %[shift]    \n\t"   \
++        "packsswh     %[ftmp5],      %[ftmp5],      %[ftmp6]    \n\t"   \
++        "pcmpgth      %[ftmp7],      %[ftmp5],      %[ftmp0]    \n\t"   \
++        "and          %[ftmp3],      %[ftmp5],      %[ftmp7]    \n\t"   \
++        "packushb     %[ftmp3],      %[ftmp3],      %[ftmp3]    \n\t"   \
++        "gsswlc1      %[ftmp3],      0x03(%[dst])               \n\t"   \
++        "gsswrc1      %[ftmp3],      0x00(%[dst])               \n\t"   \
++                                                                        \
++        "daddi        %[x],          %[x],         -0x01        \n\t"   \
++        PTR_ADDIU    "%[src],        %[src],        0x04        \n\t"   \
++        PTR_ADDIU    "%[dst],        %[dst],        0x04        \n\t"   \
++        PTR_ADDIU    "%[src2],       %[src2],       0x08        \n\t"   \
++        "bnez         %[x],          2b                         \n\t"   \
++                                                                        \
++        "daddi        %[y],          %[y],         -0x01        \n\t"   \
++        PTR_ADDIU    "%[src],        %[src],     " #src_step "  \n\t"   \
++        PTR_ADDIU    "%[dst],        %[dst],     " #dst_step "  \n\t"   \
++        PTR_ADDIU    "%[src2],       %[src2],    " #src2_step " \n\t"   \
++        PTR_ADDU     "%[src],        %[src],    %[src_stride]   \n\t"   \
++        PTR_ADDU     "%[dst],        %[dst],    %[dst_stride]   \n\t"   \
++        PTR_ADDIU    "%[src2],       %[src2],       0x80        \n\t"   \
++        "bnez         %[y],          1b                         \n\t"   \
++        : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]),                 \
++          [ftmp2]"=&f"(ftmp[2]), [ftmp3]"=&f"(ftmp[3]),                 \
++          [ftmp4]"=&f"(ftmp[4]), [ftmp5]"=&f"(ftmp[5]),                 \
++          [ftmp6]"=&f"(ftmp[6]), [ftmp7]"=&f"(ftmp[7]),                 \
++          [ftmp8]"=&f"(ftmp[8]), [ftmp9]"=&f"(ftmp[9]),                 \
++          [ftmp10]"=&f"(ftmp[10]), [ftmp11]"=&f"(ftmp[11]),             \
++          [ftmp12]"=&f"(ftmp[12]), [src2]"+&r"(src2),                   \
++          [dst]"+&r"(dst), [src]"+&r"(src), [y]"+&r"(y), [x]"=&r"(x),   \
++          [offset]"+&f"(offset), [rtmp0]"=&r"(rtmp[0])                  \
++        : [src_stride]"r"(srcstride), [dst_stride]"r"(dststride),       \
++          [filter]"r"(filter), [shift]"f"(shift)                        \
++        : "memory"                                                      \
++    );                                                                  \
++}
++
++PUT_HEVC_QPEL_BI_H(4, 1, -4, -8, -4);
++PUT_HEVC_QPEL_BI_H(8, 2, -8, -16, -8);
++PUT_HEVC_QPEL_BI_H(12, 3, -12, -24, -12);
++PUT_HEVC_QPEL_BI_H(16, 4, -16, -32, -16);
++PUT_HEVC_QPEL_BI_H(24, 6, -24, -48, -24);
++PUT_HEVC_QPEL_BI_H(32, 8, -32, -64, -32);
++PUT_HEVC_QPEL_BI_H(48, 12, -48, -96, -48);
++PUT_HEVC_QPEL_BI_H(64, 16, -64, -128, -64);
++
++#define PUT_HEVC_QPEL_BI_HV(w, x_step, src_step, src2_step, dst_step)   \
++void ff_hevc_put_hevc_qpel_bi_hv##w##_8_mmi(uint8_t *_dst,              \
++                                            ptrdiff_t _dststride,       \
++                                            uint8_t *_src,              \
++                                            ptrdiff_t _srcstride,       \
++                                            int16_t *src2, int height,  \
++                                            intptr_t mx, intptr_t my,   \
++                                            int width)                  \
++{                                                                       \
++    int x, y;                                                           \
++    const int8_t *filter;                                               \
++    pixel *src = (pixel*)_src;                                          \
++    ptrdiff_t srcstride = _srcstride / sizeof(pixel);                   \
++    pixel *dst          = (pixel *)_dst;                                \
++    ptrdiff_t dststride = _dststride / sizeof(pixel);                   \
++    int16_t tmp_array[(MAX_PB_SIZE + QPEL_EXTRA) * MAX_PB_SIZE];        \
++    int16_t *tmp = tmp_array;                                           \
++    uint64_t ftmp[20];                                                  \
++    uint64_t rtmp[1];                                                   \
++    int shift = 7;                                                      \
++    int offset = 64;                                                    \
++                                                                        \
++    src   -= (QPEL_EXTRA_BEFORE * srcstride + 3);                       \
++    filter = ff_hevc_qpel_filters[mx - 1];                              \
++    x = width >> 2;                                                     \
++    y = height + QPEL_EXTRA;                                            \
++    __asm__ volatile(                                                   \
++        MMI_LDC1(%[ftmp1], %[filter], 0x00)                             \
++        "li           %[rtmp0],      0x08                       \n\t"   \
++        "dmtc1        %[rtmp0],      %[ftmp0]                   \n\t"   \
++        "punpckhbh    %[ftmp2],      %[ftmp0],      %[ftmp1]    \n\t"   \
++        "punpcklbh    %[ftmp1],      %[ftmp0],      %[ftmp1]    \n\t"   \
++        "psrah        %[ftmp1],      %[ftmp1],      %[ftmp0]    \n\t"   \
++        "psrah        %[ftmp2],      %[ftmp2],      %[ftmp0]    \n\t"   \
++        "xor          %[ftmp0],      %[ftmp0],      %[ftmp0]    \n\t"   \
++                                                                        \
++        "1:                                                     \n\t"   \
++        "2:                                                     \n\t"   \
++        "gsldlc1      %[ftmp3],      0x07(%[src])               \n\t"   \
++        "gsldrc1      %[ftmp3],      0x00(%[src])               \n\t"   \
++        "gsldlc1      %[ftmp4],      0x08(%[src])               \n\t"   \
++        "gsldrc1      %[ftmp4],      0x01(%[src])               \n\t"   \
++        "gsldlc1      %[ftmp5],      0x09(%[src])               \n\t"   \
++        "gsldrc1      %[ftmp5],      0x02(%[src])               \n\t"   \
++        "gsldlc1      %[ftmp6],      0x0a(%[src])               \n\t"   \
++        "gsldrc1      %[ftmp6],      0x03(%[src])               \n\t"   \
++        "punpcklbh    %[ftmp7],      %[ftmp3],      %[ftmp0]    \n\t"   \
++        "punpckhbh    %[ftmp8],      %[ftmp3],      %[ftmp0]    \n\t"   \
++        "pmullh       %[ftmp7],      %[ftmp7],      %[ftmp1]    \n\t"   \
++        "pmullh       %[ftmp8],      %[ftmp8],      %[ftmp2]    \n\t"   \
++        "paddh        %[ftmp3],      %[ftmp7],      %[ftmp8]    \n\t"   \
++        "punpcklbh    %[ftmp7],      %[ftmp4],      %[ftmp0]    \n\t"   \
++        "punpckhbh    %[ftmp8],      %[ftmp4],      %[ftmp0]    \n\t"   \
++        "pmullh       %[ftmp7],      %[ftmp7],      %[ftmp1]    \n\t"   \
++        "pmullh       %[ftmp8],      %[ftmp8],      %[ftmp2]    \n\t"   \
++        "paddh        %[ftmp4],      %[ftmp7],      %[ftmp8]    \n\t"   \
++        "punpcklbh    %[ftmp7],      %[ftmp5],      %[ftmp0]    \n\t"   \
++        "punpckhbh    %[ftmp8],      %[ftmp5],      %[ftmp0]    \n\t"   \
++        "pmullh       %[ftmp7],      %[ftmp7],      %[ftmp1]    \n\t"   \
++        "pmullh       %[ftmp8],      %[ftmp8],      %[ftmp2]    \n\t"   \
++        "paddh        %[ftmp5],      %[ftmp7],      %[ftmp8]    \n\t"   \
++        "punpcklbh    %[ftmp7],      %[ftmp6],      %[ftmp0]    \n\t"   \
++        "punpckhbh    %[ftmp8],      %[ftmp6],      %[ftmp0]    \n\t"   \
++        "pmullh       %[ftmp7],      %[ftmp7],      %[ftmp1]    \n\t"   \
++        "pmullh       %[ftmp8],      %[ftmp8],      %[ftmp2]    \n\t"   \
++        "paddh        %[ftmp6],      %[ftmp7],      %[ftmp8]    \n\t"   \
++        TRANSPOSE_4H(%[ftmp3], %[ftmp4], %[ftmp5], %[ftmp6],            \
++                     %[ftmp7], %[ftmp8], %[ftmp9], %[ftmp10])           \
++        "paddh        %[ftmp3],      %[ftmp3],      %[ftmp4]    \n\t"   \
++        "paddh        %[ftmp5],      %[ftmp5],      %[ftmp6]    \n\t"   \
++        "paddh        %[ftmp3],      %[ftmp3],      %[ftmp5]    \n\t"   \
++        "gssdlc1      %[ftmp3],      0x07(%[tmp])               \n\t"   \
++        "gssdrc1      %[ftmp3],      0x00(%[tmp])               \n\t"   \
++                                                                        \
++        "daddi        %[x],          %[x],         -0x01        \n\t"   \
++        PTR_ADDIU    "%[src],        %[src],        0x04        \n\t"   \
++        PTR_ADDIU    "%[tmp],        %[tmp],        0x08        \n\t"   \
++        "bnez         %[x],          2b                         \n\t"   \
++                                                                        \
++        "daddi        %[y],          %[y],         -0x01        \n\t"   \
++        "li           %[x],        " #x_step "                  \n\t"   \
++        PTR_ADDIU    "%[src],        %[src],      " #src_step " \n\t"   \
++        PTR_ADDIU    "%[tmp],        %[tmp],     " #src2_step " \n\t"   \
++        PTR_ADDU     "%[src],        %[src],        %[stride]   \n\t"   \
++        PTR_ADDIU    "%[tmp],        %[tmp],        0x80        \n\t"   \
++        "bnez         %[y],          1b                         \n\t"   \
++        : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]),                 \
++          [ftmp2]"=&f"(ftmp[2]), [ftmp3]"=&f"(ftmp[3]),                 \
++          [ftmp4]"=&f"(ftmp[4]), [ftmp5]"=&f"(ftmp[5]),                 \
++          [ftmp6]"=&f"(ftmp[6]), [ftmp7]"=&f"(ftmp[7]),                 \
++          [ftmp8]"=&f"(ftmp[8]), [ftmp9]"=&f"(ftmp[9]),                 \
++          [ftmp10]"=&f"(ftmp[10]), [rtmp0]"=&r"(rtmp[0]),               \
++          [src]"+&r"(src), [tmp]"+&r"(tmp), [y]"+&r"(y),                \
++          [x]"+&r"(x)                                                   \
++        : [filter]"r"(filter), [stride]"r"(srcstride)                   \
++        : "memory"                                                      \
++    );                                                                  \
++                                                                        \
++    tmp    = tmp_array;                                                 \
++    filter = ff_hevc_qpel_filters[my - 1];                              \
++    x = width >> 2;                                                     \
++    y = height;                                                         \
++    __asm__ volatile(                                                   \
++        MMI_LDC1(%[ftmp1], %[filter], 0x00)                             \
++        "li           %[rtmp0],      0x08                       \n\t"   \
++        "dmtc1        %[rtmp0],      %[ftmp0]                   \n\t"   \
++        "punpckhbh    %[ftmp2],      %[ftmp0],      %[ftmp1]    \n\t"   \
++        "punpcklbh    %[ftmp1],      %[ftmp0],      %[ftmp1]    \n\t"   \
++        "psrah        %[ftmp1],      %[ftmp1],      %[ftmp0]    \n\t"   \
++        "psrah        %[ftmp2],      %[ftmp2],      %[ftmp0]    \n\t"   \
++        "li           %[rtmp0],      0x06                       \n\t"   \
++        "dmtc1        %[rtmp0],      %[ftmp0]                   \n\t"   \
++        "punpcklwd    %[offset],     %[offset],     %[offset]   \n\t"   \
++                                                                        \
++        "1:                                                     \n\t"   \
++        "li           %[x],        " #x_step "                  \n\t"   \
++        "2:                                                     \n\t"   \
++        "gsldlc1      %[ftmp3],      0x07(%[tmp])               \n\t"   \
++        "gsldrc1      %[ftmp3],      0x00(%[tmp])               \n\t"   \
++        PTR_ADDIU    "%[tmp],        %[tmp],        0x80        \n\t"   \
++        "gsldlc1      %[ftmp4],      0x07(%[tmp])               \n\t"   \
++        "gsldrc1      %[ftmp4],      0x00(%[tmp])               \n\t"   \
++        PTR_ADDIU    "%[tmp],        %[tmp],        0x80        \n\t"   \
++        "gsldlc1      %[ftmp5],      0x07(%[tmp])               \n\t"   \
++        "gsldrc1      %[ftmp5],      0x00(%[tmp])               \n\t"   \
++        PTR_ADDIU    "%[tmp],        %[tmp],        0x80        \n\t"   \
++        "gsldlc1      %[ftmp6],      0x07(%[tmp])               \n\t"   \
++        "gsldrc1      %[ftmp6],      0x00(%[tmp])               \n\t"   \
++        PTR_ADDIU    "%[tmp],        %[tmp],        0x80        \n\t"   \
++        "gsldlc1      %[ftmp7],      0x07(%[tmp])               \n\t"   \
++        "gsldrc1      %[ftmp7],      0x00(%[tmp])               \n\t"   \
++        PTR_ADDIU    "%[tmp],        %[tmp],        0x80        \n\t"   \
++        "gsldlc1      %[ftmp8],      0x07(%[tmp])               \n\t"   \
++        "gsldrc1      %[ftmp8],      0x00(%[tmp])               \n\t"   \
++        PTR_ADDIU    "%[tmp],        %[tmp],        0x80        \n\t"   \
++        "gsldlc1      %[ftmp9],      0x07(%[tmp])               \n\t"   \
++        "gsldrc1      %[ftmp9],      0x00(%[tmp])               \n\t"   \
++        PTR_ADDIU    "%[tmp],        %[tmp],        0x80        \n\t"   \
++        "gsldlc1      %[ftmp10],     0x07(%[tmp])               \n\t"   \
++        "gsldrc1      %[ftmp10],     0x00(%[tmp])               \n\t"   \
++        PTR_ADDIU    "%[tmp],        %[tmp],        -0x380      \n\t"   \
++        TRANSPOSE_4H(%[ftmp3], %[ftmp4], %[ftmp5], %[ftmp6],            \
++                     %[ftmp11], %[ftmp12], %[ftmp13], %[ftmp14])        \
++        TRANSPOSE_4H(%[ftmp7], %[ftmp8], %[ftmp9], %[ftmp10],           \
++                     %[ftmp11], %[ftmp12], %[ftmp13], %[ftmp14])        \
++        "pmaddhw      %[ftmp11],     %[ftmp3],      %[ftmp1]    \n\t"   \
++        "pmaddhw      %[ftmp12],     %[ftmp7],      %[ftmp2]    \n\t"   \
++        "pmaddhw      %[ftmp13],     %[ftmp4],      %[ftmp1]    \n\t"   \
++        "pmaddhw      %[ftmp14],     %[ftmp8],      %[ftmp2]    \n\t"   \
++        "paddw        %[ftmp11],     %[ftmp11],     %[ftmp12]   \n\t"   \
++        "paddw        %[ftmp13],     %[ftmp13],     %[ftmp14]   \n\t"   \
++        TRANSPOSE_2W(%[ftmp11], %[ftmp13], %[ftmp3], %[ftmp4])          \
++        "paddw        %[ftmp3],      %[ftmp3],      %[ftmp4]    \n\t"   \
++        "psraw        %[ftmp3],      %[ftmp3],      %[ftmp0]    \n\t"   \
++        "pmaddhw      %[ftmp11],     %[ftmp5],      %[ftmp1]    \n\t"   \
++        "pmaddhw      %[ftmp12],     %[ftmp9],      %[ftmp2]    \n\t"   \
++        "pmaddhw      %[ftmp13],     %[ftmp6],      %[ftmp1]    \n\t"   \
++        "pmaddhw      %[ftmp14],     %[ftmp10],     %[ftmp2]    \n\t"   \
++        "paddw        %[ftmp11],     %[ftmp11],     %[ftmp12]   \n\t"   \
++        "paddw        %[ftmp13],     %[ftmp13],     %[ftmp14]   \n\t"   \
++        TRANSPOSE_2W(%[ftmp11], %[ftmp13], %[ftmp5], %[ftmp6])          \
++        "paddw        %[ftmp5],      %[ftmp5],      %[ftmp6]    \n\t"   \
++        "psraw        %[ftmp5],      %[ftmp5],      %[ftmp0]    \n\t"   \
++        "packsswh     %[ftmp3],      %[ftmp3],      %[ftmp5]    \n\t"   \
++        "gsldlc1      %[ftmp4],      0x07(%[src2])              \n\t"   \
++        "gsldrc1      %[ftmp4],      0x00(%[src2])              \n\t"   \
++        "xor          %[ftmp7],      %[ftmp7],      %[ftmp7]    \n\t"   \
++        "li           %[rtmp0],      0x10                       \n\t"   \
++        "dmtc1        %[rtmp0],      %[ftmp8]                   \n\t"   \
++        "punpcklhw    %[ftmp5],      %[ftmp7],      %[ftmp3]    \n\t"   \
++        "punpckhhw    %[ftmp6],      %[ftmp7],      %[ftmp3]    \n\t"   \
++        "punpckhhw    %[ftmp3],      %[ftmp7],      %[ftmp4]    \n\t"   \
++        "punpcklhw    %[ftmp4],      %[ftmp7],      %[ftmp4]    \n\t"   \
++        "psraw        %[ftmp5],      %[ftmp5],      %[ftmp8]    \n\t"   \
++        "psraw        %[ftmp6],      %[ftmp6],      %[ftmp8]    \n\t"   \
++        "psraw        %[ftmp3],      %[ftmp3],      %[ftmp8]    \n\t"   \
++        "psraw        %[ftmp4],      %[ftmp4],      %[ftmp8]    \n\t"   \
++        "paddw        %[ftmp5],      %[ftmp5],      %[ftmp4]    \n\t"   \
++        "paddw        %[ftmp6],      %[ftmp6],      %[ftmp3]    \n\t"   \
++        "paddw        %[ftmp5],      %[ftmp5],      %[offset]   \n\t"   \
++        "paddw        %[ftmp6],      %[ftmp6],      %[offset]   \n\t"   \
++        "psraw        %[ftmp5],      %[ftmp5],      %[shift]    \n\t"   \
++        "psraw        %[ftmp6],      %[ftmp6],      %[shift]    \n\t"   \
++        "packsswh     %[ftmp5],      %[ftmp5],      %[ftmp6]    \n\t"   \
++        "pcmpgth      %[ftmp7],      %[ftmp5],      %[ftmp7]    \n\t"   \
++        "and          %[ftmp3],      %[ftmp5],      %[ftmp7]    \n\t"   \
++        "packushb     %[ftmp3],      %[ftmp3],      %[ftmp3]    \n\t"   \
++        "gsswlc1      %[ftmp3],      0x03(%[dst])               \n\t"   \
++        "gsswrc1      %[ftmp3],      0x00(%[dst])               \n\t"   \
++                                                                        \
++        "daddi        %[x],          %[x],         -0x01        \n\t"   \
++        PTR_ADDIU    "%[src2],       %[src2],       0x08        \n\t"   \
++        PTR_ADDIU    "%[tmp],        %[tmp],        0x08        \n\t"   \
++        PTR_ADDIU    "%[dst],        %[dst],        0x04        \n\t"   \
++        "bnez         %[x],          2b                         \n\t"   \
++                                                                        \
++        "daddi        %[y],          %[y],         -0x01        \n\t"   \
++        PTR_ADDIU    "%[src2],       %[src2],    " #src2_step " \n\t"   \
++        PTR_ADDIU    "%[tmp],        %[tmp],     " #src2_step " \n\t"   \
++        PTR_ADDIU    "%[dst],        %[dst],     " #dst_step "  \n\t"   \
++        PTR_ADDIU    "%[src2],       %[src2],       0x80        \n\t"   \
++        PTR_ADDU     "%[dst],        %[dst],        %[stride]   \n\t"   \
++        PTR_ADDIU    "%[tmp],        %[tmp],        0x80        \n\t"   \
++        "bnez         %[y],          1b                         \n\t"   \
++        : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]),                 \
++          [ftmp2]"=&f"(ftmp[2]), [ftmp3]"=&f"(ftmp[3]),                 \
++          [ftmp4]"=&f"(ftmp[4]), [ftmp5]"=&f"(ftmp[5]),                 \
++          [ftmp6]"=&f"(ftmp[6]), [ftmp7]"=&f"(ftmp[7]),                 \
++          [ftmp8]"=&f"(ftmp[8]), [ftmp9]"=&f"(ftmp[9]),                 \
++          [ftmp10]"=&f"(ftmp[10]), [ftmp11]"=&f"(ftmp[11]),             \
++          [ftmp12]"=&f"(ftmp[12]), [ftmp13]"=&f"(ftmp[13]),             \
++          [ftmp14]"=&f"(ftmp[14]), [src2]"+&r"(src2),                   \
++          [dst]"+&r"(dst), [tmp]"+&r"(tmp), [y]"+&r"(y), [x]"=&r"(x),   \
++          [offset]"+&f"(offset), [rtmp0]"=&r"(rtmp[0])                  \
++        : [filter]"r"(filter), [stride]"r"(dststride),                  \
++          [shift]"f"(shift)                                             \
++        : "memory"                                                      \
++    );                                                                  \
++}
++
++PUT_HEVC_QPEL_BI_HV(4, 1, -4, -8, -4);
++PUT_HEVC_QPEL_BI_HV(8, 2, -8, -16, -8);
++PUT_HEVC_QPEL_BI_HV(12, 3, -12, -24, -12);
++PUT_HEVC_QPEL_BI_HV(16, 4, -16, -32, -16);
++PUT_HEVC_QPEL_BI_HV(24, 6, -24, -48, -24);
++PUT_HEVC_QPEL_BI_HV(32, 8, -32, -64, -32);
++PUT_HEVC_QPEL_BI_HV(48, 12, -48, -96, -48);
++PUT_HEVC_QPEL_BI_HV(64, 16, -64, -128, -64);
++
++#define PUT_HEVC_EPEL_BI_HV(w, x_step, src_step, src2_step, dst_step)   \
++void ff_hevc_put_hevc_epel_bi_hv##w##_8_mmi(uint8_t *_dst,              \
++                                            ptrdiff_t _dststride,       \
++                                            uint8_t *_src,              \
++                                            ptrdiff_t _srcstride,       \
++                                            int16_t *src2, int height,  \
++                                            intptr_t mx, intptr_t my,   \
++                                            int width)                  \
++{                                                                       \
++    int x, y;                                                           \
++    pixel *src = (pixel *)_src;                                         \
++    ptrdiff_t srcstride = _srcstride / sizeof(pixel);                   \
++    pixel *dst          = (pixel *)_dst;                                \
++    ptrdiff_t dststride = _dststride / sizeof(pixel);                   \
++    const int8_t *filter = ff_hevc_epel_filters[mx - 1];                \
++    int16_t tmp_array[(MAX_PB_SIZE + EPEL_EXTRA) * MAX_PB_SIZE];        \
++    int16_t *tmp = tmp_array;                                           \
++    uint64_t ftmp[12];                                                  \
++    uint64_t rtmp[1];                                                   \
++    int shift = 7;                                                      \
++    int offset = 64;                                                    \
++                                                                        \
++    src -= (EPEL_EXTRA_BEFORE * srcstride + 1);                         \
++    x = width >> 2;                                                     \
++    y = height + EPEL_EXTRA;                                            \
++    __asm__ volatile(                                                   \
++        MMI_LWC1(%[ftmp1], %[filter], 0x00)                             \
++        "li           %[rtmp0],      0x08                       \n\t"   \
++        "dmtc1        %[rtmp0],      %[ftmp0]                   \n\t"   \
++        "punpcklbh    %[ftmp1],      %[ftmp0],      %[ftmp1]    \n\t"   \
++        "psrah        %[ftmp1],      %[ftmp1],      %[ftmp0]    \n\t"   \
++        "xor          %[ftmp0],      %[ftmp0],      %[ftmp0]    \n\t"   \
++                                                                        \
++        "1:                                                     \n\t"   \
++        "2:                                                     \n\t"   \
++        "gslwlc1      %[ftmp2],      0x03(%[src])               \n\t"   \
++        "gslwrc1      %[ftmp2],      0x00(%[src])               \n\t"   \
++        "gslwlc1      %[ftmp3],      0x04(%[src])               \n\t"   \
++        "gslwrc1      %[ftmp3],      0x01(%[src])               \n\t"   \
++        "gslwlc1      %[ftmp4],      0x05(%[src])               \n\t"   \
++        "gslwrc1      %[ftmp4],      0x02(%[src])               \n\t"   \
++        "gslwlc1      %[ftmp5],      0x06(%[src])               \n\t"   \
++        "gslwrc1      %[ftmp5],      0x03(%[src])               \n\t"   \
++        "punpcklbh    %[ftmp2],      %[ftmp2],      %[ftmp0]    \n\t"   \
++        "pmullh       %[ftmp2],      %[ftmp2],      %[ftmp1]    \n\t"   \
++        "punpcklbh    %[ftmp3],      %[ftmp3],      %[ftmp0]    \n\t"   \
++        "pmullh       %[ftmp3],      %[ftmp3],      %[ftmp1]    \n\t"   \
++        "punpcklbh    %[ftmp4],      %[ftmp4],      %[ftmp0]    \n\t"   \
++        "pmullh       %[ftmp4],      %[ftmp4],      %[ftmp1]    \n\t"   \
++        "punpcklbh    %[ftmp5],      %[ftmp5],      %[ftmp0]    \n\t"   \
++        "pmullh       %[ftmp5],      %[ftmp5],      %[ftmp1]    \n\t"   \
++        TRANSPOSE_4H(%[ftmp2], %[ftmp3], %[ftmp4], %[ftmp5],            \
++                     %[ftmp6], %[ftmp7], %[ftmp8], %[ftmp9])            \
++        "paddh        %[ftmp2],      %[ftmp2],      %[ftmp3]    \n\t"   \
++        "paddh        %[ftmp4],      %[ftmp4],      %[ftmp5]    \n\t"   \
++        "paddh        %[ftmp2],      %[ftmp2],      %[ftmp4]    \n\t"   \
++        "gssdlc1      %[ftmp2],      0x07(%[tmp])               \n\t"   \
++        "gssdrc1      %[ftmp2],      0x00(%[tmp])               \n\t"   \
++                                                                        \
++        "daddi        %[x],          %[x],         -0x01        \n\t"   \
++        PTR_ADDIU    "%[src],        %[src],        0x04        \n\t"   \
++        PTR_ADDIU    "%[tmp],        %[tmp],        0x08        \n\t"   \
++        "bnez         %[x],          2b                         \n\t"   \
++                                                                        \
++        "daddi        %[y],          %[y],         -0x01        \n\t"   \
++        "li           %[x],        " #x_step "                  \n\t"   \
++        PTR_ADDIU    "%[src],        %[src],      " #src_step " \n\t"   \
++        PTR_ADDIU    "%[tmp],        %[tmp],     " #src2_step " \n\t"   \
++        PTR_ADDU     "%[src],        %[src],        %[stride]   \n\t"   \
++        PTR_ADDIU    "%[tmp],        %[tmp],        0x80        \n\t"   \
++        "bnez         %[y],          1b                         \n\t"   \
++        : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]),                 \
++          [ftmp2]"=&f"(ftmp[2]), [ftmp3]"=&f"(ftmp[3]),                 \
++          [ftmp4]"=&f"(ftmp[4]), [ftmp5]"=&f"(ftmp[5]),                 \
++          [ftmp6]"=&f"(ftmp[6]), [ftmp7]"=&f"(ftmp[7]),                 \
++          [ftmp8]"=&f"(ftmp[8]), [ftmp9]"=&f"(ftmp[9]),                 \
++          [rtmp0]"=&r"(rtmp[0]),                                        \
++          [src]"+&r"(src), [tmp]"+&r"(tmp), [y]"+&r"(y),                \
++          [x]"+&r"(x)                                                   \
++        : [filter]"r"(filter), [stride]"r"(srcstride)                   \
++        : "memory"                                                      \
++    );                                                                  \
++                                                                        \
++    tmp      = tmp_array;                                               \
++    filter = ff_hevc_epel_filters[my - 1];                              \
++    x = width >> 2;                                                     \
++    y = height;                                                         \
++    __asm__ volatile(                                                   \
++        MMI_LWC1(%[ftmp1], %[filter], 0x00)                             \
++        "li           %[rtmp0],      0x08                       \n\t"   \
++        "dmtc1        %[rtmp0],      %[ftmp0]                   \n\t"   \
++        "punpcklbh    %[ftmp1],      %[ftmp0],      %[ftmp1]    \n\t"   \
++        "psrah        %[ftmp1],      %[ftmp1],      %[ftmp0]    \n\t"   \
++        "li           %[rtmp0],      0x06                       \n\t"   \
++        "dmtc1        %[rtmp0],      %[ftmp0]                   \n\t"   \
++        "punpcklwd    %[offset],     %[offset],     %[offset]   \n\t"   \
++        "xor          %[ftmp2],      %[ftmp2],      %[ftmp2]    \n\t"   \
++                                                                        \
++        "1:                                                     \n\t"   \
++        "li           %[x],        " #x_step "                  \n\t"   \
++        "2:                                                     \n\t"   \
++        "gsldlc1      %[ftmp3],      0x07(%[tmp])               \n\t"   \
++        "gsldrc1      %[ftmp3],      0x00(%[tmp])               \n\t"   \
++        PTR_ADDIU    "%[tmp],        %[tmp],        0x80        \n\t"   \
++        "gsldlc1      %[ftmp4],      0x07(%[tmp])               \n\t"   \
++        "gsldrc1      %[ftmp4],      0x00(%[tmp])               \n\t"   \
++        PTR_ADDIU    "%[tmp],        %[tmp],        0x80        \n\t"   \
++        "gsldlc1      %[ftmp5],      0x07(%[tmp])               \n\t"   \
++        "gsldrc1      %[ftmp5],      0x00(%[tmp])               \n\t"   \
++        PTR_ADDIU    "%[tmp],        %[tmp],        0x80        \n\t"   \
++        "gsldlc1      %[ftmp6],      0x07(%[tmp])               \n\t"   \
++        "gsldrc1      %[ftmp6],      0x00(%[tmp])               \n\t"   \
++        PTR_ADDIU    "%[tmp],        %[tmp],       -0x180       \n\t"   \
++        TRANSPOSE_4H(%[ftmp3], %[ftmp4], %[ftmp5], %[ftmp6],            \
++                     %[ftmp7], %[ftmp8], %[ftmp9], %[ftmp10])           \
++        "pmaddhw      %[ftmp7],      %[ftmp3],      %[ftmp1]    \n\t"   \
++        "pmaddhw      %[ftmp8],      %[ftmp4],      %[ftmp1]    \n\t"   \
++        TRANSPOSE_2W(%[ftmp7], %[ftmp8], %[ftmp3], %[ftmp4])            \
++        "paddw        %[ftmp3],      %[ftmp3],      %[ftmp4]    \n\t"   \
++        "psraw        %[ftmp3],      %[ftmp3],      %[ftmp0]    \n\t"   \
++        "pmaddhw      %[ftmp7],      %[ftmp5],      %[ftmp1]    \n\t"   \
++        "pmaddhw      %[ftmp8],      %[ftmp6],      %[ftmp1]    \n\t"   \
++        TRANSPOSE_2W(%[ftmp7], %[ftmp8], %[ftmp5], %[ftmp6])            \
++        "paddw        %[ftmp5],      %[ftmp5],      %[ftmp6]    \n\t"   \
++        "psraw        %[ftmp5],      %[ftmp5],      %[ftmp0]    \n\t"   \
++        "packsswh     %[ftmp3],      %[ftmp3],      %[ftmp5]    \n\t"   \
++        "gsldlc1      %[ftmp4],      0x07(%[src2])              \n\t"   \
++        "gsldrc1      %[ftmp4],      0x00(%[src2])              \n\t"   \
++        "li           %[rtmp0],      0x10                       \n\t"   \
++        "dmtc1        %[rtmp0],      %[ftmp8]                   \n\t"   \
++        "punpcklhw    %[ftmp5],      %[ftmp2],      %[ftmp3]    \n\t"   \
++        "punpckhhw    %[ftmp6],      %[ftmp2],      %[ftmp3]    \n\t"   \
++        "punpckhhw    %[ftmp3],      %[ftmp2],      %[ftmp4]    \n\t"   \
++        "punpcklhw    %[ftmp4],      %[ftmp2],      %[ftmp4]    \n\t"   \
++        "psraw        %[ftmp5],      %[ftmp5],      %[ftmp8]    \n\t"   \
++        "psraw        %[ftmp6],      %[ftmp6],      %[ftmp8]    \n\t"   \
++        "psraw        %[ftmp3],      %[ftmp3],      %[ftmp8]    \n\t"   \
++        "psraw        %[ftmp4],      %[ftmp4],      %[ftmp8]    \n\t"   \
++        "paddw        %[ftmp5],      %[ftmp5],      %[ftmp4]    \n\t"   \
++        "paddw        %[ftmp6],      %[ftmp6],      %[ftmp3]    \n\t"   \
++        "paddw        %[ftmp5],      %[ftmp5],      %[offset]   \n\t"   \
++        "paddw        %[ftmp6],      %[ftmp6],      %[offset]   \n\t"   \
++        "psraw        %[ftmp5],      %[ftmp5],      %[shift]    \n\t"   \
++        "psraw        %[ftmp6],      %[ftmp6],      %[shift]    \n\t"   \
++        "packsswh     %[ftmp5],      %[ftmp5],      %[ftmp6]    \n\t"   \
++        "pcmpgth      %[ftmp7],      %[ftmp5],      %[ftmp2]    \n\t"   \
++        "and          %[ftmp3],      %[ftmp5],      %[ftmp7]    \n\t"   \
++        "packushb     %[ftmp3],      %[ftmp3],      %[ftmp3]    \n\t"   \
++        "gsswlc1      %[ftmp3],      0x03(%[dst])               \n\t"   \
++        "gsswrc1      %[ftmp3],      0x00(%[dst])               \n\t"   \
++                                                                        \
++        "daddi        %[x],          %[x],         -0x01        \n\t"   \
++        PTR_ADDIU    "%[src2],       %[src2],       0x08        \n\t"   \
++        PTR_ADDIU    "%[tmp],        %[tmp],        0x08        \n\t"   \
++        PTR_ADDIU    "%[dst],        %[dst],        0x04        \n\t"   \
++        "bnez         %[x],          2b                         \n\t"   \
++                                                                        \
++        "daddi        %[y],          %[y],         -0x01        \n\t"   \
++        PTR_ADDIU    "%[src2],       %[src2],    " #src2_step " \n\t"   \
++        PTR_ADDIU    "%[tmp],        %[tmp],     " #src2_step " \n\t"   \
++        PTR_ADDIU    "%[dst],        %[dst],     " #dst_step "  \n\t"   \
++        PTR_ADDIU    "%[src2],       %[src2],       0x80        \n\t"   \
++        PTR_ADDU     "%[dst],        %[dst],        %[stride]   \n\t"   \
++        PTR_ADDIU    "%[tmp],        %[tmp],        0x80        \n\t"   \
++        "bnez         %[y],          1b                         \n\t"   \
++        : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]),                 \
++          [ftmp2]"=&f"(ftmp[2]), [ftmp3]"=&f"(ftmp[3]),                 \
++          [ftmp4]"=&f"(ftmp[4]), [ftmp5]"=&f"(ftmp[5]),                 \
++          [ftmp6]"=&f"(ftmp[6]), [ftmp7]"=&f"(ftmp[7]),                 \
++          [ftmp8]"=&f"(ftmp[8]), [ftmp9]"=&f"(ftmp[9]),                 \
++          [ftmp10]"=&f"(ftmp[10]), [src2]"+&r"(src2),                   \
++          [dst]"+&r"(dst), [tmp]"+&r"(tmp), [y]"+&r"(y), [x]"=&r"(x),   \
++          [offset]"+&f"(offset), [rtmp0]"=&r"(rtmp[0])                  \
++        : [filter]"r"(filter), [stride]"r"(dststride),                  \
++          [shift]"f"(shift)                                             \
++        : "memory"                                                      \
++    );                                                                  \
++}
++
++PUT_HEVC_EPEL_BI_HV(4, 1, -4, -8, -4);
++PUT_HEVC_EPEL_BI_HV(8, 2, -8, -16, -8);
++PUT_HEVC_EPEL_BI_HV(12, 3, -12, -24, -12);
++PUT_HEVC_EPEL_BI_HV(16, 4, -16, -32, -16);
++PUT_HEVC_EPEL_BI_HV(24, 6, -24, -48, -24);
++PUT_HEVC_EPEL_BI_HV(32, 8, -32, -64, -32);
++
++#define PUT_HEVC_PEL_BI_PIXELS(w, x_step, src_step, dst_step, src2_step)  \
++void ff_hevc_put_hevc_pel_bi_pixels##w##_8_mmi(uint8_t *_dst,             \
++                                               ptrdiff_t _dststride,      \
++                                               uint8_t *_src,             \
++                                               ptrdiff_t _srcstride,      \
++                                               int16_t *src2, int height, \
++                                               intptr_t mx, intptr_t my,  \
++                                               int width)                 \
++{                                                                         \
++    int x, y;                                                             \
++    pixel *src          = (pixel *)_src;                                  \
++    ptrdiff_t srcstride = _srcstride / sizeof(pixel);                     \
++    pixel *dst          = (pixel *)_dst;                                  \
++    ptrdiff_t dststride = _dststride / sizeof(pixel);                     \
++    uint64_t ftmp[12];                                                    \
++    uint64_t rtmp[1];                                                     \
++    int shift = 7;                                                        \
++                                                                          \
++    y = height;                                                           \
++    x = width >> 3;                                                       \
++    __asm__ volatile(                                                     \
++        "xor          %[ftmp0],      %[ftmp0],      %[ftmp0]    \n\t"     \
++        "li           %[rtmp0],      0x06                       \n\t"     \
++        "dmtc1        %[rtmp0],      %[ftmp1]                   \n\t"     \
++        "li           %[rtmp0],      0x10                       \n\t"     \
++        "dmtc1        %[rtmp0],      %[ftmp10]                  \n\t"     \
++        "li           %[rtmp0],      0x40                       \n\t"     \
++        "dmtc1        %[rtmp0],      %[offset]                  \n\t"     \
++        "punpcklhw    %[offset],     %[offset],     %[offset]   \n\t"     \
++        "punpcklwd    %[offset],     %[offset],     %[offset]   \n\t"     \
++                                                                          \
++        "1:                                                     \n\t"     \
++        "2:                                                     \n\t"     \
++        "gsldlc1      %[ftmp5],      0x07(%[src])               \n\t"     \
++        "gsldrc1      %[ftmp5],      0x00(%[src])               \n\t"     \
++        "gsldlc1      %[ftmp2],      0x07(%[src2])              \n\t"     \
++        "gsldrc1      %[ftmp2],      0x00(%[src2])              \n\t"     \
++        "gsldlc1      %[ftmp3],      0x0f(%[src2])              \n\t"     \
++        "gsldrc1      %[ftmp3],      0x08(%[src2])              \n\t"     \
++        "punpcklbh    %[ftmp4],      %[ftmp5],      %[ftmp0]    \n\t"     \
++        "punpckhbh    %[ftmp5],      %[ftmp5],      %[ftmp0]    \n\t"     \
++        "psllh        %[ftmp4],      %[ftmp4],      %[ftmp1]    \n\t"     \
++        "psllh        %[ftmp5],      %[ftmp5],      %[ftmp1]    \n\t"     \
++        "paddh        %[ftmp4],      %[ftmp4],      %[offset]   \n\t"     \
++        "paddh        %[ftmp5],      %[ftmp5],      %[offset]   \n\t"     \
++        "punpcklhw    %[ftmp6],      %[ftmp4],      %[ftmp0]    \n\t"     \
++        "punpckhhw    %[ftmp7],      %[ftmp4],      %[ftmp0]    \n\t"     \
++        "punpcklhw    %[ftmp8],      %[ftmp5],      %[ftmp0]    \n\t"     \
++        "punpckhhw    %[ftmp9],      %[ftmp5],      %[ftmp0]    \n\t"     \
++        "punpcklhw    %[ftmp4],      %[ftmp0],      %[ftmp3]    \n\t"     \
++        "punpckhhw    %[ftmp5],      %[ftmp0],      %[ftmp3]    \n\t"     \
++        "punpckhhw    %[ftmp3],      %[ftmp0],      %[ftmp2]    \n\t"     \
++        "punpcklhw    %[ftmp2],      %[ftmp0],      %[ftmp2]    \n\t"     \
++        "psraw        %[ftmp2],      %[ftmp2],      %[ftmp10]   \n\t"     \
++        "psraw        %[ftmp3],      %[ftmp3],      %[ftmp10]   \n\t"     \
++        "psraw        %[ftmp4],      %[ftmp4],      %[ftmp10]   \n\t"     \
++        "psraw        %[ftmp5],      %[ftmp5],      %[ftmp10]   \n\t"     \
++        "paddw        %[ftmp2],      %[ftmp2],      %[ftmp6]    \n\t"     \
++        "paddw        %[ftmp3],      %[ftmp3],      %[ftmp7]    \n\t"     \
++        "paddw        %[ftmp4],      %[ftmp4],      %[ftmp8]    \n\t"     \
++        "paddw        %[ftmp5],      %[ftmp5],      %[ftmp9]    \n\t"     \
++        "psraw        %[ftmp2],      %[ftmp2],      %[shift]    \n\t"     \
++        "psraw        %[ftmp3],      %[ftmp3],      %[shift]    \n\t"     \
++        "psraw        %[ftmp4],      %[ftmp4],      %[shift]    \n\t"     \
++        "psraw        %[ftmp5],      %[ftmp5],      %[shift]    \n\t"     \
++        "packsswh     %[ftmp2],      %[ftmp2],      %[ftmp3]    \n\t"     \
++        "packsswh     %[ftmp4],      %[ftmp4],      %[ftmp5]    \n\t"     \
++        "pcmpgth      %[ftmp3],      %[ftmp2],      %[ftmp0]    \n\t"     \
++        "pcmpgth      %[ftmp5],      %[ftmp4],      %[ftmp0]    \n\t"     \
++        "and          %[ftmp2],      %[ftmp2],      %[ftmp3]    \n\t"     \
++        "and          %[ftmp4],      %[ftmp4],      %[ftmp5]    \n\t"     \
++        "packushb     %[ftmp2],      %[ftmp2],      %[ftmp4]    \n\t"     \
++        "gssdlc1      %[ftmp2],      0x07(%[dst])               \n\t"     \
++        "gssdrc1      %[ftmp2],      0x00(%[dst])               \n\t"     \
++                                                                          \
++        "daddi        %[x],          %[x],         -0x01        \n\t"     \
++        PTR_ADDIU    "%[src],        %[src],        0x08        \n\t"     \
++        PTR_ADDIU    "%[dst],        %[dst],        0x08        \n\t"     \
++        PTR_ADDIU    "%[src2],       %[src2],       0x10        \n\t"     \
++        "bnez         %[x],          2b                         \n\t"     \
++                                                                          \
++        PTR_ADDIU    "%[src],        %[src],     " #src_step "  \n\t"     \
++        PTR_ADDIU    "%[dst],        %[dst],     " #dst_step "  \n\t"     \
++        PTR_ADDIU    "%[src2],       %[src2],    " #src2_step " \n\t"     \
++        "li           %[x],        " #x_step "                  \n\t"     \
++        "daddi        %[y],          %[y],         -0x01        \n\t"     \
++        PTR_ADDU     "%[src],        %[src],       %[srcstride] \n\t"     \
++        PTR_ADDU     "%[dst],        %[dst],       %[dststride] \n\t"     \
++        PTR_ADDIU    "%[src2],       %[src2],       0x80        \n\t"     \
++        "bnez         %[y],          1b                         \n\t"     \
++        : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]),                   \
++          [ftmp2]"=&f"(ftmp[2]), [ftmp3]"=&f"(ftmp[3]),                   \
++          [ftmp4]"=&f"(ftmp[4]), [ftmp5]"=&f"(ftmp[5]),                   \
++          [ftmp6]"=&f"(ftmp[6]), [ftmp7]"=&f"(ftmp[7]),                   \
++          [ftmp8]"=&f"(ftmp[8]), [ftmp9]"=&f"(ftmp[9]),                   \
++          [ftmp10]"=&f"(ftmp[10]), [offset]"=&f"(ftmp[11]),               \
++          [src2]"+&r"(src2), [dst]"+&r"(dst), [src]"+&r"(src),            \
++          [x]"+&r"(x), [y]"+&r"(y), [rtmp0]"=&r"(rtmp[0])                 \
++        : [dststride]"r"(dststride), [shift]"f"(shift),                   \
++          [srcstride]"r"(srcstride)                                       \
++        : "memory"                                                        \
++    );                                                                    \
++}                                                                         \
++
++PUT_HEVC_PEL_BI_PIXELS(8, 1, -8, -8, -16);
++PUT_HEVC_PEL_BI_PIXELS(16, 2, -16, -16, -32);
++PUT_HEVC_PEL_BI_PIXELS(24, 3, -24, -24, -48);
++PUT_HEVC_PEL_BI_PIXELS(32, 4, -32, -32, -64);
++PUT_HEVC_PEL_BI_PIXELS(48, 6, -48, -48, -96);
++PUT_HEVC_PEL_BI_PIXELS(64, 8, -64, -64, -128);
++
++#define PUT_HEVC_QPEL_UNI_HV(w, x_step, src_step, dst_step, tmp_step)   \
++void ff_hevc_put_hevc_qpel_uni_hv##w##_8_mmi(uint8_t *_dst,             \
++                                             ptrdiff_t _dststride,      \
++                                             uint8_t *_src,             \
++                                             ptrdiff_t _srcstride,      \
++                                             int height,                \
++                                             intptr_t mx, intptr_t my,  \
++                                             int width)                 \
++{                                                                       \
++    int x, y;                                                           \
++    const int8_t *filter;                                               \
++    pixel *src = (pixel*)_src;                                          \
++    ptrdiff_t srcstride = _srcstride / sizeof(pixel);                   \
++    pixel *dst          = (pixel *)_dst;                                \
++    ptrdiff_t dststride = _dststride / sizeof(pixel);                   \
++    int16_t tmp_array[(MAX_PB_SIZE + QPEL_EXTRA) * MAX_PB_SIZE];        \
++    int16_t *tmp = tmp_array;                                           \
++    uint64_t ftmp[20];                                                  \
++    uint64_t rtmp[1];                                                   \
++    int shift = 6;                                                      \
++    int offset = 32;                                                    \
++                                                                        \
++    src   -= (QPEL_EXTRA_BEFORE * srcstride + 3);                       \
++    filter = ff_hevc_qpel_filters[mx - 1];                              \
++    x = width >> 2;                                                     \
++    y = height + QPEL_EXTRA;                                            \
++    __asm__ volatile(                                                   \
++        MMI_LDC1(%[ftmp1], %[filter], 0x00)                             \
++        "li           %[rtmp0],      0x08                       \n\t"   \
++        "dmtc1        %[rtmp0],      %[ftmp0]                   \n\t"   \
++        "punpckhbh    %[ftmp2],      %[ftmp0],      %[ftmp1]    \n\t"   \
++        "punpcklbh    %[ftmp1],      %[ftmp0],      %[ftmp1]    \n\t"   \
++        "psrah        %[ftmp1],      %[ftmp1],      %[ftmp0]    \n\t"   \
++        "psrah        %[ftmp2],      %[ftmp2],      %[ftmp0]    \n\t"   \
++        "xor          %[ftmp0],      %[ftmp0],      %[ftmp0]    \n\t"   \
++                                                                        \
++        "1:                                                     \n\t"   \
++        "2:                                                     \n\t"   \
++        "gsldlc1      %[ftmp3],      0x07(%[src])               \n\t"   \
++        "gsldrc1      %[ftmp3],      0x00(%[src])               \n\t"   \
++        "gsldlc1      %[ftmp4],      0x08(%[src])               \n\t"   \
++        "gsldrc1      %[ftmp4],      0x01(%[src])               \n\t"   \
++        "gsldlc1      %[ftmp5],      0x09(%[src])               \n\t"   \
++        "gsldrc1      %[ftmp5],      0x02(%[src])               \n\t"   \
++        "gsldlc1      %[ftmp6],      0x0a(%[src])               \n\t"   \
++        "gsldrc1      %[ftmp6],      0x03(%[src])               \n\t"   \
++        "punpcklbh    %[ftmp7],      %[ftmp3],      %[ftmp0]    \n\t"   \
++        "punpckhbh    %[ftmp8],      %[ftmp3],      %[ftmp0]    \n\t"   \
++        "pmullh       %[ftmp7],      %[ftmp7],      %[ftmp1]    \n\t"   \
++        "pmullh       %[ftmp8],      %[ftmp8],      %[ftmp2]    \n\t"   \
++        "paddh        %[ftmp3],      %[ftmp7],      %[ftmp8]    \n\t"   \
++        "punpcklbh    %[ftmp7],      %[ftmp4],      %[ftmp0]    \n\t"   \
++        "punpckhbh    %[ftmp8],      %[ftmp4],      %[ftmp0]    \n\t"   \
++        "pmullh       %[ftmp7],      %[ftmp7],      %[ftmp1]    \n\t"   \
++        "pmullh       %[ftmp8],      %[ftmp8],      %[ftmp2]    \n\t"   \
++        "paddh        %[ftmp4],      %[ftmp7],      %[ftmp8]    \n\t"   \
++        "punpcklbh    %[ftmp7],      %[ftmp5],      %[ftmp0]    \n\t"   \
++        "punpckhbh    %[ftmp8],      %[ftmp5],      %[ftmp0]    \n\t"   \
++        "pmullh       %[ftmp7],      %[ftmp7],      %[ftmp1]    \n\t"   \
++        "pmullh       %[ftmp8],      %[ftmp8],      %[ftmp2]    \n\t"   \
++        "paddh        %[ftmp5],      %[ftmp7],      %[ftmp8]    \n\t"   \
++        "punpcklbh    %[ftmp7],      %[ftmp6],      %[ftmp0]    \n\t"   \
++        "punpckhbh    %[ftmp8],      %[ftmp6],      %[ftmp0]    \n\t"   \
++        "pmullh       %[ftmp7],      %[ftmp7],      %[ftmp1]    \n\t"   \
++        "pmullh       %[ftmp8],      %[ftmp8],      %[ftmp2]    \n\t"   \
++        "paddh        %[ftmp6],      %[ftmp7],      %[ftmp8]    \n\t"   \
++        TRANSPOSE_4H(%[ftmp3], %[ftmp4], %[ftmp5], %[ftmp6],            \
++                     %[ftmp7], %[ftmp8], %[ftmp9], %[ftmp10])           \
++        "paddh        %[ftmp3],      %[ftmp3],      %[ftmp4]    \n\t"   \
++        "paddh        %[ftmp5],      %[ftmp5],      %[ftmp6]    \n\t"   \
++        "paddh        %[ftmp3],      %[ftmp3],      %[ftmp5]    \n\t"   \
++        "gssdlc1      %[ftmp3],      0x07(%[tmp])               \n\t"   \
++        "gssdrc1      %[ftmp3],      0x00(%[tmp])               \n\t"   \
++                                                                        \
++        "daddi        %[x],          %[x],         -0x01        \n\t"   \
++        PTR_ADDIU    "%[src],        %[src],        0x04        \n\t"   \
++        PTR_ADDIU    "%[tmp],        %[tmp],        0x08        \n\t"   \
++        "bnez         %[x],          2b                         \n\t"   \
++                                                                        \
++        "daddi        %[y],          %[y],         -0x01        \n\t"   \
++        "li           %[x],        " #x_step "                  \n\t"   \
++        PTR_ADDIU    "%[src],        %[src],      " #src_step " \n\t"   \
++        PTR_ADDIU    "%[tmp],        %[tmp],      " #tmp_step " \n\t"   \
++        PTR_ADDU     "%[src],        %[src],        %[stride]   \n\t"   \
++        PTR_ADDIU    "%[tmp],        %[tmp],        0x80        \n\t"   \
++        "bnez         %[y],          1b                         \n\t"   \
++        : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]),                 \
++          [ftmp2]"=&f"(ftmp[2]), [ftmp3]"=&f"(ftmp[3]),                 \
++          [ftmp4]"=&f"(ftmp[4]), [ftmp5]"=&f"(ftmp[5]),                 \
++          [ftmp6]"=&f"(ftmp[6]), [ftmp7]"=&f"(ftmp[7]),                 \
++          [ftmp8]"=&f"(ftmp[8]), [ftmp9]"=&f"(ftmp[9]),                 \
++          [ftmp10]"=&f"(ftmp[10]), [rtmp0]"=&r"(rtmp[0]),               \
++          [src]"+&r"(src), [tmp]"+&r"(tmp), [y]"+&r"(y),                \
++          [x]"+&r"(x)                                                   \
++        : [filter]"r"(filter), [stride]"r"(srcstride)                   \
++        : "memory"                                                      \
++    );                                                                  \
++                                                                        \
++    tmp    = tmp_array;                                                 \
++    filter = ff_hevc_qpel_filters[my - 1];                              \
++    x = width >> 2;                                                     \
++    y = height;                                                         \
++    __asm__ volatile(                                                   \
++        MMI_LDC1(%[ftmp1], %[filter], 0x00)                             \
++        "li           %[rtmp0],      0x08                       \n\t"   \
++        "dmtc1        %[rtmp0],      %[ftmp0]                   \n\t"   \
++        "punpckhbh    %[ftmp2],      %[ftmp0],      %[ftmp1]    \n\t"   \
++        "punpcklbh    %[ftmp1],      %[ftmp0],      %[ftmp1]    \n\t"   \
++        "psrah        %[ftmp1],      %[ftmp1],      %[ftmp0]    \n\t"   \
++        "psrah        %[ftmp2],      %[ftmp2],      %[ftmp0]    \n\t"   \
++        "li           %[rtmp0],      0x06                       \n\t"   \
++        "dmtc1        %[rtmp0],      %[ftmp0]                   \n\t"   \
++        "punpcklhw    %[offset],     %[offset],     %[offset]   \n\t"   \
++        "punpcklwd    %[offset],     %[offset],     %[offset]   \n\t"   \
++                                                                        \
++        "1:                                                     \n\t"   \
++        "li           %[x],        " #x_step "                  \n\t"   \
++        "2:                                                     \n\t"   \
++        "gsldlc1      %[ftmp3],      0x07(%[tmp])               \n\t"   \
++        "gsldrc1      %[ftmp3],      0x00(%[tmp])               \n\t"   \
++        PTR_ADDIU    "%[tmp],        %[tmp],        0x80        \n\t"   \
++        "gsldlc1      %[ftmp4],      0x07(%[tmp])               \n\t"   \
++        "gsldrc1      %[ftmp4],      0x00(%[tmp])               \n\t"   \
++        PTR_ADDIU    "%[tmp],        %[tmp],        0x80        \n\t"   \
++        "gsldlc1      %[ftmp5],      0x07(%[tmp])               \n\t"   \
++        "gsldrc1      %[ftmp5],      0x00(%[tmp])               \n\t"   \
++        PTR_ADDIU    "%[tmp],        %[tmp],        0x80        \n\t"   \
++        "gsldlc1      %[ftmp6],      0x07(%[tmp])               \n\t"   \
++        "gsldrc1      %[ftmp6],      0x00(%[tmp])               \n\t"   \
++        PTR_ADDIU    "%[tmp],        %[tmp],        0x80        \n\t"   \
++        "gsldlc1      %[ftmp7],      0x07(%[tmp])               \n\t"   \
++        "gsldrc1      %[ftmp7],      0x00(%[tmp])               \n\t"   \
++        PTR_ADDIU    "%[tmp],        %[tmp],        0x80        \n\t"   \
++        "gsldlc1      %[ftmp8],      0x07(%[tmp])               \n\t"   \
++        "gsldrc1      %[ftmp8],      0x00(%[tmp])               \n\t"   \
++        PTR_ADDIU    "%[tmp],        %[tmp],        0x80        \n\t"   \
++        "gsldlc1      %[ftmp9],      0x07(%[tmp])               \n\t"   \
++        "gsldrc1      %[ftmp9],      0x00(%[tmp])               \n\t"   \
++        PTR_ADDIU    "%[tmp],        %[tmp],        0x80        \n\t"   \
++        "gsldlc1      %[ftmp10],     0x07(%[tmp])               \n\t"   \
++        "gsldrc1      %[ftmp10],     0x00(%[tmp])               \n\t"   \
++        PTR_ADDIU    "%[tmp],        %[tmp],        -0x380      \n\t"   \
++        TRANSPOSE_4H(%[ftmp3], %[ftmp4], %[ftmp5], %[ftmp6],            \
++                     %[ftmp11], %[ftmp12], %[ftmp13], %[ftmp14])        \
++        TRANSPOSE_4H(%[ftmp7], %[ftmp8], %[ftmp9], %[ftmp10],           \
++                     %[ftmp11], %[ftmp12], %[ftmp13], %[ftmp14])        \
++        "pmaddhw      %[ftmp11],     %[ftmp3],      %[ftmp1]    \n\t"   \
++        "pmaddhw      %[ftmp12],     %[ftmp7],      %[ftmp2]    \n\t"   \
++        "pmaddhw      %[ftmp13],     %[ftmp4],      %[ftmp1]    \n\t"   \
++        "pmaddhw      %[ftmp14],     %[ftmp8],      %[ftmp2]    \n\t"   \
++        "paddw        %[ftmp11],     %[ftmp11],     %[ftmp12]   \n\t"   \
++        "paddw        %[ftmp13],     %[ftmp13],     %[ftmp14]   \n\t"   \
++        TRANSPOSE_2W(%[ftmp11], %[ftmp13], %[ftmp3], %[ftmp4])          \
++        "paddw        %[ftmp3],      %[ftmp3],      %[ftmp4]    \n\t"   \
++        "psraw        %[ftmp3],      %[ftmp3],      %[ftmp0]    \n\t"   \
++        "pmaddhw      %[ftmp11],     %[ftmp5],      %[ftmp1]    \n\t"   \
++        "pmaddhw      %[ftmp12],     %[ftmp9],      %[ftmp2]    \n\t"   \
++        "pmaddhw      %[ftmp13],     %[ftmp6],      %[ftmp1]    \n\t"   \
++        "pmaddhw      %[ftmp14],     %[ftmp10],     %[ftmp2]    \n\t"   \
++        "paddw        %[ftmp11],     %[ftmp11],     %[ftmp12]   \n\t"   \
++        "paddw        %[ftmp13],     %[ftmp13],     %[ftmp14]   \n\t"   \
++        TRANSPOSE_2W(%[ftmp11], %[ftmp13], %[ftmp5], %[ftmp6])          \
++        "paddw        %[ftmp5],      %[ftmp5],      %[ftmp6]    \n\t"   \
++        "psraw        %[ftmp5],      %[ftmp5],      %[ftmp0]    \n\t"   \
++        "packsswh     %[ftmp3],      %[ftmp3],      %[ftmp5]    \n\t"   \
++        "paddh        %[ftmp3],      %[ftmp3],      %[offset]   \n\t"   \
++        "psrah        %[ftmp3],      %[ftmp3],      %[shift]    \n\t"   \
++        "xor          %[ftmp7],      %[ftmp7],      %[ftmp7]    \n\t"   \
++        "pcmpgth      %[ftmp7],      %[ftmp3],      %[ftmp7]    \n\t"   \
++        "and          %[ftmp3],      %[ftmp3],      %[ftmp7]    \n\t"   \
++        "packushb     %[ftmp3],      %[ftmp3],      %[ftmp3]    \n\t"   \
++        "gsswlc1      %[ftmp3],      0x03(%[dst])               \n\t"   \
++        "gsswrc1      %[ftmp3],      0x00(%[dst])               \n\t"   \
++                                                                        \
++        "daddi        %[x],          %[x],         -0x01        \n\t"   \
++        PTR_ADDIU    "%[tmp],        %[tmp],        0x08        \n\t"   \
++        PTR_ADDIU    "%[dst],        %[dst],        0x04        \n\t"   \
++        "bnez         %[x],          2b                         \n\t"   \
++                                                                        \
++        "daddi        %[y],          %[y],         -0x01        \n\t"   \
++        PTR_ADDIU    "%[tmp],        %[tmp],     " #tmp_step "  \n\t"   \
++        PTR_ADDIU    "%[dst],        %[dst],     " #dst_step "  \n\t"   \
++        PTR_ADDU     "%[dst],        %[dst],        %[stride]   \n\t"   \
++        PTR_ADDIU    "%[tmp],        %[tmp],        0x80        \n\t"   \
++        "bnez         %[y],          1b                         \n\t"   \
++        : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]),                 \
++          [ftmp2]"=&f"(ftmp[2]), [ftmp3]"=&f"(ftmp[3]),                 \
++          [ftmp4]"=&f"(ftmp[4]), [ftmp5]"=&f"(ftmp[5]),                 \
++          [ftmp6]"=&f"(ftmp[6]), [ftmp7]"=&f"(ftmp[7]),                 \
++          [ftmp8]"=&f"(ftmp[8]), [ftmp9]"=&f"(ftmp[9]),                 \
++          [ftmp10]"=&f"(ftmp[10]), [ftmp11]"=&f"(ftmp[11]),             \
++          [ftmp12]"=&f"(ftmp[12]), [ftmp13]"=&f"(ftmp[13]),             \
++          [ftmp14]"=&f"(ftmp[14]),                                      \
++          [dst]"+&r"(dst), [tmp]"+&r"(tmp), [y]"+&r"(y), [x]"=&r"(x),   \
++          [offset]"+&f"(offset), [rtmp0]"=&r"(rtmp[0])                  \
++        : [filter]"r"(filter), [stride]"r"(dststride),                  \
++          [shift]"f"(shift)                                             \
++        : "memory"                                                      \
++    );                                                                  \
++}
++
++PUT_HEVC_QPEL_UNI_HV(4, 1, -4, -4, -8);
++PUT_HEVC_QPEL_UNI_HV(8, 2, -8, -8, -16);
++PUT_HEVC_QPEL_UNI_HV(12, 3, -12, -12, -24);
++PUT_HEVC_QPEL_UNI_HV(16, 4, -16, -16, -32);
++PUT_HEVC_QPEL_UNI_HV(24, 6, -24, -24, -48);
++PUT_HEVC_QPEL_UNI_HV(32, 8, -32, -32, -64);
++PUT_HEVC_QPEL_UNI_HV(48, 12, -48, -48, -96);
++PUT_HEVC_QPEL_UNI_HV(64, 16, -64, -64, -128);
+diff -uNra ffmpeg-4.1.6/libavcodec/mips/hevcdsp_msa.c FFmpeg/libavcodec/mips/hevcdsp_msa.c
+--- a/libavcodec/mips/hevcdsp_msa.c	2020-07-05 06:36:01.000000000 +0800
++++ b/libavcodec/mips/hevcdsp_msa.c	2020-07-19 18:13:57.477934877 +0800
+@@ -44,7 +44,7 @@
+         src0 = (v16i8) __msa_ilvr_w((v4i32) src1, (v4i32) src0);
+         in0 = (v8i16) __msa_ilvr_b(zero, src0);
+         in0 <<= 6;
+-        ST8x2_UB(in0, dst, 2 * dst_stride);
++        ST_D2(in0, 0, 1, dst, dst_stride);
+     } else if (4 == height) {
+         v16i8 src0, src1, src2, src3;
+         v8i16 in0, in1;
+@@ -55,7 +55,7 @@
+         ILVR_B2_SH(zero, src0, zero, src1, in0, in1);
+         in0 <<= 6;
+         in1 <<= 6;
+-        ST8x4_UB(in0, in1, dst, 2 * dst_stride);
++        ST_D4(in0, in1, 0, 1, 0, 1, dst, dst_stride);
+     } else if (0 == height % 8) {
+         v16i8 src0, src1, src2, src3, src4, src5, src6, src7;
+         v8i16 in0, in1, in2, in3;
+@@ -71,7 +71,7 @@
+             ILVR_B4_SH(zero, src0, zero, src1, zero, src2, zero, src3,
+                        in0, in1, in2, in3);
+             SLLI_4V(in0, in1, in2, in3, 6);
+-            ST8x8_UB(in0, in1, in2, in3, dst, 2 * dst_stride);
++            ST_D8(in0, in1, in2, in3, 0, 1, 0, 1, 0, 1, 0, 1, dst, dst_stride);
+             dst += (8 * dst_stride);
+         }
+     }
+@@ -183,7 +183,7 @@
+         in0 <<= 6;
+         in1 <<= 6;
+         ST_SH4(in0_r, in1_r, in2_r, in3_r, dst, dst_stride);
+-        ST8x4_UB(in0, in1, dst + 8, 2 * dst_stride);
++        ST_D4(in0, in1, 0, 1, 0, 1, dst + 8, dst_stride);
+         dst += (4 * dst_stride);
+ 
+         ILVR_B4_SH(zero, src4, zero, src5, zero, src6, zero, src7,
+@@ -194,7 +194,7 @@
+         in0 <<= 6;
+         in1 <<= 6;
+         ST_SH4(in0_r, in1_r, in2_r, in3_r, dst, dst_stride);
+-        ST8x4_UB(in0, in1, dst + 8, 2 * dst_stride);
++        ST_D4(in0, in1, 0, 1, 0, 1, dst + 8, dst_stride);
+         dst += (4 * dst_stride);
+     }
+ }
+@@ -495,7 +495,7 @@
+         DPADD_SB4_SH(vec0, vec1, vec2, vec3, filt0, filt1, filt2, filt3,
+                      dst3, dst3, dst3, dst3);
+ 
+-        ST8x8_UB(dst0, dst1, dst2, dst3, dst, 2 * dst_stride);
++        ST_D8(dst0, dst1, dst2, dst3, 0, 1, 0, 1, 0, 1, 0, 1, dst, dst_stride);
+         dst += (8 * dst_stride);
+     }
+ }
+@@ -1047,7 +1047,7 @@
+         DPADD_SB4_SH(src8776, src10998, src12111110, src14131312,
+                      filt0, filt1, filt2, filt3, dst76, dst76, dst76, dst76);
+ 
+-        ST8x8_UB(dst10, dst32, dst54, dst76, dst, 2 * dst_stride);
++        ST_D8(dst10, dst32, dst54, dst76, 0, 1, 0, 1, 0, 1, 0, 1, dst, dst_stride);
+         dst += (8 * dst_stride);
+ 
+         src2110 = src10998;
+@@ -1191,7 +1191,7 @@
+                      dst1_l, dst1_l, dst1_l, dst1_l);
+ 
+         ST_SH4(dst0_r, dst1_r, dst2_r, dst3_r, dst, dst_stride);
+-        ST8x4_UB(dst0_l, dst1_l, dst + 8, 2 * dst_stride);
++        ST_D4(dst0_l, dst1_l, 0, 1, 0, 1, dst + 8, dst_stride);
+         dst += (4 * dst_stride);
+ 
+         src10_r = src54_r;
+@@ -1363,7 +1363,6 @@
+                               int32_t height)
+ {
+     uint32_t loop_cnt;
+-    int32_t dst_stride_in_bytes = 2 * dst_stride;
+     v16i8 src0, src1, src2, src3, src4, src5, src6, src7, src8, src9, src10;
+     v8i16 filt0, filt1, filt2, filt3;
+     v8i16 filt_h0, filt_h1, filt_h2, filt_h3;
+@@ -1452,7 +1451,7 @@
+                                 filt_h0, filt_h1, filt_h2, filt_h3);
+         SRA_4V(dst0_r, dst1_r, dst2_r, dst3_r, 6);
+         PCKEV_H2_SW(dst1_r, dst0_r, dst3_r, dst2_r, dst0_r, dst2_r);
+-        ST8x4_UB(dst0_r, dst2_r, dst, dst_stride_in_bytes);
++        ST_D4(dst0_r, dst2_r, 0, 1, 0, 1, dst, dst_stride);
+         dst += (4 * dst_stride);
+ 
+         dst10_r = dst54_r;
+@@ -1607,7 +1606,6 @@
+                                int32_t height)
+ {
+     uint32_t loop_cnt;
+-    int32_t dst_stride_in_bytes = 2 * dst_stride;
+     uint8_t *src_tmp;
+     int16_t *dst_tmp;
+     v16i8 src0, src1, src2, src3, src4, src5, src6, src7, src8, src9, src10;
+@@ -1784,7 +1782,7 @@
+                                 filt_h1, filt_h2, filt_h3);
+         SRA_4V(dst0_r, dst1_r, dst2_r, dst3_r, 6);
+         PCKEV_H2_SW(dst1_r, dst0_r, dst3_r, dst2_r, dst0_r, dst2_r);
+-        ST8x4_UB(dst0_r, dst2_r, dst, dst_stride_in_bytes);
++        ST_D4(dst0_r, dst2_r, 0, 1, 0, 1, dst, dst_stride);
+         dst += (4 * dst_stride);
+ 
+         dst10_r = dst54_r;
+@@ -1872,7 +1870,7 @@
+     dst0 = const_vec;
+     DPADD_SB2_SH(vec0, vec1, filt0, filt1, dst0, dst0);
+ 
+-    ST8x2_UB(dst0, dst, 2 * dst_stride);
++    ST_D2(dst0, 0, 1, dst, dst_stride);
+ }
+ 
+ static void hevc_hz_4t_4x4_msa(uint8_t *src,
+@@ -1909,7 +1907,7 @@
+     dst1 = const_vec;
+     DPADD_SB2_SH(vec0, vec1, filt0, filt1, dst1, dst1);
+ 
+-    ST8x4_UB(dst0, dst1, dst, 2 * dst_stride);
++    ST_D4(dst0, dst1, 0, 1, 0, 1, dst, dst_stride);
+ }
+ 
+ static void hevc_hz_4t_4x8multiple_msa(uint8_t *src,
+@@ -1956,7 +1954,7 @@
+         dst3 = const_vec;
+         DPADD_SB2_SH(vec0, vec1, filt0, filt1, dst3, dst3);
+ 
+-        ST8x8_UB(dst0, dst1, dst2, dst3, dst, 2 * dst_stride);
++        ST_D8(dst0, dst1, dst2, dst3, 0, 1, 0, 1, 0, 1, 0, 1, dst, dst_stride);
+         dst += (8 * dst_stride);
+     }
+ }
+@@ -2218,7 +2216,7 @@
+         DPADD_SB2_SH(vec0, vec1, filt0, filt1, dst5, dst5);
+ 
+         ST_SH4(dst0, dst1, dst2, dst3, dst, dst_stride);
+-        ST8x4_UB(dst4, dst5, dst + 8, 2 * dst_stride);
++        ST_D4(dst4, dst5, 0, 1, 0, 1, dst + 8, dst_stride);
+         dst += (4 * dst_stride);
+     }
+ }
+@@ -2478,7 +2476,7 @@
+     dst10 = const_vec;
+     DPADD_SB2_SH(src2110, src4332, filt0, filt1, dst10, dst10);
+ 
+-    ST8x2_UB(dst10, dst, 2 * dst_stride);
++    ST_D2(dst10, 0, 1, dst, dst_stride);
+ }
+ 
+ static void hevc_vt_4t_4x4_msa(uint8_t *src,
+@@ -2515,7 +2513,7 @@
+     dst32 = const_vec;
+     DPADD_SB2_SH(src4332, src6554, filt0, filt1, dst32, dst32);
+ 
+-    ST8x4_UB(dst10, dst32, dst, 2 * dst_stride);
++    ST_D4(dst10, dst32, 0, 1, 0, 1, dst, dst_stride);
+ }
+ 
+ static void hevc_vt_4t_4x8_msa(uint8_t *src,
+@@ -2564,8 +2562,7 @@
+     DPADD_SB2_SH(src4332, src6554, filt0, filt1, dst32, dst32);
+     DPADD_SB2_SH(src6554, src8776, filt0, filt1, dst54, dst54);
+     DPADD_SB2_SH(src8776, src10998, filt0, filt1, dst76, dst76);
+-    ST8x8_UB(dst10, dst32, dst54, dst76, dst, 2 * dst_stride);
+-    dst += (8 * dst_stride);
++    ST_D8(dst10, dst32, dst54, dst76, 0, 1, 0, 1, 0, 1, 0, 1, dst, dst_stride);
+ }
+ 
+ static void hevc_vt_4t_4x16_msa(uint8_t *src, int32_t src_stride,
+@@ -2610,7 +2607,7 @@
+     DPADD_SB2_SH(src4332, src6554, filt0, filt1, dst32, dst32);
+     DPADD_SB2_SH(src6554, src8776, filt0, filt1, dst54, dst54);
+     DPADD_SB2_SH(src8776, src10998, filt0, filt1, dst76, dst76);
+-    ST8x8_UB(dst10, dst32, dst54, dst76, dst, 2 * dst_stride);
++    ST_D8(dst10, dst32, dst54, dst76, 0, 1, 0, 1, 0, 1, 0, 1, dst, dst_stride);
+     dst += (8 * dst_stride);
+ 
+     src2 = src10;
+@@ -2635,8 +2632,7 @@
+     DPADD_SB2_SH(src4332, src6554, filt0, filt1, dst32, dst32);
+     DPADD_SB2_SH(src6554, src8776, filt0, filt1, dst54, dst54);
+     DPADD_SB2_SH(src8776, src10998, filt0, filt1, dst76, dst76);
+-    ST8x8_UB(dst10, dst32, dst54, dst76, dst, 2 * dst_stride);
+-    dst += (8 * dst_stride);
++    ST_D8(dst10, dst32, dst54, dst76, 0, 1, 0, 1, 0, 1, 0, 1, dst, dst_stride);
+ }
+ 
+ static void hevc_vt_4t_4w_msa(uint8_t *src,
+@@ -2955,7 +2951,7 @@
+         DPADD_SB2_SH(src4332, src6554, filt0, filt1, dst1_l, dst1_l);
+ 
+         ST_SH4(dst0_r, dst1_r, dst2_r, dst3_r, dst, dst_stride);
+-        ST8x4_UB(dst0_l, dst1_l, dst + 8, (2 * dst_stride));
++        ST_D4(dst0_l, dst1_l, 0, 1, 0, 1, dst + 8, dst_stride);
+         dst += (4 * dst_stride);
+ 
+         src2 = src6;
+@@ -3243,7 +3239,6 @@
+                                const int8_t *filter_x,
+                                const int8_t *filter_y)
+ {
+-    int32_t dst_stride_in_bytes = 2 * dst_stride;
+     v16i8 src0, src1, src2, src3, src4;
+     v8i16 filt0, filt1;
+     v8i16 filt_h0, filt_h1;
+@@ -3288,7 +3283,7 @@
+     dst0 >>= 6;
+     dst1 >>= 6;
+     dst0 = (v4i32) __msa_pckev_h((v8i16) dst1, (v8i16) dst0);
+-    ST8x2_UB(dst0, dst, dst_stride_in_bytes);
++    ST_D2(dst0, 0, 1, dst, dst_stride);
+ }
+ 
+ static void hevc_hv_4t_4x4_msa(uint8_t *src,
+@@ -3298,7 +3293,6 @@
+                                const int8_t *filter_x,
+                                const int8_t *filter_y)
+ {
+-    int32_t dst_stride_in_bytes = 2 * dst_stride;
+     v16i8 src0, src1, src2, src3, src4, src5, src6;
+     v8i16 filt0, filt1;
+     v8i16 filt_h0, filt_h1;
+@@ -3351,7 +3345,7 @@
+     dst3 = HEVC_FILT_4TAP(dst43, dst65, filt_h0, filt_h1);
+     SRA_4V(dst0, dst1, dst2, dst3, 6);
+     PCKEV_H2_SW(dst1, dst0, dst3, dst2, dst0, dst2);
+-    ST8x4_UB(dst0, dst2, dst, dst_stride_in_bytes);
++    ST_D4(dst0, dst2, 0, 1, 0, 1, dst, dst_stride);
+ }
+ 
+ 
+@@ -3442,7 +3436,7 @@
+         SRA_4V(dst4, dst5, dst6, dst7, 6);
+         PCKEV_H4_SW(dst1, dst0, dst3, dst2, dst5, dst4, dst7, dst6,
+                     dst0, dst1, dst2, dst3);
+-        ST8x8_UB(dst0, dst1, dst2, dst3, dst, 2 * dst_stride);
++        ST_D8(dst0, dst1, dst2, dst3, 0, 1, 0, 1, 0, 1, 0, 1, dst, dst_stride);
+         dst += (8 * dst_stride);
+ 
+         dst10_r = dst98_r;
+@@ -3479,7 +3473,6 @@
+                               const int8_t *filter_y,
+                               int32_t height)
+ {
+-    int32_t dst_stride_in_bytes = 2 * dst_stride;
+     v16i8 src0, src1, src2, src3, src4, src5, src6, src7, src8, src9, src10;
+     v8i16 filt0, filt1;
+     v8i16 filt_h0, filt_h1;
+@@ -3590,11 +3583,11 @@
+     PCKEV_H2_SH(dst1_r, dst0_r, dst3_r, dst2_r, tmp0, tmp1);
+     PCKEV_H2_SH(dst5_r, dst4_r, dst7_r, dst6_r, tmp2, tmp3);
+     PCKEV_H2_SH(dst1_l, dst0_l, dst3_l, dst2_l, tmp4, tmp5);
+-    ST8x4_UB(tmp0, tmp1, dst, dst_stride_in_bytes);
+-    ST4x4_UB(tmp4, tmp4, 0, 1, 2, 3, dst + 4, dst_stride_in_bytes);
++    ST_D4(tmp0, tmp1, 0, 1, 0, 1, dst, dst_stride);
++    ST_W4(tmp4, 0, 1, 2, 3, dst + 4, dst_stride);
+     dst += 4 * dst_stride;
+-    ST8x4_UB(tmp2, tmp3, dst, dst_stride_in_bytes);
+-    ST4x4_UB(tmp5, tmp5, 0, 1, 2, 3, dst + 4, dst_stride_in_bytes);
++    ST_D4(tmp2, tmp3, 0, 1, 0, 1, dst, dst_stride);
++    ST_W4(tmp5, 0, 1, 2, 3, dst + 4, dst_stride);
+ }
+ 
+ static void hevc_hv_4t_8x2_msa(uint8_t *src,
+@@ -4164,7 +4157,7 @@
+         SRA_4V(tmp4, tmp5, tmp6, tmp7, 6);
+         PCKEV_H4_SW(tmp1, tmp0, tmp3, tmp2, tmp5, tmp4, tmp7, tmp6, tmp0, tmp1,
+                     tmp2, tmp3);
+-        ST8x8_UB(tmp0, tmp1, tmp2, tmp3, dst, 2 * dst_stride);
++        ST_D8(tmp0, tmp1, tmp2, tmp3, 0, 1, 0, 1, 0, 1, 0, 1, dst, dst_stride);
+         dst += (8 * dst_stride);
+ 
+         dst10_r = dst98_r;
+diff -uNra ffmpeg-4.1.6/libavcodec/mips/hevc_idct_msa.c FFmpeg/libavcodec/mips/hevc_idct_msa.c
+--- a/libavcodec/mips/hevc_idct_msa.c	2020-07-03 23:10:59.000000000 +0800
++++ b/libavcodec/mips/hevc_idct_msa.c	2020-07-19 18:13:57.462301239 +0800
+@@ -727,7 +727,7 @@
+     ADD2(dst_r0, in0, dst_l0, in1, dst_r0, dst_l0);
+     CLIP_SH2_0_255(dst_r0, dst_l0);
+     dst_vec = (v4i32) __msa_pckev_b((v16i8) dst_l0, (v16i8) dst_r0);
+-    ST4x4_UB(dst_vec, dst_vec, 0, 1, 2, 3, dst, stride);
++    ST_W4(dst_vec, 0, 1, 2, 3, dst, stride);
+ }
+ 
+ static void hevc_addblk_8x8_msa(int16_t *coeffs, uint8_t *dst, int32_t stride)
+@@ -752,8 +752,7 @@
+          dst_r0, dst_l0, dst_r1, dst_l1);
+     CLIP_SH4_0_255(dst_r0, dst_l0, dst_r1, dst_l1);
+     PCKEV_B2_SH(dst_l0, dst_r0, dst_l1, dst_r1, dst_r0, dst_r1);
+-    ST8x4_UB(dst_r0, dst_r1, dst, stride);
+-    dst += (4 * stride);
++    ST_D4(dst_r0, dst_r1, 0, 1, 0, 1, dst, stride);
+ 
+     LD4(temp_dst, stride, dst0, dst1, dst2, dst3);
+     INSERT_D2_SD(dst0, dst1, dst_vec0);
+@@ -764,7 +763,7 @@
+          dst_r0, dst_l0, dst_r1, dst_l1);
+     CLIP_SH4_0_255(dst_r0, dst_l0, dst_r1, dst_l1);
+     PCKEV_B2_SH(dst_l0, dst_r0, dst_l1, dst_r1, dst_r0, dst_r1);
+-    ST8x4_UB(dst_r0, dst_r1, dst, stride);
++    ST_D4(dst_r0, dst_r1, 0, 1, 0, 1, dst + 4 * stride, stride);
+ }
+ 
+ static void hevc_addblk_16x16_msa(int16_t *coeffs, uint8_t *dst, int32_t stride)
+@@ -804,8 +803,9 @@
+         LD_SH4((coeffs + 8), 16, in1, in3, in5, in7);
+         coeffs += 64;
+ 
+-        CLIP_SH4_0_255(dst_r0, dst_l0, dst_r1, dst_l1);
+-        CLIP_SH4_0_255(dst_r2, dst_l2, dst_r3, dst_l3);
++        CLIP_SH8_0_255(dst_r0, dst_l0, dst_r1, dst_l1,
++                       dst_r2, dst_l2, dst_r3, dst_l3);
++
+         PCKEV_B4_UB(dst_l0, dst_r0, dst_l1, dst_r1, dst_l2, dst_r2, dst_l3,
+                     dst_r3, dst0, dst1, dst2, dst3);
+         ST_UB4(dst0, dst1, dst2, dst3, dst, stride);
+@@ -826,8 +826,8 @@
+     dst_r3 += in6;
+     dst_l3 += in7;
+ 
+-    CLIP_SH4_0_255(dst_r0, dst_l0, dst_r1, dst_l1);
+-    CLIP_SH4_0_255(dst_r2, dst_l2, dst_r3, dst_l3);
++    CLIP_SH8_0_255(dst_r0, dst_l0, dst_r1, dst_l1,
++                   dst_r2, dst_l2, dst_r3, dst_l3);
+     PCKEV_B4_UB(dst_l0, dst_r0, dst_l1, dst_r1, dst_l2, dst_r2, dst_l3,
+                 dst_r3, dst0, dst1, dst2, dst3);
+     ST_UB4(dst0, dst1, dst2, dst3, dst, stride);
+@@ -874,8 +874,8 @@
+         LD_SH4((coeffs + 8), 16, in1, in3, in5, in7);
+         coeffs += 64;
+ 
+-        CLIP_SH4_0_255(dst_r0, dst_l0, dst_r1, dst_l1);
+-        CLIP_SH4_0_255(dst_r2, dst_l2, dst_r3, dst_l3);
++        CLIP_SH8_0_255(dst_r0, dst_l0, dst_r1, dst_l1,
++                       dst_r2, dst_l2, dst_r3, dst_l3);
+         PCKEV_B4_UB(dst_l0, dst_r0, dst_l1, dst_r1, dst_l2, dst_r2, dst_l3,
+                     dst_r3, dst0, dst1, dst2, dst3);
+         ST_UB2(dst0, dst1, dst, 16);
+@@ -906,8 +906,8 @@
+     LD_SH4(coeffs, 16, in0, in2, in4, in6);
+     LD_SH4((coeffs + 8), 16, in1, in3, in5, in7);
+ 
+-    CLIP_SH4_0_255(dst_r0, dst_l0, dst_r1, dst_l1);
+-    CLIP_SH4_0_255(dst_r2, dst_l2, dst_r3, dst_l3);
++    CLIP_SH8_0_255(dst_r0, dst_l0, dst_r1, dst_l1,
++                   dst_r2, dst_l2, dst_r3, dst_l3);
+     PCKEV_B4_UB(dst_l0, dst_r0, dst_l1, dst_r1, dst_l2, dst_r2, dst_l3,
+                 dst_r3, dst0, dst1, dst2, dst3);
+     ST_UB2(dst0, dst1, dst, 16);
+@@ -929,8 +929,8 @@
+     dst_r3 += in6;
+     dst_l3 += in7;
+ 
+-    CLIP_SH4_0_255(dst_r0, dst_l0, dst_r1, dst_l1);
+-    CLIP_SH4_0_255(dst_r2, dst_l2, dst_r3, dst_l3);
++    CLIP_SH8_0_255(dst_r0, dst_l0, dst_r1, dst_l1,
++                   dst_r2, dst_l2, dst_r3, dst_l3);
+     PCKEV_B4_UB(dst_l0, dst_r0, dst_l1, dst_r1, dst_l2, dst_r2, dst_l3,
+                 dst_r3, dst0, dst1, dst2, dst3);
+     ST_UB2(dst0, dst1, dst, 16);
+diff -uNra ffmpeg-4.1.6/libavcodec/mips/hevc_lpf_sao_msa.c FFmpeg/libavcodec/mips/hevc_lpf_sao_msa.c
+--- a/libavcodec/mips/hevc_lpf_sao_msa.c	2020-07-03 23:10:59.000000000 +0800
++++ b/libavcodec/mips/hevc_lpf_sao_msa.c	2020-07-19 18:13:57.462301239 +0800
+@@ -140,19 +140,19 @@
+             temp1 = ((p3_src + p2_src) << 1) + p2_src + temp0;
+             temp1 = (v8u16) __msa_srari_h((v8i16) temp1, 3);
+             temp2 = (v8i16) (temp1 - p2_src);
+-            temp2 = CLIP_SH(temp2, tc_neg, tc_pos);
++            CLIP_SH(temp2, tc_neg, tc_pos);
+             dst0 = (v16u8) (temp2 + (v8i16) p2_src);
+ 
+             temp1 = temp0 + p2_src;
+             temp1 = (v8u16) __msa_srari_h((v8i16) temp1, 2);
+             temp2 = (v8i16) (temp1 - p1_src);
+-            temp2 = CLIP_SH(temp2, tc_neg, tc_pos);
++            CLIP_SH(temp2, tc_neg, tc_pos);
+             dst1 = (v16u8) (temp2 + (v8i16) p1_src);
+ 
+             temp1 = (temp0 << 1) + p2_src + q1_src;
+             temp1 = (v8u16) __msa_srari_h((v8i16) temp1, 3);
+             temp2 = (v8i16) (temp1 - p0_src);
+-            temp2 = CLIP_SH(temp2, tc_neg, tc_pos);
++            CLIP_SH(temp2, tc_neg, tc_pos);
+             dst2 = (v16u8) (temp2 + (v8i16) p0_src);
+ 
+             dst0 = __msa_bmz_v(dst0, (v16u8) p2_src, (v16u8) p_is_pcm_vec);
+@@ -165,19 +165,19 @@
+             temp1 = ((q3_src + q2_src) << 1) + q2_src + temp0;
+             temp1 = (v8u16) __msa_srari_h((v8i16) temp1, 3);
+             temp2 = (v8i16) (temp1 - q2_src);
+-            temp2 = CLIP_SH(temp2, tc_neg, tc_pos);
++            CLIP_SH(temp2, tc_neg, tc_pos);
+             dst5 = (v16u8) (temp2 + (v8i16) q2_src);
+ 
+             temp1 = temp0 + q2_src;
+             temp1 = (v8u16) __msa_srari_h((v8i16) temp1, 2);
+             temp2 = (v8i16) (temp1 - q1_src);
+-            temp2 = CLIP_SH(temp2, tc_neg, tc_pos);
++            CLIP_SH(temp2, tc_neg, tc_pos);
+             dst4 = (v16u8) (temp2 + (v8i16) q1_src);
+ 
+             temp1 = (temp0 << 1) + p1_src + q2_src;
+             temp1 = (v8u16) __msa_srari_h((v8i16) temp1, 3);
+             temp2 = (v8i16) (temp1 - q0_src);
+-            temp2 = CLIP_SH(temp2, tc_neg, tc_pos);
++            CLIP_SH(temp2, tc_neg, tc_pos);
+             dst3 = (v16u8) (temp2 + (v8i16) q0_src);
+ 
+             dst3 = __msa_bmz_v(dst3, (v16u8) q0_src, (v16u8) q_is_pcm_vec);
+@@ -199,11 +199,9 @@
+             dst_val0 = __msa_copy_u_d((v2i64) dst2, 0);
+             dst_val1 = __msa_copy_u_d((v2i64) dst2, 1);
+ 
+-            ST8x4_UB(dst0, dst1, p2, stride);
+-            p2 += (4 * stride);
+-            SD(dst_val0, p2);
+-            p2 += stride;
+-            SD(dst_val1, p2);
++            ST_D4(dst0, dst1, 0, 1, 0, 1, p2, stride);
++            SD(dst_val0, p2 + 4 * stride);
++            SD(dst_val1, p2 + 5 * stride);
+             /* strong filter ends */
+         } else if (flag0 == flag1) { /* weak only */
+             /* weak filter */
+@@ -220,15 +218,15 @@
+             abs_delta0 = __msa_add_a_h(delta0, (v8i16) zero);
+             abs_delta0 = (v8u16) abs_delta0 < temp1;
+ 
+-            delta0 = CLIP_SH(delta0, tc_neg, tc_pos);
++            CLIP_SH(delta0, tc_neg, tc_pos);
+ 
+-            temp0 = (v8u16) (delta0 + p0_src);
+-            temp0 = (v8u16) CLIP_SH_0_255(temp0);
+-            temp0 = (v8u16) __msa_bmz_v((v16u8) temp0, (v16u8) p0_src,
++            temp2 = (v8i16) (delta0 + p0_src);
++            CLIP_SH_0_255(temp2);
++            temp0 = (v8u16) __msa_bmz_v((v16u8) temp2, (v16u8) p0_src,
+                                         (v16u8) p_is_pcm_vec);
+ 
+             temp2 = (v8i16) (q0_src - delta0);
+-            temp2 = CLIP_SH_0_255(temp2);
++            CLIP_SH_0_255(temp2);
+             temp2 = (v8i16) __msa_bmz_v((v16u8) temp2, (v16u8) q0_src,
+                                         (v16u8) q_is_pcm_vec);
+ 
+@@ -254,9 +252,9 @@
+             delta1 -= (v8i16) p1_src;
+             delta1 += delta0;
+             delta1 >>= 1;
+-            delta1 = CLIP_SH(delta1, tc_neg, tc_pos);
++            CLIP_SH(delta1, tc_neg, tc_pos);
+             delta1 = (v8i16) p1_src + (v8i16) delta1;
+-            delta1 = CLIP_SH_0_255(delta1);
++            CLIP_SH_0_255(delta1);
+             delta1 = (v8i16) __msa_bmnz_v((v16u8) delta1, (v16u8) p1_src,
+                                           (v16u8) p_is_pcm_vec);
+ 
+@@ -264,9 +262,9 @@
+             delta2 = delta2 - (v8i16) q1_src;
+             delta2 = delta2 - delta0;
+             delta2 = delta2 >> 1;
+-            delta2 = CLIP_SH(delta2, tc_neg, tc_pos);
++            CLIP_SH(delta2, tc_neg, tc_pos);
+             delta2 = (v8i16) q1_src + (v8i16) delta2;
+-            delta2 = CLIP_SH_0_255(delta2);
++            CLIP_SH_0_255(delta2);
+             delta2 = (v8i16) __msa_bmnz_v((v16u8) delta2, (v16u8) q1_src,
+                                           (v16u8) q_is_pcm_vec);
+ 
+@@ -288,7 +286,7 @@
+             dst1 = __msa_bmz_v(dst1, dst3, (v16u8) cmp3);
+ 
+             p2 += stride;
+-            ST8x4_UB(dst0, dst1, p2, stride);
++            ST_D4(dst0, dst1, 0, 1, 0, 1, p2, stride);
+             /* weak filter ends */
+         } else { /* strong + weak */
+             /* strong filter */
+@@ -300,19 +298,19 @@
+             temp1 = ((p3_src + p2_src) << 1) + p2_src + temp0;
+             temp1 = (v8u16) __msa_srari_h((v8i16) temp1, 3);
+             temp2 = (v8i16) (temp1 - p2_src);
+-            temp2 = CLIP_SH(temp2, tc_neg, tc_pos);
++            CLIP_SH(temp2, tc_neg, tc_pos);
+             dst0 = (v16u8) (temp2 + (v8i16) p2_src);
+ 
+             temp1 = temp0 + p2_src;
+             temp1 = (v8u16) __msa_srari_h((v8i16) temp1, 2);
+             temp2 = (v8i16) (temp1 - p1_src);
+-            temp2 = CLIP_SH(temp2, tc_neg, tc_pos);
++            CLIP_SH(temp2, tc_neg, tc_pos);
+             dst1 = (v16u8) (temp2 + (v8i16) p1_src);
+ 
+             temp1 = (temp0 << 1) + p2_src + q1_src;
+             temp1 = (v8u16) __msa_srari_h((v8i16) temp1, 3);
+             temp2 = (v8i16) (temp1 - p0_src);
+-            temp2 = CLIP_SH(temp2, tc_neg, tc_pos);
++            CLIP_SH(temp2, tc_neg, tc_pos);
+             dst2 = (v16u8) (temp2 + (v8i16) p0_src);
+ 
+             dst0 = __msa_bmz_v(dst0, (v16u8) p2_src, (v16u8) p_is_pcm_vec);
+@@ -325,19 +323,19 @@
+             temp1 = ((q3_src + q2_src) << 1) + q2_src + temp0;
+             temp1 = (v8u16) __msa_srari_h((v8i16) temp1, 3);
+             temp2 = (v8i16) (temp1 - q2_src);
+-            temp2 = CLIP_SH(temp2, tc_neg, tc_pos);
++            CLIP_SH(temp2, tc_neg, tc_pos);
+             dst5 = (v16u8) (temp2 + (v8i16) q2_src);
+ 
+             temp1 = temp0 + q2_src;
+             temp1 = (v8u16) __msa_srari_h((v8i16) temp1, 2);
+             temp2 = (v8i16) (temp1 - q1_src);
+-            temp2 = CLIP_SH(temp2, tc_neg, tc_pos);
++            CLIP_SH(temp2, tc_neg, tc_pos);
+             dst4 = (v16u8) (temp2 + (v8i16) q1_src);
+ 
+             temp1 = (temp0 << 1) + p1_src + q2_src;
+             temp1 = (v8u16) __msa_srari_h((v8i16) temp1, 3);
+             temp2 = (v8i16) (temp1 - q0_src);
+-            temp2 = CLIP_SH(temp2, tc_neg, tc_pos);
++            CLIP_SH(temp2, tc_neg, tc_pos);
+             dst3 = (v16u8) (temp2 + (v8i16) q0_src);
+ 
+             dst3 = __msa_bmz_v(dst3, (v16u8) q0_src, (v16u8) q_is_pcm_vec);
+@@ -364,15 +362,15 @@
+             abs_delta0 = __msa_add_a_h(delta0, (v8i16) zero);
+             abs_delta0 = (v8u16) abs_delta0 < temp1;
+ 
+-            delta0 = CLIP_SH(delta0, tc_neg, tc_pos);
++            CLIP_SH(delta0, tc_neg, tc_pos);
+ 
+-            temp0 = (v8u16) (delta0 + p0_src);
+-            temp0 = (v8u16) CLIP_SH_0_255(temp0);
+-            temp0 = (v8u16) __msa_bmz_v((v16u8) temp0, (v16u8) p0_src,
++            temp2 = (v8i16) (delta0 + p0_src);
++            CLIP_SH_0_255(temp2);
++            temp0 = (v8u16) __msa_bmz_v((v16u8) temp2, (v16u8) p0_src,
+                                         (v16u8) p_is_pcm_vec);
+ 
+             temp2 = (v8i16) (q0_src - delta0);
+-            temp2 = CLIP_SH_0_255(temp2);
++            CLIP_SH_0_255(temp2);
+             temp2 = (v8i16) __msa_bmz_v((v16u8) temp2, (v16u8) q0_src,
+                                         (v16u8) q_is_pcm_vec);
+ 
+@@ -396,9 +394,9 @@
+             delta1 -= (v8i16) p1_src;
+             delta1 += delta0;
+             delta1 >>= 1;
+-            delta1 = CLIP_SH(delta1, tc_neg, tc_pos);
++            CLIP_SH(delta1, tc_neg, tc_pos);
+             delta1 = (v8i16) p1_src + (v8i16) delta1;
+-            delta1 = CLIP_SH_0_255(delta1);
++            CLIP_SH_0_255(delta1);
+             delta1 = (v8i16) __msa_bmnz_v((v16u8) delta1, (v16u8) p1_src,
+                                           (v16u8) p_is_pcm_vec);
+ 
+@@ -406,9 +404,9 @@
+             delta2 = delta2 - (v8i16) q1_src;
+             delta2 = delta2 - delta0;
+             delta2 = delta2 >> 1;
+-            delta2 = CLIP_SH(delta2, tc_neg, tc_pos);
++            CLIP_SH(delta2, tc_neg, tc_pos);
+             delta2 = (v8i16) q1_src + (v8i16) delta2;
+-            delta2 = CLIP_SH_0_255(delta2);
++            CLIP_SH_0_255(delta2);
+             delta2 = (v8i16) __msa_bmnz_v((v16u8) delta2, (v16u8) q1_src,
+                                           (v16u8) q_is_pcm_vec);
+ 
+@@ -442,11 +440,9 @@
+             dst_val0 = __msa_copy_u_d((v2i64) dst2, 0);
+             dst_val1 = __msa_copy_u_d((v2i64) dst2, 1);
+ 
+-            ST8x4_UB(dst0, dst1, p2, stride);
+-            p2 += (4 * stride);
+-            SD(dst_val0, p2);
+-            p2 += stride;
+-            SD(dst_val1, p2);
++            ST_D4(dst0, dst1, 0, 1, 0, 1, p2, stride);
++            SD(dst_val0, p2 + 4 * stride);
++            SD(dst_val1, p2 + 5 * stride);
+         }
+     }
+ }
+@@ -565,19 +561,19 @@
+             temp1 = ((p3_src + p2_src) << 1) + p2_src + temp0;
+             temp1 = (v8u16) __msa_srari_h((v8i16) temp1, 3);
+             temp2 = (v8i16) (temp1 - p2_src);
+-            temp2 = CLIP_SH(temp2, tc_neg, tc_pos);
++            CLIP_SH(temp2, tc_neg, tc_pos);
+             dst0 = (v16u8) (temp2 + (v8i16) p2_src);
+ 
+             temp1 = temp0 + p2_src;
+             temp1 = (v8u16) __msa_srari_h((v8i16) temp1, 2);
+             temp2 = (v8i16) (temp1 - p1_src);
+-            temp2 = CLIP_SH(temp2, tc_neg, tc_pos);
++            CLIP_SH(temp2, tc_neg, tc_pos);
+             dst1 = (v16u8) (temp2 + (v8i16) p1_src);
+ 
+             temp1 = (temp0 << 1) + p2_src + q1_src;
+             temp1 = (v8u16) __msa_srari_h((v8i16) temp1, 3);
+             temp2 = (v8i16) (temp1 - p0_src);
+-            temp2 = CLIP_SH(temp2, tc_neg, tc_pos);
++            CLIP_SH(temp2, tc_neg, tc_pos);
+             dst2 = (v16u8) (temp2 + (v8i16) p0_src);
+ 
+             dst0 = __msa_bmz_v(dst0, (v16u8) p2_src, (v16u8) p_is_pcm_vec);
+@@ -589,19 +585,19 @@
+             temp1 = ((q3_src + q2_src) << 1) + q2_src + temp0;
+             temp1 = (v8u16) __msa_srari_h((v8i16) temp1, 3);
+             temp2 = (v8i16) (temp1 - q2_src);
+-            temp2 = CLIP_SH(temp2, tc_neg, tc_pos);
++            CLIP_SH(temp2, tc_neg, tc_pos);
+             dst5 = (v16u8) (temp2 + (v8i16) q2_src);
+ 
+             temp1 = temp0 + q2_src;
+             temp1 = (v8u16) __msa_srari_h((v8i16) temp1, 2);
+             temp2 = (v8i16) (temp1 - q1_src);
+-            temp2 = CLIP_SH(temp2, tc_neg, tc_pos);
++            CLIP_SH(temp2, tc_neg, tc_pos);
+             dst4 = (v16u8) (temp2 + (v8i16) q1_src);
+ 
+             temp1 = (temp0 << 1) + p1_src + q2_src;
+             temp1 = (v8u16) __msa_srari_h((v8i16) temp1, 3);
+             temp2 = (v8i16) (temp1 - q0_src);
+-            temp2 = CLIP_SH(temp2, tc_neg, tc_pos);
++            CLIP_SH(temp2, tc_neg, tc_pos);
+             dst3 = (v16u8) (temp2 + (v8i16) q0_src);
+ 
+             dst3 = __msa_bmz_v(dst3, (v16u8) q0_src, (v16u8) q_is_pcm_vec);
+@@ -624,14 +620,14 @@
+             abs_delta0 = __msa_add_a_h(delta0, (v8i16) zero);
+             abs_delta0 = (v8u16) abs_delta0 < temp1;
+ 
+-            delta0 = CLIP_SH(delta0, tc_neg, tc_pos);
+-            temp0 = (v8u16) (delta0 + p0_src);
+-            temp0 = (v8u16) CLIP_SH_0_255(temp0);
+-            temp0 = (v8u16) __msa_bmz_v((v16u8) temp0, (v16u8) p0_src,
++            CLIP_SH(delta0, tc_neg, tc_pos);
++            temp2 = (v8i16) (delta0 + p0_src);
++            CLIP_SH_0_255(temp2);
++            temp0 = (v8u16) __msa_bmz_v((v16u8) temp2, (v16u8) p0_src,
+                                         (v16u8) p_is_pcm_vec);
+ 
+             temp2 = (v8i16) (q0_src - delta0);
+-            temp2 = CLIP_SH_0_255(temp2);
++            CLIP_SH_0_255(temp2);
+             temp2 = (v8i16) __msa_bmz_v((v16u8) temp2, (v16u8) q0_src,
+                                         (v16u8) q_is_pcm_vec);
+ 
+@@ -653,9 +649,9 @@
+             delta1 -= (v8i16) p1_src;
+             delta1 += delta0;
+             delta1 >>= 1;
+-            delta1 = CLIP_SH(delta1, tc_neg, tc_pos);
++            CLIP_SH(delta1, tc_neg, tc_pos);
+             delta1 = (v8i16) p1_src + (v8i16) delta1;
+-            delta1 = CLIP_SH_0_255(delta1);
++            CLIP_SH_0_255(delta1);
+             delta1 = (v8i16) __msa_bmnz_v((v16u8) delta1, (v16u8) p1_src,
+                                           (v16u8) p_is_pcm_vec);
+ 
+@@ -663,9 +659,9 @@
+             delta2 = delta2 - (v8i16) q1_src;
+             delta2 = delta2 - delta0;
+             delta2 = delta2 >> 1;
+-            delta2 = CLIP_SH(delta2, tc_neg, tc_pos);
++            CLIP_SH(delta2, tc_neg, tc_pos);
+             delta2 = (v8i16) q1_src + (v8i16) delta2;
+-            delta2 = CLIP_SH_0_255(delta2);
++            CLIP_SH_0_255(delta2);
+             delta2 = (v8i16) __msa_bmnz_v((v16u8) delta2, (v16u8) q1_src,
+                                           (v16u8) q_is_pcm_vec);
+ 
+@@ -730,19 +726,19 @@
+             temp1 = ((p3_src + p2_src) << 1) + p2_src + temp0;
+             temp1 = (v8u16) __msa_srari_h((v8i16) temp1, 3);
+             temp2 = (v8i16) (temp1 - p2_src);
+-            temp2 = CLIP_SH(temp2, tc_neg, tc_pos);
++            CLIP_SH(temp2, tc_neg, tc_pos);
+             dst0 = (v16u8) (temp2 + (v8i16) p2_src);
+ 
+             temp1 = temp0 + p2_src;
+             temp1 = (v8u16) __msa_srari_h((v8i16) temp1, 2);
+             temp2 = (v8i16) (temp1 - p1_src);
+-            temp2 = CLIP_SH(temp2, tc_neg, tc_pos);
++            CLIP_SH(temp2, tc_neg, tc_pos);
+             dst1 = (v16u8) (temp2 + (v8i16) p1_src);
+ 
+             temp1 = (temp0 << 1) + p2_src + q1_src;
+             temp1 = (v8u16) __msa_srari_h((v8i16) temp1, 3);
+             temp2 = (v8i16) (temp1 - p0_src);
+-            temp2 = CLIP_SH(temp2, tc_neg, tc_pos);
++            CLIP_SH(temp2, tc_neg, tc_pos);
+             dst2 = (v16u8) (temp2 + (v8i16) p0_src);
+ 
+             dst0 = __msa_bmz_v(dst0, (v16u8) p2_src, (v16u8) p_is_pcm_vec);
+@@ -754,19 +750,19 @@
+             temp1 = ((q3_src + q2_src) << 1) + q2_src + temp0;
+             temp1 = (v8u16) __msa_srari_h((v8i16) temp1, 3);
+             temp2 = (v8i16) (temp1 - q2_src);
+-            temp2 = CLIP_SH(temp2, tc_neg, tc_pos);
++            CLIP_SH(temp2, tc_neg, tc_pos);
+             dst5 = (v16u8) (temp2 + (v8i16) q2_src);
+ 
+             temp1 = temp0 + q2_src;
+             temp1 = (v8u16) __msa_srari_h((v8i16) temp1, 2);
+             temp2 = (v8i16) (temp1 - q1_src);
+-            temp2 = CLIP_SH(temp2, tc_neg, tc_pos);
++            CLIP_SH(temp2, tc_neg, tc_pos);
+             dst4 = (v16u8) (temp2 + (v8i16) q1_src);
+ 
+             temp1 = (temp0 << 1) + p1_src + q2_src;
+             temp1 = (v8u16) __msa_srari_h((v8i16) temp1, 3);
+             temp2 = (v8i16) (temp1 - q0_src);
+-            temp2 = CLIP_SH(temp2, tc_neg, tc_pos);
++            CLIP_SH(temp2, tc_neg, tc_pos);
+             dst3 = (v16u8) (temp2 + (v8i16) q0_src);
+ 
+             dst3 = __msa_bmz_v(dst3, (v16u8) q0_src, (v16u8) q_is_pcm_vec);
+@@ -789,15 +785,15 @@
+             abs_delta0 = __msa_add_a_h(delta0, (v8i16) zero);
+             abs_delta0 = (v8u16) abs_delta0 < temp1;
+ 
+-            delta0 = CLIP_SH(delta0, tc_neg, tc_pos);
++            CLIP_SH(delta0, tc_neg, tc_pos);
+ 
+-            temp0 = (v8u16) (delta0 + p0_src);
+-            temp0 = (v8u16) CLIP_SH_0_255(temp0);
+-            temp0 = (v8u16) __msa_bmz_v((v16u8) temp0, (v16u8) p0_src,
++            temp2 = (v8i16) (delta0 + p0_src);
++            CLIP_SH_0_255(temp2);
++            temp0 = (v8u16) __msa_bmz_v((v16u8) temp2, (v16u8) p0_src,
+                                         (v16u8) p_is_pcm_vec);
+ 
+             temp2 = (v8i16) (q0_src - delta0);
+-            temp2 = CLIP_SH_0_255(temp2);
++            CLIP_SH_0_255(temp2);
+             temp2 = (v8i16) __msa_bmz_v((v16u8) temp2, (v16u8) q0_src,
+                                         (v16u8) q_is_pcm_vec);
+ 
+@@ -819,9 +815,9 @@
+             delta1 -= (v8i16) p1_src;
+             delta1 += delta0;
+             delta1 >>= 1;
+-            delta1 = CLIP_SH(delta1, tc_neg, tc_pos);
++            CLIP_SH(delta1, tc_neg, tc_pos);
+             delta1 = (v8i16) p1_src + (v8i16) delta1;
+-            delta1 = CLIP_SH_0_255(delta1);
++            CLIP_SH_0_255(delta1);
+             delta1 = (v8i16) __msa_bmnz_v((v16u8) delta1, (v16u8) p1_src,
+                                           (v16u8) p_is_pcm_vec);
+ 
+@@ -829,9 +825,9 @@
+             delta2 = delta2 - (v8i16) q1_src;
+             delta2 = delta2 - delta0;
+             delta2 = delta2 >> 1;
+-            delta2 = CLIP_SH(delta2, tc_neg, tc_pos);
++            CLIP_SH(delta2, tc_neg, tc_pos);
+             delta2 = (v8i16) q1_src + (v8i16) delta2;
+-            delta2 = CLIP_SH_0_255(delta2);
++            CLIP_SH_0_255(delta2);
+             delta2 = (v8i16) __msa_bmnz_v((v16u8) delta2, (v16u8) q1_src,
+                                           (v16u8) q_is_pcm_vec);
+             delta1 = (v8i16) __msa_bmz_v((v16u8) delta1, (v16u8) p1_src,
+@@ -959,15 +955,15 @@
+         temp0 <<= 2;
+         temp0 += temp1;
+         delta = __msa_srari_h((v8i16) temp0, 3);
+-        delta = CLIP_SH(delta, tc_neg, tc_pos);
++        CLIP_SH(delta, tc_neg, tc_pos);
+ 
+         temp0 = (v8i16) ((v8i16) p0 + delta);
+-        temp0 = CLIP_SH_0_255(temp0);
++        CLIP_SH_0_255(temp0);
+         temp0 = (v8i16) __msa_bmz_v((v16u8) temp0, (v16u8) p0,
+                                     (v16u8) p_is_pcm_vec);
+ 
+         temp1 = (v8i16) ((v8i16) q0 - delta);
+-        temp1 = CLIP_SH_0_255(temp1);
++        CLIP_SH_0_255(temp1);
+         temp1 = (v8i16) __msa_bmz_v((v16u8) temp1, (v16u8) q0,
+                                     (v16u8) q_is_pcm_vec);
+ 
+@@ -976,7 +972,7 @@
+         temp1 = (v8i16) __msa_bmnz_v((v16u8) temp1, (v16u8) q0, (v16u8) tc_pos);
+ 
+         temp0 = (v8i16) __msa_pckev_b((v16i8) temp1, (v16i8) temp0);
+-        ST8x2_UB(temp0, p0_ptr, stride);
++        ST_D2(temp0, 0, 1, p0_ptr, stride);
+     }
+ }
+ 
+@@ -1018,15 +1014,15 @@
+         temp0 <<= 2;
+         temp0 += temp1;
+         delta = __msa_srari_h((v8i16) temp0, 3);
+-        delta = CLIP_SH(delta, tc_neg, tc_pos);
++        CLIP_SH(delta, tc_neg, tc_pos);
+ 
+         temp0 = (v8i16) ((v8i16) p0 + delta);
+-        temp0 = CLIP_SH_0_255(temp0);
++        CLIP_SH_0_255(temp0);
+         temp0 = (v8i16) __msa_bmz_v((v16u8) temp0, (v16u8) p0,
+                                     (v16u8) p_is_pcm_vec);
+ 
+         temp1 = (v8i16) ((v8i16) q0 - delta);
+-        temp1 = CLIP_SH_0_255(temp1);
++        CLIP_SH_0_255(temp1);
+         temp1 = (v8i16) __msa_bmz_v((v16u8) temp1, (v16u8) q0,
+                                     (v16u8) q_is_pcm_vec);
+ 
+@@ -1037,9 +1033,7 @@
+         temp0 = (v8i16) __msa_ilvev_b((v16i8) temp1, (v16i8) temp0);
+ 
+         src += 1;
+-        ST2x4_UB(temp0, 0, src, stride);
+-        src += (4 * stride);
+-        ST2x4_UB(temp0, 4, src, stride);
++        ST_H8(temp0, 0, 1, 2, 3, 4, 5, 6, 7, src, stride);
+     }
+ }
+ 
+@@ -1087,7 +1081,7 @@
+         LD_UB4(src, src_stride, src0, src1, src2, src3);
+ 
+         /* store results */
+-        ST4x4_UB(dst0, dst0, 0, 1, 2, 3, dst, dst_stride);
++        ST_W4(dst0, 0, 1, 2, 3, dst, dst_stride);
+         dst += (4 * dst_stride);
+     }
+ 
+@@ -1102,7 +1096,7 @@
+     dst0 = (v16i8) __msa_xori_b((v16u8) dst0, 128);
+ 
+     /* store results */
+-    ST4x4_UB(dst0, dst0, 0, 1, 2, 3, dst, dst_stride);
++    ST_W4(dst0, 0, 1, 2, 3, dst, dst_stride);
+ }
+ 
+ static void hevc_sao_band_filter_8width_msa(uint8_t *dst, int32_t dst_stride,
+@@ -1153,7 +1147,7 @@
+         XORI_B2_128_SB(dst0, dst1);
+ 
+         /* store results */
+-        ST8x4_UB(dst0, dst1, dst, dst_stride);
++        ST_D4(dst0, dst1, 0, 1, 0, 1, dst, dst_stride);
+         dst += dst_stride << 2;
+     }
+ 
+@@ -1173,7 +1167,7 @@
+     XORI_B2_128_SB(dst0, dst1);
+ 
+     /* store results */
+-    ST8x4_UB(dst0, dst1, dst, dst_stride);
++    ST_D4(dst0, dst1, 0, 1, 0, 1, dst, dst_stride);
+ }
+ 
+ static void hevc_sao_band_filter_16multiple_msa(uint8_t *dst,
+@@ -1363,6 +1357,7 @@
+     v16u8 cmp_minus10, diff_minus10, diff_minus11;
+     v16u8 src0, src1, dst0, src_minus10, src_minus11, src_plus10, src_plus11;
+     v16i8 offset, sao_offset = LD_SB(sao_offset_val);
++    v16i8 zeros = { 0 };
+ 
+     sao_offset = __msa_pckev_b(sao_offset, sao_offset);
+     src -= 1;
+@@ -1373,8 +1368,8 @@
+     for (height -= 2; height; height -= 2) {
+         src += (src_stride << 1);
+ 
+-        SLDI_B2_0_UB(src_minus10, src_minus11, src0, src1, 1);
+-        SLDI_B2_0_UB(src_minus10, src_minus11, src_plus10, src_plus11, 2);
++        SLDI_B2_UB(zeros, src_minus10, zeros, src_minus11, 1, src0, src1);
++        SLDI_B2_UB(zeros, src_minus10, zeros, src_minus11, 2, src_plus10, src_plus11);
+ 
+         PCKEV_D2_UB(src_minus11, src_minus10, src_plus11, src_plus10,
+                     src_minus10, src_plus10);
+@@ -1410,8 +1405,8 @@
+         dst += dst_stride;
+     }
+ 
+-    SLDI_B2_0_UB(src_minus10, src_minus11, src0, src1, 1);
+-    SLDI_B2_0_UB(src_minus10, src_minus11, src_plus10, src_plus11, 2);
++    SLDI_B2_UB(zeros, src_minus10, zeros, src_minus11, 1, src0, src1);
++    SLDI_B2_UB(zeros, src_minus10, zeros, src_minus11, 2, src_plus10, src_plus11);
+ 
+     PCKEV_D2_UB(src_minus11, src_minus10, src_plus11, src_plus10, src_minus10,
+                 src_plus10);
+@@ -1479,14 +1474,12 @@
+             dst_ptr = dst + v_cnt;
+             LD_UB4(src_minus1, src_stride, src10, src11, src12, src13);
+ 
+-            SLDI_B2_SB(src10, src11, src_minus10, src_minus11, src_zero0,
+-                       src_zero1, 1);
+-            SLDI_B2_SB(src12, src13, src_minus12, src_minus13, src_zero2,
+-                       src_zero3, 1);
+-            SLDI_B2_SB(src10, src11, src_minus10, src_minus11, src_plus10,
+-                       src_plus11, 2);
+-            SLDI_B2_SB(src12, src13, src_minus12, src_minus13, src_plus12,
+-                       src_plus13, 2);
++            SLDI_B4_SB(src10, src_minus10, src11, src_minus11,
++                       src12, src_minus12, src13, src_minus13, 1,
++                       src_zero0, src_zero1, src_zero2, src_zero3);
++            SLDI_B4_SB(src10, src_minus10, src11, src_minus11,
++                       src12, src_minus12, src13, src_minus13, 2,
++                       src_plus10, src_plus11, src_plus12, src_plus13);
+ 
+             cmp_minus10 = ((v16u8) src_zero0 == src_minus10);
+             cmp_plus10 = ((v16u8) src_zero0 == (v16u8) src_plus10);
+@@ -1886,6 +1879,7 @@
+     v16u8 src_minus11, src10, src11;
+     v16i8 src_plus0, src_zero0, src_plus1, src_zero1, dst0;
+     v8i16 offset_mask0, offset_mask1;
++    v16i8 zeros = { 0 };
+ 
+     sao_offset = __msa_pckev_b(sao_offset, sao_offset);
+ 
+@@ -1898,8 +1892,8 @@
+     for (height -= 2; height; height -= 2) {
+         src_orig += (src_stride << 1);
+ 
+-        SLDI_B2_0_SB(src_minus11, src10, src_zero0, src_zero1, 1);
+-        SLDI_B2_0_SB(src10, src11, src_plus0, src_plus1, 2);
++        SLDI_B2_SB(zeros, src_minus11, zeros, src10, 1, src_zero0, src_zero1);
++        SLDI_B2_SB(zeros, src10, zeros, src11, 2, src_plus0, src_plus1);
+ 
+         ILVR_B2_UB(src_plus0, src_minus10, src_plus1, src_minus11, src_minus10,
+                    src_minus11);
+@@ -1944,8 +1938,8 @@
+         dst += dst_stride;
+     }
+ 
+-    SLDI_B2_0_SB(src_minus11, src10, src_zero0, src_zero1, 1);
+-    SLDI_B2_0_SB(src10, src11, src_plus0, src_plus1, 2);
++    SLDI_B2_SB(zeros, src_minus11, zeros, src10, 1, src_zero0, src_zero1);
++    SLDI_B2_SB(zeros, src10, zeros, src11, 2, src_plus0, src_plus1);
+ 
+     ILVR_B2_UB(src_plus0, src_minus10, src_plus1, src_minus11, src_minus10,
+                src_minus11);
+@@ -1998,6 +1992,7 @@
+     v16u8 src_minus10, src10, src_minus11, src11;
+     v16i8 src_zero0, src_plus10, src_zero1, src_plus11, dst0;
+     v8i16 offset_mask0, offset_mask1;
++    v16i8 zeros = { 0 };
+ 
+     sao_offset = __msa_pckev_b(sao_offset, sao_offset);
+     src_orig = src - 1;
+@@ -2009,8 +2004,8 @@
+     for (height -= 2; height; height -= 2) {
+         src_orig += (src_stride << 1);
+ 
+-        SLDI_B2_0_SB(src_minus11, src10, src_zero0, src_zero1, 1);
+-        SLDI_B2_0_SB(src10, src11, src_plus10, src_plus11, 2);
++        SLDI_B2_SB(zeros, src_minus11, zeros, src10, 1, src_zero0, src_zero1);
++        SLDI_B2_SB(zeros, src10, zeros, src11, 2, src_plus10, src_plus11);
+ 
+         ILVR_B2_UB(src_plus10, src_minus10, src_plus11, src_minus11,
+                    src_minus10, src_minus11);
+@@ -2054,8 +2049,8 @@
+         dst += dst_stride;
+     }
+ 
+-    SLDI_B2_0_SB(src_minus11, src10, src_zero0, src_zero1, 1);
+-    SLDI_B2_0_SB(src10, src11, src_plus10, src_plus11, 2);
++    SLDI_B2_SB(zeros, src_minus11, zeros, src10, 1, src_zero0, src_zero1);
++    SLDI_B2_SB(zeros, src10, zeros, src11, 2, src_plus10, src_plus11);
+     ILVR_B2_UB(src_plus10, src_minus10, src_plus11, src_minus11, src_minus10,
+                src_minus11);
+     ILVR_B2_SB(src_zero0, src_zero0, src_zero1, src_zero1, src_zero0,
+@@ -2136,12 +2131,11 @@
+             src_plus13 = LD_UB(src + 1 + v_cnt + (src_stride << 2));
+             src_orig += 16;
+ 
+-            SLDI_B2_SB(src10, src11, src_minus11, src_minus12, src_zero0,
+-                       src_zero1, 1);
+-            SLDI_B2_SB(src12, src13, src_minus13, src_minus14, src_zero2,
+-                       src_zero3, 1);
+-            SLDI_B2_SB(src11, src12, src_minus12, src_minus13, src_plus10,
+-                       src_plus11, 2);
++            SLDI_B4_SB(src10, src_minus11, src11, src_minus12,
++                       src12, src_minus13, src13, src_minus14, 1,
++                       src_zero0, src_zero1, src_zero2, src_zero3);
++            SLDI_B2_SB(src11, src_minus12, src12, src_minus13, 2, src_plus10,
++                       src_plus11);
+ 
+             src_plus12 = __msa_sldi_b((v16i8) src13, (v16i8) src_minus14, 2);
+ 
+@@ -2234,6 +2228,7 @@
+     v16u8 cmp_minus10, diff_minus10, cmp_minus11, diff_minus11;
+     v16u8 src_minus10, src10, src_minus11, src11;
+     v8i16 offset_mask0, offset_mask1;
++    v16i8 zeros = { 0 };
+ 
+     sao_offset = __msa_pckev_b(sao_offset, sao_offset);
+     src_orig = src - 1;
+@@ -2245,8 +2240,8 @@
+     for (height -= 2; height; height -= 2) {
+         src_orig += (src_stride << 1);
+ 
+-        SLDI_B2_0_SB(src_minus11, src10, src_zero0, src_zero1, 1);
+-        SLDI_B2_0_UB(src_minus10, src_minus11, src_minus10, src_minus11, 2);
++        SLDI_B2_SB(zeros, src_minus11, zeros, src10, 1, src_zero0, src_zero1);
++        SLDI_B2_UB(zeros, src_minus10, zeros, src_minus11, 2, src_minus10, src_minus11);
+ 
+         ILVR_B2_UB(src10, src_minus10, src11, src_minus11, src_minus10,
+                    src_minus11);
+@@ -2292,8 +2287,8 @@
+         dst += dst_stride;
+     }
+ 
+-    SLDI_B2_0_SB(src_minus11, src10, src_zero0, src_zero1, 1);
+-    SLDI_B2_0_UB(src_minus10, src_minus11, src_minus10, src_minus11, 2);
++    SLDI_B2_SB(zeros, src_minus11, zeros, src10, 1, src_zero0, src_zero1);
++    SLDI_B2_UB(zeros, src_minus10, zeros, src_minus11, 2, src_minus10, src_minus11);
+ 
+     ILVR_B2_UB(src10, src_minus10, src11, src_minus11, src_minus10,
+                src_minus11);
+@@ -2348,6 +2343,7 @@
+     v16u8 src_minus10, src10, src_minus11, src11;
+     v16i8 src_zero0, src_zero1, dst0;
+     v8i16 offset_mask0, offset_mask1;
++    v16i8 zeros = { 0 };
+ 
+     sao_offset = __msa_pckev_b(sao_offset, sao_offset);
+     src_orig = src - 1;
+@@ -2359,8 +2355,8 @@
+     for (height -= 2; height; height -= 2) {
+         src_orig += (src_stride << 1);
+ 
+-        SLDI_B2_0_SB(src_minus11, src10, src_zero0, src_zero1, 1);
+-        SLDI_B2_0_UB(src_minus10, src_minus11, src_minus10, src_minus11, 2);
++        SLDI_B2_SB(zeros, src_minus11, zeros, src10, 1, src_zero0, src_zero1);
++        SLDI_B2_UB(zeros, src_minus10, zeros, src_minus11, 2, src_minus10, src_minus11);
+         ILVR_B2_UB(src10, src_minus10, src11, src_minus11, src_minus10,
+                    src_minus11);
+         ILVR_B2_SB(src_zero0, src_zero0, src_zero1, src_zero1, src_zero0,
+@@ -2404,8 +2400,8 @@
+         dst += dst_stride;
+     }
+ 
+-    SLDI_B2_0_SB(src_minus11, src10, src_zero0, src_zero1, 1);
+-    SLDI_B2_0_UB(src_minus10, src_minus11, src_minus10, src_minus11, 2);
++    SLDI_B2_SB(zeros, src_minus11, zeros, src10, 1, src_zero0, src_zero1);
++    SLDI_B2_UB(zeros, src_minus10, zeros, src_minus11, 2, src_minus10, src_minus11);
+     ILVR_B2_UB(src10, src_minus10, src11, src_minus11, src_minus10,
+                src_minus11);
+     ILVR_B2_SB(src_zero0, src_zero0, src_zero1, src_zero1, src_zero0,
+diff -uNra ffmpeg-4.1.6/libavcodec/mips/hevc_mc_bi_msa.c FFmpeg/libavcodec/mips/hevc_mc_bi_msa.c
+--- a/libavcodec/mips/hevc_mc_bi_msa.c	2020-07-05 06:36:01.000000000 +0800
++++ b/libavcodec/mips/hevc_mc_bi_msa.c	2020-07-19 18:13:57.470118058 +0800
+@@ -48,7 +48,7 @@
+ {                                                                  \
+     ADDS_SH2_SH(vec0, in0, vec1, in1, out0, out1);                 \
+     SRARI_H2_SH(out0, out1, rnd_val);                              \
+-    CLIP_SH2_0_255_MAX_SATU(out0, out1);                           \
++    CLIP_SH2_0_255(out0, out1);                                    \
+ }
+ 
+ #define HEVC_BI_RND_CLIP4_MAX_SATU(in0, in1, in2, in3, vec0, vec1, vec2,    \
+@@ -83,10 +83,10 @@
+         dst0 <<= 6;
+         dst0 += in0;
+         dst0 = __msa_srari_h(dst0, 7);
+-        dst0 = CLIP_SH_0_255_MAX_SATU(dst0);
++        CLIP_SH_0_255(dst0);
+ 
+         dst0 = (v8i16) __msa_pckev_b((v16i8) dst0, (v16i8) dst0);
+-        ST4x2_UB(dst0, dst, dst_stride);
++        ST_W2(dst0, 0, 1, dst, dst_stride);
+     } else if (4 == height) {
+         LW4(src0_ptr, src_stride, tp0, tp1, tp2, tp3);
+         INSERT_W4_SB(tp0, tp1, tp2, tp3, src0);
+@@ -97,7 +97,7 @@
+         SLLI_2V(dst0, dst1, 6);
+         HEVC_BI_RND_CLIP2_MAX_SATU(in0, in1, dst0, dst1, 7, dst0, dst1);
+         dst0 = (v8i16) __msa_pckev_b((v16i8) dst1, (v16i8) dst0);
+-        ST4x4_UB(dst0, dst0, 0, 1, 2, 3, dst, dst_stride);
++        ST_W4(dst0, 0, 1, 2, 3, dst, dst_stride);
+     } else if (0 == height % 8) {
+         for (loop_cnt = (height >> 3); loop_cnt--;) {
+             LW4(src0_ptr, src_stride, tp0, tp1, tp2, tp3);
+@@ -120,7 +120,7 @@
+             HEVC_BI_RND_CLIP4_MAX_SATU(in0, in1, in2, in3, dst0, dst1, dst2,
+                                        dst3, 7, dst0, dst1, dst2, dst3);
+             PCKEV_B2_SH(dst1, dst0, dst3, dst2, dst0, dst1);
+-            ST4x8_UB(dst0, dst1, dst, dst_stride);
++            ST_W8(dst0, dst1, 0, 1, 2, 3, 0, 1, 2, 3, dst, dst_stride);
+             dst += (8 * dst_stride);
+         }
+     }
+@@ -165,9 +165,15 @@
+                                    7, dst4, dst5, dst6, dst7);
+         PCKEV_B2_UB(dst1, dst0, dst3, dst2, out0, out1);
+         PCKEV_B2_UB(dst5, dst4, dst7, dst6, out2, out3);
+-        ST6x4_UB(out0, out1, dst, dst_stride);
++        ST_W2(out0, 0, 2, dst, dst_stride);
++        ST_H2(out0, 2, 6, dst + 4, dst_stride);
++        ST_W2(out1, 0, 2, dst + 2 * dst_stride, dst_stride);
++        ST_H2(out1, 2, 6, dst + 2 * dst_stride + 4, dst_stride);
+         dst += (4 * dst_stride);
+-        ST6x4_UB(out2, out3, dst, dst_stride);
++        ST_W2(out2, 0, 2, dst, dst_stride);
++        ST_H2(out2, 2, 6, dst + 4, dst_stride);
++        ST_W2(out3, 0, 2, dst + 2 * dst_stride, dst_stride);
++        ST_H2(out3, 2, 6, dst + 2 * dst_stride + 4, dst_stride);
+         dst += (4 * dst_stride);
+     }
+ }
+@@ -195,7 +201,7 @@
+         SLLI_2V(dst0, dst1, 6);
+         HEVC_BI_RND_CLIP2_MAX_SATU(in0, in1, dst0, dst1, 7, dst0, dst1);
+         out0 = (v16u8) __msa_pckev_b((v16i8) dst1, (v16i8) dst0);
+-        ST8x2_UB(out0, dst, dst_stride);
++        ST_D2(out0, 0, 1, dst, dst_stride);
+     } else if (4 == height) {
+         LD4(src0_ptr, src_stride, tp0, tp1, tp2, tp3);
+         INSERT_D2_SB(tp0, tp1, src0);
+@@ -207,7 +213,7 @@
+         HEVC_BI_RND_CLIP4_MAX_SATU(in0, in1, in2, in3, dst0, dst1, dst2, dst3,
+                                    7, dst0, dst1, dst2, dst3);
+         PCKEV_B2_UB(dst1, dst0, dst3, dst2, out0, out1);
+-        ST8x4_UB(out0, out1, dst, dst_stride);
++        ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
+     } else if (6 == height) {
+         LD4(src0_ptr, src_stride, tp0, tp1, tp2, tp3);
+         src0_ptr += 4 * src_stride;
+@@ -225,9 +231,8 @@
+                                    7, dst0, dst1, dst2, dst3);
+         HEVC_BI_RND_CLIP2_MAX_SATU(in4, in5, dst4, dst5, 7, dst4, dst5);
+         PCKEV_B3_UB(dst1, dst0, dst3, dst2, dst5, dst4, out0, out1, out2);
+-        ST8x4_UB(out0, out1, dst, dst_stride);
+-        dst += (4 * dst_stride);
+-        ST8x2_UB(out2, dst, dst_stride);
++        ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
++        ST_D2(out2, 0, 1, dst + 4 * dst_stride, dst_stride);
+     } else if (0 == height % 8) {
+         uint32_t loop_cnt;
+ 
+@@ -255,7 +260,7 @@
+                                        dst7, 7, dst4, dst5, dst6, dst7);
+             PCKEV_B2_UB(dst1, dst0, dst3, dst2, out0, out1);
+             PCKEV_B2_UB(dst5, dst4, dst7, dst6, out2, out3);
+-            ST8x8_UB(out0, out1, out2, out3, dst, dst_stride);
++            ST_D8(out0, out1, out2, out3, 0, 1, 0, 1, 0, 1, 0, 1, dst, dst_stride);
+             dst += (8 * dst_stride);
+         }
+     }
+@@ -294,7 +299,8 @@
+                                    7, dst0, dst1, dst2, dst3);
+         HEVC_BI_RND_CLIP2_MAX_SATU(in4, in5, dst4, dst5, 7, dst4, dst5);
+         PCKEV_B3_UB(dst1, dst0, dst3, dst2, dst5, dst4, out0, out1, out2);
+-        ST12x4_UB(out0, out1, out2, dst, dst_stride);
++        ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
++        ST_W4(out2, 0, 1, 2, 3, dst + 8, dst_stride);
+         dst += (4 * dst_stride);
+     }
+ }
+@@ -378,7 +384,7 @@
+         PCKEV_B3_UB(dst1, dst0, dst3, dst2, dst5, dst4, out0, out1, out2);
+         PCKEV_B3_UB(dst7, dst6, dst9, dst8, dst11, dst10, out3, out4, out5);
+         ST_UB4(out0, out1, out3, out4, dst, dst_stride);
+-        ST8x4_UB(out2, out5, dst + 16, dst_stride);
++        ST_D4(out2, out5, 0, 1, 0, 1, dst + 16, dst_stride);
+         dst += (4 * dst_stride);
+     }
+ }
+@@ -588,7 +594,7 @@
+                           dst0, dst1, dst2, dst3, 7, dst0, dst1, dst2, dst3);
+ 
+         PCKEV_B2_SH(dst1, dst0, dst3, dst2, dst0, dst1);
+-        ST4x8_UB(dst0, dst1, dst, dst_stride);
++        ST_W8(dst0, dst1, 0, 1, 2, 3, 0, 1, 2, 3, dst, dst_stride);
+         dst += (8 * dst_stride);
+     }
+ }
+@@ -656,7 +662,7 @@
+                           dst0, dst1, dst2, dst3, 7, dst0, dst1, dst2, dst3);
+ 
+         PCKEV_B2_SH(dst1, dst0, dst3, dst2, dst0, dst1);
+-        ST8x4_UB(dst0, dst1, dst, dst_stride);
++        ST_D4(dst0, dst1, 0, 1, 0, 1, dst, dst_stride);
+         dst += (4 * dst_stride);
+     }
+ }
+@@ -733,7 +739,7 @@
+         HEVC_BI_RND_CLIP2(in0, in1, dst0, dst1, 7, dst0, dst1);
+         dst2 = __msa_adds_s_h(in2, dst2);
+         dst2 = __msa_srari_h(dst2, 7);
+-        dst2 = CLIP_SH_0_255(dst2);
++        CLIP_SH_0_255(dst2);
+         PCKEV_B2_SH(dst1, dst0, dst2, dst2, dst0, dst1);
+ 
+         tmp2 = __msa_copy_s_d((v2i64) dst0, 0);
+@@ -882,7 +888,7 @@
+         HEVC_BI_RND_CLIP2(in0, in1, dst0, dst1, 7, dst0, dst1);
+         dst2 = __msa_adds_s_h(dst2, in2);
+         dst2 = __msa_srari_h(dst2, 7);
+-        dst2 = CLIP_SH_0_255(dst2);
++        CLIP_SH_0_255(dst2);
+ 
+         PCKEV_B2_SB(dst1, dst0, dst2, dst2, tmp0, tmp1);
+         dst_val0 = __msa_copy_u_d((v2i64) tmp1, 0);
+@@ -1242,7 +1248,7 @@
+                           dst10, dst32, dst54, dst76);
+ 
+         PCKEV_B2_SH(dst32, dst10, dst76, dst54, dst10, dst54);
+-        ST4x8_UB(dst10, dst54, dst, dst_stride);
++        ST_W8(dst10, dst54, 0, 1, 2, 3, 0, 1, 2, 3, dst, dst_stride);
+         dst += (8 * dst_stride);
+ 
+         src2110 = src10998;
+@@ -1316,7 +1322,7 @@
+                           dst0_r, dst1_r, dst2_r, dst3_r);
+ 
+         PCKEV_B2_SH(dst1_r, dst0_r, dst3_r, dst2_r, dst0_r, dst1_r);
+-        ST8x4_UB(dst0_r, dst1_r, dst, dst_stride);
++        ST_D4(dst0_r, dst1_r, 0, 1, 0, 1, dst, dst_stride);
+         dst += (4 * dst_stride);
+ 
+         src10_r = src54_r;
+@@ -1420,7 +1426,8 @@
+ 
+         PCKEV_B2_SH(dst1_r, dst0_r, dst3_r, dst2_r, dst0_r, dst1_r);
+         dst0_l = (v8i16) __msa_pckev_b((v16i8) dst1_l, (v16i8) dst0_l);
+-        ST12x4_UB(dst0_r, dst1_r, dst0_l, dst, dst_stride);
++        ST_D4(dst0_r, dst1_r, 0, 1, 0, 1, dst, dst_stride);
++        ST_W4(dst0_l, 0, 1, 2, 3, dst + 8, dst_stride);
+         dst += (4 * dst_stride);
+ 
+         src10_r = src54_r;
+@@ -1719,9 +1726,9 @@
+         ADDS_SH2_SH(out0, in0, out1, in1, out0, out1);
+         ADDS_SH2_SH(out0, const_vec, out1, const_vec, out0, out1);
+         SRARI_H2_SH(out0, out1, 7);
+-        CLIP_SH2_0_255_MAX_SATU(out0, out1);
++        CLIP_SH2_0_255(out0, out1);
+         out = (v16u8) __msa_pckev_b((v16i8) out1, (v16i8) out0);
+-        ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
++        ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
+         dst += (4 * dst_stride);
+ 
+         dst10 = dst54;
+@@ -1847,9 +1854,9 @@
+             tmp = __msa_pckev_h((v8i16) dst0_l, (v8i16) dst0_r);
+             ADDS_SH2_SH(tmp, in0, tmp, const_vec, tmp, tmp);
+             tmp = __msa_srari_h(tmp, 7);
+-            tmp = CLIP_SH_0_255_MAX_SATU(tmp);
++            CLIP_SH_0_255(tmp);
+             out = (v16u8) __msa_pckev_b((v16i8) tmp, (v16i8) tmp);
+-            ST8x1_UB(out, dst_tmp);
++            ST_D1(out, 0, dst_tmp);
+             dst_tmp += dst_stride;
+ 
+             dst0 = dst1;
+@@ -1993,9 +2000,9 @@
+         tmp = __msa_pckev_h((v8i16) dst0_l, (v8i16) dst0_r);
+         ADDS_SH2_SH(tmp, in0, tmp, const_vec, tmp, tmp);
+         tmp = __msa_srari_h(tmp, 7);
+-        tmp = CLIP_SH_0_255_MAX_SATU(tmp);
++        CLIP_SH_0_255(tmp);
+         out = (v16u8) __msa_pckev_b((v16i8) tmp, (v16i8) tmp);
+-        ST8x1_UB(out, dst_tmp);
++        ST_D1(out, 0, dst_tmp);
+         dst_tmp += dst_stride;
+ 
+         dst0 = dst1;
+@@ -2081,9 +2088,9 @@
+         ADDS_SH2_SH(out0, in0, out1, in1, out0, out1);
+         ADDS_SH2_SH(out0, const_vec, out1, const_vec, out0, out1);
+         SRARI_H2_SH(out0, out1, 7);
+-        CLIP_SH2_0_255_MAX_SATU(out0, out1);
++        CLIP_SH2_0_255(out0, out1);
+         out = (v16u8) __msa_pckev_b((v16i8) out1, (v16i8) out0);
+-        ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
++        ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
+         dst += (4 * dst_stride);
+ 
+         dst10 = dst54;
+@@ -2208,10 +2215,10 @@
+ 
+     tmp0 = __msa_adds_s_h(tmp0, in0);
+     tmp0 = __msa_srari_h(tmp0, 7);
+-    tmp0 = CLIP_SH_0_255(tmp0);
++    CLIP_SH_0_255(tmp0);
+     dst0 = __msa_pckev_b((v16i8) tmp0, (v16i8) tmp0);
+ 
+-    ST4x2_UB(dst0, dst, dst_stride);
++    ST_W2(dst0, 0, 1, dst, dst_stride);
+ }
+ 
+ static void hevc_hz_bi_4t_4x4_msa(uint8_t *src0_ptr,
+@@ -2257,7 +2264,7 @@
+     HEVC_BI_RND_CLIP2(in0, in1, tmp0, tmp1, 7, tmp0, tmp1);
+     dst0 = __msa_pckev_b((v16i8) tmp1, (v16i8) tmp0);
+ 
+-    ST4x4_UB(dst0, dst0, 0, 1, 2, 3, dst, dst_stride);
++    ST_W4(dst0, 0, 1, 2, 3, dst, dst_stride);
+ }
+ 
+ static void hevc_hz_bi_4t_4x8multiple_msa(uint8_t *src0_ptr,
+@@ -2318,7 +2325,7 @@
+                           tmp0, tmp1, tmp2, tmp3, 7, tmp0, tmp1, tmp2, tmp3);
+ 
+         PCKEV_B2_SB(tmp1, tmp0, tmp3, tmp2, dst0, dst1);
+-        ST4x8_UB(dst0, dst1, dst, dst_stride);
++        ST_W8(dst0, dst1, 0, 1, 2, 3, 0, 1, 2, 3, dst, dst_stride);
+         dst += (8 * dst_stride);
+     }
+ }
+@@ -2398,7 +2405,10 @@
+                           dst0, dst1, dst2, dst3, 7, dst0, dst1, dst2, dst3);
+ 
+         PCKEV_B2_SH(dst1, dst0, dst3, dst2, dst0, dst1);
+-        ST6x4_UB(dst0, dst1, dst, dst_stride);
++        ST_W2(dst0, 0, 2, dst, dst_stride);
++        ST_H2(dst0, 2, 6, dst + 4, dst_stride);
++        ST_W2(dst1, 0, 2, dst + 2 * dst_stride, dst_stride);
++        ST_H2(dst1, 2, 6, dst + 2 * dst_stride + 4, dst_stride);
+         dst += (4 * dst_stride);
+     }
+ }
+@@ -2443,7 +2453,7 @@
+     HEVC_BI_RND_CLIP2(in0, in1, dst0, dst1, 7, dst0, dst1);
+ 
+     dst0 = (v8i16) __msa_pckev_b((v16i8) dst1, (v16i8) dst0);
+-    ST8x2_UB(dst0, dst, dst_stride);
++    ST_D2(dst0, 0, 1, dst, dst_stride);
+ }
+ 
+ static void hevc_hz_bi_4t_8x6_msa(uint8_t *src0_ptr,
+@@ -2506,9 +2516,8 @@
+ 
+     PCKEV_B2_SH(dst1, dst0, dst3, dst2, dst0, dst1);
+     dst2 = (v8i16) __msa_pckev_b((v16i8) dst5, (v16i8) dst4);
+-    ST8x4_UB(dst0, dst1, dst, dst_stride);
+-    dst += (4 * dst_stride);
+-    ST8x2_UB(dst2, dst, dst_stride);
++    ST_D4(dst0, dst1, 0, 1, 0, 1, dst, dst_stride);
++    ST_D2(dst2, 0, 1, dst + 4 * dst_stride, dst_stride);
+ }
+ 
+ static void hevc_hz_bi_4t_8x4multiple_msa(uint8_t *src0_ptr,
+@@ -2564,7 +2573,7 @@
+                           dst0, dst1, dst2, dst3, 7, dst0, dst1, dst2, dst3);
+ 
+         PCKEV_B2_SH(dst1, dst0, dst3, dst2, dst0, dst1);
+-        ST8x4_UB(dst0, dst1, dst, dst_stride);
++        ST_D4(dst0, dst1, 0, 1, 0, 1, dst, dst_stride);
+         dst += (4 * dst_stride);
+     }
+ }
+@@ -2659,7 +2668,8 @@
+ 
+         PCKEV_B2_SH(dst1, dst0, dst3, dst2, dst0, dst1);
+         dst2 = (v8i16) __msa_pckev_b((v16i8) dst5, (v16i8) dst4);
+-        ST12x4_UB(dst0, dst1, dst2, dst, dst_stride);
++        ST_D4(dst0, dst1, 0, 1, 0, 1, dst, dst_stride);
++        ST_W4(dst2, 0, 1, 2, 3, dst + 8, dst_stride);
+         dst += (4 * dst_stride);
+     }
+ }
+@@ -2825,7 +2835,7 @@
+                           dst0, dst1, dst2, dst3, 7, dst0, dst1, dst2, dst3);
+ 
+         PCKEV_B2_SH(dst1, dst0, dst3, dst2, dst0, dst1);
+-        ST8x4_UB(dst0, dst1, dst_tmp, dst_stride);
++        ST_D4(dst0, dst1, 0, 1, 0, 1, dst_tmp, dst_stride);
+         dst_tmp += (4 * dst_stride);
+     }
+ }
+@@ -2933,10 +2943,10 @@
+     DPADD_SB2_SH(src2110, src4332, filt0, filt1, dst10, dst10);
+     dst10 = __msa_adds_s_h(dst10, in0);
+     dst10 = __msa_srari_h(dst10, 7);
+-    dst10 = CLIP_SH_0_255(dst10);
++    CLIP_SH_0_255(dst10);
+ 
+     dst10 = (v8i16) __msa_pckev_b((v16i8) dst10, (v16i8) dst10);
+-    ST4x2_UB(dst10, dst, dst_stride);
++    ST_W2(dst10, 0, 1, dst, dst_stride);
+ }
+ 
+ static void hevc_vt_bi_4t_4x4_msa(uint8_t *src0_ptr,
+@@ -2985,7 +2995,7 @@
+     HEVC_BI_RND_CLIP2(in0, in1, dst10, dst32, 7, dst10, dst32);
+ 
+     dst10 = (v8i16) __msa_pckev_b((v16i8) dst32, (v16i8) dst10);
+-    ST4x4_UB(dst10, dst10, 0, 1, 2, 3, dst, dst_stride);
++    ST_W4(dst10, 0, 1, 2, 3, dst, dst_stride);
+ }
+ 
+ static void hevc_vt_bi_4t_4x8multiple_msa(uint8_t *src0_ptr,
+@@ -3056,7 +3066,7 @@
+                           dst10, dst32, dst54, dst76);
+ 
+         PCKEV_B2_SH(dst32, dst10, dst76, dst54, dst10, dst54);
+-        ST4x8_UB(dst10, dst54, dst, dst_stride);
++        ST_W8(dst10, dst54, 0, 1, 2, 3, 0, 1, 2, 3, dst, dst_stride);
+         dst += (8 * dst_stride);
+     }
+ }
+@@ -3147,7 +3157,10 @@
+                       dst0_r, dst1_r, dst2_r, dst3_r);
+ 
+     PCKEV_B2_SH(dst1_r, dst0_r, dst3_r, dst2_r, dst0_r, dst1_r);
+-    ST6x4_UB(dst0_r, dst1_r, dst, dst_stride);
++    ST_W2(dst0_r, 0, 2, dst, dst_stride);
++    ST_H2(dst0_r, 2, 6, dst + 4, dst_stride);
++    ST_W2(dst1_r, 0, 2, dst + 2 * dst_stride, dst_stride);
++    ST_H2(dst1_r, 2, 6, dst + 2 * dst_stride + 4, dst_stride);
+     dst += (4 * dst_stride);
+ 
+     LD_SH4(src1_ptr, src2_stride, in0, in1, in2, in3);
+@@ -3171,7 +3184,10 @@
+                       dst0_r, dst1_r, dst2_r, dst3_r);
+ 
+     PCKEV_B2_SH(dst1_r, dst0_r, dst3_r, dst2_r, dst0_r, dst1_r);
+-    ST6x4_UB(dst0_r, dst1_r, dst, dst_stride);
++    ST_W2(dst0_r, 0, 2, dst, dst_stride);
++    ST_H2(dst0_r, 2, 6, dst + 4, dst_stride);
++    ST_W2(dst1_r, 0, 2, dst + 2 * dst_stride, dst_stride);
++    ST_H2(dst1_r, 2, 6, dst + 2 * dst_stride + 4, dst_stride);
+     dst += (4 * dst_stride);
+ }
+ 
+@@ -3216,7 +3232,7 @@
+     HEVC_BI_RND_CLIP2(in0, in1, dst0_r, dst1_r, 7, dst0_r, dst1_r);
+     dst0_r = (v8i16) __msa_pckev_b((v16i8) dst1_r, (v16i8) dst0_r);
+ 
+-    ST8x2_UB(dst0_r, dst, dst_stride);
++    ST_D2(dst0_r, 0, 1, dst, dst_stride);
+ }
+ 
+ static void hevc_vt_bi_4t_8x6_msa(uint8_t *src0_ptr,
+@@ -3275,9 +3291,8 @@
+ 
+     PCKEV_B2_SH(dst1_r, dst0_r, dst3_r, dst2_r, dst0_r, dst1_r);
+     dst2_r = (v8i16) __msa_pckev_b((v16i8) dst5_r, (v16i8) dst4_r);
+-    ST8x4_UB(dst0_r, dst1_r, dst, dst_stride);
+-    dst += (4 * dst_stride);
+-    ST8x2_UB(dst2_r, dst, dst_stride);
++    ST_D4(dst0_r, dst1_r, 0, 1, 0, 1, dst, dst_stride);
++    ST_D2(dst2_r, 0, 1, dst + 4 * dst_stride, dst_stride);
+ }
+ 
+ static void hevc_vt_bi_4t_8x4multiple_msa(uint8_t *src0_ptr,
+@@ -3337,7 +3352,7 @@
+                           dst0_r, dst1_r, dst2_r, dst3_r);
+ 
+         PCKEV_B2_SH(dst1_r, dst0_r, dst3_r, dst2_r, dst0_r, dst1_r);
+-        ST8x4_UB(dst0_r, dst1_r, dst, dst_stride);
++        ST_D4(dst0_r, dst1_r, 0, 1, 0, 1, dst, dst_stride);
+         dst += (4 * dst_stride);
+     }
+ }
+@@ -3436,7 +3451,8 @@
+ 
+         PCKEV_B2_SH(dst1_r, dst0_r, dst3_r, dst2_r, dst0_r, dst1_r);
+         dst0_l = (v8i16) __msa_pckev_b((v16i8) dst1_l, (v16i8) dst0_l);
+-        ST12x4_UB(dst0_r, dst1_r, dst0_l, dst, dst_stride);
++        ST_D4(dst0_r, dst1_r, 0, 1, 0, 1, dst, dst_stride);
++        ST_W4(dst0_l, 0, 1, 2, 3, dst + 8, dst_stride);
+         dst += (4 * dst_stride);
+ 
+         src2 = src6;
+@@ -3610,7 +3626,7 @@
+         PCKEV_B2_SH(dst0_l, dst0_r, dst1_l, dst1_r, dst0_r, dst1_r);
+         dst2_r = (v8i16) __msa_pckev_b((v16i8) dst3_r, (v16i8) dst2_r);
+         ST_SH2(dst0_r, dst1_r, dst, dst_stride);
+-        ST8x2_UB(dst2_r, dst + 16, dst_stride);
++        ST_D2(dst2_r, 0, 1, dst + 16, dst_stride);
+         dst += (2 * dst_stride);
+ 
+         /* 16width */
+@@ -3650,7 +3666,7 @@
+         PCKEV_B2_SH(dst0_l, dst0_r, dst1_l, dst1_r, dst0_r, dst1_r);
+         dst2_r = (v8i16) __msa_pckev_b((v16i8) dst3_r, (v16i8) dst2_r);
+         ST_SH2(dst0_r, dst1_r, dst, dst_stride);
+-        ST8x2_UB(dst2_r, dst + 16, dst_stride);
++        ST_D2(dst2_r, 0, 1, dst + 16, dst_stride);
+         dst += (2 * dst_stride);
+     }
+ }
+@@ -3827,9 +3843,9 @@
+     tmp = __msa_pckev_h((v8i16) dst1, (v8i16) dst0);
+     tmp = __msa_adds_s_h(tmp, in0);
+     tmp = __msa_srari_h(tmp, 7);
+-    tmp = CLIP_SH_0_255_MAX_SATU(tmp);
++    CLIP_SH_0_255(tmp);
+     out = (v16u8) __msa_pckev_b((v16i8) tmp, (v16i8) tmp);
+-    ST4x2_UB(out, dst, dst_stride);
++    ST_W2(out, 0, 1, dst, dst_stride);
+ }
+ 
+ static void hevc_hv_bi_4t_4x4_msa(uint8_t *src0_ptr,
+@@ -3903,9 +3919,9 @@
+     PCKEV_H2_SH(dst1, dst0, dst3, dst2, tmp0, tmp1);
+     ADDS_SH2_SH(tmp0, in0, tmp1, in1, tmp0, tmp1);
+     SRARI_H2_SH(tmp0, tmp1, 7);
+-    CLIP_SH2_0_255_MAX_SATU(tmp0, tmp1);
++    CLIP_SH2_0_255(tmp0, tmp1);
+     out = (v16u8) __msa_pckev_b((v16i8) tmp1, (v16i8) tmp0);
+-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
++    ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
+ }
+ 
+ static void hevc_hv_bi_4t_4multx8mult_msa(uint8_t *src0_ptr,
+@@ -4016,9 +4032,9 @@
+         ADDS_SH4_SH(in0, tmp0, in1, tmp1, in2, tmp2, in3, tmp3, tmp0, tmp1,
+                     tmp2, tmp3);
+         SRARI_H4_SH(tmp0, tmp1, tmp2, tmp3, 7);
+-        CLIP_SH4_0_255_MAX_SATU(tmp0, tmp1, tmp2, tmp3);
++        CLIP_SH4_0_255(tmp0, tmp1, tmp2, tmp3);
+         PCKEV_B2_UB(tmp1, tmp0, tmp3, tmp2, out0, out1);
+-        ST4x8_UB(out0, out1, dst, dst_stride);
++        ST_W8(out0, out1, 0, 1, 2, 3, 0, 1, 2, 3, dst, dst_stride);
+         dst += (8 * dst_stride);
+ 
+         dst10_r = dst98_r;
+@@ -4184,9 +4200,9 @@
+     ADDS_SH4_SH(in0, tmp0, in1, tmp1, in2, tmp2, in3, tmp3, tmp0, tmp1, tmp2,
+                 tmp3);
+     SRARI_H4_SH(tmp0, tmp1, tmp2, tmp3, 7);
+-    CLIP_SH4_0_255_MAX_SATU(tmp0, tmp1, tmp2, tmp3);
++    CLIP_SH4_0_255(tmp0, tmp1, tmp2, tmp3);
+     PCKEV_B2_UB(tmp1, tmp0, tmp3, tmp2, out0, out1);
+-    ST4x8_UB(out0, out1, dst, dst_stride);
++    ST_W8(out0, out1, 0, 1, 2, 3, 0, 1, 2, 3, dst, dst_stride);
+ 
+     LW4(src1_ptr + 4, src2_stride, tpw0, tpw1, tpw2, tpw3);
+     src1_ptr += (4 * src2_stride);
+@@ -4196,11 +4212,9 @@
+     ADDS_SH2_SH(in4, const_vec, in5, const_vec, in4, in5);
+     ADDS_SH2_SH(in4, tmp4, in5, tmp5, tmp4, tmp5);
+     SRARI_H2_SH(tmp4, tmp5, 7);
+-    CLIP_SH2_0_255_MAX_SATU(tmp4, tmp5);
++    CLIP_SH2_0_255(tmp4, tmp5);
+     out2 = (v16u8) __msa_pckev_b((v16i8) tmp5, (v16i8) tmp4);
+-    ST2x4_UB(out2, 0, dst + 4, dst_stride);
+-    dst += 4 * dst_stride;
+-    ST2x4_UB(out2, 4, dst + 4, dst_stride);
++    ST_H8(out2, 0, 1, 2, 3, 4, 5, 6, 7, dst + 4, dst_stride);
+ }
+ 
+ static void hevc_hv_bi_4t_8x2_msa(uint8_t *src0_ptr,
+@@ -4272,9 +4286,9 @@
+     PCKEV_H2_SH(dst0_l, dst0_r, dst1_l, dst1_r, tmp0, tmp1);
+     ADDS_SH2_SH(in0, tmp0, in1, tmp1, tmp0, tmp1);
+     SRARI_H2_SH(tmp0, tmp1, 7);
+-    CLIP_SH2_0_255_MAX_SATU(tmp0, tmp1);
++    CLIP_SH2_0_255(tmp0, tmp1);
+     out = (v16u8) __msa_pckev_b((v16i8) tmp1, (v16i8) tmp0);
+-    ST8x2_UB(out, dst, dst_stride);
++    ST_D2(out, 0, 1, dst, dst_stride);
+ }
+ 
+ static void hevc_hv_bi_4t_8multx4_msa(uint8_t *src0_ptr,
+@@ -4366,9 +4380,9 @@
+         ADDS_SH4_SH(in0, tmp0, in1, tmp1, in2, tmp2, in3, tmp3,
+                     tmp0, tmp1, tmp2, tmp3);
+         SRARI_H4_SH(tmp0, tmp1, tmp2, tmp3, 7);
+-        CLIP_SH4_0_255_MAX_SATU(tmp0, tmp1, tmp2, tmp3);
++        CLIP_SH4_0_255(tmp0, tmp1, tmp2, tmp3);
+         PCKEV_B2_UB(tmp1, tmp0, tmp3, tmp2, out0, out1);
+-        ST8x4_UB(out0, out1, dst, dst_stride);
++        ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
+         dst += 8;
+     }
+ }
+@@ -4481,13 +4495,12 @@
+     ADDS_SH2_SH(in4, tmp4, in5, tmp5, tmp4, tmp5);
+     SRARI_H4_SH(tmp0, tmp1, tmp2, tmp3, 7);
+     SRARI_H2_SH(tmp4, tmp5, 7);
+-    CLIP_SH4_0_255_MAX_SATU(tmp0, tmp1, tmp2, tmp3);
+-    CLIP_SH2_0_255_MAX_SATU(tmp4, tmp5);
++    CLIP_SH4_0_255(tmp0, tmp1, tmp2, tmp3);
++    CLIP_SH2_0_255(tmp4, tmp5);
+     PCKEV_B2_UB(tmp1, tmp0, tmp3, tmp2, out0, out1);
+     out2 = (v16u8) __msa_pckev_b((v16i8) tmp5, (v16i8) tmp4);
+-    ST8x4_UB(out0, out1, dst, dst_stride);
+-    dst += (4 * dst_stride);
+-    ST8x2_UB(out2, dst, dst_stride);
++    ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
++    ST_D2(out2, 0, 1, dst + 4 * dst_stride, dst_stride);
+ }
+ 
+ static void hevc_hv_bi_4t_8multx4mult_msa(uint8_t *src0_ptr,
+@@ -4597,9 +4610,9 @@
+             ADDS_SH4_SH(in0, tmp0, in1, tmp1, in2, tmp2, in3, tmp3,
+                         tmp0, tmp1, tmp2, tmp3);
+             SRARI_H4_SH(tmp0, tmp1, tmp2, tmp3, 7);
+-            CLIP_SH4_0_255_MAX_SATU(tmp0, tmp1, tmp2, tmp3);
++            CLIP_SH4_0_255(tmp0, tmp1, tmp2, tmp3);
+             PCKEV_B2_UB(tmp1, tmp0, tmp3, tmp2, out0, out1);
+-            ST8x4_UB(out0, out1, dst_tmp, dst_stride);
++            ST_D4(out0, out1, 0, 1, 0, 1, dst_tmp, dst_stride);
+             dst_tmp += (4 * dst_stride);
+ 
+             dst10_r = dst54_r;
+@@ -4747,9 +4760,9 @@
+         ADDS_SH4_SH(in0, tmp0, in1, tmp1, in2, tmp2, in3, tmp3,
+                     tmp0, tmp1, tmp2, tmp3);
+         SRARI_H4_SH(tmp0, tmp1, tmp2, tmp3, 7);
+-        CLIP_SH4_0_255_MAX_SATU(tmp0, tmp1, tmp2, tmp3);
++        CLIP_SH4_0_255(tmp0, tmp1, tmp2, tmp3);
+         PCKEV_B2_UB(tmp1, tmp0, tmp3, tmp2, out0, out1);
+-        ST8x4_UB(out0, out1, dst_tmp, dst_stride);
++        ST_D4(out0, out1, 0, 1, 0, 1, dst_tmp, dst_stride);
+         dst_tmp += (4 * dst_stride);
+ 
+         dst10_r = dst54_r;
+@@ -4833,9 +4846,9 @@
+         ADDS_SH4_SH(in0, tmp0, in1, tmp1, in2, tmp2, in3, tmp3,
+                     tmp0, tmp1, tmp2, tmp3);
+         SRARI_H4_SH(tmp0, tmp1, tmp2, tmp3, 7);
+-        CLIP_SH4_0_255_MAX_SATU(tmp0, tmp1, tmp2, tmp3);
++        CLIP_SH4_0_255(tmp0, tmp1, tmp2, tmp3);
+         PCKEV_B2_UB(tmp1, tmp0, tmp3, tmp2, out0, out1);
+-        ST4x8_UB(out0, out1, dst, dst_stride);
++        ST_W8(out0, out1, 0, 1, 2, 3, 0, 1, 2, 3, dst, dst_stride);
+         dst += (8 * dst_stride);
+ 
+         dst10_r = dst98_r;
+diff -uNra ffmpeg-4.1.6/libavcodec/mips/hevc_mc_biw_msa.c FFmpeg/libavcodec/mips/hevc_mc_biw_msa.c
+--- a/libavcodec/mips/hevc_mc_biw_msa.c	2020-07-05 06:36:01.000000000 +0800
++++ b/libavcodec/mips/hevc_mc_biw_msa.c	2020-07-19 18:13:57.470118058 +0800
+@@ -66,7 +66,7 @@
+     out1_l = __msa_dpadd_s_w(offset, (v8i16) out1_l, (v8i16) wgt);   \
+     SRAR_W4_SW(out0_r, out1_r, out0_l, out1_l, rnd);                 \
+     PCKEV_H2_SH(out0_l, out0_r, out1_l, out1_r, out0, out1);         \
+-    CLIP_SH2_0_255_MAX_SATU(out0, out1);                             \
++    CLIP_SH2_0_255(out0, out1);                                      \
+ }
+ 
+ #define HEVC_BIW_RND_CLIP4_MAX_SATU(in0, in1, in2, in3, vec0, vec1, vec2,  \
+@@ -124,9 +124,9 @@
+         dst0_l = __msa_dpadd_s_w(offset_vec, (v8i16) dst0_l, weight_vec);
+         SRAR_W2_SW(dst0_r, dst0_l, rnd_vec);
+         dst0 = (v8i16) __msa_pckev_h((v8i16) dst0_l, (v8i16) dst0_r);
+-        dst0 = CLIP_SH_0_255_MAX_SATU(dst0);
++        CLIP_SH_0_255(dst0);
+         out0 = (v16u8) __msa_pckev_b((v16i8) dst0, (v16i8) dst0);
+-        ST4x2_UB(out0, dst, dst_stride);
++        ST_W2(out0, 0, 1, dst, dst_stride);
+     } else if (4 == height) {
+         LW4(src0_ptr, src_stride, tp0, tp1, tp2, tp3);
+         INSERT_W4_SB(tp0, tp1, tp2, tp3, src0);
+@@ -138,7 +138,7 @@
+         HEVC_BIW_RND_CLIP2_MAX_SATU(dst0, dst1, in0, in1, weight_vec, rnd_vec,
+                                     offset_vec, dst0, dst1);
+         out0 = (v16u8) __msa_pckev_b((v16i8) dst1, (v16i8) dst0);
+-        ST4x4_UB(out0, out0, 0, 1, 2, 3, dst, dst_stride);
++        ST_W4(out0, 0, 1, 2, 3, dst, dst_stride);
+     } else if (0 == height % 8) {
+         for (loop_cnt = (height >> 3); loop_cnt--;) {
+             LW4(src0_ptr, src_stride, tp0, tp1, tp2, tp3);
+@@ -162,7 +162,7 @@
+                                         in3, weight_vec, rnd_vec, offset_vec,
+                                         dst0, dst1, dst2, dst3);
+             PCKEV_B2_UB(dst1, dst0, dst3, dst2, out0, out1);
+-            ST4x8_UB(out0, out1, dst, dst_stride);
++            ST_W8(out0, out1, 0, 1, 2, 3, 0, 1, 2, 3, dst, dst_stride);
+             dst += (8 * dst_stride);
+         }
+     }
+@@ -214,7 +214,10 @@
+                                     weight_vec, rnd_vec, offset_vec,
+                                     dst0, dst1, dst2, dst3);
+         PCKEV_B2_UB(dst1, dst0, dst3, dst2, out0, out1);
+-        ST6x4_UB(out0, out1, dst, dst_stride);
++        ST_W2(out0, 0, 2, dst, dst_stride);
++        ST_H2(out0, 2, 6, dst + 4, dst_stride);
++        ST_W2(out1, 0, 2, dst + 2 * dst_stride, dst_stride);
++        ST_H2(out1, 2, 6, dst + 2 * dst_stride + 4, dst_stride);
+         dst += (4 * dst_stride);
+     }
+ }
+@@ -261,7 +264,7 @@
+                            dst0, dst1);
+ 
+         out0 = (v16u8) __msa_pckev_b((v16i8) dst1, (v16i8) dst0);
+-        ST8x2_UB(out0, dst, dst_stride);
++        ST_D2(out0, 0, 1, dst, dst_stride);
+     } else if (6 == height) {
+         LD4(src0_ptr, src_stride, tp0, tp1, tp2, tp3);
+         src0_ptr += 4 * src_stride;
+@@ -281,9 +284,8 @@
+         HEVC_BIW_RND_CLIP2_MAX_SATU(dst4, dst5, in4, in5, weight_vec, rnd_vec,
+                                     offset_vec, dst4, dst5);
+         PCKEV_B3_UB(dst1, dst0, dst3, dst2, dst5, dst4, out0, out1, out2);
+-        ST8x4_UB(out0, out1, dst, dst_stride);
+-        dst += (4 * dst_stride);
+-        ST8x2_UB(out2, dst, dst_stride);
++        ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
++        ST_D2(out2, 0, 1, dst + 4 * dst_stride, dst_stride);
+     } else if (0 == height % 4) {
+         uint32_t loop_cnt;
+ 
+@@ -302,7 +304,7 @@
+                                         in3, weight_vec, rnd_vec, offset_vec,
+                                         dst0, dst1, dst2, dst3);
+             PCKEV_B2_UB(dst1, dst0, dst3, dst2, out0, out1);
+-            ST8x4_UB(out0, out1, dst, dst_stride);
++            ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
+             dst += (4 * dst_stride);
+         }
+     }
+@@ -361,7 +363,8 @@
+         HEVC_BIW_RND_CLIP2_MAX_SATU(dst4, dst5, in4, in5, weight_vec, rnd_vec,
+                                     offset_vec, dst4, dst5);
+         PCKEV_B3_UB(dst1, dst0, dst3, dst2, dst5, dst4, out0, out1, out2);
+-        ST12x4_UB(out0, out1, out2, dst, dst_stride);
++        ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
++        ST_W4(out2, 0, 1, 2, 3, dst + 8, dst_stride);
+         dst += (4 * dst_stride);
+     }
+ }
+@@ -480,7 +483,7 @@
+         PCKEV_B3_UB(dst1, dst0, dst3, dst2, dst5, dst4, out0, out1, out2);
+         PCKEV_B3_UB(dst7, dst6, dst9, dst8, dst11, dst10, out3, out4, out5);
+         ST_UB4(out0, out1, out3, out4, dst, dst_stride);
+-        ST8x4_UB(out2, out5, dst + 16, dst_stride);
++        ST_D4(out2, out5, 0, 1, 0, 1, dst + 16, dst_stride);
+         dst += (4 * dst_stride);
+     }
+ }
+@@ -720,7 +723,7 @@
+                            out0, out1);
+ 
+         out0 = (v8i16) __msa_pckev_b((v16i8) out1, (v16i8) out0);
+-        ST4x4_UB(out0, out0, 0, 1, 2, 3, dst, dst_stride);
++        ST_W4(out0, 0, 1, 2, 3, dst, dst_stride);
+         dst += (4 * dst_stride);
+     }
+ }
+@@ -800,7 +803,7 @@
+                            out0, out1, out2, out3);
+ 
+         PCKEV_B2_SH(out1, out0, out3, out2, out0, out1);
+-        ST8x4_UB(out0, out1, dst, dst_stride);
++        ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
+         dst += (4 * dst_stride);
+     }
+ }
+@@ -876,7 +879,7 @@
+                            weight_vec, rnd_vec, offset_vec, out0, out1, out2,
+                            out3);
+         PCKEV_B2_SH(out1, out0, out3, out2, out0, out1);
+-        ST8x4_UB(out0, out1, dst, dst_stride);
++        ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
+ 
+         LD_SB4(src0_ptr + 8, src_stride, src0, src1, src2, src3);
+         src0_ptr += (4 * src_stride);
+@@ -895,7 +898,7 @@
+         HEVC_BIW_RND_CLIP2(dst0, dst1, in0, in1, weight_vec, rnd_vec,
+                            offset_vec, out0, out1);
+         out0 = (v8i16) __msa_pckev_b((v16i8) out1, (v16i8) out0);
+-        ST4x4_UB(out0, out0, 0, 1, 2, 3, dst + 8, dst_stride);
++        ST_W4(out0, 0, 1, 2, 3, dst + 8, dst_stride);
+         dst += (4 * dst_stride);
+     }
+ }
+@@ -1066,8 +1069,8 @@
+         dst2_l = __msa_dpadd_s_w(offset_vec, (v8i16) dst2_l,
+                                  (v8i16) weight_vec);
+         SRAR_W2_SW(dst2_r, dst2_l, rnd_vec);
+-        dst2_r = (v4i32) __msa_pckev_h((v8i16) dst2_l, (v8i16) dst2_r);
+-        out2 = CLIP_SH_0_255(dst2_r);
++        out2 = __msa_pckev_h((v8i16) dst2_l, (v8i16) dst2_r);
++        CLIP_SH_0_255(out2);
+ 
+         LD_SB2(src0_ptr, 16, src0, src1);
+         src0_ptr += src_stride;
+@@ -1097,8 +1100,8 @@
+     dst2_r = __msa_dpadd_s_w(offset_vec, (v8i16) dst2_r, (v8i16) weight_vec);
+     dst2_l = __msa_dpadd_s_w(offset_vec, (v8i16) dst2_l, (v8i16) weight_vec);
+     SRAR_W2_SW(dst2_r, dst2_l, rnd_vec);
+-    dst2_r = (v4i32) __msa_pckev_h((v8i16) dst2_l, (v8i16) dst2_r);
+-    out2 = CLIP_SH_0_255(dst2_r);
++    out2 = __msa_pckev_h((v8i16) dst2_l, (v8i16) dst2_r);
++    CLIP_SH_0_255(out2);
+     PCKEV_B2_SH(out1, out0, out2, out2, out0, out2);
+     dst_val0 = __msa_copy_u_d((v2i64) out2, 0);
+     ST_SH(out0, dst);
+@@ -1483,7 +1486,7 @@
+                            out0, out1, out2, out3);
+ 
+         PCKEV_B2_SH(out1, out0, out3, out2, out0, out1);
+-        ST4x8_UB(out0, out1, dst, dst_stride);
++        ST_W8(out0, out1, 0, 1, 2, 3, 0, 1, 2, 3, dst, dst_stride);
+         dst += (8 * dst_stride);
+ 
+         src2110 = src10998;
+@@ -1568,7 +1571,7 @@
+                            out0, out1, out2, out3);
+ 
+         PCKEV_B2_SH(out1, out0, out3, out2, out0, out1);
+-        ST8x4_UB(out0, out1, dst, dst_stride);
++        ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
+         dst += (4 * dst_stride);
+ 
+         src10_r = src54_r;
+@@ -1671,11 +1674,11 @@
+         dst2_l = __msa_dpadd_s_w(offset_vec, (v8i16) dst2_l,
+                                  (v8i16) weight_vec);
+         SRAR_W2_SW(dst2_r, dst2_l, rnd_vec);
+-        dst2_r = (v4i32) __msa_pckev_h((v8i16) dst2_l, (v8i16) dst2_r);
+-        out2 = CLIP_SH_0_255(dst2_r);
++        out2 = __msa_pckev_h((v8i16) dst2_l, (v8i16) dst2_r);
++        CLIP_SH_0_255(out2);
+         PCKEV_B2_SH(out1, out0, out2, out2, out0, out2);
+-        ST8x2_UB(out0, dst, dst_stride);
+-        ST4x2_UB(out2, dst + 8, dst_stride);
++        ST_D2(out0, 0, 1, dst, dst_stride);
++        ST_W2(out2, 0, 1, dst + 8, dst_stride);
+         dst += (2 * dst_stride);
+ 
+         src10_r = src32_r;
+@@ -2045,10 +2048,10 @@
+         dst2 = __msa_dpadd_s_w(offset_vec, tmp2, weight_vec);
+         dst3 = __msa_dpadd_s_w(offset_vec, tmp3, weight_vec);
+         SRAR_W4_SW(dst0, dst1, dst2, dst3, rnd_vec);
+-        CLIP_SW4_0_255_MAX_SATU(dst0, dst1, dst2, dst3);
++        CLIP_SW4_0_255(dst0, dst1, dst2, dst3);
+         PCKEV_H2_SH(dst1, dst0, dst3, dst2, tmp0, tmp1);
+         out = (v16u8) __msa_pckev_b((v16i8) tmp1, (v16i8) tmp0);
+-        ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
++        ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
+         dst += (4 * dst_stride);
+ 
+         dst10 = dst54;
+@@ -2223,10 +2226,10 @@
+             dst1_r = __msa_dpadd_s_w(offset_vec, tmp2, weight_vec);
+             dst1_l = __msa_dpadd_s_w(offset_vec, tmp3, weight_vec);
+             SRAR_W4_SW(dst0_l, dst0_r, dst1_l, dst1_r, rnd_vec);
+-            CLIP_SW4_0_255_MAX_SATU(dst0_l, dst0_r, dst1_l, dst1_r);
++            CLIP_SW4_0_255(dst0_l, dst0_r, dst1_l, dst1_r);
+             PCKEV_H2_SH(dst0_l, dst0_r, dst1_l, dst1_r, tmp0, tmp1);
+             out = (v16u8) __msa_pckev_b((v16i8) tmp1, (v16i8) tmp0);
+-            ST8x2_UB(out, dst_tmp, dst_stride);
++            ST_D2(out, 0, 1, dst_tmp, dst_stride);
+             dst_tmp += (2 * dst_stride);
+ 
+             dst0 = dst2;
+@@ -2409,10 +2412,10 @@
+         dst2 = __msa_dpadd_s_w(offset_vec, tmp2, weight_vec);
+         dst3 = __msa_dpadd_s_w(offset_vec, tmp3, weight_vec);
+         SRAR_W4_SW(dst1, dst0, dst3, dst2, rnd_vec);
+-        CLIP_SW4_0_255_MAX_SATU(dst1, dst0, dst3, dst2);
++        CLIP_SW4_0_255(dst1, dst0, dst3, dst2);
+         PCKEV_H2_SH(dst1, dst0, dst3, dst2, tmp0, tmp1);
+         out = (v16u8) __msa_pckev_b((v16i8) tmp1, (v16i8) tmp0);
+-        ST8x2_UB(out, dst_tmp, dst_stride);
++        ST_D2(out, 0, 1, dst_tmp, dst_stride);
+         dst_tmp += (2 * dst_stride);
+ 
+         dsth0 = dsth2;
+@@ -2500,10 +2503,10 @@
+         dst2 = __msa_dpadd_s_w(offset_vec, tmp2, weight_vec);
+         dst3 = __msa_dpadd_s_w(offset_vec, tmp3, weight_vec);
+         SRAR_W4_SW(dst0, dst1, dst2, dst3, rnd_vec);
+-        CLIP_SW4_0_255_MAX_SATU(dst0, dst1, dst2, dst3);
++        CLIP_SW4_0_255(dst0, dst1, dst2, dst3);
+         PCKEV_H2_SH(dst1, dst0, dst3, dst2, tmp0, tmp1);
+         out = (v16u8) __msa_pckev_b((v16i8) tmp1, (v16i8) tmp0);
+-        ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
++        ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
+         dst += (4 * dst_stride);
+ 
+         dst10 = dst54;
+@@ -2680,10 +2683,10 @@
+     dst0_r = __msa_dpadd_s_w(offset_vec, (v8i16) dst0_r, (v8i16) weight_vec);
+     dst0_l = __msa_dpadd_s_w(offset_vec, (v8i16) dst0_l, (v8i16) weight_vec);
+     SRAR_W2_SW(dst0_r, dst0_l, rnd_vec);
+-    dst0_r = (v4i32) __msa_pckev_h((v8i16) dst0_l, (v8i16) dst0_r);
+-    out0 = CLIP_SH_0_255(dst0_r);
++    out0 = __msa_pckev_h((v8i16) dst0_l, (v8i16) dst0_r);
++    CLIP_SH_0_255(out0);
+     out0 = (v8i16) __msa_pckev_b((v16i8) out0, (v16i8) out0);
+-    ST4x2_UB(out0, dst, dst_stride);
++    ST_W2(out0, 0, 1, dst, dst_stride);
+ }
+ 
+ static void hevc_hz_biwgt_4t_4x4_msa(uint8_t *src0_ptr,
+@@ -2743,7 +2746,7 @@
+                        dst0, dst1);
+ 
+     dst0 = (v8i16) __msa_pckev_b((v16i8) dst1, (v16i8) dst0);
+-    ST4x4_UB(dst0, dst0, 0, 1, 2, 3, dst, dst_stride);
++    ST_W4(dst0, 0, 1, 2, 3, dst, dst_stride);
+ }
+ 
+ static void hevc_hz_biwgt_4t_4x8multiple_msa(uint8_t *src0_ptr,
+@@ -2816,7 +2819,7 @@
+                            dst0, dst1, dst2, dst3);
+ 
+         PCKEV_B2_SH(dst1, dst0, dst3, dst2, dst0, dst1);
+-        ST4x8_UB(dst0, dst1, dst, dst_stride);
++        ST_W8(dst0, dst1, 0, 1, 2, 3, 0, 1, 2, 3, dst, dst_stride);
+         dst += (8 * dst_stride);
+     }
+ }
+@@ -2918,7 +2921,10 @@
+                            dst0, dst1, dst2, dst3);
+ 
+         PCKEV_B2_SH(dst1, dst0, dst3, dst2, dst0, dst1);
+-        ST6x4_UB(dst0, dst1, dst, dst_stride);
++        ST_W2(dst0, 0, 2, dst, dst_stride);
++        ST_H2(dst0, 2, 6, dst + 4, dst_stride);
++        ST_W2(dst1, 0, 2, dst + 2 * dst_stride, dst_stride);
++        ST_H2(dst1, 2, 6, dst + 2 * dst_stride + 4, dst_stride);
+         dst += (4 * dst_stride);
+     }
+ }
+@@ -2976,7 +2982,7 @@
+                        dst0, dst1);
+ 
+     dst0 = (v8i16) __msa_pckev_b((v16i8) dst1, (v16i8) dst0);
+-    ST8x2_UB(dst0, dst, dst_stride);
++    ST_D2(dst0, 0, 1, dst, dst_stride);
+ }
+ 
+ static void hevc_hz_biwgt_4t_8x6_msa(uint8_t *src0_ptr,
+@@ -3049,9 +3055,8 @@
+ 
+     PCKEV_B2_SH(dst1, dst0, dst3, dst2, dst0, dst1);
+     dst3 = (v8i16) __msa_pckev_b((v16i8) dst5, (v16i8) dst4);
+-    ST8x4_UB(dst0, dst1, dst, dst_stride);
+-    dst += (4 * dst_stride);
+-    ST8x2_UB(dst3, dst, dst_stride);
++    ST_D4(dst0, dst1, 0, 1, 0, 1, dst, dst_stride);
++    ST_D2(dst3, 0, 1, dst + 4 * dst_stride, dst_stride);
+ }
+ 
+ static void hevc_hz_biwgt_4t_8x4multiple_msa(uint8_t *src0_ptr,
+@@ -3119,7 +3124,7 @@
+                            dst0, dst1, dst2, dst3);
+ 
+         PCKEV_B2_SH(dst1, dst0, dst3, dst2, dst0, dst1);
+-        ST8x4_UB(dst0, dst1, dst, dst_stride);
++        ST_D4(dst0, dst1, 0, 1, 0, 1, dst, dst_stride);
+         dst += (4 * dst_stride);
+     }
+ }
+@@ -3235,7 +3240,8 @@
+ 
+         PCKEV_B2_SH(dst1, dst0, dst3, dst2, dst0, dst1);
+         dst3 = (v8i16) __msa_pckev_b((v16i8) dst5, (v16i8) dst4);
+-        ST12x4_UB(dst0, dst1, dst3, dst, dst_stride);
++        ST_D4(dst0, dst1, 0, 1, 0, 1, dst, dst_stride);
++        ST_W4(dst3, 0, 1, 2, 3, dst + 8, dst_stride);
+         dst += (4 * dst_stride);
+     }
+ }
+@@ -3411,7 +3417,7 @@
+                            dst0, dst1);
+ 
+         dst0 = (v8i16) __msa_pckev_b((v16i8) dst1, (v16i8) dst0);
+-        ST8x2_UB(dst0, (dst + 16), dst_stride);
++        ST_D2(dst0, 0, 1, (dst + 16), dst_stride);
+         dst += (2 * dst_stride);
+     }
+ }
+@@ -3548,10 +3554,10 @@
+     dst10_r = __msa_dpadd_s_w(offset_vec, (v8i16) dst10_r, (v8i16) weight_vec);
+     dst10_l = __msa_dpadd_s_w(offset_vec, (v8i16) dst10_l, (v8i16) weight_vec);
+     SRAR_W2_SW(dst10_r, dst10_l, rnd_vec);
+-    dst10_r = (v4i32) __msa_pckev_h((v8i16) dst10_l, (v8i16) dst10_r);
+-    out = CLIP_SH_0_255(dst10_r);
++    out = __msa_pckev_h((v8i16) dst10_l, (v8i16) dst10_r);
++    CLIP_SH_0_255(out);
+     out = (v8i16) __msa_pckev_b((v16i8) out, (v16i8) out);
+-    ST4x2_UB(out, dst, dst_stride);
++    ST_W2(out, 0, 1, dst, dst_stride);
+ }
+ 
+ static void hevc_vt_biwgt_4t_4x4_msa(uint8_t *src0_ptr,
+@@ -3617,7 +3623,7 @@
+                        dst10, dst32);
+ 
+     dst10 = (v8i16) __msa_pckev_b((v16i8) dst32, (v16i8) dst10);
+-    ST4x4_UB(dst10, dst10, 0, 1, 2, 3, dst, dst_stride);
++    ST_W4(dst10, 0, 1, 2, 3, dst, dst_stride);
+     dst += (4 * dst_stride);
+ }
+ 
+@@ -3702,7 +3708,7 @@
+                            dst10, dst32, dst54, dst76);
+ 
+         PCKEV_B2_SH(dst32, dst10, dst76, dst54, dst10, dst32);
+-        ST4x8_UB(dst10, dst32, dst, dst_stride);
++        ST_W8(dst10, dst32, 0, 1, 2, 3, 0, 1, 2, 3, dst, dst_stride);
+         dst += (8 * dst_stride);
+     }
+ }
+@@ -3807,7 +3813,10 @@
+                            tmp0, tmp1, tmp2, tmp3);
+ 
+         PCKEV_B2_SH(tmp1, tmp0, tmp3, tmp2, tmp0, tmp1);
+-        ST6x4_UB(tmp0, tmp1, dst, dst_stride);
++        ST_W2(tmp0, 0, 2, dst, dst_stride);
++        ST_H2(tmp0, 2, 6, dst + 4, dst_stride);
++        ST_W2(tmp1, 0, 2, dst + 2 * dst_stride, dst_stride);
++        ST_H2(tmp1, 2, 6, dst + 2 * dst_stride + 4, dst_stride);
+         dst += (4 * dst_stride);
+     }
+ }
+@@ -3866,7 +3875,7 @@
+                        tmp0, tmp1);
+ 
+     tmp0 = (v8i16) __msa_pckev_b((v16i8) tmp1, (v16i8) tmp0);
+-    ST8x2_UB(tmp0, dst, dst_stride);
++    ST_D2(tmp0, 0, 1, dst, dst_stride);
+ }
+ 
+ static void hevc_vt_biwgt_4t_8x6_msa(uint8_t *src0_ptr,
+@@ -3936,9 +3945,8 @@
+ 
+     PCKEV_B2_SH(tmp1, tmp0, tmp3, tmp2, tmp0, tmp1);
+     tmp3 = (v8i16) __msa_pckev_b((v16i8) tmp5, (v16i8) tmp4);
+-    ST8x4_UB(tmp0, tmp1, dst, dst_stride);
+-    dst += (4 * dst_stride);
+-    ST8x2_UB(tmp3, dst, dst_stride);
++    ST_D4(tmp0, tmp1, 0, 1, 0, 1, dst, dst_stride);
++    ST_D2(tmp3, 0, 1, dst + 4 * dst_stride, dst_stride);
+ }
+ 
+ static void hevc_vt_biwgt_4t_8x4multiple_msa(uint8_t *src0_ptr,
+@@ -4010,7 +4018,7 @@
+                            tmp0, tmp1, tmp2, tmp3);
+ 
+         PCKEV_B2_SH(tmp1, tmp0, tmp3, tmp2, tmp0, tmp1);
+-        ST8x4_UB(tmp0, tmp1, dst, dst_stride);
++        ST_D4(tmp0, tmp1, 0, 1, 0, 1, dst, dst_stride);
+         dst += (4 * dst_stride);
+     }
+ }
+@@ -4132,7 +4140,8 @@
+ 
+         PCKEV_B2_SH(tmp1, tmp0, tmp3, tmp2, tmp0, tmp1);
+         tmp2 = (v8i16) __msa_pckev_b((v16i8) tmp5, (v16i8) tmp4);
+-        ST12x4_UB(tmp0, tmp1, tmp2, dst, dst_stride);
++        ST_D4(tmp0, tmp1, 0, 1, 0, 1, dst, dst_stride);
++        ST_W4(tmp2, 0, 1, 2, 3, dst + 8, dst_stride);
+         dst += (4 * dst_stride);
+     }
+ }
+@@ -4323,7 +4332,7 @@
+         /* 8width */
+         tmp2 = (v8i16) __msa_pckev_b((v16i8) tmp3, (v16i8) tmp2);
+         ST_SH2(tmp0, tmp1, dst, dst_stride);
+-        ST8x2_UB(tmp2, dst + 16, dst_stride);
++        ST_D2(tmp2, 0, 1, dst + 16, dst_stride);
+         dst += (2 * dst_stride);
+ 
+         /* 16width */
+@@ -4363,7 +4372,7 @@
+         /* 8width */
+         tmp2 = (v8i16) __msa_pckev_b((v16i8) tmp3, (v16i8) tmp2);
+         ST_SH2(tmp0, tmp1, dst, dst_stride);
+-        ST8x2_UB(tmp2, dst + 16, dst_stride);
++        ST_D2(tmp2, 0, 1, dst + 16, dst_stride);
+         dst += (2 * dst_stride);
+     }
+ }
+@@ -4566,9 +4575,9 @@
+     dst1 = __msa_dpadd_s_w(offset_vec, tmp1, weight_vec);
+     SRAR_W2_SW(dst0, dst1, rnd_vec);
+     tmp = __msa_pckev_h((v8i16) dst1, (v8i16) dst0);
+-    tmp = CLIP_SH_0_255_MAX_SATU(tmp);
++    CLIP_SH_0_255(tmp);
+     out = (v16u8) __msa_pckev_b((v16i8) tmp, (v16i8) tmp);
+-    ST4x2_UB(out, dst, dst_stride);
++    ST_W2(out, 0, 1, dst, dst_stride);
+ }
+ 
+ static void hevc_hv_biwgt_4t_4x4_msa(uint8_t *src0_ptr,
+@@ -4663,9 +4672,9 @@
+     dst3 = __msa_dpadd_s_w(offset_vec, tmp3, weight_vec);
+     SRAR_W4_SW(dst0, dst1, dst2, dst3, rnd_vec);
+     PCKEV_H2_SH(dst1, dst0, dst3, dst2, tmp0, tmp1);
+-    CLIP_SH2_0_255_MAX_SATU(tmp0, tmp1);
++    CLIP_SH2_0_255(tmp0, tmp1);
+     out = (v16u8) __msa_pckev_b((v16i8) tmp1, (v16i8) tmp0);
+-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
++    ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
+ }
+ 
+ static void hevc_hv_biwgt_4t_4multx8mult_msa(uint8_t *src0_ptr,
+@@ -4801,9 +4810,9 @@
+         SRAR_W4_SW(dst4, dst5, dst6, dst7, rnd_vec);
+         PCKEV_H4_SH(dst1, dst0, dst3, dst2, dst5, dst4, dst7, dst6, tmp0, tmp1,
+                     tmp2, tmp3);
+-        CLIP_SH4_0_255_MAX_SATU(tmp0, tmp1, tmp2, tmp3);
++        CLIP_SH4_0_255(tmp0, tmp1, tmp2, tmp3);
+         PCKEV_B2_UB(tmp1, tmp0, tmp3, tmp2, out0, out1);
+-        ST4x8_UB(out0, out1, dst, dst_stride);
++        ST_W8(out0, out1, 0, 1, 2, 3, 0, 1, 2, 3, dst, dst_stride);
+         dst += (8 * dst_stride);
+ 
+         dst10_r = dst98_r;
+@@ -4999,9 +5008,9 @@
+     SRAR_W4_SW(dst4, dst5, dst6, dst7, rnd_vec);
+     PCKEV_H4_SH(dst1, dst0, dst3, dst2, dst5, dst4, dst7, dst6, tmp0, tmp1,
+                 tmp2, tmp3);
+-    CLIP_SH4_0_255_MAX_SATU(tmp0, tmp1, tmp2, tmp3);
++    CLIP_SH4_0_255(tmp0, tmp1, tmp2, tmp3);
+     PCKEV_B2_UB(tmp1, tmp0, tmp3, tmp2, out0, out1);
+-    ST4x8_UB(out0, out1, dst, dst_stride);
++    ST_W8(out0, out1, 0, 1, 2, 3, 0, 1, 2, 3, dst, dst_stride);
+ 
+     PCKEV_H2_SW(dst1_l, dst0_l, dst3_l, dst2_l, dst4, dst5);
+ 
+@@ -5021,11 +5030,9 @@
+     SRAR_W4_SW(dst0, dst1, dst2, dst3, rnd_vec);
+     PCKEV_H2_SH(dst1, dst0, dst3, dst2, tmp4, tmp5);
+ 
+-    CLIP_SH2_0_255_MAX_SATU(tmp4, tmp5);
++    CLIP_SH2_0_255(tmp4, tmp5);
+     out2 = (v16u8) __msa_pckev_b((v16i8) tmp5, (v16i8) tmp4);
+-    ST2x4_UB(out2, 0, dst + 4, dst_stride);
+-    dst += 4 * dst_stride;
+-    ST2x4_UB(out2, 4, dst + 4, dst_stride);
++    ST_H8(out2, 0, 1, 2, 3, 4, 5, 6, 7, dst + 4, dst_stride);
+ }
+ 
+ static void hevc_hv_biwgt_4t_8x2_msa(uint8_t *src0_ptr,
+@@ -5119,9 +5126,9 @@
+     dst1_l = __msa_dpadd_s_w(offset_vec, tmp3, weight_vec);
+     SRAR_W4_SW(dst0_r, dst0_l, dst1_r, dst1_l, rnd_vec);
+     PCKEV_H2_SH(dst0_l, dst0_r, dst1_l, dst1_r, tmp0, tmp1);
+-    CLIP_SH2_0_255_MAX_SATU(tmp0, tmp1);
++    CLIP_SH2_0_255(tmp0, tmp1);
+     out = (v16u8) __msa_pckev_b((v16i8) tmp1, (v16i8) tmp0);
+-    ST8x2_UB(out, dst, dst_stride);
++    ST_D2(out, 0, 1, dst, dst_stride);
+ }
+ 
+ static void hevc_hv_biwgt_4t_8multx4_msa(uint8_t *src0_ptr,
+@@ -5241,9 +5248,9 @@
+         SRAR_W4_SW(dst4, dst5, dst6, dst7, rnd_vec);
+         PCKEV_H4_SH(dst1, dst0, dst3, dst2, dst5, dst4, dst7, dst6,
+                     tmp0, tmp1, tmp2, tmp3);
+-        CLIP_SH4_0_255_MAX_SATU(tmp0, tmp1, tmp2, tmp3);
++        CLIP_SH4_0_255(tmp0, tmp1, tmp2, tmp3);
+         PCKEV_B2_UB(tmp1, tmp0, tmp3, tmp2, out0, out1);
+-        ST8x4_UB(out0, out1, dst, dst_stride);
++        ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
+         dst += 8;
+     }
+ }
+@@ -5380,7 +5387,7 @@
+     SRAR_W4_SW(dst4, dst5, dst6, dst7, rnd_vec);
+     PCKEV_H4_SH(dst1, dst0, dst3, dst2, dst5, dst4, dst7, dst6,
+                 tmp0, tmp1, tmp2, tmp3);
+-    CLIP_SH4_0_255_MAX_SATU(tmp0, tmp1, tmp2, tmp3);
++    CLIP_SH4_0_255(tmp0, tmp1, tmp2, tmp3);
+     PCKEV_B2_UB(tmp1, tmp0, tmp3, tmp2, out0, out1);
+ 
+     PCKEV_H2_SW(dst4_l, dst4_r, dst5_l, dst5_r, dst0, dst1);
+@@ -5392,11 +5399,10 @@
+     dst3 = __msa_dpadd_s_w(offset_vec, tmp3, weight_vec);
+     SRAR_W4_SW(dst0, dst1, dst2, dst3, rnd_vec);
+     PCKEV_H2_SH(dst1, dst0, dst3, dst2, tmp4, tmp5);
+-    CLIP_SH2_0_255_MAX_SATU(tmp4, tmp5);
++    CLIP_SH2_0_255(tmp4, tmp5);
+     out2 = (v16u8) __msa_pckev_b((v16i8) tmp5, (v16i8) tmp4);
+-    ST8x4_UB(out0, out1, dst, dst_stride);
+-    dst += (4 * dst_stride);
+-    ST8x2_UB(out2, dst, dst_stride);
++    ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
++    ST_D2(out2, 0, 1, dst + 4 * dst_stride, dst_stride);
+ }
+ 
+ static void hevc_hv_biwgt_4t_8multx4mult_msa(uint8_t *src0_ptr,
+@@ -5531,9 +5537,9 @@
+             SRAR_W4_SW(dst4, dst5, dst6, dst7, rnd_vec);
+             PCKEV_H4_SH(dst1, dst0, dst3, dst2, dst5, dst4, dst7, dst6,
+                         tmp0, tmp1, tmp2, tmp3);
+-            CLIP_SH4_0_255_MAX_SATU(tmp0, tmp1, tmp2, tmp3);
++            CLIP_SH4_0_255(tmp0, tmp1, tmp2, tmp3);
+             PCKEV_B2_UB(tmp1, tmp0, tmp3, tmp2, out0, out1);
+-            ST8x4_UB(out0, out1, dst_tmp, dst_stride);
++            ST_D4(out0, out1, 0, 1, 0, 1, dst_tmp, dst_stride);
+             dst_tmp += (4 * dst_stride);
+ 
+             dst10_r = dst54_r;
+@@ -5718,9 +5724,9 @@
+         SRAR_W4_SW(dst4, dst5, dst6, dst7, rnd_vec);
+         PCKEV_H4_SH(dst1, dst0, dst3, dst2, dst5, dst4, dst7, dst6,
+                     tmp0, tmp1, tmp2, tmp3);
+-        CLIP_SH4_0_255_MAX_SATU(tmp0, tmp1, tmp2, tmp3);
++        CLIP_SH4_0_255(tmp0, tmp1, tmp2, tmp3);
+         PCKEV_B2_UB(tmp1, tmp0, tmp3, tmp2, out0, out1);
+-        ST8x4_UB(out0, out1, dst_tmp, dst_stride);
++        ST_D4(out0, out1, 0, 1, 0, 1, dst_tmp, dst_stride);
+         dst_tmp += (4 * dst_stride);
+ 
+         dst10_r = dst54_r;
+@@ -5814,9 +5820,9 @@
+         SRAR_W4_SW(dst4, dst5, dst6, dst7, rnd_vec);
+         PCKEV_H4_SH(dst1, dst0, dst3, dst2, dst5, dst4, dst7, dst6,
+                     tmp0, tmp1, tmp2, tmp3);
+-        CLIP_SH4_0_255_MAX_SATU(tmp0, tmp1, tmp2, tmp3);
++        CLIP_SH4_0_255(tmp0, tmp1, tmp2, tmp3);
+         PCKEV_B2_UB(tmp1, tmp0, tmp3, tmp2, out0, out1);
+-        ST4x8_UB(out0, out1, dst, dst_stride);
++        ST_W8(out0, out1, 0, 1, 2, 3, 0, 1, 2, 3, dst, dst_stride);
+         dst += (8 * dst_stride);
+ 
+         dst10_r = dst98_r;
+diff -uNra ffmpeg-4.1.6/libavcodec/mips/hevc_mc_uni_msa.c FFmpeg/libavcodec/mips/hevc_mc_uni_msa.c
+--- a/libavcodec/mips/hevc_mc_uni_msa.c	2020-07-05 06:36:01.000000000 +0800
++++ b/libavcodec/mips/hevc_mc_uni_msa.c	2020-07-19 18:13:57.474026467 +0800
+@@ -309,7 +309,7 @@
+     SRARI_H2_SH(out0, out1, 6);
+     SAT_SH2_SH(out0, out1, 7);
+     out = PCKEV_XORI128_UB(out0, out1);
+-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
++    ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
+ }
+ 
+ static void common_hz_8t_4x8_msa(uint8_t *src, int32_t src_stride,
+@@ -344,10 +344,9 @@
+     SRARI_H4_SH(out0, out1, out2, out3, 6);
+     SAT_SH4_SH(out0, out1, out2, out3, 7);
+     out = PCKEV_XORI128_UB(out0, out1);
+-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
+-    dst += (4 * dst_stride);
++    ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
+     out = PCKEV_XORI128_UB(out2, out3);
+-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
++    ST_W4(out, 0, 1, 2, 3, dst + 4 * dst_stride, dst_stride);
+ }
+ 
+ static void common_hz_8t_4x16_msa(uint8_t *src, int32_t src_stride,
+@@ -382,11 +381,10 @@
+     SRARI_H4_SH(out0, out1, out2, out3, 6);
+     SAT_SH4_SH(out0, out1, out2, out3, 7);
+     out = PCKEV_XORI128_UB(out0, out1);
+-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
+-    dst += (4 * dst_stride);
++    ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
+     out = PCKEV_XORI128_UB(out2, out3);
+-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
+-    dst += (4 * dst_stride);
++    ST_W4(out, 0, 1, 2, 3, dst + 4 * dst_stride, dst_stride);
++    dst += (8 * dst_stride);
+ 
+     LD_SB4(src, src_stride, src0, src1, src2, src3);
+     XORI_B4_128_SB(src0, src1, src2, src3);
+@@ -402,10 +400,9 @@
+     SRARI_H4_SH(out0, out1, out2, out3, 6);
+     SAT_SH4_SH(out0, out1, out2, out3, 7);
+     out = PCKEV_XORI128_UB(out0, out1);
+-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
+-    dst += (4 * dst_stride);
++    ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
+     out = PCKEV_XORI128_UB(out2, out3);
+-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
++    ST_W4(out, 0, 1, 2, 3, dst + 4 * dst_stride, dst_stride);
+ }
+ 
+ static void common_hz_8t_4w_msa(uint8_t *src, int32_t src_stride,
+@@ -468,7 +465,7 @@
+         SAT_SH4_SH(out0, out1, out2, out3, 7);
+         tmp0 = PCKEV_XORI128_UB(out0, out1);
+         tmp1 = PCKEV_XORI128_UB(out2, out3);
+-        ST8x4_UB(tmp0, tmp1, dst, dst_stride);
++        ST_D4(tmp0, tmp1, 0, 1, 0, 1, dst, dst_stride);
+         dst += (4 * dst_stride);
+     }
+ }
+@@ -546,8 +543,8 @@
+         tmp1 = PCKEV_XORI128_UB(out2, out3);
+         tmp2 = PCKEV_XORI128_UB(out4, out5);
+ 
+-        ST8x4_UB(tmp0, tmp1, dst, dst_stride);
+-        ST4x4_UB(tmp2, tmp2, 0, 1, 2, 3, dst + 8, dst_stride);
++        ST_D4(tmp0, tmp1, 0, 1, 0, 1, dst, dst_stride);
++        ST_W4(tmp2, 0, 1, 2, 3, dst + 8, dst_stride);
+         dst += (4 * dst_stride);
+     }
+ }
+@@ -670,7 +667,7 @@
+         SAT_SH4_SH(out0, out8, out2, out9, 7);
+         SAT_SH2_SH(out1, out3, 7);
+         out = PCKEV_XORI128_UB(out8, out9);
+-        ST8x2_UB(out, dst + 16, dst_stride);
++        ST_D2(out, 0, 1, dst + 16, dst_stride);
+         out = PCKEV_XORI128_UB(out0, out1);
+         ST_UB(out, dst);
+         dst += dst_stride;
+@@ -965,10 +962,8 @@
+         SAT_SH2_SH(out54, out76, 7);
+         out0 = PCKEV_XORI128_UB(out10, out32);
+         out1 = PCKEV_XORI128_UB(out54, out76);
+-        ST4x4_UB(out0, out0, 0, 1, 2, 3, dst, dst_stride);
+-        dst += (4 * dst_stride);
+-        ST4x4_UB(out1, out1, 0, 1, 2, 3, dst, dst_stride);
+-        dst += (4 * dst_stride);
++        ST_W8(out0, out1, 0, 1, 2, 3, 0, 1, 2, 3, dst, dst_stride);
++        dst += (8 * dst_stride);
+ 
+         src2110 = src10998;
+         src4332 = src12111110;
+@@ -1019,7 +1014,7 @@
+         SAT_SH4_SH(out0_r, out1_r, out2_r, out3_r, 7);
+         tmp0 = PCKEV_XORI128_UB(out0_r, out1_r);
+         tmp1 = PCKEV_XORI128_UB(out2_r, out3_r);
+-        ST8x4_UB(tmp0, tmp1, dst, dst_stride);
++        ST_D4(tmp0, tmp1, 0, 1, 0, 1, dst, dst_stride);
+         dst += (4 * dst_stride);
+ 
+         src10_r = src54_r;
+@@ -1458,10 +1453,8 @@
+         PCKEV_H2_SW(dst5_r, dst4_r, dst7_r, dst6_r, dst4_r, dst5_r);
+         out0 = PCKEV_XORI128_UB(dst0_r, dst1_r);
+         out1 = PCKEV_XORI128_UB(dst4_r, dst5_r);
+-        ST4x4_UB(out0, out0, 0, 1, 2, 3, dst, dst_stride);
+-        dst += (4 * dst_stride);
+-        ST4x4_UB(out1, out1, 0, 1, 2, 3, dst, dst_stride);
+-        dst += (4 * dst_stride);
++        ST_W8(out0, out1, 0, 1, 2, 3, 0, 1, 2, 3, dst, dst_stride);
++        dst += (8 * dst_stride);
+ 
+         dst10_r = dst98_r;
+         dst32_r = dst1110_r;
+@@ -1595,7 +1588,7 @@
+ 
+             PCKEV_H2_SH(dst0_l, dst0_r, dst1_l, dst1_r, dst0, dst1);
+             out = PCKEV_XORI128_UB(dst0, dst1);
+-            ST8x2_UB(out, dst_tmp, dst_stride);
++            ST_D2(out, 0, 1, dst_tmp, dst_stride);
+             dst_tmp += (2 * dst_stride);
+ 
+             dst0 = dst2;
+@@ -1741,7 +1734,7 @@
+ 
+         PCKEV_H2_SH(dst0_l, dst0_r, dst1_l, dst1_r, dst0, dst1);
+         out0 = PCKEV_XORI128_UB(dst0, dst1);
+-        ST8x2_UB(out0, dst_tmp, dst_stride);
++        ST_D2(out0, 0, 1, dst_tmp, dst_stride);
+         dst_tmp += (2 * dst_stride);
+ 
+         dst0 = dst2;
+@@ -1845,10 +1838,8 @@
+         PCKEV_H2_SW(dst5_r, dst4_r, dst7_r, dst6_r, dst4_r, dst5_r);
+         out0 = PCKEV_XORI128_UB(dst0_r, dst1_r);
+         out1 = PCKEV_XORI128_UB(dst4_r, dst5_r);
+-        ST4x4_UB(out0, out0, 0, 1, 2, 3, dst, dst_stride);
+-        dst += (4 * dst_stride);
+-        ST4x4_UB(out1, out1, 0, 1, 2, 3, dst, dst_stride);
+-        dst += (4 * dst_stride);
++        ST_W8(out0, out1, 0, 1, 2, 3, 0, 1, 2, 3, dst, dst_stride);
++        dst += (8 * dst_stride);
+ 
+         dst10_r = dst98_r;
+         dst32_r = dst1110_r;
+@@ -1944,7 +1935,7 @@
+     res0 = __msa_srari_h(res0, 6);
+     res0 = __msa_sat_s_h(res0, 7);
+     out = PCKEV_XORI128_UB(res0, res0);
+-    ST4x2_UB(out, dst, dst_stride);
++    ST_W2(out, 0, 1, dst, dst_stride);
+ }
+ 
+ static void common_hz_4t_4x4_msa(uint8_t *src, int32_t src_stride,
+@@ -1971,7 +1962,7 @@
+     SRARI_H2_SH(out0, out1, 6);
+     SAT_SH2_SH(out0, out1, 7);
+     out = PCKEV_XORI128_UB(out0, out1);
+-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
++    ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
+ }
+ 
+ static void common_hz_4t_4x8_msa(uint8_t *src, int32_t src_stride,
+@@ -2004,10 +1995,9 @@
+     SRARI_H4_SH(out0, out1, out2, out3, 6);
+     SAT_SH4_SH(out0, out1, out2, out3, 7);
+     out = PCKEV_XORI128_UB(out0, out1);
+-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
+-    dst += (4 * dst_stride);
++    ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
+     out = PCKEV_XORI128_UB(out2, out3);
+-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
++    ST_W4(out, 0, 1, 2, 3, dst + 4 * dst_stride, dst_stride);
+ }
+ 
+ static void common_hz_4t_4x16_msa(uint8_t *src, int32_t src_stride,
+@@ -2038,11 +2028,10 @@
+     SRARI_H4_SH(out0, out1, out2, out3, 6);
+     SAT_SH4_SH(out0, out1, out2, out3, 7);
+     out = PCKEV_XORI128_UB(out0, out1);
+-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
+-    dst += (4 * dst_stride);
++    ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
+     out = PCKEV_XORI128_UB(out2, out3);
+-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
+-    dst += (4 * dst_stride);
++    ST_W4(out, 0, 1, 2, 3, dst + 4 * dst_stride, dst_stride);
++    dst += (8 * dst_stride);
+ 
+     LD_SB8(src, src_stride, src0, src1, src2, src3, src4, src5, src6, src7);
+     src += (8 * src_stride);
+@@ -2054,10 +2043,9 @@
+     SRARI_H4_SH(out0, out1, out2, out3, 6);
+     SAT_SH4_SH(out0, out1, out2, out3, 7);
+     out = PCKEV_XORI128_UB(out0, out1);
+-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
+-    dst += (4 * dst_stride);
++    ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
+     out = PCKEV_XORI128_UB(out2, out3);
+-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
++    ST_W4(out, 0, 1, 2, 3, dst + 4 * dst_stride, dst_stride);
+ }
+ 
+ static void common_hz_4t_4w_msa(uint8_t *src, int32_t src_stride,
+@@ -2102,7 +2090,10 @@
+     SAT_SH4_SH(out0, out1, out2, out3, 7);
+     out4 = PCKEV_XORI128_UB(out0, out1);
+     out5 = PCKEV_XORI128_UB(out2, out3);
+-    ST6x4_UB(out4, out5, dst, dst_stride);
++    ST_W2(out4, 0, 2, dst, dst_stride);
++    ST_H2(out4, 2, 6, dst + 4, dst_stride);
++    ST_W2(out5, 0, 2, dst + 2 * dst_stride, dst_stride);
++    ST_H2(out5, 2, 6, dst + 2 * dst_stride + 4, dst_stride);
+     dst += (4 * dst_stride);
+ 
+     LD_SB4(src, src_stride, src0, src1, src2, src3);
+@@ -2115,8 +2106,10 @@
+     SAT_SH4_SH(out0, out1, out2, out3, 7);
+     out4 = PCKEV_XORI128_UB(out0, out1);
+     out5 = PCKEV_XORI128_UB(out2, out3);
+-    ST6x4_UB(out4, out5, dst, dst_stride);
+-    dst += (4 * dst_stride);
++    ST_W2(out4, 0, 2, dst, dst_stride);
++    ST_H2(out4, 2, 6, dst + 4, dst_stride);
++    ST_W2(out5, 0, 2, dst + 2 * dst_stride, dst_stride);
++    ST_H2(out5, 2, 6, dst + 2 * dst_stride + 4, dst_stride);
+ }
+ 
+ static void common_hz_4t_8x2mult_msa(uint8_t *src, int32_t src_stride,
+@@ -2148,7 +2141,7 @@
+         SRARI_H2_SH(vec0, vec1, 6);
+         SAT_SH2_SH(vec0, vec1, 7);
+         out = PCKEV_XORI128_UB(vec0, vec1);
+-        ST8x2_UB(out, dst, dst_stride);
++        ST_D2(out, 0, 1, dst, dst_stride);
+         dst += (2 * dst_stride);
+     }
+ }
+@@ -2182,7 +2175,7 @@
+         SAT_SH4_SH(out0, out1, out2, out3, 7);
+         tmp0 = PCKEV_XORI128_UB(out0, out1);
+         tmp1 = PCKEV_XORI128_UB(out2, out3);
+-        ST8x4_UB(tmp0, tmp1, dst, dst_stride);
++        ST_D4(tmp0, tmp1, 0, 1, 0, 1, dst, dst_stride);
+         dst += (4 * dst_stride);
+     }
+ }
+@@ -2235,7 +2228,7 @@
+         SRARI_H2_SH(out0, out1, 6);
+         SAT_SH2_SH(out0, out1, 7);
+         tmp0 = PCKEV_XORI128_UB(out0, out1);
+-        ST4x4_UB(tmp0, tmp0, 0, 1, 2, 3, dst + 8, dst_stride);
++        ST_W4(tmp0, 0, 1, 2, 3, dst + 8, dst_stride);
+ 
+         VSHF_B2_SB(src0, src0, src1, src1, mask0, mask0, vec4, vec5);
+         VSHF_B2_SB(src2, src2, src3, src3, mask0, mask0, vec6, vec7);
+@@ -2249,7 +2242,7 @@
+         SAT_SH4_SH(out2, out3, out4, out5, 7);
+         tmp0 = PCKEV_XORI128_UB(out2, out3);
+         tmp1 = PCKEV_XORI128_UB(out4, out5);
+-        ST8x4_UB(tmp0, tmp1, dst, dst_stride);
++        ST_D4(tmp0, tmp1, 0, 1, 0, 1, dst, dst_stride);
+         dst += (4 * dst_stride);
+     }
+ }
+@@ -2395,7 +2388,7 @@
+         SAT_SH4_SH(out0, out1, out2, out3, 7);
+         tmp0 = PCKEV_XORI128_UB(out0, out1);
+         tmp1 = PCKEV_XORI128_UB(out2, out3);
+-        ST8x4_UB(tmp0, tmp1, dst1, dst_stride);
++        ST_D4(tmp0, tmp1, 0, 1, 0, 1, dst1, dst_stride);
+         dst1 += (4 * dst_stride);
+     }
+ }
+@@ -2496,7 +2489,7 @@
+     out10 = __msa_srari_h(out10, 6);
+     out10 = __msa_sat_s_h(out10, 7);
+     out = PCKEV_XORI128_UB(out10, out10);
+-    ST4x2_UB(out, dst, dst_stride);
++    ST_W2(out, 0, 1, dst, dst_stride);
+ }
+ 
+ static void common_vt_4t_4x4multiple_msa(uint8_t *src, int32_t src_stride,
+@@ -2540,7 +2533,7 @@
+         SRARI_H2_SH(out10, out32, 6);
+         SAT_SH2_SH(out10, out32, 7);
+         out = PCKEV_XORI128_UB(out10, out32);
+-        ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
++        ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
+         dst += (4 * dst_stride);
+     }
+ }
+@@ -2596,7 +2589,10 @@
+     SAT_SH4_SH(dst0_r, dst1_r, dst2_r, dst3_r, 7);
+     out0 = PCKEV_XORI128_UB(dst0_r, dst1_r);
+     out1 = PCKEV_XORI128_UB(dst2_r, dst3_r);
+-    ST6x4_UB(out0, out1, dst, dst_stride);
++    ST_W2(out0, 0, 2, dst, dst_stride);
++    ST_H2(out0, 2, 6, dst + 4, dst_stride);
++    ST_W2(out1, 0, 2, dst + 2 * dst_stride, dst_stride);
++    ST_H2(out1, 2, 6, dst + 2 * dst_stride + 4, dst_stride);
+     dst += (4 * dst_stride);
+ 
+     LD_SB2(src, src_stride, src3, src4);
+@@ -2619,7 +2615,10 @@
+     SAT_SH4_SH(dst0_r, dst1_r, dst2_r, dst3_r, 7);
+     out0 = PCKEV_XORI128_UB(dst0_r, dst1_r);
+     out1 = PCKEV_XORI128_UB(dst2_r, dst3_r);
+-    ST6x4_UB(out0, out1, dst, dst_stride);
++    ST_W2(out0, 0, 2, dst, dst_stride);
++    ST_H2(out0, 2, 6, dst + 4, dst_stride);
++    ST_W2(out1, 0, 2, dst + 2 * dst_stride, dst_stride);
++    ST_H2(out1, 2, 6, dst + 2 * dst_stride + 4, dst_stride);
+ }
+ 
+ static void common_vt_4t_8x2_msa(uint8_t *src, int32_t src_stride,
+@@ -2645,7 +2644,7 @@
+     SRARI_H2_SH(tmp0, tmp1, 6);
+     SAT_SH2_SH(tmp0, tmp1, 7);
+     out = PCKEV_XORI128_UB(tmp0, tmp1);
+-    ST8x2_UB(out, dst, dst_stride);
++    ST_D2(out, 0, 1, dst, dst_stride);
+ }
+ 
+ static void common_vt_4t_8x6_msa(uint8_t *src, int32_t src_stride,
+@@ -2737,7 +2736,7 @@
+         SAT_SH4_SH(out0_r, out1_r, out2_r, out3_r, 7);
+         tmp0 = PCKEV_XORI128_UB(out0_r, out1_r);
+         tmp1 = PCKEV_XORI128_UB(out2_r, out3_r);
+-        ST8x4_UB(tmp0, tmp1, dst, dst_stride);
++        ST_D4(tmp0, tmp1, 0, 1, 0, 1, dst, dst_stride);
+         dst += (4 * dst_stride);
+ 
+         src10_r = src98_r;
+@@ -2811,9 +2810,9 @@
+         SAT_SH2_SH(dst0_l, dst1_l, 7);
+         out0 = PCKEV_XORI128_UB(dst0_r, dst1_r);
+         out1 = PCKEV_XORI128_UB(dst2_r, dst3_r);
+-        ST8x4_UB(out0, out1, dst, dst_stride);
++        ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
+         out0 = PCKEV_XORI128_UB(dst0_l, dst1_l);
+-        ST4x4_UB(out0, out0, 0, 1, 2, 3, dst + 8, dst_stride);
++        ST_W4(out0, 0, 1, 2, 3, dst + 8, dst_stride);
+         dst += (4 * dst_stride);
+ 
+         src2 = src6;
+@@ -2982,12 +2981,12 @@
+         out = PCKEV_XORI128_UB(out0_r, out0_l);
+         ST_UB(out, dst);
+         out = PCKEV_XORI128_UB(out2_r, out2_r);
+-        ST8x1_UB(out, dst + 16);
++        ST_D1(out, 0, dst + 16);
+         dst += dst_stride;
+         out = PCKEV_XORI128_UB(out1_r, out1_l);
+         ST_UB(out, dst);
+         out = PCKEV_XORI128_UB(out3_r, out3_r);
+-        ST8x1_UB(out, dst + 16);
++        ST_D1(out, 0, dst + 16);
+         dst += dst_stride;
+     }
+ }
+@@ -3137,7 +3136,7 @@
+     tmp = __msa_srari_h(tmp, 6);
+     tmp = __msa_sat_s_h(tmp, 7);
+     out = PCKEV_XORI128_UB(tmp, tmp);
+-    ST4x2_UB(out, dst, dst_stride);
++    ST_W2(out, 0, 1, dst, dst_stride);
+ }
+ 
+ static void hevc_hv_uni_4t_4x4_msa(uint8_t *src,
+@@ -3196,7 +3195,7 @@
+     SRARI_H2_SH(tmp0, tmp1, 6);
+     SAT_SH2_SH(tmp0, tmp1, 7);
+     out = PCKEV_XORI128_UB(tmp0, tmp1);
+-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
++    ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
+ }
+ 
+ static void hevc_hv_uni_4t_4multx8mult_msa(uint8_t *src,
+@@ -3288,7 +3287,7 @@
+         SAT_SH4_SH(tmp0, tmp1, tmp2, tmp3, 7);
+         out0 = PCKEV_XORI128_UB(tmp0, tmp1);
+         out1 = PCKEV_XORI128_UB(tmp2, tmp3);
+-        ST4x8_UB(out0, out1, dst, dst_stride);
++        ST_W8(out0, out1, 0, 1, 2, 3, 0, 1, 2, 3, dst, dst_stride);
+         dst += (8 * dst_stride);
+ 
+         dst10_r = dst98_r;
+@@ -3432,10 +3431,8 @@
+     out0 = PCKEV_XORI128_UB(tmp0, tmp1);
+     out1 = PCKEV_XORI128_UB(tmp2, tmp3);
+     out2 = PCKEV_XORI128_UB(tmp4, tmp5);
+-    ST4x8_UB(out0, out1, dst, dst_stride);
+-    ST2x4_UB(out2, 0, dst + 4, dst_stride);
+-    dst += 4 * dst_stride;
+-    ST2x4_UB(out2, 4, dst + 4, dst_stride);
++    ST_W8(out0, out1, 0, 1, 2, 3, 0, 1, 2, 3, dst, dst_stride);
++    ST_H8(out2, 0, 1, 2, 3, 4, 5, 6, 7, dst + 4, dst_stride);
+ }
+ 
+ static void hevc_hv_uni_4t_8x2_msa(uint8_t *src,
+@@ -3497,7 +3494,7 @@
+     SRARI_H2_SH(out0_r, out1_r, 6);
+     SAT_SH2_SH(out0_r, out1_r, 7);
+     out = PCKEV_XORI128_UB(out0_r, out1_r);
+-    ST8x2_UB(out, dst, dst_stride);
++    ST_D2(out, 0, 1, dst, dst_stride);
+ }
+ 
+ static void hevc_hv_uni_4t_8multx4_msa(uint8_t *src,
+@@ -3580,7 +3577,7 @@
+         SAT_SH4_SH(tmp0, tmp1, tmp2, tmp3, 7);
+         out0 = PCKEV_XORI128_UB(tmp0, tmp1);
+         out1 = PCKEV_XORI128_UB(tmp2, tmp3);
+-        ST8x4_UB(out0, out1, dst, dst_stride);
++        ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
+         dst += 8;
+     }
+ }
+@@ -3684,9 +3681,8 @@
+     out1 = PCKEV_XORI128_UB(out2_r, out3_r);
+     out2 = PCKEV_XORI128_UB(out4_r, out5_r);
+ 
+-    ST8x4_UB(out0, out1, dst, dst_stride);
+-    dst += (4 * dst_stride);
+-    ST8x2_UB(out2, dst, dst_stride);
++    ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
++    ST_D2(out2, 0, 1, dst + 4 * dst_stride, dst_stride);
+ }
+ 
+ static void hevc_hv_uni_4t_8multx4mult_msa(uint8_t *src,
+@@ -3788,7 +3784,7 @@
+             SAT_SH4_SH(out0_r, out1_r, out2_r, out3_r, 7);
+             out0 = PCKEV_XORI128_UB(out0_r, out1_r);
+             out1 = PCKEV_XORI128_UB(out2_r, out3_r);
+-            ST8x4_UB(out0, out1, dst_tmp, dst_stride);
++            ST_D4(out0, out1, 0, 1, 0, 1, dst_tmp, dst_stride);
+             dst_tmp += (4 * dst_stride);
+ 
+             dst10_r = dst54_r;
+@@ -3919,7 +3915,7 @@
+         SAT_SH4_SH(tmp0, tmp1, tmp2, tmp3, 7);
+         out0 = PCKEV_XORI128_UB(tmp0, tmp1);
+         out1 = PCKEV_XORI128_UB(tmp2, tmp3);
+-        ST8x4_UB(out0, out1, dst_tmp, dst_stride);
++        ST_D4(out0, out1, 0, 1, 0, 1, dst_tmp, dst_stride);
+         dst_tmp += (4 * dst_stride);
+ 
+         dst10_r = dst54_r;
+@@ -3985,7 +3981,7 @@
+         SAT_SH4_SH(tmp0, tmp1, tmp2, tmp3, 7);
+         out0 = PCKEV_XORI128_UB(tmp0, tmp1);
+         out1 = PCKEV_XORI128_UB(tmp2, tmp3);
+-        ST4x8_UB(out0, out1, dst, dst_stride);
++        ST_W8(out0, out1, 0, 1, 2, 3, 0, 1, 2, 3, dst, dst_stride);
+         dst += (8 * dst_stride);
+ 
+         dst10_r = dst98_r;
+diff -uNra ffmpeg-4.1.6/libavcodec/mips/hevc_mc_uniw_msa.c FFmpeg/libavcodec/mips/hevc_mc_uniw_msa.c
+--- a/libavcodec/mips/hevc_mc_uniw_msa.c	2020-07-05 06:36:01.000000000 +0800
++++ b/libavcodec/mips/hevc_mc_uniw_msa.c	2020-07-19 18:13:57.474026467 +0800
+@@ -41,7 +41,7 @@
+     SRAR_W4_SW(in0_r_m, in1_r_m, in0_l_m, in1_l_m, rnd_w);                    \
+     PCKEV_H2_SH(in0_l_m, in0_r_m, in1_l_m, in1_r_m, out0_h, out1_h);          \
+     ADDS_SH2_SH(out0_h, offset_h, out1_h, offset_h, out0_h, out1_h);          \
+-    CLIP_SH2_0_255_MAX_SATU(out0_h, out1_h);                                  \
++    CLIP_SH2_0_255(out0_h, out1_h);                                           \
+ }
+ 
+ #define HEVC_UNIW_RND_CLIP4_MAX_SATU_H(in0_h, in1_h, in2_h, in3_h, wgt_w,  \
+@@ -88,9 +88,9 @@
+         SRAR_W2_SW(dst0_r, dst0_l, rnd_vec);
+         dst0 = __msa_pckev_h((v8i16) dst0_l, (v8i16) dst0_r);
+         dst0 += offset_vec;
+-        dst0 = CLIP_SH_0_255_MAX_SATU(dst0);
++        CLIP_SH_0_255(dst0);
+         out0 = (v16u8) __msa_pckev_b((v16i8) dst0, (v16i8) dst0);
+-        ST4x2_UB(out0, dst, dst_stride);
++        ST_W2(out0, 0, 1, dst, dst_stride);
+     } else if (4 == height) {
+         LW4(src, src_stride, tp0, tp1, tp2, tp3);
+         INSERT_W4_SB(tp0, tp1, tp2, tp3, src0);
+@@ -99,7 +99,7 @@
+         HEVC_UNIW_RND_CLIP2_MAX_SATU_H(dst0, dst1, weight_vec, offset_vec,
+                                        rnd_vec, dst0, dst1);
+         out0 = (v16u8) __msa_pckev_b((v16i8) dst1, (v16i8) dst0);
+-        ST4x4_UB(out0, out0, 0, 1, 2, 3, dst, dst_stride);
++        ST_W4(out0, 0, 1, 2, 3, dst, dst_stride);
+     } else if (0 == (height % 8)) {
+         for (loop_cnt = (height >> 3); loop_cnt--;) {
+             LW4(src, src_stride, tp0, tp1, tp2, tp3);
+@@ -115,7 +115,7 @@
+                                            offset_vec, rnd_vec, dst0, dst1,
+                                            dst2, dst3);
+             PCKEV_B2_UB(dst1, dst0, dst3, dst2, out0, out1);
+-            ST4x8_UB(out0, out1, dst, dst_stride);
++            ST_W8(out0, out1, 0, 1, 2, 3, 0, 1, 2, 3, dst, dst_stride);
+             dst += 8 * dst_stride;
+         }
+     }
+@@ -170,9 +170,15 @@
+         PCKEV_B2_UB(dst1, dst0, dst3, dst2, out0, out1);
+         PCKEV_B2_UB(dst5, dst4, dst7, dst6, out2, out3);
+ 
+-        ST6x4_UB(out0, out1, dst, dst_stride);
++        ST_W2(out0, 0, 2, dst, dst_stride);
++        ST_H2(out0, 2, 6, dst + 4, dst_stride);
++        ST_W2(out1, 0, 2, dst + 2 * dst_stride, dst_stride);
++        ST_H2(out1, 2, 6, dst + 2 * dst_stride + 4, dst_stride);
+         dst += (4 * dst_stride);
+-        ST6x4_UB(out2, out3, dst, dst_stride);
++        ST_W2(out2, 0, 2, dst, dst_stride);
++        ST_H2(out2, 2, 6, dst + 4, dst_stride);
++        ST_W2(out3, 0, 2, dst + 2 * dst_stride, dst_stride);
++        ST_H2(out3, 2, 6, dst + 2 * dst_stride + 4, dst_stride);
+         dst += (4 * dst_stride);
+     }
+ }
+@@ -207,7 +213,7 @@
+         HEVC_UNIW_RND_CLIP2_MAX_SATU_H(dst0, dst1, weight_vec, offset_vec,
+                                        rnd_vec, dst0, dst1);
+         out0 = (v16u8) __msa_pckev_b((v16i8) dst1, (v16i8) dst0);
+-        ST8x2_UB(out0, dst, dst_stride);
++        ST_D2(out0, 0, 1, dst, dst_stride);
+     } else if (4 == height) {
+         LD4(src, src_stride, tp0, tp1, tp2, tp3);
+         INSERT_D2_SB(tp0, tp1, src0);
+@@ -219,7 +225,7 @@
+                                        offset_vec, rnd_vec, dst0, dst1, dst2,
+                                        dst3);
+         PCKEV_B2_UB(dst1, dst0, dst3, dst2, out0, out1);
+-        ST8x4_UB(out0, out1, dst, dst_stride);
++        ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
+     } else if (6 == height) {
+         LD4(src, src_stride, tp0, tp1, tp2, tp3);
+         src += 4 * src_stride;
+@@ -238,9 +244,8 @@
+         HEVC_UNIW_RND_CLIP2_MAX_SATU_H(dst4, dst5, weight_vec, offset_vec,
+                                        rnd_vec, dst4, dst5);
+         PCKEV_B3_UB(dst1, dst0, dst3, dst2, dst5, dst4, out0, out1, out2);
+-        ST8x4_UB(out0, out1, dst, dst_stride);
+-        dst += (4 * dst_stride);
+-        ST8x2_UB(out2, dst, dst_stride);
++        ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
++        ST_D2(out2, 0, 1, dst + 4 * dst_stride, dst_stride);
+     } else if (0 == height % 8) {
+         for (loop_cnt = (height >> 3); loop_cnt--;) {
+             LD4(src, src_stride, tp0, tp1, tp2, tp3);
+@@ -266,10 +271,9 @@
+                                            dst6, dst7);
+             PCKEV_B2_UB(dst1, dst0, dst3, dst2, out0, out1);
+             PCKEV_B2_UB(dst5, dst4, dst7, dst6, out2, out3);
+-            ST8x4_UB(out0, out1, dst, dst_stride);
+-            dst += (4 * dst_stride);
+-            ST8x4_UB(out2, out3, dst, dst_stride);
+-            dst += (4 * dst_stride);
++            ST_D8(out0, out1, out2, out3, 0, 1, 0, 1, 0, 1, 0, 1,
++                  dst, dst_stride);
++            dst += (8 * dst_stride);
+         }
+     }
+ }
+@@ -313,7 +317,8 @@
+                                        rnd_vec, dst4, dst5);
+ 
+         PCKEV_B3_UB(dst1, dst0, dst3, dst2, dst5, dst4, out0, out1, out2);
+-        ST12x4_UB(out0, out1, out2, dst, dst_stride);
++        ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
++        ST_W4(out2, 0, 1, 2, 3, dst + 8, dst_stride);
+         dst += (4 * dst_stride);
+     }
+ }
+@@ -409,7 +414,7 @@
+         PCKEV_B3_UB(dst1, dst0, dst3, dst2, dst5, dst4, out0, out1, out2);
+         PCKEV_B3_UB(dst7, dst6, dst9, dst8, dst11, dst10, out3, out4, out5);
+         ST_UB4(out0, out1, out3, out4, dst, dst_stride);
+-        ST8x4_UB(out2, out5, dst + 16, dst_stride);
++        ST_D4(out2, out5, 0, 1, 0, 1, dst + 16, dst_stride);
+         dst += (4 * dst_stride);
+     }
+ }
+@@ -651,7 +656,7 @@
+                                        dst3);
+ 
+         PCKEV_B2_UB(dst1, dst0, dst3, dst2, out0, out1);
+-        ST4x8_UB(out0, out1, dst, dst_stride);
++        ST_W8(out0, out1, 0, 1, 2, 3, 0, 1, 2, 3, dst, dst_stride);
+         dst += (8 * dst_stride);
+     }
+ }
+@@ -729,7 +734,7 @@
+                                        dst3);
+ 
+         PCKEV_B2_UB(dst1, dst0, dst3, dst2, out0, out1);
+-        ST8x4_UB(out0, out1, dst, dst_stride);
++        ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
+         dst += (4 * dst_stride);
+     }
+ }
+@@ -822,8 +827,8 @@
+                                        rnd_vec, dst4, dst5);
+ 
+         PCKEV_B3_UB(dst1, dst0, dst3, dst2, dst5, dst4, out0, out1, out2);
+-        ST8x4_UB(out0, out1, dst, dst_stride);
+-        ST4x4_UB(out2, out2, 0, 1, 2, 3, dst + 8, dst_stride);
++        ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
++        ST_W4(out2, 0, 1, 2, 3, dst + 8, dst_stride);
+         dst += (4 * dst_stride);
+     }
+ }
+@@ -994,7 +999,7 @@
+ 
+         PCKEV_B3_UB(dst1, dst0, dst4, dst3, dst5, dst2, out0, out1, out2);
+         ST_UB2(out0, out1, dst, dst_stride);
+-        ST8x2_UB(out2, dst + 16, dst_stride);
++        ST_D2(out2, 0, 1, dst + 16, dst_stride);
+         dst += (2 * dst_stride);
+     }
+ }
+@@ -1368,7 +1373,7 @@
+                                        dst3);
+ 
+         PCKEV_B2_UB(dst1, dst0, dst3, dst2, out0, out1);
+-        ST4x8_UB(out0, out1, dst, dst_stride);
++        ST_W8(out0, out1, 0, 1, 2, 3, 0, 1, 2, 3, dst, dst_stride);
+         dst += (8 * dst_stride);
+ 
+         src2110 = src10998;
+@@ -1444,7 +1449,7 @@
+                                        dst3);
+ 
+         PCKEV_B2_UB(dst1, dst0, dst3, dst2, out0, out1);
+-        ST8x4_UB(out0, out1, dst, dst_stride);
++        ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
+         dst += (4 * dst_stride);
+ 
+         src10_r = src54_r;
+@@ -1543,8 +1548,8 @@
+                                        rnd_vec, dst4, dst5);
+ 
+         PCKEV_B3_UB(dst1, dst0, dst3, dst2, dst5, dst4, out0, out1, out2);
+-        ST8x4_UB(out0, out1, dst, dst_stride);
+-        ST4x4_UB(out2, out2, 0, 1, 2, 3, dst + 8, dst_stride);
++        ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
++        ST_W4(out2, 0, 1, 2, 3, dst + 8, dst_stride);
+         dst += (4 * dst_stride);
+ 
+         src10_r = src54_r;
+@@ -1858,10 +1863,10 @@
+         SRAR_W4_SW(dst0_r, dst1_r, dst2_r, dst3_r, rnd_vec);
+         ADD2(dst0_r, offset_vec, dst1_r, offset_vec, dst0_r, dst1_r);
+         ADD2(dst2_r, offset_vec, dst3_r, offset_vec, dst2_r, dst3_r);
+-        CLIP_SW4_0_255_MAX_SATU(dst0_r, dst1_r, dst2_r, dst3_r);
++        CLIP_SW4_0_255(dst0_r, dst1_r, dst2_r, dst3_r);
+         PCKEV_H2_SW(dst1_r, dst0_r, dst3_r, dst2_r, dst0_r, dst1_r);
+         out = (v16u8) __msa_pckev_b((v16i8) dst1_r, (v16i8) dst0_r);
+-        ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
++        ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
+         dst += (4 * dst_stride);
+ 
+         dst10_r = dst54_r;
+@@ -2009,11 +2014,11 @@
+             SRAR_W4_SW(dst0_r, dst1_r, dst0_l, dst1_l, rnd_vec);
+             ADD2(dst0_r, offset_vec, dst0_l, offset_vec, dst0_r, dst0_l);
+             ADD2(dst1_r, offset_vec, dst1_l, offset_vec, dst1_r, dst1_l);
+-            CLIP_SW4_0_255_MAX_SATU(dst0_r, dst1_r, dst0_l, dst1_l);
++            CLIP_SW4_0_255(dst0_r, dst1_r, dst0_l, dst1_l);
+ 
+             PCKEV_H2_SW(dst0_l, dst0_r, dst1_l, dst1_r, dst0_r, dst1_r);
+             dst0_r = (v4i32) __msa_pckev_b((v16i8) dst1_r, (v16i8) dst0_r);
+-            ST8x2_UB(dst0_r, dst_tmp, dst_stride);
++            ST_D2(dst0_r, 0, 1, dst_tmp, dst_stride);
+             dst_tmp += (2 * dst_stride);
+ 
+             dst10_r = dst32_r;
+@@ -2160,10 +2165,10 @@
+         MUL2(dst0_r, weight_vec, dst0_l, weight_vec, dst0_r, dst0_l);
+         SRAR_W2_SW(dst0_r, dst0_l, rnd_vec);
+         ADD2(dst0_r, offset_vec, dst0_l, offset_vec, dst0_r, dst0_l);
+-        CLIP_SW2_0_255_MAX_SATU(dst0_r, dst0_l);
++        CLIP_SW2_0_255(dst0_r, dst0_l);
+         dst0_r = (v4i32) __msa_pckev_h((v8i16) dst0_l, (v8i16) dst0_r);
+         out = (v16u8) __msa_pckev_b((v16i8) dst0_r, (v16i8) dst0_r);
+-        ST8x1_UB(out, dst_tmp);
++        ST_D1(out, 0, dst_tmp);
+         dst_tmp += dst_stride;
+ 
+         dst0 = dst1;
+@@ -2241,10 +2246,10 @@
+         SRAR_W4_SW(dst0_r, dst1_r, dst2_r, dst3_r, rnd_vec);
+         ADD2(dst0_r, offset_vec, dst1_r, offset_vec, dst0_r, dst1_r);
+         ADD2(dst2_r, offset_vec, dst3_r, offset_vec, dst2_r, dst3_r);
+-        CLIP_SW4_0_255_MAX_SATU(dst0_r, dst1_r, dst2_r, dst3_r);
++        CLIP_SW4_0_255(dst0_r, dst1_r, dst2_r, dst3_r);
+         PCKEV_H2_SW(dst1_r, dst0_r, dst3_r, dst2_r, dst0_r, dst1_r);
+         out = (v16u8) __msa_pckev_b((v16i8) dst1_r, (v16i8) dst0_r);
+-        ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
++        ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
+         dst += (4 * dst_stride);
+ 
+         dst10_r = dst54_r;
+@@ -2389,9 +2394,9 @@
+     SRAR_W2_SW(dst0_r, dst0_l, rnd_vec);
+     dst0 = __msa_pckev_h((v8i16) dst0_l, (v8i16) dst0_r);
+     dst0 = __msa_adds_s_h(dst0, offset_vec);
+-    dst0 = CLIP_SH_0_255_MAX_SATU(dst0);
++    CLIP_SH_0_255(dst0);
+     out = (v16u8) __msa_pckev_b((v16i8) dst0, (v16i8) dst0);
+-    ST4x2_UB(out, dst, dst_stride);
++    ST_W2(out, 0, 1, dst, dst_stride);
+     dst += (4 * dst_stride);
+ }
+ 
+@@ -2448,7 +2453,7 @@
+                                    dst0, dst1);
+ 
+     out = (v16u8) __msa_pckev_b((v16i8) dst1, (v16i8) dst0);
+-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
++    ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
+     dst += (4 * dst_stride);
+ }
+ 
+@@ -2515,7 +2520,7 @@
+                                        dst0, dst1, dst2, dst3);
+ 
+         PCKEV_B2_UB(dst1, dst0, dst3, dst2, out0, out1);
+-        ST4x8_UB(out0, out1, dst, dst_stride);
++        ST_W8(out0, out1, 0, 1, 2, 3, 0, 1, 2, 3, dst, dst_stride);
+         dst += (8 * dst_stride);
+     }
+ }
+@@ -2613,9 +2618,15 @@
+ 
+     PCKEV_B2_UB(dst1, dst0, dst3, dst2, out0, out1);
+     PCKEV_B2_UB(dst5, dst4, dst7, dst6, out2, out3);
+-    ST6x4_UB(out0, out1, dst, dst_stride);
++    ST_W2(out0, 0, 2, dst, dst_stride);
++    ST_H2(out0, 2, 6, dst + 4, dst_stride);
++    ST_W2(out1, 0, 2, dst + 2 * dst_stride, dst_stride);
++    ST_H2(out1, 2, 6, dst + 2 * dst_stride + 4, dst_stride);
+     dst += (4 * dst_stride);
+-    ST6x4_UB(out2, out3, dst, dst_stride);
++    ST_W2(out2, 0, 2, dst, dst_stride);
++    ST_H2(out2, 2, 6, dst + 4, dst_stride);
++    ST_W2(out3, 0, 2, dst + 2 * dst_stride, dst_stride);
++    ST_H2(out3, 2, 6, dst + 2 * dst_stride + 4, dst_stride);
+ }
+ 
+ static void hevc_hz_uniwgt_4t_8x2_msa(uint8_t *src,
+@@ -2670,7 +2681,7 @@
+                                    dst0, dst1);
+ 
+     out = (v16u8) __msa_pckev_b((v16i8) dst1, (v16i8) dst0);
+-    ST8x2_UB(out, dst, dst_stride);
++    ST_D2(out, 0, 1, dst, dst_stride);
+ }
+ 
+ static void hevc_hz_uniwgt_4t_8x4_msa(uint8_t *src,
+@@ -2727,7 +2738,7 @@
+                                    dst0, dst1, dst2, dst3);
+ 
+     PCKEV_B2_UB(dst1, dst0, dst3, dst2, out0, out1);
+-    ST8x4_UB(out0, out1, dst, dst_stride);
++    ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
+ }
+ 
+ static void hevc_hz_uniwgt_4t_8x6_msa(uint8_t *src,
+@@ -2796,9 +2807,8 @@
+                                    dst4, dst5);
+ 
+     PCKEV_B3_UB(dst1, dst0, dst3, dst2, dst5, dst4, out0, out1, out2);
+-    ST8x4_UB(out0, out1, dst, dst_stride);
+-    dst += (4 * dst_stride);
+-    ST8x2_UB(out2, dst, dst_stride);
++    ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
++    ST_D2(out2, 0, 1, dst + 4 * dst_stride, dst_stride);
+ }
+ 
+ static void hevc_hz_uniwgt_4t_8x8multiple_msa(uint8_t *src,
+@@ -2876,7 +2886,7 @@
+ 
+         PCKEV_B2_UB(dst1, dst0, dst3, dst2, out0, out1);
+         PCKEV_B2_UB(dst5, dst4, dst7, dst6, out2, out3);
+-        ST8x8_UB(out0, out1, out2, out3, dst, dst_stride);
++        ST_D8(out0, out1, out2, out3, 0, 1, 0, 1, 0, 1, 0, 1, dst, dst_stride);
+         dst += (8 * dst_stride);
+     }
+ }
+@@ -2981,7 +2991,8 @@
+                                        rnd_vec, dst4, dst5);
+ 
+         PCKEV_B3_UB(dst1, dst0, dst3, dst2, dst5, dst4, out0, out1, out2);
+-        ST12x4_UB(out0, out1, out2, dst, dst_stride);
++        ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
++        ST_W4(out2, 0, 1, 2, 3, dst + 8, dst_stride);
+         dst += (4 * dst_stride);
+     }
+ }
+@@ -3142,7 +3153,7 @@
+ 
+         PCKEV_B3_UB(dst1, dst0, dst3, dst2, dst5, dst4, out0, out1, out2);
+         ST_UB2(out0, out1, dst, dst_stride);
+-        ST8x2_UB(out2, dst + 16, dst_stride);
++        ST_D2(out2, 0, 1, dst + 16, dst_stride);
+         dst += (2 * dst_stride);
+     }
+ }
+@@ -3284,9 +3295,9 @@
+     SRAR_W2_SW(dst0_r, dst0_l, rnd_vec);
+     dst0 = __msa_pckev_h((v8i16) dst0_l, (v8i16) dst0_r);
+     dst0 = __msa_adds_s_h(dst0, offset_vec);
+-    dst0 = CLIP_SH_0_255_MAX_SATU(dst0);
++    CLIP_SH_0_255(dst0);
+     out = (v16u8) __msa_pckev_b((v16i8) dst0, (v16i8) dst0);
+-    ST4x2_UB(out, dst, dst_stride);
++    ST_W2(out, 0, 1, dst, dst_stride);
+ }
+ 
+ static void hevc_vt_uniwgt_4t_4x4_msa(uint8_t *src,
+@@ -3340,7 +3351,7 @@
+                                    dst0, dst1);
+ 
+     out = (v16u8) __msa_pckev_b((v16i8) dst1, (v16i8) dst0);
+-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
++    ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
+ }
+ 
+ static void hevc_vt_uniwgt_4t_4x8multiple_msa(uint8_t *src,
+@@ -3411,7 +3422,7 @@
+                                        dst0, dst1, dst2, dst3);
+ 
+         PCKEV_B2_UB(dst1, dst0, dst3, dst2, out0, out1);
+-        ST4x8_UB(out0, out1, dst, dst_stride);
++        ST_W8(out0, out1, 0, 1, 2, 3, 0, 1, 2, 3, dst, dst_stride);
+         dst += (8 * dst_stride);
+ 
+         src2 = src10;
+@@ -3509,9 +3520,15 @@
+ 
+     PCKEV_B2_UB(dst1, dst0, dst3, dst2, out0, out1);
+     PCKEV_B2_UB(dst5, dst4, dst7, dst6, out2, out3);
+-    ST6x4_UB(out0, out1, dst, dst_stride);
++    ST_W2(out0, 0, 2, dst, dst_stride);
++    ST_H2(out0, 2, 6, dst + 4, dst_stride);
++    ST_W2(out1, 0, 2, dst + 2 * dst_stride, dst_stride);
++    ST_H2(out1, 2, 6, dst + 2 * dst_stride + 4, dst_stride);
+     dst += (4 * dst_stride);
+-    ST6x4_UB(out2, out3, dst, dst_stride);
++    ST_W2(out2, 0, 2, dst, dst_stride);
++    ST_H2(out2, 2, 6, dst + 4, dst_stride);
++    ST_W2(out3, 0, 2, dst + 2 * dst_stride, dst_stride);
++    ST_H2(out3, 2, 6, dst + 2 * dst_stride + 4, dst_stride);
+ }
+ 
+ static void hevc_vt_uniwgt_4t_8x2_msa(uint8_t *src,
+@@ -3562,7 +3579,7 @@
+                                    dst0, dst1);
+ 
+     out = (v16u8) __msa_pckev_b((v16i8) dst1, (v16i8) dst0);
+-    ST8x2_UB(out, dst, dst_stride);
++    ST_D2(out, 0, 1, dst, dst_stride);
+ }
+ 
+ static void hevc_vt_uniwgt_4t_8x4_msa(uint8_t *src,
+@@ -3617,7 +3634,7 @@
+                                    offset_vec, rnd_vec, dst0, dst1, dst2,
+                                    dst3);
+     PCKEV_B2_UB(dst1, dst0, dst3, dst2, out0, out1);
+-    ST8x4_UB(out0, out1, dst, dst_stride);
++    ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
+ }
+ 
+ static void hevc_vt_uniwgt_4t_8x6_msa(uint8_t *src,
+@@ -3679,9 +3696,8 @@
+     HEVC_UNIW_RND_CLIP2_MAX_SATU_H(dst4, dst5, weight_vec, offset_vec, rnd_vec,
+                                    dst4, dst5);
+     PCKEV_B3_UB(dst1, dst0, dst3, dst2, dst5, dst4, out0, out1, out2);
+-    ST8x4_UB(out0, out1, dst, dst_stride);
+-    dst += (4 * dst_stride);
+-    ST8x2_UB(out2, dst, dst_stride);
++    ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
++    ST_D2(out2, 0, 1, dst + 4 * dst_stride, dst_stride);
+ }
+ 
+ static void hevc_vt_uniwgt_4t_8x8mult_msa(uint8_t *src,
+@@ -3754,7 +3770,7 @@
+                                        dst7);
+         PCKEV_B2_UB(dst1, dst0, dst3, dst2, out0, out1);
+         PCKEV_B2_UB(dst5, dst4, dst7, dst6, out2, out3);
+-        ST8x8_UB(out0, out1, out2, out3, dst, dst_stride);
++        ST_D8(out0, out1, out2, out3, 0, 1, 0, 1, 0, 1, 0, 1, dst, dst_stride);
+         dst += (8 * dst_stride);
+ 
+         src2 = src10;
+@@ -3861,7 +3877,8 @@
+         HEVC_UNIW_RND_CLIP2_MAX_SATU_H(dst4, dst5, weight_vec, offset_vec,
+                                        rnd_vec, dst4, dst5);
+         PCKEV_B3_UB(dst1, dst0, dst3, dst2, dst5, dst4, out0, out1, out2);
+-        ST12x4_UB(out0, out1, out2, dst, dst_stride);
++        ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
++        ST_W4(out2, 0, 1, 2, 3, dst + 8, dst_stride);
+         dst += (4 * dst_stride);
+ 
+         ILVRL_B2_SB(src7, src6, src76_r, src76_l);
+@@ -3882,7 +3899,8 @@
+         HEVC_UNIW_RND_CLIP2_MAX_SATU_H(dst10, dst11, weight_vec, offset_vec,
+                                        rnd_vec, dst10, dst11);
+         PCKEV_B3_UB(dst7, dst6, dst9, dst8, dst11, dst10, out3, out4, out5);
+-        ST12x4_UB(out3, out4, out5, dst, dst_stride);
++        ST_D4(out3, out4, 0, 1, 0, 1, dst, dst_stride);
++        ST_W4(out5, 0, 1, 2, 3, dst + 8, dst_stride);
+         dst += (4 * dst_stride);
+ 
+         src2 = src10;
+@@ -4062,7 +4080,7 @@
+                     out2, out3);
+         PCKEV_B2_UB(dst9, dst8, dst11, dst10, out4, out5);
+         ST_UB4(out0, out1, out2, out3, dst, dst_stride);
+-        ST8x4_UB(out4, out5, dst + 16, dst_stride);
++        ST_D4(out4, out5, 0, 1, 0, 1, dst + 16, dst_stride);
+         dst += (4 * dst_stride);
+ 
+         src2 = src6;
+@@ -4229,9 +4247,9 @@
+     SRAR_W2_SW(dst0, dst1, rnd_vec);
+     tmp = __msa_pckev_h((v8i16) dst1, (v8i16) dst0);
+     tmp += offset_vec;
+-    tmp = CLIP_SH_0_255_MAX_SATU(tmp);
++    CLIP_SH_0_255(tmp);
+     out = (v16u8) __msa_pckev_b((v16i8) tmp, (v16i8) tmp);
+-    ST4x2_UB(out, dst, dst_stride);
++    ST_W2(out, 0, 1, dst, dst_stride);
+ }
+ 
+ static void hevc_hv_uniwgt_4t_4x4_msa(uint8_t *src,
+@@ -4298,9 +4316,9 @@
+     SRAR_W4_SW(dst0, dst1, dst2, dst3, rnd_vec);
+     PCKEV_H2_SH(dst1, dst0, dst3, dst2, tmp0, tmp1);
+     ADD2(tmp0, offset_vec, tmp1, offset_vec, tmp0, tmp1);
+-    CLIP_SH2_0_255_MAX_SATU(tmp0, tmp1);
++    CLIP_SH2_0_255(tmp0, tmp1);
+     out = (v16u8) __msa_pckev_b((v16i8) tmp1, (v16i8) tmp0);
+-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
++    ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
+ }
+ 
+ static void hevc_hv_uniwgt_4t_4multx8mult_msa(uint8_t *src,
+@@ -4399,9 +4417,9 @@
+                     tmp2, tmp3);
+         ADD2(tmp0, offset_vec, tmp1, offset_vec, tmp0, tmp1);
+         ADD2(tmp2, offset_vec, tmp3, offset_vec, tmp2, tmp3);
+-        CLIP_SH4_0_255_MAX_SATU(tmp0, tmp1, tmp2, tmp3);
++        CLIP_SH4_0_255(tmp0, tmp1, tmp2, tmp3);
+         PCKEV_B2_UB(tmp1, tmp0, tmp3, tmp2, out0, out1);
+-        ST4x8_UB(out0, out1, dst, dst_stride);
++        ST_W8(out0, out1, 0, 1, 2, 3, 0, 1, 2, 3, dst, dst_stride);
+         dst += (8 * dst_stride);
+ 
+         dst10_r = dst98_r;
+@@ -4556,13 +4574,11 @@
+     ADD2(tmp0, offset_vec, tmp1, offset_vec, tmp0, tmp1);
+     ADD2(tmp2, offset_vec, tmp3, offset_vec, tmp2, tmp3);
+     ADD2(tmp4, offset_vec, tmp5, offset_vec, tmp4, tmp5);
+-    CLIP_SH4_0_255_MAX_SATU(tmp0, tmp1, tmp2, tmp3);
+-    CLIP_SH2_0_255_MAX_SATU(tmp4, tmp5);
++    CLIP_SH4_0_255(tmp0, tmp1, tmp2, tmp3);
++    CLIP_SH2_0_255(tmp4, tmp5);
+     PCKEV_B3_UB(tmp1, tmp0, tmp3, tmp2, tmp5, tmp4, out0, out1, out2);
+-    ST4x8_UB(out0, out1, dst, dst_stride);
+-    ST2x4_UB(out2, 0, dst + 4, dst_stride);
+-    dst += 4 * dst_stride;
+-    ST2x4_UB(out2, 4, dst + 4, dst_stride);
++    ST_W8(out0, out1, 0, 1, 2, 3, 0, 1, 2, 3, dst, dst_stride);
++    ST_H8(out2, 0, 1, 2, 3, 4, 5, 6, 7, dst + 4, dst_stride);
+ }
+ 
+ static void hevc_hv_uniwgt_4t_8x2_msa(uint8_t *src,
+@@ -4636,9 +4652,9 @@
+     SRAR_W4_SW(dst0_r, dst0_l, dst1_r, dst1_l, rnd_vec);
+     PCKEV_H2_SH(dst0_l, dst0_r, dst1_l, dst1_r, tmp0, tmp1);
+     ADD2(tmp0, offset_vec, tmp1, offset_vec, tmp0, tmp1);
+-    CLIP_SH2_0_255_MAX_SATU(tmp0, tmp1);
++    CLIP_SH2_0_255(tmp0, tmp1);
+     out = (v16u8) __msa_pckev_b((v16i8) tmp1, (v16i8) tmp0);
+-    ST8x2_UB(out, dst, dst_stride);
++    ST_D2(out, 0, 1, dst, dst_stride);
+ }
+ 
+ static void hevc_hv_uniwgt_4t_8multx4_msa(uint8_t *src,
+@@ -4729,9 +4745,9 @@
+                     dst3_r, tmp0, tmp1, tmp2, tmp3);
+         ADD2(tmp0, offset_vec, tmp1, offset_vec, tmp0, tmp1);
+         ADD2(tmp2, offset_vec, tmp3, offset_vec, tmp2, tmp3);
+-        CLIP_SH4_0_255_MAX_SATU(tmp0, tmp1, tmp2, tmp3);
++        CLIP_SH4_0_255(tmp0, tmp1, tmp2, tmp3);
+         PCKEV_B2_UB(tmp1, tmp0, tmp3, tmp2, out0, out1);
+-        ST8x4_UB(out0, out1, dst, dst_stride);
++        ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
+         dst += 8;
+     }
+ }
+@@ -4845,12 +4861,11 @@
+     ADD2(tmp0, offset_vec, tmp1, offset_vec, tmp0, tmp1);
+     ADD2(tmp2, offset_vec, tmp3, offset_vec, tmp2, tmp3);
+     ADD2(tmp4, offset_vec, tmp5, offset_vec, tmp4, tmp5);
+-    CLIP_SH4_0_255_MAX_SATU(tmp0, tmp1, tmp2, tmp3);
+-    CLIP_SH2_0_255_MAX_SATU(tmp4, tmp5);
++    CLIP_SH4_0_255(tmp0, tmp1, tmp2, tmp3);
++    CLIP_SH2_0_255(tmp4, tmp5);
+     PCKEV_B3_UB(tmp1, tmp0, tmp3, tmp2, tmp5, tmp4, out0, out1, out2);
+-    ST8x4_UB(out0, out1, dst, dst_stride);
+-    dst += (4 * dst_stride);
+-    ST8x2_UB(out2, dst, dst_stride);
++    ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
++    ST_D2(out2, 0, 1, dst + 4 * dst_stride, dst_stride);
+ }
+ 
+ static void hevc_hv_uniwgt_4t_8multx4mult_msa(uint8_t *src,
+@@ -4958,9 +4973,9 @@
+                         dst3_r, tmp0, tmp1, tmp2, tmp3);
+             ADD2(tmp0, offset_vec, tmp1, offset_vec, tmp0, tmp1);
+             ADD2(tmp2, offset_vec, tmp3, offset_vec, tmp2, tmp3);
+-            CLIP_SH4_0_255_MAX_SATU(tmp0, tmp1, tmp2, tmp3);
++            CLIP_SH4_0_255(tmp0, tmp1, tmp2, tmp3);
+             PCKEV_B2_UB(tmp1, tmp0, tmp3, tmp2, out0, out1);
+-            ST8x4_UB(out0, out1, dst_tmp, dst_stride);
++            ST_D4(out0, out1, 0, 1, 0, 1, dst_tmp, dst_stride);
+             dst_tmp += (4 * dst_stride);
+ 
+             dst10_r = dst54_r;
+@@ -5105,9 +5120,9 @@
+                     dst3_r, tmp0, tmp1, tmp2, tmp3);
+         ADD2(tmp0, offset_vec, tmp1, offset_vec, tmp0, tmp1);
+         ADD2(tmp2, offset_vec, tmp3, offset_vec, tmp2, tmp3);
+-        CLIP_SH4_0_255_MAX_SATU(tmp0, tmp1, tmp2, tmp3);
++        CLIP_SH4_0_255(tmp0, tmp1, tmp2, tmp3);
+         PCKEV_B2_UB(tmp1, tmp0, tmp3, tmp2, out0, out1);
+-        ST8x4_UB(out0, out1, dst_tmp, dst_stride);
++        ST_D4(out0, out1, 0, 1, 0, 1, dst_tmp, dst_stride);
+         dst_tmp += (4 * dst_stride);
+ 
+         dst10_r = dst54_r;
+@@ -5172,9 +5187,9 @@
+                     tmp2, tmp3);
+         ADD2(tmp0, offset_vec, tmp1, offset_vec, tmp0, tmp1);
+         ADD2(tmp2, offset_vec, tmp3, offset_vec, tmp2, tmp3);
+-        CLIP_SH4_0_255_MAX_SATU(tmp0, tmp1, tmp2, tmp3);
++        CLIP_SH4_0_255(tmp0, tmp1, tmp2, tmp3);
+         PCKEV_B2_UB(tmp1, tmp0, tmp3, tmp2, out0, out1);
+-        ST4x8_UB(out0, out1, dst, dst_stride);
++        ST_W8(out0, out1, 0, 1, 2, 3, 0, 1, 2, 3, dst, dst_stride);
+         dst += (8 * dst_stride);
+ 
+         dst10_r = dst98_r;
+diff -uNra ffmpeg-4.1.6/libavcodec/mips/hevcpred_init_mips.c FFmpeg/libavcodec/mips/hevcpred_init_mips.c
+--- a/libavcodec/mips/hevcpred_init_mips.c	2020-07-03 23:10:59.000000000 +0800
++++ b/libavcodec/mips/hevcpred_init_mips.c	2020-07-19 18:19:52.760181959 +0800
+@@ -18,32 +18,28 @@
+  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+  */
+ 
++#include "libavutil/mips/cpu.h"
+ #include "config.h"
+ #include "libavutil/attributes.h"
+ #include "libavcodec/mips/hevcpred_mips.h"
+ 
+-#if HAVE_MSA
+-static av_cold void hevc_pred_init_msa(HEVCPredContext *c, const int bit_depth)
+-{
+-    if (8 == bit_depth) {
+-        c->intra_pred[2] = ff_intra_pred_8_16x16_msa;
+-        c->intra_pred[3] = ff_intra_pred_8_32x32_msa;
+-        c->pred_planar[0] = ff_hevc_intra_pred_planar_0_msa;
+-        c->pred_planar[1] = ff_hevc_intra_pred_planar_1_msa;
+-        c->pred_planar[2] = ff_hevc_intra_pred_planar_2_msa;
+-        c->pred_planar[3] = ff_hevc_intra_pred_planar_3_msa;
+-        c->pred_dc = ff_hevc_intra_pred_dc_msa;
+-        c->pred_angular[0] = ff_pred_intra_pred_angular_0_msa;
+-        c->pred_angular[1] = ff_pred_intra_pred_angular_1_msa;
+-        c->pred_angular[2] = ff_pred_intra_pred_angular_2_msa;
+-        c->pred_angular[3] = ff_pred_intra_pred_angular_3_msa;
+-    }
+-}
+-#endif  // #if HAVE_MSA
+-
+ void ff_hevc_pred_init_mips(HEVCPredContext *c, const int bit_depth)
+ {
+-#if HAVE_MSA
+-    hevc_pred_init_msa(c, bit_depth);
+-#endif  // #if HAVE_MSA
++    int cpu_flags = av_get_cpu_flags();
++
++    if (have_msa(cpu_flags)) {
++        if (bit_depth == 8) {
++            c->intra_pred[2] = ff_intra_pred_8_16x16_msa;
++            c->intra_pred[3] = ff_intra_pred_8_32x32_msa;
++            c->pred_planar[0] = ff_hevc_intra_pred_planar_0_msa;
++            c->pred_planar[1] = ff_hevc_intra_pred_planar_1_msa;
++            c->pred_planar[2] = ff_hevc_intra_pred_planar_2_msa;
++            c->pred_planar[3] = ff_hevc_intra_pred_planar_3_msa;
++            c->pred_dc = ff_hevc_intra_pred_dc_msa;
++            c->pred_angular[0] = ff_pred_intra_pred_angular_0_msa;
++            c->pred_angular[1] = ff_pred_intra_pred_angular_1_msa;
++            c->pred_angular[2] = ff_pred_intra_pred_angular_2_msa;
++            c->pred_angular[3] = ff_pred_intra_pred_angular_3_msa;
++        }
++    }
+ }
+diff -uNra ffmpeg-4.1.6/libavcodec/mips/hevcpred_msa.c FFmpeg/libavcodec/mips/hevcpred_msa.c
+--- a/libavcodec/mips/hevcpred_msa.c	2020-07-03 23:10:59.000000000 +0800
++++ b/libavcodec/mips/hevcpred_msa.c	2020-07-19 18:13:57.481843287 +0800
+@@ -83,7 +83,7 @@
+         vec2 -= vec0;
+         vec2 >>= 1;
+         vec2 += vec1;
+-        vec2 = CLIP_SH_0_255(vec2);
++        CLIP_SH_0_255(vec2);
+ 
+         for (col = 0; col < 4; col++) {
+             dst[stride * col] = (uint8_t) vec2[col];
+@@ -122,7 +122,7 @@
+         vec2 -= vec0;
+         vec2 >>= 1;
+         vec2 += vec1;
+-        vec2 = CLIP_SH_0_255(vec2);
++        CLIP_SH_0_255(vec2);
+ 
+         val0 = vec2[0];
+         val1 = vec2[1];
+@@ -214,7 +214,7 @@
+         src0_r -= src_top_val;
+         src0_r >>= 1;
+         src0_r += src_left_val;
+-        src0_r = CLIP_SH_0_255(src0_r);
++        CLIP_SH_0_255(src0_r);
+         src0 = __msa_pckev_b((v16i8) src0_r, (v16i8) src0_r);
+         val0 = __msa_copy_s_w((v4i32) src0, 0);
+         SW(val0, dst);
+@@ -254,7 +254,7 @@
+         src0_r -= src_top_val;
+         src0_r >>= 1;
+         src0_r += src_left_val;
+-        src0_r = CLIP_SH_0_255(src0_r);
++        CLIP_SH_0_255(src0_r);
+         src0 = __msa_pckev_b((v16i8) src0_r, (v16i8) src0_r);
+         val0 = __msa_copy_s_d((v2i64) src0, 0);
+         SD(val0, dst);
+@@ -589,7 +589,7 @@
+     PCKEV_D2_SH(res1, res0, res3, res2, res0, res1);
+     SRARI_H2_SH(res0, res1, 3);
+     src_vec0 = __msa_pckev_b((v16i8) res1, (v16i8) res0);
+-    ST4x4_UB(src_vec0, src_vec0, 0, 1, 2, 3, dst, stride);
++    ST_W4(src_vec0, 0, 1, 2, 3, dst, stride);
+ }
+ 
+ static void hevc_intra_pred_plane_8x8_msa(const uint8_t *src_top,
+@@ -656,7 +656,8 @@
+     PCKEV_B4_SB(res1, res0, res3, res2, res5, res4, res7, res6,
+                 src_vec0, src_vec1, src_vec2, src_vec3);
+ 
+-    ST8x8_UB(src_vec0, src_vec1, src_vec2, src_vec3, dst, stride);
++    ST_D8(src_vec0, src_vec1, src_vec2, src_vec3, 0, 1, 0, 1,
++          0, 1, 0, 1, dst, stride);
+ }
+ 
+ static void hevc_intra_pred_plane_16x16_msa(const uint8_t *src_top,
+@@ -997,7 +998,8 @@
+     ILVR_D2_SH(fact3, fact1, fact7, fact5, fact1, fact3);
+     ILVR_B4_SH(zero, top0, zero, top1, zero, top2, zero, top3,
+                diff0, diff2, diff4, diff6);
+-    SLDI_B4_0_SH(diff0, diff2, diff4, diff6, diff1, diff3, diff5, diff7, 2);
++    SLDI_B4_SH(zero, diff0, zero, diff2, zero, diff4, zero, diff6, 2,
++               diff1, diff3, diff5, diff7);
+     ILVR_D2_SH(diff2, diff0, diff6, diff4, diff0, diff2);
+     ILVR_D2_SH(diff3, diff1, diff7, diff5, diff1, diff3);
+     MUL2(diff1, fact0, diff3, fact2, diff1, diff3);
+@@ -1007,7 +1009,7 @@
+ 
+     SRARI_H2_SH(diff1, diff3, 5);
+     dst_val0 = __msa_pckev_b((v16i8) diff3, (v16i8) diff1);
+-    ST4x4_UB(dst_val0, dst_val0, 0, 1, 2, 3, dst, stride);
++    ST_W4(dst_val0, 0, 1, 2, 3, dst, stride);
+ }
+ 
+ static void hevc_intra_pred_angular_upper_8width_msa(const uint8_t *src_top,
+@@ -1092,8 +1094,8 @@
+         UNPCK_UB_SH(top2, diff4, diff5);
+         UNPCK_UB_SH(top3, diff6, diff7);
+ 
+-        SLDI_B2_SH(diff1, diff3, diff0, diff2, diff1, diff3, 2);
+-        SLDI_B2_SH(diff5, diff7, diff4, diff6, diff5, diff7, 2);
++        SLDI_B4_SH(diff1, diff0, diff3, diff2, diff5, diff4, diff7, diff6, 2,
++                   diff1, diff3, diff5, diff7);
+         MUL4(diff1, fact0, diff3, fact2, diff5, fact4, diff7, fact6,
+              diff1, diff3, diff5, diff7);
+ 
+@@ -1104,7 +1106,7 @@
+ 
+         SRARI_H4_SH(diff1, diff3, diff5, diff7, 5);
+         PCKEV_B2_UB(diff3, diff1, diff7, diff5, dst_val0, dst_val1);
+-        ST8x4_UB(dst_val0, dst_val1, dst, stride);
++        ST_D4(dst_val0, dst_val1, 0, 1, 0, 1, dst, stride);
+         dst += (4 * stride);
+     }
+ }
+@@ -1185,8 +1187,8 @@
+         fact6 = __msa_fill_h(fact_val3);
+         fact7 = __msa_fill_h(32 - fact_val3);
+ 
+-        SLDI_B2_UB(top1, top3, top0, top2, top1, top3, 1);
+-        SLDI_B2_UB(top5, top7, top4, top6, top5, top7, 1);
++        SLDI_B4_UB(top1, top0, top3, top2, top5, top4, top7, top6, 1,
++                   top1, top3, top5, top7);
+         UNPCK_UB_SH(top0, diff0, diff1);
+         UNPCK_UB_SH(top1, diff2, diff3);
+         UNPCK_UB_SH(top2, diff4, diff5);
+@@ -1296,8 +1298,8 @@
+         top2 = top1;
+         top6 = top5;
+ 
+-        SLDI_B2_UB(top1, top3, top0, top2, top1, top3, 1);
+-        SLDI_B2_UB(top5, top7, top4, top6, top5, top7, 1);
++        SLDI_B4_UB(top1, top0, top3, top2, top5, top4, top7, top6, 1,
++                   top1, top3, top5, top7);
+         UNPCK_UB_SH(top0, diff0, diff1);
+         UNPCK_UB_SH(top1, diff2, diff3);
+         UNPCK_UB_SH(top2, diff4, diff5);
+@@ -1406,7 +1408,8 @@
+     ILVR_D2_SH(fact3, fact1, fact7, fact5, fact1, fact3);
+     ILVR_B4_SH(zero, top0, zero, top1, zero, top2, zero, top3,
+                diff0, diff2, diff4, diff6);
+-    SLDI_B4_0_SH(diff0, diff2, diff4, diff6, diff1, diff3, diff5, diff7, 2);
++    SLDI_B4_SH(zero, diff0, zero, diff2, zero, diff4, zero, diff6, 2,
++               diff1, diff3, diff5, diff7);
+     ILVR_D2_SH(diff2, diff0, diff6, diff4, diff0, diff2);
+     ILVR_D2_SH(diff3, diff1, diff7, diff5, diff1, diff3);
+     MUL2(diff1, fact0, diff3, fact2, diff1, diff3);
+@@ -1425,9 +1428,8 @@
+     dst_val0 = __msa_pckev_b((v16i8) diff2, (v16i8) diff2);
+     dst_val1 = __msa_pckod_b((v16i8) diff2, (v16i8) diff2);
+ 
+-    ST4x2_UB(dst_val0, dst, stride);
+-    dst += (2 * stride);
+-    ST4x2_UB(dst_val1, dst, stride);
++    ST_W2(dst_val0, 0, 1, dst, stride);
++    ST_W2(dst_val1, 0, 1, dst + 2 * stride, stride);
+ }
+ 
+ static void hevc_intra_pred_angular_lower_8width_msa(const uint8_t *src_top,
+@@ -1511,8 +1513,8 @@
+         UNPCK_UB_SH(top1, diff2, diff3);
+         UNPCK_UB_SH(top2, diff4, diff5);
+         UNPCK_UB_SH(top3, diff6, diff7);
+-        SLDI_B2_SH(diff1, diff3, diff0, diff2, diff1, diff3, 2);
+-        SLDI_B2_SH(diff5, diff7, diff4, diff6, diff5, diff7, 2);
++        SLDI_B4_SH(diff1, diff0, diff3, diff2, diff5, diff4, diff7, diff6, 2,
++                   diff1, diff3, diff5, diff7);
+         MUL4(diff1, fact0, diff3, fact2, diff5, fact4, diff7, fact6,
+              diff1, diff3, diff5, diff7);
+ 
+@@ -1526,7 +1528,7 @@
+                     dst_val0, dst_val1, dst_val2, dst_val3);
+         ILVR_B2_SH(dst_val1, dst_val0, dst_val3, dst_val2, diff0, diff1);
+         ILVRL_H2_SH(diff1, diff0, diff3, diff4);
+-        ST4x8_UB(diff3, diff4, dst_org, stride);
++        ST_W8(diff3, diff4, 0, 1, 2, 3, 0, 1, 2, 3, dst_org, stride);
+         dst += 4;
+     }
+ }
+@@ -1606,8 +1608,8 @@
+         fact6 = __msa_fill_h(fact_val3);
+         fact7 = __msa_fill_h(32 - fact_val3);
+ 
+-        SLDI_B2_SB(top1, top3, top0, top2, top1, top3, 1);
+-        SLDI_B2_SB(top5, top7, top4, top6, top5, top7, 1);
++        SLDI_B4_SB(top1, top0, top3, top2, top5, top4, top7, top6, 1,
++                   top1, top3, top5, top7);
+ 
+         UNPCK_UB_SH(top0, diff0, diff1);
+         UNPCK_UB_SH(top1, diff2, diff3);
+@@ -1640,9 +1642,9 @@
+         ILVL_B2_SH(dst_val1, dst_val0, dst_val3, dst_val2, diff2, diff3);
+         ILVRL_H2_SH(diff1, diff0, diff4, diff5);
+         ILVRL_H2_SH(diff3, diff2, diff6, diff7);
+-        ST4x8_UB(diff4, diff5, dst_org, stride);
++        ST_W8(diff4, diff5, 0, 1, 2, 3, 0, 1, 2, 3, dst_org, stride);
+         dst_org += (8 * stride);
+-        ST4x8_UB(diff6, diff7, dst_org, stride);
++        ST_W8(diff6, diff7, 0, 1, 2, 3, 0, 1, 2, 3, dst_org, stride);
+         dst += 4;
+     }
+ }
+@@ -1713,8 +1715,8 @@
+         top2 = top1;
+         top6 = top5;
+ 
+-        SLDI_B2_SB(top1, top3, top0, top2, top1, top3, 1);
+-        SLDI_B2_SB(top5, top7, top4, top6, top5, top7, 1);
++        SLDI_B4_SB(top1, top0, top3, top2, top5, top4, top7, top6, 1,
++                   top1, top3, top5, top7);
+ 
+         UNPCK_UB_SH(top0, diff0, diff1);
+         UNPCK_UB_SH(top1, diff2, diff3);
+@@ -1746,23 +1748,14 @@
+         ILVRL_B2_SH(dst_val2, dst_val0, diff0, diff1);
+         ILVRL_B2_SH(dst_val3, dst_val1, diff2, diff3);
+ 
+-        ST2x4_UB(diff0, 0, dst_org, stride);
+-        dst_org += (4 * stride);
+-        ST2x4_UB(diff0, 4, dst_org, stride);
+-        dst_org += (4 * stride);
+-        ST2x4_UB(diff1, 0, dst_org, stride);
+-        dst_org += (4 * stride);
+-        ST2x4_UB(diff1, 4, dst_org, stride);
+-        dst_org += (4 * stride);
+-
+-        ST2x4_UB(diff2, 0, dst_org, stride);
+-        dst_org += (4 * stride);
+-        ST2x4_UB(diff2, 4, dst_org, stride);
+-        dst_org += (4 * stride);
+-        ST2x4_UB(diff3, 0, dst_org, stride);
+-        dst_org += (4 * stride);
+-        ST2x4_UB(diff3, 4, dst_org, stride);
+-        dst_org += (4 * stride);
++        ST_H8(diff0, 0, 1, 2, 3, 4, 5, 6, 7, dst_org, stride)
++        dst_org += (8 * stride);
++        ST_H8(diff1, 0, 1, 2, 3, 4, 5, 6, 7, dst_org, stride)
++        dst_org += (8 * stride);
++        ST_H8(diff2, 0, 1, 2, 3, 4, 5, 6, 7, dst_org, stride)
++        dst_org += (8 * stride);
++        ST_H8(diff3, 0, 1, 2, 3, 4, 5, 6, 7, dst_org, stride)
++        dst_org += (8 * stride);
+ 
+         dst += 2;
+     }
+diff -uNra ffmpeg-4.1.6/libavcodec/mips/hpeldsp_init_mips.c FFmpeg/libavcodec/mips/hpeldsp_init_mips.c
+--- a/libavcodec/mips/hpeldsp_init_mips.c	2020-07-03 01:22:31.000000000 +0800
++++ b/libavcodec/mips/hpeldsp_init_mips.c	2020-07-19 18:19:52.760181959 +0800
+@@ -19,104 +19,94 @@
+  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+  */
+ 
++#include "libavutil/mips/cpu.h"
+ #include "../hpeldsp.h"
+ #include "libavcodec/mips/hpeldsp_mips.h"
+ 
+-#if HAVE_MSA
+-static void ff_hpeldsp_init_msa(HpelDSPContext *c, int flags)
+-{
+-    c->put_pixels_tab[0][0] = ff_put_pixels16_msa;
+-    c->put_pixels_tab[0][1] = ff_put_pixels16_x2_msa;
+-    c->put_pixels_tab[0][2] = ff_put_pixels16_y2_msa;
+-    c->put_pixels_tab[0][3] = ff_put_pixels16_xy2_msa;
+-
+-    c->put_pixels_tab[1][0] = ff_put_pixels8_msa;
+-    c->put_pixels_tab[1][1] = ff_put_pixels8_x2_msa;
+-    c->put_pixels_tab[1][2] = ff_put_pixels8_y2_msa;
+-    c->put_pixels_tab[1][3] = ff_put_pixels8_xy2_msa;
+-
+-    c->put_pixels_tab[2][1] = ff_put_pixels4_x2_msa;
+-    c->put_pixels_tab[2][2] = ff_put_pixels4_y2_msa;
+-    c->put_pixels_tab[2][3] = ff_put_pixels4_xy2_msa;
+-
+-    c->put_no_rnd_pixels_tab[0][0] = ff_put_pixels16_msa;
+-    c->put_no_rnd_pixels_tab[0][1] = ff_put_no_rnd_pixels16_x2_msa;
+-    c->put_no_rnd_pixels_tab[0][2] = ff_put_no_rnd_pixels16_y2_msa;
+-    c->put_no_rnd_pixels_tab[0][3] = ff_put_no_rnd_pixels16_xy2_msa;
+-
+-    c->put_no_rnd_pixels_tab[1][0] = ff_put_pixels8_msa;
+-    c->put_no_rnd_pixels_tab[1][1] = ff_put_no_rnd_pixels8_x2_msa;
+-    c->put_no_rnd_pixels_tab[1][2] = ff_put_no_rnd_pixels8_y2_msa;
+-    c->put_no_rnd_pixels_tab[1][3] = ff_put_no_rnd_pixels8_xy2_msa;
+-
+-    c->avg_pixels_tab[0][0] = ff_avg_pixels16_msa;
+-    c->avg_pixels_tab[0][1] = ff_avg_pixels16_x2_msa;
+-    c->avg_pixels_tab[0][2] = ff_avg_pixels16_y2_msa;
+-    c->avg_pixels_tab[0][3] = ff_avg_pixels16_xy2_msa;
+-
+-    c->avg_pixels_tab[1][0] = ff_avg_pixels8_msa;
+-    c->avg_pixels_tab[1][1] = ff_avg_pixels8_x2_msa;
+-    c->avg_pixels_tab[1][2] = ff_avg_pixels8_y2_msa;
+-    c->avg_pixels_tab[1][3] = ff_avg_pixels8_xy2_msa;
+-
+-    c->avg_pixels_tab[2][0] = ff_avg_pixels4_msa;
+-    c->avg_pixels_tab[2][1] = ff_avg_pixels4_x2_msa;
+-    c->avg_pixels_tab[2][2] = ff_avg_pixels4_y2_msa;
+-    c->avg_pixels_tab[2][3] = ff_avg_pixels4_xy2_msa;
+-}
+-#endif  // #if HAVE_MSA
+-
+-#if HAVE_MMI
+-static void ff_hpeldsp_init_mmi(HpelDSPContext *c, int flags)
+-{
+-    c->put_pixels_tab[0][0] = ff_put_pixels16_8_mmi;
+-    c->put_pixels_tab[0][1] = ff_put_pixels16_x2_8_mmi;
+-    c->put_pixels_tab[0][2] = ff_put_pixels16_y2_8_mmi;
+-    c->put_pixels_tab[0][3] = ff_put_pixels16_xy2_8_mmi;
+-
+-    c->put_pixels_tab[1][0] = ff_put_pixels8_8_mmi;
+-    c->put_pixels_tab[1][1] = ff_put_pixels8_x2_8_mmi;
+-    c->put_pixels_tab[1][2] = ff_put_pixels8_y2_8_mmi;
+-    c->put_pixels_tab[1][3] = ff_put_pixels8_xy2_8_mmi;
+-
+-    c->put_pixels_tab[2][0] = ff_put_pixels4_8_mmi;
+-    c->put_pixels_tab[2][1] = ff_put_pixels4_x2_8_mmi;
+-    c->put_pixels_tab[2][2] = ff_put_pixels4_y2_8_mmi;
+-    c->put_pixels_tab[2][3] = ff_put_pixels4_xy2_8_mmi;
+-
+-    c->put_no_rnd_pixels_tab[0][0] = ff_put_pixels16_8_mmi;
+-    c->put_no_rnd_pixels_tab[0][1] = ff_put_no_rnd_pixels16_x2_8_mmi;
+-    c->put_no_rnd_pixels_tab[0][2] = ff_put_no_rnd_pixels16_y2_8_mmi;
+-    c->put_no_rnd_pixels_tab[0][3] = ff_put_no_rnd_pixels16_xy2_8_mmi;
+-
+-    c->put_no_rnd_pixels_tab[1][0] = ff_put_pixels8_8_mmi;
+-    c->put_no_rnd_pixels_tab[1][1] = ff_put_no_rnd_pixels8_x2_8_mmi;
+-    c->put_no_rnd_pixels_tab[1][2] = ff_put_no_rnd_pixels8_y2_8_mmi;
+-    c->put_no_rnd_pixels_tab[1][3] = ff_put_no_rnd_pixels8_xy2_8_mmi;
+-
+-    c->avg_pixels_tab[0][0] = ff_avg_pixels16_8_mmi;
+-    c->avg_pixels_tab[0][1] = ff_avg_pixels16_x2_8_mmi;
+-    c->avg_pixels_tab[0][2] = ff_avg_pixels16_y2_8_mmi;
+-    c->avg_pixels_tab[0][3] = ff_avg_pixels16_xy2_8_mmi;
+-
+-    c->avg_pixels_tab[1][0] = ff_avg_pixels8_8_mmi;
+-    c->avg_pixels_tab[1][1] = ff_avg_pixels8_x2_8_mmi;
+-    c->avg_pixels_tab[1][2] = ff_avg_pixels8_y2_8_mmi;
+-    c->avg_pixels_tab[1][3] = ff_avg_pixels8_xy2_8_mmi;
+-
+-    c->avg_pixels_tab[2][0] = ff_avg_pixels4_8_mmi;
+-    c->avg_pixels_tab[2][1] = ff_avg_pixels4_x2_8_mmi;
+-    c->avg_pixels_tab[2][2] = ff_avg_pixels4_y2_8_mmi;
+-    c->avg_pixels_tab[2][3] = ff_avg_pixels4_xy2_8_mmi;
+-}
+-#endif  // #if HAVE_MMI
+-
+ void ff_hpeldsp_init_mips(HpelDSPContext *c, int flags)
+ {
+-#if HAVE_MSA
+-    ff_hpeldsp_init_msa(c, flags);
+-#endif  // #if HAVE_MSA
+-#if HAVE_MMI
+-    ff_hpeldsp_init_mmi(c, flags);
+-#endif  // #if HAVE_MMI
++    int cpu_flags = av_get_cpu_flags();
++
++    if (have_mmi(cpu_flags)) {
++        c->put_pixels_tab[0][0] = ff_put_pixels16_8_mmi;
++        c->put_pixels_tab[0][1] = ff_put_pixels16_x2_8_mmi;
++        c->put_pixels_tab[0][2] = ff_put_pixels16_y2_8_mmi;
++        c->put_pixels_tab[0][3] = ff_put_pixels16_xy2_8_mmi;
++
++        c->put_pixels_tab[1][0] = ff_put_pixels8_8_mmi;
++        c->put_pixels_tab[1][1] = ff_put_pixels8_x2_8_mmi;
++        c->put_pixels_tab[1][2] = ff_put_pixels8_y2_8_mmi;
++        c->put_pixels_tab[1][3] = ff_put_pixels8_xy2_8_mmi;
++
++        c->put_pixels_tab[2][0] = ff_put_pixels4_8_mmi;
++        c->put_pixels_tab[2][1] = ff_put_pixels4_x2_8_mmi;
++        c->put_pixels_tab[2][2] = ff_put_pixels4_y2_8_mmi;
++        c->put_pixels_tab[2][3] = ff_put_pixels4_xy2_8_mmi;
++
++        c->put_no_rnd_pixels_tab[0][0] = ff_put_pixels16_8_mmi;
++        c->put_no_rnd_pixels_tab[0][1] = ff_put_no_rnd_pixels16_x2_8_mmi;
++        c->put_no_rnd_pixels_tab[0][2] = ff_put_no_rnd_pixels16_y2_8_mmi;
++        c->put_no_rnd_pixels_tab[0][3] = ff_put_no_rnd_pixels16_xy2_8_mmi;
++
++        c->put_no_rnd_pixels_tab[1][0] = ff_put_pixels8_8_mmi;
++        c->put_no_rnd_pixels_tab[1][1] = ff_put_no_rnd_pixels8_x2_8_mmi;
++        c->put_no_rnd_pixels_tab[1][2] = ff_put_no_rnd_pixels8_y2_8_mmi;
++        c->put_no_rnd_pixels_tab[1][3] = ff_put_no_rnd_pixels8_xy2_8_mmi;
++
++        c->avg_pixels_tab[0][0] = ff_avg_pixels16_8_mmi;
++        c->avg_pixels_tab[0][1] = ff_avg_pixels16_x2_8_mmi;
++        c->avg_pixels_tab[0][2] = ff_avg_pixels16_y2_8_mmi;
++        c->avg_pixels_tab[0][3] = ff_avg_pixels16_xy2_8_mmi;
++
++        c->avg_pixels_tab[1][0] = ff_avg_pixels8_8_mmi;
++        c->avg_pixels_tab[1][1] = ff_avg_pixels8_x2_8_mmi;
++        c->avg_pixels_tab[1][2] = ff_avg_pixels8_y2_8_mmi;
++        c->avg_pixels_tab[1][3] = ff_avg_pixels8_xy2_8_mmi;
++
++        c->avg_pixels_tab[2][0] = ff_avg_pixels4_8_mmi;
++        c->avg_pixels_tab[2][1] = ff_avg_pixels4_x2_8_mmi;
++        c->avg_pixels_tab[2][2] = ff_avg_pixels4_y2_8_mmi;
++        c->avg_pixels_tab[2][3] = ff_avg_pixels4_xy2_8_mmi;
++    }
++
++    if (have_msa(cpu_flags)) {
++        c->put_pixels_tab[0][0] = ff_put_pixels16_msa;
++        c->put_pixels_tab[0][1] = ff_put_pixels16_x2_msa;
++        c->put_pixels_tab[0][2] = ff_put_pixels16_y2_msa;
++        c->put_pixels_tab[0][3] = ff_put_pixels16_xy2_msa;
++
++        c->put_pixels_tab[1][0] = ff_put_pixels8_msa;
++        c->put_pixels_tab[1][1] = ff_put_pixels8_x2_msa;
++        c->put_pixels_tab[1][2] = ff_put_pixels8_y2_msa;
++        c->put_pixels_tab[1][3] = ff_put_pixels8_xy2_msa;
++
++        c->put_pixels_tab[2][1] = ff_put_pixels4_x2_msa;
++        c->put_pixels_tab[2][2] = ff_put_pixels4_y2_msa;
++        c->put_pixels_tab[2][3] = ff_put_pixels4_xy2_msa;
++
++        c->put_no_rnd_pixels_tab[0][0] = ff_put_pixels16_msa;
++        c->put_no_rnd_pixels_tab[0][1] = ff_put_no_rnd_pixels16_x2_msa;
++        c->put_no_rnd_pixels_tab[0][2] = ff_put_no_rnd_pixels16_y2_msa;
++        c->put_no_rnd_pixels_tab[0][3] = ff_put_no_rnd_pixels16_xy2_msa;
++
++        c->put_no_rnd_pixels_tab[1][0] = ff_put_pixels8_msa;
++        c->put_no_rnd_pixels_tab[1][1] = ff_put_no_rnd_pixels8_x2_msa;
++        c->put_no_rnd_pixels_tab[1][2] = ff_put_no_rnd_pixels8_y2_msa;
++        c->put_no_rnd_pixels_tab[1][3] = ff_put_no_rnd_pixels8_xy2_msa;
++
++        c->avg_pixels_tab[0][0] = ff_avg_pixels16_msa;
++        c->avg_pixels_tab[0][1] = ff_avg_pixels16_x2_msa;
++        c->avg_pixels_tab[0][2] = ff_avg_pixels16_y2_msa;
++        c->avg_pixels_tab[0][3] = ff_avg_pixels16_xy2_msa;
++
++        c->avg_pixels_tab[1][0] = ff_avg_pixels8_msa;
++        c->avg_pixels_tab[1][1] = ff_avg_pixels8_x2_msa;
++        c->avg_pixels_tab[1][2] = ff_avg_pixels8_y2_msa;
++        c->avg_pixels_tab[1][3] = ff_avg_pixels8_xy2_msa;
++
++        c->avg_pixels_tab[2][0] = ff_avg_pixels4_msa;
++        c->avg_pixels_tab[2][1] = ff_avg_pixels4_x2_msa;
++        c->avg_pixels_tab[2][2] = ff_avg_pixels4_y2_msa;
++        c->avg_pixels_tab[2][3] = ff_avg_pixels4_xy2_msa;
++    }
+ }
+diff -uNra ffmpeg-4.1.6/libavcodec/mips/hpeldsp_msa.c FFmpeg/libavcodec/mips/hpeldsp_msa.c
+--- a/libavcodec/mips/hpeldsp_msa.c	2020-07-03 01:22:31.000000000 +0800
++++ b/libavcodec/mips/hpeldsp_msa.c	2020-07-19 18:13:57.481843287 +0800
+@@ -49,7 +49,7 @@
+     PCKEV_B2_UB(in2, in1, in4, in3, tmp0_m, tmp1_m);                    \
+     PCKEV_D2_UB(dst1, dst0, dst3, dst2, tmp2_m, tmp3_m);                \
+     AVER_UB2_UB(tmp0_m, tmp2_m, tmp1_m, tmp3_m, tmp0_m, tmp1_m);        \
+-    ST8x4_UB(tmp0_m, tmp1_m, pdst_m, stride);                           \
++    ST_D4(tmp0_m, tmp1_m, 0, 1, 0, 1, pdst_m, stride);                  \
+ }
+ 
+ static void common_hz_bil_4w_msa(const uint8_t *src, int32_t src_stride,
+@@ -59,12 +59,13 @@
+     uint8_t loop_cnt;
+     uint32_t out0, out1;
+     v16u8 src0, src1, src0_sld1, src1_sld1, res0, res1;
++    v16i8 zeros = { 0 };
+ 
+     for (loop_cnt = (height >> 1); loop_cnt--;) {
+         LD_UB2(src, src_stride, src0, src1);
+         src += (2 * src_stride);
+ 
+-        SLDI_B2_0_UB(src0, src1, src0_sld1, src1_sld1, 1);
++        SLDI_B2_UB(zeros, src0, zeros, src1, 1, src0_sld1, src1_sld1);
+         AVER_UB2_UB(src0_sld1, src0, src1_sld1, src1, res0, res1);
+ 
+         out0 = __msa_copy_u_w((v4i32) res0, 0);
+@@ -82,13 +83,14 @@
+ {
+     uint8_t loop_cnt;
+     v16i8 src0, src1, src2, src3, src0_sld1, src1_sld1, src2_sld1, src3_sld1;
++    v16i8 zeros = { 0 };
+ 
+     for (loop_cnt = (height >> 2); loop_cnt--;) {
+         LD_SB4(src, src_stride, src0, src1, src2, src3);
+         src += (4 * src_stride);
+ 
+-        SLDI_B4_0_SB(src0, src1, src2, src3,
+-                     src0_sld1, src1_sld1, src2_sld1, src3_sld1, 1);
++        SLDI_B4_SB(zeros, src0, zeros, src1, zeros, src2, zeros, src3, 1,
++                   src0_sld1, src1_sld1, src2_sld1, src3_sld1);
+         AVER_ST8x4_UB(src0, src0_sld1, src1, src1_sld1,
+                       src2, src2_sld1, src3, src3_sld1, dst, dst_stride);
+         dst += (4 * dst_stride);
+@@ -125,14 +127,15 @@
+     v16i8 src0, src1, src2, src3, src4, src5, src6, src7;
+     v16i8 src0_sld1, src1_sld1, src2_sld1, src3_sld1;
+     v16i8 src4_sld1, src5_sld1, src6_sld1, src7_sld1;
++    v16i8 zeros = { 0 };
+ 
+     LD_SB8(src, src_stride, src0, src1, src2, src3, src4, src5, src6, src7);
+     src += (8 * src_stride);
+ 
+-    SLDI_B4_0_SB(src0, src1, src2, src3,
+-                 src0_sld1, src1_sld1, src2_sld1, src3_sld1, 1);
+-    SLDI_B4_0_SB(src4, src5, src6, src7,
+-                 src4_sld1, src5_sld1, src6_sld1, src7_sld1, 1);
++    SLDI_B4_SB(zeros, src0, zeros, src1, zeros, src2, zeros, src3, 1,
++               src0_sld1, src1_sld1, src2_sld1, src3_sld1);
++    SLDI_B4_SB(zeros, src4, zeros, src5, zeros, src6, zeros, src7, 1,
++               src4_sld1, src5_sld1, src6_sld1, src7_sld1);
+ 
+     AVE_ST8x4_UB(src0, src0_sld1, src1, src1_sld1,
+                  src2, src2_sld1, src3, src3_sld1, dst, dst_stride);
+@@ -145,10 +148,11 @@
+                                          uint8_t *dst, int32_t dst_stride)
+ {
+     v16i8 src0, src1, src2, src3, src0_sld1, src1_sld1, src2_sld1, src3_sld1;
++    v16i8 zeros = { 0 };
+ 
+     LD_SB4(src, src_stride, src0, src1, src2, src3);
+-    SLDI_B4_0_SB(src0, src1, src2, src3,
+-                 src0_sld1, src1_sld1, src2_sld1, src3_sld1, 1);
++    SLDI_B4_SB(zeros, src0, zeros, src1, zeros, src2, zeros, src3, 1,
++               src0_sld1, src1_sld1, src2_sld1, src3_sld1);
+     AVE_ST8x4_UB(src0, src0_sld1, src1, src1_sld1,
+                  src2, src2_sld1, src3, src3_sld1, dst, dst_stride);
+ }
+@@ -216,12 +220,13 @@
+     v16u8 src0, src1, src0_sld1, src1_sld1, res0, res1;
+     v16u8 tmp0 = { 0 };
+     v16u8 tmp1 = { 0 };
++    v16i8 zeros = { 0 };
+ 
+     for (loop_cnt = (height >> 1); loop_cnt--;) {
+         LD_UB2(src, src_stride, src0, src1);
+         src += (2 * src_stride);
+ 
+-        SLDI_B2_0_UB(src0, src1, src0_sld1, src1_sld1, 1);
++        SLDI_B2_UB(zeros, src0, zeros, src1, 1, src0_sld1, src1_sld1);
+ 
+         dst0 = LW(dst);
+         dst1 = LW(dst + dst_stride);
+@@ -247,13 +252,14 @@
+ {
+     uint8_t loop_cnt;
+     v16i8 src0, src1, src2, src3, src0_sld1, src1_sld1, src2_sld1, src3_sld1;
++    v16i8 zeros = { 0 };
+ 
+     for (loop_cnt = (height >> 2); loop_cnt--;) {
+         LD_SB4(src, src_stride, src0, src1, src2, src3);
+         src += (4 * src_stride);
+ 
+-        SLDI_B4_0_SB(src0, src1, src2, src3,
+-                     src0_sld1, src1_sld1, src2_sld1, src3_sld1, 1);
++        SLDI_B4_SB(zeros, src0, zeros, src1, zeros, src2, zeros, src3, 1,
++                   src0_sld1, src1_sld1, src2_sld1, src3_sld1);
+ 
+         AVER_DST_ST8x4_UB(src0, src0_sld1, src1, src1_sld1, src2, src2_sld1,
+                           src3, src3_sld1, dst, dst_stride);
+@@ -529,6 +535,7 @@
+     v16i8 src0, src1, src2, src0_sld1, src1_sld1, src2_sld1;
+     v16u8 src0_r, src1_r, src2_r, res;
+     v8u16 add0, add1, add2, sum0, sum1;
++    v16i8 zeros = { 0 };
+ 
+     src0 = LD_SB(src);
+     src += src_stride;
+@@ -537,7 +544,8 @@
+         LD_SB2(src, src_stride, src1, src2);
+         src += (2 * src_stride);
+ 
+-        SLDI_B3_0_SB(src0, src1, src2, src0_sld1, src1_sld1, src2_sld1, 1);
++        SLDI_B3_SB(zeros, src0, zeros, src1, zeros, src2, 1, src0_sld1,
++                   src1_sld1, src2_sld1);
+         ILVR_B3_UB(src0_sld1, src0, src1_sld1, src1, src2_sld1, src2,
+                    src0_r, src1_r, src2_r);
+         HADD_UB3_UH(src0_r, src1_r, src2_r, add0, add1, add2);
+@@ -565,6 +573,7 @@
+     v16u8 src0_r, src1_r, src2_r, src3_r, src4_r;
+     v8u16 add0, add1, add2, add3, add4;
+     v8u16 sum0, sum1, sum2, sum3;
++    v16i8 zeros = { 0 };
+ 
+     src0 = LD_SB(src);
+     src += src_stride;
+@@ -573,8 +582,9 @@
+         LD_SB4(src, src_stride, src1, src2, src3, src4);
+         src += (4 * src_stride);
+ 
+-        SLDI_B3_0_SB(src0, src1, src2, src0_sld1, src1_sld1, src2_sld1, 1);
+-        SLDI_B2_0_SB(src3, src4, src3_sld1, src4_sld1, 1);
++        SLDI_B3_SB(zeros, src0, zeros, src1, zeros, src2, 1, src0_sld1,
++                   src1_sld1, src2_sld1);
++        SLDI_B2_SB(zeros, src3, zeros, src4, 1, src3_sld1, src4_sld1);
+         ILVR_B3_UB(src0_sld1, src0, src1_sld1, src1, src2_sld1, src2, src0_r,
+                    src1_r, src2_r);
+         ILVR_B2_UB(src3_sld1, src3, src4_sld1, src4, src3_r, src4_r);
+@@ -584,7 +594,7 @@
+              sum0, sum1, sum2, sum3);
+         SRARI_H4_UH(sum0, sum1, sum2, sum3, 2);
+         PCKEV_B2_SB(sum1, sum0, sum3, sum2, src0, src1);
+-        ST8x4_UB(src0, src1, dst, dst_stride);
++        ST_D4(src0, src1, 0, 1, 0, 1, dst, dst_stride);
+         dst += (4 * dst_stride);
+         src0 = src4;
+     }
+@@ -659,15 +669,17 @@
+     v8u16 add0, add1, add2, add3, add4, add5, add6, add7, add8;
+     v8u16 sum0, sum1, sum2, sum3, sum4, sum5, sum6, sum7;
+     v16i8 out0, out1;
++    v16i8 zeros = { 0 };
+ 
+     LD_UB8(src, src_stride, src0, src1, src2, src3, src4, src5, src6, src7);
+     src += (8 * src_stride);
+     src8 = LD_UB(src);
+ 
+-    SLDI_B4_0_UB(src0, src1, src2, src3, src0_sld1, src1_sld1, src2_sld1,
+-                 src3_sld1, 1);
+-    SLDI_B3_0_UB(src4, src5, src6, src4_sld1, src5_sld1, src6_sld1, 1);
+-    SLDI_B2_0_UB(src7, src8, src7_sld1, src8_sld1, 1);
++    SLDI_B4_UB(zeros, src0, zeros, src1, zeros, src2, zeros, src3, 1,
++               src0_sld1, src1_sld1, src2_sld1, src3_sld1);
++    SLDI_B3_UB(zeros, src4, zeros, src5, zeros, src6, 1, src4_sld1,
++               src5_sld1, src6_sld1);
++    SLDI_B2_UB(zeros, src7, zeros, src8, 1, src7_sld1, src8_sld1);
+     ILVR_B4_UH(src0_sld1, src0, src1_sld1, src1, src2_sld1, src2, src3_sld1,
+                src3, src0_r, src1_r, src2_r, src3_r);
+     ILVR_B3_UH(src4_sld1, src4, src5_sld1, src5, src6_sld1, src6, src4_r,
+@@ -689,9 +701,9 @@
+     SRA_4V(sum0, sum1, sum2, sum3, 2);
+     SRA_4V(sum4, sum5, sum6, sum7, 2);
+     PCKEV_B2_SB(sum1, sum0, sum3, sum2, out0, out1);
+-    ST8x4_UB(out0, out1, dst, dst_stride);
++    ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
+     PCKEV_B2_SB(sum5, sum4, sum7, sum6, out0, out1);
+-    ST8x4_UB(out0, out1, dst + 4 * dst_stride, dst_stride);
++    ST_D4(out0, out1, 0, 1, 0, 1, dst + 4 * dst_stride, dst_stride);
+ }
+ 
+ static void common_hv_bil_no_rnd_4x8_msa(const uint8_t *src, int32_t src_stride,
+@@ -703,13 +715,15 @@
+     v8u16 add0, add1, add2, add3, add4;
+     v8u16 sum0, sum1, sum2, sum3;
+     v16i8 out0, out1;
++    v16i8 zeros = { 0 };
+ 
+     LD_SB4(src, src_stride, src0, src1, src2, src3);
+     src += (4 * src_stride);
+     src4 = LD_SB(src);
+ 
+-    SLDI_B3_0_SB(src0, src1, src2, src0_sld1, src1_sld1, src2_sld1, 1);
+-    SLDI_B2_0_SB(src3, src4, src3_sld1, src4_sld1, 1);
++    SLDI_B3_SB(zeros, src0, zeros, src1, zeros, src2, 1, src0_sld1,
++               src1_sld1, src2_sld1);
++    SLDI_B2_SB(zeros, src3, zeros, src4, 1, src3_sld1, src4_sld1);
+     ILVR_B3_UH(src0_sld1, src0, src1_sld1, src1, src2_sld1, src2, src0_r,
+                src1_r, src2_r);
+     ILVR_B2_UH(src3_sld1, src3, src4_sld1, src4, src3_r, src4_r);
+@@ -723,7 +737,7 @@
+ 
+     SRA_4V(sum0, sum1, sum2, sum3, 2);
+     PCKEV_B2_SB(sum1, sum0, sum3, sum2, out0, out1);
+-    ST8x4_UB(out0, out1, dst, dst_stride);
++    ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
+ }
+ 
+ static void common_hv_bil_no_rnd_16x16_msa(const uint8_t *src,
+@@ -918,6 +932,7 @@
+     v16u8 src0_r, src1_r, src2_r;
+     v8u16 add0, add1, add2, sum0, sum1;
+     v16u8 dst0, dst1, res0, res1;
++    v16i8 zeros = { 0 };
+ 
+     src0 = LD_SB(src);
+     src += src_stride;
+@@ -927,7 +942,8 @@
+         src += (2 * src_stride);
+ 
+         LD_UB2(dst, dst_stride, dst0, dst1);
+-        SLDI_B3_0_SB(src0, src1, src2, src0_sld1, src1_sld1, src2_sld1, 1);
++        SLDI_B3_SB(zeros, src0, zeros, src1, zeros, src2, 1, src0_sld1,
++                   src1_sld1, src2_sld1);
+         ILVR_B3_UB(src0_sld1, src0, src1_sld1, src1, src2_sld1, src2, src0_r,
+                    src1_r, src2_r);
+         HADD_UB3_UH(src0_r, src1_r, src2_r, add0, add1, add2);
+@@ -959,6 +975,7 @@
+     v16u8 src0_r, src1_r, src2_r, src3_r, src4_r;
+     v8u16 add0, add1, add2, add3, add4;
+     v8u16 sum0, sum1, sum2, sum3;
++    v16i8 zeros = { 0 };
+ 
+     src0 = LD_SB(src);
+     src += src_stride;
+@@ -968,8 +985,9 @@
+         src += (4 * src_stride);
+ 
+         LD_UB4(dst, dst_stride, dst0, dst1, dst2, dst3);
+-        SLDI_B3_0_SB(src0, src1, src2, src0_sld1, src1_sld1, src2_sld1, 1);
+-        SLDI_B2_0_SB(src3, src4, src3_sld1, src4_sld1, 1);
++        SLDI_B3_SB(zeros, src0, zeros, src1, zeros, src2, 1, src0_sld1,
++                   src1_sld1, src2_sld1);
++        SLDI_B2_SB(zeros, src3, zeros, src4, 1, src3_sld1, src4_sld1);
+         ILVR_B3_UB(src0_sld1, src0, src1_sld1, src1, src2_sld1, src2, src0_r,
+                    src1_r, src2_r);
+         ILVR_B2_UB(src3_sld1, src3, src4_sld1, src4, src3_r, src4_r);
+diff -uNra ffmpeg-4.1.6/libavcodec/mips/idctdsp_init_mips.c FFmpeg/libavcodec/mips/idctdsp_init_mips.c
+--- a/libavcodec/mips/idctdsp_init_mips.c	2020-07-05 06:36:01.000000000 +0800
++++ b/libavcodec/mips/idctdsp_init_mips.c	2020-07-19 18:19:52.760181959 +0800
+@@ -19,56 +19,44 @@
+  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+  */
+ 
++#include "libavutil/mips/cpu.h"
+ #include "idctdsp_mips.h"
+ #include "xvididct_mips.h"
+ 
+-#if HAVE_MSA
+-static av_cold void idctdsp_init_msa(IDCTDSPContext *c, AVCodecContext *avctx,
+-                                     unsigned high_bit_depth)
++av_cold void ff_idctdsp_init_mips(IDCTDSPContext *c, AVCodecContext *avctx,
++                          unsigned high_bit_depth)
+ {
+-    if ((avctx->lowres != 1) && (avctx->lowres != 2) && (avctx->lowres != 3) &&
+-        (avctx->bits_per_raw_sample != 10) &&
+-        (avctx->bits_per_raw_sample != 12) &&
+-        (avctx->idct_algo == FF_IDCT_AUTO)) {
+-                c->idct_put = ff_simple_idct_put_msa;
+-                c->idct_add = ff_simple_idct_add_msa;
+-                c->idct = ff_simple_idct_msa;
+-                c->perm_type = FF_IDCT_PERM_NONE;
+-    }
++    int cpu_flags = av_get_cpu_flags();
+ 
+-    c->put_pixels_clamped = ff_put_pixels_clamped_msa;
+-    c->put_signed_pixels_clamped = ff_put_signed_pixels_clamped_msa;
+-    c->add_pixels_clamped = ff_add_pixels_clamped_msa;
+-}
+-#endif  // #if HAVE_MSA
+-
+-#if HAVE_MMI
+-static av_cold void idctdsp_init_mmi(IDCTDSPContext *c, AVCodecContext *avctx,
+-        unsigned high_bit_depth)
+-{
+-    if ((avctx->lowres != 1) && (avctx->lowres != 2) && (avctx->lowres != 3) &&
+-        (avctx->bits_per_raw_sample != 10) &&
+-        (avctx->bits_per_raw_sample != 12) &&
+-        ((avctx->idct_algo == FF_IDCT_AUTO) || (avctx->idct_algo == FF_IDCT_SIMPLE))) {
+-                c->idct_put = ff_simple_idct_put_8_mmi;
+-                c->idct_add = ff_simple_idct_add_8_mmi;
+-                c->idct = ff_simple_idct_8_mmi;
+-                c->perm_type = FF_IDCT_PERM_NONE;
++    if (have_mmi(cpu_flags)) {
++        if ((avctx->lowres != 1) && (avctx->lowres != 2) && (avctx->lowres != 3) &&
++            (avctx->bits_per_raw_sample != 10) &&
++            (avctx->bits_per_raw_sample != 12) &&
++            ((avctx->idct_algo == FF_IDCT_AUTO) || (avctx->idct_algo == FF_IDCT_SIMPLE))) {
++                    c->idct_put = ff_simple_idct_put_8_mmi;
++                    c->idct_add = ff_simple_idct_add_8_mmi;
++                    c->idct = ff_simple_idct_8_mmi;
++                    c->perm_type = FF_IDCT_PERM_NONE;
++        }
++
++        c->put_pixels_clamped = ff_put_pixels_clamped_mmi;
++        c->add_pixels_clamped = ff_add_pixels_clamped_mmi;
++        c->put_signed_pixels_clamped = ff_put_signed_pixels_clamped_mmi;
+     }
+ 
+-    c->put_pixels_clamped = ff_put_pixels_clamped_mmi;
+-    c->add_pixels_clamped = ff_add_pixels_clamped_mmi;
+-    c->put_signed_pixels_clamped = ff_put_signed_pixels_clamped_mmi;
+-}
+-#endif /* HAVE_MMI */
+-
+-av_cold void ff_idctdsp_init_mips(IDCTDSPContext *c, AVCodecContext *avctx,
+-                          unsigned high_bit_depth)
+-{
+-#if HAVE_MSA
+-    idctdsp_init_msa(c, avctx, high_bit_depth);
+-#endif  // #if HAVE_MSA
+-#if HAVE_MMI
+-    idctdsp_init_mmi(c, avctx, high_bit_depth);
+-#endif /* HAVE_MMI */
++    if (have_msa(cpu_flags)) {
++        if ((avctx->lowres != 1) && (avctx->lowres != 2) && (avctx->lowres != 3) &&
++            (avctx->bits_per_raw_sample != 10) &&
++            (avctx->bits_per_raw_sample != 12) &&
++            (avctx->idct_algo == FF_IDCT_AUTO)) {
++                    c->idct_put = ff_simple_idct_put_msa;
++                    c->idct_add = ff_simple_idct_add_msa;
++                    c->idct = ff_simple_idct_msa;
++                    c->perm_type = FF_IDCT_PERM_NONE;
++        }
++
++        c->put_pixels_clamped = ff_put_pixels_clamped_msa;
++        c->put_signed_pixels_clamped = ff_put_signed_pixels_clamped_msa;
++        c->add_pixels_clamped = ff_add_pixels_clamped_msa;
++    }
+ }
+diff -uNra ffmpeg-4.1.6/libavcodec/mips/idctdsp_msa.c FFmpeg/libavcodec/mips/idctdsp_msa.c
+--- a/libavcodec/mips/idctdsp_msa.c	2020-07-03 01:22:31.000000000 +0800
++++ b/libavcodec/mips/idctdsp_msa.c	2020-07-19 18:13:57.481843287 +0800
+@@ -28,8 +28,7 @@
+     v8i16 in0, in1, in2, in3, in4, in5, in6, in7;
+ 
+     LD_SH8(block, 8, in0, in1, in2, in3, in4, in5, in6, in7);
+-    CLIP_SH4_0_255(in0, in1, in2, in3);
+-    CLIP_SH4_0_255(in4, in5, in6, in7);
++    CLIP_SH8_0_255(in0, in1, in2, in3, in4, in5, in6, in7);
+     PCKEV_B4_SH(in0, in0, in1, in1, in2, in2, in3, in3, in0, in1, in2, in3);
+     PCKEV_B4_SH(in4, in4, in5, in5, in6, in6, in7, in7, in4, in5, in6, in7);
+ 
+@@ -63,8 +62,7 @@
+     in6 += 128;
+     in7 += 128;
+ 
+-    CLIP_SH4_0_255(in0, in1, in2, in3);
+-    CLIP_SH4_0_255(in4, in5, in6, in7);
++    CLIP_SH8_0_255(in0, in1, in2, in3, in4, in5, in6, in7);
+     PCKEV_B4_SH(in0, in0, in1, in1, in2, in2, in3, in3, in0, in1, in2, in3);
+     PCKEV_B4_SH(in4, in4, in5, in5, in6, in6, in7, in7, in4, in5, in6, in7);
+ 
+@@ -109,8 +107,7 @@
+     in6 += (v8i16) pix6;
+     in7 += (v8i16) pix7;
+ 
+-    CLIP_SH4_0_255(in0, in1, in2, in3);
+-    CLIP_SH4_0_255(in4, in5, in6, in7);
++    CLIP_SH8_0_255(in0, in1, in2, in3, in4, in5, in6, in7);
+     PCKEV_B4_SH(in0, in0, in1, in1, in2, in2, in3, in3, in0, in1, in2, in3);
+     PCKEV_B4_SH(in4, in4, in5, in5, in6, in6, in7, in7, in4, in5, in6, in7);
+ 
+diff -uNra ffmpeg-4.1.6/libavcodec/mips/Makefile FFmpeg/libavcodec/mips/Makefile
+--- a/libavcodec/mips/Makefile	2020-07-03 23:10:59.000000000 +0800
++++ b/libavcodec/mips/Makefile	2020-07-19 18:13:57.431033962 +0800
+@@ -22,6 +22,7 @@
+                                              mips/hevcpred_init_mips.o
+ OBJS-$(CONFIG_VP9_DECODER)                += mips/vp9dsp_init_mips.o
+ OBJS-$(CONFIG_VP8_DECODER)                += mips/vp8dsp_init_mips.o
++OBJS-$(CONFIG_VP3DSP)                     += mips/vp3dsp_init_mips.o
+ OBJS-$(CONFIG_H264DSP)                    += mips/h264dsp_init_mips.o
+ OBJS-$(CONFIG_H264QPEL)                   += mips/h264qpel_init_mips.o
+ OBJS-$(CONFIG_H264CHROMA)                 += mips/h264chroma_init_mips.o
+@@ -54,6 +55,7 @@
+ MSA-OBJS-$(CONFIG_VP8_DECODER)            += mips/vp8_mc_msa.o             \
+                                              mips/vp8_idct_msa.o           \
+                                              mips/vp8_lpf_msa.o
++MSA-OBJS-$(CONFIG_VP3DSP)                 += mips/vp3dsp_idct_msa.o
+ MSA-OBJS-$(CONFIG_H264DSP)                += mips/h264dsp_msa.o            \
+                                              mips/h264idct_msa.o
+ MSA-OBJS-$(CONFIG_H264QPEL)               += mips/h264qpel_msa.o
+@@ -69,6 +71,8 @@
+ MSA-OBJS-$(CONFIG_MPEGVIDEO)              += mips/mpegvideo_msa.o
+ MSA-OBJS-$(CONFIG_MPEGVIDEOENC)           += mips/mpegvideoencdsp_msa.o
+ MSA-OBJS-$(CONFIG_ME_CMP)                 += mips/me_cmp_msa.o
++MSA-OBJS-$(CONFIG_VC1_DECODER)            += mips/vc1dsp_msa.o
++
+ MMI-OBJS                                  += mips/constants.o
+ MMI-OBJS-$(CONFIG_H264DSP)                += mips/h264dsp_mmi.o
+ MMI-OBJS-$(CONFIG_H264CHROMA)             += mips/h264chroma_mmi.o
+@@ -84,3 +88,6 @@
+ MMI-OBJS-$(CONFIG_HPELDSP)                += mips/hpeldsp_mmi.o
+ MMI-OBJS-$(CONFIG_VC1_DECODER)            += mips/vc1dsp_mmi.o
+ MMI-OBJS-$(CONFIG_WMV2DSP)                += mips/wmv2dsp_mmi.o
++MMI-OBJS-$(CONFIG_HEVC_DECODER)           += mips/hevcdsp_mmi.o
++MMI-OBJS-$(CONFIG_VP3DSP)                 += mips/vp3dsp_idct_mmi.o
++MMI-OBJS-$(CONFIG_VP9_DECODER)            += mips/vp9_mc_mmi.o
+diff -uNra ffmpeg-4.1.6/libavcodec/mips/me_cmp_init_mips.c FFmpeg/libavcodec/mips/me_cmp_init_mips.c
+--- a/libavcodec/mips/me_cmp_init_mips.c	2020-04-28 05:48:15.000000000 +0800
++++ b/libavcodec/mips/me_cmp_init_mips.c	2020-07-19 18:19:52.760181959 +0800
+@@ -18,39 +18,35 @@
+  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+  */
+ 
++#include "libavutil/mips/cpu.h"
+ #include "me_cmp_mips.h"
+ 
+-#if HAVE_MSA
+-static av_cold void me_cmp_msa(MECmpContext *c, AVCodecContext *avctx)
++av_cold void ff_me_cmp_init_mips(MECmpContext *c, AVCodecContext *avctx)
+ {
++    int cpu_flags = av_get_cpu_flags();
++
++    if (have_msa(cpu_flags)) {
+ #if BIT_DEPTH == 8
+-    c->pix_abs[0][0] = ff_pix_abs16_msa;
+-    c->pix_abs[0][1] = ff_pix_abs16_x2_msa;
+-    c->pix_abs[0][2] = ff_pix_abs16_y2_msa;
+-    c->pix_abs[0][3] = ff_pix_abs16_xy2_msa;
+-    c->pix_abs[1][0] = ff_pix_abs8_msa;
+-    c->pix_abs[1][1] = ff_pix_abs8_x2_msa;
+-    c->pix_abs[1][2] = ff_pix_abs8_y2_msa;
+-    c->pix_abs[1][3] = ff_pix_abs8_xy2_msa;
+-
+-    c->hadamard8_diff[0] = ff_hadamard8_diff16_msa;
+-    c->hadamard8_diff[1] = ff_hadamard8_diff8x8_msa;
+-
+-    c->hadamard8_diff[4] = ff_hadamard8_intra16_msa;
+-    c->hadamard8_diff[5] = ff_hadamard8_intra8x8_msa;
+-
+-    c->sad[0] = ff_pix_abs16_msa;
+-    c->sad[1] = ff_pix_abs8_msa;
+-    c->sse[0] = ff_sse16_msa;
+-    c->sse[1] = ff_sse8_msa;
+-    c->sse[2] = ff_sse4_msa;
++        c->pix_abs[0][0] = ff_pix_abs16_msa;
++        c->pix_abs[0][1] = ff_pix_abs16_x2_msa;
++        c->pix_abs[0][2] = ff_pix_abs16_y2_msa;
++        c->pix_abs[0][3] = ff_pix_abs16_xy2_msa;
++        c->pix_abs[1][0] = ff_pix_abs8_msa;
++        c->pix_abs[1][1] = ff_pix_abs8_x2_msa;
++        c->pix_abs[1][2] = ff_pix_abs8_y2_msa;
++        c->pix_abs[1][3] = ff_pix_abs8_xy2_msa;
++
++        c->hadamard8_diff[0] = ff_hadamard8_diff16_msa;
++        c->hadamard8_diff[1] = ff_hadamard8_diff8x8_msa;
++
++        c->hadamard8_diff[4] = ff_hadamard8_intra16_msa;
++        c->hadamard8_diff[5] = ff_hadamard8_intra8x8_msa;
++
++        c->sad[0] = ff_pix_abs16_msa;
++        c->sad[1] = ff_pix_abs8_msa;
++        c->sse[0] = ff_sse16_msa;
++        c->sse[1] = ff_sse8_msa;
++        c->sse[2] = ff_sse4_msa;
+ #endif
+-}
+-#endif  // #if HAVE_MSA
+-
+-av_cold void ff_me_cmp_init_mips(MECmpContext *c, AVCodecContext *avctx)
+-{
+-#if HAVE_MSA
+-    me_cmp_msa(c, avctx);
+-#endif  // #if HAVE_MSA
++    }
+ }
+diff -uNra ffmpeg-4.1.6/libavcodec/mips/me_cmp_msa.c FFmpeg/libavcodec/mips/me_cmp_msa.c
+--- a/libavcodec/mips/me_cmp_msa.c	2020-07-03 01:22:31.000000000 +0800
++++ b/libavcodec/mips/me_cmp_msa.c	2020-07-19 18:13:57.485751696 +0800
+@@ -87,8 +87,8 @@
+ 
+         PCKEV_D2_UB(src1, src0, src3, src2, src0, src1);
+         PCKEV_D2_UB(ref1, ref0, ref3, ref2, ref4, ref5);
+-        SLDI_B2_UB(ref0, ref1, ref0, ref1, ref0, ref1, 1);
+-        SLDI_B2_UB(ref2, ref3, ref2, ref3, ref2, ref3, 1);
++        SLDI_B4_UB(ref0, ref0, ref1, ref1, ref2, ref2, ref3, ref3, 1,
++                   ref0, ref1, ref2, ref3);
+         PCKEV_D2_UB(ref1, ref0, ref3, ref2, ref0, ref1);
+         AVER_UB2_UB(ref4, ref0, ref5, ref1, comp0, comp1);
+         sad += SAD_UB2_UH(src0, src1, comp0, comp1);
+@@ -100,8 +100,8 @@
+ 
+         PCKEV_D2_UB(src1, src0, src3, src2, src0, src1);
+         PCKEV_D2_UB(ref1, ref0, ref3, ref2, ref4, ref5);
+-        SLDI_B2_UB(ref0, ref1, ref0, ref1, ref0, ref1, 1);
+-        SLDI_B2_UB(ref2, ref3, ref2, ref3, ref2, ref3, 1);
++        SLDI_B4_UB(ref0, ref0, ref1, ref1, ref2, ref2, ref3, ref3, 1,
++                   ref0, ref1, ref2, ref3);
+         PCKEV_D2_UB(ref1, ref0, ref3, ref2, ref0, ref1);
+         AVER_UB2_UB(ref4, ref0, ref5, ref1, comp0, comp1);
+         sad += SAD_UB2_UH(src0, src1, comp0, comp1);
+diff -uNra ffmpeg-4.1.6/libavcodec/mips/mpegvideoencdsp_init_mips.c FFmpeg/libavcodec/mips/mpegvideoencdsp_init_mips.c
+--- a/libavcodec/mips/mpegvideoencdsp_init_mips.c	2020-04-28 05:48:15.000000000 +0800
++++ b/libavcodec/mips/mpegvideoencdsp_init_mips.c	2020-07-19 18:19:52.760181959 +0800
+@@ -18,23 +18,18 @@
+  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+  */
+ 
++#include "libavutil/mips/cpu.h"
+ #include "libavcodec/bit_depth_template.c"
+ #include "h263dsp_mips.h"
+ 
+-#if HAVE_MSA
+-static av_cold void mpegvideoencdsp_init_msa(MpegvideoEncDSPContext *c,
+-                                             AVCodecContext *avctx)
+-{
+-#if BIT_DEPTH == 8
+-    c->pix_sum = ff_pix_sum_msa;
+-#endif
+-}
+-#endif  // #if HAVE_MSA
+-
+ av_cold void ff_mpegvideoencdsp_init_mips(MpegvideoEncDSPContext *c,
+                                           AVCodecContext *avctx)
+ {
+-#if HAVE_MSA
+-    mpegvideoencdsp_init_msa(c, avctx);
+-#endif  // #if HAVE_MSA
++    int cpu_flags = av_get_cpu_flags();
++
++    if (have_msa(cpu_flags)) {
++#if BIT_DEPTH == 8
++        c->pix_sum = ff_pix_sum_msa;
++#endif
++    }
+ }
+diff -uNra ffmpeg-4.1.6/libavcodec/mips/mpegvideo_init_mips.c FFmpeg/libavcodec/mips/mpegvideo_init_mips.c
+--- a/libavcodec/mips/mpegvideo_init_mips.c	2020-07-03 01:22:31.000000000 +0800
++++ b/libavcodec/mips/mpegvideo_init_mips.c	2020-07-19 18:19:52.760181959 +0800
+@@ -18,41 +18,31 @@
+  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+  */
+ 
++#include "libavutil/mips/cpu.h"
+ #include "h263dsp_mips.h"
+ #include "mpegvideo_mips.h"
+ 
+-#if HAVE_MSA
+-static av_cold void dct_unquantize_init_msa(MpegEncContext *s)
+-{
+-    s->dct_unquantize_h263_intra = ff_dct_unquantize_h263_intra_msa;
+-    s->dct_unquantize_h263_inter = ff_dct_unquantize_h263_inter_msa;
+-    if (!s->q_scale_type)
+-        s->dct_unquantize_mpeg2_inter = ff_dct_unquantize_mpeg2_inter_msa;
+-}
+-#endif  // #if HAVE_MSA
+-
+-#if HAVE_MMI
+-static av_cold void dct_unquantize_init_mmi(MpegEncContext *s)
++av_cold void ff_mpv_common_init_mips(MpegEncContext *s)
+ {
+-    s->dct_unquantize_h263_intra = ff_dct_unquantize_h263_intra_mmi;
+-    s->dct_unquantize_h263_inter = ff_dct_unquantize_h263_inter_mmi;
+-    s->dct_unquantize_mpeg1_intra = ff_dct_unquantize_mpeg1_intra_mmi;
+-    s->dct_unquantize_mpeg1_inter = ff_dct_unquantize_mpeg1_inter_mmi;
++    int cpu_flags = av_get_cpu_flags();
+ 
+-    if (!(s->avctx->flags & AV_CODEC_FLAG_BITEXACT))
++    if (have_mmi(cpu_flags)) {
++        s->dct_unquantize_h263_intra = ff_dct_unquantize_h263_intra_mmi;
++        s->dct_unquantize_h263_inter = ff_dct_unquantize_h263_inter_mmi;
++        s->dct_unquantize_mpeg1_intra = ff_dct_unquantize_mpeg1_intra_mmi;
++        s->dct_unquantize_mpeg1_inter = ff_dct_unquantize_mpeg1_inter_mmi;
++
++        if (!(s->avctx->flags & AV_CODEC_FLAG_BITEXACT))
++            if (!s->q_scale_type)
++                s->dct_unquantize_mpeg2_intra = ff_dct_unquantize_mpeg2_intra_mmi;
++
++        s->denoise_dct= ff_denoise_dct_mmi;
++    }
++
++    if (have_msa(cpu_flags)) {
++        s->dct_unquantize_h263_intra = ff_dct_unquantize_h263_intra_msa;
++        s->dct_unquantize_h263_inter = ff_dct_unquantize_h263_inter_msa;
+         if (!s->q_scale_type)
+-            s->dct_unquantize_mpeg2_intra = ff_dct_unquantize_mpeg2_intra_mmi;
+-
+-    s->denoise_dct= ff_denoise_dct_mmi;
+-}
+-#endif /* HAVE_MMI */
+-
+-av_cold void ff_mpv_common_init_mips(MpegEncContext *s)
+-{
+-#if HAVE_MSA
+-    dct_unquantize_init_msa(s);
+-#endif  // #if HAVE_MSA
+-#if HAVE_MMI
+-    dct_unquantize_init_mmi(s);
+-#endif /* HAVE_MMI */
++            s->dct_unquantize_mpeg2_inter = ff_dct_unquantize_mpeg2_inter_msa;
++    }
+ }
+diff -uNra ffmpeg-4.1.6/libavcodec/mips/mpegvideo_mmi.c FFmpeg/libavcodec/mips/mpegvideo_mmi.c
+--- a/libavcodec/mips/mpegvideo_mmi.c	2020-07-03 01:22:31.000000000 +0800
++++ b/libavcodec/mips/mpegvideo_mmi.c	2020-07-19 18:13:57.505293744 +0800
+@@ -410,9 +410,9 @@
+         "psubh      %[ftmp2],   %[ftmp2],       %[ftmp8]                \n\t"
+         "pandn      %[ftmp5],   %[ftmp5],       %[ftmp1]                \n\t"
+         "pandn      %[ftmp6],   %[ftmp6],       %[ftmp2]                \n\t"
+-        PTR_ADDIU  "%[addr0],   %[addr0],       0x10                    \n\t"
+         MMI_SDXC1(%[ftmp5], %[addr0], %[block], 0x00)
+         MMI_SDXC1(%[ftmp6], %[addr0], %[block], 0x08)
++        PTR_ADDIU  "%[addr0],   %[addr0],       0x10                    \n\t"
+         "blez       %[addr0],   1b                                      \n\t"
+         : [ftmp0]"=&f"(ftmp[0]),            [ftmp1]"=&f"(ftmp[1]),
+           [ftmp2]"=&f"(ftmp[2]),            [ftmp3]"=&f"(ftmp[3]),
+diff -uNra ffmpeg-4.1.6/libavcodec/mips/pixblockdsp_init_mips.c FFmpeg/libavcodec/mips/pixblockdsp_init_mips.c
+--- a/libavcodec/mips/pixblockdsp_init_mips.c	2020-07-03 01:22:31.000000000 +0800
++++ b/libavcodec/mips/pixblockdsp_init_mips.c	2020-07-19 18:19:52.760181959 +0800
+@@ -19,51 +19,38 @@
+  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+  */
+ 
++#include "libavutil/mips/cpu.h"
+ #include "pixblockdsp_mips.h"
+ 
+-#if HAVE_MSA
+-static av_cold void pixblockdsp_init_msa(PixblockDSPContext *c,
+-                                         AVCodecContext *avctx,
+-                                         unsigned high_bit_depth)
++void ff_pixblockdsp_init_mips(PixblockDSPContext *c, AVCodecContext *avctx,
++                              unsigned high_bit_depth)
+ {
+-    c->diff_pixels = ff_diff_pixels_msa;
++    int cpu_flags = av_get_cpu_flags();
++
++    if (have_mmi(cpu_flags)) {
++        c->diff_pixels = ff_diff_pixels_mmi;
+ 
+-    switch (avctx->bits_per_raw_sample) {
+-    case 9:
+-    case 10:
+-    case 12:
+-    case 14:
+-        c->get_pixels = ff_get_pixels_16_msa;
+-        break;
+-    default:
+-        if (avctx->bits_per_raw_sample <= 8 || avctx->codec_type !=
+-            AVMEDIA_TYPE_VIDEO) {
+-            c->get_pixels = ff_get_pixels_8_msa;
++        if (!high_bit_depth || avctx->codec_type != AVMEDIA_TYPE_VIDEO) {
++            c->get_pixels = ff_get_pixels_8_mmi;
+         }
+-        break;
+     }
+-}
+-#endif  // #if HAVE_MSA
+ 
+-#if HAVE_MMI
+-static av_cold void pixblockdsp_init_mmi(PixblockDSPContext *c,
+-        AVCodecContext *avctx, unsigned high_bit_depth)
+-{
+-    c->diff_pixels = ff_diff_pixels_mmi;
++    if (have_msa(cpu_flags)) {
++        c->diff_pixels = ff_diff_pixels_msa;
+ 
+-    if (!high_bit_depth || avctx->codec_type != AVMEDIA_TYPE_VIDEO) {
+-        c->get_pixels = ff_get_pixels_8_mmi;
++        switch (avctx->bits_per_raw_sample) {
++        case 9:
++        case 10:
++        case 12:
++        case 14:
++            c->get_pixels = ff_get_pixels_16_msa;
++            break;
++        default:
++            if (avctx->bits_per_raw_sample <= 8 || avctx->codec_type !=
++                AVMEDIA_TYPE_VIDEO) {
++                c->get_pixels = ff_get_pixels_8_msa;
++            }
++            break;
++        }
+     }
+ }
+-#endif /* HAVE_MMI */
+-
+-void ff_pixblockdsp_init_mips(PixblockDSPContext *c, AVCodecContext *avctx,
+-                              unsigned high_bit_depth)
+-{
+-#if HAVE_MSA
+-    pixblockdsp_init_msa(c, avctx, high_bit_depth);
+-#endif  // #if HAVE_MSA
+-#if HAVE_MMI
+-    pixblockdsp_init_mmi(c, avctx, high_bit_depth);
+-#endif /* HAVE_MMI */
+-}
+diff -uNra ffmpeg-4.1.6/libavcodec/mips/qpeldsp_init_mips.c FFmpeg/libavcodec/mips/qpeldsp_init_mips.c
+--- a/libavcodec/mips/qpeldsp_init_mips.c	2020-04-28 05:48:15.000000000 +0800
++++ b/libavcodec/mips/qpeldsp_init_mips.c	2020-07-19 18:19:52.760181959 +0800
+@@ -18,150 +18,146 @@
+  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+  */
+ 
++#include "libavutil/mips/cpu.h"
+ #include "qpeldsp_mips.h"
+ 
+-#if HAVE_MSA
+-static av_cold void qpeldsp_init_msa(QpelDSPContext *c)
+-{
+-    c->put_qpel_pixels_tab[0][0] = ff_copy_16x16_msa;
+-    c->put_qpel_pixels_tab[0][1] = ff_horiz_mc_qpel_aver_src0_16width_msa;
+-    c->put_qpel_pixels_tab[0][2] = ff_horiz_mc_qpel_16width_msa;
+-    c->put_qpel_pixels_tab[0][3] = ff_horiz_mc_qpel_aver_src1_16width_msa;
+-    c->put_qpel_pixels_tab[0][4] = ff_vert_mc_qpel_aver_src0_16x16_msa;
+-    c->put_qpel_pixels_tab[0][5] = ff_hv_mc_qpel_aver_hv_src00_16x16_msa;
+-    c->put_qpel_pixels_tab[0][6] = ff_hv_mc_qpel_aver_v_src0_16x16_msa;
+-    c->put_qpel_pixels_tab[0][7] = ff_hv_mc_qpel_aver_hv_src10_16x16_msa;
+-    c->put_qpel_pixels_tab[0][8] = ff_vert_mc_qpel_16x16_msa;
+-    c->put_qpel_pixels_tab[0][9] = ff_hv_mc_qpel_aver_h_src0_16x16_msa;
+-    c->put_qpel_pixels_tab[0][10] = ff_hv_mc_qpel_16x16_msa;
+-    c->put_qpel_pixels_tab[0][11] = ff_hv_mc_qpel_aver_h_src1_16x16_msa;
+-    c->put_qpel_pixels_tab[0][12] = ff_vert_mc_qpel_aver_src1_16x16_msa;
+-    c->put_qpel_pixels_tab[0][13] = ff_hv_mc_qpel_aver_hv_src01_16x16_msa;
+-    c->put_qpel_pixels_tab[0][14] = ff_hv_mc_qpel_aver_v_src1_16x16_msa;
+-    c->put_qpel_pixels_tab[0][15] = ff_hv_mc_qpel_aver_hv_src11_16x16_msa;
+-
+-    c->put_qpel_pixels_tab[1][0] = ff_copy_8x8_msa;
+-    c->put_qpel_pixels_tab[1][1] = ff_horiz_mc_qpel_aver_src0_8width_msa;
+-    c->put_qpel_pixels_tab[1][2] = ff_horiz_mc_qpel_8width_msa;
+-    c->put_qpel_pixels_tab[1][3] = ff_horiz_mc_qpel_aver_src1_8width_msa;
+-    c->put_qpel_pixels_tab[1][4] = ff_vert_mc_qpel_aver_src0_8x8_msa;
+-    c->put_qpel_pixels_tab[1][5] = ff_hv_mc_qpel_aver_hv_src00_8x8_msa;
+-    c->put_qpel_pixels_tab[1][6] = ff_hv_mc_qpel_aver_v_src0_8x8_msa;
+-    c->put_qpel_pixels_tab[1][7] = ff_hv_mc_qpel_aver_hv_src10_8x8_msa;
+-    c->put_qpel_pixels_tab[1][8] = ff_vert_mc_qpel_8x8_msa;
+-    c->put_qpel_pixels_tab[1][9] = ff_hv_mc_qpel_aver_h_src0_8x8_msa;
+-    c->put_qpel_pixels_tab[1][10] = ff_hv_mc_qpel_8x8_msa;
+-    c->put_qpel_pixels_tab[1][11] = ff_hv_mc_qpel_aver_h_src1_8x8_msa;
+-    c->put_qpel_pixels_tab[1][12] = ff_vert_mc_qpel_aver_src1_8x8_msa;
+-    c->put_qpel_pixels_tab[1][13] = ff_hv_mc_qpel_aver_hv_src01_8x8_msa;
+-    c->put_qpel_pixels_tab[1][14] = ff_hv_mc_qpel_aver_v_src1_8x8_msa;
+-    c->put_qpel_pixels_tab[1][15] = ff_hv_mc_qpel_aver_hv_src11_8x8_msa;
+-
+-    c->put_no_rnd_qpel_pixels_tab[0][0] = ff_copy_16x16_msa;
+-    c->put_no_rnd_qpel_pixels_tab[0][1] =
+-        ff_horiz_mc_qpel_no_rnd_aver_src0_16width_msa;
+-    c->put_no_rnd_qpel_pixels_tab[0][2] = ff_horiz_mc_qpel_no_rnd_16width_msa;
+-    c->put_no_rnd_qpel_pixels_tab[0][3] =
+-        ff_horiz_mc_qpel_no_rnd_aver_src1_16width_msa;
+-    c->put_no_rnd_qpel_pixels_tab[0][4] =
+-        ff_vert_mc_qpel_no_rnd_aver_src0_16x16_msa;
+-    c->put_no_rnd_qpel_pixels_tab[0][5] =
+-        ff_hv_mc_qpel_no_rnd_aver_hv_src00_16x16_msa;
+-    c->put_no_rnd_qpel_pixels_tab[0][6] =
+-        ff_hv_mc_qpel_no_rnd_aver_v_src0_16x16_msa;
+-    c->put_no_rnd_qpel_pixels_tab[0][7] =
+-        ff_hv_mc_qpel_no_rnd_aver_hv_src10_16x16_msa;
+-    c->put_no_rnd_qpel_pixels_tab[0][8] = ff_vert_mc_qpel_no_rnd_16x16_msa;
+-    c->put_no_rnd_qpel_pixels_tab[0][9] =
+-        ff_hv_mc_qpel_no_rnd_aver_h_src0_16x16_msa;
+-    c->put_no_rnd_qpel_pixels_tab[0][10] = ff_hv_mc_qpel_no_rnd_16x16_msa;
+-    c->put_no_rnd_qpel_pixels_tab[0][11] =
+-        ff_hv_mc_qpel_no_rnd_aver_h_src1_16x16_msa;
+-    c->put_no_rnd_qpel_pixels_tab[0][12] =
+-        ff_vert_mc_qpel_no_rnd_aver_src1_16x16_msa;
+-    c->put_no_rnd_qpel_pixels_tab[0][13] =
+-        ff_hv_mc_qpel_no_rnd_aver_hv_src01_16x16_msa;
+-    c->put_no_rnd_qpel_pixels_tab[0][14] =
+-        ff_hv_mc_qpel_no_rnd_aver_v_src1_16x16_msa;
+-    c->put_no_rnd_qpel_pixels_tab[0][15] =
+-        ff_hv_mc_qpel_no_rnd_aver_hv_src11_16x16_msa;
+-
+-    c->put_no_rnd_qpel_pixels_tab[1][0] = ff_copy_8x8_msa;
+-    c->put_no_rnd_qpel_pixels_tab[1][1] =
+-        ff_horiz_mc_qpel_no_rnd_aver_src0_8width_msa;
+-    c->put_no_rnd_qpel_pixels_tab[1][2] = ff_horiz_mc_qpel_no_rnd_8width_msa;
+-    c->put_no_rnd_qpel_pixels_tab[1][3] =
+-        ff_horiz_mc_qpel_no_rnd_aver_src1_8width_msa;
+-    c->put_no_rnd_qpel_pixels_tab[1][4] =
+-        ff_vert_mc_qpel_no_rnd_aver_src0_8x8_msa;
+-    c->put_no_rnd_qpel_pixels_tab[1][5] =
+-        ff_hv_mc_qpel_no_rnd_aver_hv_src00_8x8_msa;
+-    c->put_no_rnd_qpel_pixels_tab[1][6] =
+-        ff_hv_mc_qpel_no_rnd_aver_v_src0_8x8_msa;
+-    c->put_no_rnd_qpel_pixels_tab[1][7] =
+-        ff_hv_mc_qpel_no_rnd_aver_hv_src10_8x8_msa;
+-    c->put_no_rnd_qpel_pixels_tab[1][8] = ff_vert_mc_qpel_no_rnd_8x8_msa;
+-    c->put_no_rnd_qpel_pixels_tab[1][9] =
+-        ff_hv_mc_qpel_no_rnd_aver_h_src0_8x8_msa;
+-    c->put_no_rnd_qpel_pixels_tab[1][10] = ff_hv_mc_qpel_no_rnd_8x8_msa;
+-    c->put_no_rnd_qpel_pixels_tab[1][11] =
+-        ff_hv_mc_qpel_no_rnd_aver_h_src1_8x8_msa;
+-    c->put_no_rnd_qpel_pixels_tab[1][12] =
+-        ff_vert_mc_qpel_no_rnd_aver_src1_8x8_msa;
+-    c->put_no_rnd_qpel_pixels_tab[1][13] =
+-        ff_hv_mc_qpel_no_rnd_aver_hv_src01_8x8_msa;
+-    c->put_no_rnd_qpel_pixels_tab[1][14] =
+-        ff_hv_mc_qpel_no_rnd_aver_v_src1_8x8_msa;
+-    c->put_no_rnd_qpel_pixels_tab[1][15] =
+-        ff_hv_mc_qpel_no_rnd_aver_hv_src11_8x8_msa;
+-
+-    c->avg_qpel_pixels_tab[0][0] = ff_avg_width16_msa;
+-    c->avg_qpel_pixels_tab[0][1] =
+-        ff_horiz_mc_qpel_avg_dst_aver_src0_16width_msa;
+-    c->avg_qpel_pixels_tab[0][2] = ff_horiz_mc_qpel_avg_dst_16width_msa;
+-    c->avg_qpel_pixels_tab[0][3] =
+-        ff_horiz_mc_qpel_avg_dst_aver_src1_16width_msa;
+-    c->avg_qpel_pixels_tab[0][4] = ff_vert_mc_qpel_avg_dst_aver_src0_16x16_msa;
+-    c->avg_qpel_pixels_tab[0][5] =
+-        ff_hv_mc_qpel_avg_dst_aver_hv_src00_16x16_msa;
+-    c->avg_qpel_pixels_tab[0][6] = ff_hv_mc_qpel_avg_dst_aver_v_src0_16x16_msa;
+-    c->avg_qpel_pixels_tab[0][7] =
+-        ff_hv_mc_qpel_avg_dst_aver_hv_src10_16x16_msa;
+-    c->avg_qpel_pixels_tab[0][8] = ff_vert_mc_qpel_avg_dst_16x16_msa;
+-    c->avg_qpel_pixels_tab[0][9] = ff_hv_mc_qpel_avg_dst_aver_h_src0_16x16_msa;
+-    c->avg_qpel_pixels_tab[0][10] = ff_hv_mc_qpel_avg_dst_16x16_msa;
+-    c->avg_qpel_pixels_tab[0][11] = ff_hv_mc_qpel_avg_dst_aver_h_src1_16x16_msa;
+-    c->avg_qpel_pixels_tab[0][12] = ff_vert_mc_qpel_avg_dst_aver_src1_16x16_msa;
+-    c->avg_qpel_pixels_tab[0][13] =
+-        ff_hv_mc_qpel_avg_dst_aver_hv_src01_16x16_msa;
+-    c->avg_qpel_pixels_tab[0][14] = ff_hv_mc_qpel_avg_dst_aver_v_src1_16x16_msa;
+-    c->avg_qpel_pixels_tab[0][15] =
+-        ff_hv_mc_qpel_avg_dst_aver_hv_src11_16x16_msa;
+-
+-    c->avg_qpel_pixels_tab[1][0] = ff_avg_width8_msa;
+-    c->avg_qpel_pixels_tab[1][1] =
+-        ff_horiz_mc_qpel_avg_dst_aver_src0_8width_msa;
+-    c->avg_qpel_pixels_tab[1][2] = ff_horiz_mc_qpel_avg_dst_8width_msa;
+-    c->avg_qpel_pixels_tab[1][3] =
+-        ff_horiz_mc_qpel_avg_dst_aver_src1_8width_msa;
+-    c->avg_qpel_pixels_tab[1][4] = ff_vert_mc_qpel_avg_dst_aver_src0_8x8_msa;
+-    c->avg_qpel_pixels_tab[1][5] = ff_hv_mc_qpel_avg_dst_aver_hv_src00_8x8_msa;
+-    c->avg_qpel_pixels_tab[1][6] = ff_hv_mc_qpel_avg_dst_aver_v_src0_8x8_msa;
+-    c->avg_qpel_pixels_tab[1][7] = ff_hv_mc_qpel_avg_dst_aver_hv_src10_8x8_msa;
+-    c->avg_qpel_pixels_tab[1][8] = ff_vert_mc_qpel_avg_dst_8x8_msa;
+-    c->avg_qpel_pixels_tab[1][9] = ff_hv_mc_qpel_avg_dst_aver_h_src0_8x8_msa;
+-    c->avg_qpel_pixels_tab[1][10] = ff_hv_mc_qpel_avg_dst_8x8_msa;
+-    c->avg_qpel_pixels_tab[1][11] = ff_hv_mc_qpel_avg_dst_aver_h_src1_8x8_msa;
+-    c->avg_qpel_pixels_tab[1][12] = ff_vert_mc_qpel_avg_dst_aver_src1_8x8_msa;
+-    c->avg_qpel_pixels_tab[1][13] = ff_hv_mc_qpel_avg_dst_aver_hv_src01_8x8_msa;
+-    c->avg_qpel_pixels_tab[1][14] = ff_hv_mc_qpel_avg_dst_aver_v_src1_8x8_msa;
+-    c->avg_qpel_pixels_tab[1][15] = ff_hv_mc_qpel_avg_dst_aver_hv_src11_8x8_msa;
+-}
+-#endif  // #if HAVE_MSA
+-
+ void ff_qpeldsp_init_mips(QpelDSPContext *c)
+ {
+-#if HAVE_MSA
+-    qpeldsp_init_msa(c);
+-#endif  // #if HAVE_MSA
++    int cpu_flags = av_get_cpu_flags();
++
++    if (have_msa(cpu_flags)) {
++        c->put_qpel_pixels_tab[0][0] = ff_copy_16x16_msa;
++        c->put_qpel_pixels_tab[0][1] = ff_horiz_mc_qpel_aver_src0_16width_msa;
++        c->put_qpel_pixels_tab[0][2] = ff_horiz_mc_qpel_16width_msa;
++        c->put_qpel_pixels_tab[0][3] = ff_horiz_mc_qpel_aver_src1_16width_msa;
++        c->put_qpel_pixels_tab[0][4] = ff_vert_mc_qpel_aver_src0_16x16_msa;
++        c->put_qpel_pixels_tab[0][5] = ff_hv_mc_qpel_aver_hv_src00_16x16_msa;
++        c->put_qpel_pixels_tab[0][6] = ff_hv_mc_qpel_aver_v_src0_16x16_msa;
++        c->put_qpel_pixels_tab[0][7] = ff_hv_mc_qpel_aver_hv_src10_16x16_msa;
++        c->put_qpel_pixels_tab[0][8] = ff_vert_mc_qpel_16x16_msa;
++        c->put_qpel_pixels_tab[0][9] = ff_hv_mc_qpel_aver_h_src0_16x16_msa;
++        c->put_qpel_pixels_tab[0][10] = ff_hv_mc_qpel_16x16_msa;
++        c->put_qpel_pixels_tab[0][11] = ff_hv_mc_qpel_aver_h_src1_16x16_msa;
++        c->put_qpel_pixels_tab[0][12] = ff_vert_mc_qpel_aver_src1_16x16_msa;
++        c->put_qpel_pixels_tab[0][13] = ff_hv_mc_qpel_aver_hv_src01_16x16_msa;
++        c->put_qpel_pixels_tab[0][14] = ff_hv_mc_qpel_aver_v_src1_16x16_msa;
++        c->put_qpel_pixels_tab[0][15] = ff_hv_mc_qpel_aver_hv_src11_16x16_msa;
++
++        c->put_qpel_pixels_tab[1][0] = ff_copy_8x8_msa;
++        c->put_qpel_pixels_tab[1][1] = ff_horiz_mc_qpel_aver_src0_8width_msa;
++        c->put_qpel_pixels_tab[1][2] = ff_horiz_mc_qpel_8width_msa;
++        c->put_qpel_pixels_tab[1][3] = ff_horiz_mc_qpel_aver_src1_8width_msa;
++        c->put_qpel_pixels_tab[1][4] = ff_vert_mc_qpel_aver_src0_8x8_msa;
++        c->put_qpel_pixels_tab[1][5] = ff_hv_mc_qpel_aver_hv_src00_8x8_msa;
++        c->put_qpel_pixels_tab[1][6] = ff_hv_mc_qpel_aver_v_src0_8x8_msa;
++        c->put_qpel_pixels_tab[1][7] = ff_hv_mc_qpel_aver_hv_src10_8x8_msa;
++        c->put_qpel_pixels_tab[1][8] = ff_vert_mc_qpel_8x8_msa;
++        c->put_qpel_pixels_tab[1][9] = ff_hv_mc_qpel_aver_h_src0_8x8_msa;
++        c->put_qpel_pixels_tab[1][10] = ff_hv_mc_qpel_8x8_msa;
++        c->put_qpel_pixels_tab[1][11] = ff_hv_mc_qpel_aver_h_src1_8x8_msa;
++        c->put_qpel_pixels_tab[1][12] = ff_vert_mc_qpel_aver_src1_8x8_msa;
++        c->put_qpel_pixels_tab[1][13] = ff_hv_mc_qpel_aver_hv_src01_8x8_msa;
++        c->put_qpel_pixels_tab[1][14] = ff_hv_mc_qpel_aver_v_src1_8x8_msa;
++        c->put_qpel_pixels_tab[1][15] = ff_hv_mc_qpel_aver_hv_src11_8x8_msa;
++
++        c->put_no_rnd_qpel_pixels_tab[0][0] = ff_copy_16x16_msa;
++        c->put_no_rnd_qpel_pixels_tab[0][1] =
++            ff_horiz_mc_qpel_no_rnd_aver_src0_16width_msa;
++        c->put_no_rnd_qpel_pixels_tab[0][2] = ff_horiz_mc_qpel_no_rnd_16width_msa;
++        c->put_no_rnd_qpel_pixels_tab[0][3] =
++            ff_horiz_mc_qpel_no_rnd_aver_src1_16width_msa;
++        c->put_no_rnd_qpel_pixels_tab[0][4] =
++            ff_vert_mc_qpel_no_rnd_aver_src0_16x16_msa;
++        c->put_no_rnd_qpel_pixels_tab[0][5] =
++            ff_hv_mc_qpel_no_rnd_aver_hv_src00_16x16_msa;
++        c->put_no_rnd_qpel_pixels_tab[0][6] =
++            ff_hv_mc_qpel_no_rnd_aver_v_src0_16x16_msa;
++        c->put_no_rnd_qpel_pixels_tab[0][7] =
++            ff_hv_mc_qpel_no_rnd_aver_hv_src10_16x16_msa;
++        c->put_no_rnd_qpel_pixels_tab[0][8] = ff_vert_mc_qpel_no_rnd_16x16_msa;
++        c->put_no_rnd_qpel_pixels_tab[0][9] =
++            ff_hv_mc_qpel_no_rnd_aver_h_src0_16x16_msa;
++        c->put_no_rnd_qpel_pixels_tab[0][10] = ff_hv_mc_qpel_no_rnd_16x16_msa;
++        c->put_no_rnd_qpel_pixels_tab[0][11] =
++            ff_hv_mc_qpel_no_rnd_aver_h_src1_16x16_msa;
++        c->put_no_rnd_qpel_pixels_tab[0][12] =
++            ff_vert_mc_qpel_no_rnd_aver_src1_16x16_msa;
++        c->put_no_rnd_qpel_pixels_tab[0][13] =
++            ff_hv_mc_qpel_no_rnd_aver_hv_src01_16x16_msa;
++        c->put_no_rnd_qpel_pixels_tab[0][14] =
++            ff_hv_mc_qpel_no_rnd_aver_v_src1_16x16_msa;
++        c->put_no_rnd_qpel_pixels_tab[0][15] =
++            ff_hv_mc_qpel_no_rnd_aver_hv_src11_16x16_msa;
++
++        c->put_no_rnd_qpel_pixels_tab[1][0] = ff_copy_8x8_msa;
++        c->put_no_rnd_qpel_pixels_tab[1][1] =
++            ff_horiz_mc_qpel_no_rnd_aver_src0_8width_msa;
++        c->put_no_rnd_qpel_pixels_tab[1][2] = ff_horiz_mc_qpel_no_rnd_8width_msa;
++        c->put_no_rnd_qpel_pixels_tab[1][3] =
++            ff_horiz_mc_qpel_no_rnd_aver_src1_8width_msa;
++        c->put_no_rnd_qpel_pixels_tab[1][4] =
++            ff_vert_mc_qpel_no_rnd_aver_src0_8x8_msa;
++        c->put_no_rnd_qpel_pixels_tab[1][5] =
++            ff_hv_mc_qpel_no_rnd_aver_hv_src00_8x8_msa;
++        c->put_no_rnd_qpel_pixels_tab[1][6] =
++            ff_hv_mc_qpel_no_rnd_aver_v_src0_8x8_msa;
++        c->put_no_rnd_qpel_pixels_tab[1][7] =
++            ff_hv_mc_qpel_no_rnd_aver_hv_src10_8x8_msa;
++        c->put_no_rnd_qpel_pixels_tab[1][8] = ff_vert_mc_qpel_no_rnd_8x8_msa;
++        c->put_no_rnd_qpel_pixels_tab[1][9] =
++            ff_hv_mc_qpel_no_rnd_aver_h_src0_8x8_msa;
++        c->put_no_rnd_qpel_pixels_tab[1][10] = ff_hv_mc_qpel_no_rnd_8x8_msa;
++        c->put_no_rnd_qpel_pixels_tab[1][11] =
++            ff_hv_mc_qpel_no_rnd_aver_h_src1_8x8_msa;
++        c->put_no_rnd_qpel_pixels_tab[1][12] =
++            ff_vert_mc_qpel_no_rnd_aver_src1_8x8_msa;
++        c->put_no_rnd_qpel_pixels_tab[1][13] =
++            ff_hv_mc_qpel_no_rnd_aver_hv_src01_8x8_msa;
++        c->put_no_rnd_qpel_pixels_tab[1][14] =
++            ff_hv_mc_qpel_no_rnd_aver_v_src1_8x8_msa;
++        c->put_no_rnd_qpel_pixels_tab[1][15] =
++            ff_hv_mc_qpel_no_rnd_aver_hv_src11_8x8_msa;
++
++        c->avg_qpel_pixels_tab[0][0] = ff_avg_width16_msa;
++        c->avg_qpel_pixels_tab[0][1] =
++            ff_horiz_mc_qpel_avg_dst_aver_src0_16width_msa;
++        c->avg_qpel_pixels_tab[0][2] = ff_horiz_mc_qpel_avg_dst_16width_msa;
++        c->avg_qpel_pixels_tab[0][3] =
++            ff_horiz_mc_qpel_avg_dst_aver_src1_16width_msa;
++        c->avg_qpel_pixels_tab[0][4] = ff_vert_mc_qpel_avg_dst_aver_src0_16x16_msa;
++        c->avg_qpel_pixels_tab[0][5] =
++            ff_hv_mc_qpel_avg_dst_aver_hv_src00_16x16_msa;
++        c->avg_qpel_pixels_tab[0][6] = ff_hv_mc_qpel_avg_dst_aver_v_src0_16x16_msa;
++        c->avg_qpel_pixels_tab[0][7] =
++            ff_hv_mc_qpel_avg_dst_aver_hv_src10_16x16_msa;
++        c->avg_qpel_pixels_tab[0][8] = ff_vert_mc_qpel_avg_dst_16x16_msa;
++        c->avg_qpel_pixels_tab[0][9] = ff_hv_mc_qpel_avg_dst_aver_h_src0_16x16_msa;
++        c->avg_qpel_pixels_tab[0][10] = ff_hv_mc_qpel_avg_dst_16x16_msa;
++        c->avg_qpel_pixels_tab[0][11] = ff_hv_mc_qpel_avg_dst_aver_h_src1_16x16_msa;
++        c->avg_qpel_pixels_tab[0][12] = ff_vert_mc_qpel_avg_dst_aver_src1_16x16_msa;
++        c->avg_qpel_pixels_tab[0][13] =
++            ff_hv_mc_qpel_avg_dst_aver_hv_src01_16x16_msa;
++        c->avg_qpel_pixels_tab[0][14] = ff_hv_mc_qpel_avg_dst_aver_v_src1_16x16_msa;
++        c->avg_qpel_pixels_tab[0][15] =
++            ff_hv_mc_qpel_avg_dst_aver_hv_src11_16x16_msa;
++
++        c->avg_qpel_pixels_tab[1][0] = ff_avg_width8_msa;
++        c->avg_qpel_pixels_tab[1][1] =
++            ff_horiz_mc_qpel_avg_dst_aver_src0_8width_msa;
++        c->avg_qpel_pixels_tab[1][2] = ff_horiz_mc_qpel_avg_dst_8width_msa;
++        c->avg_qpel_pixels_tab[1][3] =
++            ff_horiz_mc_qpel_avg_dst_aver_src1_8width_msa;
++        c->avg_qpel_pixels_tab[1][4] = ff_vert_mc_qpel_avg_dst_aver_src0_8x8_msa;
++        c->avg_qpel_pixels_tab[1][5] = ff_hv_mc_qpel_avg_dst_aver_hv_src00_8x8_msa;
++        c->avg_qpel_pixels_tab[1][6] = ff_hv_mc_qpel_avg_dst_aver_v_src0_8x8_msa;
++        c->avg_qpel_pixels_tab[1][7] = ff_hv_mc_qpel_avg_dst_aver_hv_src10_8x8_msa;
++        c->avg_qpel_pixels_tab[1][8] = ff_vert_mc_qpel_avg_dst_8x8_msa;
++        c->avg_qpel_pixels_tab[1][9] = ff_hv_mc_qpel_avg_dst_aver_h_src0_8x8_msa;
++        c->avg_qpel_pixels_tab[1][10] = ff_hv_mc_qpel_avg_dst_8x8_msa;
++        c->avg_qpel_pixels_tab[1][11] = ff_hv_mc_qpel_avg_dst_aver_h_src1_8x8_msa;
++        c->avg_qpel_pixels_tab[1][12] = ff_vert_mc_qpel_avg_dst_aver_src1_8x8_msa;
++        c->avg_qpel_pixels_tab[1][13] = ff_hv_mc_qpel_avg_dst_aver_hv_src01_8x8_msa;
++        c->avg_qpel_pixels_tab[1][14] = ff_hv_mc_qpel_avg_dst_aver_v_src1_8x8_msa;
++        c->avg_qpel_pixels_tab[1][15] = ff_hv_mc_qpel_avg_dst_aver_hv_src11_8x8_msa;
++    }
+ }
+diff -uNra ffmpeg-4.1.6/libavcodec/mips/qpeldsp_msa.c FFmpeg/libavcodec/mips/qpeldsp_msa.c
+--- a/libavcodec/mips/qpeldsp_msa.c	2020-07-03 01:22:31.000000000 +0800
++++ b/libavcodec/mips/qpeldsp_msa.c	2020-07-19 18:13:57.509202154 +0800
+@@ -96,7 +96,7 @@
+     DPADD_UB2_UH(sum2_r, sum1_r, coef2, coef1, sum0_r, sum3_r);         \
+     res0_r = (v8i16) (sum0_r - sum3_r);                                 \
+     res0_r = __msa_srari_h(res0_r, 5);                                  \
+-    res0_r = CLIP_SH_0_255(res0_r);                                     \
++    CLIP_SH_0_255(res0_r);                                              \
+     out = (v16u8) __msa_pckev_b((v16i8) res0_r, (v16i8) res0_r);        \
+                                                                         \
+     out;                                                                \
+@@ -118,7 +118,7 @@
+     res0_r = (v8i16) (sum0_r - sum3_r);                                   \
+     res0_r += 15;                                                         \
+     res0_r >>= 5;                                                         \
+-    res0_r = CLIP_SH_0_255(res0_r);                                       \
++    CLIP_SH_0_255(res0_r);                                                \
+     out = (v16u8) __msa_pckev_b((v16i8) res0_r, (v16i8) res0_r);          \
+                                                                           \
+     out;                                                                  \
+@@ -334,7 +334,7 @@
+         inp0 = (v16u8) __msa_insve_d((v2i64) inp0, 1, (v2i64) inp1);
+         inp2 = (v16u8) __msa_insve_d((v2i64) inp2, 1, (v2i64) inp3);
+         AVER_UB2_UB(inp0, res0, inp2, res1, res0, res1);
+-        ST8x4_UB(res0, res1, dst, dst_stride);
++        ST_D4(res0, res1, 0, 1, 0, 1, dst, dst_stride);
+         dst += (4 * dst_stride);
+     }
+ }
+@@ -409,7 +409,7 @@
+         res1 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp2, inp3,
+                                              mask0, mask1, mask2, mask3,
+                                              const20, const6, const3);
+-        ST8x4_UB(res0, res1, dst, dst_stride);
++        ST_D4(res0, res1, 0, 1, 0, 1, dst, dst_stride);
+         dst += (4 * dst_stride);
+     }
+ }
+@@ -480,12 +480,12 @@
+         res1 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp2, inp3,
+                                              mask0, mask1, mask2, mask3,
+                                              const20, const6, const3);
+-        SLDI_B2_UB(inp0, inp1, inp0, inp1, inp0, inp1, 1);
+-        SLDI_B2_UB(inp2, inp3, inp2, inp3, inp2, inp3, 1);
++        SLDI_B4_UB(inp0, inp0, inp1, inp1, inp2, inp2, inp3, inp3, 1,
++                   inp0, inp1, inp2, inp3);
+         inp0 = (v16u8) __msa_insve_d((v2i64) inp0, 1, (v2i64) inp1);
+         inp2 = (v16u8) __msa_insve_d((v2i64) inp2, 1, (v2i64) inp3);
+         AVER_UB2_UB(inp0, res0, inp2, res1, res0, res1);
+-        ST8x4_UB(res0, res1, dst, dst_stride);
++        ST_D4(res0, res1, 0, 1, 0, 1, dst, dst_stride);
+         dst += (4 * dst_stride);
+     }
+ }
+@@ -564,7 +564,7 @@
+         inp2 = (v16u8) __msa_insve_d((v2i64) inp2, 1, (v2i64) inp3);
+         res0 = __msa_ave_u_b(inp0, res0);
+         res1 = __msa_ave_u_b(inp2, res1);
+-        ST8x4_UB(res0, res1, dst, dst_stride);
++        ST_D4(res0, res1, 0, 1, 0, 1, dst, dst_stride);
+         dst += (4 * dst_stride);
+     }
+ }
+@@ -639,7 +639,7 @@
+         res1 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp2, inp3, mask0, mask1,
+                                                       mask2, mask3, const20,
+                                                       const6, const3);
+-        ST8x4_UB(res0, res1, dst, dst_stride);
++        ST_D4(res0, res1, 0, 1, 0, 1, dst, dst_stride);
+         dst += (4 * dst_stride);
+     }
+ }
+@@ -710,13 +710,13 @@
+         res1 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp2, inp3, mask0, mask1,
+                                                       mask2, mask3, const20,
+                                                       const6, const3);
+-        SLDI_B2_UB(inp0, inp1, inp0, inp1, inp0, inp1, 1);
+-        SLDI_B2_UB(inp2, inp3, inp2, inp3, inp2, inp3, 1);
++        SLDI_B4_UB(inp0, inp0, inp1, inp1, inp2, inp2, inp3, inp3, 1,
++                   inp0, inp1, inp2, inp3);
+         inp0 = (v16u8) __msa_insve_d((v2i64) inp0, 1, (v2i64) inp1);
+         inp2 = (v16u8) __msa_insve_d((v2i64) inp2, 1, (v2i64) inp3);
+         res0 = __msa_ave_u_b(inp0, res0);
+         res1 = __msa_ave_u_b(inp2, res1);
+-        ST8x4_UB(res0, res1, dst, dst_stride);
++        ST_D4(res0, res1, 0, 1, 0, 1, dst, dst_stride);
+         dst += (4 * dst_stride);
+     }
+ }
+@@ -799,7 +799,7 @@
+         dst2 = (v16u8) __msa_insve_d((v2i64) dst2, 1, (v2i64) dst3);
+         AVER_UB2_UB(inp0, res0, inp2, res1, res0, res1);
+         AVER_UB2_UB(dst0, res0, dst2, res1, res0, res1);
+-        ST8x4_UB(res0, res1, dst, dst_stride);
++        ST_D4(res0, res1, 0, 1, 0, 1, dst, dst_stride);
+         dst += (4 * dst_stride);
+     }
+ }
+@@ -876,7 +876,7 @@
+         dst0 = (v16u8) __msa_insve_d((v2i64) dst0, 1, (v2i64) dst1);
+         dst2 = (v16u8) __msa_insve_d((v2i64) dst2, 1, (v2i64) dst3);
+         AVER_UB2_UB(dst0, res0, dst2, res1, res0, res1);
+-        ST8x4_UB(res0, res1, dst, dst_stride);
++        ST_D4(res0, res1, 0, 1, 0, 1, dst, dst_stride);
+         dst += (4 * dst_stride);
+     }
+ }
+@@ -948,15 +948,15 @@
+                                              mask0, mask1, mask2, mask3,
+                                              const20, const6, const3);
+         LD_UB4(dst, dst_stride, dst0, dst1, dst2, dst3);
+-        SLDI_B2_UB(inp0, inp1, inp0, inp1, inp0, inp1, 1);
+-        SLDI_B2_UB(inp2, inp3, inp2, inp3, inp2, inp3, 1);
++        SLDI_B4_UB(inp0, inp0, inp1, inp1, inp2, inp2, inp3, inp3, 1,
++                   inp0, inp1, inp2, inp3);
+         inp0 = (v16u8) __msa_insve_d((v2i64) inp0, 1, (v2i64) inp1);
+         inp2 = (v16u8) __msa_insve_d((v2i64) inp2, 1, (v2i64) inp3);
+         dst0 = (v16u8) __msa_insve_d((v2i64) dst0, 1, (v2i64) dst1);
+         dst2 = (v16u8) __msa_insve_d((v2i64) dst2, 1, (v2i64) dst3);
+         AVER_UB2_UB(inp0, res0, inp2, res1, res0, res1);
+         AVER_UB2_UB(dst0, res0, dst2, res1, res0, res1);
+-        ST8x4_UB(res0, res1, dst, dst_stride);
++        ST_D4(res0, res1, 0, 1, 0, 1, dst, dst_stride);
+         dst += (4 * dst_stride);
+     }
+ }
+@@ -1031,8 +1031,7 @@
+     tmp0 = (v16u8) __msa_insve_d((v2i64) inp0, 1, (v2i64) inp1);
+     tmp1 = (v16u8) __msa_insve_d((v2i64) inp2, 1, (v2i64) inp3);
+     AVER_UB2_UB(res0, tmp0, res1, tmp1, res0, res1);
+-    ST8x4_UB(res0, res1, dst, dst_stride);
+-    dst += (4 * dst_stride);
++    ST_D4(res0, res1, 0, 1, 0, 1, dst, dst_stride);
+ 
+     inp8 = LD_UB(src);
+     res0 = APPLY_VERT_QPEL_FILTER_8BYTE(inp4, inp3, inp2, inp1,
+@@ -1048,8 +1047,7 @@
+     tmp0 = (v16u8) __msa_insve_d((v2i64) inp4, 1, (v2i64) inp5);
+     tmp1 = (v16u8) __msa_insve_d((v2i64) inp6, 1, (v2i64) inp7);
+     AVER_UB2_UB(res0, tmp0, res1, tmp1, res0, res1);
+-    ST8x4_UB(res0, res1, dst, dst_stride);
+-    dst += (4 * dst_stride);
++    ST_D4(res0, res1, 0, 1, 0, 1, dst + 4 * dst_stride, dst_stride);
+ }
+ 
+ static void vert_mc_qpel_aver_src0_16x16_msa(const uint8_t *src,
+@@ -1220,8 +1218,7 @@
+                                         inp3, inp2, inp1, inp0,
+                                         inp4, inp5, inp6, inp7,
+                                         const20, const6, const3);
+-    ST8x4_UB(res0, res1, dst, dst_stride);
+-    dst += (4 * dst_stride);
++    ST_D4(res0, res1, 0, 1, 0, 1, dst, dst_stride);
+ 
+     inp8 = LD_UB(src);
+     res0 = APPLY_VERT_QPEL_FILTER_8BYTE(inp4, inp3, inp2, inp1,
+@@ -1234,8 +1231,7 @@
+                                         inp7, inp6, inp5, inp4,
+                                         inp8, inp8, inp7, inp6,
+                                         const20, const6, const3);
+-    ST8x4_UB(res0, res1, dst, dst_stride);
+-    dst += (4 * dst_stride);
++    ST_D4(res0, res1, 0, 1, 0, 1, dst + 4 * dst_stride, dst_stride);
+ }
+ 
+ static void vert_mc_qpel_16x16_msa(const uint8_t *src,
+@@ -1405,8 +1401,7 @@
+     tmp0 = (v16u8) __msa_insve_d((v2i64) inp1, 1, (v2i64) inp2);
+     tmp1 = (v16u8) __msa_insve_d((v2i64) inp3, 1, (v2i64) inp4);
+     AVER_UB2_UB(res0, tmp0, res1, tmp1, res0, res1);
+-    ST8x4_UB(res0, res1, dst, dst_stride);
+-    dst += (4 * dst_stride);
++    ST_D4(res0, res1, 0, 1, 0, 1, dst, dst_stride);
+ 
+     inp8 = LD_UB(src);
+     res0 = APPLY_VERT_QPEL_FILTER_8BYTE(inp4, inp3, inp2, inp1,
+@@ -1422,7 +1417,7 @@
+     tmp0 = (v16u8) __msa_insve_d((v2i64) inp5, 1, (v2i64) inp6);
+     tmp1 = (v16u8) __msa_insve_d((v2i64) inp7, 1, (v2i64) inp8);
+     AVER_UB2_UB(res0, tmp0, res1, tmp1, res0, res1);
+-    ST8x4_UB(res0, res1, dst, dst_stride);
++    ST_D4(res0, res1, 0, 1, 0, 1, dst + 4 * dst_stride, dst_stride);
+ }
+ 
+ static void vert_mc_qpel_aver_src1_16x16_msa(const uint8_t *src,
+@@ -1607,8 +1602,7 @@
+     tmp1 = (v16u8) __msa_insve_d((v2i64) inp2, 1, (v2i64) inp3);
+     res0 = __msa_ave_u_b(res0, tmp0);
+     res1 = __msa_ave_u_b(res1, tmp1);
+-    ST8x4_UB(res0, res1, dst, dst_stride);
+-    dst += (4 * dst_stride);
++    ST_D4(res0, res1, 0, 1, 0, 1, dst, dst_stride);
+ 
+     inp8 = LD_UB(src);
+     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER_8BYTE(inp4, inp3, inp2, inp1,
+@@ -1625,8 +1619,7 @@
+     tmp1 = (v16u8) __msa_insve_d((v2i64) inp6, 1, (v2i64) inp7);
+     res0 = __msa_ave_u_b(res0, tmp0);
+     res1 = __msa_ave_u_b(res1, tmp1);
+-    ST8x4_UB(res0, res1, dst, dst_stride);
+-    dst += (4 * dst_stride);
++    ST_D4(res0, res1, 0, 1, 0, 1, dst + 4 * dst_stride, dst_stride);
+ }
+ 
+ static void vert_mc_qpel_no_rnd_aver_src0_16x16_msa(const uint8_t *src,
+@@ -1806,8 +1799,7 @@
+                                                  inp3, inp2, inp1, inp0,
+                                                  inp4, inp5, inp6, inp7,
+                                                  const20, const6, const3);
+-    ST8x4_UB(res0, res1, dst, dst_stride);
+-    dst += (4 * dst_stride);
++    ST_D4(res0, res1, 0, 1, 0, 1, dst, dst_stride);
+ 
+     inp8 = LD_UB(src);
+     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER_8BYTE(inp4, inp3, inp2, inp1,
+@@ -1820,8 +1812,7 @@
+                                                  inp7, inp6, inp5, inp4,
+                                                  inp8, inp8, inp7, inp6,
+                                                  const20, const6, const3);
+-    ST8x4_UB(res0, res1, dst, dst_stride);
+-    dst += (4 * dst_stride);
++    ST_D4(res0, res1, 0, 1, 0, 1, dst + 4 * dst_stride, dst_stride);
+ }
+ 
+ static void vert_mc_qpel_no_rnd_16x16_msa(const uint8_t *src,
+@@ -1988,8 +1979,7 @@
+     tmp1 = (v16u8) __msa_insve_d((v2i64) inp3, 1, (v2i64) inp4);
+     res0 = __msa_ave_u_b(res0, tmp0);
+     res1 = __msa_ave_u_b(res1, tmp1);
+-    ST8x4_UB(res0, res1, dst, dst_stride);
+-    dst += (4 * dst_stride);
++    ST_D4(res0, res1, 0, 1, 0, 1, dst, dst_stride);
+ 
+     inp8 = LD_UB(src);
+     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER_8BYTE(inp4, inp3, inp2, inp1,
+@@ -2006,7 +1996,7 @@
+     tmp1 = (v16u8) __msa_insve_d((v2i64) inp7, 1, (v2i64) inp8);
+     res0 = __msa_ave_u_b(res0, tmp0);
+     res1 = __msa_ave_u_b(res1, tmp1);
+-    ST8x4_UB(res0, res1, dst, dst_stride);
++    ST_D4(res0, res1, 0, 1, 0, 1, dst + 4 * dst_stride, dst_stride);
+ }
+ 
+ static void vert_mc_qpel_no_rnd_aver_src1_16x16_msa(const uint8_t *src,
+@@ -2195,7 +2185,7 @@
+     dst2 = (v16u8) __msa_insve_d((v2i64) dst2, 1, (v2i64) dst3);
+     AVER_UB2_UB(res0, tmp0, res1, tmp1, res0, res1);
+     AVER_UB2_UB(dst0, res0, dst2, res1, res0, res1);
+-    ST8x4_UB(res0, res1, dst, dst_stride);
++    ST_D4(res0, res1, 0, 1, 0, 1, dst, dst_stride);
+     dst += (4 * dst_stride);
+ 
+     inp8 = LD_UB(src);
+@@ -2217,7 +2207,7 @@
+     dst2 = (v16u8) __msa_insve_d((v2i64) dst2, 1, (v2i64) dst3);
+     AVER_UB2_UB(res0, tmp0, res1, tmp1, res0, res1);
+     AVER_UB2_UB(dst0, res0, dst2, res1, res0, res1);
+-    ST8x4_UB(res0, res1, dst, dst_stride);
++    ST_D4(res0, res1, 0, 1, 0, 1, dst, dst_stride);
+ }
+ 
+ static void vert_mc_qpel_avg_dst_aver_src0_16x16_msa(const uint8_t *src,
+@@ -2384,7 +2374,7 @@
+     dst0 = (v16u8) __msa_insve_d((v2i64) dst0, 1, (v2i64) dst1);
+     dst2 = (v16u8) __msa_insve_d((v2i64) dst2, 1, (v2i64) dst3);
+     AVER_UB2_UB(dst0, res0, dst2, res1, res0, res1);
+-    ST8x4_UB(res0, res1, dst, dst_stride);
++    ST_D4(res0, res1, 0, 1, 0, 1, dst, dst_stride);
+     dst += (4 * dst_stride);
+ 
+     inp8 = LD_UB(src);
+@@ -2402,8 +2392,7 @@
+     dst0 = (v16u8) __msa_insve_d((v2i64) dst0, 1, (v2i64) dst1);
+     dst2 = (v16u8) __msa_insve_d((v2i64) dst2, 1, (v2i64) dst3);
+     AVER_UB2_UB(dst0, res0, dst2, res1, res0, res1);
+-    ST8x4_UB(res0, res1, dst, dst_stride);
+-    dst += (4 * dst_stride);
++    ST_D4(res0, res1, 0, 1, 0, 1, dst, dst_stride);
+ }
+ 
+ static void vert_mc_qpel_avg_dst_16x16_msa(const uint8_t *src,
+@@ -2566,7 +2555,7 @@
+     dst2 = (v16u8) __msa_insve_d((v2i64) dst2, 1, (v2i64) dst3);
+     AVER_UB2_UB(res0, tmp0, res1, tmp1, res0, res1);
+     AVER_UB2_UB(dst0, res0, dst2, res1, res0, res1);
+-    ST8x4_UB(res0, res1, dst, dst_stride);
++    ST_D4(res0, res1, 0, 1, 0, 1, dst, dst_stride);
+     dst += (4 * dst_stride);
+ 
+     inp8 = LD_UB(src);
+@@ -2587,7 +2576,7 @@
+     dst2 = (v16u8) __msa_insve_d((v2i64) dst2, 1, (v2i64) dst3);
+     AVER_UB2_UB(res0, tmp0, res1, tmp1, res0, res1);
+     AVER_UB2_UB(dst0, res0, dst2, res1, res0, res1);
+-    ST8x4_UB(res0, res1, dst, dst_stride);
++    ST_D4(res0, res1, 0, 1, 0, 1, dst, dst_stride);
+ }
+ 
+ static void vert_mc_qpel_avg_dst_aver_src1_16x16_msa(const uint8_t *src,
+@@ -2832,7 +2821,7 @@
+                                                  const20, const6, const3);
+     avg0 = (v16u8) __msa_ilvr_d((v2i64) horiz1, (v2i64) horiz0);
+     res0 = __msa_ave_u_b(avg0, res0);
+-    ST8x2_UB(res0, dst, dst_stride);
++    ST_D2(res0, 0, 1, dst, dst_stride);
+     dst += (2 * dst_stride);
+ 
+     LD_UB2(src, src_stride, inp2, inp3);
+@@ -2860,7 +2849,7 @@
+                                                  horiz5, horiz4, horiz3, horiz2,
+                                                  horiz6, horiz7, horiz8, horiz8,
+                                                  const20, const6, const3);
+-    ST8x2_UB(res1, dst, dst_stride);
++    ST_D2(res1, 0, 1, dst, dst_stride);
+     dst += 2 * dst_stride;
+ 
+     avg0 = (v16u8) __msa_ilvr_d((v2i64) horiz5, (v2i64) horiz4);
+@@ -2870,12 +2859,12 @@
+                                                  horiz7, horiz6, horiz5, horiz4,
+                                                  horiz8, horiz8, horiz7, horiz6,
+                                                  const20, const6, const3);
+-    ST8x2_UB(res0, dst, dst_stride);
++    ST_D2(res0, 0, 1, dst, dst_stride);
+     dst += 2 * dst_stride;
+ 
+     avg1 = (v16u8) __msa_ilvr_d((v2i64) horiz7, (v2i64) horiz6);
+     res1 = __msa_ave_u_b(avg1, res1);
+-    ST8x2_UB(res1, dst, dst_stride);
++    ST_D2(res1, 0, 1, dst, dst_stride);
+ }
+ 
+ static void hv_mc_qpel_no_rnd_horiz_16x16_msa(const uint8_t *src,
+@@ -2977,7 +2966,7 @@
+                                                  const20, const6, const3);
+     avg0 = (v16u8) __msa_ilvr_d((v2i64) horiz1, (v2i64) horiz0);
+     res0 = __msa_ave_u_b(avg0, res0);
+-    ST8x2_UB(res0, dst, dst_stride);
++    ST_D2(res0, 0, 1, dst, dst_stride);
+     dst += (2 * dst_stride);
+ 
+     LD_UB2(src, src_stride, inp2, inp3);
+@@ -2999,7 +2988,7 @@
+     res1 = __msa_ave_u_b(avg1, res1);
+     avg0 = (v16u8) __msa_ilvr_d((v2i64) horiz1, (v2i64) horiz0);
+     res0 = __msa_ave_u_b(avg0, res0);
+-    ST8x2_UB(res1, dst, dst_stride);
++    ST_D2(res1, 0, 1, dst, dst_stride);
+     dst += (2 * dst_stride);
+ 
+     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER_8BYTE(horiz4, horiz3, horiz2, horiz1,
+@@ -3009,7 +2998,7 @@
+                                                  const20, const6, const3);
+     avg0 = (v16u8) __msa_ilvr_d((v2i64) horiz5, (v2i64) horiz4);
+     res0 = __msa_ave_u_b(avg0, res0);
+-    ST8x2_UB(res0, dst, dst_stride);
++    ST_D2(res0, 0, 1, dst, dst_stride);
+     dst += (2 * dst_stride);
+ 
+     res1 = APPLY_VERT_QPEL_NO_ROUND_FILTER_8BYTE(horiz6, horiz5, horiz4, horiz3,
+@@ -3019,7 +3008,7 @@
+                                                  const20, const6, const3);
+     avg1 = (v16u8) __msa_ilvr_d((v2i64) horiz7, (v2i64) horiz6);
+     res1 = __msa_ave_u_b(avg1, res1);
+-    ST8x2_UB(res1, dst, dst_stride);
++    ST_D2(res1, 0, 1, dst, dst_stride);
+ }
+ 
+ static void hv_mc_qpel_no_rnd_horiz_src1_16x16_msa(const uint8_t *src,
+@@ -3105,7 +3094,7 @@
+     res0 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp0, inp1, mask0, mask1,
+                                                   mask2, mask3, const20,
+                                                   const6, const3);
+-    SLDI_B2_UB(inp0, inp1, inp0, inp1, inp0, inp1, 1);
++    SLDI_B2_UB(inp0, inp0, inp1, inp1, 1, inp0, inp1);
+ 
+     inp0 = (v16u8) __msa_insve_d((v2i64) inp0, 1, (v2i64) inp1);
+     horiz0 = __msa_ave_u_b(inp0, res0);
+@@ -3115,7 +3104,7 @@
+     res1 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp2, inp3, mask0, mask1,
+                                                   mask2, mask3, const20,
+                                                   const6, const3);
+-    SLDI_B2_UB(inp2, inp3, inp2, inp3, inp2, inp3, 1);
++    SLDI_B2_UB(inp2, inp2, inp3, inp3, 1, inp2, inp3);
+ 
+     inp2 = (v16u8) __msa_insve_d((v2i64) inp2, 1, (v2i64) inp3);
+     horiz2 = __msa_ave_u_b(inp2, res1);
+@@ -3125,7 +3114,7 @@
+     res0 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp0, inp1, mask0, mask1,
+                                                   mask2, mask3, const20,
+                                                   const6, const3);
+-    SLDI_B2_UB(inp0, inp1, inp0, inp1, inp0, inp1, 1);
++    SLDI_B2_UB(inp0, inp0, inp1, inp1, 1, inp0, inp1);
+ 
+     inp0 = (v16u8) __msa_insve_d((v2i64) inp0, 1, (v2i64) inp1);
+     horiz4 = __msa_ave_u_b(inp0, res0);
+@@ -3137,7 +3126,7 @@
+                                                  const20, const6, const3);
+     avg0 = (v16u8) __msa_ilvr_d((v2i64) horiz1, (v2i64) horiz0);
+     res0 = __msa_ave_u_b(avg0, res0);
+-    ST8x2_UB(res0, dst, dst_stride);
++    ST_D2(res0, 0, 1, dst, dst_stride);
+     dst += (2 * dst_stride);
+ 
+     LD_UB2(src, src_stride, inp2, inp3);
+@@ -3145,7 +3134,7 @@
+     res1 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp2, inp3, mask0, mask1,
+                                                   mask2, mask3, const20,
+                                                   const6, const3);
+-    SLDI_B2_UB(inp2, inp3, inp2, inp3, inp2, inp3, 1);
++    SLDI_B2_UB(inp2, inp2, inp3, inp3, 1, inp2, inp3);
+ 
+     inp2 = (v16u8) __msa_insve_d((v2i64) inp2, 1, (v2i64) inp3);
+     horiz6 = __msa_ave_u_b(inp2, res1);
+@@ -3163,7 +3152,7 @@
+                                                  const20, const6, const3);
+     avg1 = (v16u8) __msa_ilvr_d((v2i64) horiz3, (v2i64) horiz2);
+     res1 = __msa_ave_u_b(avg1, res1);
+-    ST8x2_UB(res1, dst, dst_stride);
++    ST_D2(res1, 0, 1, dst, dst_stride);
+     dst += (2 * dst_stride);
+ 
+     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER_8BYTE(horiz4, horiz3, horiz2, horiz1,
+@@ -3173,7 +3162,7 @@
+                                                  const20, const6, const3);
+     avg0 = (v16u8) __msa_ilvr_d((v2i64) horiz5, (v2i64) horiz4);
+     res0 = __msa_ave_u_b(avg0, res0);
+-    ST8x2_UB(res0, dst, dst_stride);
++    ST_D2(res0, 0, 1, dst, dst_stride);
+     dst += (2 * dst_stride);
+ 
+     res1 = APPLY_VERT_QPEL_NO_ROUND_FILTER_8BYTE(horiz6, horiz5, horiz4, horiz3,
+@@ -3183,7 +3172,7 @@
+                                                  const20, const6, const3);
+     avg1 = (v16u8) __msa_ilvr_d((v2i64) horiz7, (v2i64) horiz6);
+     res1 = __msa_ave_u_b(avg1, res1);
+-    ST8x2_UB(res1, dst, dst_stride);
++    ST_D2(res1, 0, 1, dst, dst_stride);
+ }
+ 
+ static void hv_mc_qpel_no_rnd_aver_h_src0_16x16_msa(const uint8_t *src,
+@@ -3246,7 +3235,7 @@
+ 
+     LD_UB2(src, src_stride, inp2, inp3);
+     src += (2 * src_stride);
+-    ST8x2_UB(res0, dst, dst_stride);
++    ST_D2(res0, 0, 1, dst, dst_stride);
+     dst += 2 * dst_stride;
+ 
+     res1 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp2, inp3, mask0, mask1,
+@@ -3270,18 +3259,15 @@
+                                                  horiz5, horiz4, horiz3, horiz2,
+                                                  horiz6, horiz7, horiz8, horiz8,
+                                                  const20, const6, const3);
+-    ST8x2_UB(res1, dst, dst_stride);
+-    dst += 2 * dst_stride;
+-
+-    ST8x2_UB(res0, dst, dst_stride);
+-    dst += (2 * dst_stride);
++    ST_D4(res1, res0, 0, 1, 0, 1, dst, dst_stride);
++    dst += (4 * dst_stride);
+ 
+     res1 = APPLY_VERT_QPEL_NO_ROUND_FILTER_8BYTE(horiz6, horiz5, horiz4, horiz3,
+                                                  horiz7, horiz8, horiz8, horiz7,
+                                                  horiz7, horiz6, horiz5, horiz4,
+                                                  horiz8, horiz8, horiz7, horiz6,
+                                                  const20, const6, const3);
+-    ST8x2_UB(res1, dst, dst_stride);
++    ST_D2(res1, 0, 1, dst, dst_stride);
+ }
+ 
+ static void hv_mc_qpel_no_rnd_16x16_msa(const uint8_t *src,
+@@ -3337,7 +3323,7 @@
+                                                  const20, const6, const3);
+     LD_UB2(src, src_stride, inp2, inp3);
+     src += (2 * src_stride);
+-    ST8x2_UB(res0, dst, dst_stride);
++    ST_D2(res0, 0, 1, dst, dst_stride);
+     dst += 2 * dst_stride;
+ 
+     horiz6 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp2, inp3, mask0, mask1,
+@@ -3358,7 +3344,7 @@
+                                                  horiz5, horiz4, horiz3, horiz2,
+                                                  horiz6, horiz7, horiz8, horiz8,
+                                                  const20, const6, const3);
+-    ST8x2_UB(res1, dst, dst_stride);
++    ST_D2(res1, 0, 1, dst, dst_stride);
+     dst += 2 * dst_stride;
+ 
+ 
+@@ -3367,9 +3353,7 @@
+                                                  horiz7, horiz6, horiz5, horiz4,
+                                                  horiz8, horiz8, horiz7, horiz6,
+                                                  const20, const6, const3);
+-    ST8x2_UB(res0, dst, dst_stride);
+-    dst += 2 * dst_stride;
+-    ST8x2_UB(res1, dst, dst_stride);
++    ST_D4(res0, res1, 0, 1, 0, 1, dst, dst_stride);
+ }
+ 
+ static void hv_mc_qpel_no_rnd_aver_h_src1_16x16_msa(const uint8_t *src,
+@@ -3405,7 +3389,7 @@
+     res0 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp0, inp1, mask0, mask1,
+                                                   mask2, mask3, const20,
+                                                   const6, const3);
+-    SLDI_B2_UB(inp0, inp1, inp0, inp1, inp0, inp1, 1);
++    SLDI_B2_UB(inp0, inp0, inp1, inp1, 1, inp0, inp1);
+ 
+     inp0 = (v16u8) __msa_insve_d((v2i64) inp0, 1, (v2i64) inp1);
+     horiz0 = __msa_ave_u_b(inp0, res0);
+@@ -3415,7 +3399,7 @@
+     res1 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp2, inp3, mask0, mask1,
+                                                   mask2, mask3, const20,
+                                                   const6, const3);
+-    SLDI_B2_UB(inp2, inp3, inp2, inp3, inp2, inp3, 1);
++    SLDI_B2_UB(inp2, inp2, inp3, inp3, 1, inp2, inp3);
+ 
+     inp2 = (v16u8) __msa_insve_d((v2i64) inp2, 1, (v2i64) inp3);
+     horiz2 = __msa_ave_u_b(inp2, res1);
+@@ -3425,7 +3409,7 @@
+     res0 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp0, inp1, mask0, mask1,
+                                                   mask2, mask3, const20,
+                                                   const6, const3);
+-    SLDI_B2_UB(inp0, inp1, inp0, inp1, inp0, inp1, 1);
++    SLDI_B2_UB(inp0, inp0, inp1, inp1, 1, inp0, inp1);
+ 
+     inp0 = (v16u8) __msa_insve_d((v2i64) inp0, 1, (v2i64) inp1);
+     horiz4 = __msa_ave_u_b(inp0, res0);
+@@ -3437,13 +3421,13 @@
+                                                  const20, const6, const3);
+     LD_UB2(src, src_stride, inp2, inp3);
+     src += (2 * src_stride);
+-    ST8x2_UB(res0, dst, dst_stride);
++    ST_D2(res0, 0, 1, dst, dst_stride);
+     dst += 2 * dst_stride;
+ 
+     res1 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp2, inp3, mask0, mask1,
+                                                   mask2, mask3, const20,
+                                                   const6, const3);
+-    SLDI_B2_UB(inp2, inp3, inp2, inp3, inp2, inp3, 1);
++    SLDI_B2_UB(inp2, inp2, inp3, inp3, 1, inp2, inp3);
+ 
+     inp2 = (v16u8) __msa_insve_d((v2i64) inp2, 1, (v2i64) inp3);
+     horiz6 = __msa_ave_u_b(inp2, res1);
+@@ -3464,7 +3448,7 @@
+                                                  horiz5, horiz4, horiz3, horiz2,
+                                                  horiz6, horiz7, horiz8, horiz8,
+                                                  const20, const6, const3);
+-    ST8x2_UB(res1, dst, dst_stride);
++    ST_D2(res1, 0, 1, dst, dst_stride);
+     dst += 2 * dst_stride;
+ 
+     res1 = APPLY_VERT_QPEL_NO_ROUND_FILTER_8BYTE(horiz6, horiz5, horiz4, horiz3,
+@@ -3472,9 +3456,7 @@
+                                                  horiz7, horiz6, horiz5, horiz4,
+                                                  horiz8, horiz8, horiz7, horiz6,
+                                                  const20, const6, const3);
+-    ST8x2_UB(res0, dst, dst_stride);
+-    dst += 2 * dst_stride;
+-    ST8x2_UB(res1, dst, dst_stride);
++    ST_D4(res0, res1, 0, 1, 0, 1, dst, dst_stride);
+ }
+ 
+ static void hv_mc_qpel_no_rnd_aver_hv_src01_16x16_msa(const uint8_t *src,
+@@ -3536,7 +3518,7 @@
+                                                  const20, const6, const3);
+     avg0 = (v16u8) __msa_ilvr_d((v2i64) horiz2, (v2i64) horiz1);
+     res0 = __msa_ave_u_b(avg0, res0);
+-    ST8x2_UB(res0, dst, dst_stride);
++    ST_D2(res0, 0, 1, dst, dst_stride);
+     dst += (2 * dst_stride);
+ 
+     LD_UB2(src, src_stride, inp2, inp3);
+@@ -3564,7 +3546,7 @@
+                                                  horiz5, horiz4, horiz3, horiz2,
+                                                  horiz6, horiz7, horiz8, horiz8,
+                                                  const20, const6, const3);
+-    ST8x2_UB(res1, dst, dst_stride);
++    ST_D2(res1, 0, 1, dst, dst_stride);
+     dst += 2 * dst_stride;
+ 
+     avg0 = (v16u8) __msa_ilvr_d((v2i64) horiz6, (v2i64) horiz5);
+@@ -3575,12 +3557,12 @@
+                                                  horiz7, horiz6, horiz5, horiz4,
+                                                  horiz8, horiz8, horiz7, horiz6,
+                                                  const20, const6, const3);
+-    ST8x2_UB(res0, dst, dst_stride);
++    ST_D2(res0, 0, 1, dst, dst_stride);
+     dst += 2 * dst_stride;
+ 
+     avg1 = (v16u8) __msa_ilvr_d((v2i64) horiz8, (v2i64) horiz7);
+     res1 = __msa_ave_u_b(avg1, res1);
+-    ST8x2_UB(res1, dst, dst_stride);
++    ST_D2(res1, 0, 1, dst, dst_stride);
+ }
+ 
+ static void hv_mc_qpel_no_rnd_aver_v_src1_16x16_msa(const uint8_t *src,
+@@ -3638,7 +3620,7 @@
+     res0 = __msa_ave_u_b(avg0, res0);
+     LD_UB2(src, src_stride, inp2, inp3);
+     src += (2 * src_stride);
+-    ST8x2_UB(res0, dst, dst_stride);
++    ST_D2(res0, 0, 1, dst, dst_stride);
+     dst += 2 * dst_stride;
+ 
+     horiz6 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp2, inp3, mask0, mask1,
+@@ -3656,7 +3638,7 @@
+     horiz8 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE_1ROW(inp0, mask0, mask1,
+                                                          mask2, mask3, const20,
+                                                          const6, const3);
+-    ST8x2_UB(res1, dst, dst_stride);
++    ST_D2(res1, 0, 1, dst, dst_stride);
+     dst += 2 * dst_stride;
+ 
+     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER_8BYTE(horiz4, horiz3, horiz2, horiz1,
+@@ -3671,12 +3653,9 @@
+                                                  horiz7, horiz6, horiz5, horiz4,
+                                                  horiz8, horiz8, horiz7, horiz6,
+                                                  const20, const6, const3);
+-    ST8x2_UB(res0, dst, dst_stride);
+-    dst += 2 * dst_stride;
+-
+     avg1 = (v16u8) __msa_ilvr_d((v2i64) horiz8, (v2i64) horiz7);
+     res1 = __msa_ave_u_b(avg1, res1);
+-    ST8x2_UB(res1, dst, dst_stride);
++    ST_D4(res0, res1, 0, 1, 0, 1, dst, dst_stride);
+ }
+ 
+ static void hv_mc_qpel_no_rnd_aver_hv_src11_16x16_msa(const uint8_t *src,
+@@ -3712,7 +3691,7 @@
+     res0 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp0, inp1, mask0, mask1,
+                                                   mask2, mask3, const20,
+                                                   const6, const3);
+-    SLDI_B2_UB(inp0, inp1, inp0, inp1, inp0, inp1, 1);
++    SLDI_B2_UB(inp0, inp0, inp1, inp1, 1, inp0, inp1);
+ 
+     inp0 = (v16u8) __msa_insve_d((v2i64) inp0, 1, (v2i64) inp1);
+     horiz0 = __msa_ave_u_b(inp0, res0);
+@@ -3722,7 +3701,7 @@
+     res1 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp2, inp3, mask0, mask1,
+                                                   mask2, mask3, const20,
+                                                   const6, const3);
+-    SLDI_B2_UB(inp2, inp3, inp2, inp3, inp2, inp3, 1);
++    SLDI_B2_UB(inp2, inp2, inp3, inp3, 1, inp2, inp3);
+ 
+     inp2 = (v16u8) __msa_insve_d((v2i64) inp2, 1, (v2i64) inp3);
+     horiz2 = __msa_ave_u_b(inp2, res1);
+@@ -3733,7 +3712,7 @@
+                                                   mask2, mask3, const20,
+                                                   const6, const3);
+ 
+-    SLDI_B2_UB(inp0, inp1, inp0, inp1, inp0, inp1, 1);
++    SLDI_B2_UB(inp0, inp0, inp1, inp1, 1, inp0, inp1);
+     inp0 = (v16u8) __msa_insve_d((v2i64) inp0, 1, (v2i64) inp1);
+     horiz4 = __msa_ave_u_b(inp0, res0);
+     horiz5 = (v16u8) __msa_splati_d((v2i64) horiz4, 1);
+@@ -3744,7 +3723,7 @@
+                                                  const20, const6, const3);
+     avg0 = (v16u8) __msa_ilvr_d((v2i64) horiz2, (v2i64) horiz1);
+     res0 = __msa_ave_u_b(avg0, res0);
+-    ST8x2_UB(res0, dst, dst_stride);
++    ST_D2(res0, 0, 1, dst, dst_stride);
+     dst += (2 * dst_stride);
+ 
+     LD_UB2(src, src_stride, inp2, inp3);
+@@ -3752,7 +3731,7 @@
+     res1 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp2, inp3, mask0, mask1,
+                                                   mask2, mask3, const20,
+                                                   const6, const3);
+-    SLDI_B2_UB(inp2, inp3, inp2, inp3, inp2, inp3, 1);
++    SLDI_B2_UB(inp2, inp2, inp3, inp3, 1, inp2, inp3);
+ 
+     inp2 = (v16u8) __msa_insve_d((v2i64) inp2, 1, (v2i64) inp3);
+     horiz6 = __msa_ave_u_b(inp2, res1);
+@@ -3764,7 +3743,7 @@
+                                                  const20, const6, const3);
+     avg1 = (v16u8) __msa_ilvr_d((v2i64) horiz4, (v2i64) horiz3);
+     res1 = __msa_ave_u_b(avg1, res1);
+-    ST8x2_UB(res1, dst, dst_stride);
++    ST_D2(res1, 0, 1, dst, dst_stride);
+     dst += (2 * dst_stride);
+ 
+     inp0 = LD_UB(src);
+@@ -3787,7 +3766,7 @@
+     res0 = __msa_ave_u_b(avg0, res0);
+     avg1 = (v16u8) __msa_ilvr_d((v2i64) horiz8, (v2i64) horiz7);
+     res1 = __msa_ave_u_b(avg1, res1);
+-    ST8x4_UB(res0, res1, dst, dst_stride);
++    ST_D4(res0, res1, 0, 1, 0, 1, dst, dst_stride);
+ }
+ 
+ static void hv_mc_qpel_aver_horiz_src0_16x16_msa(const uint8_t *src,
+@@ -3893,7 +3872,7 @@
+                                         const20, const6, const3);
+     avg0 = (v16u8) __msa_ilvr_d((v2i64) horiz1, (v2i64) horiz0);
+     res0 = __msa_aver_u_b(avg0, res0);
+-    ST8x2_UB(res0, dst, dst_stride);
++    ST_D2(res0, 0, 1, dst, dst_stride);
+     dst += (2 * dst_stride);
+ 
+     LD_UB2(src, src_stride, inp2, inp3);
+@@ -3915,7 +3894,7 @@
+     res0 = APPLY_HORIZ_QPEL_FILTER_8BYTE_1ROW(inp0, mask0, mask1, mask2, mask3,
+                                               const20, const6, const3);
+     horiz8 = __msa_aver_u_b(inp0, res0);
+-    ST8x2_UB(res1, dst, dst_stride);
++    ST_D2(res1, 0, 1, dst, dst_stride);
+     dst += 2 * dst_stride;
+ 
+     res0 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz4, horiz3, horiz2, horiz1,
+@@ -3930,11 +3909,9 @@
+                                         horiz7, horiz6, horiz5, horiz4,
+                                         horiz8, horiz8, horiz7, horiz6,
+                                         const20, const6, const3);
+-    ST8x2_UB(res0, dst, dst_stride);
+-    dst += 2 * dst_stride;
+     avg1 = (v16u8) __msa_ilvr_d((v2i64) horiz7, (v2i64) horiz6);
+     res1 = __msa_aver_u_b(avg1, res1);
+-    ST8x2_UB(res1, dst, dst_stride);
++    ST_D4(res0, res1, 0, 1, 0, 1, dst, dst_stride);
+ }
+ 
+ static void hv_mc_qpel_aver_horiz_16x16_msa(const uint8_t *src,
+@@ -4034,7 +4011,7 @@
+                                         const20, const6, const3);
+     avg0 = (v16u8) __msa_ilvr_d((v2i64) horiz1, (v2i64) horiz0);
+     res0 = __msa_aver_u_b(avg0, res0);
+-    ST8x2_UB(res0, dst, dst_stride);
++    ST_D2(res0, 0, 1, dst, dst_stride);
+     dst += (2 * dst_stride);
+ 
+     LD_UB2(src, src_stride, inp2, inp3);
+@@ -4059,7 +4036,7 @@
+                                         horiz5, horiz4, horiz3, horiz2,
+                                         horiz6, horiz7, horiz8, horiz8,
+                                         const20, const6, const3);
+-    ST8x2_UB(res1, dst, dst_stride);
++    ST_D2(res1, 0, 1, dst, dst_stride);
+     dst += 2 * dst_stride;
+ 
+     avg0 = (v16u8) __msa_ilvr_d((v2i64) horiz5, (v2i64) horiz4);
+@@ -4069,11 +4046,9 @@
+                                         horiz7, horiz6, horiz5, horiz4,
+                                         horiz8, horiz8, horiz7, horiz6,
+                                         const20, const6, const3);
+-    ST8x2_UB(res0, dst, dst_stride);
+-    dst += 2 * dst_stride;
+     avg1 = (v16u8) __msa_ilvr_d((v2i64) horiz7, (v2i64) horiz6);
+     res1 = __msa_aver_u_b(avg1, res1);
+-    ST8x2_UB(res1, dst, dst_stride);
++    ST_D4(res0, res1, 0, 1, 0, 1, dst, dst_stride);
+ }
+ 
+ static void hv_mc_qpel_aver_horiz_src1_16x16_msa(const uint8_t *src,
+@@ -4159,12 +4134,12 @@
+                                          const20, const6, const3);
+     res1 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp2, inp3, mask0, mask1, mask2, mask3,
+                                          const20, const6, const3);
+-    SLDI_B2_UB(inp0, inp1, inp0, inp1, inp0, inp1, 1);
++    SLDI_B2_UB(inp0, inp0, inp1, inp1, 1, inp0, inp1);
+ 
+     inp0 = (v16u8) __msa_insve_d((v2i64) inp0, 1, (v2i64) inp1);
+     horiz0 = __msa_aver_u_b(inp0, res0);
+     horiz1 = (v16u8) __msa_splati_d((v2i64) horiz0, 1);
+-    SLDI_B2_UB(inp2, inp3, inp2, inp3, inp2, inp3, 1);
++    SLDI_B2_UB(inp2, inp2, inp3, inp3, 1, inp2, inp3);
+ 
+     inp2 = (v16u8) __msa_insve_d((v2i64) inp2, 1, (v2i64) inp3);
+     horiz2 = __msa_aver_u_b(inp2, res1);
+@@ -4175,12 +4150,12 @@
+                                          const20, const6, const3);
+     res1 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp2, inp3, mask0, mask1, mask2, mask3,
+                                          const20, const6, const3);
+-    SLDI_B2_UB(inp0, inp1, inp0, inp1, inp0, inp1, 1);
++    SLDI_B2_UB(inp0, inp0, inp1, inp1, 1, inp0, inp1);
+ 
+     inp0 = (v16u8) __msa_insve_d((v2i64) inp0, 1, (v2i64) inp1);
+     horiz4 = __msa_aver_u_b(inp0, res0);
+     horiz5 = (v16u8) __msa_splati_d((v2i64) horiz4, 1);
+-    SLDI_B2_UB(inp2, inp3, inp2, inp3, inp2, inp3, 1);
++    SLDI_B2_UB(inp2, inp2, inp3, inp3, 1, inp2, inp3);
+ 
+     inp2 = (v16u8) __msa_insve_d((v2i64) inp2, 1, (v2i64) inp3);
+     horiz6 = __msa_aver_u_b(inp2, res1);
+@@ -4197,7 +4172,7 @@
+                                         horiz3, horiz2, horiz1, horiz0,
+                                         horiz4, horiz5, horiz6, horiz7,
+                                         const20, const6, const3);
+-    ST8x2_UB(res0, dst, dst_stride);
++    ST_D2(res0, 0, 1, dst, dst_stride);
+     dst += 2 * dst_stride;
+ 
+     inp0 = LD_UB(src);
+@@ -4212,7 +4187,7 @@
+                                         horiz5, horiz4, horiz3, horiz2,
+                                         horiz6, horiz7, horiz8, horiz8,
+                                         const20, const6, const3);
+-    ST8x2_UB(res1, dst, dst_stride);
++    ST_D2(res1, 0, 1, dst, dst_stride);
+     dst += 2 * dst_stride;
+ 
+     avg0 = (v16u8) __msa_ilvr_d((v2i64) horiz5, (v2i64) horiz4);
+@@ -4222,12 +4197,9 @@
+                                         horiz7, horiz6, horiz5, horiz4,
+                                         horiz8, horiz8, horiz7, horiz6,
+                                         const20, const6, const3);
+-    ST8x2_UB(res0, dst, dst_stride);
+-    dst += 2 * dst_stride;
+-
+     avg1 = (v16u8) __msa_ilvr_d((v2i64) horiz7, (v2i64) horiz6);
+     res1 = __msa_aver_u_b(avg1, res1);
+-    ST8x2_UB(res1, dst, dst_stride);
++    ST_D4(res0, res1, 0, 1, 0, 1, dst, dst_stride);
+ }
+ 
+ static void hv_mc_qpel_aver_h_src0_16x16_msa(const uint8_t *src,
+@@ -4285,7 +4257,7 @@
+                                         horiz1, horiz0, horiz0, horiz1,
+                                         horiz2, horiz3, horiz4, horiz5,
+                                         const20, const6, const3);
+-    ST8x2_UB(res0, dst, dst_stride);
++    ST_D2(res0, 0, 1, dst, dst_stride);
+     dst += (2 * dst_stride);
+ 
+     LD_UB2(src, src_stride, inp2, inp3);
+@@ -4309,7 +4281,7 @@
+                                         horiz5, horiz4, horiz3, horiz2,
+                                         horiz6, horiz7, horiz8, horiz8,
+                                         const20, const6, const3);
+-    ST8x2_UB(res1, dst, dst_stride);
++    ST_D2(res1, 0, 1, dst, dst_stride);
+     dst += 2 * dst_stride;
+ 
+     res1 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz6, horiz5, horiz4, horiz3,
+@@ -4317,9 +4289,7 @@
+                                         horiz7, horiz6, horiz5, horiz4,
+                                         horiz8, horiz8, horiz7, horiz6,
+                                         const20, const6, const3);
+-    ST8x2_UB(res0, dst, dst_stride);
+-    dst += 2 * dst_stride;
+-    ST8x2_UB(res1, dst, dst_stride);
++    ST_D4(res0, res1, 0, 1, 0, 1, dst, dst_stride);
+ }
+ 
+ static void hv_mc_qpel_16x16_msa(const uint8_t *src,
+@@ -4371,7 +4341,7 @@
+                                         horiz1, horiz0, horiz0, horiz1,
+                                         horiz2, horiz3, horiz4, horiz5,
+                                         const20, const6, const3);
+-    ST8x2_UB(res0, dst, dst_stride);
++    ST_D2(res0, 0, 1, dst, dst_stride);
+     dst += (2 * dst_stride);
+ 
+     LD_UB2(src, src_stride, inp2, inp3);
+@@ -4389,7 +4359,7 @@
+     horiz8 = APPLY_HORIZ_QPEL_FILTER_8BYTE_1ROW(inp0,
+                                                 mask0, mask1, mask2, mask3,
+                                                 const20, const6, const3);
+-    ST8x2_UB(res1, dst, dst_stride);
++    ST_D2(res1, 0, 1, dst, dst_stride);
+     dst += 2 * dst_stride;
+ 
+     res0 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz4, horiz3, horiz2, horiz1,
+@@ -4402,9 +4372,7 @@
+                                         horiz7, horiz6, horiz5, horiz4,
+                                         horiz8, horiz8, horiz7, horiz6,
+                                         const20, const6, const3);
+-    ST8x2_UB(res0, dst, dst_stride);
+-    dst += 2 * dst_stride;
+-    ST8x2_UB(res1, dst, dst_stride);
++    ST_D4(res0, res1, 0, 1, 0, 1, dst, dst_stride);
+ }
+ 
+ static void hv_mc_qpel_aver_h_src1_16x16_msa(const uint8_t *src,
+@@ -4442,12 +4410,12 @@
+                                          const20, const6, const3);
+     res1 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp2, inp3, mask0, mask1, mask2, mask3,
+                                          const20, const6, const3);
+-    SLDI_B2_UB(inp0, inp1, inp0, inp1, inp0, inp1, 1);
++    SLDI_B2_UB(inp0, inp0, inp1, inp1, 1, inp0, inp1);
+ 
+     inp0 = (v16u8) __msa_insve_d((v2i64) inp0, 1, (v2i64) inp1);
+     horiz0 = __msa_aver_u_b(inp0, res0);
+     horiz1 = (v16u8) __msa_splati_d((v2i64) horiz0, 1);
+-    SLDI_B2_UB(inp2, inp3, inp2, inp3, inp2, inp3, 1);
++    SLDI_B2_UB(inp2, inp2, inp3, inp3, 1, inp2, inp3);
+ 
+     inp2 = (v16u8) __msa_insve_d((v2i64) inp2, 1, (v2i64) inp3);
+     horiz2 = __msa_aver_u_b(inp2, res1);
+@@ -4458,12 +4426,12 @@
+                                          const20, const6, const3);
+     res1 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp2, inp3, mask0, mask1, mask2, mask3,
+                                          const20, const6, const3);
+-    SLDI_B2_UB(inp0, inp1, inp0, inp1, inp0, inp1, 1);
++    SLDI_B2_UB(inp0, inp0, inp1, inp1, 1, inp0, inp1);
+ 
+     inp0 = (v16u8) __msa_insve_d((v2i64) inp0, 1, (v2i64) inp1);
+     horiz4 = __msa_aver_u_b(inp0, res0);
+     horiz5 = (v16u8) __msa_splati_d((v2i64) horiz4, 1);
+-    SLDI_B2_UB(inp2, inp3, inp2, inp3, inp2, inp3, 1);
++    SLDI_B2_UB(inp2, inp2, inp3, inp3, 1, inp2, inp3);
+ 
+     inp2 = (v16u8) __msa_insve_d((v2i64) inp2, 1, (v2i64) inp3);
+     horiz6 = __msa_aver_u_b(inp2, res1);
+@@ -4478,31 +4446,25 @@
+                                         horiz1, horiz0, horiz0, horiz1,
+                                         horiz2, horiz3, horiz4, horiz5,
+                                         const20, const6, const3);
+-    ST8x2_UB(res0, dst, dst_stride);
+-    dst += (2 * dst_stride);
+-
+     res1 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz2, horiz1, horiz0, horiz0,
+                                         horiz3, horiz4, horiz5, horiz6,
+                                         horiz3, horiz2, horiz1, horiz0,
+                                         horiz4, horiz5, horiz6, horiz7,
+                                         const20, const6, const3);
+-    ST8x2_UB(res1, dst, dst_stride);
+-    dst += (2 * dst_stride);
++    ST_D4(res0, res1, 0, 1, 0, 1, dst, dst_stride);
++    dst += (4 * dst_stride);
+ 
+     res0 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz4, horiz3, horiz2, horiz1,
+                                         horiz5, horiz6, horiz7, horiz8,
+                                         horiz5, horiz4, horiz3, horiz2,
+                                         horiz6, horiz7, horiz8, horiz8,
+                                         const20, const6, const3);
+-    ST8x2_UB(res0, dst, dst_stride);
+-    dst += (2 * dst_stride);
+-
+     res1 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz6, horiz5, horiz4, horiz3,
+                                         horiz7, horiz8, horiz8, horiz7,
+                                         horiz7, horiz6, horiz5, horiz4,
+                                         horiz8, horiz8, horiz7, horiz6,
+                                         const20, const6, const3);
+-    ST8x2_UB(res1, dst, dst_stride);
++    ST_D4(res0, res1, 0, 1, 0, 1, dst, dst_stride);
+ }
+ 
+ static void hv_mc_qpel_aver_hv_src01_16x16_msa(const uint8_t *src,
+@@ -4561,7 +4523,7 @@
+                                         const20, const6, const3);
+     avg0 = (v16u8) __msa_insve_d((v2i64) horiz1, 1, (v2i64) horiz2);
+     res0 = __msa_aver_u_b(avg0, res0);
+-    ST8x2_UB(res0, dst, dst_stride);
++    ST_D2(res0, 0, 1, dst, dst_stride);
+     dst += (2 * dst_stride);
+ 
+     LD_UB2(src, src_stride, inp2, inp3);
+@@ -4587,7 +4549,7 @@
+                                         horiz5, horiz4, horiz3, horiz2,
+                                         horiz6, horiz7, horiz8, horiz8,
+                                         const20, const6, const3);
+-    ST8x2_UB(res1, dst, dst_stride);
++    ST_D2(res1, 0, 1, dst, dst_stride);
+     dst += 2 * dst_stride;
+ 
+     avg0 = (v16u8) __msa_insve_d((v2i64) horiz5, 1, (v2i64) horiz6);
+@@ -4597,13 +4559,9 @@
+                                         horiz7, horiz6, horiz5, horiz4,
+                                         horiz8, horiz8, horiz7, horiz6,
+                                         const20, const6, const3);
+-    ST8x2_UB(res0, dst, dst_stride);
+-    dst += 2 * dst_stride;
+-
+     avg1 = (v16u8) __msa_insve_d((v2i64) horiz7, 1, (v2i64) horiz8);
+     res1 = __msa_aver_u_b(avg1, res1);
+-    ST8x2_UB(res1, dst, dst_stride);
+-    dst += (2 * dst_stride);
++    ST_D4(res0, res1, 0, 1, 0, 1, dst, dst_stride);
+ }
+ 
+ static void hv_mc_qpel_aver_v_src1_16x16_msa(const uint8_t *src,
+@@ -4660,7 +4618,7 @@
+                                         const20, const6, const3);
+     avg0 = (v16u8) __msa_insve_d((v2i64) horiz1, 1, (v2i64) horiz2);
+     res0 = __msa_aver_u_b(avg0, res0);
+-    ST8x2_UB(res0, dst, dst_stride);
++    ST_D2(res0, 0, 1, dst, dst_stride);
+     dst += (2 * dst_stride);
+ 
+     LD_UB2(src, src_stride, inp2, inp3);
+@@ -4685,7 +4643,7 @@
+                                         horiz5, horiz4, horiz3, horiz2,
+                                         horiz6, horiz7, horiz8, horiz8,
+                                         const20, const6, const3);
+-    ST8x2_UB(res1, dst, dst_stride);
++    ST_D2(res1, 0, 1, dst, dst_stride);
+     dst += 2 * dst_stride;
+     avg0 = (v16u8) __msa_insve_d((v2i64) horiz5, 1, (v2i64) horiz6);
+     res0 = __msa_aver_u_b(avg0, res0);
+@@ -4695,11 +4653,9 @@
+                                         horiz7, horiz6, horiz5, horiz4,
+                                         horiz8, horiz8, horiz7, horiz6,
+                                         const20, const6, const3);
+-    ST8x2_UB(res0, dst, dst_stride);
+-    dst += 2 * dst_stride;
+     avg1 = (v16u8) __msa_insve_d((v2i64) horiz7, 1, (v2i64) horiz8);
+     res1 = __msa_aver_u_b(avg1, res1);
+-    ST8x2_UB(res1, dst, dst_stride);
++    ST_D4(res0, res1, 0, 1, 0, 1, dst, dst_stride);
+ }
+ 
+ static void hv_mc_qpel_aver_hv_src11_16x16_msa(const uint8_t *src,
+@@ -4734,14 +4690,14 @@
+     res0 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp0, inp1,
+                                          mask0, mask1, mask2, mask3,
+                                          const20, const6, const3);
+-    SLDI_B2_UB(inp0, inp1, inp0, inp1, inp0, inp1, 1);
++    SLDI_B2_UB(inp0, inp0, inp1, inp1, 1, inp0, inp1);
+ 
+     inp0 = (v16u8) __msa_insve_d((v2i64) inp0, 1, (v2i64) inp1);
+     horiz0 = __msa_aver_u_b(inp0, res0);
+     horiz1 = (v16u8) __msa_splati_d((v2i64) horiz0, 1);
+     res1 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp2, inp3, mask0, mask1, mask2, mask3,
+                                          const20, const6, const3);
+-    SLDI_B2_UB(inp2, inp3, inp2, inp3, inp2, inp3, 1);
++    SLDI_B2_UB(inp2, inp2, inp3, inp3, 1, inp2, inp3);
+ 
+     inp2 = (v16u8) __msa_insve_d((v2i64) inp2, 1, (v2i64) inp3);
+     horiz2 = __msa_aver_u_b(inp2, res1);
+@@ -4750,7 +4706,7 @@
+     src += (2 * src_stride);
+     res0 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp0, inp1, mask0, mask1, mask2, mask3,
+                                          const20, const6, const3);
+-    SLDI_B2_UB(inp0, inp1, inp0, inp1, inp0, inp1, 1);
++    SLDI_B2_UB(inp0, inp0, inp1, inp1, 1, inp0, inp1);
+ 
+     inp0 = (v16u8) __msa_insve_d((v2i64) inp0, 1, (v2i64) inp1);
+     horiz4 = __msa_aver_u_b(inp0, res0);
+@@ -4764,12 +4720,12 @@
+     res0 = __msa_aver_u_b(avg0, res0);
+     LD_UB2(src, src_stride, inp2, inp3);
+     src += (2 * src_stride);
+-    ST8x2_UB(res0, dst, dst_stride);
++    ST_D2(res0, 0, 1, dst, dst_stride);
+     dst += 2 * dst_stride;
+ 
+     res1 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp2, inp3, mask0, mask1, mask2, mask3,
+                                          const20, const6, const3);
+-    SLDI_B2_UB(inp2, inp3, inp2, inp3, inp2, inp3, 1);
++    SLDI_B2_UB(inp2, inp2, inp3, inp3, 1, inp2, inp3);
+ 
+     inp2 = (v16u8) __msa_insve_d((v2i64) inp2, 1, (v2i64) inp3);
+     horiz6 = __msa_aver_u_b(inp2, res1);
+@@ -4791,7 +4747,7 @@
+                                         horiz5, horiz4, horiz3, horiz2,
+                                         horiz6, horiz7, horiz8, horiz8,
+                                         const20, const6, const3);
+-    ST8x2_UB(res1, dst, dst_stride);
++    ST_D2(res1, 0, 1, dst, dst_stride);
+     dst += 2 * dst_stride;
+ 
+     avg0 = (v16u8) __msa_ilvr_d((v2i64) horiz6, (v2i64) horiz5);
+@@ -4801,12 +4757,9 @@
+                                         horiz7, horiz6, horiz5, horiz4,
+                                         horiz8, horiz8, horiz7, horiz6,
+                                         const20, const6, const3);
+-    ST8x2_UB(res0, dst, dst_stride);
+-    dst += 2 * dst_stride;
+-
+     avg1 = (v16u8) __msa_ilvr_d((v2i64) horiz8, (v2i64) horiz7);
+     res1 = __msa_aver_u_b(avg1, res1);
+-    ST8x2_UB(res1, dst, dst_stride);
++    ST_D4(res0, res1, 0, 1, 0, 1, dst, dst_stride);
+ }
+ 
+ static void hv_mc_qpel_avg_dst_aver_hv_src00_16x16_msa(const uint8_t *src,
+@@ -4869,7 +4822,7 @@
+     res0 = __msa_aver_u_b(avg0, res0);
+     avg0 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
+     res0 = __msa_aver_u_b(avg0, res0);
+-    ST8x2_UB(res0, dst, dst_stride);
++    ST_D2(res0, 0, 1, dst, dst_stride);
+     dst += (2 * dst_stride);
+ 
+     LD_UB2(src, src_stride, inp2, inp3);
+@@ -4889,7 +4842,7 @@
+     res1 = __msa_aver_u_b(avg1, res1);
+     avg1 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
+     res1 = __msa_aver_u_b(avg1, res1);
+-    ST8x2_UB(res1, dst, dst_stride);
++    ST_D2(res1, 0, 1, dst, dst_stride);
+     dst += (2 * dst_stride);
+ 
+     inp0 = LD_UB(src);
+@@ -4906,7 +4859,7 @@
+     res0 = __msa_aver_u_b(avg0, res0);
+     avg0 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
+     res0 = __msa_aver_u_b(avg0, res0);
+-    ST8x2_UB(res0, dst, dst_stride);
++    ST_D2(res0, 0, 1, dst, dst_stride);
+     dst += (2 * dst_stride);
+ 
+     LD_UB2(dst, dst_stride, dst0, dst1);
+@@ -4919,7 +4872,7 @@
+     res1 = __msa_aver_u_b(avg1, res1);
+     avg1 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
+     res1 = __msa_aver_u_b(avg1, res1);
+-    ST8x2_UB(res1, dst, dst_stride);
++    ST_D2(res1, 0, 1, dst, dst_stride);
+ }
+ 
+ static void hv_mc_qpel_avg_dst_aver_v_src0_16x16_msa(const uint8_t *src,
+@@ -4979,7 +4932,7 @@
+     res0 = __msa_aver_u_b(avg0, res0);
+     avg0 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
+     res0 = __msa_aver_u_b(avg0, res0);
+-    ST8x2_UB(res0, dst, dst_stride);
++    ST_D2(res0, 0, 1, dst, dst_stride);
+     dst += (2 * dst_stride);
+ 
+     LD_UB2(src, src_stride, inp2, inp3);
+@@ -4998,7 +4951,7 @@
+     res1 = __msa_aver_u_b(avg1, res1);
+     avg1 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
+     res1 = __msa_aver_u_b(avg1, res1);
+-    ST8x2_UB(res1, dst, dst_stride);
++    ST_D2(res1, 0, 1, dst, dst_stride);
+     dst += (2 * dst_stride);
+ 
+     inp0 = LD_UB(src);
+@@ -5015,7 +4968,7 @@
+     res0 = __msa_aver_u_b(avg0, res0);
+     avg0 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
+     res0 = __msa_aver_u_b(avg0, res0);
+-    ST8x2_UB(res0, dst, dst_stride);
++    ST_D2(res0, 0, 1, dst, dst_stride);
+     dst += (2 * dst_stride);
+ 
+     LD_UB2(dst, dst_stride, dst0, dst1);
+@@ -5028,7 +4981,7 @@
+     res1 = __msa_aver_u_b(avg1, res1);
+     avg1 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
+     res1 = __msa_aver_u_b(avg1, res1);
+-    ST8x2_UB(res1, dst, dst_stride);
++    ST_D2(res1, 0, 1, dst, dst_stride);
+ }
+ 
+ static void hv_mc_qpel_avg_dst_aver_hv_src10_16x16_msa(const uint8_t *src,
+@@ -5067,7 +5020,7 @@
+ 
+     LD_UB2(src, src_stride, inp2, inp3);
+     src += (2 * src_stride);
+-    SLDI_B2_UB(inp0, inp1, inp0, inp1, inp0, inp1, 1);
++    SLDI_B2_UB(inp0, inp0, inp1, inp1, 1, inp0, inp1);
+ 
+     inp0 = (v16u8) __msa_ilvr_d((v2i64) inp1, (v2i64) inp0);
+     horiz0 = __msa_aver_u_b(inp0, res0);
+@@ -5076,7 +5029,7 @@
+                                          const20, const6, const3);
+     LD_UB2(src, src_stride, inp0, inp1);
+     src += (2 * src_stride);
+-    SLDI_B2_UB(inp2, inp3, inp2, inp3, inp2, inp3, 1);
++    SLDI_B2_UB(inp2, inp2, inp3, inp3, 1, inp2, inp3);
+ 
+     inp2 = (v16u8) __msa_ilvr_d((v2i64) inp3, (v2i64) inp2);
+     horiz2 = __msa_aver_u_b(inp2, res1);
+@@ -5084,7 +5037,7 @@
+     res0 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp0, inp1, mask0, mask1, mask2, mask3,
+                                          const20, const6, const3);
+ 
+-    SLDI_B2_UB(inp0, inp1, inp0, inp1, inp0, inp1, 1);
++    SLDI_B2_UB(inp0, inp0, inp1, inp1, 1, inp0, inp1);
+ 
+     inp0 = (v16u8) __msa_ilvr_d((v2i64) inp1, (v2i64) inp0);
+     horiz4 = __msa_aver_u_b(inp0, res0);
+@@ -5099,7 +5052,7 @@
+     res0 = __msa_aver_u_b(avg0, res0);
+     avg0 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
+     res0 = __msa_aver_u_b(avg0, res0);
+-    ST8x2_UB(res0, dst, dst_stride);
++    ST_D2(res0, 0, 1, dst, dst_stride);
+     dst += (2 * dst_stride);
+ 
+     LD_UB2(src, src_stride, inp2, inp3);
+@@ -5107,7 +5060,7 @@
+     res1 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp2, inp3, mask0, mask1, mask2, mask3,
+                                          const20, const6, const3);
+ 
+-    SLDI_B2_UB(inp2, inp3, inp2, inp3, inp2, inp3, 1);
++    SLDI_B2_UB(inp2, inp2, inp3, inp3, 1, inp2, inp3);
+ 
+     inp2 = (v16u8) __msa_ilvr_d((v2i64) inp3, (v2i64) inp2);
+     horiz6 = __msa_aver_u_b(inp2, res1);
+@@ -5122,7 +5075,7 @@
+     res1 = __msa_aver_u_b(avg1, res1);
+     avg1 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
+     res1 = __msa_aver_u_b(avg1, res1);
+-    ST8x2_UB(res1, dst, dst_stride);
++    ST_D2(res1, 0, 1, dst, dst_stride);
+     dst += (2 * dst_stride);
+ 
+     inp0 = LD_UB(src);
+@@ -5140,7 +5093,7 @@
+     res0 = __msa_aver_u_b(avg0, res0);
+     avg0 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
+     res0 = __msa_aver_u_b(avg0, res0);
+-    ST8x2_UB(res0, dst, dst_stride);
++    ST_D2(res0, 0, 1, dst, dst_stride);
+     dst += (2 * dst_stride);
+ 
+     LD_UB2(dst, dst_stride, dst0, dst1);
+@@ -5153,7 +5106,7 @@
+     res1 = __msa_aver_u_b(avg1, res1);
+     avg1 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
+     res1 = __msa_aver_u_b(avg1, res1);
+-    ST8x2_UB(res1, dst, dst_stride);
++    ST_D2(res1, 0, 1, dst, dst_stride);
+ }
+ 
+ static void hv_mc_qpel_avg_dst_aver_h_src0_16x16_msa(const uint8_t *src,
+@@ -5214,7 +5167,7 @@
+                                         const20, const6, const3);
+     avg0 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
+     res0 = __msa_aver_u_b(avg0, res0);
+-    ST8x2_UB(res0, dst, dst_stride);
++    ST_D2(res0, 0, 1, dst, dst_stride);
+     dst += (2 * dst_stride);
+ 
+     LD_UB2(src, src_stride, inp2, inp3);
+@@ -5232,7 +5185,7 @@
+                                         const20, const6, const3);
+     avg1 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
+     res1 = __msa_aver_u_b(avg1, res1);
+-    ST8x2_UB(res1, dst, dst_stride);
++    ST_D2(res1, 0, 1, dst, dst_stride);
+     dst += (2 * dst_stride);
+ 
+     inp0 = LD_UB(src);
+@@ -5247,7 +5200,7 @@
+                                         const20, const6, const3);
+     avg0 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
+     res0 = __msa_aver_u_b(avg0, res0);
+-    ST8x2_UB(res0, dst, dst_stride);
++    ST_D2(res0, 0, 1, dst, dst_stride);
+     dst += (2 * dst_stride);
+ 
+     LD_UB2(dst, dst_stride, dst0, dst1);
+@@ -5258,8 +5211,7 @@
+                                         const20, const6, const3);
+     avg1 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
+     res1 = __msa_aver_u_b(avg1, res1);
+-    ST8x2_UB(res1, dst, dst_stride);
+-    dst += (2 * dst_stride);
++    ST_D2(res1, 0, 1, dst, dst_stride);
+ }
+ 
+ static void hv_mc_qpel_avg_dst_16x16_msa(const uint8_t *src, int32_t src_stride,
+@@ -5324,7 +5276,7 @@
+                                         const20, const6, const3);
+     avg0 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
+     res0 = __msa_aver_u_b(avg0, res0);
+-    ST8x2_UB(res0, dst, dst_stride);
++    ST_D2(res0, 0, 1, dst, dst_stride);
+     dst += (2 * dst_stride);
+ 
+     LD_UB2(dst, dst_stride, dst0, dst1);
+@@ -5335,7 +5287,7 @@
+                                         const20, const6, const3);
+     avg1 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
+     res1 = __msa_aver_u_b(avg1, res1);
+-    ST8x2_UB(res1, dst, dst_stride);
++    ST_D2(res1, 0, 1, dst, dst_stride);
+     dst += (2 * dst_stride);
+ 
+     LD_UB2(dst, dst_stride, dst0, dst1);
+@@ -5346,7 +5298,7 @@
+                                         const20, const6, const3);
+     avg0 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
+     res0 = __msa_aver_u_b(avg0, res0);
+-    ST8x2_UB(res0, dst, dst_stride);
++    ST_D2(res0, 0, 1, dst, dst_stride);
+     dst += (2 * dst_stride);
+ 
+     LD_UB2(dst, dst_stride, dst0, dst1);
+@@ -5357,7 +5309,7 @@
+                                         const20, const6, const3);
+     avg1 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
+     res1 = __msa_aver_u_b(avg1, res1);
+-    ST8x2_UB(res1, dst, dst_stride);
++    ST_D2(res1, 0, 1, dst, dst_stride);
+ }
+ 
+ static void hv_mc_qpel_avg_dst_aver_h_src1_16x16_msa(const uint8_t *src,
+@@ -5395,7 +5347,7 @@
+                                          const20, const6, const3);
+     LD_UB2(src, src_stride, inp2, inp3);
+     src += (2 * src_stride);
+-    SLDI_B2_UB(inp0, inp1, inp0, inp1, inp0, inp1, 1);
++    SLDI_B2_UB(inp0, inp0, inp1, inp1, 1, inp0, inp1);
+ 
+     inp0 = (v16u8) __msa_ilvr_d((v2i64) inp1, (v2i64) inp0);
+     horiz0 = __msa_aver_u_b(inp0, res0);
+@@ -5404,7 +5356,7 @@
+                                          const20, const6, const3);
+     LD_UB2(src, src_stride, inp0, inp1);
+     src += (2 * src_stride);
+-    SLDI_B2_UB(inp2, inp3, inp2, inp3, inp2, inp3, 1);
++    SLDI_B2_UB(inp2, inp2, inp3, inp3, 1, inp2, inp3);
+ 
+     inp2 = (v16u8) __msa_ilvr_d((v2i64) inp3, (v2i64) inp2);
+     horiz2 = __msa_aver_u_b(inp2, res1);
+@@ -5412,7 +5364,7 @@
+     res0 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp0, inp1, mask0, mask1, mask2, mask3,
+                                          const20, const6, const3);
+ 
+-    SLDI_B2_UB(inp0, inp1, inp0, inp1, inp0, inp1, 1);
++    SLDI_B2_UB(inp0, inp0, inp1, inp1, 1, inp0, inp1);
+ 
+     inp0 = (v16u8) __msa_ilvr_d((v2i64) inp1, (v2i64) inp0);
+     horiz4 = __msa_aver_u_b(inp0, res0);
+@@ -5425,7 +5377,7 @@
+                                         const20, const6, const3);
+     avg0 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
+     res0 = __msa_aver_u_b(avg0, res0);
+-    ST8x2_UB(res0, dst, dst_stride);
++    ST_D2(res0, 0, 1, dst, dst_stride);
+     dst += (2 * dst_stride);
+ 
+     LD_UB2(src, src_stride, inp2, inp3);
+@@ -5433,7 +5385,7 @@
+     res1 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp2, inp3, mask0, mask1, mask2, mask3,
+                                          const20, const6, const3);
+ 
+-    SLDI_B2_UB(inp2, inp3, inp2, inp3, inp2, inp3, 1);
++    SLDI_B2_UB(inp2, inp2, inp3, inp3, 1, inp2, inp3);
+ 
+     inp2 = (v16u8) __msa_ilvr_d((v2i64) inp3, (v2i64) inp2);
+     horiz6 = __msa_aver_u_b(inp2, res1);
+@@ -5446,7 +5398,7 @@
+                                         const20, const6, const3);
+     avg1 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
+     res1 = __msa_aver_u_b(avg1, res1);
+-    ST8x2_UB(res1, dst, dst_stride);
++    ST_D2(res1, 0, 1, dst, dst_stride);
+     dst += (2 * dst_stride);
+ 
+     inp0 = LD_UB(src);
+@@ -5462,7 +5414,7 @@
+                                         const20, const6, const3);
+     avg0 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
+     res0 = __msa_aver_u_b(avg0, res0);
+-    ST8x2_UB(res0, dst, dst_stride);
++    ST_D2(res0, 0, 1, dst, dst_stride);
+     dst += (2 * dst_stride);
+ 
+     LD_UB2(dst, dst_stride, dst0, dst1);
+@@ -5473,7 +5425,7 @@
+                                         const20, const6, const3);
+     avg1 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
+     res1 = __msa_aver_u_b(avg1, res1);
+-    ST8x2_UB(res1, dst, dst_stride);
++    ST_D2(res1, 0, 1, dst, dst_stride);
+ }
+ 
+ static void hv_mc_qpel_avg_dst_aver_hv_src01_16x16_msa(const uint8_t *src,
+@@ -5537,7 +5489,7 @@
+     res0 = __msa_aver_u_b(avg0, res0);
+     avg0 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
+     res0 = __msa_aver_u_b(avg0, res0);
+-    ST8x2_UB(res0, dst, dst_stride);
++    ST_D2(res0, 0, 1, dst, dst_stride);
+     dst += (2 * dst_stride);
+ 
+     LD_UB2(dst, dst_stride, dst0, dst1);
+@@ -5557,7 +5509,7 @@
+     res1 = __msa_aver_u_b(avg1, res1);
+     avg1 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
+     res1 = __msa_aver_u_b(avg1, res1);
+-    ST8x2_UB(res1, dst, dst_stride);
++    ST_D2(res1, 0, 1, dst, dst_stride);
+     dst += (2 * dst_stride);
+ 
+     inp0 = LD_UB(src);
+@@ -5579,7 +5531,7 @@
+     LD_UB2(dst, dst_stride, dst0, dst1);
+     avg0 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
+     res0 = __msa_aver_u_b(avg0, res0);
+-    ST8x2_UB(res0, dst, dst_stride);
++    ST_D2(res0, 0, 1, dst, dst_stride);
+     dst += (2 * dst_stride);
+ 
+     avg1 = (v16u8) __msa_ilvr_d((v2i64) horiz8, (v2i64) horiz7);
+@@ -5587,7 +5539,7 @@
+     LD_UB2(dst, dst_stride, dst0, dst1);
+     avg1 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
+     res1 = __msa_aver_u_b(avg1, res1);
+-    ST8x2_UB(res1, dst, dst_stride);
++    ST_D2(res1, 0, 1, dst, dst_stride);
+ }
+ 
+ static void hv_mc_qpel_avg_dst_aver_v_src1_16x16_msa(const uint8_t *src,
+@@ -5647,7 +5599,7 @@
+     res0 = __msa_aver_u_b(avg0, res0);
+     avg0 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
+     res0 = __msa_aver_u_b(avg0, res0);
+-    ST8x2_UB(res0, dst, dst_stride);
++    ST_D2(res0, 0, 1, dst, dst_stride);
+     dst += (2 * dst_stride);
+ 
+     LD_UB2(dst, dst_stride, dst0, dst1);
+@@ -5666,7 +5618,7 @@
+     res1 = __msa_aver_u_b(avg1, res1);
+     avg1 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
+     res1 = __msa_aver_u_b(avg1, res1);
+-    ST8x2_UB(res1, dst, dst_stride);
++    ST_D2(res1, 0, 1, dst, dst_stride);
+     dst += (2 * dst_stride);
+ 
+     inp0 = LD_UB(src);
+@@ -5686,7 +5638,7 @@
+     LD_UB2(dst, dst_stride, dst0, dst1);
+     avg0 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
+     res0 = __msa_aver_u_b(avg0, res0);
+-    ST8x2_UB(res0, dst, dst_stride);
++    ST_D2(res0, 0, 1, dst, dst_stride);
+     dst += (2 * dst_stride);
+ 
+     avg1 = (v16u8) __msa_ilvr_d((v2i64) horiz8, (v2i64) horiz7);
+@@ -5694,7 +5646,7 @@
+     LD_UB2(dst, dst_stride, dst0, dst1);
+     avg1 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
+     res1 = __msa_aver_u_b(avg1, res1);
+-    ST8x2_UB(res1, dst, dst_stride);
++    ST_D2(res1, 0, 1, dst, dst_stride);
+ }
+ 
+ static void hv_mc_qpel_avg_dst_aver_hv_src11_16x16_msa(const uint8_t *src,
+@@ -5732,7 +5684,7 @@
+                                          const20, const6, const3);
+     LD_UB2(src, src_stride, inp2, inp3);
+     src += (2 * src_stride);
+-    SLDI_B2_UB(inp0, inp1, inp0, inp1, inp0, inp1, 1);
++    SLDI_B2_UB(inp0, inp0, inp1, inp1, 1, inp0, inp1);
+ 
+     inp0 = (v16u8) __msa_ilvr_d((v2i64) inp1, (v2i64) inp0);
+     horiz0 = __msa_aver_u_b(inp0, res0);
+@@ -5741,14 +5693,14 @@
+                                          const20, const6, const3);
+     LD_UB2(src, src_stride, inp0, inp1);
+     src += (2 * src_stride);
+-    SLDI_B2_UB(inp2, inp3, inp2, inp3, inp2, inp3, 1);
++    SLDI_B2_UB(inp2, inp2, inp3, inp3, 1, inp2, inp3);
+ 
+     inp2 = (v16u8) __msa_ilvr_d((v2i64) inp3, (v2i64) inp2);
+     horiz2 = __msa_aver_u_b(inp2, res1);
+     horiz3 = (v16u8) __msa_splati_d((v2i64) horiz2, 1);
+     res0 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp0, inp1, mask0, mask1, mask2, mask3,
+                                          const20, const6, const3);
+-    SLDI_B2_UB(inp0, inp1, inp0, inp1, inp0, inp1, 1);
++    SLDI_B2_UB(inp0, inp0, inp1, inp1, 1, inp0, inp1);
+ 
+     inp0 = (v16u8) __msa_ilvr_d((v2i64) inp1, (v2i64) inp0);
+     horiz4 = __msa_aver_u_b(inp0, res0);
+@@ -5762,14 +5714,14 @@
+     res0 = __msa_aver_u_b(avg0, res0);
+     avg0 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
+     res0 = __msa_aver_u_b(avg0, res0);
+-    ST8x2_UB(res0, dst, dst_stride);
++    ST_D2(res0, 0, 1, dst, dst_stride);
+     dst += (2 * dst_stride);
+ 
+     LD_UB2(src, src_stride, inp2, inp3);
+     src += (2 * src_stride);
+     res1 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp2, inp3, mask0, mask1, mask2, mask3,
+                                          const20, const6, const3);
+-    SLDI_B2_UB(inp2, inp3, inp2, inp3, inp2, inp3, 1);
++    SLDI_B2_UB(inp2, inp2, inp3, inp3, 1, inp2, inp3);
+ 
+     inp2 = (v16u8) __msa_ilvr_d((v2i64) inp3, (v2i64) inp2);
+     horiz6 = __msa_aver_u_b(inp2, res1);
+@@ -5783,7 +5735,7 @@
+     res1 = __msa_aver_u_b(avg1, res1);
+     avg1 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
+     res1 = __msa_aver_u_b(avg1, res1);
+-    ST8x2_UB(res1, dst, dst_stride);
++    ST_D2(res1, 0, 1, dst, dst_stride);
+     dst += (2 * dst_stride);
+ 
+     inp0 = LD_UB(src);
+@@ -5800,7 +5752,7 @@
+     res0 = __msa_aver_u_b(avg0, res0);
+     avg0 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
+     res0 = __msa_aver_u_b(avg0, res0);
+-    ST8x2_UB(res0, dst, dst_stride);
++    ST_D2(res0, 0, 1, dst, dst_stride);
+     dst += (2 * dst_stride);
+ 
+     LD_UB2(dst, dst_stride, dst0, dst1);
+@@ -5812,7 +5764,7 @@
+     res1 = __msa_aver_u_b(avg1, res1);
+     avg1 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
+     res1 = __msa_aver_u_b(avg1, res1);
+-    ST8x2_UB(res1, dst, dst_stride);
++    ST_D2(res1, 0, 1, dst, dst_stride);
+ }
+ 
+ static void copy_8x8_msa(const uint8_t *src, int32_t src_stride,
+diff -uNra ffmpeg-4.1.6/libavcodec/mips/sbrdsp_mips.c FFmpeg/libavcodec/mips/sbrdsp_mips.c
+--- a/libavcodec/mips/sbrdsp_mips.c	2020-07-03 01:22:31.000000000 +0800
++++ b/libavcodec/mips/sbrdsp_mips.c	2020-07-19 18:13:57.509202154 +0800
+@@ -59,6 +59,7 @@
+ #include "libavutil/mips/asmdefs.h"
+ 
+ #if HAVE_INLINE_ASM
++#if HAVE_MIPSFPU
+ static void sbr_qmf_pre_shuffle_mips(float *z)
+ {
+     int Temp1, Temp2, Temp3, Temp4, Temp5, Temp6;
+@@ -165,7 +166,6 @@
+     );
+ }
+ 
+-#if HAVE_MIPSFPU
+ #if !HAVE_MIPS32R6 && !HAVE_MIPS64R6
+ static void sbr_sum64x5_mips(float *z)
+ {
+@@ -890,9 +890,9 @@
+ void ff_sbrdsp_init_mips(SBRDSPContext *s)
+ {
+ #if HAVE_INLINE_ASM
++#if HAVE_MIPSFPU
+     s->qmf_pre_shuffle = sbr_qmf_pre_shuffle_mips;
+     s->qmf_post_shuffle = sbr_qmf_post_shuffle_mips;
+-#if HAVE_MIPSFPU
+ #if !HAVE_MIPS32R6 && !HAVE_MIPS64R6
+     s->sum64x5 = sbr_sum64x5_mips;
+     s->sum_square = sbr_sum_square_mips;
+diff -uNra ffmpeg-4.1.6/libavcodec/mips/simple_idct_mmi.c FFmpeg/libavcodec/mips/simple_idct_mmi.c
+--- a/libavcodec/mips/simple_idct_mmi.c	2020-07-05 06:36:01.000000000 +0800
++++ b/libavcodec/mips/simple_idct_mmi.c	2020-07-19 18:13:57.509202154 +0800
+@@ -39,7 +39,7 @@
+ #define COL_SHIFT 20
+ #define DC_SHIFT 3
+ 
+-DECLARE_ALIGNED(8, const int16_t, W_arr)[46] = {
++DECLARE_ALIGNED(16, const int16_t, W_arr)[46] = {
+     W4,  W2,  W4,  W6,
+     W1,  W3,  W5,  W7,
+     W4,  W6, -W4, -W2,
+diff -uNra ffmpeg-4.1.6/libavcodec/mips/simple_idct_msa.c FFmpeg/libavcodec/mips/simple_idct_msa.c
+--- a/libavcodec/mips/simple_idct_msa.c	2020-07-03 23:10:59.000000000 +0800
++++ b/libavcodec/mips/simple_idct_msa.c	2020-07-19 18:13:57.513110563 +0800
+@@ -336,35 +336,26 @@
+     SRA_4V(temp2_r, temp2_l, temp3_r, temp3_l, 20);
+     SRA_4V(a3_r, a3_l, a2_r, a2_l, 20);
+     SRA_4V(a1_r, a1_l, a0_r, a0_l, 20);
+-    PCKEV_H4_SW(temp0_l, temp0_r, temp1_l, temp1_r, temp2_l, temp2_r,
+-                temp3_l, temp3_r, temp0_r, temp1_r, temp2_r, temp3_r);
+-    PCKEV_H4_SW(a0_l, a0_r, a1_l, a1_r, a2_l, a2_r, a3_l, a3_r,
+-                a0_r, a1_r, a2_r, a3_r);
+-    temp0_r = (v4i32) CLIP_SH_0_255(temp0_r);
+-    temp1_r = (v4i32) CLIP_SH_0_255(temp1_r);
+-    temp2_r = (v4i32) CLIP_SH_0_255(temp2_r);
+-    temp3_r = (v4i32) CLIP_SH_0_255(temp3_r);
+-    PCKEV_B4_SW(temp0_r, temp0_r, temp1_r, temp1_r,
+-                temp2_r, temp2_r, temp3_r, temp3_r,
+-                temp0_r, temp1_r, temp2_r, temp3_r);
+-    tmp0 = __msa_copy_u_d((v2i64) temp0_r, 1);
+-    tmp1 = __msa_copy_u_d((v2i64) temp1_r, 1);
+-    tmp2 = __msa_copy_u_d((v2i64) temp2_r, 1);
+-    tmp3 = __msa_copy_u_d((v2i64) temp3_r, 1);
+-    SD4(tmp0, tmp1, tmp2, tmp3, dst, dst_stride);
+-    dst += 4 * dst_stride;
+-    a0_r = (v4i32) CLIP_SH_0_255(a0_r);
+-    a1_r = (v4i32) CLIP_SH_0_255(a1_r);
+-    a2_r = (v4i32) CLIP_SH_0_255(a2_r);
+-    a3_r = (v4i32) CLIP_SH_0_255(a3_r);
+-    PCKEV_B4_SW(a0_r, a0_r, a1_r, a1_r,
+-                a2_r, a2_r, a3_r, a3_r, a0_r, a1_r, a2_r, a3_r);
+-    tmp3 = __msa_copy_u_d((v2i64) a0_r, 1);
+-    tmp2 = __msa_copy_u_d((v2i64) a1_r, 1);
+-    tmp1 = __msa_copy_u_d((v2i64) a2_r, 1);
+-    tmp0 = __msa_copy_u_d((v2i64) a3_r, 1);
++    PCKEV_H4_SH(temp0_l, temp0_r, temp1_l, temp1_r, temp2_l, temp2_r,
++                temp3_l, temp3_r, in0, in1, in2, in3);
++    PCKEV_H4_SH(a0_l, a0_r, a1_l, a1_r, a2_l, a2_r, a3_l, a3_r,
++                in4, in5, in6, in7);
++    CLIP_SH4_0_255(in0, in1, in2, in3);
++    PCKEV_B4_SH(in0, in0, in1, in1, in2, in2, in3, in3,
++                in0, in1, in2, in3);
++    tmp0 = __msa_copy_u_d((v2i64) in0, 1);
++    tmp1 = __msa_copy_u_d((v2i64) in1, 1);
++    tmp2 = __msa_copy_u_d((v2i64) in2, 1);
++    tmp3 = __msa_copy_u_d((v2i64) in3, 1);
+     SD4(tmp0, tmp1, tmp2, tmp3, dst, dst_stride);
+-    dst += 4 * dst_stride;
++    CLIP_SH4_0_255(in4, in5, in6, in7);
++    PCKEV_B4_SH(in4, in4, in5, in5, in6, in6, in7, in7,
++                in4, in5, in6, in7);
++    tmp3 = __msa_copy_u_d((v2i64) in4, 1);
++    tmp2 = __msa_copy_u_d((v2i64) in5, 1);
++    tmp1 = __msa_copy_u_d((v2i64) in6, 1);
++    tmp0 = __msa_copy_u_d((v2i64) in7, 1);
++    SD4(tmp0, tmp1, tmp2, tmp3, dst + 4 * dst_stride, dst_stride);
+ }
+ 
+ static void simple_idct_add_msa(uint8_t *dst, int32_t dst_stride,
+@@ -516,21 +507,17 @@
+                 temp3_l, temp3_r, temp0_r, temp1_r, temp2_r, temp3_r);
+     ILVR_B4_SW(zero, in0, zero, in1, zero, in2, zero, in3,
+                temp0_l, temp1_l, temp2_l, temp3_l);
+-    temp0_r = (v4i32) ((v8i16) (temp0_r) + (v8i16) (temp0_l));
+-    temp1_r = (v4i32) ((v8i16) (temp1_r) + (v8i16) (temp1_l));
+-    temp2_r = (v4i32) ((v8i16) (temp2_r) + (v8i16) (temp2_l));
+-    temp3_r = (v4i32) ((v8i16) (temp3_r) + (v8i16) (temp3_l));
+-    temp0_r = (v4i32) CLIP_SH_0_255(temp0_r);
+-    temp1_r = (v4i32) CLIP_SH_0_255(temp1_r);
+-    temp2_r = (v4i32) CLIP_SH_0_255(temp2_r);
+-    temp3_r = (v4i32) CLIP_SH_0_255(temp3_r);
+-    PCKEV_B4_SW(temp0_r, temp0_r, temp1_r, temp1_r,
+-                temp2_r, temp2_r, temp3_r, temp3_r,
+-                temp0_r, temp1_r, temp2_r, temp3_r);
+-    tmp0 = __msa_copy_u_d((v2i64) temp0_r, 1);
+-    tmp1 = __msa_copy_u_d((v2i64) temp1_r, 1);
+-    tmp2 = __msa_copy_u_d((v2i64) temp2_r, 1);
+-    tmp3 = __msa_copy_u_d((v2i64) temp3_r, 1);
++    in0 = (v8i16) (temp0_r) + (v8i16) (temp0_l);
++    in1 = (v8i16) (temp1_r) + (v8i16) (temp1_l);
++    in2 = (v8i16) (temp2_r) + (v8i16) (temp2_l);
++    in3 = (v8i16) (temp3_r) + (v8i16) (temp3_l);
++    CLIP_SH4_0_255(in0, in1, in2, in3);
++    PCKEV_B4_SH(in0, in0, in1, in1, in2, in2, in3, in3,
++                in0, in1, in2, in3);
++    tmp0 = __msa_copy_u_d((v2i64) in0, 1);
++    tmp1 = __msa_copy_u_d((v2i64) in1, 1);
++    tmp2 = __msa_copy_u_d((v2i64) in2, 1);
++    tmp3 = __msa_copy_u_d((v2i64) in3, 1);
+     SD4(tmp0, tmp1, tmp2, tmp3, dst, dst_stride);
+ 
+     SRA_4V(a3_r, a3_l, a2_r, a2_l, 20);
+@@ -540,20 +527,17 @@
+                 a0_r, a1_r, a2_r, a3_r);
+     ILVR_B4_SW(zero, in4, zero, in5, zero, in6, zero, in7,
+                a3_l, a2_l, a1_l, a0_l);
+-    a3_r = (v4i32) ((v8i16) (a3_r) + (v8i16) (a3_l));
+-    a2_r = (v4i32) ((v8i16) (a2_r) + (v8i16) (a2_l));
+-    a1_r = (v4i32) ((v8i16) (a1_r) + (v8i16) (a1_l));
+-    a0_r = (v4i32) ((v8i16) (a0_r) + (v8i16) (a0_l));
+-    a3_r = (v4i32) CLIP_SH_0_255(a3_r);
+-    a2_r = (v4i32) CLIP_SH_0_255(a2_r);
+-    a1_r = (v4i32) CLIP_SH_0_255(a1_r);
+-    a0_r = (v4i32) CLIP_SH_0_255(a0_r);
+-    PCKEV_B4_SW(a0_r, a0_r, a1_r, a1_r,
+-                a2_r, a2_r, a3_r, a3_r, a0_r, a1_r, a2_r, a3_r);
+-    tmp0 = __msa_copy_u_d((v2i64) a3_r, 1);
+-    tmp1 = __msa_copy_u_d((v2i64) a2_r, 1);
+-    tmp2 = __msa_copy_u_d((v2i64) a1_r, 1);
+-    tmp3 = __msa_copy_u_d((v2i64) a0_r, 1);
++    in4 = (v8i16) (a3_r) + (v8i16) (a3_l);
++    in5 = (v8i16) (a2_r) + (v8i16) (a2_l);
++    in6 = (v8i16) (a1_r) + (v8i16) (a1_l);
++    in7 = (v8i16) (a0_r) + (v8i16) (a0_l);
++    CLIP_SH4_0_255(in4, in5, in6, in7);
++    PCKEV_B4_SH(in4, in4, in5, in5, in6, in6, in7, in7,
++                in4, in5, in6, in7);
++    tmp0 = __msa_copy_u_d((v2i64) in4, 1);
++    tmp1 = __msa_copy_u_d((v2i64) in5, 1);
++    tmp2 = __msa_copy_u_d((v2i64) in6, 1);
++    tmp3 = __msa_copy_u_d((v2i64) in7, 1);
+     SD4(tmp0, tmp1, tmp2, tmp3, dst + 4 * dst_stride, dst_stride);
+ }
+ 
+diff -uNra ffmpeg-4.1.6/libavcodec/mips/vc1dsp_init_mips.c FFmpeg/libavcodec/mips/vc1dsp_init_mips.c
+--- a/libavcodec/mips/vc1dsp_init_mips.c	2020-07-03 23:10:59.000000000 +0800
++++ b/libavcodec/mips/vc1dsp_init_mips.c	2020-07-19 18:19:52.760181959 +0800
+@@ -18,91 +18,103 @@
+  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+  */
+ 
++#include "libavutil/mips/cpu.h"
+ #include "libavutil/attributes.h"
+ #include "libavcodec/vc1dsp.h"
+ #include "vc1dsp_mips.h"
+ #include "config.h"
+ 
+-#if HAVE_MMI
+-static av_cold void vc1dsp_init_mmi(VC1DSPContext *dsp)
+-{
+-#if _MIPS_SIM != _ABIO32
+-    dsp->vc1_inv_trans_8x8    = ff_vc1_inv_trans_8x8_mmi;
+-    dsp->vc1_inv_trans_4x8    = ff_vc1_inv_trans_4x8_mmi;
+-    dsp->vc1_inv_trans_8x4    = ff_vc1_inv_trans_8x4_mmi;
+-#endif
+-    dsp->vc1_inv_trans_4x4    = ff_vc1_inv_trans_4x4_mmi;
+-    dsp->vc1_inv_trans_8x8_dc = ff_vc1_inv_trans_8x8_dc_mmi;
+-    dsp->vc1_inv_trans_4x8_dc = ff_vc1_inv_trans_4x8_dc_mmi;
+-    dsp->vc1_inv_trans_8x4_dc = ff_vc1_inv_trans_8x4_dc_mmi;
+-    dsp->vc1_inv_trans_4x4_dc = ff_vc1_inv_trans_4x4_dc_mmi;
+-
+-    dsp->vc1_h_overlap        = ff_vc1_h_overlap_mmi;
+-    dsp->vc1_v_overlap        = ff_vc1_v_overlap_mmi;
+-    dsp->vc1_h_s_overlap      = ff_vc1_h_s_overlap_mmi;
+-    dsp->vc1_v_s_overlap      = ff_vc1_v_s_overlap_mmi;
+-
+-    dsp->vc1_v_loop_filter4  = ff_vc1_v_loop_filter4_mmi;
+-    dsp->vc1_h_loop_filter4  = ff_vc1_h_loop_filter4_mmi;
+-    dsp->vc1_v_loop_filter8  = ff_vc1_v_loop_filter8_mmi;
+-    dsp->vc1_h_loop_filter8  = ff_vc1_h_loop_filter8_mmi;
+-    dsp->vc1_v_loop_filter16 = ff_vc1_v_loop_filter16_mmi;
+-    dsp->vc1_h_loop_filter16 = ff_vc1_h_loop_filter16_mmi;
+-
+ #define FN_ASSIGN(OP, X, Y, INSN) \
+     dsp->OP##vc1_mspel_pixels_tab[1][X+4*Y] = ff_##OP##vc1_mspel_mc##X##Y##INSN; \
+     dsp->OP##vc1_mspel_pixels_tab[0][X+4*Y] = ff_##OP##vc1_mspel_mc##X##Y##_16##INSN
+ 
+-    FN_ASSIGN(put_, 0, 0, _mmi);
+-    FN_ASSIGN(put_, 0, 1, _mmi);
+-    FN_ASSIGN(put_, 0, 2, _mmi);
+-    FN_ASSIGN(put_, 0, 3, _mmi);
+-
+-    FN_ASSIGN(put_, 1, 0, _mmi);
+-    //FN_ASSIGN(put_, 1, 1, _mmi);//FIXME
+-    //FN_ASSIGN(put_, 1, 2, _mmi);//FIXME
+-    //FN_ASSIGN(put_, 1, 3, _mmi);//FIXME
+-
+-    FN_ASSIGN(put_, 2, 0, _mmi);
+-    //FN_ASSIGN(put_, 2, 1, _mmi);//FIXME
+-    //FN_ASSIGN(put_, 2, 2, _mmi);//FIXME
+-    //FN_ASSIGN(put_, 2, 3, _mmi);//FIXME
+-
+-    FN_ASSIGN(put_, 3, 0, _mmi);
+-    //FN_ASSIGN(put_, 3, 1, _mmi);//FIXME
+-    //FN_ASSIGN(put_, 3, 2, _mmi);//FIXME
+-    //FN_ASSIGN(put_, 3, 3, _mmi);//FIXME
+-
+-    FN_ASSIGN(avg_, 0, 0, _mmi);
+-    FN_ASSIGN(avg_, 0, 1, _mmi);
+-    FN_ASSIGN(avg_, 0, 2, _mmi);
+-    FN_ASSIGN(avg_, 0, 3, _mmi);
+-
+-    FN_ASSIGN(avg_, 1, 0, _mmi);
+-    //FN_ASSIGN(avg_, 1, 1, _mmi);//FIXME
+-    //FN_ASSIGN(avg_, 1, 2, _mmi);//FIXME
+-    //FN_ASSIGN(avg_, 1, 3, _mmi);//FIXME
+-
+-    FN_ASSIGN(avg_, 2, 0, _mmi);
+-    //FN_ASSIGN(avg_, 2, 1, _mmi);//FIXME
+-    //FN_ASSIGN(avg_, 2, 2, _mmi);//FIXME
+-    //FN_ASSIGN(avg_, 2, 3, _mmi);//FIXME
+-
+-    FN_ASSIGN(avg_, 3, 0, _mmi);
+-    //FN_ASSIGN(avg_, 3, 1, _mmi);//FIXME
+-    //FN_ASSIGN(avg_, 3, 2, _mmi);//FIXME
+-    //FN_ASSIGN(avg_, 3, 3, _mmi);//FIXME
+-
+-    dsp->put_no_rnd_vc1_chroma_pixels_tab[0] = ff_put_no_rnd_vc1_chroma_mc8_mmi;
+-    dsp->avg_no_rnd_vc1_chroma_pixels_tab[0] = ff_avg_no_rnd_vc1_chroma_mc8_mmi;
+-    dsp->put_no_rnd_vc1_chroma_pixels_tab[1] = ff_put_no_rnd_vc1_chroma_mc4_mmi;
+-    dsp->avg_no_rnd_vc1_chroma_pixels_tab[1] = ff_avg_no_rnd_vc1_chroma_mc4_mmi;
+-}
+-#endif /* HAVE_MMI */
+-
+ av_cold void ff_vc1dsp_init_mips(VC1DSPContext *dsp)
+ {
+-#if HAVE_MMI
+-    vc1dsp_init_mmi(dsp);
+-#endif /* HAVE_MMI */
++    int cpu_flags = av_get_cpu_flags();
++
++    if (have_mmi(cpu_flags)) {
++ #if _MIPS_SIM != _ABIO32
++        dsp->vc1_inv_trans_8x8    = ff_vc1_inv_trans_8x8_mmi;
++        dsp->vc1_inv_trans_4x8    = ff_vc1_inv_trans_4x8_mmi;
++        dsp->vc1_inv_trans_8x4    = ff_vc1_inv_trans_8x4_mmi;
++#endif
++        dsp->vc1_inv_trans_4x4    = ff_vc1_inv_trans_4x4_mmi;
++        dsp->vc1_inv_trans_8x8_dc = ff_vc1_inv_trans_8x8_dc_mmi;
++        dsp->vc1_inv_trans_4x8_dc = ff_vc1_inv_trans_4x8_dc_mmi;
++        dsp->vc1_inv_trans_8x4_dc = ff_vc1_inv_trans_8x4_dc_mmi;
++        dsp->vc1_inv_trans_4x4_dc = ff_vc1_inv_trans_4x4_dc_mmi;
++
++        dsp->vc1_h_overlap        = ff_vc1_h_overlap_mmi;
++        dsp->vc1_v_overlap        = ff_vc1_v_overlap_mmi;
++        dsp->vc1_h_s_overlap      = ff_vc1_h_s_overlap_mmi;
++        dsp->vc1_v_s_overlap      = ff_vc1_v_s_overlap_mmi;
++
++        dsp->vc1_v_loop_filter4  = ff_vc1_v_loop_filter4_mmi;
++        dsp->vc1_h_loop_filter4  = ff_vc1_h_loop_filter4_mmi;
++        dsp->vc1_v_loop_filter8  = ff_vc1_v_loop_filter8_mmi;
++        dsp->vc1_h_loop_filter8  = ff_vc1_h_loop_filter8_mmi;
++        dsp->vc1_v_loop_filter16 = ff_vc1_v_loop_filter16_mmi;
++        dsp->vc1_h_loop_filter16 = ff_vc1_h_loop_filter16_mmi;
++
++        FN_ASSIGN(put_, 0, 0, _mmi);
++        FN_ASSIGN(put_, 0, 1, _mmi);
++        FN_ASSIGN(put_, 0, 2, _mmi);
++        FN_ASSIGN(put_, 0, 3, _mmi);
++
++        FN_ASSIGN(put_, 1, 0, _mmi);
++        //FN_ASSIGN(put_, 1, 1, _mmi);//FIXME
++        //FN_ASSIGN(put_, 1, 2, _mmi);//FIXME
++        //FN_ASSIGN(put_, 1, 3, _mmi);//FIXME
++
++        FN_ASSIGN(put_, 2, 0, _mmi);
++        //FN_ASSIGN(put_, 2, 1, _mmi);//FIXME
++        //FN_ASSIGN(put_, 2, 2, _mmi);//FIXME
++        //FN_ASSIGN(put_, 2, 3, _mmi);//FIXME
++
++        FN_ASSIGN(put_, 3, 0, _mmi);
++        //FN_ASSIGN(put_, 3, 1, _mmi);//FIXME
++        //FN_ASSIGN(put_, 3, 2, _mmi);//FIXME
++        //FN_ASSIGN(put_, 3, 3, _mmi);//FIXME
++
++        FN_ASSIGN(avg_, 0, 0, _mmi);
++        FN_ASSIGN(avg_, 0, 1, _mmi);
++        FN_ASSIGN(avg_, 0, 2, _mmi);
++        FN_ASSIGN(avg_, 0, 3, _mmi);
++
++        FN_ASSIGN(avg_, 1, 0, _mmi);
++        //FN_ASSIGN(avg_, 1, 1, _mmi);//FIXME
++        //FN_ASSIGN(avg_, 1, 2, _mmi);//FIXME
++        //FN_ASSIGN(avg_, 1, 3, _mmi);//FIXME
++
++        FN_ASSIGN(avg_, 2, 0, _mmi);
++        //FN_ASSIGN(avg_, 2, 1, _mmi);//FIXME
++        //FN_ASSIGN(avg_, 2, 2, _mmi);//FIXME
++        //FN_ASSIGN(avg_, 2, 3, _mmi);//FIXME
++
++        FN_ASSIGN(avg_, 3, 0, _mmi);
++        //FN_ASSIGN(avg_, 3, 1, _mmi);//FIXME
++        //FN_ASSIGN(avg_, 3, 2, _mmi);//FIXME
++        //FN_ASSIGN(avg_, 3, 3, _mmi);//FIXME
++
++        dsp->put_no_rnd_vc1_chroma_pixels_tab[0] = ff_put_no_rnd_vc1_chroma_mc8_mmi;
++        dsp->avg_no_rnd_vc1_chroma_pixels_tab[0] = ff_avg_no_rnd_vc1_chroma_mc8_mmi;
++        dsp->put_no_rnd_vc1_chroma_pixels_tab[1] = ff_put_no_rnd_vc1_chroma_mc4_mmi;
++        dsp->avg_no_rnd_vc1_chroma_pixels_tab[1] = ff_avg_no_rnd_vc1_chroma_mc4_mmi;
++    }
++
++    if (have_msa(cpu_flags)) {
++        dsp->vc1_inv_trans_8x8 = ff_vc1_inv_trans_8x8_msa;
++        dsp->vc1_inv_trans_4x8 = ff_vc1_inv_trans_4x8_msa;
++        dsp->vc1_inv_trans_8x4 = ff_vc1_inv_trans_8x4_msa;
++
++        FN_ASSIGN(put_, 1, 1, _msa);
++        FN_ASSIGN(put_, 1, 2, _msa);
++        FN_ASSIGN(put_, 1, 3, _msa);
++        FN_ASSIGN(put_, 2, 1, _msa);
++        FN_ASSIGN(put_, 2, 2, _msa);
++        FN_ASSIGN(put_, 2, 3, _msa);
++        FN_ASSIGN(put_, 3, 1, _msa);
++        FN_ASSIGN(put_, 3, 2, _msa);
++        FN_ASSIGN(put_, 3, 3, _msa);
++    }
+ }
+diff -uNra ffmpeg-4.1.6/libavcodec/mips/vc1dsp_mips.h FFmpeg/libavcodec/mips/vc1dsp_mips.h
+--- a/libavcodec/mips/vc1dsp_mips.h	2020-07-05 06:36:01.000000000 +0800
++++ b/libavcodec/mips/vc1dsp_mips.h	2020-07-19 18:13:57.513110563 +0800
+@@ -180,15 +180,38 @@
+ 
+ void ff_put_no_rnd_vc1_chroma_mc8_mmi(uint8_t *dst /* align 8 */,
+                                       uint8_t *src /* align 1 */,
+-                                      int stride, int h, int x, int y);
++                                      ptrdiff_t stride, int h, int x, int y);
+ void ff_put_no_rnd_vc1_chroma_mc4_mmi(uint8_t *dst /* align 8 */,
+                                       uint8_t *src /* align 1 */,
+-                                      int stride, int h, int x, int y);
++                                      ptrdiff_t stride, int h, int x, int y);
+ void ff_avg_no_rnd_vc1_chroma_mc8_mmi(uint8_t *dst /* align 8 */,
+                                       uint8_t *src /* align 1 */,
+-                                      int stride, int h, int x, int y);
++                                      ptrdiff_t stride, int h, int x, int y);
+ void ff_avg_no_rnd_vc1_chroma_mc4_mmi(uint8_t *dst /* align 8 */,
+                                       uint8_t *src /* align 1 */,
+-                                      int stride, int h, int x, int y);
++                                      ptrdiff_t stride, int h, int x, int y);
+ 
++void ff_vc1_inv_trans_8x8_msa(int16_t block[64]);
++void ff_vc1_inv_trans_8x4_msa(uint8_t *dest, ptrdiff_t linesize, int16_t *block);
++void ff_vc1_inv_trans_4x8_msa(uint8_t *dest, ptrdiff_t linesize, int16_t *block);
++
++#define FF_PUT_VC1_MSPEL_MC_MSA(hmode, vmode)                                 \
++void ff_put_vc1_mspel_mc ## hmode ## vmode ## _msa(uint8_t *dst,              \
++                                                  const uint8_t *src,         \
++                                                  ptrdiff_t stride, int rnd); \
++void ff_put_vc1_mspel_mc ## hmode ## vmode ## _16_msa(uint8_t *dst,           \
++                                                  const uint8_t *src,         \
++                                                  ptrdiff_t stride, int rnd);
++
++FF_PUT_VC1_MSPEL_MC_MSA(1, 1);
++FF_PUT_VC1_MSPEL_MC_MSA(1, 2);
++FF_PUT_VC1_MSPEL_MC_MSA(1, 3);
++
++FF_PUT_VC1_MSPEL_MC_MSA(2, 1);
++FF_PUT_VC1_MSPEL_MC_MSA(2, 2);
++FF_PUT_VC1_MSPEL_MC_MSA(2, 3);
++
++FF_PUT_VC1_MSPEL_MC_MSA(3, 1);
++FF_PUT_VC1_MSPEL_MC_MSA(3, 2);
++FF_PUT_VC1_MSPEL_MC_MSA(3, 3);
+ #endif /* AVCODEC_MIPS_VC1DSP_MIPS_H */
+diff -uNra ffmpeg-4.1.6/libavcodec/mips/vc1dsp_mmi.c FFmpeg/libavcodec/mips/vc1dsp_mmi.c
+--- a/libavcodec/mips/vc1dsp_mmi.c	2020-07-05 06:36:01.000000000 +0800
++++ b/libavcodec/mips/vc1dsp_mmi.c	2020-07-19 18:13:57.513110563 +0800
+@@ -2241,7 +2241,7 @@
+ 
+ void ff_put_no_rnd_vc1_chroma_mc8_mmi(uint8_t *dst /* align 8 */,
+                                       uint8_t *src /* align 1 */,
+-                                      int stride, int h, int x, int y)
++                                      ptrdiff_t stride, int h, int x, int y)
+ {
+     const int A = (8 - x) * (8 - y);
+     const int B =     (x) * (8 - y);
+@@ -2296,7 +2296,7 @@
+ 
+ void ff_put_no_rnd_vc1_chroma_mc4_mmi(uint8_t *dst /* align 8 */,
+                                       uint8_t *src /* align 1 */,
+-                                      int stride, int h, int x, int y)
++                                      ptrdiff_t stride, int h, int x, int y)
+ {
+     const int A = (8 - x) * (8 - y);
+     const int B =     (x) * (8 - y);
+@@ -2349,7 +2349,7 @@
+ 
+ void ff_avg_no_rnd_vc1_chroma_mc8_mmi(uint8_t *dst /* align 8 */,
+                                       uint8_t *src /* align 1 */,
+-                                      int stride, int h, int x, int y)
++                                      ptrdiff_t stride, int h, int x, int y)
+ {
+     const int A = (8 - x) * (8 - y);
+     const int B =     (x) * (8 - y);
+@@ -2407,7 +2407,7 @@
+ 
+ void ff_avg_no_rnd_vc1_chroma_mc4_mmi(uint8_t *dst /* align 8 */,
+                                       uint8_t *src /* align 1 */,
+-                                      int stride, int h, int x, int y)
++                                      ptrdiff_t stride, int h, int x, int y)
+ {
+     const int A = (8 - x) * (8 - y);
+     const int B = (    x) * (8 - y);
+diff -uNra ffmpeg-4.1.6/libavcodec/mips/vc1dsp_msa.c FFmpeg/libavcodec/mips/vc1dsp_msa.c
+--- a/libavcodec/mips/vc1dsp_msa.c	1970-01-01 08:00:00.000000000 +0800
++++ b/libavcodec/mips/vc1dsp_msa.c	2020-07-19 18:13:57.513110563 +0800
+@@ -0,0 +1,461 @@
++/*
++ * Loongson SIMD optimized vc1dsp
++ *
++ * Copyright (c) 2019 Loongson Technology Corporation Limited
++ *                    gxw <guxiwei-hf@loongson.cn>
++ *
++ * This file is part of FFmpeg.
++ *
++ * FFmpeg is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * FFmpeg is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with FFmpeg; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
++ */
++
++#include "vc1dsp_mips.h"
++#include "constants.h"
++#include "libavutil/mips/generic_macros_msa.h"
++
++void ff_vc1_inv_trans_8x8_msa(int16_t block[64])
++{
++    v8i16 in0, in1, in2, in3, in4, in5, in6, in7;
++    v4i32 in_r0, in_r1, in_r2, in_r3, in_r4, in_r5, in_r6, in_r7;
++    v4i32 in_l0, in_l1, in_l2, in_l3, in_l4, in_l5, in_l6, in_l7;
++    v4i32 t_r1, t_r2, t_r3, t_r4, t_r5, t_r6, t_r7, t_r8;
++    v4i32 t_l1, t_l2, t_l3, t_l4, t_l5, t_l6, t_l7, t_l8;
++    v4i32 cnst_12 = {12, 12, 12, 12};
++    v4i32 cnst_4 = {4, 4, 4, 4};
++    v4i32 cnst_16 = {16, 16, 16, 16};
++    v4i32 cnst_6 = {6, 6, 6, 6};
++    v4i32 cnst_15 = {15, 15, 15, 15};
++    v4i32 cnst_9 = {9, 9, 9, 9};
++    v4i32 cnst_1 = {1, 1, 1, 1};
++    v4i32 cnst_64 = {64, 64, 64, 64};
++
++    LD_SH8(block, 8, in0, in1, in2, in3, in4, in5, in6, in7);
++    UNPCK_SH_SW(in0, in_r0, in_l0);
++    UNPCK_SH_SW(in1, in_r1, in_l1);
++    UNPCK_SH_SW(in2, in_r2, in_l2);
++    UNPCK_SH_SW(in3, in_r3, in_l3);
++    UNPCK_SH_SW(in4, in_r4, in_l4);
++    UNPCK_SH_SW(in5, in_r5, in_l5);
++    UNPCK_SH_SW(in6, in_r6, in_l6);
++    UNPCK_SH_SW(in7, in_r7, in_l7);
++    // First loop
++    t_r1 = cnst_12 * (in_r0 + in_r4) + cnst_4;
++    t_l1 = cnst_12 * (in_l0 + in_l4) + cnst_4;
++    t_r2 = cnst_12 * (in_r0 - in_r4) + cnst_4;
++    t_l2 = cnst_12 * (in_l0 - in_l4) + cnst_4;
++    t_r3 = cnst_16 * in_r2 + cnst_6 * in_r6;
++    t_l3 = cnst_16 * in_l2 + cnst_6 * in_l6;
++    t_r4 = cnst_6 * in_r2 - cnst_16 * in_r6;
++    t_l4 = cnst_6 * in_l2 - cnst_16 * in_l6;
++
++    ADD4(t_r1, t_r3, t_l1, t_l3, t_r2, t_r4, t_l2, t_l4, t_r5, t_l5, t_r6, t_l6);
++    SUB4(t_r2, t_r4, t_l2, t_l4, t_r1, t_r3, t_l1, t_l3, t_r7, t_l7, t_r8, t_l8);
++    t_r1 = cnst_16 * in_r1 + cnst_15 * in_r3 + cnst_9 * in_r5 + cnst_4 * in_r7;
++    t_l1 = cnst_16 * in_l1 + cnst_15 * in_l3 + cnst_9 * in_l5 + cnst_4 * in_l7;
++    t_r2 = cnst_15 * in_r1 - cnst_4 * in_r3 - cnst_16 * in_r5 - cnst_9 * in_r7;
++    t_l2 = cnst_15 * in_l1 - cnst_4 * in_l3 - cnst_16 * in_l5 - cnst_9 * in_l7;
++    t_r3 = cnst_9 * in_r1 - cnst_16 * in_r3 + cnst_4 * in_r5 + cnst_15 * in_r7;
++    t_l3 = cnst_9 * in_l1 - cnst_16 * in_l3 + cnst_4 * in_l5 + cnst_15 * in_l7;
++    t_r4 = cnst_4 * in_r1 - cnst_9 * in_r3 + cnst_15 * in_r5 - cnst_16 * in_r7;
++    t_l4 = cnst_4 * in_l1 - cnst_9 * in_l3 + cnst_15 * in_l5 - cnst_16 * in_l7;
++
++    in_r0 = (t_r5 + t_r1) >> 3;
++    in_l0 = (t_l5 + t_l1) >> 3;
++    in_r1 = (t_r6 + t_r2) >> 3;
++    in_l1 = (t_l6 + t_l2) >> 3;
++    in_r2 = (t_r7 + t_r3) >> 3;
++    in_l2 = (t_l7 + t_l3) >> 3;
++    in_r3 = (t_r8 + t_r4) >> 3;
++    in_l3 = (t_l8 + t_l4) >> 3;
++
++    in_r4 = (t_r8 - t_r4) >> 3;
++    in_l4 = (t_l8 - t_l4) >> 3;
++    in_r5 = (t_r7 - t_r3) >> 3;
++    in_l5 = (t_l7 - t_l3) >> 3;
++    in_r6 = (t_r6 - t_r2) >> 3;
++    in_l6 = (t_l6 - t_l2) >> 3;
++    in_r7 = (t_r5 - t_r1) >> 3;
++    in_l7 = (t_l5 - t_l1) >> 3;
++    TRANSPOSE4x4_SW_SW(in_r0, in_r1, in_r2, in_r3, in_r0, in_r1, in_r2, in_r3);
++    TRANSPOSE4x4_SW_SW(in_l0, in_l1, in_l2, in_l3, in_l0, in_l1, in_l2, in_l3);
++    TRANSPOSE4x4_SW_SW(in_r4, in_r5, in_r6, in_r7, in_r4, in_r5, in_r6, in_r7);
++    TRANSPOSE4x4_SW_SW(in_l4, in_l5, in_l6, in_l7, in_l4, in_l5, in_l6, in_l7);
++    // Second loop
++    t_r1 = cnst_12 * (in_r0 + in_l0) + cnst_64;
++    t_l1 = cnst_12 * (in_r4 + in_l4) + cnst_64;
++    t_r2 = cnst_12 * (in_r0 - in_l0) + cnst_64;
++    t_l2 = cnst_12 * (in_r4 - in_l4) + cnst_64;
++    t_r3 = cnst_16 * in_r2 + cnst_6 * in_l2;
++    t_l3 = cnst_16 * in_r6 + cnst_6 * in_l6;
++    t_r4 = cnst_6 * in_r2 - cnst_16 * in_l2;
++    t_l4 = cnst_6 * in_r6 - cnst_16 * in_l6;
++
++    ADD4(t_r1, t_r3, t_l1, t_l3, t_r2, t_r4, t_l2, t_l4, t_r5, t_l5, t_r6, t_l6);
++    SUB4(t_r2, t_r4, t_l2, t_l4, t_r1, t_r3, t_l1, t_l3, t_r7, t_l7, t_r8, t_l8);
++    t_r1 = cnst_16 * in_r1 + cnst_15 * in_r3 + cnst_9 * in_l1 + cnst_4 * in_l3;
++    t_l1 = cnst_16 * in_r5 + cnst_15 * in_r7 + cnst_9 * in_l5 + cnst_4 * in_l7;
++    t_r2 = cnst_15 * in_r1 - cnst_4 * in_r3 - cnst_16 * in_l1 - cnst_9 * in_l3;
++    t_l2 = cnst_15 * in_r5 - cnst_4 * in_r7 - cnst_16 * in_l5 - cnst_9 * in_l7;
++    t_r3 = cnst_9 * in_r1 - cnst_16 * in_r3 + cnst_4 * in_l1 + cnst_15 * in_l3;
++    t_l3 = cnst_9 * in_r5 - cnst_16 * in_r7 + cnst_4 * in_l5 + cnst_15 * in_l7;
++    t_r4 = cnst_4 * in_r1 - cnst_9 * in_r3 + cnst_15 * in_l1 - cnst_16 * in_l3;
++    t_l4 = cnst_4 * in_r5 - cnst_9 * in_r7 + cnst_15 * in_l5 - cnst_16 * in_l7;
++
++    in_r0 = (t_r5 + t_r1) >> 7;
++    in_l0 = (t_l5 + t_l1) >> 7;
++    in_r1 = (t_r6 + t_r2) >> 7;
++    in_l1 = (t_l6 + t_l2) >> 7;
++    in_r2 = (t_r7 + t_r3) >> 7;
++    in_l2 = (t_l7 + t_l3) >> 7;
++    in_r3 = (t_r8 + t_r4) >> 7;
++    in_l3 = (t_l8 + t_l4) >> 7;
++
++    in_r4 = (t_r8 - t_r4 + cnst_1) >> 7;
++    in_l4 = (t_l8 - t_l4 + cnst_1) >> 7;
++    in_r5 = (t_r7 - t_r3 + cnst_1) >> 7;
++    in_l5 = (t_l7 - t_l3 + cnst_1) >> 7;
++    in_r6 = (t_r6 - t_r2 + cnst_1) >> 7;
++    in_l6 = (t_l6 - t_l2 + cnst_1) >> 7;
++    in_r7 = (t_r5 - t_r1 + cnst_1) >> 7;
++    in_l7 = (t_l5 - t_l1 + cnst_1) >> 7;
++    PCKEV_H4_SH(in_l0, in_r0, in_l1, in_r1, in_l2, in_r2, in_l3, in_r3,
++                in0, in1, in2, in3);
++    PCKEV_H4_SH(in_l4, in_r4, in_l5, in_r5, in_l6, in_r6, in_l7, in_r7,
++                in4, in5, in6, in7);
++    ST_SH8(in0, in1, in2, in3, in4, in5, in6, in7, block, 8);
++}
++
++void ff_vc1_inv_trans_4x8_msa(uint8_t *dest, ptrdiff_t linesize, int16_t *block)
++{
++    v8i16 in0, in1, in2, in3, in4, in5, in6, in7;
++    v4i32 in_r0, in_r1, in_r2, in_r3, in_r4, in_r5, in_r6, in_r7;
++    v4i32 t1, t2, t3, t4, t5, t6, t7, t8;
++    v4i32 dst0, dst1, dst2, dst3, dst4, dst5, dst6, dst7;
++    v16i8 zero_m = { 0 };
++    v4i32 cnst_17 = {17, 17, 17, 17};
++    v4i32 cnst_22 = {22, 22, 22, 22};
++    v4i32 cnst_10 = {10, 10, 10, 10};
++    v4i32 cnst_12 = {12, 12, 12, 12};
++    v4i32 cnst_64 = {64, 64, 64, 64};
++    v4i32 cnst_16 = {16, 16, 16, 16};
++    v4i32 cnst_15 = {15, 15, 15, 15};
++    v4i32 cnst_4 = {4, 4, 4, 4};
++    v4i32 cnst_6 = {6, 6, 6, 6};
++    v4i32 cnst_9 = {9, 9, 9, 9};
++    v4i32 cnst_1 = {1, 1, 1, 1};
++
++    LD_SH8(block, 8, in0, in1, in2, in3, in4, in5, in6, in7);
++    UNPCK_R_SH_SW(in0, in_r0);
++    UNPCK_R_SH_SW(in1, in_r1);
++    UNPCK_R_SH_SW(in2, in_r2);
++    UNPCK_R_SH_SW(in3, in_r3);
++    UNPCK_R_SH_SW(in4, in_r4);
++    UNPCK_R_SH_SW(in5, in_r5);
++    UNPCK_R_SH_SW(in6, in_r6);
++    UNPCK_R_SH_SW(in7, in_r7);
++    // First loop
++    TRANSPOSE4x4_SW_SW(in_r0, in_r1, in_r2, in_r3, in_r0, in_r1, in_r2, in_r3);
++    TRANSPOSE4x4_SW_SW(in_r4, in_r5, in_r6, in_r7, in_r4, in_r5, in_r6, in_r7);
++    t1 = cnst_17 * (in_r0 + in_r2) + cnst_4;
++    t5 = cnst_17 * (in_r4 + in_r6) + cnst_4;
++    t2 = cnst_17 * (in_r0 - in_r2) + cnst_4;
++    t6 = cnst_17 * (in_r4 - in_r6) + cnst_4;
++    t3 = cnst_22 * in_r1 + cnst_10 * in_r3;
++    t7 = cnst_22 * in_r5 + cnst_10 * in_r7;
++    t4 = cnst_22 * in_r3 - cnst_10 * in_r1;
++    t8 = cnst_22 * in_r7 - cnst_10 * in_r5;
++
++    in_r0 = (t1 + t3) >> 3;
++    in_r4 = (t5 + t7) >> 3;
++    in_r1 = (t2 - t4) >> 3;
++    in_r5 = (t6 - t8) >> 3;
++    in_r2 = (t2 + t4) >> 3;
++    in_r6 = (t6 + t8) >> 3;
++    in_r3 = (t1 - t3) >> 3;
++    in_r7 = (t5 - t7) >> 3;
++    TRANSPOSE4x4_SW_SW(in_r0, in_r1, in_r2, in_r3, in_r0, in_r1, in_r2, in_r3);
++    TRANSPOSE4x4_SW_SW(in_r4, in_r5, in_r6, in_r7, in_r4, in_r5, in_r6, in_r7);
++    PCKEV_H4_SH(in_r1, in_r0, in_r3, in_r2, in_r5, in_r4, in_r7, in_r6,
++                in0, in1, in2, in3);
++    ST_D8(in0, in1, in2, in3, 0, 1, 0, 1, 0, 1, 0, 1, block, 8);
++    // Second loop
++    t1 = cnst_12 * (in_r0 + in_r4) + cnst_64;
++    t2 = cnst_12 * (in_r0 - in_r4) + cnst_64;
++    t3 = cnst_16 * in_r2 + cnst_6 * in_r6;
++    t4 = cnst_6 * in_r2 - cnst_16 * in_r6;
++    t5 = t1 + t3, t6 = t2 + t4;
++    t7 = t2 - t4, t8 = t1 - t3;
++    t1 = cnst_16 * in_r1 + cnst_15 * in_r3 + cnst_9 * in_r5 + cnst_4 * in_r7;
++    t2 = cnst_15 * in_r1 - cnst_4 * in_r3 - cnst_16 * in_r5 - cnst_9 * in_r7;
++    t3 = cnst_9 * in_r1 - cnst_16 * in_r3 + cnst_4 * in_r5 + cnst_15 * in_r7;
++    t4 = cnst_4 * in_r1 - cnst_9 * in_r3 + cnst_15 * in_r5 - cnst_16 * in_r7;
++    LD_SW8(dest, linesize, dst0, dst1, dst2, dst3, dst4, dst5, dst6, dst7);
++    ILVR_B8_SW(zero_m, dst0, zero_m, dst1, zero_m, dst2, zero_m, dst3,
++               zero_m, dst4, zero_m, dst5, zero_m, dst6, zero_m, dst7,
++               dst0, dst1, dst2, dst3, dst4, dst5, dst6, dst7);
++    ILVR_H4_SW(zero_m, dst0, zero_m, dst1, zero_m, dst2, zero_m, dst3,
++               dst0, dst1, dst2, dst3);
++    ILVR_H4_SW(zero_m, dst4, zero_m, dst5, zero_m, dst6, zero_m, dst7,
++               dst4, dst5, dst6, dst7);
++    in_r0 = (t5 + t1) >> 7;
++    in_r1 = (t6 + t2) >> 7;
++    in_r2 = (t7 + t3) >> 7;
++    in_r3 = (t8 + t4) >> 7;
++    in_r4 = (t8 - t4 + cnst_1) >> 7;
++    in_r5 = (t7 - t3 + cnst_1) >> 7;
++    in_r6 = (t6 - t2 + cnst_1) >> 7;
++    in_r7 = (t5 - t1 + cnst_1) >> 7;
++    ADD4(in_r0, dst0, in_r1, dst1, in_r2, dst2, in_r3, dst3,
++         in_r0, in_r1, in_r2, in_r3);
++    ADD4(in_r4, dst4, in_r5, dst5, in_r6, dst6, in_r7, dst7,
++         in_r4, in_r5, in_r6, in_r7);
++    CLIP_SW8_0_255(in_r0, in_r1, in_r2, in_r3, in_r4, in_r5, in_r6, in_r7);
++    PCKEV_H4_SH(in_r1, in_r0, in_r3, in_r2, in_r5, in_r4, in_r7, in_r6,
++                in0, in1, in2, in3);
++    PCKEV_B2_SH(in1, in0, in3, in2, in0, in1);
++    ST_W8(in0, in1, 0, 1, 2, 3, 0, 1, 2, 3, dest, linesize);
++}
++
++void ff_vc1_inv_trans_8x4_msa(uint8_t *dest, ptrdiff_t linesize, int16_t *block)
++{
++    v4i32 in0, in1, in2, in3, in4, in5, in6, in7;
++    v4i32 t1, t2, t3, t4, t5, t6, t7, t8;
++    v4i32 dst0, dst1, dst2, dst3, dst4, dst5, dst6, dst7;
++    v16i8 zero_m = { 0 };
++    v4i32 cnst_17 = {17, 17, 17, 17};
++    v4i32 cnst_22 = {22, 22, 22, 22};
++    v4i32 cnst_10 = {10, 10, 10, 10};
++    v4i32 cnst_12 = {12, 12, 12, 12};
++    v4i32 cnst_64 = {64, 64, 64, 64};
++    v4i32 cnst_16 = {16, 16, 16, 16};
++    v4i32 cnst_15 = {15, 15, 15, 15};
++    v4i32 cnst_4 = {4, 4, 4, 4};
++    v4i32 cnst_6 = {6, 6, 6, 6};
++    v4i32 cnst_9 = {9, 9, 9, 9};
++
++    LD_SW4(block, 8, t1, t2, t3, t4);
++    UNPCK_SH_SW(t1, in0, in4);
++    UNPCK_SH_SW(t2, in1, in5);
++    UNPCK_SH_SW(t3, in2, in6);
++    UNPCK_SH_SW(t4, in3, in7);
++    TRANSPOSE4x4_SW_SW(in0, in1, in2, in3, in0, in1, in2, in3);
++    TRANSPOSE4x4_SW_SW(in4, in5, in6, in7, in4, in5, in6, in7);
++    // First loop
++    t1 = cnst_12 * (in0 + in4) + cnst_4;
++    t2 = cnst_12 * (in0 - in4) + cnst_4;
++    t3 = cnst_16 * in2 + cnst_6 * in6;
++    t4 = cnst_6 * in2 - cnst_16 * in6;
++    t5 = t1 + t3, t6 = t2 + t4;
++    t7 = t2 - t4, t8 = t1 - t3;
++    t1 = cnst_16 * in1 + cnst_15 * in3 + cnst_9 * in5 + cnst_4 * in7;
++    t2 = cnst_15 * in1 - cnst_4 * in3 - cnst_16 * in5 - cnst_9 * in7;
++    t3 = cnst_9 * in1 - cnst_16 * in3 + cnst_4 * in5 + cnst_15 * in7;
++    t4 = cnst_4 * in1 - cnst_9 * in3 + cnst_15 * in5 - cnst_16 * in7;
++    in0 = (t5 + t1) >> 3;
++    in1 = (t6 + t2) >> 3;
++    in2 = (t7 + t3) >> 3;
++    in3 = (t8 + t4) >> 3;
++    in4 = (t8 - t4) >> 3;
++    in5 = (t7 - t3) >> 3;
++    in6 = (t6 - t2) >> 3;
++    in7 = (t5 - t1) >> 3;
++    TRANSPOSE4x4_SW_SW(in0, in1, in2, in3, in0, in1, in2, in3);
++    TRANSPOSE4x4_SW_SW(in4, in5, in6, in7, in4, in5, in6, in7);
++    PCKEV_H4_SW(in4, in0, in5, in1, in6, in2, in7, in3, t1, t2, t3, t4);
++    ST_SW4(t1, t2, t3, t4, block, 8);
++    // Second loop
++    LD_SW4(dest, linesize, dst0, dst1, dst2, dst3);
++    ILVR_B4_SW(zero_m, dst0, zero_m, dst1, zero_m, dst2, zero_m, dst3,
++               dst0, dst1, dst2, dst3);
++    ILVL_H4_SW(zero_m, dst0, zero_m, dst1, zero_m, dst2, zero_m, dst3,
++               dst4, dst5, dst6, dst7);
++    ILVR_H4_SW(zero_m, dst0, zero_m, dst1, zero_m, dst2, zero_m, dst3,
++               dst0, dst1, dst2, dst3);
++    // Right part
++    t1 = cnst_17 * (in0 + in2) + cnst_64;
++    t2 = cnst_17 * (in0 - in2) + cnst_64;
++    t3 = cnst_22 * in1 + cnst_10 * in3;
++    t4 = cnst_22 * in3 - cnst_10 * in1;
++    in0 = (t1 + t3) >> 7;
++    in1 = (t2 - t4) >> 7;
++    in2 = (t2 + t4) >> 7;
++    in3 = (t1 - t3) >> 7;
++    ADD4(in0, dst0, in1, dst1, in2, dst2, in3, dst3, in0, in1, in2, in3);
++    CLIP_SW4_0_255(in0, in1, in2, in3);
++    // Left part
++    t5 = cnst_17 * (in4 + in6) + cnst_64;
++    t6 = cnst_17 * (in4 - in6) + cnst_64;
++    t7 = cnst_22 * in5 + cnst_10 * in7;
++    t8 = cnst_22 * in7 - cnst_10 * in5;
++    in4 = (t5 + t7) >> 7;
++    in5 = (t6 - t8) >> 7;
++    in6 = (t6 + t8) >> 7;
++    in7 = (t5 - t7) >> 7;
++    ADD4(in4, dst4, in5, dst5, in6, dst6, in7, dst7, in4, in5, in6, in7);
++    CLIP_SW4_0_255(in4, in5, in6, in7);
++    PCKEV_H4_SW(in4, in0, in5, in1, in6, in2, in7, in3, in0, in1, in2, in3);
++    PCKEV_B2_SW(in1, in0, in3, in2, in0, in1);
++    ST_D4(in0, in1, 0, 1, 0, 1, dest, linesize);
++}
++
++static void put_vc1_mspel_mc_h_v_msa(uint8_t *dst, const uint8_t *src,
++                                     ptrdiff_t stride, int hmode, int vmode,
++                                     int rnd)
++{
++    v8i16 in_r0, in_r1, in_r2, in_r3, in_l0, in_l1, in_l2, in_l3;
++    v8i16 t0, t1, t2, t3, t4, t5, t6, t7;
++    v8i16 t8, t9, t10, t11, t12, t13, t14, t15;
++    v8i16 cnst_para0, cnst_para1, cnst_para2, cnst_para3, cnst_r;
++    static const int para_value[][4] = {{4, 53, 18, 3},
++                                        {1, 9, 9, 1},
++                                        {3, 18, 53, 4}};
++    static const int shift_value[] = {0, 5, 1, 5};
++    int shift = (shift_value[hmode] + shift_value[vmode]) >> 1;
++    int r = (1 << (shift - 1)) + rnd - 1;
++    cnst_r = __msa_fill_h(r);
++    src -= 1, src -= stride;
++    cnst_para0 = __msa_fill_h(para_value[vmode - 1][0]);
++    cnst_para1 = __msa_fill_h(para_value[vmode - 1][1]);
++    cnst_para2 = __msa_fill_h(para_value[vmode - 1][2]);
++    cnst_para3 = __msa_fill_h(para_value[vmode - 1][3]);
++    LD_SH4(src, stride, in_l0, in_l1, in_l2, in_l3);
++    UNPCK_UB_SH(in_l0, in_r0, in_l0);
++    UNPCK_UB_SH(in_l1, in_r1, in_l1);
++    UNPCK_UB_SH(in_l2, in_r2, in_l2);
++    UNPCK_UB_SH(in_l3, in_r3, in_l3);
++    // row 0
++    t0 = cnst_para1 * in_r1 + cnst_para2 * in_r2
++         - cnst_para0 * in_r0 - cnst_para3 * in_r3;
++    t8 = cnst_para1 * in_l1 + cnst_para2 * in_l2
++         - cnst_para0 * in_l0 - cnst_para3 * in_l3;
++    in_l0 = LD_SH(src + 4 * stride);
++    UNPCK_UB_SH(in_l0, in_r0, in_l0);
++    // row 1
++    t1 = cnst_para1 * in_r2 + cnst_para2 * in_r3
++         - cnst_para0 * in_r1 - cnst_para3 * in_r0;
++    t9 = cnst_para1 * in_l2 + cnst_para2 * in_l3
++         - cnst_para0 * in_l1 - cnst_para3 * in_l0;
++    in_l1 = LD_SH(src + 5 * stride);
++    UNPCK_UB_SH(in_l1, in_r1, in_l1);
++    // row 2
++    t2 = cnst_para1 * in_r3 + cnst_para2 * in_r0
++         - cnst_para0 * in_r2 - cnst_para3 * in_r1;
++    t10 = cnst_para1 * in_l3 + cnst_para2 * in_l0
++          - cnst_para0 * in_l2 - cnst_para3 * in_l1;
++    in_l2 = LD_SH(src + 6 * stride);
++    UNPCK_UB_SH(in_l2, in_r2, in_l2);
++    // row 3
++    t3 = cnst_para1 * in_r0 + cnst_para2 * in_r1
++         - cnst_para0 * in_r3 - cnst_para3 * in_r2;
++    t11 = cnst_para1 * in_l0 + cnst_para2 * in_l1
++          - cnst_para0 * in_l3 - cnst_para3 * in_l2;
++    in_l3 = LD_SH(src + 7 * stride);
++    UNPCK_UB_SH(in_l3, in_r3, in_l3);
++    // row 4
++    t4 = cnst_para1 * in_r1 + cnst_para2 * in_r2
++         - cnst_para0 * in_r0 - cnst_para3 * in_r3;
++    t12 = cnst_para1 * in_l1 + cnst_para2 * in_l2
++          - cnst_para0 * in_l0 - cnst_para3 * in_l3;
++    in_l0 = LD_SH(src + 8 * stride);
++    UNPCK_UB_SH(in_l0, in_r0, in_l0);
++    // row 5
++    t5 = cnst_para1 * in_r2 + cnst_para2 * in_r3
++         - cnst_para0 * in_r1 - cnst_para3 * in_r0;
++    t13 = cnst_para1 * in_l2 + cnst_para2 * in_l3
++          - cnst_para0 * in_l1 - cnst_para3 * in_l0;
++    in_l1 = LD_SH(src + 9 * stride);
++    UNPCK_UB_SH(in_l1, in_r1, in_l1);
++    // row 6
++    t6 = cnst_para1 * in_r3 + cnst_para2 * in_r0
++         - cnst_para0 * in_r2 - cnst_para3 * in_r1;
++    t14 = cnst_para1 * in_l3 + cnst_para2 * in_l0
++          - cnst_para0 * in_l2 - cnst_para3 * in_l1;
++    in_l2 = LD_SH(src + 10 * stride);
++    UNPCK_UB_SH(in_l2, in_r2, in_l2);
++    // row 7
++    t7 = cnst_para1 * in_r0 + cnst_para2 * in_r1
++         - cnst_para0 * in_r3 - cnst_para3 * in_r2;
++    t15 = cnst_para1 * in_l0 + cnst_para2 * in_l1
++          - cnst_para0 * in_l3 - cnst_para3 * in_l2;
++
++    ADD4(t0, cnst_r, t1, cnst_r, t2, cnst_r, t3, cnst_r, t0, t1, t2, t3);
++    ADD4(t4, cnst_r, t5, cnst_r, t6, cnst_r, t7, cnst_r, t4, t5, t6, t7);
++    ADD4(t8, cnst_r, t9, cnst_r, t10, cnst_r, t11, cnst_r,
++         t8, t9, t10, t11);
++    ADD4(t12, cnst_r, t13, cnst_r, t14, cnst_r, t15, cnst_r,
++         t12, t13, t14, t15);
++    t0 >>= shift, t1 >>= shift, t2 >>= shift, t3 >>= shift;
++    t4 >>= shift, t5 >>= shift, t6 >>= shift, t7 >>= shift;
++    t8 >>= shift, t9 >>= shift, t10 >>= shift, t11 >>= shift;
++    t12 >>= shift, t13 >>= shift, t14 >>= shift, t15 >>= shift;
++    TRANSPOSE8x8_SH_SH(t0, t1, t2, t3, t4, t5, t6, t7,
++                       t0, t1, t2, t3, t4, t5, t6, t7);
++    TRANSPOSE8x8_SH_SH(t8, t9, t10, t11, t12, t13, t14, t15,
++                       t8, t9, t10, t11, t12, t13, t14, t15);
++    cnst_para0 = __msa_fill_h(para_value[hmode - 1][0]);
++    cnst_para1 = __msa_fill_h(para_value[hmode - 1][1]);
++    cnst_para2 = __msa_fill_h(para_value[hmode - 1][2]);
++    cnst_para3 = __msa_fill_h(para_value[hmode - 1][3]);
++    r = 64 - rnd;
++    cnst_r = __msa_fill_h(r);
++    // col 0 ~ 7
++    t0 = cnst_para1 * t1 + cnst_para2 * t2 - cnst_para0 * t0 - cnst_para3 * t3;
++    t1 = cnst_para1 * t2 + cnst_para2 * t3 - cnst_para0 * t1 - cnst_para3 * t4;
++    t2 = cnst_para1 * t3 + cnst_para2 * t4 - cnst_para0 * t2 - cnst_para3 * t5;
++    t3 = cnst_para1 * t4 + cnst_para2 * t5 - cnst_para0 * t3 - cnst_para3 * t6;
++    t4 = cnst_para1 * t5 + cnst_para2 * t6 - cnst_para0 * t4 - cnst_para3 * t7;
++    t5 = cnst_para1 * t6 + cnst_para2 * t7 - cnst_para0 * t5 - cnst_para3 * t8;
++    t6 = cnst_para1 * t7 + cnst_para2 * t8 - cnst_para0 * t6 - cnst_para3 * t9;
++    t7 = cnst_para1 * t8 + cnst_para2 * t9 - cnst_para0 * t7 - cnst_para3 * t10;
++    ADD4(t0, cnst_r, t1, cnst_r, t2, cnst_r, t3, cnst_r, t0, t1, t2, t3);
++    ADD4(t4, cnst_r, t5, cnst_r, t6, cnst_r, t7, cnst_r, t4, t5, t6, t7);
++    t0 >>= 7, t1 >>= 7, t2 >>= 7, t3 >>= 7;
++    t4 >>= 7, t5 >>= 7, t6 >>= 7, t7 >>= 7;
++    TRANSPOSE8x8_SH_SH(t0, t1, t2, t3, t4, t5, t6, t7,
++                       t0, t1, t2, t3, t4, t5, t6, t7);
++    CLIP_SH8_0_255(t0, t1, t2, t3, t4, t5, t6, t7);
++    PCKEV_B4_SH(t1, t0, t3, t2, t5, t4, t7, t6, t0, t1, t2, t3);
++    ST_D8(t0, t1, t2, t3, 0, 1, 0, 1, 0, 1, 0, 1, dst, stride);
++}
++
++#define PUT_VC1_MSPEL_MC_MSA(hmode, vmode)                                    \
++void ff_put_vc1_mspel_mc ## hmode ## vmode ## _msa(uint8_t *dst,              \
++                                                const uint8_t *src,           \
++                                                ptrdiff_t stride, int rnd)    \
++{                                                                             \
++    put_vc1_mspel_mc_h_v_msa(dst, src, stride, hmode, vmode, rnd);            \
++}                                                                             \
++void ff_put_vc1_mspel_mc ## hmode ## vmode ## _16_msa(uint8_t *dst,           \
++                                                   const uint8_t *src,        \
++                                                   ptrdiff_t stride, int rnd) \
++{                                                                             \
++    put_vc1_mspel_mc_h_v_msa(dst, src, stride, hmode, vmode, rnd);            \
++    put_vc1_mspel_mc_h_v_msa(dst + 8, src + 8, stride, hmode, vmode, rnd);    \
++    dst += 8 * stride, src += 8 * stride;                                     \
++    put_vc1_mspel_mc_h_v_msa(dst, src, stride, hmode, vmode, rnd);            \
++    put_vc1_mspel_mc_h_v_msa(dst + 8, src + 8, stride, hmode, vmode, rnd);    \
++}
++
++PUT_VC1_MSPEL_MC_MSA(1, 1);
++PUT_VC1_MSPEL_MC_MSA(1, 2);
++PUT_VC1_MSPEL_MC_MSA(1, 3);
++
++PUT_VC1_MSPEL_MC_MSA(2, 1);
++PUT_VC1_MSPEL_MC_MSA(2, 2);
++PUT_VC1_MSPEL_MC_MSA(2, 3);
++
++PUT_VC1_MSPEL_MC_MSA(3, 1);
++PUT_VC1_MSPEL_MC_MSA(3, 2);
++PUT_VC1_MSPEL_MC_MSA(3, 3);
+diff -uNra ffmpeg-4.1.6/libavcodec/mips/videodsp_init.c FFmpeg/libavcodec/mips/videodsp_init.c
+--- a/libavcodec/mips/videodsp_init.c	2020-07-03 23:10:59.000000000 +0800
++++ b/libavcodec/mips/videodsp_init.c	2020-07-19 18:19:52.764090369 +0800
+@@ -18,12 +18,12 @@
+  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+  */
+ 
++#include "libavutil/mips/cpu.h"
+ #include "config.h"
+ #include "libavutil/attributes.h"
+ #include "libavutil/mips/asmdefs.h"
+ #include "libavcodec/videodsp.h"
+ 
+-#if HAVE_MSA
+ static void prefetch_mips(uint8_t *mem, ptrdiff_t stride, int h)
+ {
+     register const uint8_t *p = mem;
+@@ -41,11 +41,11 @@
+         : [stride] "r" (stride)
+     );
+ }
+-#endif  // #if HAVE_MSA
+ 
+ av_cold void ff_videodsp_init_mips(VideoDSPContext *ctx, int bpc)
+ {
+-#if HAVE_MSA
+-    ctx->prefetch = prefetch_mips;
+-#endif  // #if HAVE_MSA
++    int cpu_flags = av_get_cpu_flags();
++
++    if (have_msa(cpu_flags))
++        ctx->prefetch = prefetch_mips;
+ }
+diff -uNra ffmpeg-4.1.6/libavcodec/mips/vp3dsp_idct_mmi.c FFmpeg/libavcodec/mips/vp3dsp_idct_mmi.c
+--- a/libavcodec/mips/vp3dsp_idct_mmi.c	1970-01-01 08:00:00.000000000 +0800
++++ b/libavcodec/mips/vp3dsp_idct_mmi.c	2020-07-19 18:13:57.513110563 +0800
+@@ -0,0 +1,769 @@
++/*
++ * Copyright (c) 2018 gxw <guxiwei-hf@loongson.cn>
++ *
++ * This file is part of FFmpeg.
++ *
++ * FFmpeg is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * FFmpeg is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with FFmpeg; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
++ */
++
++#include "vp3dsp_mips.h"
++#include "libavutil/intreadwrite.h"
++#include "libavutil/mips/mmiutils.h"
++#include "libavutil/common.h"
++#include "libavcodec/rnd_avg.h"
++
++#define LOAD_CONST(dst, value)                        \
++    "li     %[tmp1],      "#value"              \n\t" \
++    "dmtc1  %[tmp1],      "#dst"                \n\t" \
++    "pshufh "#dst",       "#dst",     %[ftmp10] \n\t"
++
++static void idct_row_mmi(int16_t *input)
++{
++    double ftmp[23];
++    uint64_t tmp[2];
++    __asm__ volatile (
++        "xor        %[ftmp10],      %[ftmp10],        %[ftmp10] \n\t"
++        LOAD_CONST(%[csth_1], 1)
++        "li         %[tmp0],        0x02                        \n\t"
++        "1:                                                     \n\t"
++        /* Load input */
++        "ldc1       %[ftmp0],       0x00(%[input])              \n\t"
++        "ldc1       %[ftmp1],       0x10(%[input])              \n\t"
++        "ldc1       %[ftmp2],       0x20(%[input])              \n\t"
++        "ldc1       %[ftmp3],       0x30(%[input])              \n\t"
++        "ldc1       %[ftmp4],       0x40(%[input])              \n\t"
++        "ldc1       %[ftmp5],       0x50(%[input])              \n\t"
++        "ldc1       %[ftmp6],       0x60(%[input])              \n\t"
++        "ldc1       %[ftmp7],       0x70(%[input])              \n\t"
++        LOAD_CONST(%[ftmp8], 64277)
++        LOAD_CONST(%[ftmp9], 12785)
++        "pmulhh     %[A],           %[ftmp9],         %[ftmp7]  \n\t"
++        "pcmpgth    %[C],           %[ftmp10],        %[ftmp1]  \n\t"
++        "or         %[mask],        %[C],             %[csth_1] \n\t"
++        "pmullh     %[B],           %[ftmp1],         %[mask]   \n\t"
++        "pmulhuh    %[B],           %[ftmp8],         %[B]      \n\t"
++        "pmullh     %[B],           %[B],             %[mask]   \n\t"
++        "paddh      %[A],           %[A],             %[B]      \n\t"
++        "paddh      %[A],           %[A],             %[C]      \n\t"
++        "pcmpgth    %[D],           %[ftmp10],        %[ftmp7]  \n\t"
++        "or         %[mask],        %[D],             %[csth_1] \n\t"
++        "pmullh     %[ftmp7],       %[ftmp7],         %[mask]   \n\t"
++        "pmulhuh    %[B],           %[ftmp8],         %[ftmp7]  \n\t"
++        "pmullh     %[B],           %[B],             %[mask]   \n\t"
++        "pmulhh     %[C],           %[ftmp9],         %[ftmp1]  \n\t"
++        "psubh      %[B],           %[C],             %[B]      \n\t"
++        "psubh      %[B],           %[B],             %[D]      \n\t"
++
++        LOAD_CONST(%[ftmp8], 54491)
++        LOAD_CONST(%[ftmp9], 36410)
++        "pcmpgth    %[Ad],          %[ftmp10],        %[ftmp5]  \n\t"
++        "or         %[mask],        %[Ad],            %[csth_1] \n\t"
++        "pmullh     %[ftmp1],       %[ftmp5],         %[mask]   \n\t"
++        "pmulhuh    %[C],           %[ftmp9],         %[ftmp1]  \n\t"
++        "pmullh     %[C],           %[C],             %[mask]   \n\t"
++        "pcmpgth    %[Bd],          %[ftmp10],        %[ftmp3]  \n\t"
++        "or         %[mask],        %[Bd],            %[csth_1] \n\t"
++        "pmullh     %[D],           %[ftmp3],         %[mask]   \n\t"
++        "pmulhuh    %[D],           %[ftmp8],         %[D]      \n\t"
++        "pmullh     %[D],           %[D],             %[mask]   \n\t"
++        "paddh      %[C],           %[C],             %[D]      \n\t"
++        "paddh      %[C],           %[C],             %[Ad]     \n\t"
++        "paddh      %[C],           %[C],             %[Bd]     \n\t"
++        "pcmpgth    %[Bd],          %[ftmp10],        %[ftmp3]  \n\t"
++        "or         %[mask],        %[Bd],            %[csth_1] \n\t"
++        "pmullh     %[ftmp1],       %[ftmp3],         %[mask]   \n\t"
++        "pmulhuh    %[D],           %[ftmp9],         %[ftmp1]  \n\t"
++        "pmullh     %[D],           %[D],             %[mask]   \n\t"
++        "pcmpgth    %[Ed],          %[ftmp10],        %[ftmp5]  \n\t"
++        "or         %[mask],        %[Ed],            %[csth_1] \n\t"
++        "pmullh     %[Ad],          %[ftmp5],         %[mask]   \n\t"
++        "pmulhuh    %[Ad],          %[ftmp8],         %[Ad]     \n\t"
++        "pmullh     %[Ad],          %[Ad],            %[mask]   \n\t"
++        "psubh      %[D],           %[Ad],            %[D]      \n\t"
++        "paddh      %[D],           %[D],             %[Ed]     \n\t"
++        "psubh      %[D],           %[D],             %[Bd]     \n\t"
++
++        LOAD_CONST(%[ftmp8], 46341)
++        "psubh      %[Ad],          %[A],             %[C]      \n\t"
++        "pcmpgth    %[Bd],          %[ftmp10],        %[Ad]     \n\t"
++        "or         %[mask],        %[Bd],            %[csth_1] \n\t"
++        "pmullh     %[Ad],          %[Ad],            %[mask]   \n\t"
++        "pmulhuh    %[Ad],          %[ftmp8],         %[Ad]     \n\t"
++        "pmullh     %[Ad],          %[Ad],            %[mask]   \n\t"
++        "paddh      %[Ad],          %[Ad],            %[Bd]     \n\t"
++        "psubh      %[Bd],          %[B],             %[D]      \n\t"
++        "pcmpgth    %[Cd],          %[ftmp10],        %[Bd]     \n\t"
++        "or         %[mask],        %[Cd],            %[csth_1] \n\t"
++        "pmullh     %[Bd],          %[Bd],            %[mask]   \n\t"
++        "pmulhuh    %[Bd],          %[ftmp8],         %[Bd]     \n\t"
++        "pmullh     %[Bd],          %[Bd],            %[mask]   \n\t"
++        "paddh      %[Bd],          %[Bd],            %[Cd]     \n\t"
++        "paddh      %[Cd],          %[A],             %[C]      \n\t"
++        "paddh      %[Dd],          %[B],             %[D]      \n\t"
++        "paddh      %[A],           %[ftmp0],         %[ftmp4]  \n\t"
++        "pcmpgth    %[B],           %[ftmp10],        %[A]      \n\t"
++        "or         %[mask],        %[B],             %[csth_1] \n\t"
++        "pmullh     %[A],           %[A],             %[mask]   \n\t"
++        "pmulhuh    %[A],           %[ftmp8],         %[A]      \n\t"
++        "pmullh     %[A],           %[A],             %[mask]   \n\t"
++        "paddh      %[A],           %[A],             %[B]      \n\t"
++        "psubh      %[B],           %[ftmp0],         %[ftmp4]  \n\t"
++        "pcmpgth    %[C],           %[ftmp10],        %[B]      \n\t"
++        "or         %[mask],        %[C],             %[csth_1] \n\t"
++        "pmullh     %[B],           %[B],             %[mask]   \n\t"
++        "pmulhuh    %[B],           %[ftmp8],         %[B]      \n\t"
++        "pmullh     %[B],           %[B],             %[mask]   \n\t"
++        "paddh      %[B],           %[B],             %[C]      \n\t"
++
++        LOAD_CONST(%[ftmp8], 60547)
++        LOAD_CONST(%[ftmp9], 25080)
++        "pmulhh     %[C],           %[ftmp9],         %[ftmp6]  \n\t"
++        "pcmpgth    %[D],           %[ftmp10],        %[ftmp2]  \n\t"
++        "or         %[mask],        %[D],             %[csth_1] \n\t"
++        "pmullh     %[Ed],          %[ftmp2],         %[mask]   \n\t"
++        "pmulhuh    %[Ed],          %[ftmp8],         %[Ed]     \n\t"
++        "pmullh     %[Ed],          %[Ed],            %[mask]   \n\t"
++        "paddh      %[C],           %[C],             %[Ed]     \n\t"
++        "paddh      %[C],           %[C],             %[D]      \n\t"
++        "pcmpgth    %[Ed],          %[ftmp10],        %[ftmp6]  \n\t"
++        "or         %[mask],        %[Ed],            %[csth_1] \n\t"
++        "pmullh     %[ftmp6],       %[ftmp6],         %[mask]   \n\t"
++        "pmulhuh    %[D],           %[ftmp8],         %[ftmp6]  \n\t"
++        "pmullh     %[D],           %[D],             %[mask]   \n\t"
++        "pmulhh     %[Gd],          %[ftmp9],         %[ftmp2]  \n\t"
++        "psubh      %[D],           %[Gd],            %[D]      \n\t"
++        "psubh      %[D],           %[D],             %[Ed]     \n\t"
++        "psubh      %[Ed],          %[A],             %[C]      \n\t"
++        "paddh      %[Gd],          %[A],             %[C]      \n\t"
++        "paddh      %[A],           %[B],             %[Ad]     \n\t"
++        "psubh      %[C],           %[B],             %[Ad]     \n\t"
++        "psubh      %[B],           %[Bd],            %[D]      \n\t"
++        "paddh      %[D],           %[Bd],            %[D]      \n\t"
++        /* Final sequence of operations over-write original inputs */
++        "paddh      %[ftmp0],       %[Gd],            %[Cd]     \n\t"
++        "paddh      %[ftmp1],       %[A],             %[D]      \n\t"
++        "psubh      %[ftmp2],       %[A],             %[D]      \n\t"
++        "paddh      %[ftmp3],       %[Ed],            %[Dd]     \n\t"
++        "psubh      %[ftmp4],       %[Ed],            %[Dd]     \n\t"
++        "paddh      %[ftmp5],       %[C],             %[B]      \n\t"
++        "psubh      %[ftmp6],       %[C],             %[B]      \n\t"
++        "psubh      %[ftmp7],       %[Gd],            %[Cd]     \n\t"
++        "sdc1       %[ftmp0],       0x00(%[input])              \n\t"
++        "sdc1       %[ftmp1],       0x10(%[input])              \n\t"
++        "sdc1       %[ftmp2],       0x20(%[input])              \n\t"
++        "sdc1       %[ftmp3],       0x30(%[input])              \n\t"
++        "sdc1       %[ftmp4],       0x40(%[input])              \n\t"
++        "sdc1       %[ftmp5],       0x50(%[input])              \n\t"
++        "sdc1       %[ftmp6],       0x60(%[input])              \n\t"
++        "sdc1       %[ftmp7],       0x70(%[input])              \n\t"
++        PTR_ADDU   "%[tmp0],        %[tmp0],          -0x01     \n\t"
++        PTR_ADDIU  "%[input],       %[input],         0x08      \n\t"
++        "bnez       %[tmp0],        1b                          \n\t"
++        : [input]"+&r"(input), [tmp0]"=&r"(tmp[0]), [tmp1]"=&r"(tmp[1]),
++          [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]), [ftmp2]"=&f"(ftmp[2]),
++          [ftmp3]"=&f"(ftmp[3]), [ftmp4]"=&f"(ftmp[4]), [ftmp5]"=&f"(ftmp[5]),
++          [ftmp6]"=&f"(ftmp[6]), [ftmp7]"=&f"(ftmp[7]), [ftmp8]"=&f"(ftmp[8]),
++          [ftmp9]"=&f"(ftmp[9]), [ftmp10]"=&f"(ftmp[10]), [mask]"=&f"(ftmp[11]),
++          [A]"=&f"(ftmp[12]), [B]"=&f"(ftmp[13]), [C]"=&f"(ftmp[14]),
++          [D]"=&f"(ftmp[15]), [Ad]"=&f"(ftmp[16]), [Bd]"=&f"(ftmp[17]),
++          [Cd]"=&f"(ftmp[18]), [Dd]"=&f"(ftmp[19]), [Ed]"=&f"(ftmp[20]),
++          [Gd]"=&f"(ftmp[21]), [csth_1]"=&f"(ftmp[22])
++        :
++        : "memory"
++    );
++}
++
++static void idct_column_true_mmi(uint8_t *dst, int stride, int16_t *input)
++{
++    uint8_t temp_value[8];
++    double ftmp[23];
++    uint64_t tmp[2];
++    for (int i = 0; i < 8; ++i)
++        temp_value[i] = av_clip_uint8(128 + ((46341 * input[i << 3] + (8 << 16)) >> 20));
++    __asm__ volatile (
++        "xor        %[ftmp10],      %[ftmp10],          %[ftmp10] \n\t"
++        "li         %[tmp0],        0x02                          \n\t"
++        "1:                                                       \n\t"
++        "ldc1       %[ftmp0],       0x00(%[input])                \n\t"
++        "ldc1       %[ftmp4],       0x08(%[input])                \n\t"
++        "ldc1       %[ftmp1],       0x10(%[input])                \n\t"
++        "ldc1       %[ftmp5],       0x18(%[input])                \n\t"
++        "ldc1       %[ftmp2],       0x20(%[input])                \n\t"
++        "ldc1       %[ftmp6],       0x28(%[input])                \n\t"
++        "ldc1       %[ftmp3],       0x30(%[input])                \n\t"
++        "ldc1       %[ftmp7],       0x38(%[input])                \n\t"
++        TRANSPOSE_4H(%[ftmp0], %[ftmp1], %[ftmp2], %[ftmp3],
++                     %[A], %[B], %[C], %[D])
++        TRANSPOSE_4H(%[ftmp4], %[ftmp5], %[ftmp6], %[ftmp7],
++                     %[A], %[B], %[C], %[D])
++        LOAD_CONST(%[ftmp8], 64277)
++        LOAD_CONST(%[ftmp9], 12785)
++        LOAD_CONST(%[Gd], 1)
++        "pmulhh     %[A],           %[ftmp9],           %[ftmp7]  \n\t"
++        "pcmpgth    %[C],           %[ftmp10],          %[ftmp1]  \n\t"
++        "or         %[mask],        %[C],               %[Gd]     \n\t"
++        "pmullh     %[B],           %[ftmp1],           %[mask]   \n\t"
++        "pmulhuh    %[B],           %[ftmp8],           %[B]      \n\t"
++        "pmullh     %[B],           %[B],               %[mask]   \n\t"
++        "paddh      %[A],           %[A],               %[B]      \n\t"
++        "paddh      %[A],           %[A],               %[C]      \n\t"
++        "pcmpgth    %[D],           %[ftmp10],          %[ftmp7]  \n\t"
++        "or         %[mask],        %[D],               %[Gd]     \n\t"
++        "pmullh     %[Ad],          %[ftmp7],           %[mask]   \n\t"
++        "pmulhuh    %[B],           %[ftmp8],           %[Ad]     \n\t"
++        "pmullh     %[B],           %[B],               %[mask]   \n\t"
++        "pmulhh     %[C],           %[ftmp9],           %[ftmp1]  \n\t"
++        "psubh      %[B],           %[C],               %[B]      \n\t"
++        "psubh      %[B],           %[B],               %[D]      \n\t"
++
++        LOAD_CONST(%[ftmp8], 54491)
++        LOAD_CONST(%[ftmp9], 36410)
++        "pcmpgth    %[Ad],          %[ftmp10],          %[ftmp5]  \n\t"
++        "or         %[mask],        %[Ad],              %[Gd]     \n\t"
++        "pmullh     %[Cd],          %[ftmp5],           %[mask]   \n\t"
++        "pmulhuh    %[C],           %[ftmp9],           %[Cd]     \n\t"
++        "pmullh     %[C],           %[C],               %[mask]   \n\t"
++        "pcmpgth    %[Bd],          %[ftmp10],          %[ftmp3]  \n\t"
++        "or         %[mask],        %[Bd],              %[Gd]     \n\t"
++        "pmullh     %[D],           %[ftmp3],           %[mask]   \n\t"
++        "pmulhuh    %[D],           %[ftmp8],           %[D]      \n\t"
++        "pmullh     %[D],           %[D],               %[mask]   \n\t"
++        "paddh      %[C],           %[C],               %[D]      \n\t"
++        "paddh      %[C],           %[C],               %[Ad]     \n\t"
++        "paddh      %[C],           %[C],               %[Bd]     \n\t"
++        "pcmpgth    %[Bd],          %[ftmp10],          %[ftmp3]  \n\t"
++        "or         %[mask],        %[Bd],              %[Gd]     \n\t"
++        "pmullh     %[Cd],          %[ftmp3],           %[mask]   \n\t"
++        "pmulhuh    %[D],           %[ftmp9],           %[Cd]     \n\t"
++        "pmullh     %[D],           %[D],               %[mask]   \n\t"
++        "pcmpgth    %[Ed],          %[ftmp10],          %[ftmp5]  \n\t"
++        "or         %[mask],        %[Ed],              %[Gd]     \n\t"
++        "pmullh     %[Ad],          %[ftmp5],           %[mask]   \n\t"
++        "pmulhuh    %[Ad],          %[ftmp8],           %[Ad]     \n\t"
++        "pmullh     %[Ad],          %[Ad],              %[mask]   \n\t"
++        "psubh      %[D],           %[Ad],              %[D]      \n\t"
++        "paddh      %[D],           %[D],               %[Ed]     \n\t"
++        "psubh      %[D],           %[D],               %[Bd]     \n\t"
++
++        LOAD_CONST(%[ftmp8], 46341)
++        "psubh      %[Ad],          %[A],             %[C]        \n\t"
++        "pcmpgth    %[Bd],          %[ftmp10],        %[Ad]       \n\t"
++        "or         %[mask],        %[Bd],            %[Gd]       \n\t"
++        "pmullh     %[Ad],          %[Ad],            %[mask]     \n\t"
++        "pmulhuh    %[Ad],          %[ftmp8],         %[Ad]       \n\t"
++        "pmullh     %[Ad],          %[Ad],            %[mask]     \n\t"
++        "paddh      %[Ad],          %[Ad],            %[Bd]       \n\t"
++        "psubh      %[Bd],          %[B],             %[D]        \n\t"
++        "pcmpgth    %[Cd],          %[ftmp10],        %[Bd]       \n\t"
++        "or         %[mask],        %[Cd],            %[Gd]       \n\t"
++        "pmullh     %[Bd],          %[Bd],            %[mask]     \n\t"
++        "pmulhuh    %[Bd],          %[ftmp8],         %[Bd]       \n\t"
++        "pmullh     %[Bd],          %[Bd],            %[mask]     \n\t"
++        "paddh      %[Bd],          %[Bd],            %[Cd]       \n\t"
++        "paddh      %[Cd],          %[A],             %[C]        \n\t"
++        "paddh      %[Dd],          %[B],             %[D]        \n\t"
++
++        LOAD_CONST(%[Ed], 2056)
++        "paddh      %[A],           %[ftmp0],         %[ftmp4]    \n\t"
++        "pcmpgth    %[B],           %[ftmp10],        %[A]        \n\t"
++        "or         %[mask],        %[B],             %[Gd]       \n\t"
++        "pmullh     %[A],           %[A],             %[mask]     \n\t"
++        "pmulhuh    %[A],           %[ftmp8],         %[A]        \n\t"
++        "pmullh     %[A],           %[A],             %[mask]     \n\t"
++        "paddh      %[A],           %[A],             %[B]        \n\t"
++        "paddh      %[A],           %[A],             %[Ed]       \n\t"
++        "psubh      %[B],           %[ftmp0],         %[ftmp4]    \n\t"
++        "pcmpgth    %[C],           %[ftmp10],        %[B]        \n\t"
++        "or         %[mask],        %[C],             %[Gd]       \n\t"
++        "pmullh     %[B],           %[B],             %[mask]     \n\t"
++        "pmulhuh    %[B],           %[ftmp8],         %[B]        \n\t"
++        "pmullh     %[B],           %[B],             %[mask]     \n\t"
++        "paddh      %[B],           %[B],             %[C]        \n\t"
++        "paddh      %[B],           %[B],             %[Ed]       \n\t"
++
++        LOAD_CONST(%[ftmp8], 60547)
++        LOAD_CONST(%[ftmp9], 25080)
++        "pmulhh     %[C],           %[ftmp9],         %[ftmp6]    \n\t"
++        "pcmpgth    %[D],           %[ftmp10],        %[ftmp2]    \n\t"
++        "or         %[mask],        %[D],             %[Gd]       \n\t"
++        "pmullh     %[Ed],          %[ftmp2],         %[mask]     \n\t"
++        "pmulhuh    %[Ed],          %[ftmp8],         %[Ed]       \n\t"
++        "pmullh     %[Ed],          %[Ed],            %[mask]     \n\t"
++        "paddh      %[C],           %[C],             %[Ed]       \n\t"
++        "paddh      %[C],           %[C],             %[D]        \n\t"
++        "pcmpgth    %[Ed],          %[ftmp10],        %[ftmp6]    \n\t"
++        "or         %[mask],        %[Ed],            %[Gd]       \n\t"
++        "pmullh     %[D],           %[ftmp6],         %[mask]     \n\t"
++        "pmulhuh    %[D],           %[ftmp8],         %[D]        \n\t"
++        "pmullh     %[D],           %[D],             %[mask]     \n\t"
++        "pmulhh     %[Gd],          %[ftmp9],         %[ftmp2]    \n\t"
++        "psubh      %[D],           %[Gd],            %[D]        \n\t"
++        "psubh      %[D],           %[D],             %[Ed]       \n\t"
++        "psubh      %[Ed],          %[A],             %[C]        \n\t"
++        "paddh      %[Gd],          %[A],             %[C]        \n\t"
++        "paddh      %[A],           %[B],             %[Ad]       \n\t"
++        "psubh      %[C],           %[B],             %[Ad]       \n\t"
++        "psubh      %[B],           %[Bd],            %[D]        \n\t"
++        "paddh      %[D],           %[Bd],            %[D]        \n\t"
++        "or         %[mask],        %[ftmp1],         %[ftmp2]    \n\t"
++        "or         %[mask],        %[mask],          %[ftmp3]    \n\t"
++        "or         %[mask],        %[mask],          %[ftmp4]    \n\t"
++        "or         %[mask],        %[mask],          %[ftmp5]    \n\t"
++        "or         %[mask],        %[mask],          %[ftmp6]    \n\t"
++        "or         %[mask],        %[mask],          %[ftmp7]    \n\t"
++        "pcmpeqh    %[mask],        %[mask],          %[ftmp10]   \n\t"
++        "packushb   %[mask],        %[mask],          %[ftmp10]   \n\t"
++        "li         %[tmp1],        0x04                          \n\t"
++        "dmtc1      %[tmp1],        %[ftmp8]                      \n\t"
++        "paddh      %[ftmp0],       %[Gd],            %[Cd]       \n\t"
++        "psrah      %[ftmp0],       %[ftmp0],         %[ftmp8]    \n\t"
++        "paddh      %[ftmp1],       %[A],             %[D]        \n\t"
++        "psrah      %[ftmp1],       %[ftmp1],         %[ftmp8]    \n\t"
++        "psubh      %[ftmp2],       %[A],             %[D]        \n\t"
++        "psrah      %[ftmp2],       %[ftmp2],         %[ftmp8]    \n\t"
++        "paddh      %[ftmp3],       %[Ed],            %[Dd]       \n\t"
++        "psrah      %[ftmp3],       %[ftmp3],         %[ftmp8]    \n\t"
++        "psubh      %[ftmp4],       %[Ed],            %[Dd]       \n\t"
++        "psrah      %[ftmp4],       %[ftmp4],         %[ftmp8]    \n\t"
++        "paddh      %[ftmp5],       %[C],             %[B]        \n\t"
++        "psrah      %[ftmp5],       %[ftmp5],         %[ftmp8]    \n\t"
++        "psubh      %[ftmp6],       %[C],             %[B]        \n\t"
++        "psrah      %[ftmp6],       %[ftmp6],         %[ftmp8]    \n\t"
++        "psubh      %[ftmp7],       %[Gd],            %[Cd]       \n\t"
++        "psrah      %[ftmp7],       %[ftmp7],         %[ftmp8]    \n\t"
++        "pmaxsh     %[ftmp0],       %[ftmp0],         %[ftmp10]   \n\t"
++        "packushb   %[ftmp0],       %[ftmp0],         %[ftmp10]   \n\t"
++        "pmaxsh     %[ftmp1],       %[ftmp1],         %[ftmp10]   \n\t"
++        "packushb   %[ftmp1],       %[ftmp1],         %[ftmp10]   \n\t"
++        "pmaxsh     %[ftmp2],       %[ftmp2],         %[ftmp10]   \n\t"
++        "packushb   %[ftmp2],       %[ftmp2],         %[ftmp10]   \n\t"
++        "pmaxsh     %[ftmp3],       %[ftmp3],         %[ftmp10]   \n\t"
++        "packushb   %[ftmp3],       %[ftmp3],         %[ftmp10]   \n\t"
++        "pmaxsh     %[ftmp4],       %[ftmp4],         %[ftmp10]   \n\t"
++        "packushb   %[ftmp4],       %[ftmp4],         %[ftmp10]   \n\t"
++        "pmaxsh     %[ftmp5],       %[ftmp5],         %[ftmp10]   \n\t"
++        "packushb   %[ftmp5],       %[ftmp5],         %[ftmp10]   \n\t"
++        "pmaxsh     %[ftmp6],       %[ftmp6],         %[ftmp10]   \n\t"
++        "packushb   %[ftmp6],       %[ftmp6],         %[ftmp10]   \n\t"
++        "pmaxsh     %[ftmp7],       %[ftmp7],         %[ftmp10]   \n\t"
++        "packushb   %[ftmp7],       %[ftmp7],         %[ftmp10]   \n\t"
++
++        "lwc1       %[Ed],          0x00(%[temp_value])           \n\t"
++        "and        %[Ed],          %[Ed],            %[mask]     \n\t"
++        "paddb      %[ftmp0],       %[ftmp0],         %[Ed]       \n\t"
++        "paddb      %[ftmp1],       %[ftmp1],         %[Ed]       \n\t"
++        "paddb      %[ftmp2],       %[ftmp2],         %[Ed]       \n\t"
++        "paddb      %[ftmp3],       %[ftmp3],         %[Ed]       \n\t"
++        "paddb      %[ftmp4],       %[ftmp4],         %[Ed]       \n\t"
++        "paddb      %[ftmp5],       %[ftmp5],         %[Ed]       \n\t"
++        "paddb      %[ftmp6],       %[ftmp6],         %[Ed]       \n\t"
++        "paddb      %[ftmp7],       %[ftmp7],         %[Ed]       \n\t"
++        "swc1       %[ftmp0],       0x00(%[dst])                  \n\t"
++        PTR_ADDU   "%[tmp1],        %[dst],           %[stride]   \n\t"
++        "swc1       %[ftmp1],       0x00(%[tmp1])                 \n\t"
++        PTR_ADDU   "%[tmp1],        %[tmp1],          %[stride]   \n\t"
++        "swc1       %[ftmp2],       0x00(%[tmp1])                 \n\t"
++        PTR_ADDU   "%[tmp1],        %[tmp1],          %[stride]   \n\t"
++        "swc1       %[ftmp3],       0x00(%[tmp1])                 \n\t"
++        PTR_ADDU   "%[tmp1],        %[tmp1],          %[stride]   \n\t"
++        "swc1       %[ftmp4],       0x00(%[tmp1])                 \n\t"
++        PTR_ADDU   "%[tmp1],        %[tmp1],          %[stride]   \n\t"
++        "swc1       %[ftmp5],       0x00(%[tmp1])                 \n\t"
++        PTR_ADDU   "%[tmp1],        %[tmp1],          %[stride]   \n\t"
++        "swc1       %[ftmp6],       0x00(%[tmp1])                 \n\t"
++        PTR_ADDU   "%[tmp1],        %[tmp1],          %[stride]   \n\t"
++        "swc1       %[ftmp7],       0x00(%[tmp1])                 \n\t"
++        PTR_ADDIU  "%[dst],         %[dst],           0x04        \n\t"
++        PTR_ADDIU  "%[input],       %[input],         0x40        \n\t"
++        PTR_ADDIU  "%[temp_value],  %[temp_value],    0x04        \n\t"
++        PTR_ADDIU  "%[tmp0],        %[tmp0],          -0x01       \n\t"
++        "bnez       %[tmp0],        1b                            \n\t"
++        : [dst]"+&r"(dst), [tmp0]"=&r"(tmp[0]), [tmp1]"=&r"(tmp[1]),
++          [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]), [ftmp2]"=&f"(ftmp[2]),
++          [ftmp3]"=&f"(ftmp[3]), [ftmp4]"=&f"(ftmp[4]), [ftmp5]"=&f"(ftmp[5]),
++          [ftmp6]"=&f"(ftmp[6]), [ftmp7]"=&f"(ftmp[7]), [ftmp8]"=&f"(ftmp[8]),
++          [ftmp9]"=&f"(ftmp[9]), [ftmp10]"=&f"(ftmp[10]), [mask]"=&f"(ftmp[11]),
++          [A]"=&f"(ftmp[12]), [B]"=&f"(ftmp[13]), [C]"=&f"(ftmp[14]),
++          [D]"=&f"(ftmp[15]), [Ad]"=&f"(ftmp[16]), [Bd]"=&f"(ftmp[17]),
++          [Cd]"=&f"(ftmp[18]), [Dd]"=&f"(ftmp[19]), [Ed]"=&f"(ftmp[20]),
++          [Gd]"=&f"(ftmp[21]), [input]"+&r"(input)
++        : [stride]"r"(stride), [temp_value]"r"(temp_value)
++        : "memory"
++    );
++}
++
++static void idct_column_false_mmi(uint8_t *dst, int stride, int16_t *input)
++{
++    int16_t temp_value[8];
++    double ftmp[23];
++    uint64_t tmp[2];
++    for (int i = 0; i < 8; ++i)
++        temp_value[i] = (46341 * input[i << 3] + (8 << 16)) >> 20;
++    __asm__ volatile (
++        "xor        %[ftmp10],      %[ftmp10],          %[ftmp10] \n\t"
++        "li         %[tmp0],        0x02                          \n\t"
++        "1:                                                       \n\t"
++        "ldc1       %[ftmp0],       0x00(%[input])                \n\t"
++        "ldc1       %[ftmp4],       0x08(%[input])                \n\t"
++        "ldc1       %[ftmp1],       0x10(%[input])                \n\t"
++        "ldc1       %[ftmp5],       0x18(%[input])                \n\t"
++        "ldc1       %[ftmp2],       0x20(%[input])                \n\t"
++        "ldc1       %[ftmp6],       0x28(%[input])                \n\t"
++        "ldc1       %[ftmp3],       0x30(%[input])                \n\t"
++        "ldc1       %[ftmp7],       0x38(%[input])                \n\t"
++        TRANSPOSE_4H(%[ftmp0], %[ftmp1], %[ftmp2], %[ftmp3],
++                     %[A], %[B], %[C], %[D])
++        TRANSPOSE_4H(%[ftmp4], %[ftmp5], %[ftmp6], %[ftmp7],
++                     %[A], %[B], %[C], %[D])
++        LOAD_CONST(%[ftmp8], 64277)
++        LOAD_CONST(%[ftmp9], 12785)
++        LOAD_CONST(%[Gd], 1)
++        "pmulhh     %[A],           %[ftmp9],           %[ftmp7]  \n\t"
++        "pcmpgth    %[C],           %[ftmp10],          %[ftmp1]  \n\t"
++        "or         %[mask],        %[C],               %[Gd]     \n\t"
++        "pmullh     %[B],           %[ftmp1],           %[mask]   \n\t"
++        "pmulhuh    %[B],           %[ftmp8],           %[B]      \n\t"
++        "pmullh     %[B],           %[B],               %[mask]   \n\t"
++        "paddh      %[A],           %[A],               %[B]      \n\t"
++        "paddh      %[A],           %[A],               %[C]      \n\t"
++        "pcmpgth    %[D],           %[ftmp10],          %[ftmp7]  \n\t"
++        "or         %[mask],        %[D],               %[Gd]     \n\t"
++        "pmullh     %[Ad],          %[ftmp7],           %[mask]   \n\t"
++        "pmulhuh    %[B],           %[ftmp8],           %[Ad]     \n\t"
++        "pmullh     %[B],           %[B],               %[mask]   \n\t"
++        "pmulhh     %[C],           %[ftmp9],           %[ftmp1]  \n\t"
++        "psubh      %[B],           %[C],               %[B]      \n\t"
++        "psubh      %[B],           %[B],               %[D]      \n\t"
++
++        LOAD_CONST(%[ftmp8], 54491)
++        LOAD_CONST(%[ftmp9], 36410)
++        "pcmpgth    %[Ad],          %[ftmp10],          %[ftmp5]  \n\t"
++        "or         %[mask],        %[Ad],              %[Gd]     \n\t"
++        "pmullh     %[Cd],          %[ftmp5],           %[mask]   \n\t"
++        "pmulhuh    %[C],           %[ftmp9],           %[Cd]     \n\t"
++        "pmullh     %[C],           %[C],               %[mask]   \n\t"
++        "pcmpgth    %[Bd],          %[ftmp10],          %[ftmp3]  \n\t"
++        "or         %[mask],        %[Bd],              %[Gd]     \n\t"
++        "pmullh     %[D],           %[ftmp3],           %[mask]   \n\t"
++        "pmulhuh    %[D],           %[ftmp8],           %[D]      \n\t"
++        "pmullh     %[D],           %[D],               %[mask]   \n\t"
++        "paddh      %[C],           %[C],               %[D]      \n\t"
++        "paddh      %[C],           %[C],               %[Ad]     \n\t"
++        "paddh      %[C],           %[C],               %[Bd]     \n\t"
++        "pcmpgth    %[Bd],          %[ftmp10],          %[ftmp3]  \n\t"
++        "or         %[mask],        %[Bd],              %[Gd]     \n\t"
++        "pmullh     %[Cd],          %[ftmp3],           %[mask]   \n\t"
++        "pmulhuh    %[D],           %[ftmp9],           %[Cd]     \n\t"
++        "pmullh     %[D],           %[D],               %[mask]   \n\t"
++        "pcmpgth    %[Ed],          %[ftmp10],          %[ftmp5]  \n\t"
++        "or         %[mask],        %[Ed],              %[Gd]     \n\t"
++        "pmullh     %[Ad],          %[ftmp5],           %[mask]   \n\t"
++        "pmulhuh    %[Ad],          %[ftmp8],           %[Ad]     \n\t"
++        "pmullh     %[Ad],          %[Ad],              %[mask]   \n\t"
++        "psubh      %[D],           %[Ad],              %[D]      \n\t"
++        "paddh      %[D],           %[D],               %[Ed]     \n\t"
++        "psubh      %[D],           %[D],               %[Bd]     \n\t"
++
++        LOAD_CONST(%[ftmp8], 46341)
++        "psubh      %[Ad],          %[A],             %[C]        \n\t"
++        "pcmpgth    %[Bd],          %[ftmp10],        %[Ad]       \n\t"
++        "or         %[mask],        %[Bd],            %[Gd]       \n\t"
++        "pmullh     %[Ad],          %[Ad],            %[mask]     \n\t"
++        "pmulhuh    %[Ad],          %[ftmp8],         %[Ad]       \n\t"
++        "pmullh     %[Ad],          %[Ad],            %[mask]     \n\t"
++        "paddh      %[Ad],          %[Ad],            %[Bd]       \n\t"
++        "psubh      %[Bd],          %[B],             %[D]        \n\t"
++        "pcmpgth    %[Cd],          %[ftmp10],        %[Bd]       \n\t"
++        "or         %[mask],        %[Cd],            %[Gd]       \n\t"
++        "pmullh     %[Bd],          %[Bd],            %[mask]     \n\t"
++        "pmulhuh    %[Bd],          %[ftmp8],         %[Bd]       \n\t"
++        "pmullh     %[Bd],          %[Bd],            %[mask]     \n\t"
++        "paddh      %[Bd],          %[Bd],            %[Cd]       \n\t"
++        "paddh      %[Cd],          %[A],             %[C]        \n\t"
++        "paddh      %[Dd],          %[B],             %[D]        \n\t"
++
++        LOAD_CONST(%[Ed], 8)
++        "paddh      %[A],           %[ftmp0],         %[ftmp4]    \n\t"
++        "pcmpgth    %[B],           %[ftmp10],        %[A]        \n\t"
++        "or         %[mask],        %[B],             %[Gd]       \n\t"
++        "pmullh     %[A],           %[A],             %[mask]     \n\t"
++        "pmulhuh    %[A],           %[ftmp8],         %[A]        \n\t"
++        "pmullh     %[A],           %[A],             %[mask]     \n\t"
++        "paddh      %[A],           %[A],             %[B]        \n\t"
++        "paddh      %[A],           %[A],             %[Ed]       \n\t"
++        "psubh      %[B],           %[ftmp0],         %[ftmp4]    \n\t"
++        "pcmpgth    %[C],           %[ftmp10],        %[B]        \n\t"
++        "or         %[mask],        %[C],             %[Gd]       \n\t"
++        "pmullh     %[B],           %[B],             %[mask]     \n\t"
++        "pmulhuh    %[B],           %[ftmp8],         %[B]        \n\t"
++        "pmullh     %[B],           %[B],             %[mask]     \n\t"
++        "paddh      %[B],           %[B],             %[C]        \n\t"
++        "paddh      %[B],           %[B],             %[Ed]       \n\t"
++
++        LOAD_CONST(%[ftmp8], 60547)
++        LOAD_CONST(%[ftmp9], 25080)
++        "pmulhh     %[C],           %[ftmp9],         %[ftmp6]    \n\t"
++        "pcmpgth    %[D],           %[ftmp10],        %[ftmp2]    \n\t"
++        "or         %[mask],        %[D],             %[Gd]       \n\t"
++        "pmullh     %[Ed],          %[ftmp2],         %[mask]     \n\t"
++        "pmulhuh    %[Ed],          %[ftmp8],         %[Ed]       \n\t"
++        "pmullh     %[Ed],          %[Ed],            %[mask]     \n\t"
++        "paddh      %[C],           %[C],             %[Ed]       \n\t"
++        "paddh      %[C],           %[C],             %[D]        \n\t"
++        "pcmpgth    %[Ed],          %[ftmp10],        %[ftmp6]    \n\t"
++        "or         %[mask],        %[Ed],            %[Gd]       \n\t"
++        "pmullh     %[D],           %[ftmp6],         %[mask]     \n\t"
++        "pmulhuh    %[D],           %[ftmp8],         %[D]        \n\t"
++        "pmullh     %[D],           %[D],             %[mask]     \n\t"
++        "pmulhh     %[Gd],          %[ftmp9],         %[ftmp2]    \n\t"
++        "psubh      %[D],           %[Gd],            %[D]        \n\t"
++        "psubh      %[D],           %[D],             %[Ed]       \n\t"
++        "psubh      %[Ed],          %[A],             %[C]        \n\t"
++        "paddh      %[Gd],          %[A],             %[C]        \n\t"
++        "paddh      %[A],           %[B],             %[Ad]       \n\t"
++        "psubh      %[C],           %[B],             %[Ad]       \n\t"
++        "psubh      %[B],           %[Bd],            %[D]        \n\t"
++        "paddh      %[D],           %[Bd],            %[D]        \n\t"
++        "or         %[mask],        %[ftmp1],         %[ftmp2]    \n\t"
++        "or         %[mask],        %[mask],          %[ftmp3]    \n\t"
++        "or         %[mask],        %[mask],          %[ftmp4]    \n\t"
++        "or         %[mask],        %[mask],          %[ftmp5]    \n\t"
++        "or         %[mask],        %[mask],          %[ftmp6]    \n\t"
++        "or         %[mask],        %[mask],          %[ftmp7]    \n\t"
++        "pcmpeqh    %[mask],        %[mask],          %[ftmp10]   \n\t"
++        "li         %[tmp1],        0x04                          \n\t"
++        "dmtc1      %[tmp1],        %[ftmp8]                      \n\t"
++        "paddh      %[ftmp0],       %[Gd],            %[Cd]       \n\t"
++        "psrah      %[ftmp0],       %[ftmp0],         %[ftmp8]    \n\t"
++        "paddh      %[ftmp1],       %[A],             %[D]        \n\t"
++        "psrah      %[ftmp1],       %[ftmp1],         %[ftmp8]    \n\t"
++        "psubh      %[ftmp2],       %[A],             %[D]        \n\t"
++        "psrah      %[ftmp2],       %[ftmp2],         %[ftmp8]    \n\t"
++        "paddh      %[ftmp3],       %[Ed],            %[Dd]       \n\t"
++        "psrah      %[ftmp3],       %[ftmp3],         %[ftmp8]    \n\t"
++        "psubh      %[ftmp4],       %[Ed],            %[Dd]       \n\t"
++        "psrah      %[ftmp4],       %[ftmp4],         %[ftmp8]    \n\t"
++        "paddh      %[ftmp5],       %[C],             %[B]        \n\t"
++        "psrah      %[ftmp5],       %[ftmp5],         %[ftmp8]    \n\t"
++        "psubh      %[ftmp6],       %[C],             %[B]        \n\t"
++        "psrah      %[ftmp6],       %[ftmp6],         %[ftmp8]    \n\t"
++        "psubh      %[ftmp7],       %[Gd],            %[Cd]       \n\t"
++        "psrah      %[ftmp7],       %[ftmp7],         %[ftmp8]    \n\t"
++
++        /* Load from dst */
++        "lwc1       %[A],           0x00(%[dst])                  \n\t"
++        PTR_ADDU   "%[tmp1],        %[dst],           %[stride]   \n\t"
++        "lwc1       %[B],           0x00(%[tmp1])                 \n\t"
++        PTR_ADDU   "%[tmp1],        %[tmp1],          %[stride]   \n\t"
++        "lwc1       %[C],           0x00(%[tmp1])                 \n\t"
++        PTR_ADDU   "%[tmp1],        %[tmp1],          %[stride]   \n\t"
++        "lwc1       %[D],           0x00(%[tmp1])                 \n\t"
++        PTR_ADDU   "%[tmp1],        %[tmp1],          %[stride]   \n\t"
++        "lwc1       %[Ad],          0x00(%[tmp1])                 \n\t"
++        PTR_ADDU   "%[tmp1],        %[tmp1],          %[stride]   \n\t"
++        "lwc1       %[Bd],          0x00(%[tmp1])                 \n\t"
++        PTR_ADDU   "%[tmp1],        %[tmp1],          %[stride]   \n\t"
++        "lwc1       %[Cd],          0x00(%[tmp1])                 \n\t"
++        PTR_ADDU   "%[tmp1],        %[tmp1],          %[stride]   \n\t"
++        "lwc1       %[Dd],          0x00(%[tmp1])                 \n\t"
++        "punpcklbh  %[A],           %[A],             %[ftmp10]   \n\t"
++        "punpcklbh  %[B],           %[B],             %[ftmp10]   \n\t"
++        "punpcklbh  %[C],           %[C],             %[ftmp10]   \n\t"
++        "punpcklbh  %[D],           %[D],             %[ftmp10]   \n\t"
++        "punpcklbh  %[Ad],          %[Ad],            %[ftmp10]   \n\t"
++        "punpcklbh  %[Bd],          %[Bd],            %[ftmp10]   \n\t"
++        "punpcklbh  %[Cd],          %[Cd],            %[ftmp10]   \n\t"
++        "punpcklbh  %[Dd],          %[Dd],            %[ftmp10]   \n\t"
++        "ldc1       %[Ed],          0x00(%[temp_value])           \n\t"
++        "and        %[Ed],          %[Ed],            %[mask]     \n\t"
++        "nor        %[mask],        %[mask],          %[mask]     \n\t"
++        "and        %[ftmp0],       %[ftmp0],         %[mask]     \n\t"
++        "and        %[ftmp1],       %[ftmp1],         %[mask]     \n\t"
++        "and        %[ftmp2],       %[ftmp2],         %[mask]     \n\t"
++        "and        %[ftmp3],       %[ftmp3],         %[mask]     \n\t"
++        "and        %[ftmp4],       %[ftmp4],         %[mask]     \n\t"
++        "and        %[ftmp5],       %[ftmp5],         %[mask]     \n\t"
++        "and        %[ftmp6],       %[ftmp6],         %[mask]     \n\t"
++        "and        %[ftmp7],       %[ftmp7],         %[mask]     \n\t"
++        "paddh      %[ftmp0],       %[ftmp0],         %[A]        \n\t"
++        "paddh      %[ftmp1],       %[ftmp1],         %[B]        \n\t"
++        "paddh      %[ftmp2],       %[ftmp2],         %[C]        \n\t"
++        "paddh      %[ftmp3],       %[ftmp3],         %[D]        \n\t"
++        "paddh      %[ftmp4],       %[ftmp4],         %[Ad]       \n\t"
++        "paddh      %[ftmp5],       %[ftmp5],         %[Bd]       \n\t"
++        "paddh      %[ftmp6],       %[ftmp6],         %[Cd]       \n\t"
++        "paddh      %[ftmp7],       %[ftmp7],         %[Dd]       \n\t"
++        "paddh      %[ftmp0],       %[ftmp0],         %[Ed]       \n\t"
++        "paddh      %[ftmp1],       %[ftmp1],         %[Ed]       \n\t"
++        "paddh      %[ftmp2],       %[ftmp2],         %[Ed]       \n\t"
++        "paddh      %[ftmp3],       %[ftmp3],         %[Ed]       \n\t"
++        "paddh      %[ftmp4],       %[ftmp4],         %[Ed]       \n\t"
++        "paddh      %[ftmp5],       %[ftmp5],         %[Ed]       \n\t"
++        "paddh      %[ftmp6],       %[ftmp6],         %[Ed]       \n\t"
++        "paddh      %[ftmp7],       %[ftmp7],         %[Ed]       \n\t"
++        "pmaxsh     %[ftmp0],       %[ftmp0],         %[ftmp10]   \n\t"
++        "packushb   %[ftmp0],       %[ftmp0],         %[ftmp10]   \n\t"
++        "pmaxsh     %[ftmp1],       %[ftmp1],         %[ftmp10]   \n\t"
++        "packushb   %[ftmp1],       %[ftmp1],         %[ftmp10]   \n\t"
++        "pmaxsh     %[ftmp2],       %[ftmp2],         %[ftmp10]   \n\t"
++        "packushb   %[ftmp2],       %[ftmp2],         %[ftmp10]   \n\t"
++        "pmaxsh     %[ftmp3],       %[ftmp3],         %[ftmp10]   \n\t"
++        "packushb   %[ftmp3],       %[ftmp3],         %[ftmp10]   \n\t"
++        "pmaxsh     %[ftmp4],       %[ftmp4],         %[ftmp10]   \n\t"
++        "packushb   %[ftmp4],       %[ftmp4],         %[ftmp10]   \n\t"
++        "pmaxsh     %[ftmp5],       %[ftmp5],         %[ftmp10]   \n\t"
++        "packushb   %[ftmp5],       %[ftmp5],         %[ftmp10]   \n\t"
++        "pmaxsh     %[ftmp6],       %[ftmp6],         %[ftmp10]   \n\t"
++        "packushb   %[ftmp6],       %[ftmp6],         %[ftmp10]   \n\t"
++        "pmaxsh     %[ftmp7],       %[ftmp7],         %[ftmp10]   \n\t"
++        "packushb   %[ftmp7],       %[ftmp7],         %[ftmp10]   \n\t"
++        "swc1       %[ftmp0],       0x00(%[dst])                  \n\t"
++        PTR_ADDU   "%[tmp1],        %[dst],           %[stride]   \n\t"
++        "swc1       %[ftmp1],       0x00(%[tmp1])                 \n\t"
++        PTR_ADDU   "%[tmp1],        %[tmp1],          %[stride]   \n\t"
++        "swc1       %[ftmp2],       0x00(%[tmp1])                 \n\t"
++        PTR_ADDU   "%[tmp1],        %[tmp1],          %[stride]   \n\t"
++        "swc1       %[ftmp3],       0x00(%[tmp1])                 \n\t"
++        PTR_ADDU   "%[tmp1],        %[tmp1],          %[stride]   \n\t"
++        "swc1       %[ftmp4],       0x00(%[tmp1])                 \n\t"
++        PTR_ADDU   "%[tmp1],        %[tmp1],          %[stride]   \n\t"
++        "swc1       %[ftmp5],       0x00(%[tmp1])                 \n\t"
++        PTR_ADDU   "%[tmp1],        %[tmp1],          %[stride]   \n\t"
++        "swc1       %[ftmp6],       0x00(%[tmp1])                 \n\t"
++        PTR_ADDU   "%[tmp1],        %[tmp1],          %[stride]   \n\t"
++        "swc1       %[ftmp7],       0x00(%[tmp1])                 \n\t"
++        PTR_ADDIU  "%[dst],         %[dst],           0x04        \n\t"
++        PTR_ADDIU  "%[input],       %[input],         0x40        \n\t"
++        PTR_ADDIU  "%[temp_value],  %[temp_value],    0x08        \n\t"
++        PTR_ADDIU  "%[tmp0],        %[tmp0],          -0x01       \n\t"
++        "bnez       %[tmp0],        1b                            \n\t"
++        : [dst]"+&r"(dst), [tmp0]"=&r"(tmp[0]), [tmp1]"=&r"(tmp[1]),
++          [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]), [ftmp2]"=&f"(ftmp[2]),
++          [ftmp3]"=&f"(ftmp[3]), [ftmp4]"=&f"(ftmp[4]), [ftmp5]"=&f"(ftmp[5]),
++          [ftmp6]"=&f"(ftmp[6]), [ftmp7]"=&f"(ftmp[7]), [ftmp8]"=&f"(ftmp[8]),
++          [ftmp9]"=&f"(ftmp[9]), [ftmp10]"=&f"(ftmp[10]), [mask]"=&f"(ftmp[11]),
++          [A]"=&f"(ftmp[12]), [B]"=&f"(ftmp[13]), [C]"=&f"(ftmp[14]),
++          [D]"=&f"(ftmp[15]), [Ad]"=&f"(ftmp[16]), [Bd]"=&f"(ftmp[17]),
++          [Cd]"=&f"(ftmp[18]), [Dd]"=&f"(ftmp[19]), [Ed]"=&f"(ftmp[20]),
++          [Gd]"=&f"(ftmp[21]), [input]"+&r"(input)
++        : [stride]"r"(stride), [temp_value]"r"(temp_value)
++        : "memory"
++    );
++}
++static void idct_mmi(uint8_t *dst, int stride, int16_t *input, int type)
++{
++    idct_row_mmi(input);
++    if (type == 1)
++        idct_column_true_mmi(dst, stride, input);
++    else
++        idct_column_false_mmi(dst, stride, input);
++}
++
++void ff_vp3_idct_put_mmi(uint8_t *dest, ptrdiff_t line_size, int16_t *block)
++{
++    idct_mmi(dest, line_size, block, 1);
++    memset(block, 0, sizeof(*block) << 6);
++}
++
++void ff_vp3_idct_add_mmi(uint8_t *dest, ptrdiff_t line_size, int16_t *block)
++{
++    idct_mmi(dest, line_size, block, 2);
++    memset(block, 0, sizeof(*block) << 6);
++}
++void ff_vp3_idct_dc_add_mmi(uint8_t *dest, ptrdiff_t line_size, int16_t *block)
++{
++    int dc = (block[0] + 15) >> 5;
++
++    double ftmp[7];
++    uint64_t tmp;
++    __asm__ volatile (
++        "xor        %[ftmp0],     %[ftmp0],           %[ftmp0]      \n\t"
++        "mtc1       %[dc],        %[ftmp5]                          \n\t"
++        "pshufh     %[ftmp5],     %[ftmp5],           %[ftmp0]      \n\t"
++        "li         %[tmp0],      0x08                              \n\t"
++        "1:                                                         \n\t"
++        "ldc1       %[ftmp1],     0x00(%[dest])                     \n\t"
++        "punpcklbh  %[ftmp2],     %[ftmp1],           %[ftmp0]      \n\t"
++        "punpckhbh  %[ftmp3],     %[ftmp1],           %[ftmp0]      \n\t"
++        "paddh      %[ftmp4],     %[ftmp2],           %[ftmp5]      \n\t"
++        "paddh      %[ftmp6],     %[ftmp3],           %[ftmp5]      \n\t"
++        "packushb   %[ftmp4],     %[ftmp4],           %[ftmp0]      \n\t"
++        "packushb   %[ftmp6],     %[ftmp6],           %[ftmp0]      \n\t"
++        "swc1       %[ftmp4],     0x00(%[dest])                     \n\t"
++        "swc1       %[ftmp6],     0x04(%[dest])                     \n\t"
++        PTR_ADDU   "%[dest],      %[dest],            %[line_size]  \n\t"
++        PTR_ADDIU  "%[tmp0],      %[tmp0],            -0x01         \n\t"
++        "bnez       %[tmp0],      1b                                \n\t"
++        : [dest]"+&r"(dest), [block]"+&r"(block), [tmp0]"=&r"(tmp),
++          [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]), [ftmp2]"=&f"(ftmp[2]),
++          [ftmp3]"=&f"(ftmp[3]), [ftmp4]"=&f"(ftmp[4]), [ftmp5]"=&f"(ftmp[5]),
++          [ftmp6]"=&f"(ftmp[6])
++        : [line_size]"r"(line_size), [dc]"r"(dc)
++        : "memory"
++    );
++    block[0] = 0;
++}
++
++void ff_put_no_rnd_pixels_l2_mmi(uint8_t *dst, const uint8_t *src1,
++                                 const uint8_t *src2, ptrdiff_t stride, int h)
++{
++    if (h == 8) {
++        double ftmp[6];
++        uint64_t tmp[2];
++        __asm__ volatile (
++            "li          %[tmp0],        0x08                            \n\t"
++            "li          %[tmp1],        0xfefefefe                      \n\t"
++            "dmtc1       %[tmp1],        %[ftmp4]                        \n\t"
++            "punpcklwd   %[ftmp4],       %[ftmp4],             %[ftmp4]  \n\t"
++            "li          %[tmp1],        0x01                            \n\t"
++            "dmtc1       %[tmp1],        %[ftmp5]                        \n\t"
++            "1:                                                          \n\t"
++            "gsldlc1     %[ftmp1],       0x07(%[src1])                   \n\t"
++            "gsldrc1     %[ftmp1],       0x00(%[src1])                   \n\t"
++            "gsldlc1     %[ftmp2],       0x07(%[src2])                   \n\t"
++            "gsldrc1     %[ftmp2],       0x00(%[src2])                   \n\t"
++            "xor         %[ftmp3],       %[ftmp1],             %[ftmp2]  \n\t"
++            "and         %[ftmp3],       %[ftmp3],             %[ftmp4]  \n\t"
++            "psrlw       %[ftmp3],       %[ftmp3],             %[ftmp5]  \n\t"
++            "and         %[ftmp6],       %[ftmp1],             %[ftmp2]  \n\t"
++            "paddw       %[ftmp3],       %[ftmp3],             %[ftmp6]  \n\t"
++            "sdc1        %[ftmp3],       0x00(%[dst])                    \n\t"
++            PTR_ADDU    "%[src1],        %[src1],              %[stride] \n\t"
++            PTR_ADDU    "%[src2],        %[src2],              %[stride] \n\t"
++            PTR_ADDU    "%[dst],         %[dst],               %[stride] \n\t"
++            PTR_ADDIU   "%[tmp0],        %[tmp0],              -0x01     \n\t"
++            "bnez        %[tmp0],        1b                              \n\t"
++            : [dst]"+&r"(dst), [src1]"+&r"(src1), [src2]"+&r"(src2),
++              [ftmp1]"=&f"(ftmp[0]), [ftmp2]"=&f"(ftmp[1]), [ftmp3]"=&f"(ftmp[2]),
++              [ftmp4]"=&f"(ftmp[3]), [ftmp5]"=&f"(ftmp[4]), [ftmp6]"=&f"(ftmp[5]),
++              [tmp0]"=&r"(tmp[0]), [tmp1]"=&r"(tmp[1])
++            : [stride]"r"(stride)
++            : "memory"
++        );
++    } else {
++        int i;
++
++        for (i = 0; i < h; i++) {
++            uint32_t a, b;
++
++            a = AV_RN32(&src1[i * stride]);
++            b = AV_RN32(&src2[i * stride]);
++            AV_WN32A(&dst[i * stride], no_rnd_avg32(a, b));
++            a = AV_RN32(&src1[i * stride + 4]);
++            b = AV_RN32(&src2[i * stride + 4]);
++            AV_WN32A(&dst[i * stride + 4], no_rnd_avg32(a, b));
++        }
++    }
++}
+diff -uNra ffmpeg-4.1.6/libavcodec/mips/vp3dsp_idct_msa.c FFmpeg/libavcodec/mips/vp3dsp_idct_msa.c
+--- a/libavcodec/mips/vp3dsp_idct_msa.c	1970-01-01 08:00:00.000000000 +0800
++++ b/libavcodec/mips/vp3dsp_idct_msa.c	2020-07-19 18:13:57.513110563 +0800
+@@ -0,0 +1,598 @@
++/*
++ * Copyright (c) 2018 gxw <guxiwei-hf@loongson.cn>
++ *
++ * This file is part of FFmpeg.
++ *
++ * FFmpeg is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * FFmpeg is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with FFmpeg; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
++ */
++
++#include "vp3dsp_mips.h"
++#include "libavutil/mips/generic_macros_msa.h"
++#include "libavutil/intreadwrite.h"
++#include "libavcodec/rnd_avg.h"
++
++static void idct_msa(uint8_t *dst, int stride, int16_t *input, int type)
++{
++    v8i16 r0, r1, r2, r3, r4, r5, r6, r7, sign;
++    v4i32 r0_r, r0_l, r1_r, r1_l, r2_r, r2_l, r3_r, r3_l,
++          r4_r, r4_l, r5_r, r5_l, r6_r, r6_l, r7_r, r7_l;
++    v4i32 A, B, C, D, Ad, Bd, Cd, Dd, E, F, G, H;
++    v4i32 Ed, Gd, Add, Bdd, Fd, Hd;
++    v16u8 sign_l;
++    v16i8 d0, d1, d2, d3, d4, d5, d6, d7;
++    v4i32 c0, c1, c2, c3, c4, c5, c6, c7;
++    v4i32 f0, f1, f2, f3, f4, f5, f6, f7;
++    v4i32 sign_t;
++    v16i8 zero = {0};
++    v16i8 mask = {0, 4, 8, 12, 16, 20, 24, 28, 0, 0, 0, 0, 0, 0, 0, 0};
++    v4i32 cnst64277w = {64277, 64277, 64277, 64277};
++    v4i32 cnst60547w = {60547, 60547, 60547, 60547};
++    v4i32 cnst54491w = {54491, 54491, 54491, 54491};
++    v4i32 cnst46341w = {46341, 46341, 46341, 46341};
++    v4i32 cnst36410w = {36410, 36410, 36410, 36410};
++    v4i32 cnst25080w = {25080, 25080, 25080, 25080};
++    v4i32 cnst12785w = {12785, 12785, 12785, 12785};
++    v4i32 cnst8w = {8, 8, 8, 8};
++    v4i32 cnst2048w = {2048, 2048, 2048, 2048};
++    v4i32 cnst128w = {128, 128, 128, 128};
++
++    /* Extended input data */
++    LD_SH8(input, 8, r0, r1, r2, r3, r4, r5, r6, r7);
++    sign = __msa_clti_s_h(r0, 0);
++    r0_r = (v4i32) __msa_ilvr_h(sign, r0);
++    r0_l = (v4i32) __msa_ilvl_h(sign, r0);
++    sign = __msa_clti_s_h(r1, 0);
++    r1_r = (v4i32) __msa_ilvr_h(sign, r1);
++    r1_l = (v4i32) __msa_ilvl_h(sign, r1);
++    sign = __msa_clti_s_h(r2, 0);
++    r2_r = (v4i32) __msa_ilvr_h(sign, r2);
++    r2_l = (v4i32) __msa_ilvl_h(sign, r2);
++    sign = __msa_clti_s_h(r3, 0);
++    r3_r = (v4i32) __msa_ilvr_h(sign, r3);
++    r3_l = (v4i32) __msa_ilvl_h(sign, r3);
++    sign = __msa_clti_s_h(r4, 0);
++    r4_r = (v4i32) __msa_ilvr_h(sign, r4);
++    r4_l = (v4i32) __msa_ilvl_h(sign, r4);
++    sign = __msa_clti_s_h(r5, 0);
++    r5_r = (v4i32) __msa_ilvr_h(sign, r5);
++    r5_l = (v4i32) __msa_ilvl_h(sign, r5);
++    sign = __msa_clti_s_h(r6, 0);
++    r6_r = (v4i32) __msa_ilvr_h(sign, r6);
++    r6_l = (v4i32) __msa_ilvl_h(sign, r6);
++    sign = __msa_clti_s_h(r7, 0);
++    r7_r = (v4i32) __msa_ilvr_h(sign, r7);
++    r7_l = (v4i32) __msa_ilvl_h(sign, r7);
++
++    /* Right part */
++    A = ((r1_r * cnst64277w) >> 16) + ((r7_r * cnst12785w) >> 16);
++    B = ((r1_r * cnst12785w) >> 16) - ((r7_r * cnst64277w) >> 16);
++    C = ((r3_r * cnst54491w) >> 16) + ((r5_r * cnst36410w) >> 16);
++    D = ((r5_r * cnst54491w) >> 16) - ((r3_r * cnst36410w) >> 16);
++    Ad = ((A - C) * cnst46341w) >> 16;
++    Bd = ((B - D) * cnst46341w) >> 16;
++    Cd = A + C;
++    Dd = B + D;
++    E = ((r0_r + r4_r) * cnst46341w) >> 16;
++    F = ((r0_r - r4_r) * cnst46341w) >> 16;
++    G = ((r2_r * cnst60547w) >> 16) + ((r6_r * cnst25080w) >> 16);
++    H = ((r2_r * cnst25080w) >> 16) - ((r6_r * cnst60547w) >> 16);
++    Ed = E - G;
++    Gd = E + G;
++    Add = F + Ad;
++    Bdd = Bd - H;
++    Fd = F - Ad;
++    Hd = Bd + H;
++    r0_r = Gd + Cd;
++    r7_r = Gd - Cd;
++    r1_r = Add + Hd;
++    r2_r = Add - Hd;
++    r3_r = Ed + Dd;
++    r4_r = Ed - Dd;
++    r5_r = Fd + Bdd;
++    r6_r = Fd - Bdd;
++
++    /* Left part */
++    A = ((r1_l * cnst64277w) >> 16) + ((r7_l * cnst12785w) >> 16);
++    B = ((r1_l * cnst12785w) >> 16) - ((r7_l * cnst64277w) >> 16);
++    C = ((r3_l * cnst54491w) >> 16) + ((r5_l * cnst36410w) >> 16);
++    D = ((r5_l * cnst54491w) >> 16) - ((r3_l * cnst36410w) >> 16);
++    Ad = ((A - C) * cnst46341w) >> 16;
++    Bd = ((B - D) * cnst46341w) >> 16;
++    Cd = A + C;
++    Dd = B + D;
++    E = ((r0_l + r4_l) * cnst46341w) >> 16;
++    F = ((r0_l - r4_l) * cnst46341w) >> 16;
++    G = ((r2_l * cnst60547w) >> 16) + ((r6_l * cnst25080w) >> 16);
++    H = ((r2_l * cnst25080w) >> 16) - ((r6_l * cnst60547w) >> 16);
++    Ed = E - G;
++    Gd = E + G;
++    Add = F + Ad;
++    Bdd = Bd - H;
++    Fd = F - Ad;
++    Hd = Bd + H;
++    r0_l = Gd + Cd;
++    r7_l = Gd - Cd;
++    r1_l = Add + Hd;
++    r2_l = Add - Hd;
++    r3_l = Ed + Dd;
++    r4_l = Ed - Dd;
++    r5_l = Fd + Bdd;
++    r6_l = Fd - Bdd;
++
++    /* Row 0 to 3 */
++    TRANSPOSE4x4_SW_SW(r0_r, r1_r, r2_r, r3_r,
++                       r0_r, r1_r, r2_r, r3_r);
++    TRANSPOSE4x4_SW_SW(r0_l, r1_l, r2_l, r3_l,
++                       r0_l, r1_l, r2_l, r3_l);
++    A = ((r1_r * cnst64277w) >> 16) + ((r3_l * cnst12785w) >> 16);
++    B = ((r1_r * cnst12785w) >> 16) - ((r3_l * cnst64277w) >> 16);
++    C = ((r3_r * cnst54491w) >> 16) + ((r1_l * cnst36410w) >> 16);
++    D = ((r1_l * cnst54491w) >> 16) - ((r3_r * cnst36410w) >> 16);
++    Ad = ((A - C) * cnst46341w) >> 16;
++    Bd = ((B - D) * cnst46341w) >> 16;
++    Cd = A + C;
++    Dd = B + D;
++    E = ((r0_r + r0_l) * cnst46341w) >> 16;
++    E += cnst8w;
++    F = ((r0_r - r0_l) * cnst46341w) >> 16;
++    F += cnst8w;
++    if (type == 1) { // HACK
++        E += cnst2048w;
++        F += cnst2048w;
++    }
++    G = ((r2_r * cnst60547w) >> 16) + ((r2_l * cnst25080w) >> 16);
++    H = ((r2_r * cnst25080w) >> 16) - ((r2_l * cnst60547w) >> 16);
++    Ed = E - G;
++    Gd = E + G;
++    Add = F + Ad;
++    Bdd = Bd - H;
++    Fd = F - Ad;
++    Hd = Bd + H;
++    A = (Gd + Cd) >> 4;
++    B = (Gd - Cd) >> 4;
++    C = (Add + Hd) >> 4;
++    D = (Add - Hd) >> 4;
++    E = (Ed + Dd) >> 4;
++    F = (Ed - Dd) >> 4;
++    G = (Fd + Bdd) >> 4;
++    H = (Fd - Bdd) >> 4;
++    if (type != 1) {
++        LD_SB8(dst, stride, d0, d1, d2, d3, d4, d5, d6, d7);
++        ILVR_B4_SW(zero, d0, zero, d1, zero, d2, zero, d3,
++                   f0, f1, f2, f3);
++        ILVR_B4_SW(zero, d4, zero, d5, zero, d6, zero, d7,
++                   f4, f5, f6, f7);
++        ILVR_H4_SW(zero, f0, zero, f1, zero, f2, zero, f3,
++                   c0, c1, c2, c3);
++        ILVR_H4_SW(zero, f4, zero, f5, zero, f6, zero, f7,
++                   c4, c5, c6, c7);
++        A += c0;
++        B += c7;
++        C += c1;
++        D += c2;
++        E += c3;
++        F += c4;
++        G += c5;
++        H += c6;
++    }
++    CLIP_SW8_0_255(A, B, C, D, E, F, G, H);
++    sign_l = __msa_or_v((v16u8)r1_r, (v16u8)r2_r);
++    sign_l = __msa_or_v(sign_l, (v16u8)r3_r);
++    sign_l = __msa_or_v(sign_l, (v16u8)r0_l);
++    sign_l = __msa_or_v(sign_l, (v16u8)r1_l);
++    sign_l = __msa_or_v(sign_l, (v16u8)r2_l);
++    sign_l = __msa_or_v(sign_l, (v16u8)r3_l);
++    sign_t = __msa_ceqi_w((v4i32)sign_l, 0);
++    Add = ((r0_r * cnst46341w) + (8 << 16)) >> 20;
++    if (type == 1) {
++        Bdd = Add + cnst128w;
++        CLIP_SW_0_255(Bdd);
++        Ad = Bdd;
++        Bd = Bdd;
++        Cd = Bdd;
++        Dd = Bdd;
++        Ed = Bdd;
++        Fd = Bdd;
++        Gd = Bdd;
++        Hd = Bdd;
++    } else {
++        Ad = Add + c0;
++        Bd = Add + c1;
++        Cd = Add + c2;
++        Dd = Add + c3;
++        Ed = Add + c4;
++        Fd = Add + c5;
++        Gd = Add + c6;
++        Hd = Add + c7;
++        CLIP_SW8_0_255(Ad, Bd, Cd, Dd, Ed, Fd, Gd, Hd);
++    }
++    Ad = (v4i32)__msa_and_v((v16u8)Ad, (v16u8)sign_t);
++    Bd = (v4i32)__msa_and_v((v16u8)Bd, (v16u8)sign_t);
++    Cd = (v4i32)__msa_and_v((v16u8)Cd, (v16u8)sign_t);
++    Dd = (v4i32)__msa_and_v((v16u8)Dd, (v16u8)sign_t);
++    Ed = (v4i32)__msa_and_v((v16u8)Ed, (v16u8)sign_t);
++    Fd = (v4i32)__msa_and_v((v16u8)Fd, (v16u8)sign_t);
++    Gd = (v4i32)__msa_and_v((v16u8)Gd, (v16u8)sign_t);
++    Hd = (v4i32)__msa_and_v((v16u8)Hd, (v16u8)sign_t);
++    sign_t = __msa_ceqi_w(sign_t, 0);
++    A = (v4i32)__msa_and_v((v16u8)A, (v16u8)sign_t);
++    B = (v4i32)__msa_and_v((v16u8)B, (v16u8)sign_t);
++    C = (v4i32)__msa_and_v((v16u8)C, (v16u8)sign_t);
++    D = (v4i32)__msa_and_v((v16u8)D, (v16u8)sign_t);
++    E = (v4i32)__msa_and_v((v16u8)E, (v16u8)sign_t);
++    F = (v4i32)__msa_and_v((v16u8)F, (v16u8)sign_t);
++    G = (v4i32)__msa_and_v((v16u8)G, (v16u8)sign_t);
++    H = (v4i32)__msa_and_v((v16u8)H, (v16u8)sign_t);
++    r0_r = Ad + A;
++    r1_r = Bd + C;
++    r2_r = Cd + D;
++    r3_r = Dd + E;
++    r0_l = Ed + F;
++    r1_l = Fd + G;
++    r2_l = Gd + H;
++    r3_l = Hd + B;
++
++    /* Row 4 to 7 */
++    TRANSPOSE4x4_SW_SW(r4_r, r5_r, r6_r, r7_r,
++                       r4_r, r5_r, r6_r, r7_r);
++    TRANSPOSE4x4_SW_SW(r4_l, r5_l, r6_l, r7_l,
++                       r4_l, r5_l, r6_l, r7_l);
++    A = ((r5_r * cnst64277w) >> 16) + ((r7_l * cnst12785w) >> 16);
++    B = ((r5_r * cnst12785w) >> 16) - ((r7_l * cnst64277w) >> 16);
++    C = ((r7_r * cnst54491w) >> 16) + ((r5_l * cnst36410w) >> 16);
++    D = ((r5_l * cnst54491w) >> 16) - ((r7_r * cnst36410w) >> 16);
++    Ad = ((A - C) * cnst46341w) >> 16;
++    Bd = ((B - D) * cnst46341w) >> 16;
++    Cd = A + C;
++    Dd = B + D;
++    E = ((r4_r + r4_l) * cnst46341w) >> 16;
++    E += cnst8w;
++    F = ((r4_r - r4_l) * cnst46341w) >> 16;
++    F += cnst8w;
++    if (type == 1) { // HACK
++        E += cnst2048w;
++        F += cnst2048w;
++    }
++    G = ((r6_r * cnst60547w) >> 16) + ((r6_l * cnst25080w) >> 16);
++    H = ((r6_r * cnst25080w) >> 16) - ((r6_l * cnst60547w) >> 16);
++    Ed = E - G;
++    Gd = E + G;
++    Add = F + Ad;
++    Bdd = Bd - H;
++    Fd = F - Ad;
++    Hd = Bd + H;
++    A = (Gd + Cd) >> 4;
++    B = (Gd - Cd) >> 4;
++    C = (Add + Hd) >> 4;
++    D = (Add - Hd) >> 4;
++    E = (Ed + Dd) >> 4;
++    F = (Ed - Dd) >> 4;
++    G = (Fd + Bdd) >> 4;
++    H = (Fd - Bdd) >> 4;
++    if (type != 1) {
++        ILVL_H4_SW(zero, f0, zero, f1, zero, f2, zero, f3,
++                   c0, c1, c2, c3);
++        ILVL_H4_SW(zero, f4, zero, f5, zero, f6, zero, f7,
++                   c4, c5, c6, c7);
++        A += c0;
++        B += c7;
++        C += c1;
++        D += c2;
++        E += c3;
++        F += c4;
++        G += c5;
++        H += c6;
++    }
++    CLIP_SW8_0_255(A, B, C, D, E, F, G, H);
++    sign_l = __msa_or_v((v16u8)r5_r, (v16u8)r6_r);
++    sign_l = __msa_or_v(sign_l, (v16u8)r7_r);
++    sign_l = __msa_or_v(sign_l, (v16u8)r4_l);
++    sign_l = __msa_or_v(sign_l, (v16u8)r5_l);
++    sign_l = __msa_or_v(sign_l, (v16u8)r6_l);
++    sign_l = __msa_or_v(sign_l, (v16u8)r7_l);
++    sign_t = __msa_ceqi_w((v4i32)sign_l, 0);
++    Add = ((r4_r * cnst46341w) + (8 << 16)) >> 20;
++    if (type == 1) {
++        Bdd = Add + cnst128w;
++        CLIP_SW_0_255(Bdd);
++        Ad = Bdd;
++        Bd = Bdd;
++        Cd = Bdd;
++        Dd = Bdd;
++        Ed = Bdd;
++        Fd = Bdd;
++        Gd = Bdd;
++        Hd = Bdd;
++    } else {
++        Ad = Add + c0;
++        Bd = Add + c1;
++        Cd = Add + c2;
++        Dd = Add + c3;
++        Ed = Add + c4;
++        Fd = Add + c5;
++        Gd = Add + c6;
++        Hd = Add + c7;
++        CLIP_SW8_0_255(Ad, Bd, Cd, Dd, Ed, Fd, Gd, Hd);
++    }
++    Ad = (v4i32)__msa_and_v((v16u8)Ad, (v16u8)sign_t);
++    Bd = (v4i32)__msa_and_v((v16u8)Bd, (v16u8)sign_t);
++    Cd = (v4i32)__msa_and_v((v16u8)Cd, (v16u8)sign_t);
++    Dd = (v4i32)__msa_and_v((v16u8)Dd, (v16u8)sign_t);
++    Ed = (v4i32)__msa_and_v((v16u8)Ed, (v16u8)sign_t);
++    Fd = (v4i32)__msa_and_v((v16u8)Fd, (v16u8)sign_t);
++    Gd = (v4i32)__msa_and_v((v16u8)Gd, (v16u8)sign_t);
++    Hd = (v4i32)__msa_and_v((v16u8)Hd, (v16u8)sign_t);
++    sign_t = __msa_ceqi_w(sign_t, 0);
++    A = (v4i32)__msa_and_v((v16u8)A, (v16u8)sign_t);
++    B = (v4i32)__msa_and_v((v16u8)B, (v16u8)sign_t);
++    C = (v4i32)__msa_and_v((v16u8)C, (v16u8)sign_t);
++    D = (v4i32)__msa_and_v((v16u8)D, (v16u8)sign_t);
++    E = (v4i32)__msa_and_v((v16u8)E, (v16u8)sign_t);
++    F = (v4i32)__msa_and_v((v16u8)F, (v16u8)sign_t);
++    G = (v4i32)__msa_and_v((v16u8)G, (v16u8)sign_t);
++    H = (v4i32)__msa_and_v((v16u8)H, (v16u8)sign_t);
++    r4_r = Ad + A;
++    r5_r = Bd + C;
++    r6_r = Cd + D;
++    r7_r = Dd + E;
++    r4_l = Ed + F;
++    r5_l = Fd + G;
++    r6_l = Gd + H;
++    r7_l = Hd + B;
++    VSHF_B2_SB(r0_r, r4_r, r1_r, r5_r, mask, mask, d0, d1);
++    VSHF_B2_SB(r2_r, r6_r, r3_r, r7_r, mask, mask, d2, d3);
++    VSHF_B2_SB(r0_l, r4_l, r1_l, r5_l, mask, mask, d4, d5);
++    VSHF_B2_SB(r2_l, r6_l, r3_l, r7_l, mask, mask, d6, d7);
++
++    /* Final sequence of operations over-write original dst */
++    ST_D1(d0, 0, dst);
++    ST_D1(d1, 0, dst + stride);
++    ST_D1(d2, 0, dst + 2 * stride);
++    ST_D1(d3, 0, dst + 3 * stride);
++    ST_D1(d4, 0, dst + 4 * stride);
++    ST_D1(d5, 0, dst + 5 * stride);
++    ST_D1(d6, 0, dst + 6 * stride);
++    ST_D1(d7, 0, dst + 7 * stride);
++}
++
++void ff_vp3_idct_put_msa(uint8_t *dest, ptrdiff_t line_size, int16_t *block)
++{
++    idct_msa(dest, line_size, block, 1);
++    memset(block, 0, sizeof(*block) * 64);
++}
++
++void ff_vp3_idct_add_msa(uint8_t *dest, ptrdiff_t line_size, int16_t *block)
++{
++    idct_msa(dest, line_size, block, 2);
++    memset(block, 0, sizeof(*block) * 64);
++}
++
++void ff_vp3_idct_dc_add_msa(uint8_t *dest, ptrdiff_t line_size, int16_t *block)
++{
++    int i = (block[0] + 15) >> 5;
++    v4i32 dc = {i, i, i, i};
++    v16i8 d0, d1, d2, d3, d4, d5, d6, d7;
++    v4i32 c0, c1, c2, c3, c4, c5, c6, c7;
++    v4i32 e0, e1, e2, e3, e4, e5, e6, e7;
++    v4i32 r0, r1, r2, r3, r4, r5, r6, r7;
++    v16i8 mask = {0, 4, 8, 12, 16, 20, 24, 28, 0, 0, 0, 0, 0, 0, 0, 0};
++    v16i8 zero = {0};
++
++    LD_SB8(dest, line_size, d0, d1, d2, d3, d4, d5, d6, d7);
++    ILVR_B4_SW(zero, d0, zero, d1, zero, d2, zero, d3,
++               c0, c1, c2, c3);
++    ILVR_B4_SW(zero, d4, zero, d5, zero, d6, zero, d7,
++               c4, c5, c6, c7);
++    /* Right part */
++    ILVR_H4_SW(zero, c0, zero, c1, zero, c2, zero, c3,
++               e0, e1, e2, e3);
++    ILVR_H4_SW(zero, c4, zero, c5, zero, c6, zero, c7,
++               e4, e5, e6, e7);
++    e0 += dc;
++    e1 += dc;
++    e2 += dc;
++    e3 += dc;
++    e4 += dc;
++    e5 += dc;
++    e6 += dc;
++    e7 += dc;
++    CLIP_SW8_0_255(e0, e1, e2, e3, e4, e5, e6, e7);
++
++    /* Left part */
++    ILVL_H4_SW(zero, c0, zero, c1, zero, c2, zero, c3,
++               r0, r1, r2, r3);
++    ILVL_H4_SW(zero, c4, zero, c5, zero, c6, zero, c7,
++               r4, r5, r6, r7);
++    r0 += dc;
++    r1 += dc;
++    r2 += dc;
++    r3 += dc;
++    r4 += dc;
++    r5 += dc;
++    r6 += dc;
++    r7 += dc;
++    CLIP_SW8_0_255(r0, r1, r2, r3, r4, r5, r6, r7);
++    VSHF_B2_SB(e0, r0, e1, r1, mask, mask, d0, d1);
++    VSHF_B2_SB(e2, r2, e3, r3, mask, mask, d2, d3);
++    VSHF_B2_SB(e4, r4, e5, r5, mask, mask, d4, d5);
++    VSHF_B2_SB(e6, r6, e7, r7, mask, mask, d6, d7);
++
++    /* Final sequence of operations over-write original dst */
++    ST_D1(d0, 0, dest);
++    ST_D1(d1, 0, dest + line_size);
++    ST_D1(d2, 0, dest + 2 * line_size);
++    ST_D1(d3, 0, dest + 3 * line_size);
++    ST_D1(d4, 0, dest + 4 * line_size);
++    ST_D1(d5, 0, dest + 5 * line_size);
++    ST_D1(d6, 0, dest + 6 * line_size);
++    ST_D1(d7, 0, dest + 7 * line_size);
++
++    block[0] = 0;
++}
++
++void ff_vp3_v_loop_filter_msa(uint8_t *first_pixel, ptrdiff_t stride,
++                              int *bounding_values)
++{
++    int nstride = -stride;
++    v4i32 e0, e1, f0, f1, g0, g1;
++    v16i8 zero = {0};
++    v16i8 d0, d1, d2, d3;
++    v8i16 c0, c1, c2, c3;
++    v8i16 r0;
++    v8i16 cnst3h = {3, 3, 3, 3, 3, 3, 3, 3},
++          cnst4h = {4, 4, 4, 4, 4, 4, 4, 4};
++    v16i8 mask = {0, 4, 8, 12, 16, 20, 24, 28, 0, 0, 0, 0, 0, 0, 0, 0};
++    int16_t temp_16[8];
++    int temp_32[8];
++
++    LD_SB4(first_pixel + nstride * 2, stride, d0, d1, d2, d3);
++    ILVR_B4_SH(zero, d0, zero, d1, zero, d2, zero, d3,
++               c0, c1, c2, c3);
++    r0 = (c0 - c3) + (c2 - c1) * cnst3h;
++    r0 += cnst4h;
++    r0 = r0 >> 3;
++    /* Get filter_value from bounding_values one by one */
++    ST_SH(r0, temp_16);
++    for (int i = 0; i < 8; i++)
++        temp_32[i] = bounding_values[temp_16[i]];
++    LD_SW2(temp_32, 4, e0, e1);
++    ILVR_H2_SW(zero, c1, zero, c2, f0, g0);
++    ILVL_H2_SW(zero, c1, zero, c2, f1, g1);
++    f0 += e0;
++    f1 += e1;
++    g0 -= e0;
++    g1 -= e1;
++    CLIP_SW4_0_255(f0, f1, g0, g1);
++    VSHF_B2_SB(f0, f1, g0, g1, mask, mask, d1, d2);
++
++    /* Final move to first_pixel */
++    ST_D1(d1, 0, first_pixel + nstride);
++    ST_D1(d2, 0, first_pixel);
++}
++
++void ff_vp3_h_loop_filter_msa(uint8_t *first_pixel, ptrdiff_t stride,
++                              int *bounding_values)
++{
++    v16i8 d0, d1, d2, d3, d4, d5, d6, d7;
++    v8i16 c0, c1, c2, c3, c4, c5, c6, c7;
++    v8i16 r0;
++    v4i32 e0, e1, f0, f1, g0, g1;
++    v16i8 zero = {0};
++    v8i16 cnst3h = {3, 3, 3, 3, 3, 3, 3, 3},
++          cnst4h = {4, 4, 4, 4, 4, 4, 4, 4};
++    v16i8 mask = {0, 16, 4, 20, 8, 24, 12, 28, 0, 0, 0, 0, 0, 0, 0, 0};
++    int16_t temp_16[8];
++    int temp_32[8];
++
++    LD_SB8(first_pixel - 2, stride, d0, d1, d2, d3, d4, d5, d6, d7);
++    ILVR_B4_SH(zero, d0, zero, d1, zero, d2, zero, d3,
++               c0, c1, c2, c3);
++    ILVR_B4_SH(zero, d4, zero, d5, zero, d6, zero, d7,
++               c4, c5, c6, c7);
++    TRANSPOSE8x8_SH_SH(c0, c1, c2, c3, c4, c5, c6, c7,
++                       c0, c1, c2, c3, c4, c5, c6, c7);
++    r0 = (c0 - c3) + (c2 - c1) * cnst3h;
++    r0 += cnst4h;
++    r0 = r0 >> 3;
++
++    /* Get filter_value from bounding_values one by one */
++    ST_SH(r0, temp_16);
++    for (int i = 0; i < 8; i++)
++        temp_32[i] = bounding_values[temp_16[i]];
++    LD_SW2(temp_32, 4, e0, e1);
++    ILVR_H2_SW(zero, c1, zero, c2, f0, g0);
++    ILVL_H2_SW(zero, c1, zero, c2, f1, g1);
++    f0 += e0;
++    f1 += e1;
++    g0 -= e0;
++    g1 -= e1;
++    CLIP_SW4_0_255(f0, f1, g0, g1);
++    VSHF_B2_SB(f0, g0, f1, g1, mask, mask, d1, d2);
++    /* Final move to first_pixel */
++    ST_H4(d1, 0, 1, 2, 3, first_pixel - 1, stride);
++    ST_H4(d2, 0, 1, 2, 3, first_pixel - 1 + 4 * stride, stride);
++}
++
++void ff_put_no_rnd_pixels_l2_msa(uint8_t *dst, const uint8_t *src1,
++                                 const uint8_t *src2, ptrdiff_t stride, int h)
++{
++    if (h == 8) {
++        v16i8 d0, d1, d2, d3, d4, d5, d6, d7;
++        v16i8 c0, c1, c2, c3;
++        v4i32 a0, a1, a2, a3, b0, b1, b2, b3;
++        v4i32 e0, e1, e2;
++        v4i32 f0, f1, f2;
++        v4u32 t0, t1, t2, t3;
++        v16i8 mask = {0, 1, 2, 3, 16, 17, 18, 19, 4, 5, 6, 7, 20, 21, 22, 23};
++        int32_t value = 0xfefefefe;
++        v4i32 fmask = {value, value, value, value};
++
++        LD_SB8(src1, stride, d0, d1, d2, d3, d4, d5, d6, d7);
++        VSHF_B2_SB(d0, d1, d2, d3, mask, mask, c0, c1);
++        VSHF_B2_SB(d4, d5, d6, d7, mask, mask, c2, c3);
++        a0 = (v4i32) __msa_pckev_d((v2i64)c1, (v2i64)c0);
++        a2 = (v4i32) __msa_pckod_d((v2i64)c1, (v2i64)c0);
++        a1 = (v4i32) __msa_pckev_d((v2i64)c3, (v2i64)c2);
++        a3 = (v4i32) __msa_pckod_d((v2i64)c3, (v2i64)c2);
++
++        LD_SB8(src2, stride, d0, d1, d2, d3, d4, d5, d6, d7);
++        VSHF_B2_SB(d0, d1, d2, d3, mask, mask, c0, c1);
++        VSHF_B2_SB(d4, d5, d6, d7, mask, mask, c2, c3);
++        b0 = (v4i32) __msa_pckev_d((v2i64)c1, (v2i64)c0);
++        b2 = (v4i32) __msa_pckod_d((v2i64)c1, (v2i64)c0);
++        b1 = (v4i32) __msa_pckev_d((v2i64)c3, (v2i64)c2);
++        b3 = (v4i32) __msa_pckod_d((v2i64)c3, (v2i64)c2);
++
++        e0 = (v4i32) __msa_xor_v((v16u8)a0, (v16u8)b0);
++        e0 = (v4i32) __msa_and_v((v16u8)e0, (v16u8)fmask);
++        t0 = ((v4u32)e0) >> 1;
++        e2 = (v4i32) __msa_and_v((v16u8)a0, (v16u8)b0);
++        t0 = t0 + (v4u32)e2;
++
++        e1 = (v4i32) __msa_xor_v((v16u8)a1, (v16u8)b1);
++        e1 = (v4i32) __msa_and_v((v16u8)e1, (v16u8)fmask);
++        t1 = ((v4u32)e1) >> 1;
++        e2 = (v4i32) __msa_and_v((v16u8)a1, (v16u8)b1);
++        t1 = t1 + (v4u32)e2;
++
++        f0 = (v4i32) __msa_xor_v((v16u8)a2, (v16u8)b2);
++        f0 = (v4i32) __msa_and_v((v16u8)f0, (v16u8)fmask);
++        t2 = ((v4u32)f0) >> 1;
++        f2 = (v4i32) __msa_and_v((v16u8)a2, (v16u8)b2);
++        t2 = t2 + (v4u32)f2;
++
++        f1 = (v4i32) __msa_xor_v((v16u8)a3, (v16u8)b3);
++        f1 = (v4i32) __msa_and_v((v16u8)f1, (v16u8)fmask);
++        t3 = ((v4u32)f1) >> 1;
++        f2 = (v4i32) __msa_and_v((v16u8)a3, (v16u8)b3);
++        t3 = t3 + (v4u32)f2;
++
++        ST_W8(t0, t1, 0, 1, 2, 3, 0, 1, 2, 3, dst, stride);
++        ST_W8(t2, t3, 0, 1, 2, 3, 0, 1, 2, 3, dst + 4, stride);
++    } else {
++        int i;
++
++        for (i = 0; i < h; i++) {
++            uint32_t a, b;
++
++            a = AV_RN32(&src1[i * stride]);
++            b = AV_RN32(&src2[i * stride]);
++            AV_WN32A(&dst[i * stride], no_rnd_avg32(a, b));
++            a = AV_RN32(&src1[i * stride + 4]);
++            b = AV_RN32(&src2[i * stride + 4]);
++            AV_WN32A(&dst[i * stride + 4], no_rnd_avg32(a, b));
++        }
++    }
++}
+diff -uNra ffmpeg-4.1.6/libavcodec/mips/vp3dsp_init_mips.c FFmpeg/libavcodec/mips/vp3dsp_init_mips.c
+--- a/libavcodec/mips/vp3dsp_init_mips.c	1970-01-01 08:00:00.000000000 +0800
++++ b/libavcodec/mips/vp3dsp_init_mips.c	2020-07-19 18:19:52.764090369 +0800
+@@ -0,0 +1,50 @@
++
++/*
++ * Copyright (c) 2018 gxw <guxiwei-hf@loongson.cn>
++ *
++ * This file is part of FFmpeg.
++ *
++ * FFmpeg is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * FFmpeg is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with FFmpeg; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
++ */
++
++#include "libavutil/mips/cpu.h"
++#include "config.h"
++#include "libavutil/attributes.h"
++#include "libavcodec/avcodec.h"
++#include "libavcodec/vp3dsp.h"
++#include "vp3dsp_mips.h"
++
++av_cold void ff_vp3dsp_init_mips(VP3DSPContext *c, int flags)
++{
++    int cpu_flags = av_get_cpu_flags();
++
++    if (have_mmi(cpu_flags)) {
++        c->put_no_rnd_pixels_l2 = ff_put_no_rnd_pixels_l2_mmi;
++
++        c->idct_add      = ff_vp3_idct_add_mmi;
++        c->idct_put      = ff_vp3_idct_put_mmi;
++        c->idct_dc_add   = ff_vp3_idct_dc_add_mmi;
++    }
++
++    if (have_msa(cpu_flags)) {
++        c->put_no_rnd_pixels_l2 = ff_put_no_rnd_pixels_l2_msa;
++
++        c->idct_add      = ff_vp3_idct_add_msa;
++        c->idct_put      = ff_vp3_idct_put_msa;
++        c->idct_dc_add   = ff_vp3_idct_dc_add_msa;
++        c->v_loop_filter = ff_vp3_v_loop_filter_msa;
++        c->h_loop_filter = ff_vp3_h_loop_filter_msa;
++    }
++}
+diff -uNra ffmpeg-4.1.6/libavcodec/mips/vp3dsp_mips.h FFmpeg/libavcodec/mips/vp3dsp_mips.h
+--- a/libavcodec/mips/vp3dsp_mips.h	1970-01-01 08:00:00.000000000 +0800
++++ b/libavcodec/mips/vp3dsp_mips.h	2020-07-19 18:13:57.513110563 +0800
+@@ -0,0 +1,43 @@
++/*
++ * Copyright (c) 2018 gxw <guxiwei-hf@loongson.cn>
++ *
++ * This file is part of FFmpeg.
++ *
++ * FFmpeg is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * FFmpeg is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with FFmpeg; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
++ */
++
++#ifndef AVCODEC_MIPS_VP3DSP_MIPS_H
++#define AVCODEC_MIPS_VP3DSP_MIPS_H
++
++#include "libavcodec/vp3dsp.h"
++#include <string.h>
++
++void ff_vp3_idct_add_msa(uint8_t *dest, ptrdiff_t line_size, int16_t *block);
++void ff_vp3_idct_put_msa(uint8_t *dest, ptrdiff_t line_size, int16_t *block);
++void ff_vp3_idct_dc_add_msa(uint8_t *dest, ptrdiff_t line_size, int16_t *block);
++void ff_vp3_v_loop_filter_msa(uint8_t *first_pixel, ptrdiff_t stride,
++                              int *bounding_values);
++void ff_put_no_rnd_pixels_l2_msa(uint8_t *dst, const uint8_t *src1,
++                                 const uint8_t *src2, ptrdiff_t stride, int h);
++void ff_vp3_h_loop_filter_msa(uint8_t *first_pixel, ptrdiff_t stride,
++                              int *bounding_values);
++
++void ff_vp3_idct_add_mmi(uint8_t *dest, ptrdiff_t line_size, int16_t *block);
++void ff_vp3_idct_put_mmi(uint8_t *dest, ptrdiff_t line_size, int16_t *block);
++void ff_vp3_idct_dc_add_mmi(uint8_t *dest, ptrdiff_t line_size, int16_t *block);
++void ff_put_no_rnd_pixels_l2_mmi(uint8_t *dst, const uint8_t *src1,
++                                 const uint8_t *src2, ptrdiff_t stride, int h);
++
++#endif /* #ifndef AVCODEC_MIPS_VP3DSP_MIPS_H */
+diff -uNra ffmpeg-4.1.6/libavcodec/mips/vp8dsp_init_mips.c FFmpeg/libavcodec/mips/vp8dsp_init_mips.c
+--- a/libavcodec/mips/vp8dsp_init_mips.c	2020-07-03 23:10:59.000000000 +0800
++++ b/libavcodec/mips/vp8dsp_init_mips.c	2020-07-19 18:19:52.764090369 +0800
+@@ -24,6 +24,7 @@
+  * VP8 compatible video decoder
+  */
+ 
++#include "libavutil/mips/cpu.h"
+ #include "config.h"
+ #include "libavutil/attributes.h"
+ #include "libavcodec/vp8dsp.h"
+@@ -71,132 +72,123 @@
+     dsp->put_vp8_bilinear_pixels_tab[IDX][0][0] =  \
+         ff_put_vp8_pixels##SIZE##_msa;
+ 
+-#if HAVE_MSA
+-static av_cold void vp8dsp_init_msa(VP8DSPContext *dsp)
+-{
+-    dsp->vp8_luma_dc_wht = ff_vp8_luma_dc_wht_msa;
+-    dsp->vp8_idct_add = ff_vp8_idct_add_msa;
+-    dsp->vp8_idct_dc_add = ff_vp8_idct_dc_add_msa;
+-    dsp->vp8_idct_dc_add4y = ff_vp8_idct_dc_add4y_msa;
+-    dsp->vp8_idct_dc_add4uv = ff_vp8_idct_dc_add4uv_msa;
+-
+-    VP8_MC_MIPS_FUNC(0, 16);
+-    VP8_MC_MIPS_FUNC(1, 8);
+-    VP8_MC_MIPS_FUNC(2, 4);
+-
+-    VP8_BILINEAR_MC_MIPS_FUNC(0, 16);
+-    VP8_BILINEAR_MC_MIPS_FUNC(1, 8);
+-    VP8_BILINEAR_MC_MIPS_FUNC(2, 4);
+-
+-    VP8_MC_MIPS_COPY(0, 16);
+-    VP8_MC_MIPS_COPY(1, 8);
+-
+-    dsp->vp8_v_loop_filter16y = ff_vp8_v_loop_filter16_msa;
+-    dsp->vp8_h_loop_filter16y = ff_vp8_h_loop_filter16_msa;
+-    dsp->vp8_v_loop_filter8uv = ff_vp8_v_loop_filter8uv_msa;
+-    dsp->vp8_h_loop_filter8uv = ff_vp8_h_loop_filter8uv_msa;
+-
+-    dsp->vp8_v_loop_filter16y_inner = ff_vp8_v_loop_filter16_inner_msa;
+-    dsp->vp8_h_loop_filter16y_inner = ff_vp8_h_loop_filter16_inner_msa;
+-    dsp->vp8_v_loop_filter8uv_inner = ff_vp8_v_loop_filter8uv_inner_msa;
+-    dsp->vp8_h_loop_filter8uv_inner = ff_vp8_h_loop_filter8uv_inner_msa;
+-
+-    dsp->vp8_v_loop_filter_simple = ff_vp8_v_loop_filter_simple_msa;
+-    dsp->vp8_h_loop_filter_simple = ff_vp8_h_loop_filter_simple_msa;
+-}
+-#endif  // #if HAVE_MSA
+ 
+-#if HAVE_MMI
+-static av_cold void vp8dsp_init_mmi(VP8DSPContext *dsp)
+-{
+-    dsp->vp8_luma_dc_wht    = ff_vp8_luma_dc_wht_mmi;
+-    dsp->vp8_luma_dc_wht_dc = ff_vp8_luma_dc_wht_dc_mmi;
+-    dsp->vp8_idct_add       = ff_vp8_idct_add_mmi;
+-    dsp->vp8_idct_dc_add    = ff_vp8_idct_dc_add_mmi;
+-    dsp->vp8_idct_dc_add4y  = ff_vp8_idct_dc_add4y_mmi;
+-    dsp->vp8_idct_dc_add4uv = ff_vp8_idct_dc_add4uv_mmi;
+-
+-    dsp->put_vp8_epel_pixels_tab[0][0][1] = ff_put_vp8_epel16_h4_mmi;
+-    dsp->put_vp8_epel_pixels_tab[0][0][2] = ff_put_vp8_epel16_h6_mmi;
+-    dsp->put_vp8_epel_pixels_tab[0][1][0] = ff_put_vp8_epel16_v4_mmi;
+-    dsp->put_vp8_epel_pixels_tab[0][1][1] = ff_put_vp8_epel16_h4v4_mmi;
+-    dsp->put_vp8_epel_pixels_tab[0][1][2] = ff_put_vp8_epel16_h6v4_mmi;
+-    dsp->put_vp8_epel_pixels_tab[0][2][0] = ff_put_vp8_epel16_v6_mmi;
+-    dsp->put_vp8_epel_pixels_tab[0][2][1] = ff_put_vp8_epel16_h4v6_mmi;
+-    dsp->put_vp8_epel_pixels_tab[0][2][2] = ff_put_vp8_epel16_h6v6_mmi;
+-
+-    dsp->put_vp8_epel_pixels_tab[1][0][1] = ff_put_vp8_epel8_h4_mmi;
+-    dsp->put_vp8_epel_pixels_tab[1][0][2] = ff_put_vp8_epel8_h6_mmi;
+-    dsp->put_vp8_epel_pixels_tab[1][1][0] = ff_put_vp8_epel8_v4_mmi;
+-    dsp->put_vp8_epel_pixels_tab[1][1][1] = ff_put_vp8_epel8_h4v4_mmi;
+-    dsp->put_vp8_epel_pixels_tab[1][1][2] = ff_put_vp8_epel8_h6v4_mmi;
+-    dsp->put_vp8_epel_pixels_tab[1][2][0] = ff_put_vp8_epel8_v6_mmi;
+-    dsp->put_vp8_epel_pixels_tab[1][2][1] = ff_put_vp8_epel8_h4v6_mmi;
+-    dsp->put_vp8_epel_pixels_tab[1][2][2] = ff_put_vp8_epel8_h6v6_mmi;
+-
+-    dsp->put_vp8_epel_pixels_tab[2][0][1] = ff_put_vp8_epel4_h4_mmi;
+-    dsp->put_vp8_epel_pixels_tab[2][0][2] = ff_put_vp8_epel4_h6_mmi;
+-    dsp->put_vp8_epel_pixels_tab[2][1][0] = ff_put_vp8_epel4_v4_mmi;
+-    dsp->put_vp8_epel_pixels_tab[2][1][1] = ff_put_vp8_epel4_h4v4_mmi;
+-    dsp->put_vp8_epel_pixels_tab[2][1][2] = ff_put_vp8_epel4_h6v4_mmi;
+-    dsp->put_vp8_epel_pixels_tab[2][2][0] = ff_put_vp8_epel4_v6_mmi;
+-    dsp->put_vp8_epel_pixels_tab[2][2][1] = ff_put_vp8_epel4_h4v6_mmi;
+-    dsp->put_vp8_epel_pixels_tab[2][2][2] = ff_put_vp8_epel4_h6v6_mmi;
+-
+-    dsp->put_vp8_bilinear_pixels_tab[0][0][1] = ff_put_vp8_bilinear16_h_mmi;
+-    dsp->put_vp8_bilinear_pixels_tab[0][0][2] = ff_put_vp8_bilinear16_h_mmi;
+-    dsp->put_vp8_bilinear_pixels_tab[0][1][0] = ff_put_vp8_bilinear16_v_mmi;
+-    dsp->put_vp8_bilinear_pixels_tab[0][1][1] = ff_put_vp8_bilinear16_hv_mmi;
+-    dsp->put_vp8_bilinear_pixels_tab[0][1][2] = ff_put_vp8_bilinear16_hv_mmi;
+-    dsp->put_vp8_bilinear_pixels_tab[0][2][0] = ff_put_vp8_bilinear16_v_mmi;
+-    dsp->put_vp8_bilinear_pixels_tab[0][2][1] = ff_put_vp8_bilinear16_hv_mmi;
+-    dsp->put_vp8_bilinear_pixels_tab[0][2][2] = ff_put_vp8_bilinear16_hv_mmi;
+-
+-    dsp->put_vp8_bilinear_pixels_tab[1][0][1] = ff_put_vp8_bilinear8_h_mmi;
+-    dsp->put_vp8_bilinear_pixels_tab[1][0][2] = ff_put_vp8_bilinear8_h_mmi;
+-    dsp->put_vp8_bilinear_pixels_tab[1][1][0] = ff_put_vp8_bilinear8_v_mmi;
+-    dsp->put_vp8_bilinear_pixels_tab[1][1][1] = ff_put_vp8_bilinear8_hv_mmi;
+-    dsp->put_vp8_bilinear_pixels_tab[1][1][2] = ff_put_vp8_bilinear8_hv_mmi;
+-    dsp->put_vp8_bilinear_pixels_tab[1][2][0] = ff_put_vp8_bilinear8_v_mmi;
+-    dsp->put_vp8_bilinear_pixels_tab[1][2][1] = ff_put_vp8_bilinear8_hv_mmi;
+-    dsp->put_vp8_bilinear_pixels_tab[1][2][2] = ff_put_vp8_bilinear8_hv_mmi;
+-
+-    dsp->put_vp8_bilinear_pixels_tab[2][0][1] = ff_put_vp8_bilinear4_h_mmi;
+-    dsp->put_vp8_bilinear_pixels_tab[2][0][2] = ff_put_vp8_bilinear4_h_mmi;
+-    dsp->put_vp8_bilinear_pixels_tab[2][1][0] = ff_put_vp8_bilinear4_v_mmi;
+-    dsp->put_vp8_bilinear_pixels_tab[2][1][1] = ff_put_vp8_bilinear4_hv_mmi;
+-    dsp->put_vp8_bilinear_pixels_tab[2][1][2] = ff_put_vp8_bilinear4_hv_mmi;
+-    dsp->put_vp8_bilinear_pixels_tab[2][2][0] = ff_put_vp8_bilinear4_v_mmi;
+-    dsp->put_vp8_bilinear_pixels_tab[2][2][1] = ff_put_vp8_bilinear4_hv_mmi;
+-    dsp->put_vp8_bilinear_pixels_tab[2][2][2] = ff_put_vp8_bilinear4_hv_mmi;
+-
+-    dsp->put_vp8_epel_pixels_tab[0][0][0]     = ff_put_vp8_pixels16_mmi;
+-    dsp->put_vp8_bilinear_pixels_tab[0][0][0] = ff_put_vp8_pixels16_mmi;
+-
+-    dsp->put_vp8_epel_pixels_tab[1][0][0]     = ff_put_vp8_pixels8_mmi;
+-    dsp->put_vp8_bilinear_pixels_tab[1][0][0] = ff_put_vp8_pixels8_mmi;
+-
+-    dsp->vp8_v_loop_filter16y = ff_vp8_v_loop_filter16_mmi;
+-    dsp->vp8_h_loop_filter16y = ff_vp8_h_loop_filter16_mmi;
+-    dsp->vp8_v_loop_filter8uv = ff_vp8_v_loop_filter8uv_mmi;
+-    dsp->vp8_h_loop_filter8uv = ff_vp8_h_loop_filter8uv_mmi;
+-
+-    dsp->vp8_v_loop_filter16y_inner = ff_vp8_v_loop_filter16_inner_mmi;
+-    dsp->vp8_h_loop_filter16y_inner = ff_vp8_h_loop_filter16_inner_mmi;
+-    dsp->vp8_v_loop_filter8uv_inner = ff_vp8_v_loop_filter8uv_inner_mmi;
+-    dsp->vp8_h_loop_filter8uv_inner = ff_vp8_h_loop_filter8uv_inner_mmi;
+-
+-    dsp->vp8_v_loop_filter_simple = ff_vp8_v_loop_filter_simple_mmi;
+-    dsp->vp8_h_loop_filter_simple = ff_vp8_h_loop_filter_simple_mmi;
+-}
+-#endif /* HAVE_MMI */
+ 
+ av_cold void ff_vp8dsp_init_mips(VP8DSPContext *dsp)
+ {
+-#if HAVE_MSA
+-    vp8dsp_init_msa(dsp);
+-#endif  // #if HAVE_MSA
+-#if HAVE_MMI
+-    vp8dsp_init_mmi(dsp);
+-#endif /* HAVE_MMI */
++    int cpu_flags = av_get_cpu_flags();
++
++    if (have_mmi(cpu_flags)) {
++        dsp->vp8_luma_dc_wht    = ff_vp8_luma_dc_wht_mmi;
++        dsp->vp8_luma_dc_wht_dc = ff_vp8_luma_dc_wht_dc_mmi;
++        dsp->vp8_idct_add       = ff_vp8_idct_add_mmi;
++        dsp->vp8_idct_dc_add    = ff_vp8_idct_dc_add_mmi;
++        dsp->vp8_idct_dc_add4y  = ff_vp8_idct_dc_add4y_mmi;
++        dsp->vp8_idct_dc_add4uv = ff_vp8_idct_dc_add4uv_mmi;
++
++        dsp->put_vp8_epel_pixels_tab[0][0][1] = ff_put_vp8_epel16_h4_mmi;
++        dsp->put_vp8_epel_pixels_tab[0][0][2] = ff_put_vp8_epel16_h6_mmi;
++        dsp->put_vp8_epel_pixels_tab[0][1][0] = ff_put_vp8_epel16_v4_mmi;
++        dsp->put_vp8_epel_pixels_tab[0][1][1] = ff_put_vp8_epel16_h4v4_mmi;
++        dsp->put_vp8_epel_pixels_tab[0][1][2] = ff_put_vp8_epel16_h6v4_mmi;
++        dsp->put_vp8_epel_pixels_tab[0][2][0] = ff_put_vp8_epel16_v6_mmi;
++        dsp->put_vp8_epel_pixels_tab[0][2][1] = ff_put_vp8_epel16_h4v6_mmi;
++        dsp->put_vp8_epel_pixels_tab[0][2][2] = ff_put_vp8_epel16_h6v6_mmi;
++
++        dsp->put_vp8_epel_pixels_tab[1][0][1] = ff_put_vp8_epel8_h4_mmi;
++        dsp->put_vp8_epel_pixels_tab[1][0][2] = ff_put_vp8_epel8_h6_mmi;
++        dsp->put_vp8_epel_pixels_tab[1][1][0] = ff_put_vp8_epel8_v4_mmi;
++        dsp->put_vp8_epel_pixels_tab[1][1][1] = ff_put_vp8_epel8_h4v4_mmi;
++        dsp->put_vp8_epel_pixels_tab[1][1][2] = ff_put_vp8_epel8_h6v4_mmi;
++        dsp->put_vp8_epel_pixels_tab[1][2][0] = ff_put_vp8_epel8_v6_mmi;
++        dsp->put_vp8_epel_pixels_tab[1][2][1] = ff_put_vp8_epel8_h4v6_mmi;
++        dsp->put_vp8_epel_pixels_tab[1][2][2] = ff_put_vp8_epel8_h6v6_mmi;
++
++        dsp->put_vp8_epel_pixels_tab[2][0][1] = ff_put_vp8_epel4_h4_mmi;
++        dsp->put_vp8_epel_pixels_tab[2][0][2] = ff_put_vp8_epel4_h6_mmi;
++        dsp->put_vp8_epel_pixels_tab[2][1][0] = ff_put_vp8_epel4_v4_mmi;
++        dsp->put_vp8_epel_pixels_tab[2][1][1] = ff_put_vp8_epel4_h4v4_mmi;
++        dsp->put_vp8_epel_pixels_tab[2][1][2] = ff_put_vp8_epel4_h6v4_mmi;
++        dsp->put_vp8_epel_pixels_tab[2][2][0] = ff_put_vp8_epel4_v6_mmi;
++        dsp->put_vp8_epel_pixels_tab[2][2][1] = ff_put_vp8_epel4_h4v6_mmi;
++        dsp->put_vp8_epel_pixels_tab[2][2][2] = ff_put_vp8_epel4_h6v6_mmi;
++
++        dsp->put_vp8_bilinear_pixels_tab[0][0][1] = ff_put_vp8_bilinear16_h_mmi;
++        dsp->put_vp8_bilinear_pixels_tab[0][0][2] = ff_put_vp8_bilinear16_h_mmi;
++        dsp->put_vp8_bilinear_pixels_tab[0][1][0] = ff_put_vp8_bilinear16_v_mmi;
++        dsp->put_vp8_bilinear_pixels_tab[0][1][1] = ff_put_vp8_bilinear16_hv_mmi;
++        dsp->put_vp8_bilinear_pixels_tab[0][1][2] = ff_put_vp8_bilinear16_hv_mmi;
++        dsp->put_vp8_bilinear_pixels_tab[0][2][0] = ff_put_vp8_bilinear16_v_mmi;
++        dsp->put_vp8_bilinear_pixels_tab[0][2][1] = ff_put_vp8_bilinear16_hv_mmi;
++        dsp->put_vp8_bilinear_pixels_tab[0][2][2] = ff_put_vp8_bilinear16_hv_mmi;
++
++        dsp->put_vp8_bilinear_pixels_tab[1][0][1] = ff_put_vp8_bilinear8_h_mmi;
++        dsp->put_vp8_bilinear_pixels_tab[1][0][2] = ff_put_vp8_bilinear8_h_mmi;
++        dsp->put_vp8_bilinear_pixels_tab[1][1][0] = ff_put_vp8_bilinear8_v_mmi;
++        dsp->put_vp8_bilinear_pixels_tab[1][1][1] = ff_put_vp8_bilinear8_hv_mmi;
++        dsp->put_vp8_bilinear_pixels_tab[1][1][2] = ff_put_vp8_bilinear8_hv_mmi;
++        dsp->put_vp8_bilinear_pixels_tab[1][2][0] = ff_put_vp8_bilinear8_v_mmi;
++        dsp->put_vp8_bilinear_pixels_tab[1][2][1] = ff_put_vp8_bilinear8_hv_mmi;
++        dsp->put_vp8_bilinear_pixels_tab[1][2][2] = ff_put_vp8_bilinear8_hv_mmi;
++
++        dsp->put_vp8_bilinear_pixels_tab[2][0][1] = ff_put_vp8_bilinear4_h_mmi;
++        dsp->put_vp8_bilinear_pixels_tab[2][0][2] = ff_put_vp8_bilinear4_h_mmi;
++        dsp->put_vp8_bilinear_pixels_tab[2][1][0] = ff_put_vp8_bilinear4_v_mmi;
++        dsp->put_vp8_bilinear_pixels_tab[2][1][1] = ff_put_vp8_bilinear4_hv_mmi;
++        dsp->put_vp8_bilinear_pixels_tab[2][1][2] = ff_put_vp8_bilinear4_hv_mmi;
++        dsp->put_vp8_bilinear_pixels_tab[2][2][0] = ff_put_vp8_bilinear4_v_mmi;
++        dsp->put_vp8_bilinear_pixels_tab[2][2][1] = ff_put_vp8_bilinear4_hv_mmi;
++        dsp->put_vp8_bilinear_pixels_tab[2][2][2] = ff_put_vp8_bilinear4_hv_mmi;
++
++        dsp->put_vp8_epel_pixels_tab[0][0][0]     = ff_put_vp8_pixels16_mmi;
++        dsp->put_vp8_bilinear_pixels_tab[0][0][0] = ff_put_vp8_pixels16_mmi;
++
++        dsp->put_vp8_epel_pixels_tab[1][0][0]     = ff_put_vp8_pixels8_mmi;
++        dsp->put_vp8_bilinear_pixels_tab[1][0][0] = ff_put_vp8_pixels8_mmi;
++
++        dsp->vp8_v_loop_filter16y = ff_vp8_v_loop_filter16_mmi;
++        dsp->vp8_h_loop_filter16y = ff_vp8_h_loop_filter16_mmi;
++        dsp->vp8_v_loop_filter8uv = ff_vp8_v_loop_filter8uv_mmi;
++        dsp->vp8_h_loop_filter8uv = ff_vp8_h_loop_filter8uv_mmi;
++
++        dsp->vp8_v_loop_filter16y_inner = ff_vp8_v_loop_filter16_inner_mmi;
++        dsp->vp8_h_loop_filter16y_inner = ff_vp8_h_loop_filter16_inner_mmi;
++        dsp->vp8_v_loop_filter8uv_inner = ff_vp8_v_loop_filter8uv_inner_mmi;
++        dsp->vp8_h_loop_filter8uv_inner = ff_vp8_h_loop_filter8uv_inner_mmi;
++
++        dsp->vp8_v_loop_filter_simple = ff_vp8_v_loop_filter_simple_mmi;
++        dsp->vp8_h_loop_filter_simple = ff_vp8_h_loop_filter_simple_mmi;
++    }
++
++    if (have_msa(cpu_flags)) {
++        dsp->vp8_luma_dc_wht = ff_vp8_luma_dc_wht_msa;
++        dsp->vp8_idct_add = ff_vp8_idct_add_msa;
++        dsp->vp8_idct_dc_add = ff_vp8_idct_dc_add_msa;
++        dsp->vp8_idct_dc_add4y = ff_vp8_idct_dc_add4y_msa;
++        dsp->vp8_idct_dc_add4uv = ff_vp8_idct_dc_add4uv_msa;
++
++        VP8_MC_MIPS_FUNC(0, 16);
++        VP8_MC_MIPS_FUNC(1, 8);
++        VP8_MC_MIPS_FUNC(2, 4);
++
++        VP8_BILINEAR_MC_MIPS_FUNC(0, 16);
++        VP8_BILINEAR_MC_MIPS_FUNC(1, 8);
++        VP8_BILINEAR_MC_MIPS_FUNC(2, 4);
++
++        VP8_MC_MIPS_COPY(0, 16);
++        VP8_MC_MIPS_COPY(1, 8);
++
++        dsp->vp8_v_loop_filter16y = ff_vp8_v_loop_filter16_msa;
++        dsp->vp8_h_loop_filter16y = ff_vp8_h_loop_filter16_msa;
++        dsp->vp8_v_loop_filter8uv = ff_vp8_v_loop_filter8uv_msa;
++        dsp->vp8_h_loop_filter8uv = ff_vp8_h_loop_filter8uv_msa;
++
++        dsp->vp8_v_loop_filter16y_inner = ff_vp8_v_loop_filter16_inner_msa;
++        dsp->vp8_h_loop_filter16y_inner = ff_vp8_h_loop_filter16_inner_msa;
++        dsp->vp8_v_loop_filter8uv_inner = ff_vp8_v_loop_filter8uv_inner_msa;
++        dsp->vp8_h_loop_filter8uv_inner = ff_vp8_h_loop_filter8uv_inner_msa;
++
++        dsp->vp8_v_loop_filter_simple = ff_vp8_v_loop_filter_simple_msa;
++        dsp->vp8_h_loop_filter_simple = ff_vp8_h_loop_filter_simple_msa;
++    }
+ }
+diff -uNra ffmpeg-4.1.6/libavcodec/mips/vp8_idct_msa.c FFmpeg/libavcodec/mips/vp8_idct_msa.c
+--- a/libavcodec/mips/vp8_idct_msa.c	2020-07-03 01:22:31.000000000 +0800
++++ b/libavcodec/mips/vp8_idct_msa.c	2020-07-19 18:13:57.513110563 +0800
+@@ -71,12 +71,10 @@
+     ILVR_H4_SW(zero, res0, zero, res1, zero, res2, zero, res3,
+                res0, res1, res2, res3);
+     ADD4(res0, vt0, res1, vt1, res2, vt2, res3, vt3, res0, res1, res2, res3);
+-    res0 = CLIP_SW_0_255(res0);
+-    res1 = CLIP_SW_0_255(res1);
+-    res2 = CLIP_SW_0_255(res2);
+-    res3 = CLIP_SW_0_255(res3);
++    CLIP_SW4_0_255(res0, res1, res2, res3);
+     VSHF_B2_SB(res0, res1, res2, res3, mask, mask, dest0, dest1);
+-    ST4x4_UB(dest0, dest1, 0, 1, 0, 1, dst, stride);
++    ST_W2(dest0, 0, 1, dst, stride);
++    ST_W2(dest1, 0, 1, dst + 2 * stride, stride);
+ 
+     memset(input, 0, 4 * 4 * sizeof(*input));
+ }
+@@ -97,7 +95,8 @@
+     ADD4(res0, vec, res1, vec, res2, vec, res3, vec, res0, res1, res2, res3);
+     CLIP_SH4_0_255(res0, res1, res2, res3);
+     VSHF_B2_SB(res0, res1, res2, res3, mask, mask, dest0, dest1);
+-    ST4x4_UB(dest0, dest1, 0, 1, 0, 1, dst, stride);
++    ST_W2(dest0, 0, 1, dst, stride);
++    ST_W2(dest1, 0, 1, dst + 2 * stride, stride);
+ 
+     in_dc[0] = 0;
+ }
+diff -uNra ffmpeg-4.1.6/libavcodec/mips/vp8_lpf_msa.c FFmpeg/libavcodec/mips/vp8_lpf_msa.c
+--- a/libavcodec/mips/vp8_lpf_msa.c	2020-07-03 01:22:31.000000000 +0800
++++ b/libavcodec/mips/vp8_lpf_msa.c	2020-07-19 18:13:57.517018973 +0800
+@@ -540,14 +540,8 @@
+     ILVRL_B2_SH(q0, p0, tmp1, tmp0);
+ 
+     src -= 1;
+-    ST2x4_UB(tmp1, 0, src, pitch);
+-    src += 4 * pitch;
+-    ST2x4_UB(tmp1, 4, src, pitch);
+-    src += 4 * pitch;
+-    ST2x4_UB(tmp0, 0, src, pitch);
+-    src += 4 * pitch;
+-    ST2x4_UB(tmp0, 4, src, pitch);
+-    src += 4 * pitch;
++    ST_H8(tmp1, 0, 1, 2, 3, 4, 5, 6, 7, src, pitch)
++    ST_H8(tmp0, 0, 1, 2, 3, 4, 5, 6, 7, src + 8 * pitch, pitch)
+ }
+ 
+ void ff_vp8_v_loop_filter8uv_inner_msa(uint8_t *src_u, uint8_t *src_v,
+@@ -596,7 +590,6 @@
+                                        ptrdiff_t pitch, int b_limit_in,
+                                        int limit_in, int thresh_in)
+ {
+-    uint8_t *temp_src_u, *temp_src_v;
+     v16u8 p3, p2, p1, p0, q3, q2, q1, q0;
+     v16u8 mask, hev, flat, thresh, limit, b_limit;
+     v16u8 row0, row1, row2, row3, row4, row5, row6, row7, row8;
+@@ -623,15 +616,8 @@
+     tmp1 = (v4i32) __msa_ilvl_b((v16i8) q1, (v16i8) q0);
+     ILVRL_H2_SW(tmp1, tmp0, tmp4, tmp5);
+ 
+-    temp_src_u = src_u - 2;
+-    ST4x4_UB(tmp2, tmp2, 0, 1, 2, 3, temp_src_u, pitch);
+-    temp_src_u += 4 * pitch;
+-    ST4x4_UB(tmp3, tmp3, 0, 1, 2, 3, temp_src_u, pitch);
+-
+-    temp_src_v = src_v - 2;
+-    ST4x4_UB(tmp4, tmp4, 0, 1, 2, 3, temp_src_v, pitch);
+-    temp_src_v += 4 * pitch;
+-    ST4x4_UB(tmp5, tmp5, 0, 1, 2, 3, temp_src_v, pitch);
++    ST_W8(tmp2, tmp3, 0, 1, 2, 3, 0, 1, 2, 3, src_u - 2, pitch);
++    ST_W8(tmp4, tmp5, 0, 1, 2, 3, 0, 1, 2, 3, src_v - 2, pitch);
+ }
+ 
+ void ff_vp8_v_loop_filter16_inner_msa(uint8_t *src, ptrdiff_t pitch,
+@@ -684,7 +670,6 @@
+     ILVRL_H2_SH(tmp1, tmp0, tmp4, tmp5);
+ 
+     src -= 2;
+-    ST4x8_UB(tmp2, tmp3, src, pitch);
+-    src += (8 * pitch);
+-    ST4x8_UB(tmp4, tmp5, src, pitch);
++    ST_W8(tmp2, tmp3, 0, 1, 2, 3, 0, 1, 2, 3, src, pitch)
++    ST_W8(tmp4, tmp5, 0, 1, 2, 3, 0, 1, 2, 3, src + 8 * pitch, pitch)
+ }
+diff -uNra ffmpeg-4.1.6/libavcodec/mips/vp8_mc_msa.c FFmpeg/libavcodec/mips/vp8_mc_msa.c
+--- a/libavcodec/mips/vp8_mc_msa.c	2020-07-03 01:22:31.000000000 +0800
++++ b/libavcodec/mips/vp8_mc_msa.c	2020-07-19 18:13:57.520927382 +0800
+@@ -181,7 +181,7 @@
+     SRARI_H2_SH(out0, out1, 7);
+     SAT_SH2_SH(out0, out1, 7);
+     out = PCKEV_XORI128_UB(out0, out1);
+-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
++    ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
+ }
+ 
+ static void common_hz_6t_4x8_msa(uint8_t *src, int32_t src_stride,
+@@ -214,10 +214,9 @@
+     SRARI_H4_SH(out0, out1, out2, out3, 7);
+     SAT_SH4_SH(out0, out1, out2, out3, 7);
+     out = PCKEV_XORI128_UB(out0, out1);
+-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
+-    dst += (4 * dst_stride);
++    ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
+     out = PCKEV_XORI128_UB(out2, out3);
+-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
++    ST_W4(out, 0, 1, 2, 3, dst + 4 * dst_stride, dst_stride);
+ }
+ 
+ void ff_put_vp8_epel4_h6_msa(uint8_t *dst, ptrdiff_t dst_stride,
+@@ -263,7 +262,7 @@
+     SAT_SH4_SH(out0, out1, out2, out3, 7);
+     tmp0 = PCKEV_XORI128_UB(out0, out1);
+     tmp1 = PCKEV_XORI128_UB(out2, out3);
+-    ST8x4_UB(tmp0, tmp1, dst, dst_stride);
++    ST_D4(tmp0, tmp1, 0, 1, 0, 1, dst, dst_stride);
+     dst += (4 * dst_stride);
+ 
+     for (loop_cnt = (height >> 2) - 1; loop_cnt--;) {
+@@ -276,7 +275,7 @@
+         SAT_SH4_SH(out0, out1, out2, out3, 7);
+         tmp0 = PCKEV_XORI128_UB(out0, out1);
+         tmp1 = PCKEV_XORI128_UB(out2, out3);
+-        ST8x4_UB(tmp0, tmp1, dst, dst_stride);
++        ST_D4(tmp0, tmp1, 0, 1, 0, 1, dst, dst_stride);
+         dst += (4 * dst_stride);
+     }
+ }
+@@ -368,7 +367,7 @@
+         SRARI_H2_SH(out10, out32, 7);
+         SAT_SH2_SH(out10, out32, 7);
+         out = PCKEV_XORI128_UB(out10, out32);
+-        ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
++        ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
+         dst += (4 * dst_stride);
+ 
+         src2110 = src6554;
+@@ -416,7 +415,7 @@
+         SAT_SH4_SH(out0_r, out1_r, out2_r, out3_r, 7);
+         tmp0 = PCKEV_XORI128_UB(out0_r, out1_r);
+         tmp1 = PCKEV_XORI128_UB(out2_r, out3_r);
+-        ST8x4_UB(tmp0, tmp1, dst, dst_stride);
++        ST_D4(tmp0, tmp1, 0, 1, 0, 1, dst, dst_stride);
+         dst += (4 * dst_stride);
+ 
+         src10_r = src76_r;
+@@ -567,7 +566,7 @@
+         SRARI_H2_SH(tmp0, tmp1, 7);
+         SAT_SH2_SH(tmp0, tmp1, 7);
+         out = PCKEV_XORI128_UB(tmp0, tmp1);
+-        ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
++        ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
+         dst += (4 * dst_stride);
+ 
+         hz_out3 = hz_out7;
+@@ -651,7 +650,7 @@
+         SAT_SH4_SH(tmp0, tmp1, tmp2, tmp3, 7);
+         vec0 = PCKEV_XORI128_UB(tmp0, tmp1);
+         vec1 = PCKEV_XORI128_UB(tmp2, tmp3);
+-        ST8x4_UB(vec0, vec1, dst, dst_stride);
++        ST_D4(vec0, vec1, 0, 1, 0, 1, dst, dst_stride);
+         dst += (4 * dst_stride);
+ 
+         hz_out4 = hz_out8;
+@@ -702,7 +701,7 @@
+     SRARI_H2_SH(out0, out1, 7);
+     SAT_SH2_SH(out0, out1, 7);
+     out = PCKEV_XORI128_UB(out0, out1);
+-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
++    ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
+ }
+ 
+ static void common_hz_4t_4x8_msa(uint8_t *src, int32_t src_stride,
+@@ -735,10 +734,9 @@
+     SRARI_H4_SH(out0, out1, out2, out3, 7);
+     SAT_SH4_SH(out0, out1, out2, out3, 7);
+     out = PCKEV_XORI128_UB(out0, out1);
+-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
+-    dst += (4 * dst_stride);
++    ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
+     out = PCKEV_XORI128_UB(out2, out3);
+-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
++    ST_W4(out, 0, 1, 2, 3, dst + 4 * dst_stride, dst_stride);
+ }
+ 
+ static void common_hz_4t_4x16_msa(uint8_t *src, int32_t src_stride,
+@@ -769,10 +767,10 @@
+     SRARI_H4_SH(out0, out1, out2, out3, 7);
+     SAT_SH4_SH(out0, out1, out2, out3, 7);
+     out = PCKEV_XORI128_UB(out0, out1);
+-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
++    ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
+     dst += (4 * dst_stride);
+     out = PCKEV_XORI128_UB(out2, out3);
+-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
++    ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
+     dst += (4 * dst_stride);
+ 
+     LD_SB8(src, src_stride, src0, src1, src2, src3, src4, src5, src6, src7);
+@@ -785,10 +783,10 @@
+     SRARI_H4_SH(out0, out1, out2, out3, 7);
+     SAT_SH4_SH(out0, out1, out2, out3, 7);
+     out = PCKEV_XORI128_UB(out0, out1);
+-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
++    ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
+     dst += (4 * dst_stride);
+     out = PCKEV_XORI128_UB(out2, out3);
+-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
++    ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
+ }
+ 
+ void ff_put_vp8_epel4_h4_msa(uint8_t *dst, ptrdiff_t dst_stride,
+@@ -836,7 +834,7 @@
+         SAT_SH4_SH(out0, out1, out2, out3, 7);
+         tmp0 = PCKEV_XORI128_UB(out0, out1);
+         tmp1 = PCKEV_XORI128_UB(out2, out3);
+-        ST8x4_UB(tmp0, tmp1, dst, dst_stride);
++        ST_D4(tmp0, tmp1, 0, 1, 0, 1, dst, dst_stride);
+         dst += (4 * dst_stride);
+     }
+ }
+@@ -932,7 +930,7 @@
+         SRARI_H2_SH(out10, out32, 7);
+         SAT_SH2_SH(out10, out32, 7);
+         out = PCKEV_XORI128_UB(out10, out32);
+-        ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
++        ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
+         dst += (4 * dst_stride);
+     }
+ }
+@@ -974,7 +972,7 @@
+         SAT_SH4_SH(out0_r, out1_r, out2_r, out3_r, 7);
+         tmp0 = PCKEV_XORI128_UB(out0_r, out1_r);
+         tmp1 = PCKEV_XORI128_UB(out2_r, out3_r);
+-        ST8x4_UB(tmp0, tmp1, dst, dst_stride);
++        ST_D4(tmp0, tmp1, 0, 1, 0, 1, dst, dst_stride);
+         dst += (4 * dst_stride);
+ 
+         src10_r = src98_r;
+@@ -1093,7 +1091,7 @@
+         SRARI_H2_SH(tmp0, tmp1, 7);
+         SAT_SH2_SH(tmp0, tmp1, 7);
+         out = PCKEV_XORI128_UB(tmp0, tmp1);
+-        ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
++        ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
+         dst += (4 * dst_stride);
+ 
+         hz_out1 = hz_out5;
+@@ -1160,7 +1158,7 @@
+         SAT_SH4_SH(tmp0, tmp1, tmp2, tmp3, 7);
+         out0 = PCKEV_XORI128_UB(tmp0, tmp1);
+         out1 = PCKEV_XORI128_UB(tmp2, tmp3);
+-        ST8x4_UB(out0, out1, dst, dst_stride);
++        ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
+         dst += (4 * dst_stride);
+ 
+         vec0 = vec4;
+@@ -1240,7 +1238,8 @@
+         SAT_SH2_SH(tmp0, tmp1, 7);
+         PCKEV_B2_UB(tmp0, tmp0, tmp1, tmp1, res0, res1);
+         XORI_B2_128_UB(res0, res1);
+-        ST4x4_UB(res0, res1, 0, 1, 0, 1, dst, dst_stride);
++        ST_W2(res0, 0, 1, dst, dst_stride);
++        ST_W2(res1, 0, 1, dst + 2 * dst_stride, dst_stride);
+         dst += (4 * dst_stride);
+ 
+         hz_out1 = hz_out5;
+@@ -1316,7 +1315,7 @@
+         SAT_SH4_SH(tmp0, tmp1, tmp2, tmp3, 7);
+         out0 = PCKEV_XORI128_UB(tmp0, tmp1);
+         out1 = PCKEV_XORI128_UB(tmp2, tmp3);
+-        ST8x4_UB(out0, out1, dst, dst_stride);
++        ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
+         dst += (4 * dst_stride);
+     }
+ }
+@@ -1391,7 +1390,7 @@
+         SRARI_H2_SH(tmp0, tmp1, 7);
+         SAT_SH2_SH(tmp0, tmp1, 7);
+         out = PCKEV_XORI128_UB(tmp0, tmp1);
+-        ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
++        ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
+         dst += (4 * dst_stride);
+ 
+         hz_out3 = hz_out7;
+@@ -1464,7 +1463,7 @@
+         SAT_SH4_SH(tmp0, tmp1, tmp2, tmp3, 7);
+         vec0 = PCKEV_XORI128_UB(tmp0, tmp1);
+         vec1 = PCKEV_XORI128_UB(tmp2, tmp3);
+-        ST8x4_UB(vec0, vec1, dst, dst_stride);
++        ST_D4(vec0, vec1, 0, 1, 0, 1, dst, dst_stride);
+         dst += (4 * dst_stride);
+ 
+         hz_out4 = hz_out8;
+@@ -1509,7 +1508,8 @@
+     DOTP_UB2_UH(vec0, vec1, filt0, filt0, vec2, vec3);
+     SRARI_H2_UH(vec2, vec3, 7);
+     PCKEV_B2_UB(vec2, vec2, vec3, vec3, res0, res1);
+-    ST4x4_UB(res0, res1, 0, 1, 0, 1, dst, dst_stride);
++    ST_W2(res0, 0, 1, dst, dst_stride);
++    ST_W2(res1, 0, 1, dst + 2 * dst_stride, dst_stride);
+ }
+ 
+ static void common_hz_2t_4x8_msa(uint8_t *src, int32_t src_stride,
+@@ -1535,9 +1535,10 @@
+     SRARI_H4_UH(vec4, vec5, vec6, vec7, 7);
+     PCKEV_B4_SB(vec4, vec4, vec5, vec5, vec6, vec6, vec7, vec7,
+                 res0, res1, res2, res3);
+-    ST4x4_UB(res0, res1, 0, 1, 0, 1, dst, dst_stride);
+-    dst += (4 * dst_stride);
+-    ST4x4_UB(res2, res3, 0, 1, 0, 1, dst, dst_stride);
++    ST_W2(res0, 0, 1, dst, dst_stride);
++    ST_W2(res1, 0, 1, dst + 2 * dst_stride, dst_stride);
++    ST_W2(res2, 0, 1, dst + 4 * dst_stride, dst_stride);
++    ST_W2(res3, 0, 1, dst + 6 * dst_stride, dst_stride);
+ }
+ 
+ void ff_put_vp8_bilinear4_h_msa(uint8_t *dst, ptrdiff_t dst_stride,
+@@ -1574,7 +1575,7 @@
+                 vec0, vec1, vec2, vec3);
+     SRARI_H4_UH(vec0, vec1, vec2, vec3, 7);
+     PCKEV_B2_SB(vec1, vec0, vec3, vec2, src0, src1);
+-    ST8x4_UB(src0, src1, dst, dst_stride);
++    ST_D4(src0, src1, 0, 1, 0, 1, dst, dst_stride);
+ }
+ 
+ static void common_hz_2t_8x8mult_msa(uint8_t *src, int32_t src_stride,
+@@ -1604,8 +1605,7 @@
+     src += (4 * src_stride);
+ 
+     PCKEV_B2_SB(vec1, vec0, vec3, vec2, out0, out1);
+-    ST8x4_UB(out0, out1, dst, dst_stride);
+-    dst += (4 * dst_stride);
++    ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
+ 
+     VSHF_B2_UH(src0, src0, src1, src1, mask, mask, vec0, vec1);
+     VSHF_B2_UH(src2, src2, src3, src3, mask, mask, vec2, vec3);
+@@ -1613,8 +1613,8 @@
+                 vec0, vec1, vec2, vec3);
+     SRARI_H4_UH(vec0, vec1, vec2, vec3, 7);
+     PCKEV_B2_SB(vec1, vec0, vec3, vec2, out0, out1);
+-    ST8x4_UB(out0, out1, dst, dst_stride);
+-    dst += (4 * dst_stride);
++    ST_D4(out0, out1, 0, 1, 0, 1, dst + 4 * dst_stride, dst_stride);
++    dst += (8 * dst_stride);
+ 
+     if (16 == height) {
+         LD_SB4(src, src_stride, src0, src1, src2, src3);
+@@ -1629,7 +1629,7 @@
+         src += (4 * src_stride);
+ 
+         PCKEV_B2_SB(vec1, vec0, vec3, vec2, out0, out1);
+-        ST8x4_UB(out0, out1, dst, dst_stride);
++        ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
+ 
+         VSHF_B2_UH(src0, src0, src1, src1, mask, mask, vec0, vec1);
+         VSHF_B2_UH(src2, src2, src3, src3, mask, mask, vec2, vec3);
+@@ -1637,7 +1637,7 @@
+                     vec0, vec1, vec2, vec3);
+         SRARI_H4_UH(vec0, vec1, vec2, vec3, 7);
+         PCKEV_B2_SB(vec1, vec0, vec3, vec2, out0, out1);
+-        ST8x4_UB(out0, out1, dst + 4 * dst_stride, dst_stride);
++        ST_D4(out0, out1, 0, 1, 0, 1, dst + 4 * dst_stride, dst_stride);
+     }
+ }
+ 
+@@ -1745,7 +1745,7 @@
+     SRARI_H2_UH(tmp0, tmp1, 7);
+     SAT_UH2_UH(tmp0, tmp1, 7);
+     src2110 = __msa_pckev_b((v16i8) tmp1, (v16i8) tmp0);
+-    ST4x4_UB(src2110, src2110, 0, 1, 2, 3, dst, dst_stride);
++    ST_W4(src2110, 0, 1, 2, 3, dst, dst_stride);
+ }
+ 
+ static void common_vt_2t_4x8_msa(uint8_t *src, int32_t src_stride,
+@@ -1779,8 +1779,7 @@
+     SRARI_H4_UH(tmp0, tmp1, tmp2, tmp3, 7);
+     SAT_UH4_UH(tmp0, tmp1, tmp2, tmp3, 7);
+     PCKEV_B2_SB(tmp1, tmp0, tmp3, tmp2, src2110, src4332);
+-    ST4x4_UB(src2110, src2110, 0, 1, 2, 3, dst, dst_stride);
+-    ST4x4_UB(src4332, src4332, 0, 1, 2, 3, dst + 4 * dst_stride, dst_stride);
++    ST_W8(src2110, src4332, 0, 1, 2, 3, 0, 1, 2, 3, dst, dst_stride);
+ }
+ 
+ void ff_put_vp8_bilinear4_v_msa(uint8_t *dst, ptrdiff_t dst_stride,
+@@ -1817,7 +1816,7 @@
+     SRARI_H4_UH(tmp0, tmp1, tmp2, tmp3, 7);
+     SAT_UH4_UH(tmp0, tmp1, tmp2, tmp3, 7);
+     PCKEV_B2_SB(tmp1, tmp0, tmp3, tmp2, out0, out1);
+-    ST8x4_UB(out0, out1, dst, dst_stride);
++    ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
+ }
+ 
+ static void common_vt_2t_8x8mult_msa(uint8_t *src, int32_t src_stride,
+@@ -1851,16 +1850,15 @@
+         SRARI_H4_UH(tmp0, tmp1, tmp2, tmp3, 7);
+         SAT_UH4_UH(tmp0, tmp1, tmp2, tmp3, 7);
+         PCKEV_B2_SB(tmp1, tmp0, tmp3, tmp2, out0, out1);
+-        ST8x4_UB(out0, out1, dst, dst_stride);
+-        dst += (4 * dst_stride);
++        ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
+ 
+         DOTP_UB4_UH(vec4, vec5, vec6, vec7, filt0, filt0, filt0, filt0,
+                     tmp0, tmp1, tmp2, tmp3);
+         SRARI_H4_UH(tmp0, tmp1, tmp2, tmp3, 7);
+         SAT_UH4_UH(tmp0, tmp1, tmp2, tmp3, 7);
+         PCKEV_B2_SB(tmp1, tmp0, tmp3, tmp2, out0, out1);
+-        ST8x4_UB(out0, out1, dst, dst_stride);
+-        dst += (4 * dst_stride);
++        ST_D4(out0, out1, 0, 1, 0, 1, dst + 4 * dst_stride, dst_stride);
++        dst += (8 * dst_stride);
+ 
+         src0 = src8;
+     }
+@@ -1964,7 +1962,8 @@
+     SRARI_H2_UH(tmp0, tmp1, 7);
+     SAT_UH2_UH(tmp0, tmp1, 7);
+     PCKEV_B2_UB(tmp0, tmp0, tmp1, tmp1, res0, res1);
+-    ST4x4_UB(res0, res1, 0, 1, 0, 1, dst, dst_stride);
++    ST_W2(res0, 0, 1, dst, dst_stride);
++    ST_W2(res1, 0, 1, dst + 2 * dst_stride, dst_stride);
+ }
+ 
+ static void common_hv_2ht_2vt_4x8_msa(uint8_t *src, int32_t src_stride,
+@@ -1996,8 +1995,8 @@
+     hz_out4 = HORIZ_2TAP_FILT_UH(src4, src5, mask, filt_hz, 7);
+     hz_out6 = HORIZ_2TAP_FILT_UH(src6, src7, mask, filt_hz, 7);
+     hz_out8 = HORIZ_2TAP_FILT_UH(src8, src8, mask, filt_hz, 7);
+-    SLDI_B3_UH(hz_out2, hz_out4, hz_out6, hz_out0, hz_out2, hz_out4, hz_out1,
+-               hz_out3, hz_out5, 8);
++    SLDI_B3_UH(hz_out2, hz_out0, hz_out4, hz_out2, hz_out6, hz_out4, 8, hz_out1,
++               hz_out3, hz_out5);
+     hz_out7 = (v8u16) __msa_pckod_d((v2i64) hz_out8, (v2i64) hz_out6);
+ 
+     ILVEV_B2_UB(hz_out0, hz_out1, hz_out2, hz_out3, vec0, vec1);
+@@ -2008,9 +2007,10 @@
+     SAT_UH4_UH(vec4, vec5, vec6, vec7, 7);
+     PCKEV_B4_SB(vec4, vec4, vec5, vec5, vec6, vec6, vec7, vec7,
+                 res0, res1, res2, res3);
+-    ST4x4_UB(res0, res1, 0, 1, 0, 1, dst, dst_stride);
+-    dst += (4 * dst_stride);
+-    ST4x4_UB(res2, res3, 0, 1, 0, 1, dst, dst_stride);
++    ST_W2(res0, 0, 1, dst, dst_stride);
++    ST_W2(res1, 0, 1, dst + 2 * dst_stride, dst_stride);
++    ST_W2(res2, 0, 1, dst + 4 * dst_stride, dst_stride);
++    ST_W2(res3, 0, 1, dst + 6 * dst_stride, dst_stride);
+ }
+ 
+ void ff_put_vp8_bilinear4_hv_msa(uint8_t *dst, ptrdiff_t dst_stride,
+@@ -2070,7 +2070,7 @@
+     SRARI_H4_UH(tmp0, tmp1, tmp2, tmp3, 7);
+     SAT_UH4_UH(tmp0, tmp1, tmp2, tmp3, 7);
+     PCKEV_B2_SB(tmp1, tmp0, tmp3, tmp2, out0, out1);
+-    ST8x4_UB(out0, out1, dst, dst_stride);
++    ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
+ }
+ 
+ static void common_hv_2ht_2vt_8x8mult_msa(uint8_t *src, int32_t src_stride,
+@@ -2127,8 +2127,7 @@
+         SRARI_H2_UH(tmp3, tmp4, 7);
+         SAT_UH2_UH(tmp3, tmp4, 7);
+         PCKEV_B2_SB(tmp2, tmp1, tmp4, tmp3, out0, out1);
+-        ST8x4_UB(out0, out1, dst, dst_stride);
+-        dst += (4 * dst_stride);
++        ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
+ 
+         hz_out1 = HORIZ_2TAP_FILT_UH(src1, src1, mask, filt_hz, 7);
+         vec0 = (v16u8) __msa_ilvev_b((v16i8) hz_out1, (v16i8) hz_out0);
+@@ -2149,8 +2148,8 @@
+         SRARI_H4_UH(tmp5, tmp6, tmp7, tmp8, 7);
+         SAT_UH4_UH(tmp5, tmp6, tmp7, tmp8, 7);
+         PCKEV_B2_SB(tmp6, tmp5, tmp8, tmp7, out0, out1);
+-        ST8x4_UB(out0, out1, dst, dst_stride);
+-        dst += (4 * dst_stride);
++        ST_D4(out0, out1, 0, 1, 0, 1, dst + 4 * dst_stride, dst_stride);
++        dst += (8 * dst_stride);
+     }
+ }
+ 
+diff -uNra ffmpeg-4.1.6/libavcodec/mips/vp9dsp_init_mips.c FFmpeg/libavcodec/mips/vp9dsp_init_mips.c
+--- a/libavcodec/mips/vp9dsp_init_mips.c	2020-07-03 01:22:31.000000000 +0800
++++ b/libavcodec/mips/vp9dsp_init_mips.c	2020-07-19 18:19:52.764090369 +0800
+@@ -18,6 +18,7 @@
+  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+  */
+ 
++#include "libavutil/mips/cpu.h"
+ #include "config.h"
+ #include "libavutil/common.h"
+ #include "libavcodec/vp9dsp.h"
+@@ -168,9 +169,58 @@
+ }
+ #endif  // #if HAVE_MSA
+ 
++#if HAVE_MMI
++static av_cold void vp9dsp_mc_init_mmi(VP9DSPContext *dsp)
++{
++#define init_subpel1(idx1, idx2, idxh, idxv, sz, dir, type)  \
++    dsp->mc[idx1][FILTER_8TAP_SMOOTH ][idx2][idxh][idxv] =   \
++        ff_##type##_8tap_smooth_##sz##dir##_mmi;             \
++    dsp->mc[idx1][FILTER_8TAP_REGULAR][idx2][idxh][idxv] =   \
++        ff_##type##_8tap_regular_##sz##dir##_mmi;            \
++    dsp->mc[idx1][FILTER_8TAP_SHARP  ][idx2][idxh][idxv] =   \
++        ff_##type##_8tap_sharp_##sz##dir##_mmi;
++
++#define init_subpel2(idx, idxh, idxv, dir, type)      \
++    init_subpel1(0, idx, idxh, idxv, 64, dir, type);  \
++    init_subpel1(1, idx, idxh, idxv, 32, dir, type);  \
++    init_subpel1(2, idx, idxh, idxv, 16, dir, type);  \
++    init_subpel1(3, idx, idxh, idxv,  8, dir, type);  \
++    init_subpel1(4, idx, idxh, idxv,  4, dir, type)
++
++#define init_subpel3(idx, type)         \
++    init_subpel2(idx, 1, 1, hv, type);  \
++    init_subpel2(idx, 0, 1, v, type);   \
++    init_subpel2(idx, 1, 0, h, type)
++
++    init_subpel3(0, put);
++    init_subpel3(1, avg);
++
++#undef init_subpel1
++#undef init_subpel2
++#undef init_subpel3
++}
++
++static av_cold void vp9dsp_init_mmi(VP9DSPContext *dsp, int bpp)
++{
++    if (bpp == 8) {
++        vp9dsp_mc_init_mmi(dsp);
++    }
++}
++#endif  // #if HAVE_MMI
++
+ av_cold void ff_vp9dsp_init_mips(VP9DSPContext *dsp, int bpp)
+ {
++#if HAVE_MSA || HAVE_MMI
++    int cpu_flags = av_get_cpu_flags();
++#endif
++
++#if HAVE_MMI
++    if (have_mmi(cpu_flags))
++        vp9dsp_init_mmi(dsp, bpp);
++#endif
++
+ #if HAVE_MSA
+-    vp9dsp_init_msa(dsp, bpp);
+-#endif  // #if HAVE_MSA
++    if (have_msa(cpu_flags))
++        vp9dsp_init_msa(dsp, bpp);
++#endif
+ }
+diff -uNra ffmpeg-4.1.6/libavcodec/mips/vp9dsp_mips.h FFmpeg/libavcodec/mips/vp9dsp_mips.h
+--- a/libavcodec/mips/vp9dsp_mips.h	2020-07-03 01:22:31.000000000 +0800
++++ b/libavcodec/mips/vp9dsp_mips.h	2020-07-19 18:13:57.524835792 +0800
+@@ -234,4 +234,54 @@
+ void ff_tm_32x32_msa(uint8_t *dst, ptrdiff_t stride, const uint8_t *left,
+                      const uint8_t *top);
+ 
++#define VP9_8TAP_MIPS_MMI_FUNC(SIZE, type, type_idx)                         \
++void ff_put_8tap_##type##_##SIZE##h_mmi(uint8_t *dst, ptrdiff_t dststride,   \
++                                        const uint8_t *src,                  \
++                                        ptrdiff_t srcstride,                 \
++                                        int h, int mx, int my);              \
++                                                                             \
++void ff_put_8tap_##type##_##SIZE##v_mmi(uint8_t *dst, ptrdiff_t dststride,   \
++                                        const uint8_t *src,                  \
++                                        ptrdiff_t srcstride,                 \
++                                        int h, int mx, int my);              \
++                                                                             \
++void ff_put_8tap_##type##_##SIZE##hv_mmi(uint8_t *dst, ptrdiff_t dststride,  \
++                                         const uint8_t *src,                 \
++                                         ptrdiff_t srcstride,                \
++                                         int h, int mx, int my);             \
++                                                                             \
++void ff_avg_8tap_##type##_##SIZE##h_mmi(uint8_t *dst, ptrdiff_t dststride,   \
++                                        const uint8_t *src,                  \
++                                        ptrdiff_t srcstride,                 \
++                                        int h, int mx, int my);              \
++                                                                             \
++void ff_avg_8tap_##type##_##SIZE##v_mmi(uint8_t *dst, ptrdiff_t dststride,   \
++                                        const uint8_t *src,                  \
++                                        ptrdiff_t srcstride,                 \
++                                        int h, int mx, int my);              \
++                                                                             \
++void ff_avg_8tap_##type##_##SIZE##hv_mmi(uint8_t *dst, ptrdiff_t dststride,  \
++                                         const uint8_t *src,                 \
++                                         ptrdiff_t srcstride,                \
++                                         int h, int mx, int my);
++
++VP9_8TAP_MIPS_MMI_FUNC(64, regular, FILTER_8TAP_REGULAR);
++VP9_8TAP_MIPS_MMI_FUNC(32, regular, FILTER_8TAP_REGULAR);
++VP9_8TAP_MIPS_MMI_FUNC(16, regular, FILTER_8TAP_REGULAR);
++VP9_8TAP_MIPS_MMI_FUNC(8, regular, FILTER_8TAP_REGULAR);
++VP9_8TAP_MIPS_MMI_FUNC(4, regular, FILTER_8TAP_REGULAR);
++
++VP9_8TAP_MIPS_MMI_FUNC(64, sharp, FILTER_8TAP_SHARP);
++VP9_8TAP_MIPS_MMI_FUNC(32, sharp, FILTER_8TAP_SHARP);
++VP9_8TAP_MIPS_MMI_FUNC(16, sharp, FILTER_8TAP_SHARP);
++VP9_8TAP_MIPS_MMI_FUNC(8, sharp, FILTER_8TAP_SHARP);
++VP9_8TAP_MIPS_MMI_FUNC(4, sharp, FILTER_8TAP_SHARP);
++
++VP9_8TAP_MIPS_MMI_FUNC(64, smooth, FILTER_8TAP_SMOOTH);
++VP9_8TAP_MIPS_MMI_FUNC(32, smooth, FILTER_8TAP_SMOOTH);
++VP9_8TAP_MIPS_MMI_FUNC(16, smooth, FILTER_8TAP_SMOOTH);
++VP9_8TAP_MIPS_MMI_FUNC(8, smooth, FILTER_8TAP_SMOOTH);
++VP9_8TAP_MIPS_MMI_FUNC(4, smooth, FILTER_8TAP_SMOOTH);
++#undef VP9_8TAP_MIPS_MMI_FUNC
++
+ #endif  // #ifndef AVCODEC_MIPS_VP9DSP_MIPS_H
+diff -uNra ffmpeg-4.1.6/libavcodec/mips/vp9_idct_msa.c FFmpeg/libavcodec/mips/vp9_idct_msa.c
+--- a/libavcodec/mips/vp9_idct_msa.c	2020-07-03 23:10:59.000000000 +0800
++++ b/libavcodec/mips/vp9_idct_msa.c	2020-07-19 18:13:57.520927382 +0800
+@@ -241,7 +241,7 @@
+          res0_m, res1_m, res2_m, res3_m);                         \
+     CLIP_SH4_0_255(res0_m, res1_m, res2_m, res3_m);               \
+     PCKEV_B2_SB(res1_m, res0_m, res3_m, res2_m, tmp0_m, tmp1_m);  \
+-    ST8x4_UB(tmp0_m, tmp1_m, dst_m, dst_stride);                  \
++    ST_D4(tmp0_m, tmp1_m, 0, 1, 0, 1, dst_m, dst_stride);         \
+ }
+ 
+ #define VP9_IDCT4x4(in0, in1, in2, in3, out0, out1, out2, out3)       \
+@@ -249,6 +249,7 @@
+     v8i16 c0_m, c1_m, c2_m, c3_m;                                     \
+     v8i16 step0_m, step1_m;                                           \
+     v4i32 tmp0_m, tmp1_m, tmp2_m, tmp3_m;                             \
++    v16i8 zeros = { 0 };                                              \
+                                                                       \
+     c0_m = VP9_SET_COSPI_PAIR(cospi_16_64, cospi_16_64);              \
+     c1_m = VP9_SET_COSPI_PAIR(cospi_16_64, -cospi_16_64);             \
+@@ -262,7 +263,7 @@
+     SRARI_W4_SW(tmp0_m, tmp1_m, tmp2_m, tmp3_m, VP9_DCT_CONST_BITS);  \
+                                                                       \
+     PCKEV_H2_SW(tmp1_m, tmp0_m, tmp3_m, tmp2_m, tmp0_m, tmp2_m);      \
+-    SLDI_B2_0_SW(tmp0_m, tmp2_m, tmp1_m, tmp3_m, 8);                  \
++    SLDI_B2_SW(zeros, tmp0_m, zeros, tmp2_m, 8, tmp1_m, tmp3_m);      \
+     BUTTERFLY_4((v8i16) tmp0_m, (v8i16) tmp1_m,                       \
+                 (v8i16) tmp2_m, (v8i16) tmp3_m,                       \
+                 out0, out1, out2, out3);                              \
+@@ -364,7 +365,10 @@
+     v8i16 zero = { 0 };
+ 
+     /* load vector elements of 4x4 block */
+-    LD4x4_SH(input, in0, in1, in2, in3);
++    in0 = LD_SH(input);
++    in2 = LD_SH(input + 8);
++    in1 = (v8i16) __msa_ilvl_d((v2i64) in0, (v2i64) in0);
++    in3 = (v8i16) __msa_ilvl_d((v2i64) in2, (v2i64) in2);
+     ST_SH2(zero, zero, input, 8);
+     /* rows */
+     VP9_IDCT4x4(in0, in1, in2, in3, in0, in1, in2, in3);
+@@ -383,7 +387,10 @@
+     v8i16 zero = { 0 };
+ 
+     /* load vector elements of 4x4 block */
+-    LD4x4_SH(input, in0, in1, in2, in3);
++    in0 = LD_SH(input);
++    in2 = LD_SH(input + 8);
++    in1 = (v8i16) __msa_ilvl_d((v2i64) in0, (v2i64) in0);
++    in3 = (v8i16) __msa_ilvl_d((v2i64) in2, (v2i64) in2);
+     ST_SH2(zero, zero, input, 8);
+     /* rows */
+     VP9_IADST4x4(in0, in1, in2, in3, in0, in1, in2, in3);
+@@ -402,7 +409,10 @@
+     v8i16 zero = { 0 };
+ 
+     /* load vector elements of 4x4 block */
+-    LD4x4_SH(input, in0, in1, in2, in3);
++    in0 = LD_SH(input);
++    in2 = LD_SH(input + 8);
++    in1 = (v8i16) __msa_ilvl_d((v2i64) in0, (v2i64) in0);
++    in3 = (v8i16) __msa_ilvl_d((v2i64) in2, (v2i64) in2);
+     ST_SH2(zero, zero, input, 8);
+     /* cols */
+     VP9_IADST4x4(in0, in1, in2, in3, in0, in1, in2, in3);
+@@ -421,7 +431,10 @@
+     v8i16 zero = { 0 };
+ 
+     /* load vector elements of 4x4 block */
+-    LD4x4_SH(input, in0, in1, in2, in3);
++    in0 = LD_SH(input);
++    in2 = LD_SH(input + 8);
++    in1 = (v8i16) __msa_ilvl_d((v2i64) in0, (v2i64) in0);
++    in3 = (v8i16) __msa_ilvl_d((v2i64) in2, (v2i64) in2);
+     ST_SH2(zero, zero, input, 8);
+     /* cols */
+     VP9_IDCT4x4(in0, in1, in2, in3, in0, in1, in2, in3);
+@@ -751,15 +764,15 @@
+ 
+     res0 = (v8i16) __msa_ilvr_b((v16i8) zero, (v16i8) dst0);
+     res0 += out0;
+-    res0 = CLIP_SH_0_255(res0);
++    CLIP_SH_0_255(res0);
+     res0 = (v8i16) __msa_pckev_b((v16i8) res0, (v16i8) res0);
+-    ST8x1_UB(res0, dst);
++    ST_D1(res0, 0, dst);
+ 
+     res7 = (v8i16) __msa_ilvr_b((v16i8) zero, (v16i8) dst7);
+     res7 += out7;
+-    res7 = CLIP_SH_0_255(res7);
++    CLIP_SH_0_255(res7);
+     res7 = (v8i16) __msa_pckev_b((v16i8) res7, (v16i8) res7);
+-    ST8x1_UB(res7, dst + 7 * dst_stride);
++    ST_D1(res7, 0, dst + 7 * dst_stride);
+ 
+     cnst1 = __msa_fill_h(cospi_24_64);
+     cnst0 = __msa_fill_h(cospi_8_64);
+@@ -782,8 +795,8 @@
+     ADD2(res1, out1, res6, out6, res1, res6);
+     CLIP_SH2_0_255(res1, res6);
+     PCKEV_B2_SH(res1, res1, res6, res6, res1, res6);
+-    ST8x1_UB(res1, dst + dst_stride);
+-    ST8x1_UB(res6, dst + 6 * dst_stride);
++    ST_D1(res1, 0, dst + dst_stride);
++    ST_D1(res6, 0, dst + 6 * dst_stride);
+ 
+     cnst0 = __msa_fill_h(cospi_16_64);
+     cnst1 = -cnst0;
+@@ -801,8 +814,8 @@
+     ADD2(res3, out3, res4, out4, res3, res4);
+     CLIP_SH2_0_255(res3, res4);
+     PCKEV_B2_SH(res3, res3, res4, res4, res3, res4);
+-    ST8x1_UB(res3, dst + 3 * dst_stride);
+-    ST8x1_UB(res4, dst + 4 * dst_stride);
++    ST_D1(res3, 0, dst + 3 * dst_stride);
++    ST_D1(res4, 0, dst + 4 * dst_stride);
+ 
+     out2 = VP9_DOT_SHIFT_RIGHT_PCK_H(temp2, temp3, cnst0);
+     out5 = VP9_DOT_SHIFT_RIGHT_PCK_H(temp2, temp3, cnst1);
+@@ -814,8 +827,8 @@
+     ADD2(res2, out2, res5, out5, res2, res5);
+     CLIP_SH2_0_255(res2, res5);
+     PCKEV_B2_SH(res2, res2, res5, res5, res2, res5);
+-    ST8x1_UB(res2, dst + 2 * dst_stride);
+-    ST8x1_UB(res5, dst + 5 * dst_stride);
++    ST_D1(res2, 0, dst + 2 * dst_stride);
++    ST_D1(res5, 0, dst + 5 * dst_stride);
+ }
+ 
+ static void vp9_iadst_idct_8x8_add_msa(int16_t *input, uint8_t *dst,
+@@ -1180,8 +1193,7 @@
+              res3);
+         ADD4(res4, vec, res5, vec, res6, vec, res7, vec, res4, res5, res6,
+              res7);
+-        CLIP_SH4_0_255(res0, res1, res2, res3);
+-        CLIP_SH4_0_255(res4, res5, res6, res7);
++        CLIP_SH8_0_255(res0, res1, res2, res3, res4, res5, res6, res7);
+         PCKEV_B4_UB(res4, res0, res5, res1, res6, res2, res7, res3,
+                     tmp0, tmp1, tmp2, tmp3);
+         ST_UB4(tmp0, tmp1, tmp2, tmp3, dst, dst_stride);
+@@ -1354,8 +1366,8 @@
+     ADD2(res0, out0, res1, out1, res0, res1);
+     CLIP_SH2_0_255(res0, res1);
+     PCKEV_B2_SH(res0, res0, res1, res1, res0, res1);
+-    ST8x1_UB(res0, dst);
+-    ST8x1_UB(res1, dst + 15 * dst_stride);
++    ST_D1(res0, 0, dst);
++    ST_D1(res1, 0, dst + 15 * dst_stride);
+ 
+     k0 = VP9_SET_COSPI_PAIR(cospi_12_64, cospi_20_64);
+     k1 = VP9_SET_COSPI_PAIR(-cospi_20_64, cospi_12_64);
+@@ -1371,8 +1383,8 @@
+     ADD2(res8, out8, res9, out9, res8, res9);
+     CLIP_SH2_0_255(res8, res9);
+     PCKEV_B2_SH(res8, res8, res9, res9, res8, res9);
+-    ST8x1_UB(res8, dst + dst_stride);
+-    ST8x1_UB(res9, dst + 14 * dst_stride);
++    ST_D1(res8, 0, dst + dst_stride);
++    ST_D1(res9, 0, dst + 14 * dst_stride);
+ 
+     k0 = VP9_SET_COSPI_PAIR(cospi_8_64, cospi_24_64);
+     k1 = VP9_SET_COSPI_PAIR(cospi_24_64, -cospi_8_64);
+@@ -1386,8 +1398,8 @@
+     ADD2(res4, out4, res5, out5, res4, res5);
+     CLIP_SH2_0_255(res4, res5);
+     PCKEV_B2_SH(res4, res4, res5, res5, res4, res5);
+-    ST8x1_UB(res4, dst + 3 * dst_stride);
+-    ST8x1_UB(res5, dst + 12 * dst_stride);
++    ST_D1(res4, 0, dst + 3 * dst_stride);
++    ST_D1(res5, 0, dst + 12 * dst_stride);
+ 
+     VP9_MADD_BF(h1, h3, h5, h7, k0, k1, k2, k0, out12, out14, out13, out15);
+     out13 = -out13;
+@@ -1398,8 +1410,8 @@
+     ADD2(res12, out12, res13, out13, res12, res13);
+     CLIP_SH2_0_255(res12, res13);
+     PCKEV_B2_SH(res12, res12, res13, res13, res12, res13);
+-    ST8x1_UB(res12, dst + 2 * dst_stride);
+-    ST8x1_UB(res13, dst + 13 * dst_stride);
++    ST_D1(res12, 0, dst + 2 * dst_stride);
++    ST_D1(res13, 0, dst + 13 * dst_stride);
+ 
+     k0 = VP9_SET_COSPI_PAIR(cospi_16_64, cospi_16_64);
+     k3 = VP9_SET_COSPI_PAIR(-cospi_16_64, cospi_16_64);
+@@ -1411,8 +1423,8 @@
+     ADD2(res6, out6, res7, out7, res6, res7);
+     CLIP_SH2_0_255(res6, res7);
+     PCKEV_B2_SH(res6, res6, res7, res7, res6, res7);
+-    ST8x1_UB(res6, dst + 4 * dst_stride);
+-    ST8x1_UB(res7, dst + 11 * dst_stride);
++    ST_D1(res6, 0, dst + 4 * dst_stride);
++    ST_D1(res7, 0, dst + 11 * dst_stride);
+ 
+     VP9_MADD_SHORT(out10, out11, k0, k3, out10, out11);
+     SRARI_H2_SH(out10, out11, 6);
+@@ -1422,8 +1434,8 @@
+     ADD2(res10, out10, res11, out11, res10, res11);
+     CLIP_SH2_0_255(res10, res11);
+     PCKEV_B2_SH(res10, res10, res11, res11, res10, res11);
+-    ST8x1_UB(res10, dst + 6 * dst_stride);
+-    ST8x1_UB(res11, dst + 9 * dst_stride);
++    ST_D1(res10, 0, dst + 6 * dst_stride);
++    ST_D1(res11, 0, dst + 9 * dst_stride);
+ 
+     k1 = VP9_SET_COSPI_PAIR(-cospi_16_64, -cospi_16_64);
+     k2 = VP9_SET_COSPI_PAIR(cospi_16_64, -cospi_16_64);
+@@ -1435,8 +1447,8 @@
+     ADD2(res2, out2, res3, out3, res2, res3);
+     CLIP_SH2_0_255(res2, res3);
+     PCKEV_B2_SH(res2, res2, res3, res3, res2, res3);
+-    ST8x1_UB(res2, dst + 7 * dst_stride);
+-    ST8x1_UB(res3, dst + 8 * dst_stride);
++    ST_D1(res2, 0, dst + 7 * dst_stride);
++    ST_D1(res3, 0, dst + 8 * dst_stride);
+ 
+     VP9_MADD_SHORT(out14, out15, k1, k2, out14, out15);
+     SRARI_H2_SH(out14, out15, 6);
+@@ -1446,8 +1458,8 @@
+     ADD2(res14, out14, res15, out15, res14, res15);
+     CLIP_SH2_0_255(res14, res15);
+     PCKEV_B2_SH(res14, res14, res15, res15, res14, res15);
+-    ST8x1_UB(res14, dst + 5 * dst_stride);
+-    ST8x1_UB(res15, dst + 10 * dst_stride);
++    ST_D1(res14, 0, dst + 5 * dst_stride);
++    ST_D1(res15, 0, dst + 10 * dst_stride);
+ }
+ 
+ static void vp9_iadst16x16_colcol_addblk_msa(int16_t *input, uint8_t *dst,
+@@ -1969,8 +1981,7 @@
+              res3);
+         ADD4(res4, vec, res5, vec, res6, vec, res7, vec, res4, res5, res6,
+              res7);
+-        CLIP_SH4_0_255(res0, res1, res2, res3);
+-        CLIP_SH4_0_255(res4, res5, res6, res7);
++        CLIP_SH8_0_255(res0, res1, res2, res3, res4, res5, res6, res7);
+         PCKEV_B4_UB(res4, res0, res5, res1, res6, res2, res7, res3,
+                     tmp0, tmp1, tmp2, tmp3);
+ 
+diff -uNra ffmpeg-4.1.6/libavcodec/mips/vp9_intra_msa.c FFmpeg/libavcodec/mips/vp9_intra_msa.c
+--- a/libavcodec/mips/vp9_intra_msa.c	2020-07-03 01:22:31.000000000 +0800
++++ b/libavcodec/mips/vp9_intra_msa.c	2020-07-19 18:13:57.520927382 +0800
+@@ -378,7 +378,8 @@
+     IPRED_SUBS_UH2_UH(src_top_left, src_top_left, vec2, vec3);
+     SAT_UH4_UH(vec0, vec1, vec2, vec3, 7);
+     PCKEV_B2_SB(vec1, vec0, vec3, vec2, tmp0, tmp1);
+-    ST4x4_UB(tmp0, tmp1, 0, 2, 0, 2, dst, dst_stride);
++    ST_W2(tmp0, 0, 2, dst, dst_stride);
++    ST_W2(tmp1, 0, 2, dst + 2 * dst_stride, dst_stride);
+ }
+ 
+ void ff_tm_8x8_msa(uint8_t *dst, ptrdiff_t dst_stride,
+@@ -409,7 +410,7 @@
+         IPRED_SUBS_UH2_UH(src_top_left, src_top_left, vec2, vec3);
+         SAT_UH4_UH(vec0, vec1, vec2, vec3, 7);
+         PCKEV_B2_SB(vec1, vec0, vec3, vec2, tmp0, tmp1);
+-        ST8x4_UB(tmp0, tmp1, dst, dst_stride);
++        ST_D4(tmp0, tmp1, 0, 1, 0, 1, dst, dst_stride);
+         dst += (4 * dst_stride);
+     }
+ }
+diff -uNra ffmpeg-4.1.6/libavcodec/mips/vp9_lpf_msa.c FFmpeg/libavcodec/mips/vp9_lpf_msa.c
+--- a/libavcodec/mips/vp9_lpf_msa.c	2020-07-03 23:10:59.000000000 +0800
++++ b/libavcodec/mips/vp9_lpf_msa.c	2020-07-19 18:13:57.520927382 +0800
+@@ -1219,9 +1219,7 @@
+     ILVRL_H2_SH(vec1, vec0, vec2, vec3);
+ 
+     src -= 2;
+-    ST4x4_UB(vec2, vec2, 0, 1, 2, 3, src, pitch);
+-    src += 4 * pitch;
+-    ST4x4_UB(vec3, vec3, 0, 1, 2, 3, src, pitch);
++    ST_W8(vec2, vec3, 0, 1, 2, 3, 0, 1, 2, 3, src, pitch);
+ }
+ 
+ void ff_loop_filter_h_44_16_msa(uint8_t *src, ptrdiff_t pitch,
+@@ -1266,9 +1264,8 @@
+ 
+     src -= 2;
+ 
+-    ST4x8_UB(tmp2, tmp3, src, pitch);
+-    src += (8 * pitch);
+-    ST4x8_UB(tmp4, tmp5, src, pitch);
++    ST_W8(tmp2, tmp3, 0, 1, 2, 3, 0, 1, 2, 3, src, pitch);
++    ST_W8(tmp4, tmp5, 0, 1, 2, 3, 0, 1, 2, 3, src + 8 * pitch, pitch);
+ }
+ 
+ void ff_loop_filter_h_8_8_msa(uint8_t *src, ptrdiff_t pitch,
+@@ -1313,9 +1310,7 @@
+         ILVRL_H2_SH(vec1, vec0, vec2, vec3);
+ 
+         src -= 2;
+-        ST4x4_UB(vec2, vec2, 0, 1, 2, 3, src, pitch);
+-        src += 4 * pitch;
+-        ST4x4_UB(vec3, vec3, 0, 1, 2, 3, src, pitch);
++        ST_W8(vec2, vec3, 0, 1, 2, 3, 0, 1, 2, 3, src, pitch);
+     } else {
+         ILVR_B8_UH(zero, p3, zero, p2, zero, p1, zero, p0, zero, q0, zero, q1,
+                    zero, q2, zero, q3, p3_r, p2_r, p1_r, p0_r, q0_r, q1_r, q2_r,
+@@ -1343,11 +1338,11 @@
+         vec4 = (v8i16) __msa_ilvr_b((v16i8) q2, (v16i8) q1);
+ 
+         src -= 3;
+-        ST4x4_UB(vec2, vec2, 0, 1, 2, 3, src, pitch);
+-        ST2x4_UB(vec4, 0, src + 4, pitch);
++        ST_W4(vec2, 0, 1, 2, 3, src, pitch);
++        ST_H4(vec4, 0, 1, 2, 3, src + 4, pitch);
+         src += (4 * pitch);
+-        ST4x4_UB(vec3, vec3, 0, 1, 2, 3, src, pitch);
+-        ST2x4_UB(vec4, 4, src + 4, pitch);
++        ST_W4(vec3, 0, 1, 2, 3, src, pitch);
++        ST_H4(vec4, 4, 5, 6, 7, src + 4, pitch);
+     }
+ }
+ 
+@@ -1410,9 +1405,8 @@
+         ILVRL_H2_SH(vec1, vec0, vec4, vec5);
+ 
+         src -= 2;
+-        ST4x8_UB(vec2, vec3, src, pitch);
+-        src += 8 * pitch;
+-        ST4x8_UB(vec4, vec5, src, pitch);
++        ST_W8(vec2, vec3, 0, 1, 2, 3, 0, 1, 2, 3, src, pitch);
++        ST_W8(vec4, vec5, 0, 1, 2, 3, 0, 1, 2, 3, src + 8 * pitch, pitch);
+     } else {
+         ILVR_B8_UH(zero, p3, zero, p2, zero, p1, zero, p0, zero, q0, zero, q1,
+                    zero, q2, zero, q3, p3_r, p2_r, p1_r, p0_r, q0_r, q1_r, q2_r,
+@@ -1451,17 +1445,17 @@
+         ILVRL_B2_SH(q2, q1, vec2, vec5);
+ 
+         src -= 3;
+-        ST4x4_UB(vec3, vec3, 0, 1, 2, 3, src, pitch);
+-        ST2x4_UB(vec2, 0, src + 4, pitch);
++        ST_W4(vec3, 0, 1, 2, 3, src, pitch);
++        ST_H4(vec2, 0, 1, 2, 3, src + 4, pitch);
+         src += (4 * pitch);
+-        ST4x4_UB(vec4, vec4, 0, 1, 2, 3, src, pitch);
+-        ST2x4_UB(vec2, 4, src + 4, pitch);
++        ST_W4(vec4, 0, 1, 2, 3, src, pitch);
++        ST_H4(vec2, 4, 5, 6, 7, src + 4, pitch);
+         src += (4 * pitch);
+-        ST4x4_UB(vec6, vec6, 0, 1, 2, 3, src, pitch);
+-        ST2x4_UB(vec5, 0, src + 4, pitch);
++        ST_W4(vec6, 0, 1, 2, 3, src, pitch);
++        ST_H4(vec5, 0, 1, 2, 3, src + 4, pitch);
+         src += (4 * pitch);
+-        ST4x4_UB(vec7, vec7, 0, 1, 2, 3, src, pitch);
+-        ST2x4_UB(vec5, 4, src + 4, pitch);
++        ST_W4(vec7, 0, 1, 2, 3, src, pitch);
++        ST_H4(vec5, 4, 5, 6, 7, src + 4, pitch);
+     }
+ }
+ 
+@@ -1523,9 +1517,8 @@
+         ILVRL_H2_SH(vec1, vec0, vec4, vec5);
+ 
+         src -= 2;
+-        ST4x8_UB(vec2, vec3, src, pitch);
+-        src += 8 * pitch;
+-        ST4x8_UB(vec4, vec5, src, pitch);
++        ST_W8(vec2, vec3, 0, 1, 2, 3, 0, 1, 2, 3, src, pitch);
++        ST_W8(vec4, vec5, 0, 1, 2, 3, 0, 1, 2, 3, src + 8 * pitch, pitch);
+     } else {
+         ILVR_B8_UH(zero, p3, zero, p2, zero, p1, zero, p0, zero, q0, zero, q1,
+                    zero, q2, zero, q3, p3_r, p2_r, p1_r, p0_r, q0_r, q1_r, q2_r,
+@@ -1555,17 +1548,17 @@
+         ILVRL_B2_SH(q2, q1, vec2, vec5);
+ 
+         src -= 3;
+-        ST4x4_UB(vec3, vec3, 0, 1, 2, 3, src, pitch);
+-        ST2x4_UB(vec2, 0, src + 4, pitch);
++        ST_W4(vec3, 0, 1, 2, 3, src, pitch);
++        ST_H4(vec2, 0, 1, 2, 3, src + 4, pitch);
+         src += (4 * pitch);
+-        ST4x4_UB(vec4, vec4, 0, 1, 2, 3, src, pitch);
+-        ST2x4_UB(vec2, 4, src + 4, pitch);
++        ST_W4(vec4, 0, 1, 2, 3, src, pitch);
++        ST_H4(vec2, 4, 5, 6, 7, src + 4, pitch);
+         src += (4 * pitch);
+-        ST4x4_UB(vec6, vec6, 0, 1, 2, 3, src, pitch);
+-        ST2x4_UB(vec5, 0, src + 4, pitch);
++        ST_W4(vec6, 0, 1, 2, 3, src, pitch);
++        ST_H4(vec5, 0, 1, 2, 3, src + 4, pitch);
+         src += (4 * pitch);
+-        ST4x4_UB(vec7, vec7, 0, 1, 2, 3, src, pitch);
+-        ST2x4_UB(vec5, 4, src + 4, pitch);
++        ST_W4(vec7, 0, 1, 2, 3, src, pitch);
++        ST_H4(vec5, 4, 5, 6, 7, src + 4, pitch);
+     }
+ }
+ 
+@@ -1627,9 +1620,8 @@
+         ILVRL_H2_SH(vec1, vec0, vec4, vec5);
+ 
+         src -= 2;
+-        ST4x8_UB(vec2, vec3, src, pitch);
+-        src += 8 * pitch;
+-        ST4x8_UB(vec4, vec5, src, pitch);
++        ST_W8(vec2, vec3, 0, 1, 2, 3, 0, 1, 2, 3, src, pitch);
++        ST_W8(vec4, vec5, 0, 1, 2, 3, 0, 1, 2, 3, src + 8 * pitch, pitch);
+     } else {
+         ILVL_B4_UH(zero, p3, zero, p2, zero, p1, zero, p0, p3_l, p2_l, p1_l,
+                    p0_l);
+@@ -1661,17 +1653,17 @@
+         ILVRL_B2_SH(q2, q1, vec2, vec5);
+ 
+         src -= 3;
+-        ST4x4_UB(vec3, vec3, 0, 1, 2, 3, src, pitch);
+-        ST2x4_UB(vec2, 0, src + 4, pitch);
++        ST_W4(vec3, 0, 1, 2, 3, src, pitch);
++        ST_H4(vec2, 0, 1, 2, 3, src + 4, pitch);
+         src += (4 * pitch);
+-        ST4x4_UB(vec4, vec4, 0, 1, 2, 3, src, pitch);
+-        ST2x4_UB(vec2, 4, src + 4, pitch);
++        ST_W4(vec4, 0, 1, 2, 3, src, pitch);
++        ST_H4(vec2, 4, 5, 6, 7, src + 4, pitch);
+         src += (4 * pitch);
+-        ST4x4_UB(vec6, vec6, 0, 1, 2, 3, src, pitch);
+-        ST2x4_UB(vec5, 0, src + 4, pitch);
++        ST_W4(vec6, 0, 1, 2, 3, src, pitch);
++        ST_H4(vec5, 0, 1, 2, 3, src + 4, pitch);
+         src += (4 * pitch);
+-        ST4x4_UB(vec7, vec7, 0, 1, 2, 3, src, pitch);
+-        ST2x4_UB(vec5, 4, src + 4, pitch);
++        ST_W4(vec7, 0, 1, 2, 3, src, pitch);
++        ST_H4(vec5, 4, 5, 6, 7, src + 4, pitch);
+     }
+ }
+ 
+@@ -1681,6 +1673,7 @@
+     v16u8 p7_org, p6_org, p5_org, p4_org, p3_org, p2_org, p1_org, p0_org;
+     v16i8 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
+     v16u8 p7, p6, p5, p4, p3, p2, p1, p0, q0, q1, q2, q3, q4, q5, q6, q7;
++    v16i8 zeros = { 0 };
+ 
+     LD_UB8(input, in_pitch,
+            p7_org, p6_org, p5_org, p4_org, p3_org, p2_org, p1_org, p0_org);
+@@ -1694,7 +1687,7 @@
+     ILVL_B2_SB(tmp1, tmp0, tmp3, tmp2, tmp5, tmp7);
+     ILVR_W2_UB(tmp6, tmp4, tmp7, tmp5, q0, q4);
+     ILVL_W2_UB(tmp6, tmp4, tmp7, tmp5, q2, q6);
+-    SLDI_B4_0_UB(q0, q2, q4, q6, q1, q3, q5, q7, 8);
++    SLDI_B4_UB(zeros, q0, zeros, q2, zeros, q4, zeros, q6, 8, q1, q3, q5, q7);
+ 
+     ST_UB8(p7, p6, p5, p4, p3, p2, p1, p0, output, out_pitch);
+     output += (8 * out_pitch);
+@@ -1811,7 +1804,7 @@
+     if (__msa_test_bz_v(flat)) {
+         ILVR_B2_SH(p0_out, p1_out, q1_out, q0_out, vec0, vec1);
+         ILVRL_H2_SH(vec1, vec0, vec2, vec3);
+-        ST4x8_UB(vec2, vec3, (src_org - 2), pitch_org);
++        ST_W8(vec2, vec3, 0, 1, 2, 3, 0, 1, 2, 3, (src_org - 2), pitch_org);
+         return 1;
+     } else {
+         ILVR_B8_UH(zero, p3, zero, p2, zero, p1, zero, p0, zero, q0, zero, q1,
+@@ -1878,11 +1871,11 @@
+         vec2 = (v8i16) __msa_ilvr_b((v16i8) q2, (v16i8) q1);
+ 
+         src_org -= 3;
+-        ST4x4_UB(vec3, vec3, 0, 1, 2, 3, src_org, pitch);
+-        ST2x4_UB(vec2, 0, (src_org + 4), pitch);
++        ST_W4(vec3, 0, 1, 2, 3, src_org, pitch);
++        ST_H4(vec2, 0, 1, 2, 3, (src_org + 4), pitch);
+         src_org += (4 * pitch);
+-        ST4x4_UB(vec4, vec4, 0, 1, 2, 3, src_org, pitch);
+-        ST2x4_UB(vec2, 4, (src_org + 4), pitch);
++        ST_W4(vec4, 0, 1, 2, 3, src_org, pitch);
++        ST_H4(vec2, 4, 5, 6, 7, (src_org + 4), pitch);
+ 
+         return 1;
+     } else {
+@@ -1908,7 +1901,7 @@
+         r_out = __msa_srari_h((v8i16) tmp1_r, 4);
+         r_out = (v8i16) __msa_pckev_b((v16i8) r_out, (v16i8) r_out);
+         p6 = __msa_bmnz_v(p6, (v16u8) r_out, flat2);
+-        ST8x1_UB(p6, src);
++        ST_D1(p6, 0, src);
+         src += 16;
+ 
+         /* p5 */
+@@ -1920,7 +1913,7 @@
+         r_out = __msa_srari_h((v8i16) tmp1_r, 4);
+         r_out = (v8i16) __msa_pckev_b((v16i8) r_out, (v16i8) r_out);
+         p5 = __msa_bmnz_v(p5, (v16u8) r_out, flat2);
+-        ST8x1_UB(p5, src);
++        ST_D1(p5, 0, src);
+         src += 16;
+ 
+         /* p4 */
+@@ -1932,7 +1925,7 @@
+         r_out = __msa_srari_h((v8i16) tmp1_r, 4);
+         r_out = (v8i16) __msa_pckev_b((v16i8) r_out, (v16i8) r_out);
+         p4 = __msa_bmnz_v(p4, (v16u8) r_out, flat2);
+-        ST8x1_UB(p4, src);
++        ST_D1(p4, 0, src);
+         src += 16;
+ 
+         /* p3 */
+@@ -1944,7 +1937,7 @@
+         r_out = __msa_srari_h((v8i16) tmp1_r, 4);
+         r_out = (v8i16) __msa_pckev_b((v16i8) r_out, (v16i8) r_out);
+         p3 = __msa_bmnz_v(p3, (v16u8) r_out, flat2);
+-        ST8x1_UB(p3, src);
++        ST_D1(p3, 0, src);
+         src += 16;
+ 
+         /* p2 */
+@@ -1957,7 +1950,7 @@
+         r_out = __msa_srari_h((v8i16) tmp1_r, 4);
+         r_out = (v8i16) __msa_pckev_b((v16i8) r_out, (v16i8) r_out);
+         filter8 = __msa_bmnz_v(filter8, (v16u8) r_out, flat2);
+-        ST8x1_UB(filter8, src);
++        ST_D1(filter8, 0, src);
+         src += 16;
+ 
+         /* p1 */
+@@ -1970,7 +1963,7 @@
+         r_out = __msa_srari_h((v8i16) tmp1_r, 4);
+         r_out = (v8i16) __msa_pckev_b((v16i8) r_out, (v16i8) r_out);
+         filter8 = __msa_bmnz_v(filter8, (v16u8) r_out, flat2);
+-        ST8x1_UB(filter8, src);
++        ST_D1(filter8, 0, src);
+         src += 16;
+ 
+         /* p0 */
+@@ -1983,7 +1976,7 @@
+         r_out = __msa_srari_h((v8i16) tmp1_r, 4);
+         r_out = (v8i16) __msa_pckev_b((v16i8) r_out, (v16i8) r_out);
+         filter8 = __msa_bmnz_v(filter8, (v16u8) r_out, flat2);
+-        ST8x1_UB(filter8, src);
++        ST_D1(filter8, 0, src);
+         src += 16;
+ 
+         /* q0 */
+@@ -1996,7 +1989,7 @@
+         r_out = __msa_srari_h((v8i16) tmp1_r, 4);
+         r_out = (v8i16) __msa_pckev_b((v16i8) r_out, (v16i8) r_out);
+         filter8 = __msa_bmnz_v(filter8, (v16u8) r_out, flat2);
+-        ST8x1_UB(filter8, src);
++        ST_D1(filter8, 0, src);
+         src += 16;
+ 
+         /* q1 */
+@@ -2008,7 +2001,7 @@
+         r_out = __msa_srari_h((v8i16) tmp1_r, 4);
+         r_out = (v8i16) __msa_pckev_b((v16i8) r_out, (v16i8) r_out);
+         filter8 = __msa_bmnz_v(filter8, (v16u8) r_out, flat2);
+-        ST8x1_UB(filter8, src);
++        ST_D1(filter8, 0, src);
+         src += 16;
+ 
+         /* q2 */
+@@ -2020,7 +2013,7 @@
+         r_out = __msa_srari_h((v8i16) tmp1_r, 4);
+         r_out = (v8i16) __msa_pckev_b((v16i8) r_out, (v16i8) r_out);
+         filter8 = __msa_bmnz_v(filter8, (v16u8) r_out, flat2);
+-        ST8x1_UB(filter8, src);
++        ST_D1(filter8, 0, src);
+         src += 16;
+ 
+         /* q3 */
+@@ -2031,7 +2024,7 @@
+         r_out = __msa_srari_h((v8i16) tmp1_r, 4);
+         r_out = (v8i16) __msa_pckev_b((v16i8) r_out, (v16i8) r_out);
+         q3 = __msa_bmnz_v(q3, (v16u8) r_out, flat2);
+-        ST8x1_UB(q3, src);
++        ST_D1(q3, 0, src);
+         src += 16;
+ 
+         /* q4 */
+@@ -2042,7 +2035,7 @@
+         r_out = __msa_srari_h((v8i16) tmp1_r, 4);
+         r_out = (v8i16) __msa_pckev_b((v16i8) r_out, (v16i8) r_out);
+         q4 = __msa_bmnz_v(q4, (v16u8) r_out, flat2);
+-        ST8x1_UB(q4, src);
++        ST_D1(q4, 0, src);
+         src += 16;
+ 
+         /* q5 */
+@@ -2053,7 +2046,7 @@
+         r_out = __msa_srari_h((v8i16) tmp1_r, 4);
+         r_out = (v8i16) __msa_pckev_b((v16i8) r_out, (v16i8) r_out);
+         q5 = __msa_bmnz_v(q5, (v16u8) r_out, flat2);
+-        ST8x1_UB(q5, src);
++        ST_D1(q5, 0, src);
+         src += 16;
+ 
+         /* q6 */
+@@ -2064,7 +2057,7 @@
+         r_out = __msa_srari_h((v8i16) tmp1_r, 4);
+         r_out = (v8i16) __msa_pckev_b((v16i8) r_out, (v16i8) r_out);
+         q6 = __msa_bmnz_v(q6, (v16u8) r_out, flat2);
+-        ST8x1_UB(q6, src);
++        ST_D1(q6, 0, src);
+ 
+         return 0;
+     }
+@@ -2137,9 +2130,8 @@
+         ILVRL_H2_SH(vec1, vec0, vec4, vec5);
+ 
+         src_org -= 2;
+-        ST4x8_UB(vec2, vec3, src_org, pitch);
+-        src_org += 8 * pitch;
+-        ST4x8_UB(vec4, vec5, src_org, pitch);
++        ST_W8(vec2, vec3, 0, 1, 2, 3, 0, 1, 2, 3, src_org, pitch);
++        ST_W8(vec4, vec5, 0, 1, 2, 3, 0, 1, 2, 3, src_org + 8 * pitch, pitch);
+ 
+         return 1;
+     } else {
+@@ -2218,17 +2210,17 @@
+         ILVRL_B2_SH(q2, q1, vec2, vec5);
+ 
+         src_org -= 3;
+-        ST4x4_UB(vec3, vec3, 0, 1, 2, 3, src_org, pitch);
+-        ST2x4_UB(vec2, 0, (src_org + 4), pitch);
++        ST_W4(vec3, 0, 1, 2, 3, src_org, pitch);
++        ST_H4(vec2, 0, 1, 2, 3, (src_org + 4), pitch);
+         src_org += (4 * pitch);
+-        ST4x4_UB(vec4, vec4, 0, 1, 2, 3, src_org, pitch);
+-        ST2x4_UB(vec2, 4, (src_org + 4), pitch);
++        ST_W4(vec4, 0, 1, 2, 3, src_org, pitch);
++        ST_H4(vec2, 4, 5, 6, 7, (src_org + 4), pitch);
+         src_org += (4 * pitch);
+-        ST4x4_UB(vec6, vec6, 0, 1, 2, 3, src_org, pitch);
+-        ST2x4_UB(vec5, 0, (src_org + 4), pitch);
++        ST_W4(vec6, 0, 1, 2, 3, src_org, pitch);
++        ST_H4(vec5, 0, 1, 2, 3, (src_org + 4), pitch);
+         src_org += (4 * pitch);
+-        ST4x4_UB(vec7, vec7, 0, 1, 2, 3, src_org, pitch);
+-        ST2x4_UB(vec5, 4, (src_org + 4), pitch);
++        ST_W4(vec7, 0, 1, 2, 3, src_org, pitch);
++        ST_H4(vec5, 4, 5, 6, 7, (src_org + 4), pitch);
+ 
+         return 1;
+     } else {
+diff -uNra ffmpeg-4.1.6/libavcodec/mips/vp9_mc_mmi.c FFmpeg/libavcodec/mips/vp9_mc_mmi.c
+--- a/libavcodec/mips/vp9_mc_mmi.c	1970-01-01 08:00:00.000000000 +0800
++++ b/libavcodec/mips/vp9_mc_mmi.c	2020-07-19 18:13:57.524835792 +0800
+@@ -0,0 +1,628 @@
++/*
++ * Copyright (c) 2019 gxw <guxiwei-hf@loongson.cn>
++ *
++ * This file is part of FFmpeg.
++ *
++ * FFmpeg is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * FFmpeg is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with FFmpeg; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
++ */
++
++#include "libavcodec/vp9dsp.h"
++#include "libavutil/mips/mmiutils.h"
++#include "vp9dsp_mips.h"
++
++#define GET_DATA_H_MMI                                       \
++    "pmaddhw    %[ftmp4],    %[ftmp4],   %[filter1]    \n\t" \
++    "pmaddhw    %[ftmp5],    %[ftmp5],   %[filter2]    \n\t" \
++    "paddw      %[ftmp4],    %[ftmp4],   %[ftmp5]      \n\t" \
++    "punpckhwd  %[ftmp5],    %[ftmp4],   %[ftmp0]      \n\t" \
++    "paddw      %[ftmp4],    %[ftmp4],   %[ftmp5]      \n\t" \
++    "pmaddhw    %[ftmp6],    %[ftmp6],   %[filter1]    \n\t" \
++    "pmaddhw    %[ftmp7],    %[ftmp7],   %[filter2]    \n\t" \
++    "paddw      %[ftmp6],    %[ftmp6],   %[ftmp7]      \n\t" \
++    "punpckhwd  %[ftmp7],    %[ftmp6],   %[ftmp0]      \n\t" \
++    "paddw      %[ftmp6],    %[ftmp6],   %[ftmp7]      \n\t" \
++    "punpcklwd  %[srcl],     %[ftmp4],   %[ftmp6]      \n\t" \
++    "pmaddhw    %[ftmp8],    %[ftmp8],   %[filter1]    \n\t" \
++    "pmaddhw    %[ftmp9],    %[ftmp9],   %[filter2]    \n\t" \
++    "paddw      %[ftmp8],    %[ftmp8],   %[ftmp9]      \n\t" \
++    "punpckhwd  %[ftmp9],    %[ftmp8],   %[ftmp0]      \n\t" \
++    "paddw      %[ftmp8],    %[ftmp8],   %[ftmp9]      \n\t" \
++    "pmaddhw    %[ftmp10],   %[ftmp10],  %[filter1]    \n\t" \
++    "pmaddhw    %[ftmp11],   %[ftmp11],  %[filter2]    \n\t" \
++    "paddw      %[ftmp10],   %[ftmp10],  %[ftmp11]     \n\t" \
++    "punpckhwd  %[ftmp11],   %[ftmp10],  %[ftmp0]      \n\t" \
++    "paddw      %[ftmp10],   %[ftmp10],  %[ftmp11]     \n\t" \
++    "punpcklwd  %[srch],     %[ftmp8],   %[ftmp10]     \n\t"
++
++#define GET_DATA_V_MMI                                       \
++    "punpcklhw  %[srcl],     %[ftmp4],   %[ftmp5]      \n\t" \
++    "pmaddhw    %[srcl],     %[srcl],    %[filter10]   \n\t" \
++    "punpcklhw  %[ftmp12],   %[ftmp6],   %[ftmp7]      \n\t" \
++    "pmaddhw    %[ftmp12],   %[ftmp12],  %[filter32]   \n\t" \
++    "paddw      %[srcl],     %[srcl],    %[ftmp12]     \n\t" \
++    "punpcklhw  %[ftmp12],   %[ftmp8],   %[ftmp9]      \n\t" \
++    "pmaddhw    %[ftmp12],   %[ftmp12],  %[filter54]   \n\t" \
++    "paddw      %[srcl],     %[srcl],    %[ftmp12]     \n\t" \
++    "punpcklhw  %[ftmp12],   %[ftmp10],  %[ftmp11]     \n\t" \
++    "pmaddhw    %[ftmp12],   %[ftmp12],  %[filter76]   \n\t" \
++    "paddw      %[srcl],     %[srcl],    %[ftmp12]     \n\t" \
++    "punpckhhw  %[srch],     %[ftmp4],   %[ftmp5]      \n\t" \
++    "pmaddhw    %[srch],     %[srch],    %[filter10]   \n\t" \
++    "punpckhhw  %[ftmp12],   %[ftmp6],   %[ftmp7]      \n\t" \
++    "pmaddhw    %[ftmp12],   %[ftmp12],  %[filter32]   \n\t" \
++    "paddw      %[srch],     %[srch],    %[ftmp12]     \n\t" \
++    "punpckhhw  %[ftmp12],   %[ftmp8],   %[ftmp9]      \n\t" \
++    "pmaddhw    %[ftmp12],   %[ftmp12],  %[filter54]   \n\t" \
++    "paddw      %[srch],     %[srch],    %[ftmp12]     \n\t" \
++    "punpckhhw  %[ftmp12],   %[ftmp10],  %[ftmp11]     \n\t" \
++    "pmaddhw    %[ftmp12],   %[ftmp12],  %[filter76]   \n\t" \
++    "paddw      %[srch],     %[srch],    %[ftmp12]     \n\t"
++
++static void convolve_horiz_mmi(const uint8_t *src, int32_t src_stride,
++                               uint8_t *dst, int32_t dst_stride,
++                               const uint16_t *filter_x, int32_t w,
++                               int32_t h)
++{
++    double ftmp[15];
++    uint32_t tmp[2];
++    src -= 3;
++    src_stride -= w;
++    dst_stride -= w;
++    __asm__ volatile (
++        "move       %[tmp1],    %[width]                   \n\t"
++        "xor        %[ftmp0],   %[ftmp0],    %[ftmp0]      \n\t"
++        "gsldlc1    %[filter1], 0x03(%[filter])            \n\t"
++        "gsldrc1    %[filter1], 0x00(%[filter])            \n\t"
++        "gsldlc1    %[filter2], 0x0b(%[filter])            \n\t"
++        "gsldrc1    %[filter2], 0x08(%[filter])            \n\t"
++        "li         %[tmp0],    0x07                       \n\t"
++        "dmtc1      %[tmp0],    %[ftmp13]                  \n\t"
++        "punpcklwd  %[ftmp13],  %[ftmp13],   %[ftmp13]     \n\t"
++        "1:                                                \n\t"
++        /* Get 8 data per row */
++        "gsldlc1    %[ftmp5],   0x07(%[src])               \n\t"
++        "gsldrc1    %[ftmp5],   0x00(%[src])               \n\t"
++        "gsldlc1    %[ftmp7],   0x08(%[src])               \n\t"
++        "gsldrc1    %[ftmp7],   0x01(%[src])               \n\t"
++        "gsldlc1    %[ftmp9],   0x09(%[src])               \n\t"
++        "gsldrc1    %[ftmp9],   0x02(%[src])               \n\t"
++        "gsldlc1    %[ftmp11],  0x0A(%[src])               \n\t"
++        "gsldrc1    %[ftmp11],  0x03(%[src])               \n\t"
++        "punpcklbh  %[ftmp4],   %[ftmp5],    %[ftmp0]      \n\t"
++        "punpckhbh  %[ftmp5],   %[ftmp5],    %[ftmp0]      \n\t"
++        "punpcklbh  %[ftmp6],   %[ftmp7],    %[ftmp0]      \n\t"
++        "punpckhbh  %[ftmp7],   %[ftmp7],    %[ftmp0]      \n\t"
++        "punpcklbh  %[ftmp8],   %[ftmp9],    %[ftmp0]      \n\t"
++        "punpckhbh  %[ftmp9],   %[ftmp9],    %[ftmp0]      \n\t"
++        "punpcklbh  %[ftmp10],  %[ftmp11],   %[ftmp0]      \n\t"
++        "punpckhbh  %[ftmp11],  %[ftmp11],   %[ftmp0]      \n\t"
++        PTR_ADDIU  "%[width],   %[width],    -0x04         \n\t"
++        /* Get raw data */
++        GET_DATA_H_MMI
++        ROUND_POWER_OF_TWO_MMI(%[srcl], %[ftmp13], %[ftmp5],
++                               %[ftmp6], %[tmp0])
++        ROUND_POWER_OF_TWO_MMI(%[srch], %[ftmp13], %[ftmp5],
++                               %[ftmp6], %[tmp0])
++        "packsswh   %[srcl],    %[srcl],     %[srch]       \n\t"
++        "packushb   %[ftmp12],  %[srcl],     %[ftmp0]      \n\t"
++        "swc1       %[ftmp12],  0x00(%[dst])               \n\t"
++        PTR_ADDIU  "%[dst],     %[dst],      0x04          \n\t"
++        PTR_ADDIU  "%[src],     %[src],      0x04          \n\t"
++        /* Loop count */
++        "bnez       %[width],   1b                         \n\t"
++        "move       %[width],   %[tmp1]                    \n\t"
++        PTR_ADDU   "%[src],     %[src],      %[src_stride] \n\t"
++        PTR_ADDU   "%[dst],     %[dst],      %[dst_stride] \n\t"
++        PTR_ADDIU  "%[height],  %[height],   -0x01         \n\t"
++        "bnez       %[height],  1b                         \n\t"
++        : [srcl]"=&f"(ftmp[0]),     [srch]"=&f"(ftmp[1]),
++          [filter1]"=&f"(ftmp[2]),  [filter2]"=&f"(ftmp[3]),
++          [ftmp0]"=&f"(ftmp[4]),    [ftmp4]"=&f"(ftmp[5]),
++          [ftmp5]"=&f"(ftmp[6]),    [ftmp6]"=&f"(ftmp[7]),
++          [ftmp7]"=&f"(ftmp[8]),    [ftmp8]"=&f"(ftmp[9]),
++          [ftmp9]"=&f"(ftmp[10]),   [ftmp10]"=&f"(ftmp[11]),
++          [ftmp11]"=&f"(ftmp[12]),  [ftmp12]"=&f"(ftmp[13]),
++          [tmp0]"=&r"(tmp[0]),      [tmp1]"=&r"(tmp[1]),
++          [src]"+&r"(src),          [width]"+&r"(w),
++          [dst]"+&r"(dst),          [height]"+&r"(h),
++          [ftmp13]"=&f"(ftmp[14])
++        : [filter]"r"(filter_x),
++          [src_stride]"r"((mips_reg)src_stride),
++          [dst_stride]"r"((mips_reg)dst_stride)
++        : "memory"
++    );
++}
++
++static void convolve_vert_mmi(const uint8_t *src, int32_t src_stride,
++                              uint8_t *dst, int32_t dst_stride,
++                              const int16_t *filter_y, int32_t w,
++                              int32_t h)
++{
++    double ftmp[17];
++    uint32_t tmp[1];
++    ptrdiff_t addr = src_stride;
++    src_stride -= w;
++    dst_stride -= w;
++
++    __asm__ volatile (
++        "xor        %[ftmp0],    %[ftmp0],   %[ftmp0]      \n\t"
++        "gsldlc1    %[ftmp4],    0x03(%[filter])           \n\t"
++        "gsldrc1    %[ftmp4],    0x00(%[filter])           \n\t"
++        "gsldlc1    %[ftmp5],    0x0b(%[filter])           \n\t"
++        "gsldrc1    %[ftmp5],    0x08(%[filter])           \n\t"
++        "punpcklwd  %[filter10], %[ftmp4],   %[ftmp4]      \n\t"
++        "punpckhwd  %[filter32], %[ftmp4],   %[ftmp4]      \n\t"
++        "punpcklwd  %[filter54], %[ftmp5],   %[ftmp5]      \n\t"
++        "punpckhwd  %[filter76], %[ftmp5],   %[ftmp5]      \n\t"
++        "li         %[tmp0],     0x07                      \n\t"
++        "dmtc1      %[tmp0],     %[ftmp13]                 \n\t"
++        "punpcklwd  %[ftmp13],   %[ftmp13],  %[ftmp13]     \n\t"
++        "1:                                                \n\t"
++        /* Get 8 data per column */
++        "gsldlc1    %[ftmp4],    0x07(%[src])              \n\t"
++        "gsldrc1    %[ftmp4],    0x00(%[src])              \n\t"
++        PTR_ADDU   "%[tmp0],     %[src],     %[addr]       \n\t"
++        "gsldlc1    %[ftmp5],    0x07(%[tmp0])             \n\t"
++        "gsldrc1    %[ftmp5],    0x00(%[tmp0])             \n\t"
++        PTR_ADDU   "%[tmp0],     %[tmp0],    %[addr]       \n\t"
++        "gsldlc1    %[ftmp6],    0x07(%[tmp0])             \n\t"
++        "gsldrc1    %[ftmp6],    0x00(%[tmp0])             \n\t"
++        PTR_ADDU   "%[tmp0],     %[tmp0],    %[addr]       \n\t"
++        "gsldlc1    %[ftmp7],    0x07(%[tmp0])             \n\t"
++        "gsldrc1    %[ftmp7],    0x00(%[tmp0])             \n\t"
++        PTR_ADDU   "%[tmp0],     %[tmp0],    %[addr]       \n\t"
++        "gsldlc1    %[ftmp8],    0x07(%[tmp0])             \n\t"
++        "gsldrc1    %[ftmp8],    0x00(%[tmp0])             \n\t"
++        PTR_ADDU   "%[tmp0],     %[tmp0],    %[addr]       \n\t"
++        "gsldlc1    %[ftmp9],    0x07(%[tmp0])             \n\t"
++        "gsldrc1    %[ftmp9],    0x00(%[tmp0])             \n\t"
++        PTR_ADDU   "%[tmp0],     %[tmp0],    %[addr]       \n\t"
++        "gsldlc1    %[ftmp10],   0x07(%[tmp0])             \n\t"
++        "gsldrc1    %[ftmp10],   0x00(%[tmp0])             \n\t"
++        PTR_ADDU   "%[tmp0],     %[tmp0],    %[addr]       \n\t"
++        "gsldlc1    %[ftmp11],   0x07(%[tmp0])             \n\t"
++        "gsldrc1    %[ftmp11],   0x00(%[tmp0])             \n\t"
++        "punpcklbh  %[ftmp4],    %[ftmp4],   %[ftmp0]      \n\t"
++        "punpcklbh  %[ftmp5],    %[ftmp5],   %[ftmp0]      \n\t"
++        "punpcklbh  %[ftmp6],    %[ftmp6],   %[ftmp0]      \n\t"
++        "punpcklbh  %[ftmp7],    %[ftmp7],   %[ftmp0]      \n\t"
++        "punpcklbh  %[ftmp8],    %[ftmp8],   %[ftmp0]      \n\t"
++        "punpcklbh  %[ftmp9],    %[ftmp9],   %[ftmp0]      \n\t"
++        "punpcklbh  %[ftmp10],   %[ftmp10],  %[ftmp0]      \n\t"
++        "punpcklbh  %[ftmp11],   %[ftmp11],  %[ftmp0]      \n\t"
++        PTR_ADDIU  "%[width],    %[width],   -0x04         \n\t"
++        /* Get raw data */
++        GET_DATA_V_MMI
++        ROUND_POWER_OF_TWO_MMI(%[srcl], %[ftmp13], %[ftmp5],
++                               %[ftmp6], %[tmp0])
++        ROUND_POWER_OF_TWO_MMI(%[srch], %[ftmp13], %[ftmp5],
++                               %[ftmp6], %[tmp0])
++        "packsswh   %[srcl],     %[srcl],    %[srch]       \n\t"
++        "packushb   %[ftmp12],   %[srcl],    %[ftmp0]      \n\t"
++        "swc1       %[ftmp12],   0x00(%[dst])              \n\t"
++        PTR_ADDIU  "%[dst],      %[dst],      0x04         \n\t"
++        PTR_ADDIU  "%[src],      %[src],      0x04         \n\t"
++        /* Loop count */
++        "bnez       %[width],    1b                        \n\t"
++        PTR_SUBU   "%[width],    %[addr],    %[src_stride] \n\t"
++        PTR_ADDU   "%[src],      %[src],     %[src_stride] \n\t"
++        PTR_ADDU   "%[dst],      %[dst],     %[dst_stride] \n\t"
++        PTR_ADDIU  "%[height],   %[height],  -0x01         \n\t"
++        "bnez       %[height],   1b                        \n\t"
++        : [srcl]"=&f"(ftmp[0]),     [srch]"=&f"(ftmp[1]),
++          [filter10]"=&f"(ftmp[2]), [filter32]"=&f"(ftmp[3]),
++          [filter54]"=&f"(ftmp[4]), [filter76]"=&f"(ftmp[5]),
++          [ftmp0]"=&f"(ftmp[6]),    [ftmp4]"=&f"(ftmp[7]),
++          [ftmp5]"=&f"(ftmp[8]),    [ftmp6]"=&f"(ftmp[9]),
++          [ftmp7]"=&f"(ftmp[10]),   [ftmp8]"=&f"(ftmp[11]),
++          [ftmp9]"=&f"(ftmp[12]),   [ftmp10]"=&f"(ftmp[13]),
++          [ftmp11]"=&f"(ftmp[14]),  [ftmp12]"=&f"(ftmp[15]),
++          [src]"+&r"(src),          [dst]"+&r"(dst),
++          [width]"+&r"(w),          [height]"+&r"(h),
++          [tmp0]"=&r"(tmp[0]),      [ftmp13]"=&f"(ftmp[16])
++        : [filter]"r"(filter_y),
++          [src_stride]"r"((mips_reg)src_stride),
++          [dst_stride]"r"((mips_reg)dst_stride),
++          [addr]"r"((mips_reg)addr)
++        : "memory"
++    );
++}
++
++static void convolve_avg_horiz_mmi(const uint8_t *src, int32_t src_stride,
++                                   uint8_t *dst, int32_t dst_stride,
++                                   const uint16_t *filter_x, int32_t w,
++                                   int32_t h)
++{
++    double ftmp[15];
++    uint32_t tmp[2];
++    src -= 3;
++    src_stride -= w;
++    dst_stride -= w;
++
++    __asm__ volatile (
++        "move       %[tmp1],    %[width]                   \n\t"
++        "xor        %[ftmp0],   %[ftmp0],    %[ftmp0]      \n\t"
++        "gsldlc1    %[filter1], 0x03(%[filter])            \n\t"
++        "gsldrc1    %[filter1], 0x00(%[filter])            \n\t"
++        "gsldlc1    %[filter2], 0x0b(%[filter])            \n\t"
++        "gsldrc1    %[filter2], 0x08(%[filter])            \n\t"
++        "li         %[tmp0],    0x07                       \n\t"
++        "dmtc1      %[tmp0],    %[ftmp13]                  \n\t"
++        "punpcklwd  %[ftmp13],  %[ftmp13],   %[ftmp13]     \n\t"
++        "1:                                                \n\t"
++        /* Get 8 data per row */
++        "gsldlc1    %[ftmp5],   0x07(%[src])               \n\t"
++        "gsldrc1    %[ftmp5],   0x00(%[src])               \n\t"
++        "gsldlc1    %[ftmp7],   0x08(%[src])               \n\t"
++        "gsldrc1    %[ftmp7],   0x01(%[src])               \n\t"
++        "gsldlc1    %[ftmp9],   0x09(%[src])               \n\t"
++        "gsldrc1    %[ftmp9],   0x02(%[src])               \n\t"
++        "gsldlc1    %[ftmp11],  0x0A(%[src])               \n\t"
++        "gsldrc1    %[ftmp11],  0x03(%[src])               \n\t"
++        "punpcklbh  %[ftmp4],   %[ftmp5],    %[ftmp0]      \n\t"
++        "punpckhbh  %[ftmp5],   %[ftmp5],    %[ftmp0]      \n\t"
++        "punpcklbh  %[ftmp6],   %[ftmp7],    %[ftmp0]      \n\t"
++        "punpckhbh  %[ftmp7],   %[ftmp7],    %[ftmp0]      \n\t"
++        "punpcklbh  %[ftmp8],   %[ftmp9],    %[ftmp0]      \n\t"
++        "punpckhbh  %[ftmp9],   %[ftmp9],    %[ftmp0]      \n\t"
++        "punpcklbh  %[ftmp10],  %[ftmp11],   %[ftmp0]      \n\t"
++        "punpckhbh  %[ftmp11],  %[ftmp11],   %[ftmp0]      \n\t"
++        PTR_ADDIU  "%[width],   %[width],    -0x04         \n\t"
++        /* Get raw data */
++        GET_DATA_H_MMI
++        ROUND_POWER_OF_TWO_MMI(%[srcl], %[ftmp13], %[ftmp5],
++                               %[ftmp6], %[tmp0])
++        ROUND_POWER_OF_TWO_MMI(%[srch], %[ftmp13], %[ftmp5],
++                               %[ftmp6], %[tmp0])
++        "packsswh   %[srcl],    %[srcl],     %[srch]       \n\t"
++        "packushb   %[ftmp12],  %[srcl],     %[ftmp0]      \n\t"
++        "punpcklbh  %[ftmp12],  %[ftmp12],   %[ftmp0]      \n\t"
++        "gsldlc1    %[ftmp4],   0x07(%[dst])               \n\t"
++        "gsldrc1    %[ftmp4],   0x00(%[dst])               \n\t"
++        "punpcklbh  %[ftmp4],   %[ftmp4],    %[ftmp0]      \n\t"
++        "paddh      %[ftmp12],  %[ftmp12],   %[ftmp4]      \n\t"
++        "li         %[tmp0],    0x10001                    \n\t"
++        "dmtc1      %[tmp0],    %[ftmp5]                   \n\t"
++        "punpcklhw  %[ftmp5],   %[ftmp5],    %[ftmp5]      \n\t"
++        "paddh      %[ftmp12],  %[ftmp12],   %[ftmp5]      \n\t"
++        "psrah      %[ftmp12],  %[ftmp12],   %[ftmp5]      \n\t"
++        "packushb   %[ftmp12],  %[ftmp12],   %[ftmp0]      \n\t"
++        "swc1       %[ftmp12],  0x00(%[dst])               \n\t"
++        PTR_ADDIU  "%[dst],     %[dst],      0x04          \n\t"
++        PTR_ADDIU  "%[src],     %[src],      0x04          \n\t"
++        /* Loop count */
++        "bnez       %[width],   1b                         \n\t"
++        "move       %[width],   %[tmp1]                    \n\t"
++        PTR_ADDU   "%[src],     %[src],      %[src_stride] \n\t"
++        PTR_ADDU   "%[dst],     %[dst],      %[dst_stride] \n\t"
++        PTR_ADDIU  "%[height],  %[height],   -0x01         \n\t"
++        "bnez       %[height],  1b                         \n\t"
++        : [srcl]"=&f"(ftmp[0]),     [srch]"=&f"(ftmp[1]),
++          [filter1]"=&f"(ftmp[2]),  [filter2]"=&f"(ftmp[3]),
++          [ftmp0]"=&f"(ftmp[4]),    [ftmp4]"=&f"(ftmp[5]),
++          [ftmp5]"=&f"(ftmp[6]),    [ftmp6]"=&f"(ftmp[7]),
++          [ftmp7]"=&f"(ftmp[8]),    [ftmp8]"=&f"(ftmp[9]),
++          [ftmp9]"=&f"(ftmp[10]),   [ftmp10]"=&f"(ftmp[11]),
++          [ftmp11]"=&f"(ftmp[12]),  [ftmp12]"=&f"(ftmp[13]),
++          [tmp0]"=&r"(tmp[0]),      [tmp1]"=&r"(tmp[1]),
++          [src]"+&r"(src),          [width]"+&r"(w),
++          [dst]"+&r"(dst),          [height]"+&r"(h),
++          [ftmp13]"=&f"(ftmp[14])
++        : [filter]"r"(filter_x),
++          [src_stride]"r"((mips_reg)src_stride),
++          [dst_stride]"r"((mips_reg)dst_stride)
++        : "memory"
++    );
++}
++
++static void convolve_avg_vert_mmi(const uint8_t *src, int32_t src_stride,
++                                  uint8_t *dst, int32_t dst_stride,
++                                  const int16_t *filter_y, int32_t w,
++                                  int32_t h)
++{
++    double ftmp[17];
++    uint32_t tmp[1];
++    ptrdiff_t addr = src_stride;
++    src_stride -= w;
++    dst_stride -= w;
++
++    __asm__ volatile (
++        "xor        %[ftmp0],    %[ftmp0],   %[ftmp0]      \n\t"
++        "gsldlc1    %[ftmp4],    0x03(%[filter])           \n\t"
++        "gsldrc1    %[ftmp4],    0x00(%[filter])           \n\t"
++        "gsldlc1    %[ftmp5],    0x0b(%[filter])           \n\t"
++        "gsldrc1    %[ftmp5],    0x08(%[filter])           \n\t"
++        "punpcklwd  %[filter10], %[ftmp4],   %[ftmp4]      \n\t"
++        "punpckhwd  %[filter32], %[ftmp4],   %[ftmp4]      \n\t"
++        "punpcklwd  %[filter54], %[ftmp5],   %[ftmp5]      \n\t"
++        "punpckhwd  %[filter76], %[ftmp5],   %[ftmp5]      \n\t"
++        "li         %[tmp0],     0x07                      \n\t"
++        "dmtc1      %[tmp0],     %[ftmp13]                 \n\t"
++        "punpcklwd  %[ftmp13],   %[ftmp13],  %[ftmp13]     \n\t"
++        "1:                                                \n\t"
++        /* Get 8 data per column */
++        "gsldlc1    %[ftmp4],    0x07(%[src])              \n\t"
++        "gsldrc1    %[ftmp4],    0x00(%[src])              \n\t"
++        PTR_ADDU   "%[tmp0],     %[src],     %[addr]       \n\t"
++        "gsldlc1    %[ftmp5],    0x07(%[tmp0])             \n\t"
++        "gsldrc1    %[ftmp5],    0x00(%[tmp0])             \n\t"
++        PTR_ADDU   "%[tmp0],     %[tmp0],    %[addr]       \n\t"
++        "gsldlc1    %[ftmp6],    0x07(%[tmp0])             \n\t"
++        "gsldrc1    %[ftmp6],    0x00(%[tmp0])             \n\t"
++        PTR_ADDU   "%[tmp0],     %[tmp0],    %[addr]       \n\t"
++        "gsldlc1    %[ftmp7],    0x07(%[tmp0])             \n\t"
++        "gsldrc1    %[ftmp7],    0x00(%[tmp0])             \n\t"
++        PTR_ADDU   "%[tmp0],     %[tmp0],    %[addr]       \n\t"
++        "gsldlc1    %[ftmp8],    0x07(%[tmp0])             \n\t"
++        "gsldrc1    %[ftmp8],    0x00(%[tmp0])             \n\t"
++        PTR_ADDU   "%[tmp0],     %[tmp0],    %[addr]       \n\t"
++        "gsldlc1    %[ftmp9],    0x07(%[tmp0])             \n\t"
++        "gsldrc1    %[ftmp9],    0x00(%[tmp0])             \n\t"
++        PTR_ADDU   "%[tmp0],     %[tmp0],    %[addr]       \n\t"
++        "gsldlc1    %[ftmp10],   0x07(%[tmp0])             \n\t"
++        "gsldrc1    %[ftmp10],   0x00(%[tmp0])             \n\t"
++        PTR_ADDU   "%[tmp0],     %[tmp0],    %[addr]       \n\t"
++        "gsldlc1    %[ftmp11],   0x07(%[tmp0])             \n\t"
++        "gsldrc1    %[ftmp11],   0x00(%[tmp0])             \n\t"
++        "punpcklbh  %[ftmp4],    %[ftmp4],   %[ftmp0]      \n\t"
++        "punpcklbh  %[ftmp5],    %[ftmp5],   %[ftmp0]      \n\t"
++        "punpcklbh  %[ftmp6],    %[ftmp6],   %[ftmp0]      \n\t"
++        "punpcklbh  %[ftmp7],    %[ftmp7],   %[ftmp0]      \n\t"
++        "punpcklbh  %[ftmp8],    %[ftmp8],   %[ftmp0]      \n\t"
++        "punpcklbh  %[ftmp9],    %[ftmp9],   %[ftmp0]      \n\t"
++        "punpcklbh  %[ftmp10],   %[ftmp10],  %[ftmp0]      \n\t"
++        "punpcklbh  %[ftmp11],   %[ftmp11],  %[ftmp0]      \n\t"
++        PTR_ADDIU  "%[width],    %[width],   -0x04         \n\t"
++        /* Get raw data */
++        GET_DATA_V_MMI
++        ROUND_POWER_OF_TWO_MMI(%[srcl], %[ftmp13], %[ftmp5],
++                               %[ftmp6], %[tmp0])
++        ROUND_POWER_OF_TWO_MMI(%[srch], %[ftmp13], %[ftmp5],
++                               %[ftmp6], %[tmp0])
++        "packsswh   %[srcl],     %[srcl],    %[srch]       \n\t"
++        "packushb   %[ftmp12],   %[srcl],    %[ftmp0]      \n\t"
++        "punpcklbh  %[ftmp12],   %[ftmp12],  %[ftmp0]      \n\t"
++        "gsldlc1    %[ftmp4],    0x07(%[dst])              \n\t"
++        "gsldrc1    %[ftmp4],    0x00(%[dst])              \n\t"
++        "punpcklbh  %[ftmp4],    %[ftmp4],   %[ftmp0]      \n\t"
++        "paddh      %[ftmp12],   %[ftmp12],  %[ftmp4]      \n\t"
++        "li         %[tmp0],     0x10001                   \n\t"
++        "dmtc1      %[tmp0],     %[ftmp5]                  \n\t"
++        "punpcklhw  %[ftmp5],    %[ftmp5],   %[ftmp5]      \n\t"
++        "paddh      %[ftmp12],   %[ftmp12],  %[ftmp5]      \n\t"
++        "psrah      %[ftmp12],   %[ftmp12],  %[ftmp5]      \n\t"
++        "packushb   %[ftmp12],   %[ftmp12],  %[ftmp0]      \n\t"
++        "swc1       %[ftmp12],   0x00(%[dst])              \n\t"
++        PTR_ADDIU  "%[dst],      %[dst],     0x04          \n\t"
++        PTR_ADDIU  "%[src],      %[src],     0x04          \n\t"
++        /* Loop count */
++        "bnez       %[width],    1b                        \n\t"
++        PTR_SUBU   "%[width],    %[addr],    %[src_stride] \n\t"
++        PTR_ADDU   "%[src],      %[src],     %[src_stride] \n\t"
++        PTR_ADDU   "%[dst],      %[dst],     %[dst_stride] \n\t"
++        PTR_ADDIU  "%[height],   %[height],  -0x01         \n\t"
++        "bnez       %[height],   1b                        \n\t"
++        : [srcl]"=&f"(ftmp[0]),     [srch]"=&f"(ftmp[1]),
++          [filter10]"=&f"(ftmp[2]), [filter32]"=&f"(ftmp[3]),
++          [filter54]"=&f"(ftmp[4]), [filter76]"=&f"(ftmp[5]),
++          [ftmp0]"=&f"(ftmp[6]),    [ftmp4]"=&f"(ftmp[7]),
++          [ftmp5]"=&f"(ftmp[8]),    [ftmp6]"=&f"(ftmp[9]),
++          [ftmp7]"=&f"(ftmp[10]),   [ftmp8]"=&f"(ftmp[11]),
++          [ftmp9]"=&f"(ftmp[12]),   [ftmp10]"=&f"(ftmp[13]),
++          [ftmp11]"=&f"(ftmp[14]),  [ftmp12]"=&f"(ftmp[15]),
++          [src]"+&r"(src),          [dst]"+&r"(dst),
++          [width]"+&r"(w),          [height]"+&r"(h),
++          [tmp0]"=&r"(tmp[0]),      [ftmp13]"=&f"(ftmp[16])
++        : [filter]"r"(filter_y),
++          [src_stride]"r"((mips_reg)src_stride),
++          [dst_stride]"r"((mips_reg)dst_stride),
++          [addr]"r"((mips_reg)addr)
++        : "memory"
++    );
++}
++
++static void convolve_avg_mmi(const uint8_t *src, int32_t src_stride,
++                             uint8_t *dst, int32_t dst_stride,
++                             int32_t w, int32_t h)
++{
++    double ftmp[4];
++    uint32_t tmp[2];
++    src_stride -= w;
++    dst_stride -= w;
++
++    __asm__ volatile (
++        "move       %[tmp1],    %[width]                  \n\t"
++        "xor        %[ftmp0],   %[ftmp0],   %[ftmp0]      \n\t"
++        "li         %[tmp0],    0x10001                   \n\t"
++        "dmtc1      %[tmp0],    %[ftmp3]                  \n\t"
++        "punpcklhw  %[ftmp3],   %[ftmp3],   %[ftmp3]      \n\t"
++        "1:                                               \n\t"
++        "gslwlc1    %[ftmp1],   0x07(%[src])              \n\t"
++        "gslwrc1    %[ftmp1],   0x00(%[src])              \n\t"
++        "gslwlc1    %[ftmp2],   0x07(%[dst])              \n\t"
++        "gslwrc1    %[ftmp2],   0x00(%[dst])              \n\t"
++        "punpcklbh  %[ftmp1],   %[ftmp1],   %[ftmp0]      \n\t"
++        "punpcklbh  %[ftmp2],   %[ftmp2],   %[ftmp0]      \n\t"
++        "paddh      %[ftmp1],   %[ftmp1],   %[ftmp2]      \n\t"
++        "paddh      %[ftmp1],   %[ftmp1],   %[ftmp3]      \n\t"
++        "psrah      %[ftmp1],   %[ftmp1],   %[ftmp3]      \n\t"
++        "packushb   %[ftmp1],   %[ftmp1],   %[ftmp0]      \n\t"
++        "swc1       %[ftmp1],   0x00(%[dst])              \n\t"
++        PTR_ADDIU  "%[width],   %[width],   -0x04         \n\t"
++        PTR_ADDIU  "%[dst],     %[dst],     0x04          \n\t"
++        PTR_ADDIU  "%[src],     %[src],     0x04          \n\t"
++        "bnez       %[width],   1b                        \n\t"
++        "move       %[width],   %[tmp1]                   \n\t"
++        PTR_ADDU   "%[dst],     %[dst],     %[dst_stride] \n\t"
++        PTR_ADDU   "%[src],     %[src],     %[src_stride] \n\t"
++        PTR_ADDIU  "%[height],  %[height],  -0x01         \n\t"
++        "bnez       %[height],  1b                        \n\t"
++        : [ftmp0]"=&f"(ftmp[0]),  [ftmp1]"=&f"(ftmp[1]),
++          [ftmp2]"=&f"(ftmp[2]),  [ftmp3]"=&f"(ftmp[3]),
++          [tmp0]"=&r"(tmp[0]),    [tmp1]"=&r"(tmp[1]),
++          [src]"+&r"(src),        [dst]"+&r"(dst),
++          [width]"+&r"(w),        [height]"+&r"(h)
++        : [src_stride]"r"((mips_reg)src_stride),
++          [dst_stride]"r"((mips_reg)dst_stride)
++        : "memory"
++    );
++}
++
++static const int16_t vp9_subpel_filters_mmi[3][15][8] = {
++    [FILTER_8TAP_REGULAR] = {
++         {0, 1, -5, 126, 8, -3, 1, 0},
++         {-1, 3, -10, 122, 18, -6, 2, 0},
++         {-1, 4, -13, 118, 27, -9, 3, -1},
++         {-1, 4, -16, 112, 37, -11, 4, -1},
++         {-1, 5, -18, 105, 48, -14, 4, -1},
++         {-1, 5, -19, 97, 58, -16, 5, -1},
++         {-1, 6, -19, 88, 68, -18, 5, -1},
++         {-1, 6, -19, 78, 78, -19, 6, -1},
++         {-1, 5, -18, 68, 88, -19, 6, -1},
++         {-1, 5, -16, 58, 97, -19, 5, -1},
++         {-1, 4, -14, 48, 105, -18, 5, -1},
++         {-1, 4, -11, 37, 112, -16, 4, -1},
++         {-1, 3, -9, 27, 118, -13, 4, -1},
++         {0, 2, -6, 18, 122, -10, 3, -1},
++         {0, 1, -3, 8, 126, -5, 1, 0},
++    }, [FILTER_8TAP_SHARP] = {
++        {-1, 3, -7, 127, 8, -3, 1, 0},
++        {-2, 5, -13, 125, 17, -6, 3, -1},
++        {-3, 7, -17, 121, 27, -10, 5, -2},
++        {-4, 9, -20, 115, 37, -13, 6, -2},
++        {-4, 10, -23, 108, 48, -16, 8, -3},
++        {-4, 10, -24, 100, 59, -19, 9, -3},
++        {-4, 11, -24, 90, 70, -21, 10, -4},
++        {-4, 11, -23, 80, 80, -23, 11, -4},
++        {-4, 10, -21, 70, 90, -24, 11, -4},
++        {-3, 9, -19, 59, 100, -24, 10, -4},
++        {-3, 8, -16, 48, 108, -23, 10, -4},
++        {-2, 6, -13, 37, 115, -20, 9, -4},
++        {-2, 5, -10, 27, 121, -17, 7, -3},
++        {-1, 3, -6, 17, 125, -13, 5, -2},
++        {0, 1, -3, 8, 127, -7, 3, -1},
++    }, [FILTER_8TAP_SMOOTH] = {
++        {-3, -1, 32, 64, 38, 1, -3, 0},
++        {-2, -2, 29, 63, 41, 2, -3, 0},
++        {-2, -2, 26, 63, 43, 4, -4, 0},
++        {-2, -3, 24, 62, 46, 5, -4, 0},
++        {-2, -3, 21, 60, 49, 7, -4, 0},
++        {-1, -4, 18, 59, 51, 9, -4, 0},
++        {-1, -4, 16, 57, 53, 12, -4, -1},
++        {-1, -4, 14, 55, 55, 14, -4, -1},
++        {-1, -4, 12, 53, 57, 16, -4, -1},
++        {0, -4, 9, 51, 59, 18, -4, -1},
++        {0, -4, 7, 49, 60, 21, -3, -2},
++        {0, -4, 5, 46, 62, 24, -3, -2},
++        {0, -4, 4, 43, 63, 26, -2, -2},
++        {0, -3, 2, 41, 63, 29, -2, -2},
++        {0, -3, 1, 38, 64, 32, -1, -3},
++    }
++};
++
++#define VP9_8TAP_MIPS_MMI_FUNC(SIZE, TYPE, TYPE_IDX)                           \
++void ff_put_8tap_##TYPE##_##SIZE##h_mmi(uint8_t *dst, ptrdiff_t dststride,     \
++                                        const uint8_t *src,                    \
++                                        ptrdiff_t srcstride,                   \
++                                        int h, int mx, int my)                 \
++{                                                                              \
++    const int16_t *filter = vp9_subpel_filters_mmi[TYPE_IDX][mx-1];            \
++                                                                               \
++    convolve_horiz_mmi(src, srcstride, dst, dststride, filter, SIZE, h);       \
++}                                                                              \
++                                                                               \
++void ff_put_8tap_##TYPE##_##SIZE##v_mmi(uint8_t *dst, ptrdiff_t dststride,     \
++                                        const uint8_t *src,                    \
++                                        ptrdiff_t srcstride,                   \
++                                        int h, int mx, int my)                 \
++{                                                                              \
++    const int16_t *filter = vp9_subpel_filters_mmi[TYPE_IDX][my-1];            \
++                                                                               \
++    src -= (3 * srcstride);                                                    \
++    convolve_vert_mmi(src, srcstride, dst, dststride, filter, SIZE, h);        \
++}                                                                              \
++                                                                               \
++void ff_put_8tap_##TYPE##_##SIZE##hv_mmi(uint8_t *dst, ptrdiff_t dststride,    \
++                                         const uint8_t *src,                   \
++                                         ptrdiff_t srcstride,                  \
++                                         int h, int mx, int my)                \
++{                                                                              \
++    const uint16_t *hfilter = vp9_subpel_filters_mmi[TYPE_IDX][mx-1];          \
++    const uint16_t *vfilter = vp9_subpel_filters_mmi[TYPE_IDX][my-1];          \
++                                                                               \
++    int tmp_h = h + 7;                                                         \
++    uint8_t temp[64 * 71];                                                     \
++    src -= (3 * srcstride);                                                    \
++    convolve_horiz_mmi(src, srcstride, temp, 64, hfilter, SIZE, tmp_h);        \
++    convolve_vert_mmi(temp, 64, dst, dststride, vfilter, SIZE, h);             \
++}                                                                              \
++                                                                               \
++void ff_avg_8tap_##TYPE##_##SIZE##h_mmi(uint8_t *dst, ptrdiff_t dststride,     \
++                                        const uint8_t *src,                    \
++                                        ptrdiff_t srcstride,                   \
++                                        int h, int mx, int my)                 \
++{                                                                              \
++    const int16_t *filter = vp9_subpel_filters_mmi[TYPE_IDX][mx-1];            \
++                                                                               \
++    convolve_avg_horiz_mmi(src, srcstride, dst, dststride, filter, SIZE, h);   \
++}                                                                              \
++                                                                               \
++void ff_avg_8tap_##TYPE##_##SIZE##v_mmi(uint8_t *dst, ptrdiff_t dststride,     \
++                                        const uint8_t *src,                    \
++                                        ptrdiff_t srcstride,                   \
++                                        int h, int mx, int my)                 \
++{                                                                              \
++    const int16_t *filter = vp9_subpel_filters_mmi[TYPE_IDX][my-1];            \
++                                                                               \
++    src -= (3 * srcstride);                                                    \
++    convolve_avg_vert_mmi(src, srcstride, dst, dststride, filter, SIZE, h);    \
++}                                                                              \
++                                                                               \
++void ff_avg_8tap_##TYPE##_##SIZE##hv_mmi(uint8_t *dst, ptrdiff_t dststride,    \
++                                         const uint8_t *src,                   \
++                                         ptrdiff_t srcstride,                  \
++                                         int h, int mx, int my)                \
++{                                                                              \
++    const uint16_t *hfilter = vp9_subpel_filters_mmi[TYPE_IDX][mx-1];          \
++    const uint16_t *vfilter = vp9_subpel_filters_mmi[TYPE_IDX][my-1];          \
++                                                                               \
++    uint8_t temp1[64 * 64];                                                    \
++    uint8_t temp2[64 * 71];                                                    \
++    int tmp_h = h + 7;                                                         \
++    src -= (3 * srcstride);                                                    \
++    convolve_horiz_mmi(src, srcstride, temp2, 64, hfilter, SIZE, tmp_h);       \
++    convolve_vert_mmi(temp2, 64, temp1, 64, vfilter, SIZE, h);                 \
++    convolve_avg_mmi(temp1, 64, dst, dststride, SIZE, h);                      \
++}
++
++VP9_8TAP_MIPS_MMI_FUNC(64, regular, FILTER_8TAP_REGULAR);
++VP9_8TAP_MIPS_MMI_FUNC(32, regular, FILTER_8TAP_REGULAR);
++VP9_8TAP_MIPS_MMI_FUNC(16, regular, FILTER_8TAP_REGULAR);
++VP9_8TAP_MIPS_MMI_FUNC(8, regular, FILTER_8TAP_REGULAR);
++VP9_8TAP_MIPS_MMI_FUNC(4, regular, FILTER_8TAP_REGULAR);
++
++VP9_8TAP_MIPS_MMI_FUNC(64, sharp, FILTER_8TAP_SHARP);
++VP9_8TAP_MIPS_MMI_FUNC(32, sharp, FILTER_8TAP_SHARP);
++VP9_8TAP_MIPS_MMI_FUNC(16, sharp, FILTER_8TAP_SHARP);
++VP9_8TAP_MIPS_MMI_FUNC(8, sharp, FILTER_8TAP_SHARP);
++VP9_8TAP_MIPS_MMI_FUNC(4, sharp, FILTER_8TAP_SHARP);
++
++VP9_8TAP_MIPS_MMI_FUNC(64, smooth, FILTER_8TAP_SMOOTH);
++VP9_8TAP_MIPS_MMI_FUNC(32, smooth, FILTER_8TAP_SMOOTH);
++VP9_8TAP_MIPS_MMI_FUNC(16, smooth, FILTER_8TAP_SMOOTH);
++VP9_8TAP_MIPS_MMI_FUNC(8, smooth, FILTER_8TAP_SMOOTH);
++VP9_8TAP_MIPS_MMI_FUNC(4, smooth, FILTER_8TAP_SMOOTH);
++
++#undef VP9_8TAP_MIPS_MMI_FUNC
+diff -uNra ffmpeg-4.1.6/libavcodec/mips/vp9_mc_msa.c FFmpeg/libavcodec/mips/vp9_mc_msa.c
+--- a/libavcodec/mips/vp9_mc_msa.c	2020-07-03 23:10:59.000000000 +0800
++++ b/libavcodec/mips/vp9_mc_msa.c	2020-07-19 18:13:57.524835792 +0800
+@@ -153,7 +153,7 @@
+                                                               \
+     PCKEV_B2_UB(in1, in0, in3, in2, tmp0_m, tmp1_m);          \
+     AVER_UB2_UB(tmp0_m, dst0, tmp1_m, dst1, tmp0_m, tmp1_m);  \
+-    ST8x4_UB(tmp0_m, tmp1_m, pdst_m, stride);                 \
++    ST_D4(tmp0_m, tmp1_m, 0, 1, 0, 1, pdst_m, stride);        \
+ }
+ 
+ static void common_hz_8t_4x4_msa(const uint8_t *src, int32_t src_stride,
+@@ -182,7 +182,7 @@
+     SRARI_H2_SH(out0, out1, 7);
+     SAT_SH2_SH(out0, out1, 7);
+     out = PCKEV_XORI128_UB(out0, out1);
+-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
++    ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
+ }
+ 
+ static void common_hz_8t_4x8_msa(const uint8_t *src, int32_t src_stride,
+@@ -217,10 +217,9 @@
+     SRARI_H4_SH(out0, out1, out2, out3, 7);
+     SAT_SH4_SH(out0, out1, out2, out3, 7);
+     out = PCKEV_XORI128_UB(out0, out1);
+-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
+-    dst += (4 * dst_stride);
++    ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
+     out = PCKEV_XORI128_UB(out2, out3);
+-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
++    ST_W4(out, 0, 1, 2, 3, dst + 4 * dst_stride, dst_stride);
+ }
+ 
+ static void common_hz_8t_4w_msa(const uint8_t *src, int32_t src_stride,
+@@ -262,7 +261,7 @@
+     SAT_SH4_SH(out0, out1, out2, out3, 7);
+     tmp0 = PCKEV_XORI128_UB(out0, out1);
+     tmp1 = PCKEV_XORI128_UB(out2, out3);
+-    ST8x4_UB(tmp0, tmp1, dst, dst_stride);
++    ST_D4(tmp0, tmp1, 0, 1, 0, 1, dst, dst_stride);
+ }
+ 
+ static void common_hz_8t_8x8mult_msa(const uint8_t *src, int32_t src_stride,
+@@ -296,7 +295,7 @@
+         SAT_SH4_SH(out0, out1, out2, out3, 7);
+         tmp0 = PCKEV_XORI128_UB(out0, out1);
+         tmp1 = PCKEV_XORI128_UB(out2, out3);
+-        ST8x4_UB(tmp0, tmp1, dst, dst_stride);
++        ST_D4(tmp0, tmp1, 0, 1, 0, 1, dst, dst_stride);
+         dst += (4 * dst_stride);
+     }
+ }
+@@ -510,7 +509,7 @@
+         SRARI_H2_SH(out10, out32, 7);
+         SAT_SH2_SH(out10, out32, 7);
+         out = PCKEV_XORI128_UB(out10, out32);
+-        ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
++        ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
+         dst += (4 * dst_stride);
+ 
+         src2110 = src6554;
+@@ -562,7 +561,7 @@
+         SAT_SH4_SH(out0_r, out1_r, out2_r, out3_r, 7);
+         tmp0 = PCKEV_XORI128_UB(out0_r, out1_r);
+         tmp1 = PCKEV_XORI128_UB(out2_r, out3_r);
+-        ST8x4_UB(tmp0, tmp1, dst, dst_stride);
++        ST_D4(tmp0, tmp1, 0, 1, 0, 1, dst, dst_stride);
+         dst += (4 * dst_stride);
+ 
+         src10_r = src54_r;
+@@ -796,7 +795,7 @@
+                               filt_hz1, filt_hz2, filt_hz3);
+     hz_out5 = HORIZ_8TAP_FILT(src5, src6, mask0, mask1, mask2, mask3, filt_hz0,
+                               filt_hz1, filt_hz2, filt_hz3);
+-    SLDI_B2_SH(hz_out2, hz_out4, hz_out0, hz_out2, hz_out1, hz_out3, 8);
++    SLDI_B2_SH(hz_out2, hz_out0, hz_out4, hz_out2, 8, hz_out1, hz_out3);
+ 
+     filt = LD_SH(filter_vert);
+     SPLATI_H4_SH(filt, 0, 1, 2, 3, filt_vt0, filt_vt1, filt_vt2, filt_vt3);
+@@ -825,7 +824,7 @@
+         SRARI_H2_SH(tmp0, tmp1, 7);
+         SAT_SH2_SH(tmp0, tmp1, 7);
+         out = PCKEV_XORI128_UB(tmp0, tmp1);
+-        ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
++        ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
+         dst += (4 * dst_stride);
+ 
+         hz_out5 = hz_out9;
+@@ -920,7 +919,7 @@
+         SAT_SH4_SH(tmp0, tmp1, tmp2, tmp3, 7);
+         vec0 = PCKEV_XORI128_UB(tmp0, tmp1);
+         vec1 = PCKEV_XORI128_UB(tmp2, tmp3);
+-        ST8x4_UB(vec0, vec1, dst, dst_stride);
++        ST_D4(vec0, vec1, 0, 1, 0, 1, dst, dst_stride);
+         dst += (4 * dst_stride);
+ 
+         hz_out6 = hz_out10;
+@@ -1016,7 +1015,7 @@
+     SAT_SH2_SH(res0, res1, 7);
+     res = PCKEV_XORI128_UB(res0, res1);
+     res = (v16u8) __msa_aver_u_b(res, dst0);
+-    ST4x4_UB(res, res, 0, 1, 2, 3, dst, dst_stride);
++    ST_W4(res, 0, 1, 2, 3, dst, dst_stride);
+ }
+ 
+ static void common_hz_8t_and_aver_dst_4x8_msa(const uint8_t *src,
+@@ -1061,7 +1060,7 @@
+     ILVR_D2_UB(res1, res0, res3, res2, res0, res2);
+     XORI_B2_128_UB(res0, res2);
+     AVER_UB2_UB(res0, dst0, res2, dst1, res0, res2);
+-    ST4x8_UB(res0, res2, dst, dst_stride);
++    ST_W8(res0, res2, 0, 1, 2, 3, 0, 1, 2, 3, dst, dst_stride);
+ }
+ 
+ static void common_hz_8t_and_aver_dst_4w_msa(const uint8_t *src,
+@@ -1348,7 +1347,7 @@
+         out = PCKEV_XORI128_UB(out10, out32);
+         out = __msa_aver_u_b(out, dst0);
+ 
+-        ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
++        ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
+         dst += (4 * dst_stride);
+ 
+         src2110 = src6554;
+@@ -1586,7 +1585,7 @@
+                               filt_hz1, filt_hz2, filt_hz3);
+     hz_out5 = HORIZ_8TAP_FILT(src5, src6, mask0, mask1, mask2, mask3, filt_hz0,
+                               filt_hz1, filt_hz2, filt_hz3);
+-    SLDI_B2_SH(hz_out2, hz_out4, hz_out0, hz_out2, hz_out1, hz_out3, 8);
++    SLDI_B2_SH(hz_out2, hz_out0, hz_out4, hz_out2, 8, hz_out1, hz_out3);
+ 
+     filt = LD_SH(filter_vert);
+     SPLATI_H4_SH(filt, 0, 1, 2, 3, filt_vt0, filt_vt1, filt_vt2, filt_vt3);
+@@ -1619,7 +1618,7 @@
+         SAT_SH2_SH(res0, res1, 7);
+         res = PCKEV_XORI128_UB(res0, res1);
+         res = (v16u8) __msa_aver_u_b(res, dst0);
+-        ST4x4_UB(res, res, 0, 1, 2, 3, dst, dst_stride);
++        ST_W4(res, 0, 1, 2, 3, dst, dst_stride);
+         dst += (4 * dst_stride);
+ 
+         hz_out5 = hz_out9;
+@@ -1812,7 +1811,8 @@
+     DOTP_UB2_UH(vec0, vec1, filt0, filt0, vec2, vec3);
+     SRARI_H2_UH(vec2, vec3, 7);
+     PCKEV_B2_UB(vec2, vec2, vec3, vec3, res0, res1);
+-    ST4x4_UB(res0, res1, 0, 1, 0, 1, dst, dst_stride);
++    ST_W2(res0, 0, 1, dst, dst_stride);
++    ST_W2(res1, 0, 1, dst + 2 * dst_stride, dst_stride);
+ }
+ 
+ static void common_hz_2t_4x8_msa(const uint8_t *src, int32_t src_stride,
+@@ -1838,9 +1838,10 @@
+     SRARI_H4_UH(vec4, vec5, vec6, vec7, 7);
+     PCKEV_B4_SB(vec4, vec4, vec5, vec5, vec6, vec6, vec7, vec7,
+                 res0, res1, res2, res3);
+-    ST4x4_UB(res0, res1, 0, 1, 0, 1, dst, dst_stride);
+-    dst += (4 * dst_stride);
+-    ST4x4_UB(res2, res3, 0, 1, 0, 1, dst, dst_stride);
++    ST_W2(res0, 0, 1, dst, dst_stride);
++    ST_W2(res1, 0, 1, dst + 2 * dst_stride, dst_stride);
++    ST_W2(res2, 0, 1, dst + 4 * dst_stride, dst_stride);
++    ST_W2(res3, 0, 1, dst + 6 * dst_stride, dst_stride);
+ }
+ 
+ void ff_put_bilin_4h_msa(uint8_t *dst, ptrdiff_t dst_stride,
+@@ -1877,7 +1878,7 @@
+                 vec0, vec1, vec2, vec3);
+     SRARI_H4_UH(vec0, vec1, vec2, vec3, 7);
+     PCKEV_B2_SB(vec1, vec0, vec3, vec2, src0, src1);
+-    ST8x4_UB(src0, src1, dst, dst_stride);
++    ST_D4(src0, src1, 0, 1, 0, 1, dst, dst_stride);
+ }
+ 
+ static void common_hz_2t_8x8mult_msa(const uint8_t *src, int32_t src_stride,
+@@ -1906,8 +1907,7 @@
+     src += (4 * src_stride);
+ 
+     PCKEV_B2_SB(vec1, vec0, vec3, vec2, out0, out1);
+-    ST8x4_UB(out0, out1, dst, dst_stride);
+-    dst += (4 * dst_stride);
++    ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
+ 
+     VSHF_B2_UH(src0, src0, src1, src1, mask, mask, vec0, vec1);
+     VSHF_B2_UH(src2, src2, src3, src3, mask, mask, vec2, vec3);
+@@ -1915,8 +1915,8 @@
+                 vec0, vec1, vec2, vec3);
+     SRARI_H4_UH(vec0, vec1, vec2, vec3, 7);
+     PCKEV_B2_SB(vec1, vec0, vec3, vec2, out0, out1);
+-    ST8x4_UB(out0, out1, dst, dst_stride);
+-    dst += (4 * dst_stride);
++    ST_D4(out0, out1, 0, 1, 0, 1, dst + 4 * dst_stride, dst_stride);
++    dst += (8 * dst_stride);
+ 
+     if (16 == height) {
+         LD_SB4(src, src_stride, src0, src1, src2, src3);
+@@ -1931,7 +1931,7 @@
+         src += (4 * src_stride);
+ 
+         PCKEV_B2_SB(vec1, vec0, vec3, vec2, out0, out1);
+-        ST8x4_UB(out0, out1, dst, dst_stride);
++        ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
+ 
+         VSHF_B2_UH(src0, src0, src1, src1, mask, mask, vec0, vec1);
+         VSHF_B2_UH(src2, src2, src3, src3, mask, mask, vec2, vec3);
+@@ -1939,7 +1939,7 @@
+                     vec0, vec1, vec2, vec3);
+         SRARI_H4_UH(vec0, vec1, vec2, vec3, 7);
+         PCKEV_B2_SB(vec1, vec0, vec3, vec2, out0, out1);
+-        ST8x4_UB(out0, out1, dst + 4 * dst_stride, dst_stride);
++        ST_D4(out0, out1, 0, 1, 0, 1, dst + 4 * dst_stride, dst_stride);
+     }
+ }
+ 
+@@ -2093,7 +2093,7 @@
+         src4 = LD_SB(src + 32);
+         src6 = LD_SB(src + 48);
+         src7 = LD_SB(src + 56);
+-        SLDI_B3_SB(src2, src4, src6, src0, src2, src4, src1, src3, src5, 8);
++        SLDI_B3_SB(src2, src0, src4, src2, src6, src4, 8, src1, src3, src5);
+         src += src_stride;
+ 
+         VSHF_B2_UB(src0, src0, src1, src1, mask, mask, vec0, vec1);
+@@ -2137,7 +2137,7 @@
+     SRARI_H2_UH(tmp0, tmp1, 7);
+     SAT_UH2_UH(tmp0, tmp1, 7);
+     src2110 = __msa_pckev_b((v16i8) tmp1, (v16i8) tmp0);
+-    ST4x4_UB(src2110, src2110, 0, 1, 2, 3, dst, dst_stride);
++    ST_W4(src2110, 0, 1, 2, 3, dst, dst_stride);
+ }
+ 
+ static void common_vt_2t_4x8_msa(const uint8_t *src, int32_t src_stride,
+@@ -2171,8 +2171,7 @@
+     SRARI_H4_UH(tmp0, tmp1, tmp2, tmp3, 7);
+     SAT_UH4_UH(tmp0, tmp1, tmp2, tmp3, 7);
+     PCKEV_B2_SB(tmp1, tmp0, tmp3, tmp2, src2110, src4332);
+-    ST4x4_UB(src2110, src2110, 0, 1, 2, 3, dst, dst_stride);
+-    ST4x4_UB(src4332, src4332, 0, 1, 2, 3, dst + 4 * dst_stride, dst_stride);
++    ST_W8(src2110, src4332, 0, 1, 2, 3, 0, 1, 2, 3, dst, dst_stride);
+ }
+ 
+ void ff_put_bilin_4v_msa(uint8_t *dst, ptrdiff_t dst_stride,
+@@ -2209,7 +2208,7 @@
+     SRARI_H4_UH(tmp0, tmp1, tmp2, tmp3, 7);
+     SAT_UH4_UH(tmp0, tmp1, tmp2, tmp3, 7);
+     PCKEV_B2_SB(tmp1, tmp0, tmp3, tmp2, out0, out1);
+-    ST8x4_UB(out0, out1, dst, dst_stride);
++    ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
+ }
+ 
+ static void common_vt_2t_8x8mult_msa(const uint8_t *src, int32_t src_stride,
+@@ -2243,16 +2242,15 @@
+         SRARI_H4_UH(tmp0, tmp1, tmp2, tmp3, 7);
+         SAT_UH4_UH(tmp0, tmp1, tmp2, tmp3, 7);
+         PCKEV_B2_SB(tmp1, tmp0, tmp3, tmp2, out0, out1);
+-        ST8x4_UB(out0, out1, dst, dst_stride);
+-        dst += (4 * dst_stride);
++        ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
+ 
+         DOTP_UB4_UH(vec4, vec5, vec6, vec7, filt0, filt0, filt0, filt0,
+                     tmp0, tmp1, tmp2, tmp3);
+         SRARI_H4_UH(tmp0, tmp1, tmp2, tmp3, 7);
+         SAT_UH4_UH(tmp0, tmp1, tmp2, tmp3, 7);
+         PCKEV_B2_SB(tmp1, tmp0, tmp3, tmp2, out0, out1);
+-        ST8x4_UB(out0, out1, dst, dst_stride);
+-        dst += (4 * dst_stride);
++        ST_D4(out0, out1, 0, 1, 0, 1, dst + 4 * dst_stride, dst_stride);
++        dst += (8 * dst_stride);
+ 
+         src0 = src8;
+     }
+@@ -2514,7 +2512,8 @@
+     SRARI_H2_UH(tmp0, tmp1, 7);
+     SAT_UH2_UH(tmp0, tmp1, 7);
+     PCKEV_B2_UB(tmp0, tmp0, tmp1, tmp1, res0, res1);
+-    ST4x4_UB(res0, res1, 0, 1, 0, 1, dst, dst_stride);
++    ST_W2(res0, 0, 1, dst, dst_stride);
++    ST_W2(res1, 0, 1, dst + 2 * dst_stride, dst_stride);
+ }
+ 
+ static void common_hv_2ht_2vt_4x8_msa(const uint8_t *src, int32_t src_stride,
+@@ -2545,8 +2544,8 @@
+     hz_out4 = HORIZ_2TAP_FILT_UH(src4, src5, mask, filt_hz, 7);
+     hz_out6 = HORIZ_2TAP_FILT_UH(src6, src7, mask, filt_hz, 7);
+     hz_out8 = HORIZ_2TAP_FILT_UH(src8, src8, mask, filt_hz, 7);
+-    SLDI_B3_UH(hz_out2, hz_out4, hz_out6, hz_out0, hz_out2, hz_out4, hz_out1,
+-               hz_out3, hz_out5, 8);
++    SLDI_B3_UH(hz_out2, hz_out0, hz_out4, hz_out2, hz_out6, hz_out4, 8, hz_out1,
++               hz_out3, hz_out5);
+     hz_out7 = (v8u16) __msa_pckod_d((v2i64) hz_out8, (v2i64) hz_out6);
+ 
+     ILVEV_B2_UB(hz_out0, hz_out1, hz_out2, hz_out3, vec0, vec1);
+@@ -2557,9 +2556,10 @@
+     SAT_UH4_UH(vec4, vec5, vec6, vec7, 7);
+     PCKEV_B4_SB(vec4, vec4, vec5, vec5, vec6, vec6, vec7, vec7,
+                 res0, res1, res2, res3);
+-    ST4x4_UB(res0, res1, 0, 1, 0, 1, dst, dst_stride);
+-    dst += (4 * dst_stride);
+-    ST4x4_UB(res2, res3, 0, 1, 0, 1, dst, dst_stride);
++    ST_W2(res0, 0, 1, dst, dst_stride);
++    ST_W2(res1, 0, 1, dst + 2 * dst_stride, dst_stride);
++    ST_W2(res2, 0, 1, dst + 4 * dst_stride, dst_stride);
++    ST_W2(res3, 0, 1, dst + 6 * dst_stride, dst_stride);
+ }
+ 
+ void ff_put_bilin_4hv_msa(uint8_t *dst, ptrdiff_t dst_stride,
+@@ -2618,7 +2618,7 @@
+     SRARI_H4_UH(tmp0, tmp1, tmp2, tmp3, 7);
+     SAT_UH4_UH(tmp0, tmp1, tmp2, tmp3, 7);
+     PCKEV_B2_SB(tmp1, tmp0, tmp3, tmp2, out0, out1);
+-    ST8x4_UB(out0, out1, dst, dst_stride);
++    ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
+ }
+ 
+ static void common_hv_2ht_2vt_8x8mult_msa(const uint8_t *src, int32_t src_stride,
+@@ -2674,8 +2674,7 @@
+         SRARI_H2_UH(tmp3, tmp4, 7);
+         SAT_UH2_UH(tmp3, tmp4, 7);
+         PCKEV_B2_SB(tmp2, tmp1, tmp4, tmp3, out0, out1);
+-        ST8x4_UB(out0, out1, dst, dst_stride);
+-        dst += (4 * dst_stride);
++        ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
+ 
+         hz_out1 = HORIZ_2TAP_FILT_UH(src1, src1, mask, filt_hz, 7);
+         vec0 = (v16u8) __msa_ilvev_b((v16i8) hz_out1, (v16i8) hz_out0);
+@@ -2696,8 +2695,8 @@
+         SRARI_H4_UH(tmp5, tmp6, tmp7, tmp8, 7);
+         SAT_UH4_UH(tmp5, tmp6, tmp7, tmp8, 7);
+         PCKEV_B2_SB(tmp6, tmp5, tmp8, tmp7, out0, out1);
+-        ST8x4_UB(out0, out1, dst, dst_stride);
+-        dst += (4 * dst_stride);
++        ST_D4(out0, out1, 0, 1, 0, 1, dst + 4 * dst_stride, dst_stride);
++        dst += (8 * dst_stride);
+     }
+ }
+ 
+@@ -2842,7 +2841,7 @@
+     res = (v16u8) __msa_pckev_b((v16i8) vec3, (v16i8) vec2);
+     res = (v16u8) __msa_aver_u_b(res, dst0);
+ 
+-    ST4x4_UB(res, res, 0, 1, 2, 3, dst, dst_stride);
++    ST_W4(res, 0, 1, 2, 3, dst, dst_stride);
+ }
+ 
+ static void common_hz_2t_and_aver_dst_4x8_msa(const uint8_t *src,
+@@ -2876,7 +2875,7 @@
+                 res2, res3);
+     ILVR_D2_UB(res1, res0, res3, res2, res0, res2);
+     AVER_UB2_UB(res0, dst0, res2, dst1, res0, res2);
+-    ST4x8_UB(res0, res2, dst, dst_stride);
++    ST_W8(res0, res2, 0, 1, 2, 3, 0, 1, 2, 3, dst, dst_stride);
+ }
+ 
+ void ff_avg_bilin_4h_msa(uint8_t *dst, ptrdiff_t dst_stride,
+@@ -3147,7 +3146,7 @@
+     for (loop_cnt = height; loop_cnt--;) {
+         LD_SB4(src, 16, src0, src2, src4, src6);
+         src7 = LD_SB(src + 56);
+-        SLDI_B3_SB(src2, src4, src6, src0, src2, src4, src1, src3, src5, 8);
++        SLDI_B3_SB(src2, src0, src4, src2, src6, src4, 8, src1, src3, src5);
+         src += src_stride;
+ 
+         VSHF_B2_UB(src0, src0, src1, src1, mask, mask, vec0, vec1);
+@@ -3202,7 +3201,7 @@
+     out = (v16u8) __msa_pckev_b((v16i8) tmp1, (v16i8) tmp0);
+     out = __msa_aver_u_b(out, dst0);
+ 
+-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
++    ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
+ }
+ 
+ static void common_vt_2t_and_aver_dst_4x8_msa(const uint8_t *src,
+@@ -3241,7 +3240,7 @@
+     SAT_UH4_UH(tmp0, tmp1, tmp2, tmp3, 7);
+     PCKEV_B2_UB(tmp1, tmp0, tmp3, tmp2, src2110, src4332);
+     AVER_UB2_UB(src2110, dst0, src4332, dst1, src2110, src4332);
+-    ST4x8_UB(src2110, src4332, dst, dst_stride);
++    ST_W8(src2110, src4332, 0, 1, 2, 3, 0, 1, 2, 3, dst, dst_stride);
+ }
+ 
+ void ff_avg_bilin_4v_msa(uint8_t *dst, ptrdiff_t dst_stride,
+@@ -3620,7 +3619,7 @@
+     out = (v16u8) __msa_pckev_b((v16i8) tmp1, (v16i8) tmp0);
+     out = __msa_aver_u_b(out, dst0);
+ 
+-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
++    ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
+ }
+ 
+ static void common_hv_2ht_2vt_and_aver_dst_4x8_msa(const uint8_t *src,
+@@ -3656,8 +3655,8 @@
+     hz_out4 = HORIZ_2TAP_FILT_UH(src4, src5, mask, filt_hz, 7);
+     hz_out6 = HORIZ_2TAP_FILT_UH(src6, src7, mask, filt_hz, 7);
+     hz_out8 = HORIZ_2TAP_FILT_UH(src8, src8, mask, filt_hz, 7);
+-    SLDI_B3_UH(hz_out2, hz_out4, hz_out6, hz_out0, hz_out2, hz_out4, hz_out1,
+-               hz_out3, hz_out5, 8);
++    SLDI_B3_UH(hz_out2, hz_out0, hz_out4, hz_out2, hz_out6, hz_out4, 8, hz_out1,
++               hz_out3, hz_out5);
+     hz_out7 = (v8u16) __msa_pckod_d((v2i64) hz_out8, (v2i64) hz_out6);
+ 
+     LW4(dst, dst_stride, tp0, tp1, tp2, tp3);
+@@ -3672,7 +3671,7 @@
+     SAT_UH4_UH(tmp0, tmp1, tmp2, tmp3, 7);
+     PCKEV_B2_UB(tmp1, tmp0, tmp3, tmp2, res0, res1);
+     AVER_UB2_UB(res0, dst0, res1, dst1, res0, res1);
+-    ST4x8_UB(res0, res1, dst, dst_stride);
++    ST_W8(res0, res1, 0, 1, 2, 3, 0, 1, 2, 3, dst, dst_stride);
+ }
+ 
+ void ff_avg_bilin_4hv_msa(uint8_t *dst, ptrdiff_t dst_stride,
+@@ -4071,14 +4070,14 @@
+         LW4(dst + 4 * dst_stride, dst_stride, tp0, tp1, tp2, tp3);
+         INSERT_W4_UB(tp0, tp1, tp2, tp3, dst1);
+         AVER_UB2_UB(src0, dst0, src1, dst1, dst0, dst1);
+-        ST4x8_UB(dst0, dst1, dst, dst_stride);
++        ST_W8(dst0, dst1, 0, 1, 2, 3, 0, 1, 2, 3, dst, dst_stride);
+     } else if (4 == height) {
+         LW4(src, src_stride, tp0, tp1, tp2, tp3);
+         INSERT_W4_UB(tp0, tp1, tp2, tp3, src0);
+         LW4(dst, dst_stride, tp0, tp1, tp2, tp3);
+         INSERT_W4_UB(tp0, tp1, tp2, tp3, dst0);
+         dst0 = __msa_aver_u_b(src0, dst0);
+-        ST4x4_UB(dst0, dst0, 0, 1, 2, 3, dst, dst_stride);
++        ST_W4(dst0, 0, 1, 2, 3, dst, dst_stride);
+     }
+ }
+ 
+@@ -4109,7 +4108,7 @@
+             INSERT_D2_UB(tp6, tp7, dst3);
+             AVER_UB4_UB(src0, dst0, src1, dst1, src2, dst2, src3, dst3, dst0,
+                         dst1, dst2, dst3);
+-            ST8x8_UB(dst0, dst1, dst2, dst3, dst, dst_stride);
++            ST_D8(dst0, dst1, dst2, dst3, 0, 1, 0, 1, 0, 1, 0, 1, dst, dst_stride);
+             dst += 8 * dst_stride;
+         }
+     } else if (4 == height) {
+@@ -4120,7 +4119,7 @@
+         INSERT_D2_UB(tp0, tp1, dst0);
+         INSERT_D2_UB(tp2, tp3, dst1);
+         AVER_UB2_UB(src0, dst0, src1, dst1, dst0, dst1);
+-        ST8x4_UB(dst0, dst1, dst, dst_stride);
++        ST_D4(dst0, dst1, 0, 1, 0, 1, dst, dst_stride);
+     }
+ }
+ 
+diff -uNra ffmpeg-4.1.6/libavcodec/mips/wmv2dsp_init_mips.c FFmpeg/libavcodec/mips/wmv2dsp_init_mips.c
+--- a/libavcodec/mips/wmv2dsp_init_mips.c	2020-07-03 23:10:59.000000000 +0800
++++ b/libavcodec/mips/wmv2dsp_init_mips.c	2020-07-19 18:19:52.764090369 +0800
+@@ -18,21 +18,17 @@
+  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+  */
+ 
++#include "libavutil/mips/cpu.h"
+ #include "config.h"
+ #include "libavutil/attributes.h"
+ #include "wmv2dsp_mips.h"
+ 
+-#if HAVE_MMI
+-static av_cold void wmv2dsp_init_mmi(WMV2DSPContext *c)
+-{
+-    c->idct_add  = ff_wmv2_idct_add_mmi;
+-    c->idct_put  = ff_wmv2_idct_put_mmi;
+-}
+-#endif /* HAVE_MMI */
+-
+ av_cold void ff_wmv2dsp_init_mips(WMV2DSPContext *c)
+ {
+-#if HAVE_MMI
+-    wmv2dsp_init_mmi(c);
+-#endif /* HAVE_MMI */
++    int cpu_flags = av_get_cpu_flags();
++
++    if (have_mmi(cpu_flags)) {
++        c->idct_add  = ff_wmv2_idct_add_mmi;
++        c->idct_put  = ff_wmv2_idct_put_mmi;
++    }
+ }
+diff -uNra ffmpeg-4.1.6/libavcodec/mips/wmv2dsp_mips.h FFmpeg/libavcodec/mips/wmv2dsp_mips.h
+--- a/libavcodec/mips/wmv2dsp_mips.h	2020-07-03 23:10:59.000000000 +0800
++++ b/libavcodec/mips/wmv2dsp_mips.h	2020-07-19 18:19:52.764090369 +0800
+@@ -23,7 +23,7 @@
+ 
+ #include "libavcodec/wmv2dsp.h"
+ 
+-void ff_wmv2_idct_add_mmi(uint8_t *dest, int line_size, int16_t *block);
+-void ff_wmv2_idct_put_mmi(uint8_t *dest, int line_size, int16_t *block);
++void ff_wmv2_idct_add_mmi(uint8_t *dest, ptrdiff_t line_size, int16_t *block);
++void ff_wmv2_idct_put_mmi(uint8_t *dest, ptrdiff_t line_size, int16_t *block);
+ 
+ #endif /* AVCODEC_MIPS_WMV2DSP_MIPS_H */
+diff -uNra ffmpeg-4.1.6/libavcodec/mips/wmv2dsp_mmi.c FFmpeg/libavcodec/mips/wmv2dsp_mmi.c
+--- a/libavcodec/mips/wmv2dsp_mmi.c	2020-07-03 23:10:59.000000000 +0800
++++ b/libavcodec/mips/wmv2dsp_mmi.c	2020-07-19 18:19:52.764090369 +0800
+@@ -95,7 +95,7 @@
+     b[56] = (a0 + a2 - a1 - a5 + 8192) >> 14;
+ }
+ 
+-void ff_wmv2_idct_add_mmi(uint8_t *dest, int line_size, int16_t *block)
++void ff_wmv2_idct_add_mmi(uint8_t *dest, ptrdiff_t line_size, int16_t *block)
+ {
+     int i;
+     double ftmp[11];
+@@ -212,7 +212,7 @@
+     );
+ }
+ 
+-void ff_wmv2_idct_put_mmi(uint8_t *dest, int line_size, int16_t *block)
++void ff_wmv2_idct_put_mmi(uint8_t *dest, ptrdiff_t line_size, int16_t *block)
+ {
+     int i;
+     double ftmp[8];
+diff -uNra ffmpeg-4.1.6/libavcodec/mips/xvididct_init_mips.c FFmpeg/libavcodec/mips/xvididct_init_mips.c
+--- a/libavcodec/mips/xvididct_init_mips.c	2020-04-28 05:48:15.000000000 +0800
++++ b/libavcodec/mips/xvididct_init_mips.c	2020-07-19 18:19:52.764090369 +0800
+@@ -18,28 +18,23 @@
+  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+  */
+ 
++#include "libavutil/mips/cpu.h"
+ #include "xvididct_mips.h"
+ 
+-#if HAVE_MMI
+-static av_cold void xvid_idct_init_mmi(IDCTDSPContext *c, AVCodecContext *avctx,
++av_cold void ff_xvid_idct_init_mips(IDCTDSPContext *c, AVCodecContext *avctx,
+         unsigned high_bit_depth)
+ {
+-    if (!high_bit_depth) {
+-        if (avctx->idct_algo == FF_IDCT_AUTO ||
+-                avctx->idct_algo == FF_IDCT_XVID) {
+-            c->idct_put = ff_xvid_idct_put_mmi;
+-            c->idct_add = ff_xvid_idct_add_mmi;
+-            c->idct = ff_xvid_idct_mmi;
+-            c->perm_type = FF_IDCT_PERM_NONE;
++    int cpu_flags = av_get_cpu_flags();
++
++    if (have_mmi(cpu_flags)) {
++        if (!high_bit_depth) {
++            if (avctx->idct_algo == FF_IDCT_AUTO ||
++                    avctx->idct_algo == FF_IDCT_XVID) {
++                c->idct_put = ff_xvid_idct_put_mmi;
++                c->idct_add = ff_xvid_idct_add_mmi;
++                c->idct = ff_xvid_idct_mmi;
++                c->perm_type = FF_IDCT_PERM_NONE;
++            }
+         }
+     }
+ }
+-#endif /* HAVE_MMI */
+-
+-av_cold void ff_xvid_idct_init_mips(IDCTDSPContext *c, AVCodecContext *avctx,
+-        unsigned high_bit_depth)
+-{
+-#if HAVE_MMI
+-    xvid_idct_init_mmi(c, avctx, high_bit_depth);
+-#endif /* HAVE_MMI */
+-}
+diff -uNra ffmpeg-4.1.6/libavcodec/mips/xvididct_mips.h FFmpeg/libavcodec/mips/xvididct_mips.h
+--- a/libavcodec/mips/xvididct_mips.h	2020-04-28 05:48:15.000000000 +0800
++++ b/libavcodec/mips/xvididct_mips.h	2020-07-19 18:19:52.764090369 +0800
+@@ -24,7 +24,7 @@
+ #include "libavcodec/xvididct.h"
+ 
+ void ff_xvid_idct_mmi(int16_t *block);
+-void ff_xvid_idct_put_mmi(uint8_t *dest, int32_t line_size, int16_t *block);
+-void ff_xvid_idct_add_mmi(uint8_t *dest, int32_t line_size, int16_t *block);
++void ff_xvid_idct_put_mmi(uint8_t *dest, ptrdiff_t line_size, int16_t *block);
++void ff_xvid_idct_add_mmi(uint8_t *dest, ptrdiff_t line_size, int16_t *block);
+ 
+ #endif /* AVCODEC_MIPS_XVIDIDCT_MIPS_H */
+diff -uNra ffmpeg-4.1.6/libavcodec/mips/xvid_idct_mmi.c FFmpeg/libavcodec/mips/xvid_idct_mmi.c
+--- a/libavcodec/mips/xvid_idct_mmi.c	2020-04-28 05:48:15.000000000 +0800
++++ b/libavcodec/mips/xvid_idct_mmi.c	2020-07-19 18:19:52.764090369 +0800
+@@ -240,13 +240,13 @@
+     );
+ }
+ 
+-void ff_xvid_idct_put_mmi(uint8_t *dest, int32_t line_size, int16_t *block)
++void ff_xvid_idct_put_mmi(uint8_t *dest, ptrdiff_t line_size, int16_t *block)
+ {
+     ff_xvid_idct_mmi(block);
+     ff_put_pixels_clamped_mmi(block, dest, line_size);
+ }
+ 
+-void ff_xvid_idct_add_mmi(uint8_t *dest, int32_t line_size, int16_t *block)
++void ff_xvid_idct_add_mmi(uint8_t *dest, ptrdiff_t line_size, int16_t *block)
+ {
+     ff_xvid_idct_mmi(block);
+     ff_add_pixels_clamped_mmi(block, dest, line_size);
+diff -uNra ffmpeg-4.1.6/libavcodec/tests/.gitignore FFmpeg/libavcodec/tests/.gitignore
+diff -uNra ffmpeg-4.1.6/libavcodec/vp3dsp.c FFmpeg/libavcodec/vp3dsp.c
+--- a/libavcodec/vp3dsp.c	2020-07-03 23:10:59.000000000 +0800
++++ b/libavcodec/vp3dsp.c	2020-07-19 18:19:52.896976294 +0800
+@@ -293,4 +293,6 @@
+         ff_vp3dsp_init_ppc(c, flags);
+     if (ARCH_X86)
+         ff_vp3dsp_init_x86(c, flags);
++    if (ARCH_MIPS)
++        ff_vp3dsp_init_mips(c, flags);
+ }
+diff -uNra ffmpeg-4.1.6/libavcodec/vp3dsp.h FFmpeg/libavcodec/vp3dsp.h
+--- a/libavcodec/vp3dsp.h	2020-07-03 23:10:59.000000000 +0800
++++ b/libavcodec/vp3dsp.h	2020-07-19 18:19:52.896976294 +0800
+@@ -49,5 +49,6 @@
+ void ff_vp3dsp_init_arm(VP3DSPContext *c, int flags);
+ void ff_vp3dsp_init_ppc(VP3DSPContext *c, int flags);
+ void ff_vp3dsp_init_x86(VP3DSPContext *c, int flags);
++void ff_vp3dsp_init_mips(VP3DSPContext *c, int flags);
+ 
+ #endif /* AVCODEC_VP3DSP_H */
+diff -uNra ffmpeg-4.1.6/libavdevice/.gitignore FFmpeg/libavdevice/.gitignore
+diff -uNra ffmpeg-4.1.6/libavdevice/tests/.gitignore FFmpeg/libavdevice/tests/.gitignore
+diff -uNra ffmpeg-4.1.6/libavfilter/.gitignore FFmpeg/libavfilter/.gitignore
+diff -uNra ffmpeg-4.1.6/libavfilter/opencl/.gitignore FFmpeg/libavfilter/opencl/.gitignore
+diff -uNra ffmpeg-4.1.6/libavfilter/tests/.gitignore FFmpeg/libavfilter/tests/.gitignore
+diff -uNra ffmpeg-4.1.6/libavformat/.gitignore FFmpeg/libavformat/.gitignore
+diff -uNra ffmpeg-4.1.6/libavformat/tests/.gitignore FFmpeg/libavformat/tests/.gitignore
+diff -uNra ffmpeg-4.1.6/libavresample/tests/.gitignore FFmpeg/libavresample/tests/.gitignore
+diff -uNra ffmpeg-4.1.6/libavutil/cpu.c FFmpeg/libavutil/cpu.c
+--- a/libavutil/cpu.c	2020-07-05 06:36:02.000000000 +0800
++++ b/libavutil/cpu.c	2020-07-19 18:13:58.333876574 +0800
+@@ -51,6 +51,8 @@
+ 
+ static int get_cpu_flags(void)
+ {
++    if (ARCH_MIPS)
++        return ff_get_cpu_flags_mips();
+     if (ARCH_AARCH64)
+         return ff_get_cpu_flags_aarch64();
+     if (ARCH_ARM)
+@@ -169,6 +171,9 @@
+         { "armv8",    NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_CPU_FLAG_ARMV8    },    .unit = "flags" },
+         { "neon",     NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_CPU_FLAG_NEON     },    .unit = "flags" },
+         { "vfp",      NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_CPU_FLAG_VFP      },    .unit = "flags" },
++#elif ARCH_MIPS
++        { "mmi",      NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_CPU_FLAG_MMI      },    .unit = "flags" },
++        { "msa",      NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_CPU_FLAG_MSA      },    .unit = "flags" },
+ #endif
+         { NULL },
+     };
+@@ -250,6 +255,9 @@
+         { "armv8",    NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_CPU_FLAG_ARMV8    },    .unit = "flags" },
+         { "neon",     NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_CPU_FLAG_NEON     },    .unit = "flags" },
+         { "vfp",      NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_CPU_FLAG_VFP      },    .unit = "flags" },
++#elif ARCH_MIPS
++        { "mmi",      NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_CPU_FLAG_MMI      },    .unit = "flags" },
++        { "msa",      NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_CPU_FLAG_MSA      },    .unit = "flags" },
+ #endif
+         { NULL },
+     };
+@@ -308,6 +316,8 @@
+ 
+ size_t av_cpu_max_align(void)
+ {
++    if (ARCH_MIPS)
++        return ff_get_cpu_max_align_mips();
+     if (ARCH_AARCH64)
+         return ff_get_cpu_max_align_aarch64();
+     if (ARCH_ARM)
+diff -uNra ffmpeg-4.1.6/libavutil/cpu.h FFmpeg/libavutil/cpu.h
+--- a/libavutil/cpu.h	2020-07-05 06:36:02.000000000 +0800
++++ b/libavutil/cpu.h	2020-07-19 18:13:58.337784983 +0800
+@@ -71,6 +71,9 @@
+ #define AV_CPU_FLAG_VFP_VM       (1 << 7) ///< VFPv2 vector mode, deprecated in ARMv7-A and unavailable in various CPUs implementations
+ #define AV_CPU_FLAG_SETEND       (1 <<16)
+ 
++#define AV_CPU_FLAG_MMI          (1 << 0)
++#define AV_CPU_FLAG_MSA          (1 << 1)
++
+ /**
+  * Return the flags which specify extensions supported by the CPU.
+  * The returned value is affected by av_force_cpu_flags() if that was used
+diff -uNra ffmpeg-4.1.6/libavutil/cpu_internal.h FFmpeg/libavutil/cpu_internal.h
+--- a/libavutil/cpu_internal.h	2020-07-05 06:36:02.000000000 +0800
++++ b/libavutil/cpu_internal.h	2020-07-19 18:13:58.337784983 +0800
+@@ -41,11 +41,13 @@
+ #define CPUEXT_FAST(flags, cpuext) CPUEXT_SUFFIX_FAST(flags, , cpuext)
+ #define CPUEXT_SLOW(flags, cpuext) CPUEXT_SUFFIX_SLOW(flags, , cpuext)
+ 
++int ff_get_cpu_flags_mips(void);
+ int ff_get_cpu_flags_aarch64(void);
+ int ff_get_cpu_flags_arm(void);
+ int ff_get_cpu_flags_ppc(void);
+ int ff_get_cpu_flags_x86(void);
+ 
++size_t ff_get_cpu_max_align_mips(void);
+ size_t ff_get_cpu_max_align_aarch64(void);
+ size_t ff_get_cpu_max_align_arm(void);
+ size_t ff_get_cpu_max_align_ppc(void);
+diff -uNra ffmpeg-4.1.6/libavutil/.gitignore FFmpeg/libavutil/.gitignore
+diff -uNra ffmpeg-4.1.6/libavutil/mips/asmdefs.h FFmpeg/libavutil/mips/asmdefs.h
+--- a/libavutil/mips/asmdefs.h	2020-05-21 23:55:31.000000000 +0800
++++ b/libavutil/mips/asmdefs.h	2020-07-19 18:19:53.272183614 +0800
+@@ -55,4 +55,46 @@
+ # define PTR_SLL        "sll "
+ #endif
+ 
++/*
++ * parse_r var, r - Helper assembler macro for parsing register names.
++ *
++ * This converts the register name in $n form provided in \r to the
++ * corresponding register number, which is assigned to the variable \var. It is
++ * needed to allow explicit encoding of instructions in inline assembly where
++ * registers are chosen by the compiler in $n form, allowing us to avoid using
++ * fixed register numbers.
++ *
++ * It also allows newer instructions (not implemented by the assembler) to be
++ * transparently implemented using assembler macros, instead of needing separate
++ * cases depending on toolchain support.
++ *
++ * Simple usage example:
++ * __asm__ __volatile__("parse_r __rt, %0\n\t"
++ *			".insn\n\t"
++ *			"# di    %0\n\t"
++ *			".word   (0x41606000 | (__rt << 16))"
++ *			: "=r" (status);
++ */
++
++/* Match an individual register number and assign to \var */
++#define _IFC_REG(n)				\
++	".ifc	\\r, $" #n "\n\t"		\
++	"\\var	= " #n "\n\t"			\
++	".endif\n\t"
++
++__asm__(".macro	parse_r var r\n\t"
++	"\\var	= -1\n\t"
++	_IFC_REG(0)  _IFC_REG(1)  _IFC_REG(2)  _IFC_REG(3)
++	_IFC_REG(4)  _IFC_REG(5)  _IFC_REG(6)  _IFC_REG(7)
++	_IFC_REG(8)  _IFC_REG(9)  _IFC_REG(10) _IFC_REG(11)
++	_IFC_REG(12) _IFC_REG(13) _IFC_REG(14) _IFC_REG(15)
++	_IFC_REG(16) _IFC_REG(17) _IFC_REG(18) _IFC_REG(19)
++	_IFC_REG(20) _IFC_REG(21) _IFC_REG(22) _IFC_REG(23)
++	_IFC_REG(24) _IFC_REG(25) _IFC_REG(26) _IFC_REG(27)
++	_IFC_REG(28) _IFC_REG(29) _IFC_REG(30) _IFC_REG(31)
++	".iflt	\\var\n\t"
++	".error	\"Unable to parse register name \\r\"\n\t"
++	".endif\n\t"
++	".endm");
++
+ #endif /* AVCODEC_MIPS_ASMDEFS_H */
+diff -uNra ffmpeg-4.1.6/libavutil/mips/cpu.c FFmpeg/libavutil/mips/cpu.c
+--- a/libavutil/mips/cpu.c	1970-01-01 08:00:00.000000000 +0800
++++ b/libavutil/mips/cpu.c	2020-07-19 18:19:53.272183614 +0800
+@@ -0,0 +1,134 @@
++/*
++ * This file is part of FFmpeg.
++ *
++ * FFmpeg is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * FFmpeg is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with FFmpeg; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
++ */
++
++#include "libavutil/cpu.h"
++#include "libavutil/cpu_internal.h"
++#include "config.h"
++#if defined __linux__ || defined __ANDROID__
++#include <stdint.h>
++#include <stdio.h>
++#include <string.h>
++#include <sys/auxv.h>
++#include "asmdefs.h"
++#include "libavutil/avstring.h"
++#endif
++
++#if defined __linux__ || defined __ANDROID__
++
++#define HWCAP_LOONGSON_CPUCFG (1 << 14)
++
++static int cpucfg_available(void)
++{
++    return getauxval(AT_HWCAP) & HWCAP_LOONGSON_CPUCFG;
++}
++
++/* Most toolchains have no CPUCFG support yet */
++static uint32_t read_cpucfg(uint32_t reg)
++{
++	uint32_t __res;
++
++	__asm__ __volatile__(
++		"parse_r __res,%0\n\t"
++		"parse_r reg,%1\n\t"
++		".insn \n\t"
++		".word (0xc8080118 | (reg << 21) | (__res << 11))\n\t"
++		:"=r"(__res)
++		:"r"(reg)
++		:
++		);
++	return __res;
++}
++
++#define LOONGSON_CFG1 0x1
++
++#define LOONGSON_CFG1_MMI	(1 << 4)
++#define LOONGSON_CFG1_MSA1	(1 << 5)
++
++static int cpu_flags_cpucfg(void)
++{
++    int flags = 0;
++    uint32_t cfg1 = read_cpucfg(LOONGSON_CFG1);
++
++    if (cfg1 & LOONGSON_CFG1_MMI)
++        flags |= AV_CPU_FLAG_MMI;
++
++    if (cfg1 & LOONGSON_CFG1_MSA1)
++        flags |= AV_CPU_FLAG_MSA;
++
++    return flags;
++}
++
++static int cpu_flags_cpuinfo(void)
++{
++    FILE *f = fopen("/proc/cpuinfo", "r");
++    char buf[200];
++    int flags = 0;
++
++    if (!f)
++        return -1;
++
++    while (fgets(buf, sizeof(buf), f)) {
++        /* Legacy kernel may not export MMI in ASEs implemented */
++        if (av_strstart(buf, "cpu model", NULL)) {
++            if (strstr(buf, "Loongson-3 "))
++                flags |= AV_CPU_FLAG_MMI;
++        }
++
++        if (av_strstart(buf, "ASEs implemented", NULL)) {
++            if (strstr(buf, " loongson-mmi"))
++                flags |= AV_CPU_FLAG_MMI;
++            if (strstr(buf, " msa"))
++                flags |= AV_CPU_FLAG_MSA;
++
++            break;
++        }
++    }
++    fclose(f);
++    return flags;
++}
++#endif
++
++int ff_get_cpu_flags_mips(void)
++{
++#if defined __linux__ || defined __ANDROID__
++    if (cpucfg_available())
++        return cpu_flags_cpucfg();
++    else
++        return cpu_flags_cpuinfo();
++#else
++    /* Assume no SIMD ASE supported */
++    return 0;
++#endif
++}
++
++size_t ff_get_cpu_max_align_mips(void)
++{
++    int flags = av_get_cpu_flags();
++
++    if (flags & AV_CPU_FLAG_MSA)
++        return 16;
++
++    /*
++     * MMI itself is 64-bit but quad word load & store
++     * needs 128-bit align.
++     */
++    if (flags & AV_CPU_FLAG_MMI)
++        return 16;
++
++    return 8;
++}
+diff -uNra ffmpeg-4.1.6/libavutil/mips/cpu.h FFmpeg/libavutil/mips/cpu.h
+--- a/libavutil/mips/cpu.h	1970-01-01 08:00:00.000000000 +0800
++++ b/libavutil/mips/cpu.h	2020-07-19 18:13:58.361235441 +0800
+@@ -0,0 +1,28 @@
++/*
++ * This file is part of FFmpeg.
++ *
++ * FFmpeg is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * FFmpeg is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with FFmpeg; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
++ */
++
++#ifndef AVUTIL_MIPS_CPU_H
++#define AVUTIL_MIPS_CPU_H
++
++#include "libavutil/cpu.h"
++#include "libavutil/cpu_internal.h"
++
++#define have_mmi(flags) CPUEXT(flags, MMI)
++#define have_msa(flags) CPUEXT(flags, MSA)
++
++#endif /* AVUTIL_MIPS_CPU_H */
+diff -uNra ffmpeg-4.1.6/libavutil/mips/generic_macros_msa.h FFmpeg/libavutil/mips/generic_macros_msa.h
+--- a/libavutil/mips/generic_macros_msa.h	2020-07-05 06:36:02.000000000 +0800
++++ b/libavutil/mips/generic_macros_msa.h	2020-07-19 18:19:53.276092023 +0800
+@@ -294,6 +294,7 @@
+ #define LD_SB4(...) LD_V4(v16i8, __VA_ARGS__)
+ #define LD_UH4(...) LD_V4(v8u16, __VA_ARGS__)
+ #define LD_SH4(...) LD_V4(v8i16, __VA_ARGS__)
++#define LD_SW4(...) LD_V4(v4i32, __VA_ARGS__)
+ 
+ #define LD_V5(RTYPE, psrc, stride, out0, out1, out2, out3, out4)  \
+ {                                                                 \
+@@ -332,6 +333,7 @@
+ #define LD_SB8(...) LD_V8(v16i8, __VA_ARGS__)
+ #define LD_UH8(...) LD_V8(v8u16, __VA_ARGS__)
+ #define LD_SH8(...) LD_V8(v8i16, __VA_ARGS__)
++#define LD_SW8(...) LD_V8(v4i32, __VA_ARGS__)
+ 
+ #define LD_V16(RTYPE, psrc, stride,                                   \
+                out0, out1, out2, out3, out4, out5, out6, out7,        \
+@@ -344,19 +346,6 @@
+ }
+ #define LD_SH16(...) LD_V16(v8i16, __VA_ARGS__)
+ 
+-/* Description : Load as 4x4 block of signed halfword elements from 1D source
+-                 data into 4 vectors (Each vector with 4 signed halfwords)
+-   Arguments   : Inputs  - psrc
+-                 Outputs - out0, out1, out2, out3
+-*/
+-#define LD4x4_SH(psrc, out0, out1, out2, out3)                \
+-{                                                             \
+-    out0 = LD_SH(psrc);                                       \
+-    out2 = LD_SH(psrc + 8);                                   \
+-    out1 = (v8i16) __msa_ilvl_d((v2i64) out0, (v2i64) out0);  \
+-    out3 = (v8i16) __msa_ilvl_d((v2i64) out2, (v2i64) out2);  \
+-}
+-
+ /* Description : Store vectors with stride
+    Arguments   : Inputs  - in0, in1, stride
+                  Outputs - pdst    (destination pointer to store to)
+@@ -400,198 +389,127 @@
+ #define ST_SH8(...) ST_V8(v8i16, __VA_ARGS__)
+ #define ST_SW8(...) ST_V8(v4i32, __VA_ARGS__)
+ 
+-/* Description : Store as 2x4 byte block to destination memory from input vector
+-   Arguments   : Inputs  - in, stidx, pdst, stride
+-                 Return Type - unsigned byte
+-   Details     : Index stidx halfword element from 'in' vector is copied and
+-                 stored on first line
+-                 Index stidx+1 halfword element from 'in' vector is copied and
+-                 stored on second line
+-                 Index stidx+2 halfword element from 'in' vector is copied and
+-                 stored on third line
+-                 Index stidx+3 halfword element from 'in' vector is copied and
+-                 stored on fourth line
+-*/
+-#define ST2x4_UB(in, stidx, pdst, stride)              \
+-{                                                      \
+-    uint16_t out0_m, out1_m, out2_m, out3_m;           \
+-    uint8_t *pblk_2x4_m = (uint8_t *) (pdst);          \
+-                                                       \
+-    out0_m = __msa_copy_u_h((v8i16) in, (stidx));      \
+-    out1_m = __msa_copy_u_h((v8i16) in, (stidx + 1));  \
+-    out2_m = __msa_copy_u_h((v8i16) in, (stidx + 2));  \
+-    out3_m = __msa_copy_u_h((v8i16) in, (stidx + 3));  \
+-                                                       \
+-    SH(out0_m, pblk_2x4_m);                            \
+-    SH(out1_m, pblk_2x4_m + stride);                   \
+-    SH(out2_m, pblk_2x4_m + 2 * stride);               \
+-    SH(out3_m, pblk_2x4_m + 3 * stride);               \
++/* Description : Store half word elements of vector with stride
++ * Arguments   : Inputs  - in   source vector
++ *                       - pdst    (destination pointer to store to)
++ *                       - stride
++ * Details     : Stores half word 'idx0' from 'in' to (pdst)
++ *               Stores half word 'idx1' from 'in' to (pdst + stride)
++ *               Similar for other elements
++ */
++#define ST_H1(in, idx, pdst)                             \
++{                                                        \
++    uint16_t out0_m;                                     \
++    out0_m = __msa_copy_u_h((v8i16) in, idx);            \
++    SH(out0_m, (pdst));                                  \
+ }
+-
+-/* Description : Store as 4x2 byte block to destination memory from input vector
+-   Arguments   : Inputs  - in, pdst, stride
+-                 Return Type - unsigned byte
+-   Details     : Index 0 word element from input vector is copied and stored
+-                 on first line
+-                 Index 1 word element from input vector is copied and stored
+-                 on second line
+-*/
+-#define ST4x2_UB(in, pdst, stride)             \
+-{                                              \
+-    uint32_t out0_m, out1_m;                   \
+-    uint8_t *pblk_4x2_m = (uint8_t *) (pdst);  \
+-                                               \
+-    out0_m = __msa_copy_u_w((v4i32) in, 0);    \
+-    out1_m = __msa_copy_u_w((v4i32) in, 1);    \
+-                                               \
+-    SW(out0_m, pblk_4x2_m);                    \
+-    SW(out1_m, pblk_4x2_m + stride);           \
++#define ST_H2(in, idx0, idx1, pdst, stride)              \
++{                                                        \
++    uint16_t out0_m, out1_m;                             \
++    out0_m = __msa_copy_u_h((v8i16) in, idx0);           \
++    out1_m = __msa_copy_u_h((v8i16) in, idx1);           \
++    SH(out0_m, (pdst));                                  \
++    SH(out1_m, (pdst) + stride);                         \
++}
++#define ST_H4(in, idx0, idx1, idx2, idx3, pdst, stride)  \
++{                                                        \
++    uint16_t out0_m, out1_m, out2_m, out3_m;             \
++    out0_m = __msa_copy_u_h((v8i16) in, idx0);           \
++    out1_m = __msa_copy_u_h((v8i16) in, idx1);           \
++    out2_m = __msa_copy_u_h((v8i16) in, idx2);           \
++    out3_m = __msa_copy_u_h((v8i16) in, idx3);           \
++    SH(out0_m, (pdst));                                  \
++    SH(out1_m, (pdst) + stride);                         \
++    SH(out2_m, (pdst) + 2 * stride);                     \
++    SH(out3_m, (pdst) + 3 * stride);                     \
++}
++#define ST_H8(in, idx0, idx1, idx2, idx3, idx4, idx5,            \
++              idx6, idx7, pdst, stride)                          \
++{                                                                \
++    ST_H4(in, idx0, idx1, idx2, idx3, pdst, stride)              \
++    ST_H4(in, idx4, idx5, idx6, idx7, (pdst) + 4*stride, stride) \
+ }
+ 
+-/* Description : Store as 4x4 byte block to destination memory from input vector
+-   Arguments   : Inputs  - in0, in1, pdst, stride
+-                 Return Type - unsigned byte
+-   Details     : Idx0 word element from input vector 'in0' is copied and stored
+-                 on first line
+-                 Idx1 word element from input vector 'in0' is copied and stored
+-                 on second line
+-                 Idx2 word element from input vector 'in1' is copied and stored
+-                 on third line
+-                 Idx3 word element from input vector 'in1' is copied and stored
+-                 on fourth line
+-*/
+-#define ST4x4_UB(in0, in1, idx0, idx1, idx2, idx3, pdst, stride)  \
+-{                                                                 \
+-    uint32_t out0_m, out1_m, out2_m, out3_m;                      \
+-    uint8_t *pblk_4x4_m = (uint8_t *) (pdst);                     \
+-                                                                  \
+-    out0_m = __msa_copy_u_w((v4i32) in0, idx0);                   \
+-    out1_m = __msa_copy_u_w((v4i32) in0, idx1);                   \
+-    out2_m = __msa_copy_u_w((v4i32) in1, idx2);                   \
+-    out3_m = __msa_copy_u_w((v4i32) in1, idx3);                   \
+-                                                                  \
+-    SW4(out0_m, out1_m, out2_m, out3_m, pblk_4x4_m, stride);      \
++/* Description : Store word elements of vector with stride
++ * Arguments   : Inputs  - in   source vector
++ *                       - pdst    (destination pointer to store to)
++ *                       - stride
++ * Details     : Stores word 'idx0' from 'in' to (pdst)
++ *               Stores word 'idx1' from 'in' to (pdst + stride)
++ *               Similar for other elements
++ */
++#define ST_W1(in, idx, pdst)                             \
++{                                                        \
++    uint32_t out0_m;                                     \
++    out0_m = __msa_copy_u_w((v4i32) in, idx);            \
++    SW(out0_m, (pdst));                                  \
+ }
+-#define ST4x8_UB(in0, in1, pdst, stride)                            \
+-{                                                                   \
+-    uint8_t *pblk_4x8 = (uint8_t *) (pdst);                         \
+-                                                                    \
+-    ST4x4_UB(in0, in0, 0, 1, 2, 3, pblk_4x8, stride);               \
+-    ST4x4_UB(in1, in1, 0, 1, 2, 3, pblk_4x8 + 4 * stride, stride);  \
++#define ST_W2(in, idx0, idx1, pdst, stride)              \
++{                                                        \
++    uint32_t out0_m, out1_m;                             \
++    out0_m = __msa_copy_u_w((v4i32) in, idx0);           \
++    out1_m = __msa_copy_u_w((v4i32) in, idx1);           \
++    SW(out0_m, (pdst));                                  \
++    SW(out1_m, (pdst) + stride);                         \
++}
++#define ST_W4(in, idx0, idx1, idx2, idx3, pdst, stride)  \
++{                                                        \
++    uint32_t out0_m, out1_m, out2_m, out3_m;             \
++    out0_m = __msa_copy_u_w((v4i32) in, idx0);           \
++    out1_m = __msa_copy_u_w((v4i32) in, idx1);           \
++    out2_m = __msa_copy_u_w((v4i32) in, idx2);           \
++    out3_m = __msa_copy_u_w((v4i32) in, idx3);           \
++    SW(out0_m, (pdst));                                  \
++    SW(out1_m, (pdst) + stride);                         \
++    SW(out2_m, (pdst) + 2*stride);                       \
++    SW(out3_m, (pdst) + 3*stride);                       \
++}
++#define ST_W8(in0, in1, idx0, idx1, idx2, idx3,                 \
++              idx4, idx5, idx6, idx7, pdst, stride)             \
++{                                                               \
++    ST_W4(in0, idx0, idx1, idx2, idx3, pdst, stride)            \
++    ST_W4(in1, idx4, idx5, idx6, idx7, pdst + 4*stride, stride) \
+ }
+ 
+-/* Description : Store as 6x4 byte block to destination memory from input
+-                 vectors
+-   Arguments   : Inputs  - in0, in1, pdst, stride
+-                 Return Type - unsigned byte
+-   Details     : Index 0 word element from input vector 'in0' is copied and
+-                 stored on first line followed by index 2 halfword element
+-                 Index 2 word element from input vector 'in0' is copied and
+-                 stored on second line followed by index 2 halfword element
+-                 Index 0 word element from input vector 'in1' is copied and
+-                 stored on third line followed by index 2 halfword element
+-                 Index 2 word element from input vector 'in1' is copied and
+-                 stored on fourth line followed by index 2 halfword element
+-*/
+-#define ST6x4_UB(in0, in1, pdst, stride)       \
++/* Description : Store double word elements of vector with stride
++ * Arguments   : Inputs  - in   source vector
++ *                       - pdst    (destination pointer to store to)
++ *                       - stride
++ * Details     : Stores double word 'idx0' from 'in' to (pdst)
++ *               Stores double word 'idx1' from 'in' to (pdst + stride)
++ *               Similar for other elements
++ */
++#define ST_D1(in, idx, pdst)                   \
+ {                                              \
+-    uint32_t out0_m, out1_m, out2_m, out3_m;   \
+-    uint16_t out4_m, out5_m, out6_m, out7_m;   \
+-    uint8_t *pblk_6x4_m = (uint8_t *) (pdst);  \
+-                                               \
+-    out0_m = __msa_copy_u_w((v4i32) in0, 0);   \
+-    out1_m = __msa_copy_u_w((v4i32) in0, 2);   \
+-    out2_m = __msa_copy_u_w((v4i32) in1, 0);   \
+-    out3_m = __msa_copy_u_w((v4i32) in1, 2);   \
+-                                               \
+-    out4_m = __msa_copy_u_h((v8i16) in0, 2);   \
+-    out5_m = __msa_copy_u_h((v8i16) in0, 6);   \
+-    out6_m = __msa_copy_u_h((v8i16) in1, 2);   \
+-    out7_m = __msa_copy_u_h((v8i16) in1, 6);   \
+-                                               \
+-    SW(out0_m, pblk_6x4_m);                    \
+-    SH(out4_m, (pblk_6x4_m + 4));              \
+-    pblk_6x4_m += stride;                      \
+-    SW(out1_m, pblk_6x4_m);                    \
+-    SH(out5_m, (pblk_6x4_m + 4));              \
+-    pblk_6x4_m += stride;                      \
+-    SW(out2_m, pblk_6x4_m);                    \
+-    SH(out6_m, (pblk_6x4_m + 4));              \
+-    pblk_6x4_m += stride;                      \
+-    SW(out3_m, pblk_6x4_m);                    \
+-    SH(out7_m, (pblk_6x4_m + 4));              \
+-}
+-
+-/* Description : Store as 8x1 byte block to destination memory from input vector
+-   Arguments   : Inputs  - in, pdst
+-   Details     : Index 0 double word element from input vector 'in' is copied
+-                 and stored to destination memory at (pdst)
+-*/
+-#define ST8x1_UB(in, pdst)                   \
+-{                                            \
+-    uint64_t out0_m;                         \
+-    out0_m = __msa_copy_u_d((v2i64) in, 0);  \
+-    SD(out0_m, pdst);                        \
+-}
+-
+-/* Description : Store as 8x2 byte block to destination memory from input vector
+-   Arguments   : Inputs  - in, pdst, stride
+-   Details     : Index 0 double word element from input vector 'in' is copied
+-                 and stored to destination memory at (pdst)
+-                 Index 1 double word element from input vector 'in' is copied
+-                 and stored to destination memory at (pdst + stride)
+-*/
+-#define ST8x2_UB(in, pdst, stride)             \
++    uint64_t out0_m;                           \
++    out0_m = __msa_copy_u_d((v2i64) in, idx);  \
++    SD(out0_m, (pdst));                        \
++}
++#define ST_D2(in, idx0, idx1, pdst, stride)    \
+ {                                              \
+     uint64_t out0_m, out1_m;                   \
+-    uint8_t *pblk_8x2_m = (uint8_t *) (pdst);  \
+-                                               \
+-    out0_m = __msa_copy_u_d((v2i64) in, 0);    \
+-    out1_m = __msa_copy_u_d((v2i64) in, 1);    \
+-                                               \
+-    SD(out0_m, pblk_8x2_m);                    \
+-    SD(out1_m, pblk_8x2_m + stride);           \
++    out0_m = __msa_copy_u_d((v2i64) in, idx0); \
++    out1_m = __msa_copy_u_d((v2i64) in, idx1); \
++    SD(out0_m, (pdst));                        \
++    SD(out1_m, (pdst) + stride);               \
+ }
+-
+-/* Description : Store as 8x4 byte block to destination memory from input
+-                 vectors
+-   Arguments   : Inputs  - in0, in1, pdst, stride
+-   Details     : Index 0 double word element from input vector 'in0' is copied
+-                 and stored to destination memory at (pblk_8x4_m)
+-                 Index 1 double word element from input vector 'in0' is copied
+-                 and stored to destination memory at (pblk_8x4_m + stride)
+-                 Index 0 double word element from input vector 'in1' is copied
+-                 and stored to destination memory at (pblk_8x4_m + 2 * stride)
+-                 Index 1 double word element from input vector 'in1' is copied
+-                 and stored to destination memory at (pblk_8x4_m + 3 * stride)
+-*/
+-#define ST8x4_UB(in0, in1, pdst, stride)                      \
++#define ST_D4(in0, in1, idx0, idx1, idx2, idx3, pdst, stride) \
+ {                                                             \
+     uint64_t out0_m, out1_m, out2_m, out3_m;                  \
+-    uint8_t *pblk_8x4_m = (uint8_t *) (pdst);                 \
+-                                                              \
+-    out0_m = __msa_copy_u_d((v2i64) in0, 0);                  \
+-    out1_m = __msa_copy_u_d((v2i64) in0, 1);                  \
+-    out2_m = __msa_copy_u_d((v2i64) in1, 0);                  \
+-    out3_m = __msa_copy_u_d((v2i64) in1, 1);                  \
+-                                                              \
+-    SD4(out0_m, out1_m, out2_m, out3_m, pblk_8x4_m, stride);  \
++    out0_m = __msa_copy_u_d((v2i64) in0, idx0);               \
++    out1_m = __msa_copy_u_d((v2i64) in0, idx1);               \
++    out2_m = __msa_copy_u_d((v2i64) in1, idx2);               \
++    out3_m = __msa_copy_u_d((v2i64) in1, idx3);               \
++    SD(out0_m, (pdst));                                       \
++    SD(out1_m, (pdst) + stride);                              \
++    SD(out2_m, (pdst) + 2 * stride);                          \
++    SD(out3_m, (pdst) + 3 * stride);                          \
+ }
+-#define ST8x8_UB(in0, in1, in2, in3, pdst, stride)        \
+-{                                                         \
+-    uint8_t *pblk_8x8_m = (uint8_t *) (pdst);             \
+-                                                          \
+-    ST8x4_UB(in0, in1, pblk_8x8_m, stride);               \
+-    ST8x4_UB(in2, in3, pblk_8x8_m + 4 * stride, stride);  \
+-}
+-#define ST12x4_UB(in0, in1, in2, pdst, stride)                \
+-{                                                             \
+-    uint8_t *pblk_12x4_m = (uint8_t *) (pdst);                \
+-                                                              \
+-    /* left 8x4 */                                            \
+-    ST8x4_UB(in0, in1, pblk_12x4_m, stride);                  \
+-    /* right 4x4 */                                           \
+-    ST4x4_UB(in2, in2, 0, 1, 2, 3, pblk_12x4_m + 8, stride);  \
++#define ST_D8(in0, in1, in2, in3, idx0, idx1, idx2, idx3,              \
++              idx4, idx5, idx6, idx7, pdst, stride)                    \
++{                                                                      \
++    ST_D4(in0, in1, idx0, idx1, idx2, idx3, pdst, stride)              \
++    ST_D4(in2, in3, idx4, idx5, idx6, idx7, pdst + 4 * stride, stride) \
+ }
+ 
+ /* Description : Store as 12x8 byte block to destination memory from
+@@ -681,67 +599,48 @@
+ }
+ #define AVER_UB4_UB(...) AVER_UB4(v16u8, __VA_ARGS__)
+ 
+-/* Description : Immediate number of columns to slide with zero
+-   Arguments   : Inputs  - in0, in1, slide_val
+-                 Outputs - out0, out1
++/* Description : Immediate number of columns to slide
++   Arguments   : Inputs  - s, d, slide_val
++                 Outputs - out
+                  Return Type - as per RTYPE
+-   Details     : Byte elements from 'zero_m' vector are slide into 'in0' by
++   Details     : Byte elements from 'd' vector are slide into 's' by
+                  number of elements specified by 'slide_val'
+ */
+-#define SLDI_B2_0(RTYPE, in0, in1, out0, out1, slide_val)                 \
+-{                                                                         \
+-    v16i8 zero_m = { 0 };                                                 \
+-    out0 = (RTYPE) __msa_sldi_b((v16i8) zero_m, (v16i8) in0, slide_val);  \
+-    out1 = (RTYPE) __msa_sldi_b((v16i8) zero_m, (v16i8) in1, slide_val);  \
+-}
+-#define SLDI_B2_0_UB(...) SLDI_B2_0(v16u8, __VA_ARGS__)
+-#define SLDI_B2_0_SB(...) SLDI_B2_0(v16i8, __VA_ARGS__)
+-#define SLDI_B2_0_SW(...) SLDI_B2_0(v4i32, __VA_ARGS__)
+-
+-#define SLDI_B3_0(RTYPE, in0, in1, in2, out0, out1, out2,  slide_val)     \
+-{                                                                         \
+-    v16i8 zero_m = { 0 };                                                 \
+-    SLDI_B2_0(RTYPE, in0, in1, out0, out1, slide_val);                    \
+-    out2 = (RTYPE) __msa_sldi_b((v16i8) zero_m, (v16i8) in2, slide_val);  \
+-}
+-#define SLDI_B3_0_UB(...) SLDI_B3_0(v16u8, __VA_ARGS__)
+-#define SLDI_B3_0_SB(...) SLDI_B3_0(v16i8, __VA_ARGS__)
+-
+-#define SLDI_B4_0(RTYPE, in0, in1, in2, in3,            \
+-                  out0, out1, out2, out3, slide_val)    \
+-{                                                       \
+-    SLDI_B2_0(RTYPE, in0, in1, out0, out1, slide_val);  \
+-    SLDI_B2_0(RTYPE, in2, in3, out2, out3, slide_val);  \
++#define SLDI_B(RTYPE, d, s, slide_val, out)                       \
++{                                                                 \
++    out = (RTYPE) __msa_sldi_b((v16i8) d, (v16i8) s, slide_val);  \
+ }
+-#define SLDI_B4_0_UB(...) SLDI_B4_0(v16u8, __VA_ARGS__)
+-#define SLDI_B4_0_SB(...) SLDI_B4_0(v16i8, __VA_ARGS__)
+-#define SLDI_B4_0_SH(...) SLDI_B4_0(v8i16, __VA_ARGS__)
+ 
+-/* Description : Immediate number of columns to slide
+-   Arguments   : Inputs  - in0_0, in0_1, in1_0, in1_1, slide_val
+-                 Outputs - out0, out1
+-                 Return Type - as per RTYPE
+-   Details     : Byte elements from 'in0_0' vector are slide into 'in1_0' by
+-                 number of elements specified by 'slide_val'
+-*/
+-#define SLDI_B2(RTYPE, in0_0, in0_1, in1_0, in1_1, out0, out1, slide_val)  \
+-{                                                                          \
+-    out0 = (RTYPE) __msa_sldi_b((v16i8) in0_0, (v16i8) in1_0, slide_val);  \
+-    out1 = (RTYPE) __msa_sldi_b((v16i8) in0_1, (v16i8) in1_1, slide_val);  \
++#define SLDI_B2(RTYPE, d0, s0, d1, s1, slide_val, out0, out1)  \
++{                                                              \
++    SLDI_B(RTYPE, d0, s0, slide_val, out0)                     \
++    SLDI_B(RTYPE, d1, s1, slide_val, out1)                     \
+ }
+ #define SLDI_B2_UB(...) SLDI_B2(v16u8, __VA_ARGS__)
+ #define SLDI_B2_SB(...) SLDI_B2(v16i8, __VA_ARGS__)
+ #define SLDI_B2_SH(...) SLDI_B2(v8i16, __VA_ARGS__)
++#define SLDI_B2_SW(...) SLDI_B2(v4i32, __VA_ARGS__)
+ 
+-#define SLDI_B3(RTYPE, in0_0, in0_1, in0_2, in1_0, in1_1, in1_2,           \
+-                out0, out1, out2, slide_val)                               \
+-{                                                                          \
+-    SLDI_B2(RTYPE, in0_0, in0_1, in1_0, in1_1, out0, out1, slide_val)      \
+-    out2 = (RTYPE) __msa_sldi_b((v16i8) in0_2, (v16i8) in1_2, slide_val);  \
++#define SLDI_B3(RTYPE, d0, s0, d1, s1, d2, s2, slide_val,  \
++                out0, out1, out2)                          \
++{                                                          \
++    SLDI_B2(RTYPE, d0, s0, d1, s1, slide_val, out0, out1)  \
++    SLDI_B(RTYPE, d2, s2, slide_val, out2)                 \
+ }
++#define SLDI_B3_UB(...) SLDI_B3(v16u8, __VA_ARGS__)
+ #define SLDI_B3_SB(...) SLDI_B3(v16i8, __VA_ARGS__)
+ #define SLDI_B3_UH(...) SLDI_B3(v8u16, __VA_ARGS__)
+ 
++#define SLDI_B4(RTYPE, d0, s0, d1, s1, d2, s2, d3, s3,     \
++                slide_val, out0, out1, out2, out3)         \
++{                                                          \
++    SLDI_B2(RTYPE, d0, s0, d1, s1, slide_val, out0, out1)  \
++    SLDI_B2(RTYPE, d2, s2, d3, s3, slide_val, out2, out3)  \
++}
++#define SLDI_B4_UB(...) SLDI_B4(v16u8, __VA_ARGS__)
++#define SLDI_B4_SB(...) SLDI_B4(v16i8, __VA_ARGS__)
++#define SLDI_B4_SH(...) SLDI_B4(v8i16, __VA_ARGS__)
++
+ /* Description : Shuffle byte vector elements as per mask vector
+    Arguments   : Inputs  - in0, in1, in2, in3, mask0, mask1
+                  Outputs - out0, out1
+@@ -1012,99 +911,78 @@
+ 
+ /* Description : Clips all halfword elements of input vector between min & max
+                  out = ((in) < (min)) ? (min) : (((in) > (max)) ? (max) : (in))
+-   Arguments   : Inputs  - in       (input vector)
+-                         - min      (min threshold)
+-                         - max      (max threshold)
+-                 Outputs - out_m    (output vector with clipped elements)
++   Arguments   : Inputs  - in    (input vector)
++                         - min   (min threshold)
++                         - max   (max threshold)
++                 Outputs - in    (output vector with clipped elements)
+                  Return Type - signed halfword
+ */
+-#define CLIP_SH(in, min, max)                           \
+-( {                                                     \
+-    v8i16 out_m;                                        \
+-                                                        \
+-    out_m = __msa_max_s_h((v8i16) min, (v8i16) in);     \
+-    out_m = __msa_min_s_h((v8i16) max, (v8i16) out_m);  \
+-    out_m;                                              \
+-} )
++#define CLIP_SH(in, min, max)                     \
++{                                                 \
++    in = __msa_max_s_h((v8i16) min, (v8i16) in);  \
++    in = __msa_min_s_h((v8i16) max, (v8i16) in);  \
++}
+ 
+ /* Description : Clips all signed halfword elements of input vector
+                  between 0 & 255
+-   Arguments   : Inputs  - in       (input vector)
+-                 Outputs - out_m    (output vector with clipped elements)
+-                 Return Type - signed halfword
++   Arguments   : Inputs  - in    (input vector)
++                 Outputs - in    (output vector with clipped elements)
++                 Return Type - signed halfwords
+ */
+-#define CLIP_SH_0_255(in)                                 \
+-( {                                                       \
+-    v8i16 max_m = __msa_ldi_h(255);                       \
+-    v8i16 out_m;                                          \
+-                                                          \
+-    out_m = __msa_maxi_s_h((v8i16) in, 0);                \
+-    out_m = __msa_min_s_h((v8i16) max_m, (v8i16) out_m);  \
+-    out_m;                                                \
+-} )
++#define CLIP_SH_0_255(in)                       \
++{                                               \
++    in = __msa_maxi_s_h((v8i16) in, 0);         \
++    in = (v8i16) __msa_sat_u_h((v8u16) in, 7);  \
++}
++
+ #define CLIP_SH2_0_255(in0, in1)  \
+ {                                 \
+-    in0 = CLIP_SH_0_255(in0);     \
+-    in1 = CLIP_SH_0_255(in1);     \
++    CLIP_SH_0_255(in0);           \
++    CLIP_SH_0_255(in1);           \
+ }
++
+ #define CLIP_SH4_0_255(in0, in1, in2, in3)  \
+ {                                           \
+     CLIP_SH2_0_255(in0, in1);               \
+     CLIP_SH2_0_255(in2, in3);               \
+ }
+ 
+-#define CLIP_SH_0_255_MAX_SATU(in)                    \
+-( {                                                   \
+-    v8i16 out_m;                                      \
+-                                                      \
+-    out_m = __msa_maxi_s_h((v8i16) in, 0);            \
+-    out_m = (v8i16) __msa_sat_u_h((v8u16) out_m, 7);  \
+-    out_m;                                            \
+-} )
+-#define CLIP_SH2_0_255_MAX_SATU(in0, in1)  \
+-{                                          \
+-    in0 = CLIP_SH_0_255_MAX_SATU(in0);     \
+-    in1 = CLIP_SH_0_255_MAX_SATU(in1);     \
+-}
+-#define CLIP_SH4_0_255_MAX_SATU(in0, in1, in2, in3)  \
+-{                                                    \
+-    CLIP_SH2_0_255_MAX_SATU(in0, in1);               \
+-    CLIP_SH2_0_255_MAX_SATU(in2, in3);               \
++#define CLIP_SH8_0_255(in0, in1, in2, in3,  \
++                       in4, in5, in6, in7)  \
++{                                           \
++    CLIP_SH4_0_255(in0, in1, in2, in3);     \
++    CLIP_SH4_0_255(in4, in5, in6, in7);     \
+ }
+ 
+ /* Description : Clips all signed word elements of input vector
+                  between 0 & 255
+-   Arguments   : Inputs  - in       (input vector)
+-                 Outputs - out_m    (output vector with clipped elements)
++   Arguments   : Inputs  - in    (input vector)
++                 Outputs - in    (output vector with clipped elements)
+                  Return Type - signed word
+ */
+-#define CLIP_SW_0_255(in)                                 \
+-( {                                                       \
+-    v4i32 max_m = __msa_ldi_w(255);                       \
+-    v4i32 out_m;                                          \
+-                                                          \
+-    out_m = __msa_maxi_s_w((v4i32) in, 0);                \
+-    out_m = __msa_min_s_w((v4i32) max_m, (v4i32) out_m);  \
+-    out_m;                                                \
+-} )
++#define CLIP_SW_0_255(in)                       \
++{                                               \
++    in = __msa_maxi_s_w((v4i32) in, 0);         \
++    in = (v4i32) __msa_sat_u_w((v4u32) in, 7);  \
++}
+ 
+-#define CLIP_SW_0_255_MAX_SATU(in)                    \
+-( {                                                   \
+-    v4i32 out_m;                                      \
+-                                                      \
+-    out_m = __msa_maxi_s_w((v4i32) in, 0);            \
+-    out_m = (v4i32) __msa_sat_u_w((v4u32) out_m, 7);  \
+-    out_m;                                            \
+-} )
+-#define CLIP_SW2_0_255_MAX_SATU(in0, in1)  \
+-{                                          \
+-    in0 = CLIP_SW_0_255_MAX_SATU(in0);     \
+-    in1 = CLIP_SW_0_255_MAX_SATU(in1);     \
++#define CLIP_SW2_0_255(in0, in1)  \
++{                                 \
++    CLIP_SW_0_255(in0);           \
++    CLIP_SW_0_255(in1);           \
+ }
+-#define CLIP_SW4_0_255_MAX_SATU(in0, in1, in2, in3)  \
+-{                                                    \
+-    CLIP_SW2_0_255_MAX_SATU(in0, in1);               \
+-    CLIP_SW2_0_255_MAX_SATU(in2, in3);               \
++
++#define CLIP_SW4_0_255(in0, in1, in2, in3)  \
++{                                           \
++    CLIP_SW2_0_255(in0, in1);               \
++    CLIP_SW2_0_255(in2, in3);               \
++}
++
++#define CLIP_SW8_0_255(in0, in1, in2, in3,  \
++                       in4, in5, in6, in7)  \
++{                                           \
++    CLIP_SW4_0_255(in0, in1, in2, in3);     \
++    CLIP_SW4_0_255(in4, in5, in6, in7);     \
+ }
+ 
+ /* Description : Addition of 4 signed word elements
+@@ -1491,6 +1369,7 @@
+             out4, out5, out6, out7);                              \
+ }
+ #define ILVR_B8_UH(...) ILVR_B8(v8u16, __VA_ARGS__)
++#define ILVR_B8_SW(...) ILVR_B8(v4i32, __VA_ARGS__)
+ 
+ /* Description : Interleave right half of halfword elements from vectors
+    Arguments   : Inputs  - in0, in1, in2, in3, in4, in5, in6, in7
+@@ -2479,6 +2358,7 @@
+ {                                                                        \
+     v16i8 tmp0_m, tmp1_m, tmp2_m, tmp3_m;                                \
+     v16i8 tmp4_m, tmp5_m, tmp6_m, tmp7_m;                                \
++    v16i8 zeros = { 0 };                                                 \
+                                                                          \
+     ILVR_B4_SB(in2, in0, in3, in1, in6, in4, in7, in5,                   \
+                tmp0_m, tmp1_m, tmp2_m, tmp3_m);                          \
+@@ -2486,8 +2366,8 @@
+     ILVRL_B2_SB(tmp3_m, tmp2_m, tmp6_m, tmp7_m);                         \
+     ILVRL_W2(RTYPE, tmp6_m, tmp4_m, out0, out2);                         \
+     ILVRL_W2(RTYPE, tmp7_m, tmp5_m, out4, out6);                         \
+-    SLDI_B2_0(RTYPE, out0, out2, out1, out3, 8);                         \
+-    SLDI_B2_0(RTYPE, out4, out6, out5, out7, 8);                         \
++    SLDI_B4(RTYPE, zeros, out0, zeros, out2, zeros, out4, zeros, out6,   \
++            8, out1, out3, out5, out7);                                  \
+ }
+ #define TRANSPOSE8x8_UB_UB(...) TRANSPOSE8x8_UB(v16u8, __VA_ARGS__)
+ #define TRANSPOSE8x8_UB_UH(...) TRANSPOSE8x8_UB(v8u16, __VA_ARGS__)
+@@ -2890,7 +2770,7 @@
+     tmp0_m = PCKEV_XORI128_UB(in0, in1);                      \
+     tmp1_m = PCKEV_XORI128_UB(in2, in3);                      \
+     AVER_UB2_UB(tmp0_m, dst0, tmp1_m, dst1, tmp0_m, tmp1_m);  \
+-    ST8x4_UB(tmp0_m, tmp1_m, pdst_m, stride);                 \
++    ST_D4(tmp0_m, tmp1_m, 0, 1, 0, 1, pdst_m, stride);        \
+ }
+ 
+ /* Description : Pack even byte elements, extract 0 & 2 index words from pair
+diff -uNra ffmpeg-4.1.6/libavutil/mips/Makefile FFmpeg/libavutil/mips/Makefile
+--- a/libavutil/mips/Makefile	2020-04-28 05:48:16.000000000 +0800
++++ b/libavutil/mips/Makefile	2020-07-19 18:13:58.361235441 +0800
+@@ -1 +1 @@
+-OBJS += mips/float_dsp_mips.o
++OBJS += mips/float_dsp_mips.o mips/cpu.o
+diff -uNra ffmpeg-4.1.6/libavutil/mips/mmiutils.h FFmpeg/libavutil/mips/mmiutils.h
+--- a/libavutil/mips/mmiutils.h	2020-07-05 06:36:02.000000000 +0800
++++ b/libavutil/mips/mmiutils.h	2020-07-19 18:13:58.365143850 +0800
+@@ -205,7 +205,7 @@
+  * backup register
+  */
+ #define BACKUP_REG \
+-  double temp_backup_reg[8];                                    \
++  LOCAL_ALIGNED_16(double, temp_backup_reg, [8]);               \
+   if (_MIPS_SIM == _ABI64)                                      \
+     __asm__ volatile (                                          \
+       "gssqc1       $f25,      $f24,       0x00(%[temp])  \n\t" \
+@@ -251,6 +251,15 @@
+     );
+ 
+ /**
++ * brief: Transpose 2X2 word packaged data.
++ * fr_i0, fr_i1: src
++ * fr_o0, fr_o1: dst
++ */
++#define TRANSPOSE_2W(fr_i0, fr_i1, fr_o0, fr_o1)                          \
++        "punpcklwd  "#fr_o0",   "#fr_i0",   "#fr_i1"                \n\t" \
++        "punpckhwd  "#fr_o1",   "#fr_i0",   "#fr_i1"                \n\t"
++
++/**
+  * brief: Transpose 4X4 half word packaged data.
+  * fr_i0, fr_i1, fr_i2, fr_i3: src & dst
+  * fr_t0, fr_t1, fr_t2, fr_t3: temporary register
+@@ -336,5 +345,20 @@
+         PSRAH_4_MMI(fp1, fp2, fp3, fp4, shift)                            \
+         PSRAH_4_MMI(fp5, fp6, fp7, fp8, shift)
+ 
++/**
++ * brief: (((value) + (1 << ((n) - 1))) >> (n))
++ * fr_i0: src & dst
++ * fr_i1: Operand number
++ * fr_t0, fr_t1: temporary FPR
++ * gr_t0: temporary GPR
++ */
++#define ROUND_POWER_OF_TWO_MMI(fr_i0, fr_i1, fr_t0, fr_t1, gr_t0)         \
++        "li         "#gr_t0",     0x01                              \n\t" \
++        "dmtc1      "#gr_t0",     "#fr_t0"                          \n\t" \
++        "punpcklwd  "#fr_t0",     "#fr_t0",    "#fr_t0"             \n\t" \
++        "psubw      "#fr_t1",     "#fr_i1",    "#fr_t0"             \n\t" \
++        "psllw      "#fr_t1",     "#fr_t0",    "#fr_t1"             \n\t" \
++        "paddw      "#fr_i0",     "#fr_i0",    "#fr_t1"             \n\t" \
++        "psraw      "#fr_i0",     "#fr_i0",    "#fr_i1"             \n\t"
+ 
+ #endif /* AVUTILS_MIPS_MMIUTILS_H */
+diff -uNra ffmpeg-4.1.6/libavutil/tests/cpu.c FFmpeg/libavutil/tests/cpu.c
+--- a/libavutil/tests/cpu.c	2020-07-05 06:36:02.000000000 +0800
++++ b/libavutil/tests/cpu.c	2020-07-19 18:13:58.384685898 +0800
+@@ -49,6 +49,9 @@
+     { AV_CPU_FLAG_SETEND,    "setend"     },
+ #elif ARCH_PPC
+     { AV_CPU_FLAG_ALTIVEC,   "altivec"    },
++#elif ARCH_MIPS
++    { AV_CPU_FLAG_MMI,       "mmi"        },
++    { AV_CPU_FLAG_MSA,       "msa"        },
+ #elif ARCH_X86
+     { AV_CPU_FLAG_MMX,       "mmx"        },
+     { AV_CPU_FLAG_MMXEXT,    "mmxext"     },
+diff -uNra ffmpeg-4.1.6/tests/checkasm/checkasm.c FFmpeg/tests/checkasm/checkasm.c
+--- a/tests/checkasm/checkasm.c	2020-07-05 06:36:02.000000000 +0800
++++ b/tests/checkasm/checkasm.c	2020-07-19 18:19:53.307359300 +0800
+@@ -197,6 +197,9 @@
+     { "ALTIVEC",  "altivec",  AV_CPU_FLAG_ALTIVEC },
+     { "VSX",      "vsx",      AV_CPU_FLAG_VSX },
+     { "POWER8",   "power8",   AV_CPU_FLAG_POWER8 },
++#elif ARCH_MIPS
++    { "MMI",      "mmi",      AV_CPU_FLAG_MMI },
++    { "MSA",      "msa",      AV_CPU_FLAG_MSA },
+ #elif ARCH_X86
+     { "MMX",      "mmx",      AV_CPU_FLAG_MMX|AV_CPU_FLAG_CMOV },
+     { "MMXEXT",   "mmxext",   AV_CPU_FLAG_MMXEXT },
+diff -uNra ffmpeg-4.1.6/configure FFmpeg/configure
+--- a/configure	2020-07-05 06:36:01.000000000 +0800
++++ b/configure	2020-07-19 18:19:52.498318518 +0800
+@@ -2476,7 +2476,7 @@
+ mipsfpu_deps="mips"
+ mipsdsp_deps="mips"
+ mipsdspr2_deps="mips"
+-mmi_deps="mips"
++mmi_deps_any="loongson2 loongson3"
+ msa_deps="mipsfpu"
+ 
+ cpunop_deps="i686"
+@@ -4811,8 +4811,6 @@
+ 
+ elif enabled mips; then
+ 
+-    cpuflags="-march=$cpu"
+-
+     if [ "$cpu" != "generic" ]; then
+         disable mips32r2
+         disable mips32r5
+@@ -4821,19 +4819,61 @@
+         disable mips64r6
+         disable loongson2
+         disable loongson3
++        disable mipsdsp
++        disable mipsdspr2
++        disable msa
++        disable mmi
++
++        cpuflags="-march=$cpu"
+ 
+         case $cpu in
+-            24kc|24kf*|24kec|34kc|1004kc|24kef*|34kf*|1004kf*|74kc|74kf)
++            # General ISA levels
++            mips1|mips3)
++            ;;
++            mips32r2)
++                enable msa
+                 enable mips32r2
+-                disable msa
+             ;;
+-            p5600|i6400|p6600)
+-                disable mipsdsp
+-                disable mipsdspr2
++            mips32r5)
++                enable msa
++                enable mips32r2
++                enable mips32r5
+             ;;
+-            loongson*)
+-                enable loongson2
++            mips64r2|mips64r5)
++                enable msa
++                enable mmi
++                enable mips64r2
+                 enable loongson3
++            ;;
++            # Cores from MIPS(MTI)
++            24kc)
++                disable mipsfpu
++                enable mips32r2
++            ;;
++            24kf*|24kec|34kc|74Kc|1004kc)
++                enable mips32r2
++            ;;
++            24kef*|34kf*|1004kf*)
++                enable mipsdsp
++                enable mips32r2
++            ;;
++            p5600)
++                enable msa
++                enable mips32r2
++                enable mips32r5
++                check_cflags "-mtune=p5600" && check_cflags "-msched-weight -mload-store-pairs -funroll-loops"
++            ;;
++            i6400)
++                enable mips64r6
++                check_cflags "-mtune=i6400 -mabi=64" && check_cflags "-msched-weight -mload-store-pairs -funroll-loops" && check_ldflags "-mabi=64"
++            ;;
++            p6600)
++                enable mips64r6
++                check_cflags "-mtune=p6600 -mabi=64" && check_cflags "-msched-weight -mload-store-pairs -funroll-loops" && check_ldflags "-mabi=64"
++            ;;
++            # Cores from Loongson
++            loongson2e|loongson2f|loongson3*)
++                enable mmi
+                 enable local_aligned
+                 enable simd_align_16
+                 enable fast_64bit
+@@ -4842,75 +4882,43 @@
+                 enable fast_unaligned
+                 disable aligned_stack
+                 disable mipsfpu
+-                disable mipsdsp
+-                disable mipsdspr2
+                 # When gcc version less than 5.3.0, add -fno-expensive-optimizations flag.
+-                if [ $cc == gcc ]; then
+-                    gcc_version=$(gcc -dumpversion)
+-                    if [ "$(echo "$gcc_version 5.3.0" | tr " " "\n" | sort -rV | head -n 1)" == "$gcc_version" ]; then
+-                        expensive_optimization_flag=""
+-                    else
++                if test "$cc_type" = "gcc"; then
++                    case $gcc_basever in
++                        2|2.*|3.*|4.*|5.0|5.1|5.2)
+                         expensive_optimization_flag="-fno-expensive-optimizations"
+-                    fi
++                        ;;
++                        *)
++                        expensive_optimization_flag=""
++                        ;;
++                    esac
+                 fi
++
+                 case $cpu in
+                     loongson3*)
++                        enable loongson3
++                        enable msa
+                         cpuflags="-march=loongson3a -mhard-float $expensive_optimization_flag"
+                     ;;
+                     loongson2e)
++                        enable loongson2
+                         cpuflags="-march=loongson2e -mhard-float $expensive_optimization_flag"
+                     ;;
+                     loongson2f)
++                        enable loongson2
+                         cpuflags="-march=loongson2f -mhard-float $expensive_optimization_flag"
+                     ;;
+                 esac
+             ;;
+             *)
+-                # Unknown CPU. Disable everything.
+-                warn "unknown CPU. Disabling all MIPS optimizations."
+-                disable mipsfpu
+-                disable mipsdsp
+-                disable mipsdspr2
+-                disable msa
+-                disable mmi
++                warn "unknown CPU."
+             ;;
+         esac
+ 
+-        case $cpu in
+-            24kc)
+-                disable mipsfpu
+-                disable mipsdsp
+-                disable mipsdspr2
+-            ;;
+-            24kf*)
+-                disable mipsdsp
+-                disable mipsdspr2
+-            ;;
+-            24kec|34kc|1004kc)
+-                disable mipsfpu
+-                disable mipsdspr2
+-            ;;
+-            24kef*|34kf*|1004kf*)
+-                disable mipsdspr2
+-            ;;
+-            74kc)
+-                disable mipsfpu
+-            ;;
+-            p5600)
+-                enable mips32r5
+-                check_cflags "-mtune=p5600" && check_cflags "-msched-weight -mload-store-pairs -funroll-loops"
+-            ;;
+-            i6400)
+-                enable mips64r6
+-                check_cflags "-mtune=i6400 -mabi=64" && check_cflags "-msched-weight -mload-store-pairs -funroll-loops" && check_ldflags "-mabi=64"
+-            ;;
+-            p6600)
+-                enable mips64r6
+-                check_cflags "-mtune=p6600 -mabi=64" && check_cflags "-msched-weight -mload-store-pairs -funroll-loops" && check_ldflags "-mabi=64"
+-            ;;
+-        esac
+     else
+-        # We do not disable anything. Is up to the user to disable the unwanted features.
++        disable mipsdsp
++        disable mipsdspr2
++        # Disable DSP stuff for generic CPU, it can't be detected at runtime.
+         warn 'generic cpu selected'
+     fi
+ 
+@@ -5644,28 +5652,43 @@
+ 
+ elif enabled mips; then
+ 
+-    enabled loongson2 && check_inline_asm loongson2 '"dmult.g $8, $9, $10"'
+-    enabled loongson3 && check_inline_asm loongson3 '"gsldxc1 $f0, 0($2, $3)"'
+-    enabled mmi && check_inline_asm mmi '"punpcklhw $f0, $f0, $f0"'
+-
+-    # Enable minimum ISA based on selected options
++    # Check toolchain ISA level
+     if enabled mips64; then
+-        enabled mips64r6 && check_inline_asm_flags mips64r6 '"dlsa $0, $0, $0, 1"' '-mips64r6'
+-        enabled mips64r2 && check_inline_asm_flags mips64r2 '"dext $0, $0, 0, 1"' '-mips64r2'
+-        disabled mips64r6 && disabled mips64r2 && check_inline_asm_flags mips64r1 '"daddi $0, $0, 0"' '-mips64'
++        enabled mips64r6 && check_inline_asm mips64r6 '"dlsa $0, $0, $0, 1"' &&
++            disable mips64r2
++
++        enabled mips64r2 && check_inline_asm mips64r2 '"dext $0, $0, 0, 1"'
++
++        disable mips32r6 && disable mips32r5 && disable mips32r2
+     else
+-        enabled mips32r6 && check_inline_asm_flags mips32r6 '"aui $0, $0, 0"' '-mips32r6'
+-        enabled mips32r5 && check_inline_asm_flags mips32r5 '"eretnc"' '-mips32r5'
+-        enabled mips32r2 && check_inline_asm_flags mips32r2 '"ext $0, $0, 0, 1"' '-mips32r2'
+-        disabled mips32r6 && disabled mips32r5 && disabled mips32r2 && check_inline_asm_flags mips32r1 '"addi $0, $0, 0"' '-mips32'
++        enabled mips32r6 && check_inline_asm mips32r6 '"aui $0, $0, 0"' &&
++            disable mips32r5 && disable mips32r2
++
++        enabled mips32r5 && check_inline_asm mips32r5 '"eretnc"'
++        enabled mips32r2 && check_inline_asm mips32r2 '"ext $0, $0, 0, 1"'
++
++        disable mips64r6 && disable mips64r5 && disable mips64r2
+     fi
+ 
+-    enabled mipsfpu && check_inline_asm_flags mipsfpu '"cvt.d.l $f0, $f2"' '-mhard-float'
++    enabled mipsfpu && check_inline_asm mipsfpu '"cvt.d.l $f0, $f2"'
+     enabled mipsfpu && (enabled mips32r5 || enabled mips32r6 || enabled mips64r6) && check_inline_asm_flags mipsfpu '"cvt.d.l $f0, $f1"' '-mfp64'
+-    enabled mipsfpu && enabled msa && check_inline_asm_flags msa '"addvi.b $w0, $w1, 1"' '-mmsa' && check_headers msa.h || disable msa
++
+     enabled mipsdsp && check_inline_asm_flags mipsdsp '"addu.qb $t0, $t1, $t2"' '-mdsp'
+     enabled mipsdspr2 && check_inline_asm_flags mipsdspr2 '"absq_s.qb $t0, $t1"' '-mdspr2'
+ 
++    # MSA and MSA2 can be detected at runtime so we supply extra flags here
++    enabled mipsfpu && enabled msa && check_inline_asm msa '"addvi.b $w0, $w1, 1"' '-mmsa' && append MSAFLAGS '-mmsa'
++    enabled msa && enabled msa2 && check_inline_asm msa2 '"nxbits.any.b $w0, $w0"' '-mmsa2' && append MSAFLAGS '-mmsa2'
++
++    # loongson2 have no switch cflag so we can only probe toolchain ability
++    enabled loongson2 && check_inline_asm loongson2 '"dmult.g $8, $9, $10"' && disable loongson3
++
++    # loongson3 is paired with MMI
++    enabled loongson3 && check_inline_asm loongson3 '"gsldxc1 $f0, 0($2, $3)"' '-mloongson-ext' && append MMIFLAGS '-mloongson-ext'
++
++    # MMI can be detected at runtime too
++    enabled mmi && check_inline_asm mmi '"punpcklhw $f0, $f0, $f0"' '-mloongson-mmi' && append MMIFLAGS '-mloongson-mmi'
++
+     if enabled bigendian && enabled msa; then
+         disable msa
+     fi
+@@ -7170,6 +7193,8 @@
+ SHFLAGS=$(echo $($ldflags_filter $SHFLAGS))
+ ASMSTRIPFLAGS=$ASMSTRIPFLAGS
+ X86ASMFLAGS=$X86ASMFLAGS
++MSAFLAGS=$MSAFLAGS
++MMIFLAGS=$MMIFLAGS
+ BUILDSUF=$build_suffix
+ PROGSSUF=$progs_suffix
+ FULLNAME=$FULLNAME
