dbfaa69e3d44d48f51934a057122af35bf4db31d
[ffmpeg.git] / libavresample / x86 / audio_mix.asm
1 ;******************************************************************************
2 ;* x86 optimized channel mixing
3 ;* Copyright (c) 2012 Justin Ruggles <justin.ruggles@gmail.com>
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 %include "util.asm"
25
26 SECTION_TEXT
27
28 ;-----------------------------------------------------------------------------
29 ; void ff_mix_2_to_1_fltp_flt(float **src, float **matrix, int len,
30 ;                             int out_ch, int in_ch);
31 ;-----------------------------------------------------------------------------
32
33 %macro MIX_2_TO_1_FLTP_FLT 0
34 cglobal mix_2_to_1_fltp_flt, 3,4,6, src, matrix, len, src1
35     mov       src1q, [srcq+gprsize]
36     mov        srcq, [srcq        ]
37     sub       src1q, srcq
38     mov     matrixq, [matrixq  ]
39     VBROADCASTSS m4, [matrixq  ]
40     VBROADCASTSS m5, [matrixq+4]
41     ALIGN 16
42 .loop:
43     mulps        m0, m4, [srcq             ]
44     mulps        m1, m5, [srcq+src1q       ]
45     mulps        m2, m4, [srcq+      mmsize]
46     mulps        m3, m5, [srcq+src1q+mmsize]
47     addps        m0, m0, m1
48     addps        m2, m2, m3
49     mova  [srcq       ], m0
50     mova  [srcq+mmsize], m2
51     add        srcq, mmsize*2
52     sub        lend, mmsize*2/4
53     jg .loop
54     REP_RET
55 %endmacro
56
57 INIT_XMM sse
58 MIX_2_TO_1_FLTP_FLT
59 %if HAVE_AVX
60 INIT_YMM avx
61 MIX_2_TO_1_FLTP_FLT
62 %endif
63
64 ;-----------------------------------------------------------------------------
65 ; void ff_mix_2_to_1_s16p_flt(int16_t **src, float **matrix, int len,
66 ;                             int out_ch, int in_ch);
67 ;-----------------------------------------------------------------------------
68
69 %macro MIX_2_TO_1_S16P_FLT 0
70 cglobal mix_2_to_1_s16p_flt, 3,4,6, src, matrix, len, src1
71     mov       src1q, [srcq+gprsize]
72     mov        srcq, [srcq]
73     sub       src1q, srcq
74     mov     matrixq, [matrixq  ]
75     VBROADCASTSS m4, [matrixq  ]
76     VBROADCASTSS m5, [matrixq+4]
77     ALIGN 16
78 .loop:
79     mova         m0, [srcq      ]
80     mova         m2, [srcq+src1q]
81     S16_TO_S32_SX 0, 1
82     S16_TO_S32_SX 2, 3
83     cvtdq2ps     m0, m0
84     cvtdq2ps     m1, m1
85     cvtdq2ps     m2, m2
86     cvtdq2ps     m3, m3
87     mulps        m0, m4
88     mulps        m1, m4
89     mulps        m2, m5
90     mulps        m3, m5
91     addps        m0, m2
92     addps        m1, m3
93     cvtps2dq     m0, m0
94     cvtps2dq     m1, m1
95     packssdw     m0, m1
96     mova     [srcq], m0
97     add        srcq, mmsize
98     sub        lend, mmsize/2
99     jg .loop
100     REP_RET
101 %endmacro
102
103 INIT_XMM sse2
104 MIX_2_TO_1_S16P_FLT
105 INIT_XMM sse4
106 MIX_2_TO_1_S16P_FLT
107
108 ;-----------------------------------------------------------------------------
109 ; void ff_mix_2_to_1_s16p_q8(int16_t **src, int16_t **matrix, int len,
110 ;                            int out_ch, int in_ch);
111 ;-----------------------------------------------------------------------------
112
113 INIT_XMM sse2
114 cglobal mix_2_to_1_s16p_q8, 3,4,6, src, matrix, len, src1
115     mov       src1q, [srcq+gprsize]
116     mov        srcq, [srcq]
117     sub       src1q, srcq
118     mov     matrixq, [matrixq]
119     movd         m4, [matrixq]
120     movd         m5, [matrixq]
121     SPLATW       m4, m4, 0
122     SPLATW       m5, m5, 1
123     pxor         m0, m0
124     punpcklwd    m4, m0
125     punpcklwd    m5, m0
126     ALIGN 16
127 .loop:
128     mova         m0, [srcq      ]
129     mova         m2, [srcq+src1q]
130     punpckhwd    m1, m0, m0
131     punpcklwd    m0, m0
132     punpckhwd    m3, m2, m2
133     punpcklwd    m2, m2
134     pmaddwd      m0, m4
135     pmaddwd      m1, m4
136     pmaddwd      m2, m5
137     pmaddwd      m3, m5
138     paddd        m0, m2
139     paddd        m1, m3
140     psrad        m0, 8
141     psrad        m1, 8
142     packssdw     m0, m1
143     mova     [srcq], m0
144     add        srcq, mmsize
145     sub        lend, mmsize/2
146     jg .loop
147     REP_RET
148
149 ;-----------------------------------------------------------------------------
150 ; void ff_mix_1_to_2_fltp_flt(float **src, float **matrix, int len,
151 ;                             int out_ch, int in_ch);
152 ;-----------------------------------------------------------------------------
153
154 %macro MIX_1_TO_2_FLTP_FLT 0
155 cglobal mix_1_to_2_fltp_flt, 3,5,4, src0, matrix0, len, src1, matrix1
156     mov       src1q, [src0q+gprsize]
157     mov       src0q, [src0q]
158     sub       src1q, src0q
159     mov    matrix1q, [matrix0q+gprsize]
160     mov    matrix0q, [matrix0q]
161     VBROADCASTSS m2, [matrix0q]
162     VBROADCASTSS m3, [matrix1q]
163     ALIGN 16
164 .loop:
165     mova         m0, [src0q]
166     mulps        m1, m0, m3
167     mulps        m0, m0, m2
168     mova  [src0q      ], m0
169     mova  [src0q+src1q], m1
170     add       src0q, mmsize
171     sub        lend, mmsize/4
172     jg .loop
173     REP_RET
174 %endmacro
175
176 INIT_XMM sse
177 MIX_1_TO_2_FLTP_FLT
178 %if HAVE_AVX
179 INIT_YMM avx
180 MIX_1_TO_2_FLTP_FLT
181 %endif
182
183 ;-----------------------------------------------------------------------------
184 ; void ff_mix_1_to_2_s16p_flt(int16_t **src, float **matrix, int len,
185 ;                             int out_ch, int in_ch);
186 ;-----------------------------------------------------------------------------
187
188 %macro MIX_1_TO_2_S16P_FLT 0
189 cglobal mix_1_to_2_s16p_flt, 3,5,6, src0, matrix0, len, src1, matrix1
190     mov       src1q, [src0q+gprsize]
191     mov       src0q, [src0q]
192     sub       src1q, src0q
193     mov    matrix1q, [matrix0q+gprsize]
194     mov    matrix0q, [matrix0q]
195     VBROADCASTSS m4, [matrix0q]
196     VBROADCASTSS m5, [matrix1q]
197     ALIGN 16
198 .loop:
199     mova         m0, [src0q]
200     S16_TO_S32_SX 0, 2
201     cvtdq2ps     m0, m0
202     cvtdq2ps     m2, m2
203     mulps        m1, m0, m5
204     mulps        m0, m0, m4
205     mulps        m3, m2, m5
206     mulps        m2, m2, m4
207     cvtps2dq     m0, m0
208     cvtps2dq     m1, m1
209     cvtps2dq     m2, m2
210     cvtps2dq     m3, m3
211     packssdw     m0, m2
212     packssdw     m1, m3
213     mova  [src0q      ], m0
214     mova  [src0q+src1q], m1
215     add       src0q, mmsize
216     sub        lend, mmsize/2
217     jg .loop
218     REP_RET
219 %endmacro
220
221 INIT_XMM sse2
222 MIX_1_TO_2_S16P_FLT
223 INIT_XMM sse4
224 MIX_1_TO_2_S16P_FLT
225 %if HAVE_AVX
226 INIT_XMM avx
227 MIX_1_TO_2_S16P_FLT
228 %endif