+#include "libavutil/mem_internal.h"
+
+#define DECLARE_DOUBLE_1 double db_1
+#define DECLARE_DOUBLE_2 double db_2
+#define DECLARE_UINT32_T uint32_t it_1
+#define RESTRICT_ASM_DOUBLE_1 [db_1]"=&f"(db_1)
+#define RESTRICT_ASM_DOUBLE_2 [db_2]"=&f"(db_2)
+#define RESTRICT_ASM_UINT32_T [it_1]"=&r"(it_1)
+
+#define MMI_PCMPGTUB(dst, src1, src2) \
+ "pcmpeqb %[db_1], "#src1", "#src2" \n\t" \
+ "pmaxub %[db_2], "#src1", "#src2" \n\t" \
+ "pcmpeqb %[db_2], %[db_2], "#src1" \n\t" \
+ "xor "#dst", %[db_2], %[db_1] \n\t"
+
+#define MMI_BTOH(dst_l, dst_r, src) \
+ "xor %[db_1], %[db_1], %[db_1] \n\t" \
+ "pcmpgtb %[db_2], %[db_1], "#src" \n\t" \
+ "punpcklbh "#dst_r", "#src", %[db_2] \n\t" \
+ "punpckhbh "#dst_l", "#src", %[db_2] \n\t"
+
+#define MMI_VP8_LOOP_FILTER \
+ /* Calculation of hev */ \
+ "dmtc1 %[thresh], %[ftmp3] \n\t" \
+ "punpcklbh %[ftmp3], %[ftmp3], %[ftmp3] \n\t" \
+ "punpcklhw %[ftmp3], %[ftmp3], %[ftmp3] \n\t" \
+ "punpcklwd %[ftmp3], %[ftmp3], %[ftmp3] \n\t" \
+ "pasubub %[ftmp0], %[p1], %[p0] \n\t" \
+ "pasubub %[ftmp1], %[q1], %[q0] \n\t" \
+ "pmaxub %[ftmp0], %[ftmp0], %[ftmp1] \n\t" \
+ MMI_PCMPGTUB(%[hev], %[ftmp0], %[ftmp3]) \
+ /* Calculation of mask */ \
+ "pasubub %[ftmp1], %[p0], %[q0] \n\t" \
+ "paddusb %[ftmp1], %[ftmp1], %[ftmp1] \n\t" \
+ "pasubub %[ftmp2], %[p1], %[q1] \n\t" \
+ "li %[tmp0], 0x09 \n\t" \
+ "dmtc1 %[tmp0], %[ftmp3] \n\t" \
+ PSRLB_MMI(%[ftmp2], %[ftmp3], %[ftmp4], %[ftmp5], %[ftmp2]) \
+ "paddusb %[ftmp1], %[ftmp1], %[ftmp2] \n\t" \
+ "dmtc1 %[e], %[ftmp3] \n\t" \
+ "punpcklbh %[ftmp3], %[ftmp3], %[ftmp3] \n\t" \
+ "punpcklhw %[ftmp3], %[ftmp3], %[ftmp3] \n\t" \
+ "punpcklwd %[ftmp3], %[ftmp3], %[ftmp3] \n\t" \
+ MMI_PCMPGTUB(%[mask], %[ftmp1], %[ftmp3]) \
+ "pmaxub %[mask], %[mask], %[ftmp0] \n\t" \
+ "pasubub %[ftmp1], %[p3], %[p2] \n\t" \
+ "pasubub %[ftmp2], %[p2], %[p1] \n\t" \
+ "pmaxub %[ftmp1], %[ftmp1], %[ftmp2] \n\t" \
+ "pmaxub %[mask], %[mask], %[ftmp1] \n\t" \
+ "pasubub %[ftmp1], %[q3], %[q2] \n\t" \
+ "pasubub %[ftmp2], %[q2], %[q1] \n\t" \
+ "pmaxub %[ftmp1], %[ftmp1], %[ftmp2] \n\t" \
+ "pmaxub %[mask], %[mask], %[ftmp1] \n\t" \
+ "dmtc1 %[i], %[ftmp3] \n\t" \
+ "punpcklbh %[ftmp3], %[ftmp3], %[ftmp3] \n\t" \
+ "punpcklhw %[ftmp3], %[ftmp3], %[ftmp3] \n\t" \
+ "punpcklwd %[ftmp3], %[ftmp3], %[ftmp3] \n\t" \
+ MMI_PCMPGTUB(%[mask], %[mask], %[ftmp3]) \
+ "pcmpeqw %[ftmp3], %[ftmp3], %[ftmp3] \n\t" \
+ "xor %[mask], %[mask], %[ftmp3] \n\t" \
+ /* VP8_MBFILTER */ \
+ "li %[tmp0], 0x80808080 \n\t" \
+ "dmtc1 %[tmp0], %[ftmp7] \n\t" \
+ "punpcklwd %[ftmp7], %[ftmp7], %[ftmp7] \n\t" \
+ "xor %[p2], %[p2], %[ftmp7] \n\t" \
+ "xor %[p1], %[p1], %[ftmp7] \n\t" \
+ "xor %[p0], %[p0], %[ftmp7] \n\t" \
+ "xor %[q0], %[q0], %[ftmp7] \n\t" \
+ "xor %[q1], %[q1], %[ftmp7] \n\t" \
+ "xor %[q2], %[q2], %[ftmp7] \n\t" \
+ "psubsb %[ftmp4], %[p1], %[q1] \n\t" \
+ "psubb %[ftmp5], %[q0], %[p0] \n\t" \
+ MMI_BTOH(%[ftmp1], %[ftmp0], %[ftmp5]) \
+ MMI_BTOH(%[ftmp3], %[ftmp2], %[ftmp4]) \
+ /* Right part */ \
+ "paddh %[ftmp5], %[ftmp0], %[ftmp0] \n\t" \
+ "paddh %[ftmp0], %[ftmp0], %[ftmp5] \n\t" \
+ "paddh %[ftmp0], %[ftmp2], %[ftmp0] \n\t" \
+ /* Left part */ \
+ "paddh %[ftmp5], %[ftmp1], %[ftmp1] \n\t" \
+ "paddh %[ftmp1], %[ftmp1], %[ftmp5] \n\t" \
+ "paddh %[ftmp1], %[ftmp3], %[ftmp1] \n\t" \
+ /* Combine left and right part */ \
+ "packsshb %[ftmp1], %[ftmp0], %[ftmp1] \n\t" \
+ "and %[ftmp1], %[ftmp1], %[mask] \n\t" \
+ "and %[ftmp2], %[ftmp1], %[hev] \n\t" \
+ "li %[tmp0], 0x04040404 \n\t" \
+ "dmtc1 %[tmp0], %[ftmp0] \n\t" \
+ "punpcklwd %[ftmp0], %[ftmp0], %[ftmp0] \n\t" \
+ "paddsb %[ftmp3], %[ftmp2], %[ftmp0] \n\t" \
+ "li %[tmp0], 0x0B \n\t" \
+ "dmtc1 %[tmp0], %[ftmp4] \n\t" \
+ PSRAB_MMI(%[ftmp3], %[ftmp4], %[ftmp5], %[ftmp6], %[ftmp3]) \
+ "li %[tmp0], 0x03030303 \n\t" \
+ "dmtc1 %[tmp0], %[ftmp0] \n\t" \
+ "punpcklwd %[ftmp0], %[ftmp0], %[ftmp0] \n\t" \
+ "paddsb %[ftmp4], %[ftmp2], %[ftmp0] \n\t" \
+ "li %[tmp0], 0x0B \n\t" \
+ "dmtc1 %[tmp0], %[ftmp2] \n\t" \
+ PSRAB_MMI(%[ftmp4], %[ftmp2], %[ftmp5], %[ftmp6], %[ftmp4]) \
+ "psubsb %[q0], %[q0], %[ftmp3] \n\t" \
+ "paddsb %[p0], %[p0], %[ftmp4] \n\t" \
+ /* filt_val &= ~hev */ \
+ "pcmpeqw %[ftmp0], %[ftmp0], %[ftmp0] \n\t" \
+ "xor %[hev], %[hev], %[ftmp0] \n\t" \
+ "and %[ftmp1], %[ftmp1], %[hev] \n\t" \
+ MMI_BTOH(%[ftmp5], %[ftmp6], %[ftmp1]) \
+ "li %[tmp0], 0x07 \n\t" \
+ "dmtc1 %[tmp0], %[ftmp2] \n\t" \
+ "li %[tmp0], 0x001b001b \n\t" \
+ "dmtc1 %[tmp0], %[ftmp1] \n\t" \
+ "punpcklwd %[ftmp1], %[ftmp1], %[ftmp1] \n\t" \
+ "li %[tmp0], 0x003f003f \n\t" \
+ "dmtc1 %[tmp0], %[ftmp0] \n\t" \
+ "punpcklwd %[ftmp0], %[ftmp0], %[ftmp0] \n\t" \
+ /* Right part */ \
+ "pmullh %[ftmp3], %[ftmp6], %[ftmp1] \n\t" \
+ "paddh %[ftmp3], %[ftmp3], %[ftmp0] \n\t" \
+ "psrah %[ftmp3], %[ftmp3], %[ftmp2] \n\t" \
+ /* Left part */ \
+ "pmullh %[ftmp4], %[ftmp5], %[ftmp1] \n\t" \
+ "paddh %[ftmp4], %[ftmp4], %[ftmp0] \n\t" \
+ "psrah %[ftmp4], %[ftmp4], %[ftmp2] \n\t" \
+ /* Combine left and right part */ \
+ "packsshb %[ftmp4], %[ftmp3], %[ftmp4] \n\t" \
+ "psubsb %[q0], %[q0], %[ftmp4] \n\t" \
+ "xor %[q0], %[q0], %[ftmp7] \n\t" \
+ "paddsb %[p0], %[p0], %[ftmp4] \n\t" \
+ "xor %[p0], %[p0], %[ftmp7] \n\t" \
+ "li %[tmp0], 0x00120012 \n\t" \
+ "dmtc1 %[tmp0], %[ftmp1] \n\t" \
+ "punpcklwd %[ftmp1], %[ftmp1], %[ftmp1] \n\t" \
+ /* Right part */ \
+ "pmullh %[ftmp3], %[ftmp6], %[ftmp1] \n\t" \
+ "paddh %[ftmp3], %[ftmp3], %[ftmp0] \n\t" \
+ "psrah %[ftmp3], %[ftmp3], %[ftmp2] \n\t" \
+ /* Left part */ \
+ "pmullh %[ftmp4], %[ftmp5], %[ftmp1] \n\t" \
+ "paddh %[ftmp4], %[ftmp4], %[ftmp0] \n\t" \
+ "psrah %[ftmp4], %[ftmp4], %[ftmp2] \n\t" \
+ /* Combine left and right part */ \
+ "packsshb %[ftmp4], %[ftmp3], %[ftmp4] \n\t" \
+ "psubsb %[q1], %[q1], %[ftmp4] \n\t" \
+ "xor %[q1], %[q1], %[ftmp7] \n\t" \
+ "paddsb %[p1], %[p1], %[ftmp4] \n\t" \
+ "xor %[p1], %[p1], %[ftmp7] \n\t" \
+ "li %[tmp0], 0x03 \n\t" \
+ "dmtc1 %[tmp0], %[ftmp1] \n\t" \
+ /* Right part */ \
+ "psllh %[ftmp3], %[ftmp6], %[ftmp1] \n\t" \
+ "paddh %[ftmp3], %[ftmp3], %[ftmp6] \n\t" \
+ "paddh %[ftmp3], %[ftmp3], %[ftmp0] \n\t" \
+ "psrah %[ftmp3], %[ftmp3], %[ftmp2] \n\t" \
+ /* Left part */ \
+ "psllh %[ftmp4], %[ftmp5], %[ftmp1] \n\t" \
+ "paddh %[ftmp4], %[ftmp4], %[ftmp5] \n\t" \
+ "paddh %[ftmp4], %[ftmp4], %[ftmp0] \n\t" \
+ "psrah %[ftmp4], %[ftmp4], %[ftmp2] \n\t" \
+ /* Combine left and right part */ \
+ "packsshb %[ftmp4], %[ftmp3], %[ftmp4] \n\t" \
+ "psubsb %[q2], %[q2], %[ftmp4] \n\t" \
+ "xor %[q2], %[q2], %[ftmp7] \n\t" \
+ "paddsb %[p2], %[p2], %[ftmp4] \n\t" \
+ "xor %[p2], %[p2], %[ftmp7] \n\t"