Statistics
| Branch: | Revision:

ffmpeg / libavcodec / x86 / x86util.asm @ 2dd2f716

History | View | Annotate | Download (8.14 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 TRANSPOSE4x4W 5
41
    SBUTTERFLY wd, %1, %2, %5
42
    SBUTTERFLY wd, %3, %4, %5
43
    SBUTTERFLY dq, %1, %3, %5
44
    SBUTTERFLY dq, %2, %4, %5
45
    SWAP %2, %3
46
%endmacro
47

    
48
%macro TRANSPOSE2x4x4W 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
    SBUTTERFLY qdq, %1, %2, %5
54
    SBUTTERFLY qdq, %3, %4, %5
55
%endmacro
56

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

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

    
114
%macro ABS1_MMX 2    ; a, tmp
115
    pxor    %2, %2
116
    psubw   %2, %1
117
    pmaxsw  %1, %2
118
%endmacro
119

    
120
%macro ABS2_MMX 4    ; a, b, tmp0, tmp1
121
    pxor    %3, %3
122
    pxor    %4, %4
123
    psubw   %3, %1
124
    psubw   %4, %2
125
    pmaxsw  %1, %3
126
    pmaxsw  %2, %4
127
%endmacro
128

    
129
%macro ABS1_SSSE3 2
130
    pabsw   %1, %1
131
%endmacro
132

    
133
%macro ABS2_SSSE3 4
134
    pabsw   %1, %1
135
    pabsw   %2, %2
136
%endmacro
137

    
138
%macro ABSB_MMX 2
139
    pxor    %2, %2
140
    psubb   %2, %1
141
    pminub  %1, %2
142
%endmacro
143

    
144
%macro ABSB2_MMX 4
145
    pxor    %3, %3
146
    pxor    %4, %4
147
    psubb   %3, %1
148
    psubb   %4, %2
149
    pminub  %1, %3
150
    pminub  %2, %4
151
%endmacro
152

    
153
%macro ABSB_SSSE3 2
154
    pabsb   %1, %1
155
%endmacro
156

    
157
%macro ABSB2_SSSE3 4
158
    pabsb   %1, %1
159
    pabsb   %2, %2
160
%endmacro
161

    
162
%macro ABS4 6
163
    ABS2 %1, %2, %5, %6
164
    ABS2 %3, %4, %5, %6
165
%endmacro
166

    
167
%define ABS1 ABS1_MMX
168
%define ABS2 ABS2_MMX
169
%define ABSB ABSB_MMX
170
%define ABSB2 ABSB2_MMX
171

    
172
%macro SPLATB_MMX 3
173
    movd      %1, [%2-3] ;to avoid crossing a cacheline
174
    punpcklbw %1, %1
175
%if mmsize==16
176
    pshuflw   %1, %1, 0xff
177
    punpcklqdq %1, %1
178
%else
179
    pshufw    %1, %1, 0xff
180
%endif
181
%endmacro
182

    
183
%macro SPLATB_SSSE3 3
184
    movd      %1, [%2-3]
185
    pshufb    %1, %3
186
%endmacro
187

    
188
%macro PALIGNR_MMX 4
189
    %ifnidn %4, %2
190
    mova    %4, %2
191
    %endif
192
    %if mmsize == 8
193
    psllq   %1, (8-%3)*8
194
    psrlq   %4, %3*8
195
    %else
196
    pslldq  %1, 16-%3
197
    psrldq  %4, %3
198
    %endif
199
    por     %1, %4
200
%endmacro
201

    
202
%macro PALIGNR_SSSE3 4
203
    palignr %1, %2, %3
204
%endmacro
205

    
206
%macro DEINTB 5 ; mask, reg1, mask, reg2, optional src to fill masks from
207
%ifnum %5
208
    mova   m%1, m%5
209
    mova   m%3, m%5
210
%else
211
    mova   m%1, %5
212
    mova   m%3, m%1
213
%endif
214
    pand   m%1, m%2 ; dst .. y6 .. y4
215
    pand   m%3, m%4 ; src .. y6 .. y4
216
    psrlw  m%2, 8   ; dst .. y7 .. y5
217
    psrlw  m%4, 8   ; src .. y7 .. y5
218
%endmacro
219

    
220
%macro SUMSUB_BA 2-3
221
%if %0==2
222
    paddw   %1, %2
223
    paddw   %2, %2
224
    psubw   %2, %1
225
%else
226
    mova    %3, %1
227
    paddw   %1, %2
228
    psubw   %2, %3
229
%endif
230
%endmacro
231

    
232
%macro SUMSUB_BADC 4-5
233
%if %0==5
234
    SUMSUB_BA %1, %2, %5
235
    SUMSUB_BA %3, %4, %5
236
%else
237
    paddw   %1, %2
238
    paddw   %3, %4
239
    paddw   %2, %2
240
    paddw   %4, %4
241
    psubw   %2, %1
242
    psubw   %4, %3
243
%endif
244
%endmacro
245

    
246
%macro SUMSUB2_AB 3
247
    mova    %3, %1
248
    paddw   %1, %1
249
    paddw   %1, %2
250
    psubw   %3, %2
251
    psubw   %3, %2
252
%endmacro
253

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

    
262
%macro SUMSUBD2_AB 4
263
    mova    %4, %1
264
    mova    %3, %2
265
    psraw   %2, 1  ; %2: %2>>1
266
    psraw   %1, 1  ; %1: %1>>1
267
    paddw   %2, %4 ; %2: %2>>1+%1
268
    psubw   %1, %3 ; %1: %1>>1-%2
269
%endmacro
270

    
271
%macro DCT4_1D 5
272
%ifnum %5
273
    SUMSUB_BADC m%4, m%1, m%3, m%2; m%5
274
    SUMSUB_BA   m%3, m%4, m%5
275
    SUMSUB2_AB  m%1, m%2, m%5
276
    SWAP %1, %3, %4, %5, %2
277
%else
278
    SUMSUB_BADC m%4, m%1, m%3, m%2
279
    SUMSUB_BA   m%3, m%4
280
    mova       [%5], m%2
281
    SUMSUB2_AB m%1, [%5], m%2
282
    SWAP %1, %3, %4, %2
283
%endif
284
%endmacro
285

    
286
%macro IDCT4_1D 5-6
287
%ifnum %5
288
    SUMSUBD2_AB m%2, m%4, m%6, m%5
289
    ; %2: %2>>1-%4 %4: %2+%4>>1
290
    SUMSUB_BA   m%3, m%1, m%6
291
    ; %3: %1+%3 %1: %1-%3
292
    SUMSUB_BADC m%4, m%3, m%2, m%1, m%6
293
    ; %4: %1+%3 + (%2+%4>>1)
294
    ; %3: %1+%3 - (%2+%4>>1)
295
    ; %2: %1-%3 + (%2>>1-%4)
296
    ; %1: %1-%3 - (%2>>1-%4)
297
%else
298
    SUMSUBD2_AB m%2, m%4, [%5], [%5+16]
299
    SUMSUB_BA   m%3, m%1
300
    SUMSUB_BADC m%4, m%3, m%2, m%1
301
%endif
302
    SWAP %1, %4, %3
303
    ; %1: %1+%3 + (%2+%4>>1) row0
304
    ; %2: %1-%3 + (%2>>1-%4) row1
305
    ; %3: %1-%3 - (%2>>1-%4) row2
306
    ; %4: %1+%3 - (%2+%4>>1) row3
307
%endmacro
308

    
309

    
310
%macro LOAD_DIFF 5
311
%ifidn %3, none
312
    movh       %1, %4
313
    movh       %2, %5
314
    punpcklbw  %1, %2
315
    punpcklbw  %2, %2
316
    psubw      %1, %2
317
%else
318
    movh       %1, %4
319
    punpcklbw  %1, %3
320
    movh       %2, %5
321
    punpcklbw  %2, %3
322
    psubw      %1, %2
323
%endif
324
%endmacro
325

    
326
%macro STORE_DCT 6
327
    movq   [%5+%6+ 0], m%1
328
    movq   [%5+%6+ 8], m%2
329
    movq   [%5+%6+16], m%3
330
    movq   [%5+%6+24], m%4
331
    movhps [%5+%6+32], m%1
332
    movhps [%5+%6+40], m%2
333
    movhps [%5+%6+48], m%3
334
    movhps [%5+%6+56], m%4
335
%endmacro
336

    
337
%macro LOAD_DIFF_8x4P 7-10 r0,r2,0 ; 4x dest, 2x temp, 2x pointer, increment?
338
    LOAD_DIFF m%1, m%5, m%7, [%8],      [%9]
339
    LOAD_DIFF m%2, m%6, m%7, [%8+r1],   [%9+r3]
340
    LOAD_DIFF m%3, m%5, m%7, [%8+2*r1], [%9+2*r3]
341
    LOAD_DIFF m%4, m%6, m%7, [%8+r4],   [%9+r5]
342
%if %10
343
    lea %8, [%8+4*r1]
344
    lea %9, [%9+4*r3]
345
%endif
346
%endmacro
347

    
348
%macro DIFFx2 6-7
349
    movh       %3, %5
350
    punpcklbw  %3, %4
351
    psraw      %1, 6
352
    paddsw     %1, %3
353
    movh       %3, %6
354
    punpcklbw  %3, %4
355
    psraw      %2, 6
356
    paddsw     %2, %3
357
    packuswb   %2, %1
358
%endmacro
359

    
360
%macro STORE_DIFF 4
361
    movh       %2, %4
362
    punpcklbw  %2, %3
363
    psraw      %1, 6
364
    paddsw     %1, %2
365
    packuswb   %1, %1
366
    movh       %4, %1
367
%endmacro
368

    
369
%macro STORE_DIFFx2 8 ; add1, add2, reg1, reg2, zero, shift, source, stride
370
    movh       %3, [%7]
371
    movh       %4, [%7+%8]
372
    punpcklbw  %3, %5
373
    punpcklbw  %4, %5
374
    psraw      %1, %6
375
    psraw      %2, %6
376
    paddw      %3, %1
377
    paddw      %4, %2
378
    packuswb   %3, %5
379
    packuswb   %4, %5
380
    movh     [%7], %3
381
    movh  [%7+%8], %4
382
%endmacro