Statistics
| Branch: | Revision:

ffmpeg / libavcodec / x86 / x86util.asm @ 888fa31e

History | View | Annotate | Download (9.58 KB)

1
;*****************************************************************************
2
;* x86util.asm
3
;*****************************************************************************
4
;* Copyright (C) 2008-2010 x264 project
5
;*
6
;* Authors: Loren Merritt <lorenm@u.washington.edu>
7
;*          Holger Lubitz <holger@lubitz.org>
8
;*
9
;* This file is part of Libav.
10
;*
11
;* Libav is free software; you can redistribute it and/or
12
;* modify it under the terms of the GNU Lesser General Public
13
;* License as published by the Free Software Foundation; either
14
;* version 2.1 of the License, or (at your option) any later version.
15
;*
16
;* Libav is distributed in the hope that it will be useful,
17
;* but WITHOUT ANY WARRANTY; without even the implied warranty of
18
;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19
;* Lesser General Public License for more details.
20
;*
21
;* You should have received a copy of the GNU Lesser General Public
22
;* License along with Libav; if not, write to the Free Software
23
;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24
;******************************************************************************
25

    
26
%macro SBUTTERFLY 4
27
%if avx_enabled == 0
28
    mova      m%4, m%2
29
    punpckl%1 m%2, m%3
30
    punpckh%1 m%4, m%3
31
%else
32
    punpckh%1 m%4, m%2, m%3
33
    punpckl%1 m%2, m%3
34
%endif
35
    SWAP %3, %4
36
%endmacro
37

    
38
%macro SBUTTERFLY2 4
39
    punpckl%1 m%4, m%2, m%3
40
    punpckh%1 m%2, m%2, m%3
41
    SWAP %2, %4, %3
42
%endmacro
43

    
44
%macro TRANSPOSE4x4B 5
45
    SBUTTERFLY bw, %1, %2, %5
46
    SBUTTERFLY bw, %3, %4, %5
47
    SBUTTERFLY wd, %1, %3, %5
48
    SBUTTERFLY wd, %2, %4, %5
49
    SWAP %2, %3
50
%endmacro
51

    
52
%macro TRANSPOSE4x4W 5
53
    SBUTTERFLY wd, %1, %2, %5
54
    SBUTTERFLY wd, %3, %4, %5
55
    SBUTTERFLY dq, %1, %3, %5
56
    SBUTTERFLY dq, %2, %4, %5
57
    SWAP %2, %3
58
%endmacro
59

    
60
%macro TRANSPOSE2x4x4W 5
61
    SBUTTERFLY wd,  %1, %2, %5
62
    SBUTTERFLY wd,  %3, %4, %5
63
    SBUTTERFLY dq,  %1, %3, %5
64
    SBUTTERFLY dq,  %2, %4, %5
65
    SBUTTERFLY qdq, %1, %2, %5
66
    SBUTTERFLY qdq, %3, %4, %5
67
%endmacro
68

    
69
%macro TRANSPOSE4x4D 5
70
    SBUTTERFLY dq,  %1, %2, %5
71
    SBUTTERFLY dq,  %3, %4, %5
72
    SBUTTERFLY qdq, %1, %3, %5
73
    SBUTTERFLY qdq, %2, %4, %5
74
    SWAP %2, %3
75
%endmacro
76

    
77
%macro TRANSPOSE8x8W 9-11
78
%ifdef ARCH_X86_64
79
    SBUTTERFLY wd,  %1, %2, %9
80
    SBUTTERFLY wd,  %3, %4, %9
81
    SBUTTERFLY wd,  %5, %6, %9
82
    SBUTTERFLY wd,  %7, %8, %9
83
    SBUTTERFLY dq,  %1, %3, %9
84
    SBUTTERFLY dq,  %2, %4, %9
85
    SBUTTERFLY dq,  %5, %7, %9
86
    SBUTTERFLY dq,  %6, %8, %9
87
    SBUTTERFLY qdq, %1, %5, %9
88
    SBUTTERFLY qdq, %2, %6, %9
89
    SBUTTERFLY qdq, %3, %7, %9
90
    SBUTTERFLY qdq, %4, %8, %9
91
    SWAP %2, %5
92
    SWAP %4, %7
93
%else
94
; in:  m0..m7, unless %11 in which case m6 is in %9
95
; out: m0..m7, unless %11 in which case m4 is in %10
96
; spills into %9 and %10
97
%if %0<11
98
    movdqa %9, m%7
99
%endif
100
    SBUTTERFLY wd,  %1, %2, %7
101
    movdqa %10, m%2
102
    movdqa m%7, %9
103
    SBUTTERFLY wd,  %3, %4, %2
104
    SBUTTERFLY wd,  %5, %6, %2
105
    SBUTTERFLY wd,  %7, %8, %2
106
    SBUTTERFLY dq,  %1, %3, %2
107
    movdqa %9, m%3
108
    movdqa m%2, %10
109
    SBUTTERFLY dq,  %2, %4, %3
110
    SBUTTERFLY dq,  %5, %7, %3
111
    SBUTTERFLY dq,  %6, %8, %3
112
    SBUTTERFLY qdq, %1, %5, %3
113
    SBUTTERFLY qdq, %2, %6, %3
114
    movdqa %10, m%2
115
    movdqa m%3, %9
116
    SBUTTERFLY qdq, %3, %7, %2
117
    SBUTTERFLY qdq, %4, %8, %2
118
    SWAP %2, %5
119
    SWAP %4, %7
120
%if %0<11
121
    movdqa m%5, %10
122
%endif
123
%endif
124
%endmacro
125

    
126
; PABSW macros assume %1 != %2, while ABS1/2 macros work in-place
127
%macro PABSW_MMX 2
128
    pxor       %1, %1
129
    pcmpgtw    %1, %2
130
    pxor       %2, %1
131
    psubw      %2, %1
132
    SWAP       %1, %2
133
%endmacro
134

    
135
%macro PSIGNW_MMX 2
136
    pxor       %1, %2
137
    psubw      %1, %2
138
%endmacro
139

    
140
%macro PABSW_MMX2 2
141
    pxor    %1, %1
142
    psubw   %1, %2
143
    pmaxsw  %1, %2
144
%endmacro
145

    
146
%macro PABSW_SSSE3 2
147
    pabsw      %1, %2
148
%endmacro
149

    
150
%macro PSIGNW_SSSE3 2
151
    psignw     %1, %2
152
%endmacro
153

    
154
%macro ABS1_MMX 2    ; a, tmp
155
    pxor       %2, %2
156
    pcmpgtw    %2, %1
157
    pxor       %1, %2
158
    psubw      %1, %2
159
%endmacro
160

    
161
%macro ABS2_MMX 4    ; a, b, tmp0, tmp1
162
    pxor       %3, %3
163
    pxor       %4, %4
164
    pcmpgtw    %3, %1
165
    pcmpgtw    %4, %2
166
    pxor       %1, %3
167
    pxor       %2, %4
168
    psubw      %1, %3
169
    psubw      %2, %4
170
%endmacro
171

    
172
%macro ABS1_MMX2 2   ; a, tmp
173
    pxor    %2, %2
174
    psubw   %2, %1
175
    pmaxsw  %1, %2
176
%endmacro
177

    
178
%macro ABS2_MMX2 4   ; a, b, tmp0, tmp1
179
    pxor    %3, %3
180
    pxor    %4, %4
181
    psubw   %3, %1
182
    psubw   %4, %2
183
    pmaxsw  %1, %3
184
    pmaxsw  %2, %4
185
%endmacro
186

    
187
%macro ABS1_SSSE3 2
188
    pabsw   %1, %1
189
%endmacro
190

    
191
%macro ABS2_SSSE3 4
192
    pabsw   %1, %1
193
    pabsw   %2, %2
194
%endmacro
195

    
196
%macro ABSB_MMX 2
197
    pxor    %2, %2
198
    psubb   %2, %1
199
    pminub  %1, %2
200
%endmacro
201

    
202
%macro ABSB2_MMX 4
203
    pxor    %3, %3
204
    pxor    %4, %4
205
    psubb   %3, %1
206
    psubb   %4, %2
207
    pminub  %1, %3
208
    pminub  %2, %4
209
%endmacro
210

    
211
%macro ABSB_SSSE3 2
212
    pabsb   %1, %1
213
%endmacro
214

    
215
%macro ABSB2_SSSE3 4
216
    pabsb   %1, %1
217
    pabsb   %2, %2
218
%endmacro
219

    
220
%macro ABS4 6
221
    ABS2 %1, %2, %5, %6
222
    ABS2 %3, %4, %5, %6
223
%endmacro
224

    
225
%define ABS1 ABS1_MMX
226
%define ABS2 ABS2_MMX
227
%define ABSB ABSB_MMX
228
%define ABSB2 ABSB2_MMX
229

    
230
%macro SPLATB_MMX 3
231
    movd      %1, [%2-3] ;to avoid crossing a cacheline
232
    punpcklbw %1, %1
233
%if mmsize==16
234
    pshuflw   %1, %1, 0xff
235
    punpcklqdq %1, %1
236
%else
237
    pshufw    %1, %1, 0xff
238
%endif
239
%endmacro
240

    
241
%macro SPLATB_SSSE3 3
242
    movd      %1, [%2-3]
243
    pshufb    %1, %3
244
%endmacro
245

    
246
%macro PALIGNR_MMX 4
247
    %ifnidn %4, %2
248
    mova    %4, %2
249
    %endif
250
    %if mmsize == 8
251
    psllq   %1, (8-%3)*8
252
    psrlq   %4, %3*8
253
    %else
254
    pslldq  %1, 16-%3
255
    psrldq  %4, %3
256
    %endif
257
    por     %1, %4
258
%endmacro
259

    
260
%macro PALIGNR_SSSE3 4
261
    palignr %1, %2, %3
262
%endmacro
263

    
264
%macro DEINTB 5 ; mask, reg1, mask, reg2, optional src to fill masks from
265
%ifnum %5
266
    mova   m%1, m%5
267
    mova   m%3, m%5
268
%else
269
    mova   m%1, %5
270
    mova   m%3, m%1
271
%endif
272
    pand   m%1, m%2 ; dst .. y6 .. y4
273
    pand   m%3, m%4 ; src .. y6 .. y4
274
    psrlw  m%2, 8   ; dst .. y7 .. y5
275
    psrlw  m%4, 8   ; src .. y7 .. y5
276
%endmacro
277

    
278
%macro SUMSUB_BA 2-3
279
%if %0==2
280
    paddw   %1, %2
281
    paddw   %2, %2
282
    psubw   %2, %1
283
%else
284
    mova    %3, %1
285
    paddw   %1, %2
286
    psubw   %2, %3
287
%endif
288
%endmacro
289

    
290
%macro SUMSUB_BADC 4-5
291
%if %0==5
292
    SUMSUB_BA %1, %2, %5
293
    SUMSUB_BA %3, %4, %5
294
%else
295
    paddw   %1, %2
296
    paddw   %3, %4
297
    paddw   %2, %2
298
    paddw   %4, %4
299
    psubw   %2, %1
300
    psubw   %4, %3
301
%endif
302
%endmacro
303

    
304
%macro SUMSUB2_AB 3
305
    mova    %3, %1
306
    paddw   %1, %1
307
    paddw   %1, %2
308
    psubw   %3, %2
309
    psubw   %3, %2
310
%endmacro
311

    
312
%macro SUMSUB2_BA 3
313
    mova    m%3, m%1
314
    paddw   m%1, m%2
315
    paddw   m%1, m%2
316
    psubw   m%2, m%3
317
    psubw   m%2, m%3
318
%endmacro
319

    
320
%macro SUMSUBD2_AB 4
321
    mova    %4, %1
322
    mova    %3, %2
323
    psraw   %2, 1  ; %2: %2>>1
324
    psraw   %1, 1  ; %1: %1>>1
325
    paddw   %2, %4 ; %2: %2>>1+%1
326
    psubw   %1, %3 ; %1: %1>>1-%2
327
%endmacro
328

    
329
%macro DCT4_1D 5
330
%ifnum %5
331
    SUMSUB_BADC m%4, m%1, m%3, m%2; m%5
332
    SUMSUB_BA   m%3, m%4, m%5
333
    SUMSUB2_AB  m%1, m%2, m%5
334
    SWAP %1, %3, %4, %5, %2
335
%else
336
    SUMSUB_BADC m%4, m%1, m%3, m%2
337
    SUMSUB_BA   m%3, m%4
338
    mova       [%5], m%2
339
    SUMSUB2_AB m%1, [%5], m%2
340
    SWAP %1, %3, %4, %2
341
%endif
342
%endmacro
343

    
344
%macro IDCT4_1D 5-6
345
%ifnum %5
346
    SUMSUBD2_AB m%2, m%4, m%6, m%5
347
    ; %2: %2>>1-%4 %4: %2+%4>>1
348
    SUMSUB_BA   m%3, m%1, m%6
349
    ; %3: %1+%3 %1: %1-%3
350
    SUMSUB_BADC m%4, m%3, m%2, m%1, m%6
351
    ; %4: %1+%3 + (%2+%4>>1)
352
    ; %3: %1+%3 - (%2+%4>>1)
353
    ; %2: %1-%3 + (%2>>1-%4)
354
    ; %1: %1-%3 - (%2>>1-%4)
355
%else
356
    SUMSUBD2_AB m%2, m%4, [%5], [%5+16]
357
    SUMSUB_BA   m%3, m%1
358
    SUMSUB_BADC m%4, m%3, m%2, m%1
359
%endif
360
    SWAP %1, %4, %3
361
    ; %1: %1+%3 + (%2+%4>>1) row0
362
    ; %2: %1-%3 + (%2>>1-%4) row1
363
    ; %3: %1-%3 - (%2>>1-%4) row2
364
    ; %4: %1+%3 - (%2+%4>>1) row3
365
%endmacro
366

    
367

    
368
%macro LOAD_DIFF 5
369
%ifidn %3, none
370
    movh       %1, %4
371
    movh       %2, %5
372
    punpcklbw  %1, %2
373
    punpcklbw  %2, %2
374
    psubw      %1, %2
375
%else
376
    movh       %1, %4
377
    punpcklbw  %1, %3
378
    movh       %2, %5
379
    punpcklbw  %2, %3
380
    psubw      %1, %2
381
%endif
382
%endmacro
383

    
384
%macro STORE_DCT 6
385
    movq   [%5+%6+ 0], m%1
386
    movq   [%5+%6+ 8], m%2
387
    movq   [%5+%6+16], m%3
388
    movq   [%5+%6+24], m%4
389
    movhps [%5+%6+32], m%1
390
    movhps [%5+%6+40], m%2
391
    movhps [%5+%6+48], m%3
392
    movhps [%5+%6+56], m%4
393
%endmacro
394

    
395
%macro LOAD_DIFF_8x4P 7-10 r0,r2,0 ; 4x dest, 2x temp, 2x pointer, increment?
396
    LOAD_DIFF m%1, m%5, m%7, [%8],      [%9]
397
    LOAD_DIFF m%2, m%6, m%7, [%8+r1],   [%9+r3]
398
    LOAD_DIFF m%3, m%5, m%7, [%8+2*r1], [%9+2*r3]
399
    LOAD_DIFF m%4, m%6, m%7, [%8+r4],   [%9+r5]
400
%if %10
401
    lea %8, [%8+4*r1]
402
    lea %9, [%9+4*r3]
403
%endif
404
%endmacro
405

    
406
%macro DIFFx2 6-7
407
    movh       %3, %5
408
    punpcklbw  %3, %4
409
    psraw      %1, 6
410
    paddsw     %1, %3
411
    movh       %3, %6
412
    punpcklbw  %3, %4
413
    psraw      %2, 6
414
    paddsw     %2, %3
415
    packuswb   %2, %1
416
%endmacro
417

    
418
%macro STORE_DIFF 4
419
    movh       %2, %4
420
    punpcklbw  %2, %3
421
    psraw      %1, 6
422
    paddsw     %1, %2
423
    packuswb   %1, %1
424
    movh       %4, %1
425
%endmacro
426

    
427
%macro STORE_DIFFx2 8 ; add1, add2, reg1, reg2, zero, shift, source, stride
428
    movh       %3, [%7]
429
    movh       %4, [%7+%8]
430
    punpcklbw  %3, %5
431
    punpcklbw  %4, %5
432
    psraw      %1, %6
433
    psraw      %2, %6
434
    paddw      %3, %1
435
    paddw      %4, %2
436
    packuswb   %3, %5
437
    packuswb   %4, %5
438
    movh     [%7], %3
439
    movh  [%7+%8], %4
440
%endmacro
441

    
442
%macro PMINUB_MMX 3 ; dst, src, tmp
443
    mova     %3, %1
444
    psubusb  %3, %2
445
    psubb    %1, %3
446
%endmacro
447

    
448
%macro PMINUB_MMXEXT 3 ; dst, src, ignored
449
    pminub   %1, %2
450
%endmacro
451

    
452
%macro SPLATW 2-3 0
453
%if mmsize == 16
454
    pshuflw    %1, %2, (%3)*0x55
455
    punpcklqdq %1, %1
456
%else
457
    pshufw     %1, %2, (%3)*0x55
458
%endif
459
%endmacro
460

    
461
%macro CLIPW 3 ;(dst, min, max)
462
    pmaxsw %1, %2
463
    pminsw %1, %3
464
%endmacro