]> 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 SECTION .text
31
32
33 ;to, from, a/u, log2_outsize, log_intsize, const
34 %macro PACK_2CH 5-7
35 cglobal pack_2ch_%2_to_%1_%3, 3, 4, 6, dst, src, len, src2
36     mov src2q   , [srcq+gprsize]
37     mov srcq    , [srcq]
38     mov dstq    , [dstq]
39 %ifidn %3, a
40     test dstq, mmsize-1
41         jne pack_2ch_%2_to_%1_u_int %+ SUFFIX
42     test srcq, mmsize-1
43         jne pack_2ch_%2_to_%1_u_int %+ SUFFIX
44     test src2q, mmsize-1
45         jne pack_2ch_%2_to_%1_u_int %+ SUFFIX
46 %else
47 pack_2ch_%2_to_%1_u_int %+ SUFFIX
48 %endif
49     lea     srcq , [srcq  + (1<<%5)*lenq]
50     lea     src2q, [src2q + (1<<%5)*lenq]
51     lea     dstq , [dstq  + (2<<%4)*lenq]
52     neg     lenq
53     %7
54 .next:
55     mov%3     m0, [         srcq +(1<<%5)*lenq]
56     mova      m1, m0
57     mov%3     m2, [         src2q+(1<<%5)*lenq]
58 %if %5 == 1
59     punpcklwd m0, m2
60     punpckhwd m1, m2
61 %else
62     punpckldq m0, m2
63     punpckhdq m1, m2
64 %endif
65 %if %4 < %5
66     mov%3     m2, [mmsize + srcq +(1<<%5)*lenq]
67     mova      m3, m2
68     mov%3     m4, [mmsize + src2q+(1<<%5)*lenq]
69     punpckldq m2, m4
70     punpckhdq m3, m4
71 %endif
72     %6
73     mov%3 [           dstq+(2<<%4)*lenq], m0
74     mov%3 [  mmsize + dstq+(2<<%4)*lenq], m1
75 %if %4 > %5
76     mov%3 [2*mmsize + dstq+(2<<%4)*lenq], m2
77     mov%3 [3*mmsize + dstq+(2<<%4)*lenq], m3
78     add lenq, 4*mmsize/(2<<%4)
79 %else
80     add lenq, 2*mmsize/(2<<%4)
81 %endif
82         jl .next
83     REP_RET
84 %endmacro
85
86 %macro CONV 5-7
87 cglobal %2_to_%1_%3, 3, 3, 6, dst, src, len
88     mov srcq    , [srcq]
89     mov dstq    , [dstq]
90 %ifidn %3, a
91     test dstq, mmsize-1
92         jne %2_to_%1_u_int %+ SUFFIX
93     test srcq, mmsize-1
94         jne %2_to_%1_u_int %+ SUFFIX
95 %else
96 %2_to_%1_u_int %+ SUFFIX
97 %endif
98     lea     srcq , [srcq  + (1<<%5)*lenq]
99     lea     dstq , [dstq  + (1<<%4)*lenq]
100     neg     lenq
101     %7
102 .next:
103     mov%3     m0, [           srcq +(1<<%5)*lenq]
104     mov%3     m1, [  mmsize + srcq +(1<<%5)*lenq]
105 %if %4 < %5
106     mov%3     m2, [2*mmsize + srcq +(1<<%5)*lenq]
107     mov%3     m3, [3*mmsize + srcq +(1<<%5)*lenq]
108 %endif
109     %6
110     mov%3 [           dstq+(1<<%4)*lenq], m0
111     mov%3 [  mmsize + dstq+(1<<%4)*lenq], m1
112 %if %4 > %5
113     mov%3 [2*mmsize + dstq+(1<<%4)*lenq], m2
114     mov%3 [3*mmsize + dstq+(1<<%4)*lenq], m3
115     add lenq, 4*mmsize/(1<<%4)
116 %else
117     add lenq, 2*mmsize/(1<<%4)
118 %endif
119         jl .next
120     REP_RET
121 %endmacro
122
123 %macro INT16_TO_INT32_N 0
124     pxor      m2, m2
125     pxor      m3, m3
126     punpcklwd m2, m1
127     punpckhwd m3, m1
128     SWAP 4,0
129     pxor      m0, m0
130     pxor      m1, m1
131     punpcklwd m0, m4
132     punpckhwd m1, m4
133 %endmacro
134
135 %macro INT32_TO_INT16_N 0
136     psrad     m0, 16
137     psrad     m1, 16
138     psrad     m2, 16
139     psrad     m3, 16
140     packssdw  m0, m1
141     packssdw  m2, m3
142     SWAP 1,2
143 %endmacro
144
145 %macro INT32_TO_FLOAT_INIT 0
146     mova      m3, [flt2pm31]
147 %endmacro
148 %macro INT32_TO_FLOAT_N 0
149     cvtdq2ps  m0, m0
150     cvtdq2ps  m1, m1
151     mulps m0, m0, m3
152     mulps m1, m1, m3
153 %endmacro
154
155 %macro FLOAT_TO_INT32_INIT 0
156     mova      m3, [flt2p31]
157 %endmacro
158 %macro FLOAT_TO_INT32_N 0
159     mulps m0, m3
160     mulps m1, m3
161     cvtps2dq  m2, m0
162     cvtps2dq  m4, m1
163     cmpnltps m0, m3
164     cmpnltps m1, m3
165     paddd m0, m2
166     paddd m1, m4
167 %endmacro
168
169 %macro INT16_TO_FLOAT_INIT 0
170     mova      m5, [flt2pm31]
171 %endmacro
172 %macro INT16_TO_FLOAT_N 0
173     INT16_TO_INT32_N
174     cvtdq2ps  m0, m0
175     cvtdq2ps  m1, m1
176     cvtdq2ps  m2, m2
177     cvtdq2ps  m3, m3
178     mulps m0, m0, m5
179     mulps m1, m1, m5
180     mulps m2, m2, m5
181     mulps m3, m3, m5
182 %endmacro
183
184 %macro FLOAT_TO_INT16_INIT 0
185     mova      m5, [flt2p15]
186 %endmacro
187 %macro FLOAT_TO_INT16_N 0
188     mulps m0, m5
189     mulps m1, m5
190     mulps m2, m5
191     mulps m3, m5
192     cvtps2dq  m0, m0
193     cvtps2dq  m1, m1
194     packssdw  m0, m1
195     cvtps2dq  m1, m2
196     cvtps2dq  m3, m3
197     packssdw  m1, m3
198 %endmacro
199
200 INIT_MMX mmx
201 CONV int32, int16, u, 2, 1, INT16_TO_INT32_N
202 CONV int32, int16, a, 2, 1, INT16_TO_INT32_N
203 CONV int16, int32, u, 1, 2, INT32_TO_INT16_N
204 CONV int16, int32, a, 1, 2, INT32_TO_INT16_N
205
206 INIT_XMM sse
207 CONV int32, int16, u, 2, 1, INT16_TO_INT32_N
208 CONV int32, int16, a, 2, 1, INT16_TO_INT32_N
209 CONV int16, int32, u, 1, 2, INT32_TO_INT16_N
210 CONV int16, int32, a, 1, 2, INT32_TO_INT16_N
211
212 PACK_2CH int16, int16, u, 1, 1
213 PACK_2CH int16, int16, a, 1, 1
214 PACK_2CH int32, int32, u, 2, 2
215 PACK_2CH int32, int32, a, 2, 2
216 PACK_2CH int32, int16, u, 2, 1, INT16_TO_INT32_N
217 PACK_2CH int32, int16, a, 2, 1, INT16_TO_INT32_N
218 PACK_2CH int16, int32, u, 1, 2, INT32_TO_INT16_N
219 PACK_2CH int16, int32, a, 1, 2, INT32_TO_INT16_N
220
221 INIT_XMM sse2
222 CONV float, int32, u, 2, 2, INT32_TO_FLOAT_N, INT32_TO_FLOAT_INIT
223 CONV float, int32, a, 2, 2, INT32_TO_FLOAT_N, INT32_TO_FLOAT_INIT
224 CONV int32, float, u, 2, 2, FLOAT_TO_INT32_N, FLOAT_TO_INT32_INIT
225 CONV int32, float, a, 2, 2, FLOAT_TO_INT32_N, FLOAT_TO_INT32_INIT
226 CONV float, int16, u, 2, 1, INT16_TO_FLOAT_N, INT16_TO_FLOAT_INIT
227 CONV float, int16, a, 2, 1, INT16_TO_FLOAT_N, INT16_TO_FLOAT_INIT
228 CONV int16, float, u, 1, 2, FLOAT_TO_INT16_N, FLOAT_TO_INT16_INIT
229 CONV int16, float, a, 1, 2, FLOAT_TO_INT16_N, FLOAT_TO_INT16_INIT
230
231 PACK_2CH float, int32, u, 2, 2, INT32_TO_FLOAT_N, INT32_TO_FLOAT_INIT
232 PACK_2CH float, int32, a, 2, 2, INT32_TO_FLOAT_N, INT32_TO_FLOAT_INIT
233 PACK_2CH int32, float, u, 2, 2, FLOAT_TO_INT32_N, FLOAT_TO_INT32_INIT
234 PACK_2CH int32, float, a, 2, 2, FLOAT_TO_INT32_N, FLOAT_TO_INT32_INIT
235 PACK_2CH float, int16, u, 2, 1, INT16_TO_FLOAT_N, INT16_TO_FLOAT_INIT
236 PACK_2CH float, int16, a, 2, 1, INT16_TO_FLOAT_N, INT16_TO_FLOAT_INIT
237 PACK_2CH int16, float, u, 1, 2, FLOAT_TO_INT16_N, FLOAT_TO_INT16_INIT
238 PACK_2CH int16, float, a, 1, 2, FLOAT_TO_INT16_N, FLOAT_TO_INT16_INIT
239
240
241 %if HAVE_AVX
242 INIT_YMM avx
243 CONV float, int32, u, 2, 2, INT32_TO_FLOAT_N, INT32_TO_FLOAT_INIT
244 CONV float, int32, a, 2, 2, INT32_TO_FLOAT_N, INT32_TO_FLOAT_INIT
245 %endif