]> git.sesse.net Git - ffmpeg/blob - libswresample/x86/audio_convert.asm
Merge remote-tracking branch 'qatar/master'
[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 m0,m1,m2,m3,m4,m5
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 m0,m1,m2,m3,m4,m5
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 m0,m1,m2,m3,m4,m5
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 m0,m1,m2,m3,m4,m5
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 m0,m1,m2,m3,m4,m5
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 m0,m1,m2,m3,m4,m5
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 m0,m1,m2,m3,m4,m5
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 PACK_6CH 5-7
203 cglobal pack_6ch_%2_to_%1_%3, 2,8,7, dst, src, src1, src2, src3, src4, src5, len
204 %if ARCH_X86_64
205     mov     lend, r2d
206 %else
207     %define lend dword r2m
208 %endif
209     mov    src1q, [srcq+1*gprsize]
210     mov    src2q, [srcq+2*gprsize]
211     mov    src3q, [srcq+3*gprsize]
212     mov    src4q, [srcq+4*gprsize]
213     mov    src5q, [srcq+5*gprsize]
214     mov     srcq, [srcq]
215     mov     dstq, [dstq]
216 %ifidn %3, a
217     test dstq, mmsize-1
218         jne pack_6ch_%2_to_%1_u_int %+ SUFFIX
219     test srcq, mmsize-1
220         jne pack_6ch_%2_to_%1_u_int %+ SUFFIX
221     test src2q, mmsize-1
222         jne pack_6ch_%2_to_%1_u_int %+ SUFFIX
223     test src3q, mmsize-1
224         jne pack_6ch_%2_to_%1_u_int %+ SUFFIX
225     test src4q, mmsize-1
226         jne pack_6ch_%2_to_%1_u_int %+ SUFFIX
227     test src5q, mmsize-1
228         jne pack_6ch_%2_to_%1_u_int %+ SUFFIX
229 %else
230 pack_6ch_%2_to_%1_u_int %+ SUFFIX
231 %endif
232     sub    src1q, srcq
233     sub    src2q, srcq
234     sub    src3q, srcq
235     sub    src4q, srcq
236     sub    src5q, srcq
237 .loop:
238     mov%3     m0, [srcq      ]
239     mov%3     m1, [srcq+src1q]
240     mov%3     m2, [srcq+src2q]
241     mov%3     m3, [srcq+src3q]
242     mov%3     m4, [srcq+src4q]
243     mov%3     m5, [srcq+src5q]
244     %7 x,x,x,x,m7,x
245 %if cpuflag(sse4)
246     SBUTTERFLYPS 0, 1, 6
247     SBUTTERFLYPS 2, 3, 6
248     SBUTTERFLYPS 4, 5, 6
249
250     blendps   m6, m4, m0, 1100b
251     movlhps   m0, m2
252     movhlps   m4, m2
253     blendps   m2, m5, m1, 1100b
254     movlhps   m1, m3
255     movhlps   m5, m3
256
257     %6 m0,m6,x,x,m7,m3
258     %6 m4,m1,x,x,m7,m3
259     %6 m2,m5,x,x,m7,m3
260
261     mov %+ %3 %+ ps [dstq   ], m0
262     mov %+ %3 %+ ps [dstq+16], m6
263     mov %+ %3 %+ ps [dstq+32], m4
264     mov %+ %3 %+ ps [dstq+48], m1
265     mov %+ %3 %+ ps [dstq+64], m2
266     mov %+ %3 %+ ps [dstq+80], m5
267 %else ; mmx
268     SBUTTERFLY dq, 0, 1, 6
269     SBUTTERFLY dq, 2, 3, 6
270     SBUTTERFLY dq, 4, 5, 6
271
272     movq   [dstq   ], m0
273     movq   [dstq+ 8], m2
274     movq   [dstq+16], m4
275     movq   [dstq+24], m1
276     movq   [dstq+32], m3
277     movq   [dstq+40], m5
278 %endif
279     add      srcq, mmsize
280     add      dstq, mmsize*6
281     sub      lend, mmsize/4
282     jg .loop
283 %if mmsize == 8
284     emms
285     RET
286 %else
287     REP_RET
288 %endif
289 %endmacro
290
291 %macro INT16_TO_INT32_N 6
292     pxor      m2, m2
293     pxor      m3, m3
294     punpcklwd m2, m1
295     punpckhwd m3, m1
296     SWAP 4,0
297     pxor      m0, m0
298     pxor      m1, m1
299     punpcklwd m0, m4
300     punpckhwd m1, m4
301 %endmacro
302
303 %macro INT32_TO_INT16_N 6
304     psrad     m0, 16
305     psrad     m1, 16
306     psrad     m2, 16
307     psrad     m3, 16
308     packssdw  m0, m1
309     packssdw  m2, m3
310     SWAP 1,2
311 %endmacro
312
313 %macro INT32_TO_FLOAT_INIT 6
314     mova      %5, [flt2pm31]
315 %endmacro
316 %macro INT32_TO_FLOAT_N 6
317     cvtdq2ps  %1, %1
318     cvtdq2ps  %2, %2
319     mulps %1, %1, %5
320     mulps %2, %2, %5
321 %endmacro
322
323 %macro FLOAT_TO_INT32_INIT 6
324     mova      %5, [flt2p31]
325 %endmacro
326 %macro FLOAT_TO_INT32_N 6
327     mulps %1, %5
328     mulps %2, %5
329     cvtps2dq  %6, %1
330     cmpnltps %1, %5
331     paddd %1, %6
332     cvtps2dq  %6, %2
333     cmpnltps %2, %5
334     paddd %2, %6
335 %endmacro
336
337 %macro INT16_TO_FLOAT_INIT 6
338     mova      m5, [flt2pm31]
339 %endmacro
340 %macro INT16_TO_FLOAT_N 6
341     INT16_TO_INT32_N %1,%2,%3,%4,%5,%6
342     cvtdq2ps  m0, m0
343     cvtdq2ps  m1, m1
344     cvtdq2ps  m2, m2
345     cvtdq2ps  m3, m3
346     mulps m0, m0, m5
347     mulps m1, m1, m5
348     mulps m2, m2, m5
349     mulps m3, m3, m5
350 %endmacro
351
352 %macro FLOAT_TO_INT16_INIT 6
353     mova      m5, [flt2p15]
354 %endmacro
355 %macro FLOAT_TO_INT16_N 6
356     mulps m0, m5
357     mulps m1, m5
358     mulps m2, m5
359     mulps m3, m5
360     cvtps2dq  m0, m0
361     cvtps2dq  m1, m1
362     packssdw  m0, m1
363     cvtps2dq  m1, m2
364     cvtps2dq  m3, m3
365     packssdw  m1, m3
366 %endmacro
367
368 %macro NOP_N 0-6
369 %endmacro
370
371 INIT_MMX mmx
372 CONV int32, int16, u, 2, 1, INT16_TO_INT32_N, NOP_N
373 CONV int32, int16, a, 2, 1, INT16_TO_INT32_N, NOP_N
374 CONV int16, int32, u, 1, 2, INT32_TO_INT16_N, NOP_N
375 CONV int16, int32, a, 1, 2, INT32_TO_INT16_N, NOP_N
376
377 PACK_6CH float, float, u, 2, 2, NOP_N, NOP_N
378 PACK_6CH float, float, a, 2, 2, NOP_N, NOP_N
379
380 INIT_XMM sse
381 CONV int32, int16, u, 2, 1, INT16_TO_INT32_N, NOP_N
382 CONV int32, int16, a, 2, 1, INT16_TO_INT32_N, NOP_N
383 CONV int16, int32, u, 1, 2, INT32_TO_INT16_N, NOP_N
384 CONV int16, int32, a, 1, 2, INT32_TO_INT16_N, NOP_N
385
386 PACK_2CH int16, int16, u, 1, 1, NOP_N, NOP_N
387 PACK_2CH int16, int16, a, 1, 1, NOP_N, NOP_N
388 PACK_2CH int32, int32, u, 2, 2, NOP_N, NOP_N
389 PACK_2CH int32, int32, a, 2, 2, NOP_N, NOP_N
390 PACK_2CH int32, int16, u, 2, 1, INT16_TO_INT32_N, NOP_N
391 PACK_2CH int32, int16, a, 2, 1, INT16_TO_INT32_N, NOP_N
392 PACK_2CH int16, int32, u, 1, 2, INT32_TO_INT16_N, NOP_N
393 PACK_2CH int16, int32, a, 1, 2, INT32_TO_INT16_N, NOP_N
394
395 UNPACK_2CH int16, int16, u, 1, 1, NOP_N, NOP_N
396 UNPACK_2CH int16, int16, a, 1, 1, NOP_N, NOP_N
397 UNPACK_2CH int32, int32, u, 2, 2, NOP_N, NOP_N
398 UNPACK_2CH int32, int32, a, 2, 2, NOP_N, NOP_N
399 UNPACK_2CH int32, int16, u, 2, 1, INT16_TO_INT32_N, NOP_N
400 UNPACK_2CH int32, int16, a, 2, 1, INT16_TO_INT32_N, NOP_N
401 UNPACK_2CH int16, int32, u, 1, 2, INT32_TO_INT16_N, NOP_N
402 UNPACK_2CH int16, int32, a, 1, 2, INT32_TO_INT16_N, NOP_N
403
404 INIT_XMM sse2
405 CONV float, int32, u, 2, 2, INT32_TO_FLOAT_N, INT32_TO_FLOAT_INIT
406 CONV float, int32, a, 2, 2, INT32_TO_FLOAT_N, INT32_TO_FLOAT_INIT
407 CONV int32, float, u, 2, 2, FLOAT_TO_INT32_N, FLOAT_TO_INT32_INIT
408 CONV int32, float, a, 2, 2, FLOAT_TO_INT32_N, FLOAT_TO_INT32_INIT
409 CONV float, int16, u, 2, 1, INT16_TO_FLOAT_N, INT16_TO_FLOAT_INIT
410 CONV float, int16, a, 2, 1, INT16_TO_FLOAT_N, INT16_TO_FLOAT_INIT
411 CONV int16, float, u, 1, 2, FLOAT_TO_INT16_N, FLOAT_TO_INT16_INIT
412 CONV int16, float, a, 1, 2, FLOAT_TO_INT16_N, FLOAT_TO_INT16_INIT
413
414 PACK_2CH float, int32, u, 2, 2, INT32_TO_FLOAT_N, INT32_TO_FLOAT_INIT
415 PACK_2CH float, int32, a, 2, 2, INT32_TO_FLOAT_N, INT32_TO_FLOAT_INIT
416 PACK_2CH int32, float, u, 2, 2, FLOAT_TO_INT32_N, FLOAT_TO_INT32_INIT
417 PACK_2CH int32, float, a, 2, 2, FLOAT_TO_INT32_N, FLOAT_TO_INT32_INIT
418 PACK_2CH float, int16, u, 2, 1, INT16_TO_FLOAT_N, INT16_TO_FLOAT_INIT
419 PACK_2CH float, int16, a, 2, 1, INT16_TO_FLOAT_N, INT16_TO_FLOAT_INIT
420 PACK_2CH int16, float, u, 1, 2, FLOAT_TO_INT16_N, FLOAT_TO_INT16_INIT
421 PACK_2CH int16, float, a, 1, 2, FLOAT_TO_INT16_N, FLOAT_TO_INT16_INIT
422
423 UNPACK_2CH float, int32, u, 2, 2, INT32_TO_FLOAT_N, INT32_TO_FLOAT_INIT
424 UNPACK_2CH float, int32, a, 2, 2, INT32_TO_FLOAT_N, INT32_TO_FLOAT_INIT
425 UNPACK_2CH int32, float, u, 2, 2, FLOAT_TO_INT32_N, FLOAT_TO_INT32_INIT
426 UNPACK_2CH int32, float, a, 2, 2, FLOAT_TO_INT32_N, FLOAT_TO_INT32_INIT
427 UNPACK_2CH float, int16, u, 2, 1, INT16_TO_FLOAT_N, INT16_TO_FLOAT_INIT
428 UNPACK_2CH float, int16, a, 2, 1, INT16_TO_FLOAT_N, INT16_TO_FLOAT_INIT
429 UNPACK_2CH int16, float, u, 1, 2, FLOAT_TO_INT16_N, FLOAT_TO_INT16_INIT
430 UNPACK_2CH int16, float, a, 1, 2, FLOAT_TO_INT16_N, FLOAT_TO_INT16_INIT
431
432
433 INIT_XMM ssse3
434 UNPACK_2CH int16, int16, u, 1, 1, NOP_N, NOP_N
435 UNPACK_2CH int16, int16, a, 1, 1, NOP_N, NOP_N
436 UNPACK_2CH int32, int16, u, 2, 1, INT16_TO_INT32_N, NOP_N
437 UNPACK_2CH int32, int16, a, 2, 1, INT16_TO_INT32_N, NOP_N
438 UNPACK_2CH float, int16, u, 2, 1, INT16_TO_FLOAT_N, INT16_TO_FLOAT_INIT
439 UNPACK_2CH float, int16, a, 2, 1, INT16_TO_FLOAT_N, INT16_TO_FLOAT_INIT
440
441 INIT_XMM sse4
442 PACK_6CH float, float, u, 2, 2, NOP_N, NOP_N
443 PACK_6CH float, float, a, 2, 2, NOP_N, NOP_N
444
445 PACK_6CH float, int32, u, 2, 2, INT32_TO_FLOAT_N, INT32_TO_FLOAT_INIT
446 PACK_6CH float, int32, a, 2, 2, INT32_TO_FLOAT_N, INT32_TO_FLOAT_INIT
447 PACK_6CH int32, float, u, 2, 2, FLOAT_TO_INT32_N, FLOAT_TO_INT32_INIT
448 PACK_6CH int32, float, a, 2, 2, FLOAT_TO_INT32_N, FLOAT_TO_INT32_INIT
449
450 %if HAVE_AVX
451 INIT_XMM avx
452 PACK_6CH float, float, u, 2, 2, NOP_N, NOP_N
453 PACK_6CH float, float, a, 2, 2, NOP_N, NOP_N
454
455 PACK_6CH float, int32, u, 2, 2, INT32_TO_FLOAT_N, INT32_TO_FLOAT_INIT
456 PACK_6CH float, int32, a, 2, 2, INT32_TO_FLOAT_N, INT32_TO_FLOAT_INIT
457 PACK_6CH int32, float, u, 2, 2, FLOAT_TO_INT32_N, FLOAT_TO_INT32_INIT
458 PACK_6CH int32, float, a, 2, 2, FLOAT_TO_INT32_N, FLOAT_TO_INT32_INIT
459
460 INIT_YMM avx
461 CONV float, int32, u, 2, 2, INT32_TO_FLOAT_N, INT32_TO_FLOAT_INIT
462 CONV float, int32, a, 2, 2, INT32_TO_FLOAT_N, INT32_TO_FLOAT_INIT
463 %endif