probetest: fix possible use of uninitialized data
[ffmpeg.git] / libavcodec / x86 / fmtconvert.asm
1 ;******************************************************************************
2 ;* x86 optimized Format Conversion Utils
3 ;* Copyright (c) 2008 Loren Merritt
4 ;*
5 ;* This file is part of FFmpeg.
6 ;*
7 ;* FFmpeg is free software; you can redistribute it and/or
8 ;* modify it under the terms of the GNU Lesser General Public
9 ;* License as published by the Free Software Foundation; either
10 ;* version 2.1 of the License, or (at your option) any later version.
11 ;*
12 ;* FFmpeg is distributed in the hope that it will be useful,
13 ;* but WITHOUT ANY WARRANTY; without even the implied warranty of
14 ;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15 ;* Lesser General Public License for more details.
16 ;*
17 ;* You should have received a copy of the GNU Lesser General Public
18 ;* License along with FFmpeg; if not, write to the Free Software
19 ;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 ;******************************************************************************
21
22 %include "libavutil/x86/x86inc.asm"
23 %include "libavutil/x86/x86util.asm"
24
25 SECTION_TEXT
26
27 ;---------------------------------------------------------------------------------
28 ; void int32_to_float_fmul_scalar(float *dst, const int *src, float mul, int len);
29 ;---------------------------------------------------------------------------------
30 %macro INT32_TO_FLOAT_FMUL_SCALAR 2
31 %if UNIX64
32 cglobal int32_to_float_fmul_scalar_%1, 3,3,%2, dst, src, len
33 %else
34 cglobal int32_to_float_fmul_scalar_%1, 4,4,%2, dst, src, mul, len
35 %endif
36 %if WIN64
37     SWAP 0, 2
38 %elif ARCH_X86_32
39     movss   m0, mulm
40 %endif
41     SPLATD  m0
42     shl     lenq, 2
43     add     srcq, lenq
44     add     dstq, lenq
45     neg     lenq
46 .loop:
47 %ifidn %1, sse2
48     cvtdq2ps  m1, [srcq+lenq   ]
49     cvtdq2ps  m2, [srcq+lenq+16]
50 %else
51     cvtpi2ps  m1, [srcq+lenq   ]
52     cvtpi2ps  m3, [srcq+lenq+ 8]
53     cvtpi2ps  m2, [srcq+lenq+16]
54     cvtpi2ps  m4, [srcq+lenq+24]
55     movlhps   m1, m3
56     movlhps   m2, m4
57 %endif
58     mulps     m1, m0
59     mulps     m2, m0
60     mova  [dstq+lenq   ], m1
61     mova  [dstq+lenq+16], m2
62     add     lenq, 32
63     jl .loop
64     REP_RET
65 %endmacro
66
67 INIT_XMM
68 %define SPLATD SPLATD_SSE
69 %define movdqa movaps
70 INT32_TO_FLOAT_FMUL_SCALAR sse, 5
71 %undef movdqa
72 %define SPLATD SPLATD_SSE2
73 INT32_TO_FLOAT_FMUL_SCALAR sse2, 3
74 %undef SPLATD
75
76
77 ;------------------------------------------------------------------------------
78 ; void ff_float_to_int16(int16_t *dst, const float *src, long len);
79 ;------------------------------------------------------------------------------
80 %macro FLOAT_TO_INT16 2
81 cglobal float_to_int16_%1, 3,3,%2, dst, src, len
82     add       lenq, lenq
83     lea       srcq, [srcq+2*lenq]
84     add       dstq, lenq
85     neg       lenq
86 .loop:
87 %ifidn %1, sse2
88     cvtps2dq    m0, [srcq+2*lenq   ]
89     cvtps2dq    m1, [srcq+2*lenq+16]
90     packssdw    m0, m1
91     mova  [dstq+lenq], m0
92 %else
93     cvtps2pi    m0, [srcq+2*lenq   ]
94     cvtps2pi    m1, [srcq+2*lenq+ 8]
95     cvtps2pi    m2, [srcq+2*lenq+16]
96     cvtps2pi    m3, [srcq+2*lenq+24]
97     packssdw    m0, m1
98     packssdw    m2, m3
99     mova  [dstq+lenq  ], m0
100     mova  [dstq+lenq+8], m2
101 %endif
102     add       lenq, 16
103     js .loop
104 %ifnidn %1, sse2
105     emms
106 %endif
107     REP_RET
108 %endmacro
109
110 INIT_XMM
111 FLOAT_TO_INT16 sse2, 2
112 INIT_MMX
113 FLOAT_TO_INT16 sse, 0
114 %define cvtps2pi pf2id
115 FLOAT_TO_INT16 3dnow, 0
116 %undef cvtps2pi
117
118 ;------------------------------------------------------------------------------
119 ; void ff_float_to_int16_step(int16_t *dst, const float *src, long len, long step);
120 ;------------------------------------------------------------------------------
121 %macro FLOAT_TO_INT16_STEP 2
122 cglobal float_to_int16_step_%1, 4,7,%2, dst, src, len, step, step3, v1, v2
123     add       lenq, lenq
124     lea       srcq, [srcq+2*lenq]
125     lea     step3q, [stepq*3]
126     neg       lenq
127 .loop:
128 %ifidn %1, sse2
129     cvtps2dq    m0, [srcq+2*lenq   ]
130     cvtps2dq    m1, [srcq+2*lenq+16]
131     packssdw    m0, m1
132     movd       v1d, m0
133     psrldq      m0, 4
134     movd       v2d, m0
135     psrldq      m0, 4
136     mov     [dstq], v1w
137     mov  [dstq+stepq*4], v2w
138     shr        v1d, 16
139     shr        v2d, 16
140     mov  [dstq+stepq*2], v1w
141     mov  [dstq+step3q*2], v2w
142     lea       dstq, [dstq+stepq*8]
143     movd       v1d, m0
144     psrldq      m0, 4
145     movd       v2d, m0
146     mov     [dstq], v1w
147     mov  [dstq+stepq*4], v2w
148     shr        v1d, 16
149     shr        v2d, 16
150     mov  [dstq+stepq*2], v1w
151     mov  [dstq+step3q*2], v2w
152     lea       dstq, [dstq+stepq*8]
153 %else
154     cvtps2pi    m0, [srcq+2*lenq   ]
155     cvtps2pi    m1, [srcq+2*lenq+ 8]
156     cvtps2pi    m2, [srcq+2*lenq+16]
157     cvtps2pi    m3, [srcq+2*lenq+24]
158     packssdw    m0, m1
159     packssdw    m2, m3
160     movd       v1d, m0
161     psrlq       m0, 32
162     movd       v2d, m0
163     mov     [dstq], v1w
164     mov  [dstq+stepq*4], v2w
165     shr        v1d, 16
166     shr        v2d, 16
167     mov  [dstq+stepq*2], v1w
168     mov  [dstq+step3q*2], v2w
169     lea       dstq, [dstq+stepq*8]
170     movd       v1d, m2
171     psrlq       m2, 32
172     movd       v2d, m2
173     mov     [dstq], v1w
174     mov  [dstq+stepq*4], v2w
175     shr        v1d, 16
176     shr        v2d, 16
177     mov  [dstq+stepq*2], v1w
178     mov  [dstq+step3q*2], v2w
179     lea       dstq, [dstq+stepq*8]
180 %endif
181     add       lenq, 16
182     js .loop
183 %ifnidn %1, sse2
184     emms
185 %endif
186     REP_RET
187 %endmacro
188
189 INIT_XMM
190 FLOAT_TO_INT16_STEP sse2, 2
191 INIT_MMX
192 FLOAT_TO_INT16_STEP sse, 0
193 %define cvtps2pi pf2id
194 FLOAT_TO_INT16_STEP 3dnow, 0
195 %undef cvtps2pi
196
197 ;-------------------------------------------------------------------------------
198 ; void ff_float_to_int16_interleave2(int16_t *dst, const float **src, long len);
199 ;-------------------------------------------------------------------------------
200 %macro FLOAT_TO_INT16_INTERLEAVE2 1
201 cglobal float_to_int16_interleave2_%1, 3,4,2, dst, src0, src1, len
202     lea      lenq, [4*r2q]
203     mov     src1q, [src0q+gprsize]
204     mov     src0q, [src0q]
205     add      dstq, lenq
206     add     src0q, lenq
207     add     src1q, lenq
208     neg      lenq
209 .loop:
210 %ifidn %1, sse2
211     cvtps2dq   m0, [src0q+lenq]
212     cvtps2dq   m1, [src1q+lenq]
213     packssdw   m0, m1
214     movhlps    m1, m0
215     punpcklwd  m0, m1
216     mova  [dstq+lenq], m0
217 %else
218     cvtps2pi   m0, [src0q+lenq  ]
219     cvtps2pi   m1, [src0q+lenq+8]
220     cvtps2pi   m2, [src1q+lenq  ]
221     cvtps2pi   m3, [src1q+lenq+8]
222     packssdw   m0, m1
223     packssdw   m2, m3
224     mova       m1, m0
225     punpcklwd  m0, m2
226     punpckhwd  m1, m2
227     mova  [dstq+lenq  ], m0
228     mova  [dstq+lenq+8], m1
229 %endif
230     add      lenq, 16
231     js .loop
232 %ifnidn %1, sse2
233     emms
234 %endif
235     REP_RET
236 %endmacro
237
238 INIT_MMX
239 %define cvtps2pi pf2id
240 FLOAT_TO_INT16_INTERLEAVE2 3dnow
241 %undef cvtps2pi
242 %define movdqa movaps
243 FLOAT_TO_INT16_INTERLEAVE2 sse
244 %undef movdqa
245 INIT_XMM
246 FLOAT_TO_INT16_INTERLEAVE2 sse2
247
248
249 %macro PSWAPD_SSE 2
250     pshufw %1, %2, 0x4e
251 %endmacro
252 %macro PSWAPD_3DNOW 2
253     movq  %1, %2
254     psrlq %1, 32
255     punpckldq %1, %2
256 %endmacro
257
258 %macro FLOAT_TO_INT16_INTERLEAVE6 1
259 ; void float_to_int16_interleave6_sse(int16_t *dst, const float **src, int len)
260 cglobal float_to_int16_interleave6_%1, 2,8,0, dst, src, src1, src2, src3, src4, src5, len
261 %if ARCH_X86_64
262     mov     lend, r2d
263 %else
264     %define lend dword r2m
265 %endif
266     mov src1q, [srcq+1*gprsize]
267     mov src2q, [srcq+2*gprsize]
268     mov src3q, [srcq+3*gprsize]
269     mov src4q, [srcq+4*gprsize]
270     mov src5q, [srcq+5*gprsize]
271     mov srcq,  [srcq]
272     sub src1q, srcq
273     sub src2q, srcq
274     sub src3q, srcq
275     sub src4q, srcq
276     sub src5q, srcq
277 .loop:
278     cvtps2pi   mm0, [srcq]
279     cvtps2pi   mm1, [srcq+src1q]
280     cvtps2pi   mm2, [srcq+src2q]
281     cvtps2pi   mm3, [srcq+src3q]
282     cvtps2pi   mm4, [srcq+src4q]
283     cvtps2pi   mm5, [srcq+src5q]
284     packssdw   mm0, mm3
285     packssdw   mm1, mm4
286     packssdw   mm2, mm5
287     pswapd     mm3, mm0
288     punpcklwd  mm0, mm1
289     punpckhwd  mm1, mm2
290     punpcklwd  mm2, mm3
291     pswapd     mm3, mm0
292     punpckldq  mm0, mm2
293     punpckhdq  mm2, mm1
294     punpckldq  mm1, mm3
295     movq [dstq   ], mm0
296     movq [dstq+16], mm2
297     movq [dstq+ 8], mm1
298     add srcq, 8
299     add dstq, 24
300     sub lend, 2
301     jg .loop
302     emms
303     RET
304 %endmacro ; FLOAT_TO_INT16_INTERLEAVE6
305
306 %define pswapd PSWAPD_SSE
307 FLOAT_TO_INT16_INTERLEAVE6 sse
308 %define cvtps2pi pf2id
309 %define pswapd PSWAPD_3DNOW
310 FLOAT_TO_INT16_INTERLEAVE6 3dnow
311 %undef pswapd
312 FLOAT_TO_INT16_INTERLEAVE6 3dnowext
313 %undef cvtps2pi
314
315 ;-----------------------------------------------------------------------------
316 ; void ff_float_interleave6(float *dst, const float **src, unsigned int len);
317 ;-----------------------------------------------------------------------------
318
319 %macro FLOAT_INTERLEAVE6 2
320 cglobal float_interleave6_%1, 2,8,%2, dst, src, src1, src2, src3, src4, src5, len
321 %if ARCH_X86_64
322     mov     lend, r2d
323 %else
324     %define lend dword r2m
325 %endif
326     mov    src1q, [srcq+1*gprsize]
327     mov    src2q, [srcq+2*gprsize]
328     mov    src3q, [srcq+3*gprsize]
329     mov    src4q, [srcq+4*gprsize]
330     mov    src5q, [srcq+5*gprsize]
331     mov     srcq, [srcq]
332     sub    src1q, srcq
333     sub    src2q, srcq
334     sub    src3q, srcq
335     sub    src4q, srcq
336     sub    src5q, srcq
337 .loop:
338 %ifidn %1, sse
339     movaps    m0, [srcq]
340     movaps    m1, [srcq+src1q]
341     movaps    m2, [srcq+src2q]
342     movaps    m3, [srcq+src3q]
343     movaps    m4, [srcq+src4q]
344     movaps    m5, [srcq+src5q]
345
346     SBUTTERFLYPS 0, 1, 6
347     SBUTTERFLYPS 2, 3, 6
348     SBUTTERFLYPS 4, 5, 6
349
350     movaps    m6, m4
351     shufps    m4, m0, 0xe4
352     movlhps   m0, m2
353     movhlps   m6, m2
354     movaps [dstq   ], m0
355     movaps [dstq+16], m4
356     movaps [dstq+32], m6
357
358     movaps    m6, m5
359     shufps    m5, m1, 0xe4
360     movlhps   m1, m3
361     movhlps   m6, m3
362     movaps [dstq+48], m1
363     movaps [dstq+64], m5
364     movaps [dstq+80], m6
365 %else ; mmx
366     movq       m0, [srcq]
367     movq       m1, [srcq+src1q]
368     movq       m2, [srcq+src2q]
369     movq       m3, [srcq+src3q]
370     movq       m4, [srcq+src4q]
371     movq       m5, [srcq+src5q]
372
373     SBUTTERFLY dq, 0, 1, 6
374     SBUTTERFLY dq, 2, 3, 6
375     SBUTTERFLY dq, 4, 5, 6
376     movq [dstq   ], m0
377     movq [dstq+ 8], m2
378     movq [dstq+16], m4
379     movq [dstq+24], m1
380     movq [dstq+32], m3
381     movq [dstq+40], m5
382 %endif
383     add      srcq, mmsize
384     add      dstq, mmsize*6
385     sub      lend, mmsize/4
386     jg .loop
387 %ifidn %1, mmx
388     emms
389 %endif
390     REP_RET
391 %endmacro
392
393 INIT_MMX
394 FLOAT_INTERLEAVE6 mmx, 0
395 INIT_XMM
396 FLOAT_INTERLEAVE6 sse, 7
397
398 ;-----------------------------------------------------------------------------
399 ; void ff_float_interleave2(float *dst, const float **src, unsigned int len);
400 ;-----------------------------------------------------------------------------
401
402 %macro FLOAT_INTERLEAVE2 2
403 cglobal float_interleave2_%1, 3,4,%2, dst, src, len, src1
404     mov     src1q, [srcq+gprsize]
405     mov      srcq, [srcq        ]
406     sub     src1q, srcq
407 .loop:
408     MOVPS      m0, [srcq             ]
409     MOVPS      m1, [srcq+src1q       ]
410     MOVPS      m3, [srcq      +mmsize]
411     MOVPS      m4, [srcq+src1q+mmsize]
412
413     MOVPS      m2, m0
414     PUNPCKLDQ  m0, m1
415     PUNPCKHDQ  m2, m1
416
417     MOVPS      m1, m3
418     PUNPCKLDQ  m3, m4
419     PUNPCKHDQ  m1, m4
420
421     MOVPS [dstq         ], m0
422     MOVPS [dstq+1*mmsize], m2
423     MOVPS [dstq+2*mmsize], m3
424     MOVPS [dstq+3*mmsize], m1
425
426     add      srcq, mmsize*2
427     add      dstq, mmsize*4
428     sub      lend, mmsize/2
429     jg .loop
430 %ifidn %1, mmx
431     emms
432 %endif
433     REP_RET
434 %endmacro
435
436 INIT_MMX
437 %define MOVPS     movq
438 %define PUNPCKLDQ punpckldq
439 %define PUNPCKHDQ punpckhdq
440 FLOAT_INTERLEAVE2 mmx, 0
441 INIT_XMM
442 %define MOVPS     movaps
443 %define PUNPCKLDQ unpcklps
444 %define PUNPCKHDQ unpckhps
445 FLOAT_INTERLEAVE2 sse, 5