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

Reply via email to