Statistics
| Branch: | Revision:

ffmpeg / libavcodec / x86 / x86util.asm @ 4eca52ed

History | View | Annotate | Download (8.77 KB)

1 37fed100 Jason Garrett-Glaser
;*****************************************************************************
2 15c13dde Diego Biurrun
;* x86util.asm
3 37fed100 Jason Garrett-Glaser
;*****************************************************************************
4 37355fe8 Jason Garrett-Glaser
;* Copyright (C) 2008-2010 x264 project
5 2966cc18 Jason Garrett-Glaser
;*
6 37355fe8 Jason Garrett-Glaser
;* Authors: Loren Merritt <lorenm@u.washington.edu>
7
;*          Holger Lubitz <holger@lubitz.org>
8 37fed100 Jason Garrett-Glaser
;*
9 37355fe8 Jason Garrett-Glaser
;* This file is part of FFmpeg.
10 37fed100 Jason Garrett-Glaser
;*
11 37355fe8 Jason Garrett-Glaser
;* 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 37fed100 Jason Garrett-Glaser
;* but WITHOUT ANY WARRANTY; without even the implied warranty of
18 37355fe8 Jason Garrett-Glaser
;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19
;* Lesser General Public License for more details.
20 37fed100 Jason Garrett-Glaser
;*
21 37355fe8 Jason Garrett-Glaser
;* 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 2966cc18 Jason Garrett-Glaser
26 37fed100 Jason Garrett-Glaser
%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 2966cc18 Jason Garrett-Glaser
%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 f2a30bd8 Ronald S. Bultje
%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 37fed100 Jason Garrett-Glaser
%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 3f87f39c John Adcock
%if %0<11
117 37fed100 Jason Garrett-Glaser
    movdqa m%5, %10
118
%endif
119
%endif
120
%endmacro
121
122 faa26db2 David Conrad
; 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 37fed100 Jason Garrett-Glaser
%macro ABS1_MMX 2    ; a, tmp
151
    pxor    %2, %2
152
    psubw   %2, %1
153
    pmaxsw  %1, %2
154
%endmacro
155
156
%macro ABS2_MMX 4    ; a, b, tmp0, tmp1
157
    pxor    %3, %3
158
    pxor    %4, %4
159
    psubw   %3, %1
160
    psubw   %4, %2
161
    pmaxsw  %1, %3
162
    pmaxsw  %2, %4
163
%endmacro
164
165
%macro ABS1_SSSE3 2
166
    pabsw   %1, %1
167
%endmacro
168
169
%macro ABS2_SSSE3 4
170
    pabsw   %1, %1
171
    pabsw   %2, %2
172
%endmacro
173
174 2966cc18 Jason Garrett-Glaser
%macro ABSB_MMX 2
175
    pxor    %2, %2
176
    psubb   %2, %1
177
    pminub  %1, %2
178
%endmacro
179
180
%macro ABSB2_MMX 4
181
    pxor    %3, %3
182
    pxor    %4, %4
183
    psubb   %3, %1
184
    psubb   %4, %2
185
    pminub  %1, %3
186
    pminub  %2, %4
187
%endmacro
188
189
%macro ABSB_SSSE3 2
190
    pabsb   %1, %1
191
%endmacro
192
193
%macro ABSB2_SSSE3 4
194
    pabsb   %1, %1
195
    pabsb   %2, %2
196
%endmacro
197 37fed100 Jason Garrett-Glaser
198
%macro ABS4 6
199
    ABS2 %1, %2, %5, %6
200
    ABS2 %3, %4, %5, %6
201
%endmacro
202
203 2966cc18 Jason Garrett-Glaser
%define ABS1 ABS1_MMX
204
%define ABS2 ABS2_MMX
205
%define ABSB ABSB_MMX
206
%define ABSB2 ABSB2_MMX
207
208 37fed100 Jason Garrett-Glaser
%macro SPLATB_MMX 3
209
    movd      %1, [%2-3] ;to avoid crossing a cacheline
210
    punpcklbw %1, %1
211
%if mmsize==16
212
    pshuflw   %1, %1, 0xff
213
    punpcklqdq %1, %1
214
%else
215
    pshufw    %1, %1, 0xff
216
%endif
217
%endmacro
218
219
%macro SPLATB_SSSE3 3
220
    movd      %1, [%2-3]
221
    pshufb    %1, %3
222
%endmacro
223
224
%macro PALIGNR_MMX 4
225
    %ifnidn %4, %2
226
    mova    %4, %2
227
    %endif
228
    %if mmsize == 8
229
    psllq   %1, (8-%3)*8
230
    psrlq   %4, %3*8
231
    %else
232
    pslldq  %1, 16-%3
233
    psrldq  %4, %3
234
    %endif
235
    por     %1, %4
236
%endmacro
237
238
%macro PALIGNR_SSSE3 4
239
    palignr %1, %2, %3
240
%endmacro
241
242 3f87f39c John Adcock
%macro DEINTB 5 ; mask, reg1, mask, reg2, optional src to fill masks from
243
%ifnum %5
244
    mova   m%1, m%5
245
    mova   m%3, m%5
246
%else
247
    mova   m%1, %5
248
    mova   m%3, m%1
249
%endif
250
    pand   m%1, m%2 ; dst .. y6 .. y4
251
    pand   m%3, m%4 ; src .. y6 .. y4
252
    psrlw  m%2, 8   ; dst .. y7 .. y5
253
    psrlw  m%4, 8   ; src .. y7 .. y5
254
%endmacro
255
256
%macro SUMSUB_BA 2-3
257
%if %0==2
258 37fed100 Jason Garrett-Glaser
    paddw   %1, %2
259
    paddw   %2, %2
260
    psubw   %2, %1
261 3f87f39c John Adcock
%else
262
    mova    %3, %1
263
    paddw   %1, %2
264
    psubw   %2, %3
265
%endif
266 37fed100 Jason Garrett-Glaser
%endmacro
267
268 3f87f39c John Adcock
%macro SUMSUB_BADC 4-5
269
%if %0==5
270
    SUMSUB_BA %1, %2, %5
271
    SUMSUB_BA %3, %4, %5
272
%else
273 37fed100 Jason Garrett-Glaser
    paddw   %1, %2
274
    paddw   %3, %4
275
    paddw   %2, %2
276
    paddw   %4, %4
277
    psubw   %2, %1
278
    psubw   %4, %3
279 3f87f39c John Adcock
%endif
280 37fed100 Jason Garrett-Glaser
%endmacro
281
282
%macro SUMSUB2_AB 3
283
    mova    %3, %1
284
    paddw   %1, %1
285
    paddw   %1, %2
286
    psubw   %3, %2
287
    psubw   %3, %2
288
%endmacro
289
290 3f87f39c John Adcock
%macro SUMSUB2_BA 3
291
    mova    m%3, m%1
292
    paddw   m%1, m%2
293
    paddw   m%1, m%2
294
    psubw   m%2, m%3
295
    psubw   m%2, m%3
296
%endmacro
297
298 37fed100 Jason Garrett-Glaser
%macro SUMSUBD2_AB 4
299
    mova    %4, %1
300
    mova    %3, %2
301 2966cc18 Jason Garrett-Glaser
    psraw   %2, 1  ; %2: %2>>1
302
    psraw   %1, 1  ; %1: %1>>1
303
    paddw   %2, %4 ; %2: %2>>1+%1
304
    psubw   %1, %3 ; %1: %1>>1-%2
305 3f87f39c John Adcock
%endmacro
306
307
%macro DCT4_1D 5
308
%ifnum %5
309
    SUMSUB_BADC m%4, m%1, m%3, m%2; m%5
310
    SUMSUB_BA   m%3, m%4, m%5
311
    SUMSUB2_AB  m%1, m%2, m%5
312
    SWAP %1, %3, %4, %5, %2
313
%else
314
    SUMSUB_BADC m%4, m%1, m%3, m%2
315
    SUMSUB_BA   m%3, m%4
316
    mova       [%5], m%2
317
    SUMSUB2_AB m%1, [%5], m%2
318
    SWAP %1, %3, %4, %2
319
%endif
320
%endmacro
321
322
%macro IDCT4_1D 5-6
323
%ifnum %5
324
    SUMSUBD2_AB m%2, m%4, m%6, m%5
325 2966cc18 Jason Garrett-Glaser
    ; %2: %2>>1-%4 %4: %2+%4>>1
326 3f87f39c John Adcock
    SUMSUB_BA   m%3, m%1, m%6
327 2966cc18 Jason Garrett-Glaser
    ; %3: %1+%3 %1: %1-%3
328 3f87f39c John Adcock
    SUMSUB_BADC m%4, m%3, m%2, m%1, m%6
329 2966cc18 Jason Garrett-Glaser
    ; %4: %1+%3 + (%2+%4>>1)
330
    ; %3: %1+%3 - (%2+%4>>1)
331
    ; %2: %1-%3 + (%2>>1-%4)
332
    ; %1: %1-%3 - (%2>>1-%4)
333 3f87f39c John Adcock
%else
334
    SUMSUBD2_AB m%2, m%4, [%5], [%5+16]
335
    SUMSUB_BA   m%3, m%1
336
    SUMSUB_BADC m%4, m%3, m%2, m%1
337
%endif
338
    SWAP %1, %4, %3
339 2966cc18 Jason Garrett-Glaser
    ; %1: %1+%3 + (%2+%4>>1) row0
340
    ; %2: %1-%3 + (%2>>1-%4) row1
341
    ; %3: %1-%3 - (%2>>1-%4) row2
342
    ; %4: %1+%3 - (%2+%4>>1) row3
343 37fed100 Jason Garrett-Glaser
%endmacro
344
345 2966cc18 Jason Garrett-Glaser
346 37fed100 Jason Garrett-Glaser
%macro LOAD_DIFF 5
347
%ifidn %3, none
348
    movh       %1, %4
349
    movh       %2, %5
350
    punpcklbw  %1, %2
351
    punpcklbw  %2, %2
352
    psubw      %1, %2
353
%else
354
    movh       %1, %4
355
    punpcklbw  %1, %3
356
    movh       %2, %5
357
    punpcklbw  %2, %3
358
    psubw      %1, %2
359
%endif
360
%endmacro
361
362 3f87f39c John Adcock
%macro STORE_DCT 6
363
    movq   [%5+%6+ 0], m%1
364
    movq   [%5+%6+ 8], m%2
365
    movq   [%5+%6+16], m%3
366
    movq   [%5+%6+24], m%4
367
    movhps [%5+%6+32], m%1
368
    movhps [%5+%6+40], m%2
369
    movhps [%5+%6+48], m%3
370
    movhps [%5+%6+56], m%4
371
%endmacro
372
373
%macro LOAD_DIFF_8x4P 7-10 r0,r2,0 ; 4x dest, 2x temp, 2x pointer, increment?
374
    LOAD_DIFF m%1, m%5, m%7, [%8],      [%9]
375
    LOAD_DIFF m%2, m%6, m%7, [%8+r1],   [%9+r3]
376
    LOAD_DIFF m%3, m%5, m%7, [%8+2*r1], [%9+2*r3]
377
    LOAD_DIFF m%4, m%6, m%7, [%8+r4],   [%9+r5]
378
%if %10
379
    lea %8, [%8+4*r1]
380
    lea %9, [%9+4*r3]
381
%endif
382
%endmacro
383
384
%macro DIFFx2 6-7
385
    movh       %3, %5
386
    punpcklbw  %3, %4
387 37fed100 Jason Garrett-Glaser
    psraw      %1, 6
388 3f87f39c John Adcock
    paddsw     %1, %3
389
    movh       %3, %6
390
    punpcklbw  %3, %4
391
    psraw      %2, 6
392
    paddsw     %2, %3
393
    packuswb   %2, %1
394
%endmacro
395
396
%macro STORE_DIFF 4
397 37fed100 Jason Garrett-Glaser
    movh       %2, %4
398
    punpcklbw  %2, %3
399 3f87f39c John Adcock
    psraw      %1, 6
400 37fed100 Jason Garrett-Glaser
    paddsw     %1, %2
401
    packuswb   %1, %1
402
    movh       %4, %1
403
%endmacro
404 2dd2f716 Ronald S. Bultje
405
%macro STORE_DIFFx2 8 ; add1, add2, reg1, reg2, zero, shift, source, stride
406
    movh       %3, [%7]
407
    movh       %4, [%7+%8]
408
    punpcklbw  %3, %5
409
    punpcklbw  %4, %5
410
    psraw      %1, %6
411
    psraw      %2, %6
412
    paddw      %3, %1
413
    paddw      %4, %2
414
    packuswb   %3, %5
415
    packuswb   %4, %5
416
    movh     [%7], %3
417
    movh  [%7+%8], %4
418
%endmacro