~ubuntu-branches/ubuntu/vivid/libav/vivid

« back to all changes in this revision

Viewing changes to libavcodec/x86/fmtconvert.asm

  • Committer: Package Import Robot
  • Author(s): Reinhard Tartler
  • Date: 2013-10-22 23:24:08 UTC
  • mfrom: (1.3.36 sid)
  • Revision ID: package-import@ubuntu.com-20131022232408-b8tvvn4pyzri9mi3
Tags: 6:9.10-1ubuntu1
* Build all -extra flavors from this source package, as libav got demoted
  from main to universe, cf LP: #1243235
* Simplify debian/rules to follow exactly the code that debian executes
* New upstream (LP: #1180288) fixes lots of security issues (LP: #1242802)
* Merge from unstable, remaining changes:
  - build-depend on libtiff5-dev rather than libtiff4-dev,
    avoids FTBFS caused by imlib
  - follow the regular debian codepaths

Show diffs side-by-side

added added

removed removed

Lines of Context:
19
19
;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20
20
;******************************************************************************
21
21
 
22
 
%include "x86inc.asm"
23
 
%include "x86util.asm"
 
22
%include "libavutil/x86/x86util.asm"
24
23
 
25
24
SECTION_TEXT
26
25
 
 
26
%macro CVTPS2PI 2
 
27
%if cpuflag(sse)
 
28
    cvtps2pi %1, %2
 
29
%elif cpuflag(3dnow)
 
30
    pf2id %1, %2
 
31
%endif
 
32
%endmacro
 
33
 
27
34
;---------------------------------------------------------------------------------
28
35
; void int32_to_float_fmul_scalar(float *dst, const int *src, float mul, int len);
29
36
;---------------------------------------------------------------------------------
30
 
%macro INT32_TO_FLOAT_FMUL_SCALAR 2
31
 
%ifdef UNIX64
32
 
cglobal int32_to_float_fmul_scalar_%1, 3,3,%2, dst, src, len
 
37
%macro INT32_TO_FLOAT_FMUL_SCALAR 1
 
38
%if UNIX64
 
39
cglobal int32_to_float_fmul_scalar, 3, 3, %1, dst, src, len
33
40
%else
34
 
cglobal int32_to_float_fmul_scalar_%1, 4,4,%2, dst, src, mul, len
 
41
cglobal int32_to_float_fmul_scalar, 4, 4, %1, dst, src, mul, len
35
42
%endif
36
 
%ifdef WIN64
 
43
%if WIN64
37
44
    SWAP 0, 2
38
 
%elifdef ARCH_X86_32
 
45
%elif ARCH_X86_32
39
46
    movss   m0, mulm
40
47
%endif
41
48
    SPLATD  m0
44
51
    add     dstq, lenq
45
52
    neg     lenq
46
53
.loop:
47
 
%ifidn %1, sse2
 
54
%if cpuflag(sse2)
48
55
    cvtdq2ps  m1, [srcq+lenq   ]
49
56
    cvtdq2ps  m2, [srcq+lenq+16]
50
57
%else
64
71
    REP_RET
65
72
%endmacro
66
73
 
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
 
74
INIT_XMM sse
 
75
INT32_TO_FLOAT_FMUL_SCALAR 5
 
76
INIT_XMM sse2
 
77
INT32_TO_FLOAT_FMUL_SCALAR 3
75
78
 
76
79
 
77
80
;------------------------------------------------------------------------------
78
81
; void ff_float_to_int16(int16_t *dst, const float *src, long len);
79
82
;------------------------------------------------------------------------------
80
 
%macro FLOAT_TO_INT16 2
81
 
cglobal float_to_int16_%1, 3,3,%2, dst, src, len
 
83
%macro FLOAT_TO_INT16 1
 
84
cglobal float_to_int16, 3, 3, %1, dst, src, len
82
85
    add       lenq, lenq
83
86
    lea       srcq, [srcq+2*lenq]
84
87
    add       dstq, lenq
85
88
    neg       lenq
86
89
.loop:
87
 
%ifidn %1, sse2
 
90
%if cpuflag(sse2)
88
91
    cvtps2dq    m0, [srcq+2*lenq   ]
89
92
    cvtps2dq    m1, [srcq+2*lenq+16]
90
93
    packssdw    m0, m1
91
94
    mova  [dstq+lenq], m0
92
95
%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]
 
96
    CVTPS2PI    m0, [srcq+2*lenq   ]
 
97
    CVTPS2PI    m1, [srcq+2*lenq+ 8]
 
98
    CVTPS2PI    m2, [srcq+2*lenq+16]
 
99
    CVTPS2PI    m3, [srcq+2*lenq+24]
97
100
    packssdw    m0, m1
98
101
    packssdw    m2, m3
99
102
    mova  [dstq+lenq  ], m0
101
104
%endif
102
105
    add       lenq, 16
103
106
    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
 
 
 
107
%if mmsize == 8
 
108
    emms
 
109
%endif
 
110
    REP_RET
 
111
%endmacro
 
112
 
 
113
INIT_XMM sse2
 
114
FLOAT_TO_INT16 2
 
115
INIT_MMX sse
 
116
FLOAT_TO_INT16 0
 
117
INIT_MMX 3dnow
 
118
FLOAT_TO_INT16 0
 
119
 
 
120
;------------------------------------------------------------------------------
 
121
; void ff_float_to_int16_step(int16_t *dst, const float *src, long len, long step);
 
122
;------------------------------------------------------------------------------
 
123
%macro FLOAT_TO_INT16_STEP 1
 
124
cglobal float_to_int16_step, 4, 7, %1, dst, src, len, step, step3, v1, v2
 
125
    add       lenq, lenq
 
126
    lea       srcq, [srcq+2*lenq]
 
127
    lea     step3q, [stepq*3]
 
128
    neg       lenq
 
129
.loop:
 
130
%if cpuflag(sse2)
 
131
    cvtps2dq    m0, [srcq+2*lenq   ]
 
132
    cvtps2dq    m1, [srcq+2*lenq+16]
 
133
    packssdw    m0, m1
 
134
    movd       v1d, m0
 
135
    psrldq      m0, 4
 
136
    movd       v2d, m0
 
137
    psrldq      m0, 4
 
138
    mov     [dstq], v1w
 
139
    mov  [dstq+stepq*4], v2w
 
140
    shr        v1d, 16
 
141
    shr        v2d, 16
 
142
    mov  [dstq+stepq*2], v1w
 
143
    mov  [dstq+step3q*2], v2w
 
144
    lea       dstq, [dstq+stepq*8]
 
145
    movd       v1d, m0
 
146
    psrldq      m0, 4
 
147
    movd       v2d, m0
 
148
    mov     [dstq], v1w
 
149
    mov  [dstq+stepq*4], v2w
 
150
    shr        v1d, 16
 
151
    shr        v2d, 16
 
152
    mov  [dstq+stepq*2], v1w
 
153
    mov  [dstq+step3q*2], v2w
 
154
    lea       dstq, [dstq+stepq*8]
 
155
%else
 
156
    CVTPS2PI    m0, [srcq+2*lenq   ]
 
157
    CVTPS2PI    m1, [srcq+2*lenq+ 8]
 
158
    CVTPS2PI    m2, [srcq+2*lenq+16]
 
159
    CVTPS2PI    m3, [srcq+2*lenq+24]
 
160
    packssdw    m0, m1
 
161
    packssdw    m2, m3
 
162
    movd       v1d, m0
 
163
    psrlq       m0, 32
 
164
    movd       v2d, m0
 
165
    mov     [dstq], v1w
 
166
    mov  [dstq+stepq*4], v2w
 
167
    shr        v1d, 16
 
168
    shr        v2d, 16
 
169
    mov  [dstq+stepq*2], v1w
 
170
    mov  [dstq+step3q*2], v2w
 
171
    lea       dstq, [dstq+stepq*8]
 
172
    movd       v1d, m2
 
173
    psrlq       m2, 32
 
174
    movd       v2d, m2
 
175
    mov     [dstq], v1w
 
176
    mov  [dstq+stepq*4], v2w
 
177
    shr        v1d, 16
 
178
    shr        v2d, 16
 
179
    mov  [dstq+stepq*2], v1w
 
180
    mov  [dstq+step3q*2], v2w
 
181
    lea       dstq, [dstq+stepq*8]
 
182
%endif
 
183
    add       lenq, 16
 
184
    js .loop
 
185
%if mmsize == 8
 
186
    emms
 
187
%endif
 
188
    REP_RET
 
189
%endmacro
 
190
 
 
191
INIT_XMM sse2
 
192
FLOAT_TO_INT16_STEP 2
 
193
INIT_MMX sse
 
194
FLOAT_TO_INT16_STEP 0
 
195
INIT_MMX 3dnow
 
196
FLOAT_TO_INT16_STEP 0
118
197
 
119
198
;-------------------------------------------------------------------------------
120
199
; void ff_float_to_int16_interleave2(int16_t *dst, const float **src, long len);
121
200
;-------------------------------------------------------------------------------
122
 
%macro FLOAT_TO_INT16_INTERLEAVE2 1
123
 
cglobal float_to_int16_interleave2_%1, 3,4,2, dst, src0, src1, len
 
201
%macro FLOAT_TO_INT16_INTERLEAVE2 0
 
202
cglobal float_to_int16_interleave2, 3, 4, 2, dst, src0, src1, len
124
203
    lea      lenq, [4*r2q]
125
204
    mov     src1q, [src0q+gprsize]
126
205
    mov     src0q, [src0q]
129
208
    add     src1q, lenq
130
209
    neg      lenq
131
210
.loop:
132
 
%ifidn %1, sse2
 
211
%if cpuflag(sse2)
133
212
    cvtps2dq   m0, [src0q+lenq]
134
213
    cvtps2dq   m1, [src1q+lenq]
135
214
    packssdw   m0, m1
137
216
    punpcklwd  m0, m1
138
217
    mova  [dstq+lenq], m0
139
218
%else
140
 
    cvtps2pi   m0, [src0q+lenq  ]
141
 
    cvtps2pi   m1, [src0q+lenq+8]
142
 
    cvtps2pi   m2, [src1q+lenq  ]
143
 
    cvtps2pi   m3, [src1q+lenq+8]
 
219
    CVTPS2PI   m0, [src0q+lenq  ]
 
220
    CVTPS2PI   m1, [src0q+lenq+8]
 
221
    CVTPS2PI   m2, [src1q+lenq  ]
 
222
    CVTPS2PI   m3, [src1q+lenq+8]
144
223
    packssdw   m0, m1
145
224
    packssdw   m2, m3
146
225
    mova       m1, m0
151
230
%endif
152
231
    add      lenq, 16
153
232
    js .loop
154
 
%ifnidn %1, sse2
 
233
%if mmsize == 8
155
234
    emms
156
235
%endif
157
236
    REP_RET
158
237
%endmacro
159
238
 
160
 
INIT_MMX
161
 
%define cvtps2pi pf2id
162
 
FLOAT_TO_INT16_INTERLEAVE2 3dnow
163
 
%undef cvtps2pi
164
 
%define movdqa movaps
165
 
FLOAT_TO_INT16_INTERLEAVE2 sse
166
 
%undef movdqa
167
 
INIT_XMM
168
 
FLOAT_TO_INT16_INTERLEAVE2 sse2
169
 
 
170
 
 
171
 
%macro PSWAPD_SSE 2
172
 
    pshufw %1, %2, 0x4e
173
 
%endmacro
174
 
%macro PSWAPD_3DN1 2
175
 
    movq  %1, %2
176
 
    psrlq %1, 32
177
 
    punpckldq %1, %2
178
 
%endmacro
179
 
 
180
 
%macro FLOAT_TO_INT16_INTERLEAVE6 1
 
239
INIT_MMX 3dnow
 
240
FLOAT_TO_INT16_INTERLEAVE2
 
241
INIT_MMX sse
 
242
FLOAT_TO_INT16_INTERLEAVE2
 
243
INIT_XMM sse2
 
244
FLOAT_TO_INT16_INTERLEAVE2
 
245
 
 
246
%macro FLOAT_TO_INT16_INTERLEAVE6 0
181
247
; void float_to_int16_interleave6_sse(int16_t *dst, const float **src, int len)
182
 
cglobal float_to_int16_interleave6_%1, 2,7,0, dst, src, src1, src2, src3, src4, src5
183
 
%ifdef ARCH_X86_64
184
 
    %define lend r10d
 
248
cglobal float_to_int16_interleave6, 2, 8, 0, dst, src, src1, src2, src3, src4, src5, len
 
249
%if ARCH_X86_64
185
250
    mov     lend, r2d
186
251
%else
187
252
    %define lend dword r2m
198
263
    sub src4q, srcq
199
264
    sub src5q, srcq
200
265
.loop:
201
 
    cvtps2pi   mm0, [srcq]
202
 
    cvtps2pi   mm1, [srcq+src1q]
203
 
    cvtps2pi   mm2, [srcq+src2q]
204
 
    cvtps2pi   mm3, [srcq+src3q]
205
 
    cvtps2pi   mm4, [srcq+src4q]
206
 
    cvtps2pi   mm5, [srcq+src5q]
 
266
    CVTPS2PI   mm0, [srcq]
 
267
    CVTPS2PI   mm1, [srcq+src1q]
 
268
    CVTPS2PI   mm2, [srcq+src2q]
 
269
    CVTPS2PI   mm3, [srcq+src3q]
 
270
    CVTPS2PI   mm4, [srcq+src4q]
 
271
    CVTPS2PI   mm5, [srcq+src5q]
207
272
    packssdw   mm0, mm3
208
273
    packssdw   mm1, mm4
209
274
    packssdw   mm2, mm5
210
 
    pswapd     mm3, mm0
 
275
    PSWAPD     mm3, mm0
211
276
    punpcklwd  mm0, mm1
212
277
    punpckhwd  mm1, mm2
213
278
    punpcklwd  mm2, mm3
214
 
    pswapd     mm3, mm0
 
279
    PSWAPD     mm3, mm0
215
280
    punpckldq  mm0, mm2
216
281
    punpckhdq  mm2, mm1
217
282
    punpckldq  mm1, mm3
226
291
    RET
227
292
%endmacro ; FLOAT_TO_INT16_INTERLEAVE6
228
293
 
229
 
%define pswapd PSWAPD_SSE
230
 
FLOAT_TO_INT16_INTERLEAVE6 sse
231
 
%define cvtps2pi pf2id
232
 
%define pswapd PSWAPD_3DN1
233
 
FLOAT_TO_INT16_INTERLEAVE6 3dnow
234
 
%undef pswapd
235
 
FLOAT_TO_INT16_INTERLEAVE6 3dn2
236
 
%undef cvtps2pi
 
294
INIT_MMX sse
 
295
FLOAT_TO_INT16_INTERLEAVE6
 
296
INIT_MMX 3dnow
 
297
FLOAT_TO_INT16_INTERLEAVE6
 
298
INIT_MMX 3dnowext
 
299
FLOAT_TO_INT16_INTERLEAVE6
237
300
 
238
301
;-----------------------------------------------------------------------------
239
302
; void ff_float_interleave6(float *dst, const float **src, unsigned int len);
240
303
;-----------------------------------------------------------------------------
241
304
 
242
 
%macro FLOAT_INTERLEAVE6 2
243
 
cglobal float_interleave6_%1, 2,7,%2, dst, src, src1, src2, src3, src4, src5
244
 
%ifdef ARCH_X86_64
245
 
    %define lend r10d
 
305
%macro FLOAT_INTERLEAVE6 1
 
306
cglobal float_interleave6, 2, 8, %1, dst, src, src1, src2, src3, src4, src5, len
 
307
%if ARCH_X86_64
246
308
    mov     lend, r2d
247
309
%else
248
310
    %define lend dword r2m
259
321
    sub    src4q, srcq
260
322
    sub    src5q, srcq
261
323
.loop:
262
 
%ifidn %1, sse
 
324
%if cpuflag(sse)
263
325
    movaps    m0, [srcq]
264
326
    movaps    m1, [srcq+src1q]
265
327
    movaps    m2, [srcq+src2q]
308
370
    add      dstq, mmsize*6
309
371
    sub      lend, mmsize/4
310
372
    jg .loop
311
 
%ifidn %1, mmx
 
373
%if mmsize == 8
312
374
    emms
313
375
%endif
314
376
    REP_RET
315
377
%endmacro
316
378
 
317
 
INIT_MMX
318
 
FLOAT_INTERLEAVE6 mmx, 0
319
 
INIT_XMM
320
 
FLOAT_INTERLEAVE6 sse, 7
 
379
INIT_MMX mmx
 
380
FLOAT_INTERLEAVE6 0
 
381
INIT_XMM sse
 
382
FLOAT_INTERLEAVE6 7
321
383
 
322
384
;-----------------------------------------------------------------------------
323
385
; void ff_float_interleave2(float *dst, const float **src, unsigned int len);
324
386
;-----------------------------------------------------------------------------
325
387
 
326
 
%macro FLOAT_INTERLEAVE2 2
327
 
cglobal float_interleave2_%1, 3,4,%2, dst, src, len, src1
 
388
%macro FLOAT_INTERLEAVE2 1
 
389
cglobal float_interleave2, 3, 4, %1, dst, src, len, src1
328
390
    mov     src1q, [srcq+gprsize]
329
391
    mov      srcq, [srcq        ]
330
392
    sub     src1q, srcq
331
 
.loop
332
 
    MOVPS      m0, [srcq             ]
333
 
    MOVPS      m1, [srcq+src1q       ]
334
 
    MOVPS      m3, [srcq      +mmsize]
335
 
    MOVPS      m4, [srcq+src1q+mmsize]
 
393
.loop:
 
394
    mova       m0, [srcq             ]
 
395
    mova       m1, [srcq+src1q       ]
 
396
    mova       m3, [srcq      +mmsize]
 
397
    mova       m4, [srcq+src1q+mmsize]
336
398
 
337
 
    MOVPS      m2, m0
 
399
    mova       m2, m0
338
400
    PUNPCKLDQ  m0, m1
339
401
    PUNPCKHDQ  m2, m1
340
402
 
341
 
    MOVPS      m1, m3
 
403
    mova       m1, m3
342
404
    PUNPCKLDQ  m3, m4
343
405
    PUNPCKHDQ  m1, m4
344
406
 
345
 
    MOVPS [dstq         ], m0
346
 
    MOVPS [dstq+1*mmsize], m2
347
 
    MOVPS [dstq+2*mmsize], m3
348
 
    MOVPS [dstq+3*mmsize], m1
 
407
    mova  [dstq         ], m0
 
408
    mova  [dstq+1*mmsize], m2
 
409
    mova  [dstq+2*mmsize], m3
 
410
    mova  [dstq+3*mmsize], m1
349
411
 
350
412
    add      srcq, mmsize*2
351
413
    add      dstq, mmsize*4
352
414
    sub      lend, mmsize/2
353
415
    jg .loop
354
 
%ifidn %1, mmx
 
416
%if mmsize == 8
355
417
    emms
356
418
%endif
357
419
    REP_RET
358
420
%endmacro
359
421
 
360
 
INIT_MMX
361
 
%define MOVPS     movq
 
422
INIT_MMX mmx
362
423
%define PUNPCKLDQ punpckldq
363
424
%define PUNPCKHDQ punpckhdq
364
 
FLOAT_INTERLEAVE2 mmx, 0
365
 
INIT_XMM
366
 
%define MOVPS     movaps
 
425
FLOAT_INTERLEAVE2 0
 
426
INIT_XMM sse
367
427
%define PUNPCKLDQ unpcklps
368
428
%define PUNPCKHDQ unpckhps
369
 
FLOAT_INTERLEAVE2 sse, 5
 
429
FLOAT_INTERLEAVE2 5