History

avcodec/mips: [loongson] optimize vp8 decoding in vp8dsp.

Optimize vp8 loop filter with mmi, four functions optimized: 1. ff_vp8_h_loop_filter8uv_mmi. 2. ff_vp8_v_loop_filter8uv_mmi. 3. ff_vp8_h_loop_filter16_mmi. 4. ff_vp8_v_loop_filter16_mmi. Vp8 decoding speed improved about 50%(from 73fps to 110fps, Tested on loongson 3A3000).

gxw committed 8 years ago

Commit 090647d1 parent 8ef7fb82 files · +394 −36Browse files

Unified · Split

2 files
  1. libavcodec/mips/vp8dsp_mmi.c +366 −36
  2. libavutil/mips/mmiutils.h +28 −0
libavcodec/mips/vp8dsp_mmi.c+366−36
@@ -25,6 +25,221 @@ · 24 unmodified lines
2525 #include "constants.h"
2626 #include "libavutil/mips/mmiutils.h"
2727
28+#define DECLARE_DOUBLE_1 double db_1
29+#define DECLARE_DOUBLE_2 double db_2
30+#define DECLARE_UINT32_T uint32_t it_1
31+#define RESTRICT_ASM_DOUBLE_1 [db_1]"=&f"(db_1)
32+#define RESTRICT_ASM_DOUBLE_2 [db_2]"=&f"(db_2)
33+#define RESTRICT_ASM_UINT32_T [it_1]"=&r"(it_1)
34+
35+#define MMI_PCMPGTUB(dst, src1, src2) \
36+ "pcmpeqb %[db_1], "#src1", "#src2" \n\t" \
37+ "pmaxub %[db_2], "#src1", "#src2" \n\t" \
38+ "pcmpeqb %[db_2], %[db_2], "#src1" \n\t" \
39+ "xor "#dst", %[db_2], %[db_1] \n\t"
40+
41+#define MMI_BTOH(dst_l, dst_r, src) \
42+ "xor %[db_1], %[db_1], %[db_1] \n\t" \
43+ "pcmpgtb %[db_2], %[db_1], "#src" \n\t" \
44+ "punpcklbh "#dst_r", "#src", %[db_2] \n\t" \
45+ "punpckhbh "#dst_l", "#src", %[db_2] \n\t"
46+
47+#define MMI_TRANSPOSE8x8_UB_UB(src_0, src_1, src_2, src_3, \
48+ src_4, src_5, src_6, src_7, \
49+ dst_0, dst_1, dst_2, dst_3, \
50+ dst_4, dst_5, dst_6, dst_7) \
51+ "li %[it_1], 0xe4 \n\t" \
52+ "dmtc1 %[it_1], %[db_1] \n\t" \
53+ "pshufh %[db_2], "#src_0", %[db_1] \n\t" \
54+ "punpcklbh "#dst_0", "#src_0", "#src_1" \n\t" \
55+ "punpckhbh "#dst_1", %[db_2], "#src_1" \n\t" \
56+ "pshufh %[db_2], "#src_2", %[db_1] \n\t" \
57+ "punpcklbh "#dst_2", "#src_2", "#src_3" \n\t" \
58+ "punpckhbh "#dst_3", %[db_2], "#src_3" \n\t" \
59+ "pshufh %[db_2], "#src_4", %[db_1] \n\t" \
60+ "punpcklbh "#dst_4", "#src_4", "#src_5" \n\t" \
61+ "punpckhbh "#dst_5", %[db_2], "#src_5" \n\t" \
62+ "pshufh %[db_2], "#src_6", %[db_1] \n\t" \
63+ "punpcklbh "#dst_6", "#src_6", "#src_7" \n\t" \
64+ "punpckhbh "#dst_7", %[db_2], "#src_7" \n\t" \
65+ \
66+ "pshufh %[db_2], "#dst_0", %[db_1] \n\t" \
67+ "punpcklhw "#dst_0", "#dst_0", "#dst_2" \n\t" \
68+ "punpckhhw "#dst_2", %[db_2], "#dst_2" \n\t" \
69+ "pshufh %[db_2], "#dst_1", %[db_1] \n\t" \
70+ "punpcklhw "#dst_1", "#dst_1", "#dst_3" \n\t" \
71+ "punpckhhw "#dst_3", %[db_2], "#dst_3" \n\t" \
72+ "pshufh %[db_2], "#dst_4", %[db_1] \n\t" \
73+ "punpcklhw "#dst_4", "#dst_4", "#dst_6" \n\t" \
74+ "punpckhhw "#dst_6", %[db_2], "#dst_6" \n\t" \
75+ "pshufh %[db_2], "#dst_5", %[db_1] \n\t" \
76+ "punpcklhw "#dst_5", "#dst_5", "#dst_7" \n\t" \
77+ "punpckhhw "#dst_7", %[db_2], "#dst_7" \n\t" \
78+ \
79+ "pshufh %[db_2], "#dst_0", %[db_1] \n\t" \
80+ "punpcklwd "#dst_0", "#dst_0", "#dst_4" \n\t" \
81+ "punpckhwd "#dst_4", %[db_2], "#dst_4" \n\t" \
82+ "pshufh %[db_2], "#dst_1", %[db_1] \n\t" \
83+ "punpcklwd "#dst_1", "#dst_1", "#dst_5" \n\t" \
84+ "punpckhwd "#dst_5", %[db_2], "#dst_5" \n\t" \
85+ "pshufh %[db_2], "#dst_2", %[db_1] \n\t" \
86+ "punpcklwd "#dst_2", "#dst_2", "#dst_6" \n\t" \
87+ "punpckhwd "#dst_6", %[db_2], "#dst_6" \n\t" \
88+ "pshufh %[db_2], "#dst_3", %[db_1] \n\t" \
89+ "punpcklwd "#dst_3", "#dst_3", "#dst_7" \n\t" \
90+ "punpckhwd "#dst_7", %[db_2], "#dst_7" \n\t" \
91+ \
92+ "pshufh %[db_2], "#dst_1", %[db_1] \n\t" \
93+ "pshufh "#dst_1", "#dst_4", %[db_1] \n\t" \
94+ "pshufh "#dst_4", %[db_2], %[db_1] \n\t" \
95+ "pshufh %[db_2], "#dst_3", %[db_1] \n\t" \
96+ "pshufh "#dst_3", "#dst_6", %[db_1] \n\t" \
97+ "pshufh "#dst_6", %[db_2], %[db_1] \n\t"
98+
99+#define MMI_VP8_LOOP_FILTER \
100+ /* Calculation of hev */ \
101+ "dmtc1 %[thresh], %[ftmp3] \n\t" \
102+ "punpcklbh %[ftmp3], %[ftmp3], %[ftmp3] \n\t" \
103+ "punpcklhw %[ftmp3], %[ftmp3], %[ftmp3] \n\t" \
104+ "punpcklwd %[ftmp3], %[ftmp3], %[ftmp3] \n\t" \
105+ "pasubub %[ftmp0], %[p1], %[p0] \n\t" \
106+ "pasubub %[ftmp1], %[q1], %[q0] \n\t" \
107+ "pmaxub %[ftmp0], %[ftmp0], %[ftmp1] \n\t" \
108+ MMI_PCMPGTUB(%[hev], %[ftmp0], %[ftmp3]) \
109+ /* Calculation of mask */ \
110+ "pasubub %[ftmp1], %[p0], %[q0] \n\t" \
111+ "paddusb %[ftmp1], %[ftmp1], %[ftmp1] \n\t" \
112+ "pasubub %[ftmp2], %[p1], %[q1] \n\t" \
113+ "li %[tmp0], 0x09 \n\t" \
114+ "dmtc1 %[tmp0], %[ftmp3] \n\t" \
115+ PSRLB_MMI(%[ftmp2], %[ftmp3], %[ftmp4], %[ftmp5], %[ftmp2]) \
116+ "paddusb %[ftmp1], %[ftmp1], %[ftmp2] \n\t" \
117+ "dmtc1 %[e], %[ftmp3] \n\t" \
118+ "punpcklbh %[ftmp3], %[ftmp3], %[ftmp3] \n\t" \
119+ "punpcklhw %[ftmp3], %[ftmp3], %[ftmp3] \n\t" \
120+ "punpcklwd %[ftmp3], %[ftmp3], %[ftmp3] \n\t" \
121+ MMI_PCMPGTUB(%[mask], %[ftmp1], %[ftmp3]) \
122+ "pmaxub %[mask], %[mask], %[ftmp0] \n\t" \
123+ "pasubub %[ftmp1], %[p3], %[p2] \n\t" \
124+ "pasubub %[ftmp2], %[p2], %[p1] \n\t" \
125+ "pmaxub %[ftmp1], %[ftmp1], %[ftmp2] \n\t" \
126+ "pmaxub %[mask], %[mask], %[ftmp1] \n\t" \
127+ "pasubub %[ftmp1], %[q3], %[q2] \n\t" \
128+ "pasubub %[ftmp2], %[q2], %[q1] \n\t" \
129+ "pmaxub %[ftmp1], %[ftmp1], %[ftmp2] \n\t" \
130+ "pmaxub %[mask], %[mask], %[ftmp1] \n\t" \
131+ "dmtc1 %[i], %[ftmp3] \n\t" \
132+ "punpcklbh %[ftmp3], %[ftmp3], %[ftmp3] \n\t" \
133+ "punpcklhw %[ftmp3], %[ftmp3], %[ftmp3] \n\t" \
134+ "punpcklwd %[ftmp3], %[ftmp3], %[ftmp3] \n\t" \
135+ MMI_PCMPGTUB(%[mask], %[mask], %[ftmp3]) \
136+ "pcmpeqw %[ftmp3], %[ftmp3], %[ftmp3] \n\t" \
137+ "xor %[mask], %[mask], %[ftmp3] \n\t" \
138+ /* VP8_MBFILTER */ \
139+ "li %[tmp0], 0x80808080 \n\t" \
140+ "dmtc1 %[tmp0], %[ftmp7] \n\t" \
141+ "punpcklwd %[ftmp7], %[ftmp7], %[ftmp7] \n\t" \
142+ "xor %[p2], %[p2], %[ftmp7] \n\t" \
143+ "xor %[p1], %[p1], %[ftmp7] \n\t" \
144+ "xor %[p0], %[p0], %[ftmp7] \n\t" \
145+ "xor %[q0], %[q0], %[ftmp7] \n\t" \
146+ "xor %[q1], %[q1], %[ftmp7] \n\t" \
147+ "xor %[q2], %[q2], %[ftmp7] \n\t" \
148+ "psubsb %[ftmp4], %[p1], %[q1] \n\t" \
149+ "psubb %[ftmp5], %[q0], %[p0] \n\t" \
150+ MMI_BTOH(%[ftmp1], %[ftmp0], %[ftmp5]) \
151+ MMI_BTOH(%[ftmp3], %[ftmp2], %[ftmp4]) \
152+ /* Right part */ \
153+ "paddh %[ftmp5], %[ftmp0], %[ftmp0] \n\t" \
154+ "paddh %[ftmp0], %[ftmp0], %[ftmp5] \n\t" \
155+ "paddh %[ftmp0], %[ftmp2], %[ftmp0] \n\t" \
156+ /* Left part */ \
157+ "paddh %[ftmp5], %[ftmp1], %[ftmp1] \n\t" \
158+ "paddh %[ftmp1], %[ftmp1], %[ftmp5] \n\t" \
159+ "paddh %[ftmp1], %[ftmp3], %[ftmp1] \n\t" \
160+ /* Combine left and right part */ \
161+ "packsshb %[ftmp1], %[ftmp0], %[ftmp1] \n\t" \
162+ "and %[ftmp1], %[ftmp1], %[mask] \n\t" \
163+ "and %[ftmp2], %[ftmp1], %[hev] \n\t" \
164+ "li %[tmp0], 0x04040404 \n\t" \
165+ "dmtc1 %[tmp0], %[ftmp0] \n\t" \
166+ "punpcklwd %[ftmp0], %[ftmp0], %[ftmp0] \n\t" \
167+ "paddsb %[ftmp3], %[ftmp2], %[ftmp0] \n\t" \
168+ "li %[tmp0], 0x0B \n\t" \
169+ "dmtc1 %[tmp0], %[ftmp4] \n\t" \
170+ PSRAB_MMI(%[ftmp3], %[ftmp4], %[ftmp5], %[ftmp6], %[ftmp3]) \
171+ "li %[tmp0], 0x03030303 \n\t" \
172+ "dmtc1 %[tmp0], %[ftmp0] \n\t" \
173+ "punpcklwd %[ftmp0], %[ftmp0], %[ftmp0] \n\t" \
174+ "paddsb %[ftmp4], %[ftmp2], %[ftmp0] \n\t" \
175+ "li %[tmp0], 0x0B \n\t" \
176+ "dmtc1 %[tmp0], %[ftmp2] \n\t" \
177+ PSRAB_MMI(%[ftmp4], %[ftmp2], %[ftmp5], %[ftmp6], %[ftmp4]) \
178+ "psubsb %[q0], %[q0], %[ftmp3] \n\t" \
179+ "paddsb %[p0], %[p0], %[ftmp4] \n\t" \
180+ /* filt_val &= ~hev */ \
181+ "pcmpeqw %[ftmp0], %[ftmp0], %[ftmp0] \n\t" \
182+ "xor %[hev], %[hev], %[ftmp0] \n\t" \
183+ "and %[ftmp1], %[ftmp1], %[hev] \n\t" \
184+ MMI_BTOH(%[ftmp5], %[ftmp6], %[ftmp1]) \
185+ "li %[tmp0], 0x07 \n\t" \
186+ "dmtc1 %[tmp0], %[ftmp2] \n\t" \
187+ "li %[tmp0], 0x001b001b \n\t" \
188+ "dmtc1 %[tmp0], %[ftmp1] \n\t" \
189+ "punpcklwd %[ftmp1], %[ftmp1], %[ftmp1] \n\t" \
190+ "li %[tmp0], 0x003f003f \n\t" \
191+ "dmtc1 %[tmp0], %[ftmp0] \n\t" \
192+ "punpcklwd %[ftmp0], %[ftmp0], %[ftmp0] \n\t" \
193+ /* Right part */ \
194+ "pmullh %[ftmp3], %[ftmp6], %[ftmp1] \n\t" \
195+ "paddh %[ftmp3], %[ftmp3], %[ftmp0] \n\t" \
196+ "psrah %[ftmp3], %[ftmp3], %[ftmp2] \n\t" \
197+ /* Left part */ \
198+ "pmullh %[ftmp4], %[ftmp5], %[ftmp1] \n\t" \
199+ "paddh %[ftmp4], %[ftmp4], %[ftmp0] \n\t" \
200+ "psrah %[ftmp4], %[ftmp4], %[ftmp2] \n\t" \
201+ /* Combine left and right part */ \
202+ "packsshb %[ftmp4], %[ftmp3], %[ftmp4] \n\t" \
203+ "psubsb %[q0], %[q0], %[ftmp4] \n\t" \
204+ "xor %[q0], %[q0], %[ftmp7] \n\t" \
205+ "paddsb %[p0], %[p0], %[ftmp4] \n\t" \
206+ "xor %[p0], %[p0], %[ftmp7] \n\t" \
207+ "li %[tmp0], 0x00120012 \n\t" \
208+ "dmtc1 %[tmp0], %[ftmp1] \n\t" \
209+ "punpcklwd %[ftmp1], %[ftmp1], %[ftmp1] \n\t" \
210+ /* Right part */ \
211+ "pmullh %[ftmp3], %[ftmp6], %[ftmp1] \n\t" \
212+ "paddh %[ftmp3], %[ftmp3], %[ftmp0] \n\t" \
213+ "psrah %[ftmp3], %[ftmp3], %[ftmp2] \n\t" \
214+ /* Left part */ \
215+ "pmullh %[ftmp4], %[ftmp5], %[ftmp1] \n\t" \
216+ "paddh %[ftmp4], %[ftmp4], %[ftmp0] \n\t" \
217+ "psrah %[ftmp4], %[ftmp4], %[ftmp2] \n\t" \
218+ /* Combine left and right part */ \
219+ "packsshb %[ftmp4], %[ftmp3], %[ftmp4] \n\t" \
220+ "psubsb %[q1], %[q1], %[ftmp4] \n\t" \
221+ "xor %[q1], %[q1], %[ftmp7] \n\t" \
222+ "paddsb %[p1], %[p1], %[ftmp4] \n\t" \
223+ "xor %[p1], %[p1], %[ftmp7] \n\t" \
224+ "li %[tmp0], 0x03 \n\t" \
225+ "dmtc1 %[tmp0], %[ftmp1] \n\t" \
226+ /* Right part */ \
227+ "psllh %[ftmp3], %[ftmp6], %[ftmp1] \n\t" \
228+ "paddh %[ftmp3], %[ftmp3], %[ftmp6] \n\t" \
229+ "paddh %[ftmp3], %[ftmp3], %[ftmp0] \n\t" \
230+ "psrah %[ftmp3], %[ftmp3], %[ftmp2] \n\t" \
231+ /* Left part */ \
232+ "psllh %[ftmp4], %[ftmp5], %[ftmp1] \n\t" \
233+ "paddh %[ftmp4], %[ftmp4], %[ftmp5] \n\t" \
234+ "paddh %[ftmp4], %[ftmp4], %[ftmp0] \n\t" \
235+ "psrah %[ftmp4], %[ftmp4], %[ftmp2] \n\t" \
236+ /* Combine left and right part */ \
237+ "packsshb %[ftmp4], %[ftmp3], %[ftmp4] \n\t" \
238+ "psubsb %[q2], %[q2], %[ftmp4] \n\t" \
239+ "xor %[q2], %[q2], %[ftmp7] \n\t" \
240+ "paddsb %[p2], %[p2], %[ftmp4] \n\t" \
241+ "xor %[p2], %[p2], %[ftmp7] \n\t"
242+
28243 #define PUT_VP8_EPEL4_H6_MMI(src, dst) \
29244 MMI_ULWC1(%[ftmp1], src, 0x00) \
30245 "punpcklbh %[ftmp2], %[ftmp1], %[ftmp0] \n\t" \
@@ -621,15 +836,71 @@ static av_always_inline int vp8_normal_limit(uint8_t *p, ptrdiff_t stride, · 590 unmodified lines
621836 static av_always_inline void vp8_v_loop_filter8_mmi(uint8_t *dst,
622837 ptrdiff_t stride, int flim_E, int flim_I, int hev_thresh)
623838 {
624− int i;
625−
626− for (i = 0; i < 8; i++)
627− if (vp8_normal_limit(dst + i * 1, stride, flim_E, flim_I)) {
628− if (hev(dst + i * 1, stride, hev_thresh))
629− vp8_filter_common_is4tap(dst + i * 1, stride);
630− else
631− filter_mbedge(dst + i * 1, stride);
632− }
839+ double ftmp[18];
840+ uint32_t tmp[1];
841+ DECLARE_DOUBLE_1;
842+ DECLARE_DOUBLE_2;
843+ DECLARE_UINT32_T;
844+ __asm__ volatile(
845+ /* Get data from dst */
846+ "gsldlc1 %[q0], 0x07(%[dst]) \n\t"
847+ "gsldrc1 %[q0], 0x00(%[dst]) \n\t"
848+ PTR_SUBU "%[tmp0], %[dst], %[stride] \n\t"
849+ "gsldlc1 %[p0], 0x07(%[tmp0]) \n\t"
850+ "gsldrc1 %[p0], 0x00(%[tmp0]) \n\t"
851+ PTR_SUBU "%[tmp0], %[tmp0], %[stride] \n\t"
852+ "gsldlc1 %[p1], 0x07(%[tmp0]) \n\t"
853+ "gsldrc1 %[p1], 0x00(%[tmp0]) \n\t"
854+ PTR_SUBU "%[tmp0], %[tmp0], %[stride] \n\t"
855+ "gsldlc1 %[p2], 0x07(%[tmp0]) \n\t"
856+ "gsldrc1 %[p2], 0x00(%[tmp0]) \n\t"
857+ PTR_SUBU "%[tmp0], %[tmp0], %[stride] \n\t"
858+ "gsldlc1 %[p3], 0x07(%[tmp0]) \n\t"
859+ "gsldrc1 %[p3], 0x00(%[tmp0]) \n\t"
860+ PTR_ADDU "%[tmp0], %[dst], %[stride] \n\t"
861+ "gsldlc1 %[q1], 0x07(%[tmp0]) \n\t"
862+ "gsldrc1 %[q1], 0x00(%[tmp0]) \n\t"
863+ PTR_ADDU "%[tmp0], %[tmp0], %[stride] \n\t"
864+ "gsldlc1 %[q2], 0x07(%[tmp0]) \n\t"
865+ "gsldrc1 %[q2], 0x00(%[tmp0]) \n\t"
866+ PTR_ADDU "%[tmp0], %[tmp0], %[stride] \n\t"
867+ "gsldlc1 %[q3], 0x07(%[tmp0]) \n\t"
868+ "gsldrc1 %[q3], 0x00(%[tmp0]) \n\t"
869+ MMI_VP8_LOOP_FILTER
870+ /* Move to dst */
871+ "gssdlc1 %[q0], 0x07(%[dst]) \n\t"
872+ "gssdrc1 %[q0], 0x00(%[dst]) \n\t"
873+ PTR_SUBU "%[tmp0], %[dst], %[stride] \n\t"
874+ "gssdlc1 %[p0], 0x07(%[tmp0]) \n\t"
875+ "gssdrc1 %[p0], 0x00(%[tmp0]) \n\t"
876+ PTR_SUBU "%[tmp0], %[tmp0], %[stride] \n\t"
877+ "gssdlc1 %[p1], 0x07(%[tmp0]) \n\t"
878+ "gssdrc1 %[p1], 0x00(%[tmp0]) \n\t"
879+ PTR_SUBU "%[tmp0], %[tmp0], %[stride] \n\t"
880+ "gssdlc1 %[p2], 0x07(%[tmp0]) \n\t"
881+ "gssdrc1 %[p2], 0x00(%[tmp0]) \n\t"
882+ PTR_ADDU "%[tmp0], %[dst], %[stride] \n\t"
883+ "gssdlc1 %[q1], 0x07(%[tmp0]) \n\t"
884+ "gssdrc1 %[q1], 0x00(%[tmp0]) \n\t"
885+ PTR_ADDU "%[tmp0], %[tmp0], %[stride] \n\t"
886+ "gssdlc1 %[q2], 0x07(%[tmp0]) \n\t"
887+ "gssdrc1 %[q2], 0x00(%[tmp0]) \n\t"
888+ : [p3]"=&f"(ftmp[0]), [p2]"=&f"(ftmp[1]),
889+ [p1]"=&f"(ftmp[2]), [p0]"=&f"(ftmp[3]),
890+ [q0]"=&f"(ftmp[4]), [q1]"=&f"(ftmp[5]),
891+ [q2]"=&f"(ftmp[6]), [q3]"=&f"(ftmp[7]),
892+ [ftmp0]"=&f"(ftmp[8]), [ftmp1]"=&f"(ftmp[9]),
893+ [ftmp2]"=&f"(ftmp[10]), [ftmp3]"=&f"(ftmp[11]),
894+ [hev]"=&f"(ftmp[12]), [mask]"=&f"(ftmp[13]),
895+ [ftmp4]"=&f"(ftmp[14]), [ftmp5]"=&f"(ftmp[15]),
896+ [ftmp6]"=&f"(ftmp[16]), [ftmp7]"=&f"(ftmp[17]),
897+ [dst]"+&r"(dst), [tmp0]"=&r"(tmp[0]),
898+ RESTRICT_ASM_DOUBLE_1, RESTRICT_ASM_DOUBLE_2,
899+ RESTRICT_ASM_UINT32_T
900+ : [e]"r"((mips_reg)flim_E), [thresh]"r"((mips_reg)hev_thresh),
901+ [i]"r"((mips_reg)flim_I), [stride]"r"((mips_reg)stride)
902+ : "memory"
903+ );
633904 }
634905
635906 static av_always_inline void vp8_v_loop_filter8_inner_mmi(uint8_t *dst,
@@ -650,15 +921,87 @@ static av_always_inline void vp8_v_loop_filter8_inner_mmi(uint8_t *dst, · 14 unmodified lines
650921 static av_always_inline void vp8_h_loop_filter8_mmi(uint8_t *dst,
651922 ptrdiff_t stride, int flim_E, int flim_I, int hev_thresh)
652923 {
653− int i;
654−
655− for (i = 0; i < 8; i++)
656− if (vp8_normal_limit(dst + i * stride, 1, flim_E, flim_I)) {
657− if (hev(dst + i * stride, 1, hev_thresh))
658− vp8_filter_common_is4tap(dst + i * stride, 1);
659− else
660− filter_mbedge(dst + i * stride, 1);
661− }
924+ double ftmp[18];
925+ uint32_t tmp[1];
926+ DECLARE_DOUBLE_1;
927+ DECLARE_DOUBLE_2;
928+ DECLARE_UINT32_T;
929+ __asm__ volatile(
930+ /* Get data from dst */
931+ "gsldlc1 %[p3], 0x03(%[dst]) \n\t"
932+ "gsldrc1 %[p3], -0x04(%[dst]) \n\t"
933+ PTR_ADDU "%[tmp0], %[dst], %[stride] \n\t"
934+ "gsldlc1 %[p2], 0x03(%[tmp0]) \n\t"
935+ "gsldrc1 %[p2], -0x04(%[tmp0]) \n\t"
936+ PTR_ADDU "%[tmp0], %[tmp0], %[stride] \n\t"
937+ "gsldlc1 %[p1], 0x03(%[tmp0]) \n\t"
938+ "gsldrc1 %[p1], -0x04(%[tmp0]) \n\t"
939+ PTR_ADDU "%[tmp0], %[tmp0], %[stride] \n\t"
940+ "gsldlc1 %[p0], 0x03(%[tmp0]) \n\t"
941+ "gsldrc1 %[p0], -0x04(%[tmp0]) \n\t"
942+ PTR_ADDU "%[tmp0], %[tmp0], %[stride] \n\t"
943+ "gsldlc1 %[q0], 0x03(%[tmp0]) \n\t"
944+ "gsldrc1 %[q0], -0x04(%[tmp0]) \n\t"
945+ PTR_ADDU "%[tmp0], %[tmp0], %[stride] \n\t"
946+ "gsldlc1 %[q1], 0x03(%[tmp0]) \n\t"
947+ "gsldrc1 %[q1], -0x04(%[tmp0]) \n\t"
948+ PTR_ADDU "%[tmp0], %[tmp0], %[stride] \n\t"
949+ "gsldlc1 %[q2], 0x03(%[tmp0]) \n\t"
950+ "gsldrc1 %[q2], -0x04(%[tmp0]) \n\t"
951+ PTR_ADDU "%[tmp0], %[tmp0], %[stride] \n\t"
952+ "gsldlc1 %[q3], 0x03(%[tmp0]) \n\t"
953+ "gsldrc1 %[q3], -0x04(%[tmp0]) \n\t"
954+ /* Matrix transpose */
955+ MMI_TRANSPOSE8x8_UB_UB(%[p3], %[p2], %[p1], %[p0],
956+ %[q0], %[q1], %[q2], %[q3],
957+ %[p3], %[p2], %[p1], %[p0],
958+ %[q0], %[q1], %[q2], %[q3])
959+ MMI_VP8_LOOP_FILTER
960+ /* Matrix transpose */
961+ MMI_TRANSPOSE8x8_UB_UB(%[p3], %[p2], %[p1], %[p0],
962+ %[q0], %[q1], %[q2], %[q3],
963+ %[p3], %[p2], %[p1], %[p0],
964+ %[q0], %[q1], %[q2], %[q3])
965+ /* Move to dst */
966+ "gssdlc1 %[p3], 0x03(%[dst]) \n\t"
967+ "gssdrc1 %[p3], -0x04(%[dst]) \n\t"
968+ PTR_ADDU "%[dst], %[dst], %[stride] \n\t"
969+ "gssdlc1 %[p2], 0x03(%[dst]) \n\t"
970+ "gssdrc1 %[p2], -0x04(%[dst]) \n\t"
971+ PTR_ADDU "%[dst], %[dst], %[stride] \n\t"
972+ "gssdlc1 %[p1], 0x03(%[dst]) \n\t"
973+ "gssdrc1 %[p1], -0x04(%[dst]) \n\t"
974+ PTR_ADDU "%[dst], %[dst], %[stride] \n\t"
975+ "gssdlc1 %[p0], 0x03(%[dst]) \n\t"
976+ "gssdrc1 %[p0], -0x04(%[dst]) \n\t"
977+ PTR_ADDU "%[dst], %[dst], %[stride] \n\t"
978+ "gssdlc1 %[q0], 0x03(%[dst]) \n\t"
979+ "gssdrc1 %[q0], -0x04(%[dst]) \n\t"
980+ PTR_ADDU "%[dst], %[dst], %[stride] \n\t"
981+ "gssdlc1 %[q1], 0x03(%[dst]) \n\t"
982+ "gssdrc1 %[q1], -0x04(%[dst]) \n\t"
983+ PTR_ADDU "%[dst], %[dst], %[stride] \n\t"
984+ "gssdlc1 %[q2], 0x03(%[dst]) \n\t"
985+ "gssdrc1 %[q2], -0x04(%[dst]) \n\t"
986+ PTR_ADDU "%[dst], %[dst], %[stride] \n\t"
987+ "gssdlc1 %[q3], 0x03(%[dst]) \n\t"
988+ "gssdrc1 %[q3], -0x04(%[dst]) \n\t"
989+ : [p3]"=&f"(ftmp[0]), [p2]"=&f"(ftmp[1]),
990+ [p1]"=&f"(ftmp[2]), [p0]"=&f"(ftmp[3]),
991+ [q0]"=&f"(ftmp[4]), [q1]"=&f"(ftmp[5]),
992+ [q2]"=&f"(ftmp[6]), [q3]"=&f"(ftmp[7]),
993+ [ftmp0]"=&f"(ftmp[8]), [ftmp1]"=&f"(ftmp[9]),
994+ [ftmp2]"=&f"(ftmp[10]), [ftmp3]"=&f"(ftmp[11]),
995+ [hev]"=&f"(ftmp[12]), [mask]"=&f"(ftmp[13]),
996+ [ftmp4]"=&f"(ftmp[14]), [ftmp5]"=&f"(ftmp[15]),
997+ [ftmp6]"=&f"(ftmp[16]), [ftmp7]"=&f"(ftmp[17]),
998+ [dst]"+&r"(dst), [tmp0]"=&r"(tmp[0]),
999+ RESTRICT_ASM_DOUBLE_1, RESTRICT_ASM_DOUBLE_2,
1000+ RESTRICT_ASM_UINT32_T
1001+ : [e]"r"((mips_reg)flim_E), [thresh]"r"((mips_reg)hev_thresh),
1002+ [i]"r"((mips_reg)flim_I), [stride]"r"((mips_reg)stride)
1003+ : "memory"
1004+ );
6621005 }
6631006
6641007 static av_always_inline void vp8_h_loop_filter8_inner_mmi(uint8_t *dst,
@@ -1083,29 +1426,16 @@ void ff_vp8_idct_dc_add4uv_mmi(uint8_t *dst, int16_t block[4][16], · 418 unmodified lines
10831426 void ff_vp8_v_loop_filter16_mmi(uint8_t *dst, ptrdiff_t stride, int flim_E,
10841427 int flim_I, int hev_thresh)
10851428 {
1086− int i;
1087−
1088− for (i = 0; i < 16; i++)
1089− if (vp8_normal_limit(dst + i * 1, stride, flim_E, flim_I)) {
1090− if (hev(dst + i * 1, stride, hev_thresh))
1091− vp8_filter_common_is4tap(dst + i * 1, stride);
1092− else
1093− filter_mbedge(dst + i * 1, stride);
1094− }
1429+ vp8_v_loop_filter8_mmi(dst, stride, flim_E, flim_I, hev_thresh);
1430+ vp8_v_loop_filter8_mmi(dst + 8, stride, flim_E, flim_I, hev_thresh);
10951431 }
10961432
10971433 void ff_vp8_h_loop_filter16_mmi(uint8_t *dst, ptrdiff_t stride, int flim_E,
10981434 int flim_I, int hev_thresh)
10991435 {
1100− int i;
1101−
1102− for (i = 0; i < 16; i++)
1103− if (vp8_normal_limit(dst + i * stride, 1, flim_E, flim_I)) {
1104− if (hev(dst + i * stride, 1, hev_thresh))
1105− vp8_filter_common_is4tap(dst + i * stride, 1);
1106− else
1107− filter_mbedge(dst + i * stride, 1);
1108− }
1436+ vp8_h_loop_filter8_mmi(dst, stride, flim_E, flim_I, hev_thresh);
1437+ vp8_h_loop_filter8_mmi(dst + 8 * stride, stride, flim_E, flim_I,
1438+ hev_thresh);
11091439 }
11101440
11111441 void ff_vp8_v_loop_filter8uv_mmi(uint8_t *dstU, uint8_t *dstV, ptrdiff_t stride,
libavutil/mips/mmiutils.h+28−0
@@ -275,6 +275,34 @@ · 274 unmodified lines
275275 "punpcklwd "#m3", "#t2", "#t4" \n\t" \
276276 "punpckhwd "#m4", "#t2", "#t4" \n\t"
277277
278+/**
279+ * brief: Parallel SRA for 8 byte packaged data.
280+ * fr_i0: src
281+ * fr_i1: SRA number(SRAB number + 8)
282+ * fr_t0, fr_t1: temporary register
283+ * fr_d0: dst
284+ */
285+#define PSRAB_MMI(fr_i0, fr_i1, fr_t0, fr_t1, fr_d0) \
286+ "punpcklbh "#fr_t0", "#fr_t0", "#fr_i0" \n\t" \
287+ "punpckhbh "#fr_t1", "#fr_t1", "#fr_i0" \n\t" \
288+ "psrah "#fr_t0", "#fr_t0", "#fr_i1" \n\t" \
289+ "psrah "#fr_t1", "#fr_t1", "#fr_i1" \n\t" \
290+ "packsshb "#fr_d0", "#fr_t0", "#fr_t1" \n\t"
291+
292+/**
293+ * brief: Parallel SRL for 8 byte packaged data.
294+ * fr_i0: src
295+ * fr_i1: SRL number(SRLB number + 8)
296+ * fr_t0, fr_t1: temporary register
297+ * fr_d0: dst
298+ */
299+#define PSRLB_MMI(fr_i0, fr_i1, fr_t0, fr_t1, fr_d0) \
300+ "punpcklbh "#fr_t0", "#fr_t0", "#fr_i0" \n\t" \
301+ "punpckhbh "#fr_t1", "#fr_t1", "#fr_i0" \n\t" \
302+ "psrlh "#fr_t0", "#fr_t0", "#fr_i1" \n\t" \
303+ "psrlh "#fr_t1", "#fr_t1", "#fr_i1" \n\t" \
304+ "packsshb "#fr_d0", "#fr_t0", "#fr_t1" \n\t"
305+
278306
279307 #define PSRAH_4_MMI(fp1, fp2, fp3, fp4, shift) \
280308 "psrah "#fp1", "#fp1", "#shift" \n\t" \

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t