lavr: replace the SSE version of ff_conv_fltp_to_flt_6ch() with SSE4 and AVX
[ffmpeg.git] / libavresample / x86 / audio_convert.asm
1 ;******************************************************************************
2 ;* x86 optimized Format Conversion Utils
3 ;* Copyright (c) 2008 Loren Merritt
4 ;*
5 ;* This file is part of Libav.
6 ;*
7 ;* Libav is free software; you can redistribute it and/or
8 ;* modify it under the terms of the GNU Lesser General Public
9 ;* License as published by the Free Software Foundation; either
10 ;* version 2.1 of the License, or (at your option) any later version.
11 ;*
12 ;* Libav is distributed in the hope that it will be useful,
13 ;* but WITHOUT ANY WARRANTY; without even the implied warranty of
14 ;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15 ;* Lesser General Public License for more details.
16 ;*
17 ;* You should have received a copy of the GNU Lesser General Public
18 ;* License along with Libav; if not, write to the Free Software
19 ;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 ;******************************************************************************
21
22 %include "x86inc.asm"
23 %include "x86util.asm"
24
25 SECTION_TEXT
26
27 ;-----------------------------------------------------------------------------
28 ; void ff_conv_fltp_to_flt_6ch(float *dst, float *const *src, int len,
29 ;                              int channels);
30 ;-----------------------------------------------------------------------------
31
32 %macro CONV_FLTP_TO_FLT_6CH 0
33 cglobal conv_fltp_to_flt_6ch, 2,8,7, dst, src, src1, src2, src3, src4, src5, len
34 %if ARCH_X86_64
35     mov     lend, r2d
36 %else
37     %define lend dword r2m
38 %endif
39     mov    src1q, [srcq+1*gprsize]
40     mov    src2q, [srcq+2*gprsize]
41     mov    src3q, [srcq+3*gprsize]
42     mov    src4q, [srcq+4*gprsize]
43     mov    src5q, [srcq+5*gprsize]
44     mov     srcq, [srcq]
45     sub    src1q, srcq
46     sub    src2q, srcq
47     sub    src3q, srcq
48     sub    src4q, srcq
49     sub    src5q, srcq
50 .loop:
51     mova      m0, [srcq      ]
52     mova      m1, [srcq+src1q]
53     mova      m2, [srcq+src2q]
54     mova      m3, [srcq+src3q]
55     mova      m4, [srcq+src4q]
56     mova      m5, [srcq+src5q]
57 %if cpuflag(sse4)
58     SBUTTERFLYPS 0, 1, 6
59     SBUTTERFLYPS 2, 3, 6
60     SBUTTERFLYPS 4, 5, 6
61
62     blendps   m6, m4, m0, 1100b
63     movlhps   m0, m2
64     movhlps   m4, m2
65     blendps   m2, m5, m1, 1100b
66     movlhps   m1, m3
67     movhlps   m5, m3
68
69     movaps [dstq   ], m0
70     movaps [dstq+16], m6
71     movaps [dstq+32], m4
72     movaps [dstq+48], m1
73     movaps [dstq+64], m2
74     movaps [dstq+80], m5
75 %else ; mmx
76     SBUTTERFLY dq, 0, 1, 6
77     SBUTTERFLY dq, 2, 3, 6
78     SBUTTERFLY dq, 4, 5, 6
79
80     movq   [dstq   ], m0
81     movq   [dstq+ 8], m2
82     movq   [dstq+16], m4
83     movq   [dstq+24], m1
84     movq   [dstq+32], m3
85     movq   [dstq+40], m5
86 %endif
87     add      srcq, mmsize
88     add      dstq, mmsize*6
89     sub      lend, mmsize/4
90     jg .loop
91 %if mmsize == 8
92     emms
93     RET
94 %else
95     REP_RET
96 %endif
97 %endmacro
98
99 INIT_MMX mmx
100 CONV_FLTP_TO_FLT_6CH
101 INIT_XMM sse4
102 CONV_FLTP_TO_FLT_6CH
103 %if HAVE_AVX
104 INIT_XMM avx
105 CONV_FLTP_TO_FLT_6CH
106 %endif