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
25#include "constants.h"25#include "constants.h"
26#include "libavutil/mips/mmiutils.h"26#include "libavutil/mips/mmiutils.h"
27 27
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
28#define PUT_VP8_EPEL4_H6_MMI(src, dst) \243#define PUT_VP8_EPEL4_H6_MMI(src, dst) \
29 MMI_ULWC1(%[ftmp1], src, 0x00) \244 MMI_ULWC1(%[ftmp1], src, 0x00) \
30 "punpcklbh %[ftmp2], %[ftmp1], %[ftmp0] \n\t" \245 "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
621static av_always_inline void vp8_v_loop_filter8_mmi(uint8_t *dst,836static av_always_inline void vp8_v_loop_filter8_mmi(uint8_t *dst,
622 ptrdiff_t stride, int flim_E, int flim_I, int hev_thresh)837 ptrdiff_t stride, int flim_E, int flim_I, int hev_thresh)
623{838{
624 int i;839 double ftmp[18];
625 840 uint32_t tmp[1];
626 for (i = 0; i < 8; i++)841 DECLARE_DOUBLE_1;
627 if (vp8_normal_limit(dst + i * 1, stride, flim_E, flim_I)) {842 DECLARE_DOUBLE_2;
628 if (hev(dst + i * 1, stride, hev_thresh))843 DECLARE_UINT32_T;
629 vp8_filter_common_is4tap(dst + i * 1, stride);844 __asm__ volatile(
630 else845 /* Get data from dst */
631 filter_mbedge(dst + i * 1, stride);846 "gsldlc1 %[q0], 0x07(%[dst]) \n\t"
632 }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 );
633}904}
634 905
635static av_always_inline void vp8_v_loop_filter8_inner_mmi(uint8_t *dst,906static 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
650static av_always_inline void vp8_h_loop_filter8_mmi(uint8_t *dst,921static av_always_inline void vp8_h_loop_filter8_mmi(uint8_t *dst,
651 ptrdiff_t stride, int flim_E, int flim_I, int hev_thresh)922 ptrdiff_t stride, int flim_E, int flim_I, int hev_thresh)
652{923{
653 int i;924 double ftmp[18];
654 925 uint32_t tmp[1];
655 for (i = 0; i < 8; i++)926 DECLARE_DOUBLE_1;
656 if (vp8_normal_limit(dst + i * stride, 1, flim_E, flim_I)) {927 DECLARE_DOUBLE_2;
657 if (hev(dst + i * stride, 1, hev_thresh))928 DECLARE_UINT32_T;
658 vp8_filter_common_is4tap(dst + i * stride, 1);929 __asm__ volatile(
659 else930 /* Get data from dst */
660 filter_mbedge(dst + i * stride, 1);931 "gsldlc1 %[p3], 0x03(%[dst]) \n\t"
661 }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 );
662}1005}
663 1006
664static av_always_inline void vp8_h_loop_filter8_inner_mmi(uint8_t *dst,1007static 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
1083void ff_vp8_v_loop_filter16_mmi(uint8_t *dst, ptrdiff_t stride, int flim_E,1426void ff_vp8_v_loop_filter16_mmi(uint8_t *dst, ptrdiff_t stride, int flim_E,
1084 int flim_I, int hev_thresh)1427 int flim_I, int hev_thresh)
1085{1428{
1086 int i;1429 vp8_v_loop_filter8_mmi(dst, stride, flim_E, flim_I, hev_thresh);
1087 1430 vp8_v_loop_filter8_mmi(dst + 8, stride, flim_E, flim_I, hev_thresh);
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 }
1095}1431}
1096 1432
1097void ff_vp8_h_loop_filter16_mmi(uint8_t *dst, ptrdiff_t stride, int flim_E,1433void ff_vp8_h_loop_filter16_mmi(uint8_t *dst, ptrdiff_t stride, int flim_E,
1098 int flim_I, int hev_thresh)1434 int flim_I, int hev_thresh)
1099{1435{
1100 int i;1436 vp8_h_loop_filter8_mmi(dst, stride, flim_E, flim_I, hev_thresh);
1101 1437 vp8_h_loop_filter8_mmi(dst + 8 * stride, stride, flim_E, flim_I,
1102 for (i = 0; i < 16; i++)1438 hev_thresh);
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 }
1109}1439}
1110 1440
1111void ff_vp8_v_loop_filter8uv_mmi(uint8_t *dstU, uint8_t *dstV, ptrdiff_t stride,1441void 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
275 "punpcklwd "#m3", "#t2", "#t4" \n\t" \275 "punpcklwd "#m3", "#t2", "#t4" \n\t" \
276 "punpckhwd "#m4", "#t2", "#t4" \n\t"276 "punpckhwd "#m4", "#t2", "#t4" \n\t"
277 277
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
278 306
279#define PSRAH_4_MMI(fp1, fp2, fp3, fp4, shift) \307#define PSRAH_4_MMI(fp1, fp2, fp3, fp4, shift) \
280 "psrah "#fp1", "#fp1", "#shift" \n\t" \308 "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