[PATCH] x86/swr: make int32_to_int32 un/pack_2ch functions SSE
unpack_2ch is already using sse float ops only, and pack_2ch is a trivial change. Rename both to float_to_float for consistency. Signed-off-by: James Almer <jamrial@gmail.com> --- libswresample/x86/audio_convert.asm | 14 ++++++++------ libswresample/x86/audio_convert_init.c | 11 +++++++---- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/libswresample/x86/audio_convert.asm b/libswresample/x86/audio_convert.asm index 1617e0b..c13c26f 100644 --- a/libswresample/x86/audio_convert.asm +++ b/libswresample/x86/audio_convert.asm @@ -60,8 +60,8 @@ pack_2ch_%2_to_%1_u_int %+ SUFFIX punpcklwd m0, m2 punpckhwd m1, m2 %else - punpckldq m0, m2 - punpckhdq m1, m2 + unpcklps m0, m2 + unpckhps m1, m2 %endif %6 m0,m1,m2,m3,m4,m5 %else @@ -597,6 +597,12 @@ PACK_6CH float, float, u, 2, 2, NOP_N, NOP_N PACK_6CH float, float, a, 2, 2, NOP_N, NOP_N INIT_XMM sse +PACK_2CH float, float, u, 2, 2, NOP_N, NOP_N +PACK_2CH float, float, a, 2, 2, NOP_N, NOP_N + +UNPACK_2CH float, float, u, 2, 2, NOP_N, NOP_N +UNPACK_2CH float, float, a, 2, 2, NOP_N, NOP_N + PACK_6CH float, float, u, 2, 2, NOP_N, NOP_N PACK_6CH float, float, a, 2, 2, NOP_N, NOP_N @@ -611,8 +617,6 @@ CONV int16, int32, a, 1, 2, INT32_TO_INT16_N, NOP_N PACK_2CH int16, int16, u, 1, 1, NOP_N, NOP_N PACK_2CH int16, int16, a, 1, 1, NOP_N, NOP_N -PACK_2CH int32, int32, u, 2, 2, NOP_N, NOP_N -PACK_2CH int32, int32, a, 2, 2, NOP_N, NOP_N PACK_2CH int32, int16, u, 2, 1, INT16_TO_INT32_N, NOP_N PACK_2CH int32, int16, a, 2, 1, INT16_TO_INT32_N, NOP_N PACK_2CH int16, int32, u, 1, 2, INT32_TO_INT16_N, NOP_N @@ -620,8 +624,6 @@ PACK_2CH int16, int32, a, 1, 2, INT32_TO_INT16_N, NOP_N UNPACK_2CH int16, int16, u, 1, 1, NOP_N, NOP_N UNPACK_2CH int16, int16, a, 1, 1, NOP_N, NOP_N -UNPACK_2CH int32, int32, u, 2, 2, NOP_N, NOP_N -UNPACK_2CH int32, int32, a, 2, 2, NOP_N, NOP_N UNPACK_2CH int32, int16, u, 2, 1, INT16_TO_INT32_N, NOP_N UNPACK_2CH int32, int16, a, 2, 1, INT16_TO_INT32_N, NOP_N UNPACK_2CH int16, int32, u, 1, 2, INT32_TO_INT16_N, NOP_N diff --git a/libswresample/x86/audio_convert_init.c b/libswresample/x86/audio_convert_init.c index bd5f741..f800b4e 100644 --- a/libswresample/x86/audio_convert_init.c +++ b/libswresample/x86/audio_convert_init.c @@ -61,6 +61,13 @@ MULTI_CAPS_FUNC(SSE2, sse2) } } if(EXTERNAL_SSE(mm_flags)) { + if(channels == 2) { + if( out_fmt == AV_SAMPLE_FMT_FLT && in_fmt == AV_SAMPLE_FMT_FLTP || out_fmt == AV_SAMPLE_FMT_S32 && in_fmt == AV_SAMPLE_FMT_S32P) + ac->simd_f = ff_pack_2ch_float_to_float_a_sse; + + if( out_fmt == AV_SAMPLE_FMT_FLTP && in_fmt == AV_SAMPLE_FMT_FLT || out_fmt == AV_SAMPLE_FMT_S32P && in_fmt == AV_SAMPLE_FMT_S32) + ac->simd_f = ff_unpack_2ch_float_to_float_a_sse; + } if(channels == 6) { if( out_fmt == AV_SAMPLE_FMT_FLT && in_fmt == AV_SAMPLE_FMT_FLTP || out_fmt == AV_SAMPLE_FMT_S32 && in_fmt == AV_SAMPLE_FMT_S32P) ac->simd_f = ff_pack_6ch_float_to_float_a_sse; @@ -80,8 +87,6 @@ MULTI_CAPS_FUNC(SSE2, sse2) ac->simd_f = ff_float_to_int16_a_sse2; if(channels == 2) { - if( out_fmt == AV_SAMPLE_FMT_FLT && in_fmt == AV_SAMPLE_FMT_FLTP || out_fmt == AV_SAMPLE_FMT_S32 && in_fmt == AV_SAMPLE_FMT_S32P) - ac->simd_f = ff_pack_2ch_int32_to_int32_a_sse2; if( out_fmt == AV_SAMPLE_FMT_S16 && in_fmt == AV_SAMPLE_FMT_S16P) ac->simd_f = ff_pack_2ch_int16_to_int16_a_sse2; if( out_fmt == AV_SAMPLE_FMT_S32 && in_fmt == AV_SAMPLE_FMT_S16P) @@ -89,8 +94,6 @@ MULTI_CAPS_FUNC(SSE2, sse2) if( out_fmt == AV_SAMPLE_FMT_S16 && in_fmt == AV_SAMPLE_FMT_S32P) ac->simd_f = ff_pack_2ch_int32_to_int16_a_sse2; - if( out_fmt == AV_SAMPLE_FMT_FLTP && in_fmt == AV_SAMPLE_FMT_FLT || out_fmt == AV_SAMPLE_FMT_S32P && in_fmt == AV_SAMPLE_FMT_S32) - ac->simd_f = ff_unpack_2ch_int32_to_int32_a_sse2; if( out_fmt == AV_SAMPLE_FMT_S16P && in_fmt == AV_SAMPLE_FMT_S16) ac->simd_f = ff_unpack_2ch_int16_to_int16_a_sse2; if( out_fmt == AV_SAMPLE_FMT_S32P && in_fmt == AV_SAMPLE_FMT_S16) -- 2.2.2
On Wed, Jan 14, 2015 at 01:53:48AM -0300, James Almer wrote:
unpack_2ch is already using sse float ops only, and pack_2ch is a trivial change. Rename both to float_to_float for consistency.
Signed-off-by: James Almer <jamrial@gmail.com> --- libswresample/x86/audio_convert.asm | 14 ++++++++------ libswresample/x86/audio_convert_init.c | 11 +++++++---- 2 files changed, 15 insertions(+), 10 deletions(-)
diff --git a/libswresample/x86/audio_convert.asm b/libswresample/x86/audio_convert.asm index 1617e0b..c13c26f 100644 --- a/libswresample/x86/audio_convert.asm +++ b/libswresample/x86/audio_convert.asm @@ -60,8 +60,8 @@ pack_2ch_%2_to_%1_u_int %+ SUFFIX punpcklwd m0, m2 punpckhwd m1, m2 %else - punpckldq m0, m2 - punpckhdq m1, m2 + unpcklps m0, m2 + unpckhps m1, m2 %endif %6 m0,m1,m2,m3,m4,m5 %else
did you benchmark this ? ive just checked and on Pentium M, Core Solo and Core Duo these are listed as having only 1/5 the throughput on sandybridge they are still listed with half the throughput than their integer counterparts i didnt benchmark it though [...] -- Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB During times of universal deceit, telling the truth becomes a revolutionary act. -- George Orwell
On 14/01/15 1:59 PM, Michael Niedermayer wrote:
On Wed, Jan 14, 2015 at 01:53:48AM -0300, James Almer wrote:
unpack_2ch is already using sse float ops only, and pack_2ch is a trivial change. Rename both to float_to_float for consistency.
Signed-off-by: James Almer <jamrial@gmail.com> --- libswresample/x86/audio_convert.asm | 14 ++++++++------ libswresample/x86/audio_convert_init.c | 11 +++++++---- 2 files changed, 15 insertions(+), 10 deletions(-)
diff --git a/libswresample/x86/audio_convert.asm b/libswresample/x86/audio_convert.asm index 1617e0b..c13c26f 100644 --- a/libswresample/x86/audio_convert.asm +++ b/libswresample/x86/audio_convert.asm @@ -60,8 +60,8 @@ pack_2ch_%2_to_%1_u_int %+ SUFFIX punpcklwd m0, m2 punpckhwd m1, m2 %else - punpckldq m0, m2 - punpckhdq m1, m2 + unpcklps m0, m2 + unpckhps m1, m2 %endif %6 m0,m1,m2,m3,m4,m5 %else
did you benchmark this ? ive just checked and on Pentium M, Core Solo and Core Duo these are listed as having only 1/5 the throughput on sandybridge they are still listed with half the throughput than their integer counterparts i didnt benchmark it though
No, i didn't benchmark. And you're right, even on recent CPUs they seem to have half the throughput as the integer counterparts. Do you think it will mean a considerable performance hit? These functions aren't even that important in audio processing anyway (perf shows they represent less than 1% of total cpu time when doing pcm -> pcm). Nonetheless, considering this maybe the other functions should be changed to not use SBUTTERFLYPS.
Hi, On Wed, Jan 14, 2015 at 4:23 PM, James Almer <jamrial@gmail.com> wrote:
On Wed, Jan 14, 2015 at 01:53:48AM -0300, James Almer wrote:
unpack_2ch is already using sse float ops only, and pack_2ch is a
On 14/01/15 1:59 PM, Michael Niedermayer wrote: trivial change.
Rename both to float_to_float for consistency.
Signed-off-by: James Almer <jamrial@gmail.com> --- libswresample/x86/audio_convert.asm | 14 ++++++++------ libswresample/x86/audio_convert_init.c | 11 +++++++---- 2 files changed, 15 insertions(+), 10 deletions(-)
diff --git a/libswresample/x86/audio_convert.asm b/libswresample/x86/audio_convert.asm index 1617e0b..c13c26f 100644 --- a/libswresample/x86/audio_convert.asm +++ b/libswresample/x86/audio_convert.asm @@ -60,8 +60,8 @@ pack_2ch_%2_to_%1_u_int %+ SUFFIX punpcklwd m0, m2 punpckhwd m1, m2 %else - punpckldq m0, m2 - punpckhdq m1, m2 + unpcklps m0, m2 + unpckhps m1, m2 %endif %6 m0,m1,m2,m3,m4,m5 %else
did you benchmark this ? ive just checked and on Pentium M, Core Solo and Core Duo these are listed as having only 1/5 the throughput on sandybridge they are still listed with half the throughput than their integer counterparts i didnt benchmark it though
No, i didn't benchmark. And you're right, even on recent CPUs they seem to have half the throughput as the integer counterparts. Do you think it will mean a considerable performance hit? These functions aren't even that important in audio processing anyway (perf shows they represent less than 1% of total cpu time when doing pcm -> pcm).
Nonetheless, considering this maybe the other functions should be changed to not use SBUTTERFLYPS.
Well, you can have SSE and SSE2 versions, right? That way it works for people with super-old CPUs (if you care about them), but still gives the better performance for 99.9% of the (x86) world with SSE2 or higher CPUs. Ronald
participants (3)
-
James Almer -
Michael Niedermayer -
Ronald S. Bultje