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 + + -- liu shiwei 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 ++ * ++ * 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 ++ * ++ * 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 ++ * ++ * 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 ++ * ++ * 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 ++ * ++ * 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 ++ ++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 ++ * ++ * 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 ++#include ++#include ++#include ++#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