]> 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 %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 %ifidn %1, a
37     test dstq, mmsize-1
38         jne int16_to_int32_u_int %+ SUFFIX
39     test srcq, mmsize-1
40         jne int16_to_int32_u_int %+ SUFFIX
41 %else
42 int16_to_int32_u_int %+ SUFFIX
43 %endif
44     add     dstq, lenq
45     shr     lenq, 1
46     add     srcq, lenq
47     neg     lenq
48 .next
49     mov%1     m2, [srcq+lenq]
50     pxor      m0, m0
51     pxor      m1, m1
52     punpcklwd m0, m2
53     punpckhwd m1, m2
54     mov%1 [         dstq+2*lenq], m0
55     mov%1 [mmsize + dstq+2*lenq], m1
56     add lenq, mmsize
57         jl .next
58 %if mmsize == 8
59     emms
60 %endif
61     REP_RET
62 %endmacro
63
64 %macro INT32_TO_FLOAT 1
65 cglobal int32_to_float_%1, 3, 3, 3, dst, src, len
66     mov srcq, [srcq]
67     mov dstq, [dstq]
68 %ifidn %1, a
69     test dstq, mmsize-1
70         jne int32_to_float_u_int %+ SUFFIX
71     test srcq, mmsize-1
72         jne int32_to_float_u_int %+ SUFFIX
73 %else
74 int32_to_float_u_int %+ SUFFIX
75 %endif
76     add     srcq, lenq
77     add     dstq, lenq
78     neg     lenq
79     mova      m2, [flt2pm31]
80 .next:
81 %ifidn %1, a
82     cvtdq2ps  m0, [         srcq+lenq]
83     cvtdq2ps  m1, [mmsize + srcq+lenq]
84 %else
85     movu      m0, [         srcq+lenq]
86     movu      m1, [mmsize + srcq+lenq]
87     cvtdq2ps  m0, m0
88     cvtdq2ps  m1, m1
89 %endif
90     mulps m0, m0, m2
91     mulps m1, m1, m2
92     mov%1 [         dstq+lenq], m0
93     mov%1 [mmsize + dstq+lenq], m1
94     add lenq, 2*mmsize
95         jl .next
96     REP_RET
97 %endmacro
98
99 %macro INT16_TO_FLOAT 1
100 cglobal int16_to_float_%1, 3, 3, 4, dst, src, len
101     mov srcq, [srcq]
102     mov dstq, [dstq]
103 %ifidn %1, a
104     test dstq, mmsize-1
105         jne int16_to_float_u_int %+ SUFFIX
106     test srcq, mmsize-1
107         jne int16_to_float_u_int %+ SUFFIX
108 %else
109 int16_to_float_u_int %+ SUFFIX
110 %endif
111     add     dstq, lenq
112     shr     lenq, 1
113     add     srcq, lenq
114     neg     lenq
115     mova      m3, [flt2pm31]
116 .next:
117     mov%1     m2, [srcq+lenq]
118     pxor      m0, m0
119     pxor      m1, m1
120     punpcklwd m0, m2
121     punpckhwd m1, m2
122     cvtdq2ps  m0, m0
123     cvtdq2ps  m1, m1
124     mulps m0, m3
125     mulps m1, m3
126     mov%1 [         dstq+2*lenq], m0
127     mov%1 [mmsize + dstq+2*lenq], m1
128     add lenq, mmsize
129         jl .next
130     REP_RET
131 %endmacro
132
133 %macro FLOAT_TO_INT32 1
134 cglobal float_to_int32_%1, 3, 3, 5, dst, src, len
135     mov srcq, [srcq]
136     mov dstq, [dstq]
137 %ifidn %1, a
138     test dstq, mmsize-1
139         jne float_to_int32_u_int %+ SUFFIX
140     test srcq, mmsize-1
141         jne float_to_int32_u_int %+ SUFFIX
142 %else
143 float_to_int32_u_int %+ SUFFIX
144 %endif
145     add     srcq, lenq
146     add     dstq, lenq
147     neg     lenq
148     mova      m2, [flt2p31]
149 .next:
150     mov%1     m0, [         srcq+lenq]
151     mov%1     m1, [mmsize + srcq+lenq]
152     mulps m0, m2
153     mulps m1, m2
154     cvtps2dq  m3, m0
155     cvtps2dq  m4, m1
156     cmpnltps m0, m2
157     cmpnltps m1, m2
158     paddd m0, m3
159     paddd m1, m4
160     mov%1 [         dstq+lenq], m0
161     mov%1 [mmsize + dstq+lenq], m1
162     add lenq, 2*mmsize
163         jl .next
164     REP_RET
165 %endmacro
166
167 %macro FLOAT_TO_INT16 1
168 cglobal float_to_int16_%1, 3, 3, 3, dst, src, len
169     mov srcq, [srcq]
170     mov dstq, [dstq]
171 %ifidn %1, a
172     test dstq, mmsize-1
173         jne float_to_int16_u_int %+ SUFFIX
174     test srcq, mmsize-1
175         jne float_to_int16_u_int %+ SUFFIX
176 %else
177 float_to_int16_u_int %+ SUFFIX
178 %endif
179     lea     srcq, [srcq + 2*lenq]
180     add     dstq, lenq
181     neg     lenq
182     mova      m2, [flt2p15]
183 .next:
184     mov%1     m0, [         srcq+2*lenq]
185     mov%1     m1, [mmsize + srcq+2*lenq]
186     mulps m0, m2
187     mulps m1, m2
188     cvtps2dq  m0, m0
189     cvtps2dq  m1, m1
190     packssdw  m0, m1
191     mov%1 [         dstq+lenq], m0
192     add lenq, mmsize
193         jl .next
194     REP_RET
195 %endmacro
196
197 %macro INT32_TO_INT16 1
198 cglobal int32_to_int16_%1, 3, 3, 2, dst, src, len
199     mov srcq, [srcq]
200     mov dstq, [dstq]
201 %ifidn %1, a
202     test dstq, mmsize-1
203         jne int32_to_int16_u_int %+ SUFFIX
204     test srcq, mmsize-1
205         jne int32_to_int16_u_int %+ SUFFIX
206 %else
207 int32_to_int16_u_int %+ SUFFIX
208 %endif
209     lea     srcq, [srcq + 2*lenq]
210     add     dstq, lenq
211     neg     lenq
212 .next:
213     mov%1     m0, [         srcq+2*lenq]
214     mov%1     m1, [mmsize + srcq+2*lenq]
215     psrad     m0, 16
216     psrad     m1, 16
217     packssdw  m0, m1
218     mov%1 [         dstq+lenq], m0
219     add lenq, mmsize
220         jl .next
221     REP_RET
222 %endmacro
223
224
225 INIT_MMX mmx
226 INT16_TO_INT32 u
227 INT16_TO_INT32 a
228 INT32_TO_INT16 u
229 INT32_TO_INT16 a
230
231 INIT_XMM sse
232 INT16_TO_INT32 u
233 INT16_TO_INT32 a
234 INT32_TO_INT16 u
235 INT32_TO_INT16 a
236
237 INIT_XMM sse2
238 INT32_TO_FLOAT u
239 INT32_TO_FLOAT a
240 INT16_TO_FLOAT u
241 INT16_TO_FLOAT a
242 FLOAT_TO_INT32 u
243 FLOAT_TO_INT32 a
244 FLOAT_TO_INT16 u
245 FLOAT_TO_INT16 a
246
247 %if HAVE_AVX
248 INIT_YMM avx
249 INT32_TO_FLOAT u
250 INT32_TO_FLOAT a
251 %endif