]> git.sesse.net Git - ffmpeg/blob - libswresample/x86/audio_convert.asm
swr-x86-simd: add ff_unpack_2ch_int16_to_int16/int32/float_a_ssse3
[ffmpeg] / libswresample / x86 / audio_convert.asm
1 ;******************************************************************************
2 ;* Copyright (c) 2012 Michael Niedermayer
3 ;*
4 ;* This file is part of FFmpeg.
5 ;*
6 ;* FFmpeg is free software; you can redistribute it and/or
7 ;* modify it under the terms of the GNU Lesser General Public
8 ;* License as published by the Free Software Foundation; either
9 ;* version 2.1 of the License, or (at your option) any later version.
10 ;*
11 ;* FFmpeg is distributed in the hope that it will be useful,
12 ;* but WITHOUT ANY WARRANTY; without even the implied warranty of
13 ;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 ;* Lesser General Public License for more details.
15 ;*
16 ;* You should have received a copy of the GNU Lesser General Public
17 ;* License along with FFmpeg; if not, write to the Free Software
18 ;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 ;******************************************************************************
20
21 %include "libavutil/x86/x86inc.asm"
22 %include "libavutil/x86/x86util.asm"
23
24 SECTION_RODATA
25 align 32
26 flt2pm31: times 8 dd 4.6566129e-10
27 flt2p31 : times 8 dd 2147483648.0
28 flt2p15 : times 8 dd 32768.0
29
30 word_unpack_shuf : db  0, 1, 4, 5, 8, 9,12,13, 2, 3, 6, 7,10,11,14,15
31
32 SECTION .text
33
34
35 ;to, from, a/u, log2_outsize, log_intsize, const
36 %macro PACK_2CH 5-7
37 cglobal pack_2ch_%2_to_%1_%3, 3, 4, 6, dst, src, len, src2
38     mov src2q   , [srcq+gprsize]
39     mov srcq    , [srcq]
40     mov dstq    , [dstq]
41 %ifidn %3, a
42     test dstq, mmsize-1
43         jne pack_2ch_%2_to_%1_u_int %+ SUFFIX
44     test srcq, mmsize-1
45         jne pack_2ch_%2_to_%1_u_int %+ SUFFIX
46     test src2q, mmsize-1
47         jne pack_2ch_%2_to_%1_u_int %+ SUFFIX
48 %else
49 pack_2ch_%2_to_%1_u_int %+ SUFFIX
50 %endif
51     lea     srcq , [srcq  + (1<<%5)*lenq]
52     lea     src2q, [src2q + (1<<%5)*lenq]
53     lea     dstq , [dstq  + (2<<%4)*lenq]
54     neg     lenq
55     %7
56 .next:
57 %if %4 >= %5
58     mov%3     m0, [         srcq +(1<<%5)*lenq]
59     mova      m1, m0
60     mov%3     m2, [         src2q+(1<<%5)*lenq]
61 %if %5 == 1
62     punpcklwd m0, m2
63     punpckhwd m1, m2
64 %else
65     punpckldq m0, m2
66     punpckhdq m1, m2
67 %endif
68     %6
69 %else
70     mov%3     m0, [         srcq +(1<<%5)*lenq]
71     mov%3     m1, [mmsize + srcq +(1<<%5)*lenq]
72     mov%3     m2, [         src2q+(1<<%5)*lenq]
73     mov%3     m3, [mmsize + src2q+(1<<%5)*lenq]
74     %6
75     mova      m2, m0
76     punpcklwd m0, m1
77     punpckhwd m2, m1
78     SWAP 1,2
79 %endif
80     mov%3 [           dstq+(2<<%4)*lenq], m0
81     mov%3 [  mmsize + dstq+(2<<%4)*lenq], m1
82 %if %4 > %5
83     mov%3 [2*mmsize + dstq+(2<<%4)*lenq], m2
84     mov%3 [3*mmsize + dstq+(2<<%4)*lenq], m3
85     add lenq, 4*mmsize/(2<<%4)
86 %else
87     add lenq, 2*mmsize/(2<<%4)
88 %endif
89         jl .next
90     REP_RET
91 %endmacro
92
93 %macro UNPACK_2CH 5-7
94 cglobal unpack_2ch_%2_to_%1_%3, 3, 4, 7, dst, src, len, dst2
95     mov dst2q   , [dstq+gprsize]
96     mov srcq    , [srcq]
97     mov dstq    , [dstq]
98 %ifidn %3, a
99     test dstq, mmsize-1
100         jne unpack_2ch_%2_to_%1_u_int %+ SUFFIX
101     test srcq, mmsize-1
102         jne unpack_2ch_%2_to_%1_u_int %+ SUFFIX
103     test dst2q, mmsize-1
104         jne unpack_2ch_%2_to_%1_u_int %+ SUFFIX
105 %else
106 unpack_2ch_%2_to_%1_u_int %+ SUFFIX
107 %endif
108     lea     srcq , [srcq  + (2<<%5)*lenq]
109     lea     dstq , [dstq  + (1<<%4)*lenq]
110     lea     dst2q, [dst2q + (1<<%4)*lenq]
111     neg     lenq
112     %7
113     mova      m6, [word_unpack_shuf]
114 .next:
115     mov%3     m0, [           srcq +(2<<%5)*lenq]
116     mov%3     m2, [  mmsize + srcq +(2<<%5)*lenq]
117 %if %5 == 1
118 %ifidn SUFFIX, _ssse3
119     pshufb    m0, m6
120     mova      m1, m0
121     pshufb    m2, m6
122     punpcklqdq m0,m2
123     punpckhqdq m1,m2
124 %else
125     mova      m1, m0
126     punpcklwd m0,m2
127     punpckhwd m1,m2
128
129     mova      m2, m0
130     punpcklwd m0,m1
131     punpckhwd m2,m1
132
133     mova      m1, m0
134     punpcklwd m0,m2
135     punpckhwd m1,m2
136 %endif
137 %else
138     mova      m1, m0
139     shufps    m0, m2, 10001000b
140     shufps    m1, m2, 11011101b
141 %endif
142 %if %4 < %5
143     mov%3     m2, [2*mmsize + srcq +(2<<%5)*lenq]
144     mova      m3, m2
145     mov%3     m4, [3*mmsize + srcq +(2<<%5)*lenq]
146     shufps    m2, m4, 10001000b
147     shufps    m3, m4, 11011101b
148     SWAP 1,2
149 %endif
150     %6
151     mov%3 [           dstq+(1<<%4)*lenq], m0
152 %if %4 > %5
153     mov%3 [          dst2q+(1<<%4)*lenq], m2
154     mov%3 [ mmsize +  dstq+(1<<%4)*lenq], m1
155     mov%3 [ mmsize + dst2q+(1<<%4)*lenq], m3
156     add lenq, 2*mmsize/(1<<%4)
157 %else
158     mov%3 [          dst2q+(1<<%4)*lenq], m1
159     add lenq, mmsize/(1<<%4)
160 %endif
161         jl .next
162     REP_RET
163 %endmacro
164
165 %macro CONV 5-7
166 cglobal %2_to_%1_%3, 3, 3, 6, dst, src, len
167     mov srcq    , [srcq]
168     mov dstq    , [dstq]
169 %ifidn %3, a
170     test dstq, mmsize-1
171         jne %2_to_%1_u_int %+ SUFFIX
172     test srcq, mmsize-1
173         jne %2_to_%1_u_int %+ SUFFIX
174 %else
175 %2_to_%1_u_int %+ SUFFIX
176 %endif
177     lea     srcq , [srcq  + (1<<%5)*lenq]
178     lea     dstq , [dstq  + (1<<%4)*lenq]
179     neg     lenq
180     %7
181 .next:
182     mov%3     m0, [           srcq +(1<<%5)*lenq]
183     mov%3     m1, [  mmsize + srcq +(1<<%5)*lenq]
184 %if %4 < %5
185     mov%3     m2, [2*mmsize + srcq +(1<<%5)*lenq]
186     mov%3     m3, [3*mmsize + srcq +(1<<%5)*lenq]
187 %endif
188     %6
189     mov%3 [           dstq+(1<<%4)*lenq], m0
190     mov%3 [  mmsize + dstq+(1<<%4)*lenq], m1
191 %if %4 > %5
192     mov%3 [2*mmsize + dstq+(1<<%4)*lenq], m2
193     mov%3 [3*mmsize + dstq+(1<<%4)*lenq], m3
194     add lenq, 4*mmsize/(1<<%4)
195 %else
196     add lenq, 2*mmsize/(1<<%4)
197 %endif
198         jl .next
199     REP_RET
200 %endmacro
201
202 %macro INT16_TO_INT32_N 0
203     pxor      m2, m2
204     pxor      m3, m3
205     punpcklwd m2, m1
206     punpckhwd m3, m1
207     SWAP 4,0
208     pxor      m0, m0
209     pxor      m1, m1
210     punpcklwd m0, m4
211     punpckhwd m1, m4
212 %endmacro
213
214 %macro INT32_TO_INT16_N 0
215     psrad     m0, 16
216     psrad     m1, 16
217     psrad     m2, 16
218     psrad     m3, 16
219     packssdw  m0, m1
220     packssdw  m2, m3
221     SWAP 1,2
222 %endmacro
223
224 %macro INT32_TO_FLOAT_INIT 0
225     mova      m3, [flt2pm31]
226 %endmacro
227 %macro INT32_TO_FLOAT_N 0
228     cvtdq2ps  m0, m0
229     cvtdq2ps  m1, m1
230     mulps m0, m0, m3
231     mulps m1, m1, m3
232 %endmacro
233
234 %macro FLOAT_TO_INT32_INIT 0
235     mova      m3, [flt2p31]
236 %endmacro
237 %macro FLOAT_TO_INT32_N 0
238     mulps m0, m3
239     mulps m1, m3
240     cvtps2dq  m2, m0
241     cvtps2dq  m4, m1
242     cmpnltps m0, m3
243     cmpnltps m1, m3
244     paddd m0, m2
245     paddd m1, m4
246 %endmacro
247
248 %macro INT16_TO_FLOAT_INIT 0
249     mova      m5, [flt2pm31]
250 %endmacro
251 %macro INT16_TO_FLOAT_N 0
252     INT16_TO_INT32_N
253     cvtdq2ps  m0, m0
254     cvtdq2ps  m1, m1
255     cvtdq2ps  m2, m2
256     cvtdq2ps  m3, m3
257     mulps m0, m0, m5
258     mulps m1, m1, m5
259     mulps m2, m2, m5
260     mulps m3, m3, m5
261 %endmacro
262
263 %macro FLOAT_TO_INT16_INIT 0
264     mova      m5, [flt2p15]
265 %endmacro
266 %macro FLOAT_TO_INT16_N 0
267     mulps m0, m5
268     mulps m1, m5
269     mulps m2, m5
270     mulps m3, m5
271     cvtps2dq  m0, m0
272     cvtps2dq  m1, m1
273     packssdw  m0, m1
274     cvtps2dq  m1, m2
275     cvtps2dq  m3, m3
276     packssdw  m1, m3
277 %endmacro
278
279 INIT_MMX mmx
280 CONV int32, int16, u, 2, 1, INT16_TO_INT32_N
281 CONV int32, int16, a, 2, 1, INT16_TO_INT32_N
282 CONV int16, int32, u, 1, 2, INT32_TO_INT16_N
283 CONV int16, int32, a, 1, 2, INT32_TO_INT16_N
284
285 INIT_XMM sse
286 CONV int32, int16, u, 2, 1, INT16_TO_INT32_N
287 CONV int32, int16, a, 2, 1, INT16_TO_INT32_N
288 CONV int16, int32, u, 1, 2, INT32_TO_INT16_N
289 CONV int16, int32, a, 1, 2, INT32_TO_INT16_N
290
291 PACK_2CH int16, int16, u, 1, 1
292 PACK_2CH int16, int16, a, 1, 1
293 PACK_2CH int32, int32, u, 2, 2
294 PACK_2CH int32, int32, a, 2, 2
295 PACK_2CH int32, int16, u, 2, 1, INT16_TO_INT32_N
296 PACK_2CH int32, int16, a, 2, 1, INT16_TO_INT32_N
297 PACK_2CH int16, int32, u, 1, 2, INT32_TO_INT16_N
298 PACK_2CH int16, int32, a, 1, 2, INT32_TO_INT16_N
299
300 UNPACK_2CH int16, int16, u, 1, 1
301 UNPACK_2CH int16, int16, a, 1, 1
302 UNPACK_2CH int32, int32, u, 2, 2
303 UNPACK_2CH int32, int32, a, 2, 2
304 UNPACK_2CH int32, int16, u, 2, 1, INT16_TO_INT32_N
305 UNPACK_2CH int32, int16, a, 2, 1, INT16_TO_INT32_N
306 UNPACK_2CH int16, int32, u, 1, 2, INT32_TO_INT16_N
307 UNPACK_2CH int16, int32, a, 1, 2, INT32_TO_INT16_N
308
309 INIT_XMM sse2
310 CONV float, int32, u, 2, 2, INT32_TO_FLOAT_N, INT32_TO_FLOAT_INIT
311 CONV float, int32, a, 2, 2, INT32_TO_FLOAT_N, INT32_TO_FLOAT_INIT
312 CONV int32, float, u, 2, 2, FLOAT_TO_INT32_N, FLOAT_TO_INT32_INIT
313 CONV int32, float, a, 2, 2, FLOAT_TO_INT32_N, FLOAT_TO_INT32_INIT
314 CONV float, int16, u, 2, 1, INT16_TO_FLOAT_N, INT16_TO_FLOAT_INIT
315 CONV float, int16, a, 2, 1, INT16_TO_FLOAT_N, INT16_TO_FLOAT_INIT
316 CONV int16, float, u, 1, 2, FLOAT_TO_INT16_N, FLOAT_TO_INT16_INIT
317 CONV int16, float, a, 1, 2, FLOAT_TO_INT16_N, FLOAT_TO_INT16_INIT
318
319 PACK_2CH float, int32, u, 2, 2, INT32_TO_FLOAT_N, INT32_TO_FLOAT_INIT
320 PACK_2CH float, int32, a, 2, 2, INT32_TO_FLOAT_N, INT32_TO_FLOAT_INIT
321 PACK_2CH int32, float, u, 2, 2, FLOAT_TO_INT32_N, FLOAT_TO_INT32_INIT
322 PACK_2CH int32, float, a, 2, 2, FLOAT_TO_INT32_N, FLOAT_TO_INT32_INIT
323 PACK_2CH float, int16, u, 2, 1, INT16_TO_FLOAT_N, INT16_TO_FLOAT_INIT
324 PACK_2CH float, int16, a, 2, 1, INT16_TO_FLOAT_N, INT16_TO_FLOAT_INIT
325 PACK_2CH int16, float, u, 1, 2, FLOAT_TO_INT16_N, FLOAT_TO_INT16_INIT
326 PACK_2CH int16, float, a, 1, 2, FLOAT_TO_INT16_N, FLOAT_TO_INT16_INIT
327
328 UNPACK_2CH float, int32, u, 2, 2, INT32_TO_FLOAT_N, INT32_TO_FLOAT_INIT
329 UNPACK_2CH float, int32, a, 2, 2, INT32_TO_FLOAT_N, INT32_TO_FLOAT_INIT
330 UNPACK_2CH int32, float, u, 2, 2, FLOAT_TO_INT32_N, FLOAT_TO_INT32_INIT
331 UNPACK_2CH int32, float, a, 2, 2, FLOAT_TO_INT32_N, FLOAT_TO_INT32_INIT
332 UNPACK_2CH float, int16, u, 2, 1, INT16_TO_FLOAT_N, INT16_TO_FLOAT_INIT
333 UNPACK_2CH float, int16, a, 2, 1, INT16_TO_FLOAT_N, INT16_TO_FLOAT_INIT
334 UNPACK_2CH int16, float, u, 1, 2, FLOAT_TO_INT16_N, FLOAT_TO_INT16_INIT
335 UNPACK_2CH int16, float, a, 1, 2, FLOAT_TO_INT16_N, FLOAT_TO_INT16_INIT
336
337
338 INIT_XMM ssse3
339 UNPACK_2CH int16, int16, u, 1, 1
340 UNPACK_2CH int16, int16, a, 1, 1
341 UNPACK_2CH int32, int16, u, 2, 1, INT16_TO_INT32_N
342 UNPACK_2CH int32, int16, a, 2, 1, INT16_TO_INT32_N
343 UNPACK_2CH float, int16, u, 2, 1, INT16_TO_FLOAT_N, INT16_TO_FLOAT_INIT
344 UNPACK_2CH float, int16, a, 2, 1, INT16_TO_FLOAT_N, INT16_TO_FLOAT_INIT
345
346 %if HAVE_AVX
347 INIT_YMM avx
348 CONV float, int32, u, 2, 2, INT32_TO_FLOAT_N, INT32_TO_FLOAT_INIT
349 CONV float, int32, a, 2, 2, INT32_TO_FLOAT_N, INT32_TO_FLOAT_INIT
350 %endif