]> git.sesse.net Git - ffmpeg/blob - libswresample/x86/audio_convert.asm
70e2cf2ba8032a82bbafc1304aa2aa53f89d9494
[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 %macro INT16_TO_INT32 1
33 cglobal int16_to_int32_%1, 3, 3, 3, dst, src, len
34     mov srcq, [srcq]
35     mov dstq, [dstq]
36     shl     lenq, 2
37 %ifidn %1, a
38     test dstq, mmsize-1
39         jne int16_to_int32_u_int %+ SUFFIX
40     test srcq, mmsize-1
41         jne int16_to_int32_u_int %+ SUFFIX
42 %else
43 int16_to_int32_u_int %+ SUFFIX
44 %endif
45     add     dstq, lenq
46     shr     lenq, 1
47     add     srcq, lenq
48     neg     lenq
49 .next
50     mov%1     m2, [srcq+lenq]
51     pxor      m0, m0
52     pxor      m1, m1
53     punpcklwd m0, m2
54     punpckhwd m1, m2
55     mov%1 [         dstq+2*lenq], m0
56     mov%1 [mmsize + dstq+2*lenq], m1
57     add lenq, mmsize
58         jl .next
59 %if mmsize == 8
60     emms
61 %endif
62     REP_RET
63 %endmacro
64
65
66
67 %macro INT32_TO_INT16 1
68 cglobal int32_to_int16_%1, 3, 3, 2, dst, src, len
69     mov srcq, [srcq]
70     mov dstq, [dstq]
71     add lenq    , lenq
72 %ifidn %1, a
73     test dstq, mmsize-1
74         jne int32_to_int16_u_int %+ SUFFIX
75     test srcq, mmsize-1
76         jne int32_to_int16_u_int %+ SUFFIX
77 %else
78 int32_to_int16_u_int %+ SUFFIX
79 %endif
80     lea     srcq, [srcq + 2*lenq]
81     add     dstq, lenq
82     neg     lenq
83 .next:
84     mov%1     m0, [         srcq+2*lenq]
85     mov%1     m1, [mmsize + srcq+2*lenq]
86     psrad     m0, 16
87     psrad     m1, 16
88     packssdw  m0, m1
89     mov%1 [         dstq+lenq], m0
90     add lenq, mmsize
91         jl .next
92     REP_RET
93 %endmacro
94
95 ;to, from, a/u, log2_outsize, log_intsize, const
96 %macro PACK_2CH 5-7
97 cglobal pack_2ch_%2_to_%1_%3, 3, 4, 5, dst, src, len, src2
98     mov src2q   , [srcq+gprsize]
99     mov srcq    , [srcq]
100     mov dstq    , [dstq]
101 %ifidn %3, a
102     test dstq, mmsize-1
103         jne pack_2ch_%1_to_%2_u_int %+ SUFFIX
104     test srcq, mmsize-1
105         jne pack_2ch_%1_to_%2_u_int %+ SUFFIX
106     test src2q, mmsize-1
107         jne pack_2ch_%1_to_%2_u_int %+ SUFFIX
108 %else
109 pack_2ch_%1_to_%2_u_int %+ SUFFIX
110 %endif
111     lea     srcq , [srcq  + (1<<%5)*lenq]
112     lea     src2q, [src2q + (1<<%5)*lenq]
113     lea     dstq , [dstq  + (2<<%4)*lenq]
114     neg     lenq
115     %7
116 .next:
117     mov%3     m0, [         srcq +(1<<%5)*lenq]
118     mova      m1, m0
119     mov%3     m2, [         src2q+(1<<%5)*lenq]
120 %if %5 == 1
121     punpcklwd m0, m2
122     punpckhwd m1, m2
123 %else
124     punpckldq m0, m2
125     punpckhdq m1, m2
126 %endif
127 %if %4 < %5
128     mov%3     m2, [mmsize + srcq +(1<<%5)*lenq]
129     mova      m3, m2
130     mov%3     m4, [mmsize + src2q+(1<<%5)*lenq]
131     punpckldq m2, m4
132     punpckhdq m3, m4
133 %endif
134     %6
135     mov%3 [           dstq+(2<<%4)*lenq], m0
136     mov%3 [  mmsize + dstq+(2<<%4)*lenq], m1
137 %if %4 > %5
138     mov%3 [2*mmsize + dstq+(2<<%4)*lenq], m2
139     mov%3 [3*mmsize + dstq+(2<<%4)*lenq], m3
140     add lenq, 4*mmsize/(2<<%4)
141 %else
142     add lenq, 2*mmsize/(2<<%4)
143 %endif
144         jl .next
145     REP_RET
146 %endmacro
147
148 %macro CONV 5-7
149 cglobal %2_to_%1_%3, 3, 3, 6, dst, src, len
150     mov srcq    , [srcq]
151     mov dstq    , [dstq]
152 %ifidn %3, a
153     test dstq, mmsize-1
154         jne %2_to_%1_u_int %+ SUFFIX
155     test srcq, mmsize-1
156         jne %2_to_%1_u_int %+ SUFFIX
157 %else
158 %2_to_%1_u_int %+ SUFFIX
159 %endif
160     lea     srcq , [srcq  + (1<<%5)*lenq]
161     lea     dstq , [dstq  + (1<<%4)*lenq]
162     neg     lenq
163     %7
164 .next:
165     mov%3     m0, [           srcq +(1<<%5)*lenq]
166     mov%3     m1, [  mmsize + srcq +(1<<%5)*lenq]
167 %if %4 < %5
168     mov%3     m2, [2*mmsize + srcq +(1<<%5)*lenq]
169     mov%3     m3, [3*mmsize + srcq +(1<<%5)*lenq]
170 %endif
171     %6
172     mov%3 [           dstq+(1<<%4)*lenq], m0
173     mov%3 [  mmsize + dstq+(1<<%4)*lenq], m1
174 %if %4 > %5
175     mov%3 [2*mmsize + dstq+(1<<%4)*lenq], m2
176     mov%3 [3*mmsize + dstq+(1<<%4)*lenq], m3
177     add lenq, 4*mmsize/(1<<%4)
178 %else
179     add lenq, 2*mmsize/(1<<%4)
180 %endif
181         jl .next
182     REP_RET
183 %endmacro
184
185 %macro INT16_TO_INT32_N 0
186     pxor      m2, m2
187     pxor      m3, m3
188     punpcklwd m2, m1
189     punpckhwd m3, m1
190     SWAP 4,0
191     pxor      m0, m0
192     pxor      m1, m1
193     punpcklwd m0, m4
194     punpckhwd m1, m4
195 %endmacro
196
197 %macro INT32_TO_INT16_N 0
198     psrad     m0, 16
199     psrad     m1, 16
200     psrad     m2, 16
201     psrad     m3, 16
202     packssdw  m0, m1
203     packssdw  m2, m3
204     SWAP 1,2
205 %endmacro
206
207 %macro INT32_TO_FLOAT_INIT 0
208     mova      m3, [flt2pm31]
209 %endmacro
210 %macro INT32_TO_FLOAT_N 0
211     cvtdq2ps  m0, m0
212     cvtdq2ps  m1, m1
213     mulps m0, m0, m3
214     mulps m1, m1, m3
215 %endmacro
216
217 %macro FLOAT_TO_INT32_INIT 0
218     mova      m3, [flt2p31]
219 %endmacro
220 %macro FLOAT_TO_INT32_N 0
221     mulps m0, m3
222     mulps m1, m3
223     cvtps2dq  m2, m0
224     cvtps2dq  m4, m1
225     cmpnltps m0, m3
226     cmpnltps m1, m3
227     paddd m0, m2
228     paddd m1, m4
229 %endmacro
230
231 %macro INT16_TO_FLOAT_INIT 0
232     mova      m5, [flt2pm31]
233 %endmacro
234 %macro INT16_TO_FLOAT_N 0
235     INT16_TO_INT32_N
236     cvtdq2ps  m0, m0
237     cvtdq2ps  m1, m1
238     cvtdq2ps  m2, m2
239     cvtdq2ps  m3, m3
240     mulps m0, m0, m5
241     mulps m1, m1, m5
242     mulps m2, m2, m5
243     mulps m3, m3, m5
244 %endmacro
245
246 %macro FLOAT_TO_INT16_INIT 0
247     mova      m5, [flt2p15]
248 %endmacro
249 %macro FLOAT_TO_INT16_N 0
250     mulps m0, m5
251     mulps m1, m5
252     mulps m2, m5
253     mulps m3, m5
254     cvtps2dq  m0, m0
255     cvtps2dq  m1, m1
256     packssdw  m0, m1
257     cvtps2dq  m1, m2
258     cvtps2dq  m3, m3
259     packssdw  m1, m3
260 %endmacro
261
262 INIT_MMX mmx
263 INT16_TO_INT32 u
264 INT16_TO_INT32 a
265 INT32_TO_INT16 u
266 INT32_TO_INT16 a
267
268 INIT_XMM sse
269 INT16_TO_INT32 u
270 INT16_TO_INT32 a
271 INT32_TO_INT16 u
272 INT32_TO_INT16 a
273
274 PACK_2CH int16, int16, u, 1, 1
275 PACK_2CH int16, int16, a, 1, 1
276 PACK_2CH int32, int32, u, 2, 2
277 PACK_2CH int32, int32, a, 2, 2
278 PACK_2CH int32, int16, u, 2, 1, INT16_TO_INT32_N
279 PACK_2CH int32, int16, a, 2, 1, INT16_TO_INT32_N
280 PACK_2CH int16, int32, u, 1, 2, INT32_TO_INT16_N
281 PACK_2CH int16, int32, a, 1, 2, INT32_TO_INT16_N
282
283 INIT_XMM sse2
284 CONV float, int32, u, 2, 2, INT32_TO_FLOAT_N, INT32_TO_FLOAT_INIT
285 CONV float, int32, a, 2, 2, INT32_TO_FLOAT_N, INT32_TO_FLOAT_INIT
286 CONV int32, float, u, 2, 2, FLOAT_TO_INT32_N, FLOAT_TO_INT32_INIT
287 CONV int32, float, a, 2, 2, FLOAT_TO_INT32_N, FLOAT_TO_INT32_INIT
288 CONV float, int16, u, 2, 1, INT16_TO_FLOAT_N, INT16_TO_FLOAT_INIT
289 CONV float, int16, a, 2, 1, INT16_TO_FLOAT_N, INT16_TO_FLOAT_INIT
290 CONV int16, float, u, 1, 2, FLOAT_TO_INT16_N, FLOAT_TO_INT16_INIT
291 CONV int16, float, a, 1, 2, FLOAT_TO_INT16_N, FLOAT_TO_INT16_INIT
292
293 PACK_2CH float, int32, u, 2, 2, INT32_TO_FLOAT_N, INT32_TO_FLOAT_INIT
294 PACK_2CH float, int32, a, 2, 2, INT32_TO_FLOAT_N, INT32_TO_FLOAT_INIT
295 PACK_2CH int32, float, u, 2, 2, FLOAT_TO_INT32_N, FLOAT_TO_INT32_INIT
296 PACK_2CH int32, float, a, 2, 2, FLOAT_TO_INT32_N, FLOAT_TO_INT32_INIT
297 PACK_2CH float, int16, u, 2, 1, INT16_TO_FLOAT_N, INT16_TO_FLOAT_INIT
298 PACK_2CH float, int16, a, 2, 1, INT16_TO_FLOAT_N, INT16_TO_FLOAT_INIT
299 PACK_2CH int16, float, u, 1, 2, FLOAT_TO_INT16_N, FLOAT_TO_INT16_INIT
300 PACK_2CH int16, float, a, 1, 2, FLOAT_TO_INT16_N, FLOAT_TO_INT16_INIT
301
302
303 %if HAVE_AVX
304 INIT_YMM avx
305 CONV float, int32, u, 2, 2, INT32_TO_FLOAT_N, INT32_TO_FLOAT_INIT
306 CONV float, int32, a, 2, 2, INT32_TO_FLOAT_N, INT32_TO_FLOAT_INIT
307 %endif