Statistics
| Branch: | Revision:

ffmpeg / libavcodec / x86 / x86util.asm @ f2a30bd8

History | View | Annotate | Download (8.3 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 FFmpeg.
10
;*
11
;* FFmpeg 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
;* FFmpeg 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 FFmpeg; 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
%macro ABS1_MMX 2    ; a, tmp
123
    pxor    %2, %2
124
    psubw   %2, %1
125
    pmaxsw  %1, %2
126
%endmacro
127

    
128
%macro ABS2_MMX 4    ; a, b, tmp0, tmp1
129
    pxor    %3, %3
130
    pxor    %4, %4
131
    psubw   %3, %1
132
    psubw   %4, %2
133
    pmaxsw  %1, %3
134
    pmaxsw  %2, %4
135
%endmacro
136

    
137
%macro ABS1_SSSE3 2
138
    pabsw   %1, %1
139
%endmacro
140

    
141
%macro ABS2_SSSE3 4
142
    pabsw   %1, %1
143
    pabsw   %2, %2
144
%endmacro
145

    
146
%macro ABSB_MMX 2
147
    pxor    %2, %2
148
    psubb   %2, %1
149
    pminub  %1, %2
150
%endmacro
151

    
152
%macro ABSB2_MMX 4
153
    pxor    %3, %3
154
    pxor    %4, %4
155
    psubb   %3, %1
156
    psubb   %4, %2
157
    pminub  %1, %3
158
    pminub  %2, %4
159
%endmacro
160

    
161
%macro ABSB_SSSE3 2
162
    pabsb   %1, %1
163
%endmacro
164

    
165
%macro ABSB2_SSSE3 4
166
    pabsb   %1, %1
167
    pabsb   %2, %2
168
%endmacro
169

    
170
%macro ABS4 6
171
    ABS2 %1, %2, %5, %6
172
    ABS2 %3, %4, %5, %6
173
%endmacro
174

    
175
%define ABS1 ABS1_MMX
176
%define ABS2 ABS2_MMX
177
%define ABSB ABSB_MMX
178
%define ABSB2 ABSB2_MMX
179

    
180
%macro SPLATB_MMX 3
181
    movd      %1, [%2-3] ;to avoid crossing a cacheline
182
    punpcklbw %1, %1
183
%if mmsize==16
184
    pshuflw   %1, %1, 0xff
185
    punpcklqdq %1, %1
186
%else
187
    pshufw    %1, %1, 0xff
188
%endif
189
%endmacro
190

    
191
%macro SPLATB_SSSE3 3
192
    movd      %1, [%2-3]
193
    pshufb    %1, %3
194
%endmacro
195

    
196
%macro PALIGNR_MMX 4
197
    %ifnidn %4, %2
198
    mova    %4, %2
199
    %endif
200
    %if mmsize == 8
201
    psllq   %1, (8-%3)*8
202
    psrlq   %4, %3*8
203
    %else
204
    pslldq  %1, 16-%3
205
    psrldq  %4, %3
206
    %endif
207
    por     %1, %4
208
%endmacro
209

    
210
%macro PALIGNR_SSSE3 4
211
    palignr %1, %2, %3
212
%endmacro
213

    
214
%macro DEINTB 5 ; mask, reg1, mask, reg2, optional src to fill masks from
215
%ifnum %5
216
    mova   m%1, m%5
217
    mova   m%3, m%5
218
%else
219
    mova   m%1, %5
220
    mova   m%3, m%1
221
%endif
222
    pand   m%1, m%2 ; dst .. y6 .. y4
223
    pand   m%3, m%4 ; src .. y6 .. y4
224
    psrlw  m%2, 8   ; dst .. y7 .. y5
225
    psrlw  m%4, 8   ; src .. y7 .. y5
226
%endmacro
227

    
228
%macro SUMSUB_BA 2-3
229
%if %0==2
230
    paddw   %1, %2
231
    paddw   %2, %2
232
    psubw   %2, %1
233
%else
234
    mova    %3, %1
235
    paddw   %1, %2
236
    psubw   %2, %3
237
%endif
238
%endmacro
239

    
240
%macro SUMSUB_BADC 4-5
241
%if %0==5
242
    SUMSUB_BA %1, %2, %5
243
    SUMSUB_BA %3, %4, %5
244
%else
245
    paddw   %1, %2
246
    paddw   %3, %4
247
    paddw   %2, %2
248
    paddw   %4, %4
249
    psubw   %2, %1
250
    psubw   %4, %3
251
%endif
252
%endmacro
253

    
254
%macro SUMSUB2_AB 3
255
    mova    %3, %1
256
    paddw   %1, %1
257
    paddw   %1, %2
258
    psubw   %3, %2
259
    psubw   %3, %2
260
%endmacro
261

    
262
%macro SUMSUB2_BA 3
263
    mova    m%3, m%1
264
    paddw   m%1, m%2
265
    paddw   m%1, m%2
266
    psubw   m%2, m%3
267
    psubw   m%2, m%3
268
%endmacro
269

    
270
%macro SUMSUBD2_AB 4
271
    mova    %4, %1
272
    mova    %3, %2
273
    psraw   %2, 1  ; %2: %2>>1
274
    psraw   %1, 1  ; %1: %1>>1
275
    paddw   %2, %4 ; %2: %2>>1+%1
276
    psubw   %1, %3 ; %1: %1>>1-%2
277
%endmacro
278

    
279
%macro DCT4_1D 5
280
%ifnum %5
281
    SUMSUB_BADC m%4, m%1, m%3, m%2; m%5
282
    SUMSUB_BA   m%3, m%4, m%5
283
    SUMSUB2_AB  m%1, m%2, m%5
284
    SWAP %1, %3, %4, %5, %2
285
%else
286
    SUMSUB_BADC m%4, m%1, m%3, m%2
287
    SUMSUB_BA   m%3, m%4
288
    mova       [%5], m%2
289
    SUMSUB2_AB m%1, [%5], m%2
290
    SWAP %1, %3, %4, %2
291
%endif
292
%endmacro
293

    
294
%macro IDCT4_1D 5-6
295
%ifnum %5
296
    SUMSUBD2_AB m%2, m%4, m%6, m%5
297
    ; %2: %2>>1-%4 %4: %2+%4>>1
298
    SUMSUB_BA   m%3, m%1, m%6
299
    ; %3: %1+%3 %1: %1-%3
300
    SUMSUB_BADC m%4, m%3, m%2, m%1, m%6
301
    ; %4: %1+%3 + (%2+%4>>1)
302
    ; %3: %1+%3 - (%2+%4>>1)
303
    ; %2: %1-%3 + (%2>>1-%4)
304
    ; %1: %1-%3 - (%2>>1-%4)
305
%else
306
    SUMSUBD2_AB m%2, m%4, [%5], [%5+16]
307
    SUMSUB_BA   m%3, m%1
308
    SUMSUB_BADC m%4, m%3, m%2, m%1
309
%endif
310
    SWAP %1, %4, %3
311
    ; %1: %1+%3 + (%2+%4>>1) row0
312
    ; %2: %1-%3 + (%2>>1-%4) row1
313
    ; %3: %1-%3 - (%2>>1-%4) row2
314
    ; %4: %1+%3 - (%2+%4>>1) row3
315
%endmacro
316

    
317

    
318
%macro LOAD_DIFF 5
319
%ifidn %3, none
320
    movh       %1, %4
321
    movh       %2, %5
322
    punpcklbw  %1, %2
323
    punpcklbw  %2, %2
324
    psubw      %1, %2
325
%else
326
    movh       %1, %4
327
    punpcklbw  %1, %3
328
    movh       %2, %5
329
    punpcklbw  %2, %3
330
    psubw      %1, %2
331
%endif
332
%endmacro
333

    
334
%macro STORE_DCT 6
335
    movq   [%5+%6+ 0], m%1
336
    movq   [%5+%6+ 8], m%2
337
    movq   [%5+%6+16], m%3
338
    movq   [%5+%6+24], m%4
339
    movhps [%5+%6+32], m%1
340
    movhps [%5+%6+40], m%2
341
    movhps [%5+%6+48], m%3
342
    movhps [%5+%6+56], m%4
343
%endmacro
344

    
345
%macro LOAD_DIFF_8x4P 7-10 r0,r2,0 ; 4x dest, 2x temp, 2x pointer, increment?
346
    LOAD_DIFF m%1, m%5, m%7, [%8],      [%9]
347
    LOAD_DIFF m%2, m%6, m%7, [%8+r1],   [%9+r3]
348
    LOAD_DIFF m%3, m%5, m%7, [%8+2*r1], [%9+2*r3]
349
    LOAD_DIFF m%4, m%6, m%7, [%8+r4],   [%9+r5]
350
%if %10
351
    lea %8, [%8+4*r1]
352
    lea %9, [%9+4*r3]
353
%endif
354
%endmacro
355

    
356
%macro DIFFx2 6-7
357
    movh       %3, %5
358
    punpcklbw  %3, %4
359
    psraw      %1, 6
360
    paddsw     %1, %3
361
    movh       %3, %6
362
    punpcklbw  %3, %4
363
    psraw      %2, 6
364
    paddsw     %2, %3
365
    packuswb   %2, %1
366
%endmacro
367

    
368
%macro STORE_DIFF 4
369
    movh       %2, %4
370
    punpcklbw  %2, %3
371
    psraw      %1, 6
372
    paddsw     %1, %2
373
    packuswb   %1, %1
374
    movh       %4, %1
375
%endmacro
376

    
377
%macro STORE_DIFFx2 8 ; add1, add2, reg1, reg2, zero, shift, source, stride
378
    movh       %3, [%7]
379
    movh       %4, [%7+%8]
380
    punpcklbw  %3, %5
381
    punpcklbw  %4, %5
382
    psraw      %1, %6
383
    psraw      %2, %6
384
    paddw      %3, %1
385
    paddw      %4, %2
386
    packuswb   %3, %5
387
    packuswb   %4, %5
388
    movh     [%7], %3
389
    movh  [%7+%8], %4
390
%endmacro