25% faster on penryn (even though I didn't predict that by counting uops).
25% faster on sandybridge.
No change on bulldozer.
But even though I successfully predicted that this is an improvement, I don't
understand its performance.
6x load, 12x punpckldq, 6x store, 4x scalar:
Should take 12 cycles on penryn, 7 on sandybridge, 12 on bulldozer.
Instead, I measure 25 cycles per iteration on penryn, 19 on sandybridge, 96 on
bulldozer.
SBUTTERFLYPS works for a sse version. I would expect that to be slower on
sandybridge, because even though they have identical semantics and each
cost 1 uop, unpcklps only gets 1 execution unit whereas punpckldq can
chose among 2. But instead I measure SBUTTERFLYPS as the same speed as
this patch.
---
libavresample/x86/audio_convert.asm | 56 +++++++++++++++-------------------
1 files changed, 25 insertions(+), 31 deletions(-)
diff --git a/libavresample/x86/audio_convert.asm
b/libavresample/x86/audio_convert.asm
index b2607d7..3831786 100644
--- a/libavresample/x86/audio_convert.asm
+++ b/libavresample/x86/audio_convert.asm
@@ -338,36 +338,30 @@ cglobal conv_flt_to_fltp_6ch, 2,8,7, dst, src, dst1,
dst2, dst3, dst4, dst5, len
sub dst4q, dstq
sub dst5q, dstq
.loop:
- mova m0, [srcq ] ; m0 = 0/0, 1/0, 2/0, 3/0
- mova m1, [srcq+ mmsize] ; m1 = 4/0, 5/0, 0/1, 1/1
- mova m2, [srcq+2*mmsize] ; m2 = 2/1, 3/1, 4/1, 5/1
- mova m3, [srcq+3*mmsize] ; m3 = 0/2, 1/2, 2/2, 3/2
- mova m4, [srcq+4*mmsize] ; m4 = 4/2, 5/2, 0/3, 1/3
- mova m5, [srcq+5*mmsize] ; m5 = 2/3, 3/3, 4/3, 5/3
- shufps m6, m0, m1, q3210 ; m6 = 0/0, 1/0, 0/1, 1/1
- shufps m6, m6, q3120 ; m6 = 0/0, 0/1, 1/0, 1/1
- shufps m0, m2, q1032 ; m0 = 2/0, 3/0, 2/1, 3/1
- shufps m0, m0, q3120 ; m0 = 2/0, 2/1, 3/0, 3/1
- shufps m1, m2, q3210 ; m1 = 4/0, 5/0, 4/1, 5/1
- shufps m1, m1, q3120 ; m1 = 4/0, 4/1, 5/0, 5/1
- shufps m2, m3, m4, q3210 ; m2 = 0/2, 1/2, 0/3, 1/3
- shufps m2, m2, q3120 ; m2 = 0/2, 0/3, 1/2, 1/3
- shufps m3, m5, q1032 ; m3 = 2/2, 3/2, 2/3, 3/3
- shufps m3, m3, q3120 ; m3 = 2/2, 2/3, 3/2, 2/2
- shufps m4, m5, q3210 ; m4 = 4/2, 5/2, 4/3, 5/3
- shufps m4, m4, q3120 ; m4 = 4/2, 4/3, 5/2, 5/3
- movlps [dstq ], m6
- movlps [dstq +8], m2
- movhps [dstq+dst1q ], m6
- movhps [dstq+dst1q+8], m2
- movlps [dstq+dst2q ], m0
- movlps [dstq+dst2q+8], m3
- movhps [dstq+dst3q ], m0
- movhps [dstq+dst3q+8], m3
- movlps [dstq+dst4q ], m1
- movlps [dstq+dst4q+8], m4
- movhps [dstq+dst5q ], m1
- movhps [dstq+dst5q+8], m4
+ mova m0, [srcq ] ; m0 = 0, 1, 2, 3
+ mova m1, [srcq+ mmsize] ; m1 = 4, 5, 6, 7
+ mova m2, [srcq+2*mmsize] ; m2 = 8, 9, 10, 11
+ mova m3, [srcq+3*mmsize] ; m3 = 12, 13, 14, 15
+ mova m4, [srcq+4*mmsize] ; m4 = 16, 17, 18, 19
+ mova m5, [srcq+5*mmsize] ; m5 = 20, 21, 22, 23
+ SBUTTERFLY dq, 0, 3, 6 ; m0 = 0, 12, 1, 13
+ ; m3 = 2, 14, 3, 15
+ SBUTTERFLY dq, 1, 4, 6 ; m1 = 4, 16, 5, 17
+ ; m4 = 6, 18, 7, 19
+ SBUTTERFLY dq, 2, 5, 6 ; m2 = 8, 20, 9, 21
+ ; m5 = 10, 22, 11, 23
+ SBUTTERFLY dq, 0, 4, 6 ; m0 = 0, 6, 12, 18
+ ; m4 = 1, 7, 13, 19
+ SBUTTERFLY dq, 3, 2, 6 ; m3 = 2, 8, 14, 20
+ ; m2 = 3, 9, 15, 21
+ SBUTTERFLY dq, 1, 5, 6 ; m1 = 4, 10, 16, 22
+ ; m5 = 5, 11, 17, 23
+ mova [dstq ], m0
+ mova [dstq+dst1q], m4
+ mova [dstq+dst2q], m3
+ mova [dstq+dst3q], m2
+ mova [dstq+dst4q], m1
+ mova [dstq+dst5q], m5
add srcq, mmsize*6
add dstq, mmsize
sub lend, mmsize/4
@@ -375,7 +369,7 @@ cglobal conv_flt_to_fltp_6ch, 2,8,7, dst, src, dst1, dst2,
dst3, dst4, dst5, len
REP_RET
%endmacro
-INIT_XMM sse
+INIT_XMM sse2
CONV_FLT_TO_FLTP_6CH
%if HAVE_AVX
INIT_XMM avx
--
1.7.4.1
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel