History

x86/aacpsdsp: add ff_ps_hybrid_synthesis_deint_{sse,sse4}

About 2x faster than the c version.

James Almer committed 9 years ago

Commit e229df91 parent 3c5a53c3 files · +140 −6Browse files

Unified · Split

3 files
  1. libavcodec/x86/aacpsdsp.asm +123 −0
  2. libavcodec/x86/aacpsdsp_init.c +8 −0
  3. libavutil/x86/x86util.asm +9 −6
libavcodec/x86/aacpsdsp.asm+123−0
@@ -166,6 +166,129 @@ align 16 · 165 unmodified lines
166 jl .loop166 jl .loop
167 REP_RET167 REP_RET
168 168
169;***********************************************************
170;void ps_hybrid_synthesis_deint_sse4(float out[2][38][64],
171; float (*in)[32][2],
172; int i, int len)
173;***********************************************************
174%macro HYBRID_SYNTHESIS_DEINT 0
175cglobal ps_hybrid_synthesis_deint, 3, 7, 5, out, in, i, len, out0, out1, tmp
176%if cpuflag(sse4)
177%define MOVH movsd
178%else
179%define MOVH movlps
180%endif
181 movsxdifnidn iq, id
182 mov lend, 32 << 3
183 lea outq, [outq+iq*4]
184 mov tmpd, id
185 shl tmpd, 8
186 add inq, tmpq
187 mov tmpd, 64
188 sub tmpd, id
189 mov id, tmpd
190
191 test id, 1
192 jne .loop4
193 test id, 2
194 jne .loop8
195
196align 16
197.loop16:
198 mov out0q, outq
199 mov out1q, 38*64*4
200 add out1q, out0q
201 mov tmpd, lend
202
203.inner_loop16:
204 movaps m0, [inq]
205 movaps m1, [inq+lenq]
206 movaps m2, [inq+lenq*2]
207 movaps m3, [inq+3*32*2*4]
208 TRANSPOSE4x4PS 0, 1, 2, 3, 4
209 movaps [out0q], m0
210 movaps [out1q], m1
211 movaps [out0q+lenq], m2
212 movaps [out1q+lenq], m3
213 lea out0q, [out0q+lenq*2]
214 lea out1q, [out1q+lenq*2]
215 add inq, mmsize
216 sub tmpd, mmsize
217 jg .inner_loop16
218 add outq, 16
219 add inq, 3*32*2*4
220 sub id, 4
221 jg .loop16
222 RET
223
224align 16
225.loop8:
226 mov out0q, outq
227 mov out1q, 38*64*4
228 add out1q, out0q
229 mov tmpd, lend
230
231.inner_loop8:
232 movaps m0, [inq]
233 movaps m1, [inq+lenq]
234 SBUTTERFLYPS 0, 1, 2
235 SBUTTERFLYPD 0, 1, 2
236 MOVH [out0q], m0
237 MOVH [out1q], m1
238 movhps [out0q+lenq], m0
239 movhps [out1q+lenq], m1
240 lea out0q, [out0q+lenq*2]
241 lea out1q, [out1q+lenq*2]
242 add inq, mmsize
243 sub tmpd, mmsize
244 jg .inner_loop8
245 add outq, 8
246 add inq, lenq
247 sub id, 2
248 jg .loop16
249 RET
250
251align 16
252.loop4:
253 mov out0q, outq
254 mov out1q, 38*64*4
255 add out1q, out0q
256 mov tmpd, lend
257
258.inner_loop4:
259 movaps m0, [inq]
260 movss [out0q], m0
261%if cpuflag(sse4)
262 extractps [out1q], m0, 1
263 extractps [out0q+lenq], m0, 2
264 extractps [out1q+lenq], m0, 3
265%else
266 movhlps m1, m0
267 movss [out0q+lenq], m1
268 shufps m0, m0, 0xb1
269 movss [out1q], m0
270 movhlps m1, m0
271 movss [out1q+lenq], m1
272%endif
273 lea out0q, [out0q+lenq*2]
274 lea out1q, [out1q+lenq*2]
275 add inq, mmsize
276 sub tmpd, mmsize
277 jg .inner_loop4
278 add outq, 4
279 sub id, 1
280 test id, 2
281 jne .loop8
282 cmp id, 4
283 jge .loop16
284 RET
285%endmacro
286
287INIT_XMM sse
288HYBRID_SYNTHESIS_DEINT
289INIT_XMM sse4
290HYBRID_SYNTHESIS_DEINT
291
169;*******************************************************************292;*******************************************************************
170;void ff_ps_hybrid_analysis_<opt>(float (*out)[2], float (*in)[2],293;void ff_ps_hybrid_analysis_<opt>(float (*out)[2], float (*in)[2],
171; const float (*filter)[8][2],294; const float (*filter)[8][2],
libavcodec/x86/aacpsdsp_init.c+8−0
@@ -40,6 +40,10 @@ void ff_ps_stereo_interpolate_sse3(float (*l)[2], float (*r)[2], · 39 unmodified lines
40void ff_ps_stereo_interpolate_ipdopd_sse3(float (*l)[2], float (*r)[2],40void ff_ps_stereo_interpolate_ipdopd_sse3(float (*l)[2], float (*r)[2],
41 float h[2][4], float h_step[2][4],41 float h[2][4], float h_step[2][4],
42 int len);42 int len);
43void ff_ps_hybrid_synthesis_deint_sse(float out[2][38][64], float (*in)[32][2],
44 int i, int len);
45void ff_ps_hybrid_synthesis_deint_sse4(float out[2][38][64], float (*in)[32][2],
46 int i, int len);
43 47
44av_cold void ff_psdsp_init_x86(PSDSPContext *s)48av_cold void ff_psdsp_init_x86(PSDSPContext *s)
45{49{
@@ -48,6 +52,7 @@ av_cold void ff_psdsp_init_x86(PSDSPContext *s) · 2 unmodified lines
48 if (EXTERNAL_SSE(cpu_flags)) {52 if (EXTERNAL_SSE(cpu_flags)) {
49 s->add_squares = ff_ps_add_squares_sse;53 s->add_squares = ff_ps_add_squares_sse;
50 s->mul_pair_single = ff_ps_mul_pair_single_sse;54 s->mul_pair_single = ff_ps_mul_pair_single_sse;
55 s->hybrid_synthesis_deint = ff_ps_hybrid_synthesis_deint_sse;
51 s->hybrid_analysis = ff_ps_hybrid_analysis_sse;56 s->hybrid_analysis = ff_ps_hybrid_analysis_sse;
52 }57 }
53 if (EXTERNAL_SSE3(cpu_flags)) {58 if (EXTERNAL_SSE3(cpu_flags)) {
@@ -56,4 +61,7 @@ av_cold void ff_psdsp_init_x86(PSDSPContext *s) · 2 unmodified lines
56 s->stereo_interpolate[1] = ff_ps_stereo_interpolate_ipdopd_sse3;61 s->stereo_interpolate[1] = ff_ps_stereo_interpolate_ipdopd_sse3;
57 s->hybrid_analysis = ff_ps_hybrid_analysis_sse3;62 s->hybrid_analysis = ff_ps_hybrid_analysis_sse3;
58 }63 }
64 if (EXTERNAL_SSE4(cpu_flags)) {
65 s->hybrid_synthesis_deint = ff_ps_hybrid_synthesis_deint_sse4;
66 }
59}67}
libavutil/x86/x86util.asm+9−6
@@ -71,6 +71,12 @@ · 70 unmodified lines
71 SWAP %1, %3, %271 SWAP %1, %3, %2
72%endmacro72%endmacro
73 73
74%macro SBUTTERFLYPD 3
75 movlhps m%3, m%1, m%2
76 movhlps m%2, m%2, m%1
77 SWAP %1, %3
78%endmacro
79
74%macro TRANSPOSE4x4B 580%macro TRANSPOSE4x4B 5
75 SBUTTERFLY bw, %1, %2, %581 SBUTTERFLY bw, %1, %2, %5
76 SBUTTERFLY bw, %3, %4, %582 SBUTTERFLY bw, %3, %4, %5
@@ -117,12 +123,9 @@ · 40 unmodified lines
117%macro TRANSPOSE4x4PS 5123%macro TRANSPOSE4x4PS 5
118 SBUTTERFLYPS %1, %2, %5124 SBUTTERFLYPS %1, %2, %5
119 SBUTTERFLYPS %3, %4, %5125 SBUTTERFLYPS %3, %4, %5
120 movlhps m%5, m%1, m%3126 SBUTTERFLYPD %1, %3, %5
121 movhlps m%3, m%1127 SBUTTERFLYPD %2, %4, %5
122 SWAP %5, %1128 SWAP %2, %3
123 movlhps m%5, m%2, m%4
124 movhlps m%4, m%2
125 SWAP %5, %2, %3
126%endmacro129%endmacro
127 130
128%macro TRANSPOSE8x4D 9-11131%macro TRANSPOSE8x4D 9-11

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