Statistics
| Branch: | Revision:

ffmpeg / libavcodec / x86 / x86util.asm @ 2912e87a

History | View | Annotate | Download (9.29 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
;* 51, Inc., Foundation Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24
;******************************************************************************
25

    
26
%macro SBUTTERFLY 4
27
    mova      m%4, m%2
28
    punpckl%1 m%2, m%3
29
    punpckh%1 m%4, m%3
30
    SWAP %3, %4
31
%endmacro
32

    
33
%macro SBUTTERFLY2 4
34
    mova      m%4, m%2
35
    punpckh%1 m%2, m%3
36
    punpckl%1 m%4, m%3
37
    SWAP %2, %4, %3
38
%endmacro
39

    
40
%macro TRANSPOSE4x4B 5
41
    SBUTTERFLY bw, %1, %2, %5
42
    SBUTTERFLY bw, %3, %4, %5
43
    SBUTTERFLY wd, %1, %3, %5
44
    SBUTTERFLY wd, %2, %4, %5
45
    SWAP %2, %3
46
%endmacro
47

    
48
%macro TRANSPOSE4x4W 5
49
    SBUTTERFLY wd, %1, %2, %5
50
    SBUTTERFLY wd, %3, %4, %5
51
    SBUTTERFLY dq, %1, %3, %5
52
    SBUTTERFLY dq, %2, %4, %5
53
    SWAP %2, %3
54
%endmacro
55

    
56
%macro TRANSPOSE2x4x4W 5
57
    SBUTTERFLY wd,  %1, %2, %5
58
    SBUTTERFLY wd,  %3, %4, %5
59
    SBUTTERFLY dq,  %1, %3, %5
60
    SBUTTERFLY dq,  %2, %4, %5
61
    SBUTTERFLY qdq, %1, %2, %5
62
    SBUTTERFLY qdq, %3, %4, %5
63
%endmacro
64

    
65
%macro TRANSPOSE4x4D 5
66
    SBUTTERFLY dq,  %1, %2, %5
67
    SBUTTERFLY dq,  %3, %4, %5
68
    SBUTTERFLY qdq, %1, %3, %5
69
    SBUTTERFLY qdq, %2, %4, %5
70
    SWAP %2, %3
71
%endmacro
72

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

    
122
; PABSW macros assume %1 != %2, while ABS1/2 macros work in-place
123
%macro PABSW_MMX 2
124
    pxor       %1, %1
125
    pcmpgtw    %1, %2
126
    pxor       %2, %1
127
    psubw      %2, %1
128
    SWAP       %1, %2
129
%endmacro
130

    
131
%macro PSIGNW_MMX 2
132
    pxor       %1, %2
133
    psubw      %1, %2
134
%endmacro
135

    
136
%macro PABSW_MMX2 2
137
    pxor    %1, %1
138
    psubw   %1, %2
139
    pmaxsw  %1, %2
140
%endmacro
141

    
142
%macro PABSW_SSSE3 2
143
    pabsw      %1, %2
144
%endmacro
145

    
146
%macro PSIGNW_SSSE3 2
147
    psignw     %1, %2
148
%endmacro
149

    
150
%macro ABS1_MMX 2    ; a, tmp
151
    pxor       %2, %2
152
    pcmpgtw    %2, %1
153
    pxor       %1, %2
154
    psubw      %1, %2
155
%endmacro
156

    
157
%macro ABS2_MMX 4    ; a, b, tmp0, tmp1
158
    pxor       %3, %3
159
    pxor       %4, %4
160
    pcmpgtw    %3, %1
161
    pcmpgtw    %4, %2
162
    pxor       %1, %3
163
    pxor       %2, %4
164
    psubw      %1, %3
165
    psubw      %2, %4
166
%endmacro
167

    
168
%macro ABS1_MMX2 2   ; a, tmp
169
    pxor    %2, %2
170
    psubw   %2, %1
171
    pmaxsw  %1, %2
172
%endmacro
173

    
174
%macro ABS2_MMX2 4   ; a, b, tmp0, tmp1
175
    pxor    %3, %3
176
    pxor    %4, %4
177
    psubw   %3, %1
178
    psubw   %4, %2
179
    pmaxsw  %1, %3
180
    pmaxsw  %2, %4
181
%endmacro
182

    
183
%macro ABS1_SSSE3 2
184
    pabsw   %1, %1
185
%endmacro
186

    
187
%macro ABS2_SSSE3 4
188
    pabsw   %1, %1
189
    pabsw   %2, %2
190
%endmacro
191

    
192
%macro ABSB_MMX 2
193
    pxor    %2, %2
194
    psubb   %2, %1
195
    pminub  %1, %2
196
%endmacro
197

    
198
%macro ABSB2_MMX 4
199
    pxor    %3, %3
200
    pxor    %4, %4
201
    psubb   %3, %1
202
    psubb   %4, %2
203
    pminub  %1, %3
204
    pminub  %2, %4
205
%endmacro
206

    
207
%macro ABSB_SSSE3 2
208
    pabsb   %1, %1
209
%endmacro
210

    
211
%macro ABSB2_SSSE3 4
212
    pabsb   %1, %1
213
    pabsb   %2, %2
214
%endmacro
215

    
216
%macro ABS4 6
217
    ABS2 %1, %2, %5, %6
218
    ABS2 %3, %4, %5, %6
219
%endmacro
220

    
221
%define ABS1 ABS1_MMX
222
%define ABS2 ABS2_MMX
223
%define ABSB ABSB_MMX
224
%define ABSB2 ABSB2_MMX
225

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

    
237
%macro SPLATB_SSSE3 3
238
    movd      %1, [%2-3]
239
    pshufb    %1, %3
240
%endmacro
241

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

    
256
%macro PALIGNR_SSSE3 4
257
    palignr %1, %2, %3
258
%endmacro
259

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

    
274
%macro SUMSUB_BA 2-3
275
%if %0==2
276
    paddw   %1, %2
277
    paddw   %2, %2
278
    psubw   %2, %1
279
%else
280
    mova    %3, %1
281
    paddw   %1, %2
282
    psubw   %2, %3
283
%endif
284
%endmacro
285

    
286
%macro SUMSUB_BADC 4-5
287
%if %0==5
288
    SUMSUB_BA %1, %2, %5
289
    SUMSUB_BA %3, %4, %5
290
%else
291
    paddw   %1, %2
292
    paddw   %3, %4
293
    paddw   %2, %2
294
    paddw   %4, %4
295
    psubw   %2, %1
296
    psubw   %4, %3
297
%endif
298
%endmacro
299

    
300
%macro SUMSUB2_AB 3
301
    mova    %3, %1
302
    paddw   %1, %1
303
    paddw   %1, %2
304
    psubw   %3, %2
305
    psubw   %3, %2
306
%endmacro
307

    
308
%macro SUMSUB2_BA 3
309
    mova    m%3, m%1
310
    paddw   m%1, m%2
311
    paddw   m%1, m%2
312
    psubw   m%2, m%3
313
    psubw   m%2, m%3
314
%endmacro
315

    
316
%macro SUMSUBD2_AB 4
317
    mova    %4, %1
318
    mova    %3, %2
319
    psraw   %2, 1  ; %2: %2>>1
320
    psraw   %1, 1  ; %1: %1>>1
321
    paddw   %2, %4 ; %2: %2>>1+%1
322
    psubw   %1, %3 ; %1: %1>>1-%2
323
%endmacro
324

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

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

    
363

    
364
%macro LOAD_DIFF 5
365
%ifidn %3, none
366
    movh       %1, %4
367
    movh       %2, %5
368
    punpcklbw  %1, %2
369
    punpcklbw  %2, %2
370
    psubw      %1, %2
371
%else
372
    movh       %1, %4
373
    punpcklbw  %1, %3
374
    movh       %2, %5
375
    punpcklbw  %2, %3
376
    psubw      %1, %2
377
%endif
378
%endmacro
379

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

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

    
402
%macro DIFFx2 6-7
403
    movh       %3, %5
404
    punpcklbw  %3, %4
405
    psraw      %1, 6
406
    paddsw     %1, %3
407
    movh       %3, %6
408
    punpcklbw  %3, %4
409
    psraw      %2, 6
410
    paddsw     %2, %3
411
    packuswb   %2, %1
412
%endmacro
413

    
414
%macro STORE_DIFF 4
415
    movh       %2, %4
416
    punpcklbw  %2, %3
417
    psraw      %1, 6
418
    paddsw     %1, %2
419
    packuswb   %1, %1
420
    movh       %4, %1
421
%endmacro
422

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

    
438
%macro PMINUB_MMX 3 ; dst, src, tmp
439
    mova     %3, %1
440
    psubusb  %3, %2
441
    psubb    %1, %3
442
%endmacro
443

    
444
%macro PMINUB_MMXEXT 3 ; dst, src, ignored
445
    pminub   %1, %2
446
%endmacro