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
166166 jl .loop
167167 REP_RET
168168
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
175+cglobal 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+
196+align 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+
224+align 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+
251+align 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+
287+INIT_XMM sse
288+HYBRID_SYNTHESIS_DEINT
289+INIT_XMM sse4
290+HYBRID_SYNTHESIS_DEINT
291+
169292 ;*******************************************************************
170293 ;void ff_ps_hybrid_analysis_<opt>(float (*out)[2], float (*in)[2],
171294 ; 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
4040 void ff_ps_stereo_interpolate_ipdopd_sse3(float (*l)[2], float (*r)[2],
4141 float h[2][4], float h_step[2][4],
4242 int len);
43+void ff_ps_hybrid_synthesis_deint_sse(float out[2][38][64], float (*in)[32][2],
44+ int i, int len);
45+void ff_ps_hybrid_synthesis_deint_sse4(float out[2][38][64], float (*in)[32][2],
46+ int i, int len);
4347
4448 av_cold void ff_psdsp_init_x86(PSDSPContext *s)
4549 {
@@ -48,6 +52,7 @@ av_cold void ff_psdsp_init_x86(PSDSPContext *s) · 2 unmodified lines
4852 if (EXTERNAL_SSE(cpu_flags)) {
4953 s->add_squares = ff_ps_add_squares_sse;
5054 s->mul_pair_single = ff_ps_mul_pair_single_sse;
55+ s->hybrid_synthesis_deint = ff_ps_hybrid_synthesis_deint_sse;
5156 s->hybrid_analysis = ff_ps_hybrid_analysis_sse;
5257 }
5358 if (EXTERNAL_SSE3(cpu_flags)) {
@@ -56,4 +61,7 @@ av_cold void ff_psdsp_init_x86(PSDSPContext *s) · 2 unmodified lines
5661 s->stereo_interpolate[1] = ff_ps_stereo_interpolate_ipdopd_sse3;
5762 s->hybrid_analysis = ff_ps_hybrid_analysis_sse3;
5863 }
64+ if (EXTERNAL_SSE4(cpu_flags)) {
65+ s->hybrid_synthesis_deint = ff_ps_hybrid_synthesis_deint_sse4;
66+ }
5967 }
libavutil/x86/x86util.asm+9−6
@@ -71,6 +71,12 @@ · 70 unmodified lines
7171 SWAP %1, %3, %2
7272 %endmacro
7373
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+
7480 %macro TRANSPOSE4x4B 5
7581 SBUTTERFLY bw, %1, %2, %5
7682 SBUTTERFLY bw, %3, %4, %5
@@ -117,12 +123,9 @@ · 40 unmodified lines
117123 %macro TRANSPOSE4x4PS 5
118124 SBUTTERFLYPS %1, %2, %5
119125 SBUTTERFLYPS %3, %4, %5
120− movlhps m%5, m%1, m%3
121− movhlps m%3, m%1
122− SWAP %5, %1
123− movlhps m%5, m%2, m%4
124− movhlps m%4, m%2
125− SWAP %5, %2, %3
126+ SBUTTERFLYPD %1, %3, %5
127+ SBUTTERFLYPD %2, %4, %5
128+ SWAP %2, %3
126129 %endmacro
127130
128131 %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