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