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