From 08e3ea60ff4059341b74be04a428a38f7c3630b0 Mon Sep 17 00:00:00 2001 From: Christophe Gisquet Date: Fri, 14 Feb 2014 15:03:09 +0000 Subject: x86: synth filter float: implement SSE2 version Timings for Arrandale: C SSE win32: 2108 334 win64: 1152 322 Factorizing the inner loop with a call/jmp is a >15 cycles cost, even with the jmp destination being aligned. Unrolling for ARCH_X86_64 is a 20 cycles gain. Signed-off-by: Janne Grunau --- libavcodec/x86/dcadsp_init.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) (limited to 'libavcodec/x86/dcadsp_init.c') diff --git a/libavcodec/x86/dcadsp_init.c b/libavcodec/x86/dcadsp_init.c index c234bd29f5..5f6e8c5a19 100644 --- a/libavcodec/x86/dcadsp_init.c +++ b/libavcodec/x86/dcadsp_init.c @@ -49,3 +49,31 @@ av_cold void ff_dcadsp_init_x86(DCADSPContext *s) s->int8x8_fmul_int32 = ff_int8x8_fmul_int32_sse4; } } + +void ff_synth_filter_inner_sse2(float *synth_buf_ptr, float synth_buf2[32], + const float window[512], + float out[32], intptr_t offset, float scale); + +static void synth_filter_sse2(FFTContext *imdct, + float *synth_buf_ptr, int *synth_buf_offset, + float synth_buf2[32], const float window[512], + float out[32], const float in[32], float scale) +{ + float *synth_buf= synth_buf_ptr + *synth_buf_offset; + + imdct->imdct_half(imdct, synth_buf, in); + + ff_synth_filter_inner_sse2(synth_buf, synth_buf2, window, + out, *synth_buf_offset, scale); + + *synth_buf_offset = (*synth_buf_offset - 32) & 511; +} + +av_cold void ff_synth_filter_init_x86(SynthFilterContext *s) +{ + int cpu_flags = av_get_cpu_flags(); + + if (EXTERNAL_SSE2(cpu_flags)) { + s->synth_filter_float = synth_filter_sse2; + } +} -- cgit v1.2.3