Statistics
| Branch: | Revision:

ffmpeg / libavcodec / x86 / x86util.asm @ 3f87f39c

History | View | Annotate | Download (11.9 KB)

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

    
21
%macro SBUTTERFLY 4
22
    mova      m%4, m%2
23
    punpckl%1 m%2, m%3
24
    punpckh%1 m%4, m%3
25
    SWAP %3, %4
26
%endmacro
27

    
28
%macro TRANSPOSE4x4W 5
29
    SBUTTERFLY wd, %1, %2, %5
30
    SBUTTERFLY wd, %3, %4, %5
31
    SBUTTERFLY dq, %1, %3, %5
32
    SBUTTERFLY dq, %2, %4, %5
33
    SWAP %2, %3
34
%endmacro
35

    
36
%macro TRANSPOSE2x4x4W 5
37
    SBUTTERFLY wd,  %1, %2, %5
38
    SBUTTERFLY wd,  %3, %4, %5
39
    SBUTTERFLY dq,  %1, %3, %5
40
    SBUTTERFLY dq,  %2, %4, %5
41
    SBUTTERFLY qdq, %1, %2, %5
42
    SBUTTERFLY qdq, %3, %4, %5
43
%endmacro
44

    
45
%macro TRANSPOSE4x4D 5
46
    SBUTTERFLY dq,  %1, %2, %5
47
    SBUTTERFLY dq,  %3, %4, %5
48
    SBUTTERFLY qdq, %1, %3, %5
49
    SBUTTERFLY qdq, %2, %4, %5
50
    SWAP %2, %3
51
%endmacro
52

    
53
%macro TRANSPOSE8x8W 9-11
54
%ifdef ARCH_X86_64
55
    SBUTTERFLY wd,  %1, %2, %9
56
    SBUTTERFLY wd,  %3, %4, %9
57
    SBUTTERFLY wd,  %5, %6, %9
58
    SBUTTERFLY wd,  %7, %8, %9
59
    SBUTTERFLY dq,  %1, %3, %9
60
    SBUTTERFLY dq,  %2, %4, %9
61
    SBUTTERFLY dq,  %5, %7, %9
62
    SBUTTERFLY dq,  %6, %8, %9
63
    SBUTTERFLY qdq, %1, %5, %9
64
    SBUTTERFLY qdq, %2, %6, %9
65
    SBUTTERFLY qdq, %3, %7, %9
66
    SBUTTERFLY qdq, %4, %8, %9
67
    SWAP %2, %5
68
    SWAP %4, %7
69
%else
70
; in:  m0..m7, unless %11 in which case m6 is in %9
71
; out: m0..m7, unless %11 in which case m4 is in %10
72
; spills into %9 and %10
73
%if %0<11
74
    movdqa %9, m%7
75
%endif
76
    SBUTTERFLY wd,  %1, %2, %7
77
    movdqa %10, m%2
78
    movdqa m%7, %9
79
    SBUTTERFLY wd,  %3, %4, %2
80
    SBUTTERFLY wd,  %5, %6, %2
81
    SBUTTERFLY wd,  %7, %8, %2
82
    SBUTTERFLY dq,  %1, %3, %2
83
    movdqa %9, m%3
84
    movdqa m%2, %10
85
    SBUTTERFLY dq,  %2, %4, %3
86
    SBUTTERFLY dq,  %5, %7, %3
87
    SBUTTERFLY dq,  %6, %8, %3
88
    SBUTTERFLY qdq, %1, %5, %3
89
    SBUTTERFLY qdq, %2, %6, %3
90
    movdqa %10, m%2
91
    movdqa m%3, %9
92
    SBUTTERFLY qdq, %3, %7, %2
93
    SBUTTERFLY qdq, %4, %8, %2
94
    SWAP %2, %5
95
    SWAP %4, %7
96
%if %0<11
97
    movdqa m%5, %10
98
%endif
99
%endif
100
%endmacro
101

    
102
%macro ABS1_MMX 2    ; a, tmp
103
    pxor    %2, %2
104
    psubw   %2, %1
105
    pmaxsw  %1, %2
106
%endmacro
107

    
108
%macro ABS2_MMX 4    ; a, b, tmp0, tmp1
109
    pxor    %3, %3
110
    pxor    %4, %4
111
    psubw   %3, %1
112
    psubw   %4, %2
113
    pmaxsw  %1, %3
114
    pmaxsw  %2, %4
115
%endmacro
116

    
117
%macro ABS1_SSSE3 2
118
    pabsw   %1, %1
119
%endmacro
120

    
121
%macro ABS2_SSSE3 4
122
    pabsw   %1, %1
123
    pabsw   %2, %2
124
%endmacro
125

    
126
%define ABS1 ABS1_MMX
127
%define ABS2 ABS2_MMX
128

    
129
%macro ABS4 6
130
    ABS2 %1, %2, %5, %6
131
    ABS2 %3, %4, %5, %6
132
%endmacro
133

    
134
%macro SPLATB_MMX 3
135
    movd      %1, [%2-3] ;to avoid crossing a cacheline
136
    punpcklbw %1, %1
137
%if mmsize==16
138
    pshuflw   %1, %1, 0xff
139
    punpcklqdq %1, %1
140
%else
141
    pshufw    %1, %1, 0xff
142
%endif
143
%endmacro
144

    
145
%macro SPLATB_SSSE3 3
146
    movd      %1, [%2-3]
147
    pshufb    %1, %3
148
%endmacro
149

    
150
%macro PALIGNR_MMX 4
151
    %ifnidn %4, %2
152
    mova    %4, %2
153
    %endif
154
    %if mmsize == 8
155
    psllq   %1, (8-%3)*8
156
    psrlq   %4, %3*8
157
    %else
158
    pslldq  %1, 16-%3
159
    psrldq  %4, %3
160
    %endif
161
    por     %1, %4
162
%endmacro
163

    
164
%macro PALIGNR_SSSE3 4
165
    palignr %1, %2, %3
166
%endmacro
167

    
168
%macro DEINTB 5 ; mask, reg1, mask, reg2, optional src to fill masks from
169
%ifnum %5
170
    mova   m%1, m%5
171
    mova   m%3, m%5
172
%else
173
    mova   m%1, %5
174
    mova   m%3, m%1
175
%endif
176
    pand   m%1, m%2 ; dst .. y6 .. y4
177
    pand   m%3, m%4 ; src .. y6 .. y4
178
    psrlw  m%2, 8   ; dst .. y7 .. y5
179
    psrlw  m%4, 8   ; src .. y7 .. y5
180
%endmacro
181

    
182
%macro SUMSUB_BA 2-3
183
%if %0==2
184
    paddw   %1, %2
185
    paddw   %2, %2
186
    psubw   %2, %1
187
%else
188
    mova    %3, %1
189
    paddw   %1, %2
190
    psubw   %2, %3
191
%endif
192
%endmacro
193

    
194
%macro SUMSUB_BADC 4-5
195
%if %0==5
196
    SUMSUB_BA %1, %2, %5
197
    SUMSUB_BA %3, %4, %5
198
%else
199
    paddw   %1, %2
200
    paddw   %3, %4
201
    paddw   %2, %2
202
    paddw   %4, %4
203
    psubw   %2, %1
204
    psubw   %4, %3
205
%endif
206
%endmacro
207

    
208
%macro HADAMARD4_V 4+
209
    SUMSUB_BADC %1, %2, %3, %4
210
    SUMSUB_BADC %1, %3, %2, %4
211
%endmacro
212

    
213
%macro HADAMARD8_V 8+
214
    SUMSUB_BADC %1, %2, %3, %4
215
    SUMSUB_BADC %5, %6, %7, %8
216
    SUMSUB_BADC %1, %3, %2, %4
217
    SUMSUB_BADC %5, %7, %6, %8
218
    SUMSUB_BADC %1, %5, %2, %6
219
    SUMSUB_BADC %3, %7, %4, %8
220
%endmacro
221

    
222
%macro TRANS_SSE2 5-6
223
; TRANSPOSE2x2
224
; %1: transpose width (d/q) - use SBUTTERFLY qdq for dq
225
; %2: ord/unord (for compat with sse4, unused)
226
; %3/%4: source regs
227
; %5/%6: tmp regs
228
%ifidn %1, d
229
%define mask [mask_10 GLOBAL]
230
%define shift 16
231
%elifidn %1, q
232
%define mask [mask_1100 GLOBAL]
233
%define shift 32
234
%endif
235
%if %0==6 ; less dependency if we have two tmp
236
    mova   m%5, mask   ; ff00
237
    mova   m%6, m%4    ; x5x4
238
    psll%1 m%4, shift  ; x4..
239
    pand   m%6, m%5    ; x5..
240
    pandn  m%5, m%3    ; ..x0
241
    psrl%1 m%3, shift  ; ..x1
242
    por    m%4, m%5    ; x4x0
243
    por    m%3, m%6    ; x5x1
244
%else ; more dependency, one insn less. sometimes faster, sometimes not
245
    mova   m%5, m%4    ; x5x4
246
    psll%1 m%4, shift  ; x4..
247
    pxor   m%4, m%3    ; (x4^x1)x0
248
    pand   m%4, mask   ; (x4^x1)..
249
    pxor   m%3, m%4    ; x4x0
250
    psrl%1 m%4, shift  ; ..(x1^x4)
251
    pxor   m%5, m%4    ; x5x1
252
    SWAP   %4, %3, %5
253
%endif
254
%endmacro
255

    
256
%macro TRANS_SSE4 5-6 ; see above
257
%ifidn %1, d
258
    mova   m%5, m%3
259
%ifidn %2, ord
260
    psrl%1 m%3, 16
261
%endif
262
    pblendw m%3, m%4, 10101010b
263
    psll%1 m%4, 16
264
%ifidn %2, ord
265
    pblendw m%4, m%5, 01010101b
266
%else
267
    psrl%1 m%5, 16
268
    por    m%4, m%5
269
%endif
270
%elifidn %1, q
271
    mova   m%5, m%3
272
    shufps m%3, m%4, 10001000b
273
    shufps m%5, m%4, 11011101b
274
    SWAP   %4, %5
275
%endif
276
%endmacro
277

    
278
%macro HADAMARD 5-6
279
; %1=distance in words (0 for vertical pass, 1/2/4 for horizontal passes)
280
; %2=sumsub/max/amax (sum and diff / maximum / maximum of absolutes)
281
; %3/%4: regs
282
; %5(%6): tmpregs
283
%if %1!=0 ; have to reorder stuff for horizontal op
284
    %ifidn %2, sumsub
285
         %define ORDER ord
286
         ; sumsub needs order because a-b != b-a unless a=b
287
    %else
288
         %define ORDER unord
289
         ; if we just max, order doesn't matter (allows pblendw+or in sse4)
290
    %endif
291
    %if %1==1
292
         TRANS d, ORDER, %3, %4, %5, %6
293
    %elif %1==2
294
         %if mmsize==8
295
             SBUTTERFLY dq, %3, %4, %5
296
         %else
297
             TRANS q, ORDER, %3, %4, %5, %6
298
         %endif
299
    %elif %1==4
300
         SBUTTERFLY qdq, %3, %4, %5
301
    %endif
302
%endif
303
%ifidn %2, sumsub
304
    SUMSUB_BA m%3, m%4, m%5
305
%else
306
    %ifidn %2, amax
307
        %if %0==6
308
            ABS2 m%3, m%4, m%5, m%6
309
        %else
310
            ABS1 m%3, m%5
311
            ABS1 m%4, m%5
312
        %endif
313
    %endif
314
    pmaxsw m%3, m%4
315
%endif
316
%endmacro
317

    
318

    
319
%macro HADAMARD2_2D 6-7 sumsub
320
    HADAMARD 0, sumsub, %1, %2, %5
321
    HADAMARD 0, sumsub, %3, %4, %5
322
    SBUTTERFLY %6, %1, %2, %5
323
%ifnum %7
324
    HADAMARD 0, amax, %1, %2, %5, %7
325
%else
326
    HADAMARD 0, %7, %1, %2, %5
327
%endif
328
    SBUTTERFLY %6, %3, %4, %5
329
%ifnum %7
330
    HADAMARD 0, amax, %3, %4, %5, %7
331
%else
332
    HADAMARD 0, %7, %3, %4, %5
333
%endif
334
%endmacro
335

    
336
%macro HADAMARD4_2D 5-6 sumsub
337
    HADAMARD2_2D %1, %2, %3, %4, %5, wd
338
    HADAMARD2_2D %1, %3, %2, %4, %5, dq, %6
339
    SWAP %2, %3
340
%endmacro
341

    
342
%macro HADAMARD4_2D_SSE 5-6 sumsub
343
    HADAMARD  0, sumsub, %1, %2, %5 ; 1st V row 0 + 1
344
    HADAMARD  0, sumsub, %3, %4, %5 ; 1st V row 2 + 3
345
    SBUTTERFLY   wd, %1, %2, %5     ; %1: m0 1+0 %2: m1 1+0
346
    SBUTTERFLY   wd, %3, %4, %5     ; %3: m0 3+2 %4: m1 3+2
347
    HADAMARD2_2D %1, %3, %2, %4, %5, dq
348
    SBUTTERFLY  qdq, %1, %2, %5
349
    HADAMARD  0, %6, %1, %2, %5     ; 2nd H m1/m0 row 0+1
350
    SBUTTERFLY  qdq, %3, %4, %5
351
    HADAMARD  0, %6, %3, %4, %5     ; 2nd H m1/m0 row 2+3
352
%endmacro
353

    
354
%macro HADAMARD8_2D 9-10 sumsub
355
    HADAMARD2_2D %1, %2, %3, %4, %9, wd
356
    HADAMARD2_2D %5, %6, %7, %8, %9, wd
357
    HADAMARD2_2D %1, %3, %2, %4, %9, dq
358
    HADAMARD2_2D %5, %7, %6, %8, %9, dq
359
    HADAMARD2_2D %1, %5, %3, %7, %9, qdq, %10
360
    HADAMARD2_2D %2, %6, %4, %8, %9, qdq, %10
361
%ifnidn %10, amax
362
    SWAP %2, %5
363
    SWAP %4, %7
364
%endif
365
%endmacro
366

    
367
%macro SUMSUB2_AB 3
368
    mova    %3, %1
369
    paddw   %1, %1
370
    paddw   %1, %2
371
    psubw   %3, %2
372
    psubw   %3, %2
373
%endmacro
374

    
375
%macro SUMSUB2_BA 3
376
    mova    m%3, m%1
377
    paddw   m%1, m%2
378
    paddw   m%1, m%2
379
    psubw   m%2, m%3
380
    psubw   m%2, m%3
381
%endmacro
382

    
383
%macro SUMSUBD2_AB 4
384
    mova    %4, %1
385
    mova    %3, %2
386
    psraw   %2, 1
387
    psraw   %1, 1
388
    paddw   %2, %4
389
    psubw   %1, %3
390
%endmacro
391

    
392
%macro DCT4_1D 5
393
%ifnum %5
394
    SUMSUB_BADC m%4, m%1, m%3, m%2; m%5
395
    SUMSUB_BA   m%3, m%4, m%5
396
    SUMSUB2_AB  m%1, m%2, m%5
397
    SWAP %1, %3, %4, %5, %2
398
%else
399
    SUMSUB_BADC m%4, m%1, m%3, m%2
400
    SUMSUB_BA   m%3, m%4
401
    mova       [%5], m%2
402
    SUMSUB2_AB m%1, [%5], m%2
403
    SWAP %1, %3, %4, %2
404
%endif
405
%endmacro
406

    
407
%macro IDCT4_1D 5-6
408
%ifnum %5
409
    SUMSUBD2_AB m%2, m%4, m%6, m%5
410
    SUMSUB_BA   m%3, m%1, m%6
411
    SUMSUB_BADC m%4, m%3, m%2, m%1, m%6
412
%else
413
    SUMSUBD2_AB m%2, m%4, [%5], [%5+16]
414
    SUMSUB_BA   m%3, m%1
415
    SUMSUB_BADC m%4, m%3, m%2, m%1
416
%endif
417
    SWAP %1, %4, %3
418
%endmacro
419

    
420
%macro LOAD_DIFF 5
421
%ifidn %3, none
422
    movh       %1, %4
423
    movh       %2, %5
424
    punpcklbw  %1, %2
425
    punpcklbw  %2, %2
426
    psubw      %1, %2
427
%else
428
    movh       %1, %4
429
    punpcklbw  %1, %3
430
    movh       %2, %5
431
    punpcklbw  %2, %3
432
    psubw      %1, %2
433
%endif
434
%endmacro
435

    
436
%macro LOAD_DIFF8x4_SSE2 8
437
    LOAD_DIFF  m%1, m%5, m%6, [%7+%1*FENC_STRIDE], [%8+%1*FDEC_STRIDE]
438
    LOAD_DIFF  m%2, m%5, m%6, [%7+%2*FENC_STRIDE], [%8+%2*FDEC_STRIDE]
439
    LOAD_DIFF  m%3, m%5, m%6, [%7+%3*FENC_STRIDE], [%8+%3*FDEC_STRIDE]
440
    LOAD_DIFF  m%4, m%5, m%6, [%7+%4*FENC_STRIDE], [%8+%4*FDEC_STRIDE]
441
%endmacro
442

    
443
%macro LOAD_DIFF8x4_SSSE3 8 ; 4x dst, 1x tmp, 1x mul, 2x ptr
444
    movh       m%2, [%8+%1*FDEC_STRIDE]
445
    movh       m%1, [%7+%1*FENC_STRIDE]
446
    punpcklbw  m%1, m%2
447
    movh       m%3, [%8+%2*FDEC_STRIDE]
448
    movh       m%2, [%7+%2*FENC_STRIDE]
449
    punpcklbw  m%2, m%3
450
    movh       m%4, [%8+%3*FDEC_STRIDE]
451
    movh       m%3, [%7+%3*FENC_STRIDE]
452
    punpcklbw  m%3, m%4
453
    movh       m%5, [%8+%4*FDEC_STRIDE]
454
    movh       m%4, [%7+%4*FENC_STRIDE]
455
    punpcklbw  m%4, m%5
456
    pmaddubsw  m%1, m%6
457
    pmaddubsw  m%2, m%6
458
    pmaddubsw  m%3, m%6
459
    pmaddubsw  m%4, m%6
460
%endmacro
461

    
462
%macro STORE_DCT 6
463
    movq   [%5+%6+ 0], m%1
464
    movq   [%5+%6+ 8], m%2
465
    movq   [%5+%6+16], m%3
466
    movq   [%5+%6+24], m%4
467
    movhps [%5+%6+32], m%1
468
    movhps [%5+%6+40], m%2
469
    movhps [%5+%6+48], m%3
470
    movhps [%5+%6+56], m%4
471
%endmacro
472

    
473
%macro STORE_IDCT 4
474
    movhps [r0-4*FDEC_STRIDE], %1
475
    movh   [r0-3*FDEC_STRIDE], %1
476
    movhps [r0-2*FDEC_STRIDE], %2
477
    movh   [r0-1*FDEC_STRIDE], %2
478
    movhps [r0+0*FDEC_STRIDE], %3
479
    movh   [r0+1*FDEC_STRIDE], %3
480
    movhps [r0+2*FDEC_STRIDE], %4
481
    movh   [r0+3*FDEC_STRIDE], %4
482
%endmacro
483

    
484
%macro LOAD_DIFF_8x4P 7-10 r0,r2,0 ; 4x dest, 2x temp, 2x pointer, increment?
485
    LOAD_DIFF m%1, m%5, m%7, [%8],      [%9]
486
    LOAD_DIFF m%2, m%6, m%7, [%8+r1],   [%9+r3]
487
    LOAD_DIFF m%3, m%5, m%7, [%8+2*r1], [%9+2*r3]
488
    LOAD_DIFF m%4, m%6, m%7, [%8+r4],   [%9+r5]
489
%if %10
490
    lea %8, [%8+4*r1]
491
    lea %9, [%9+4*r3]
492
%endif
493
%endmacro
494

    
495
%macro DIFFx2 6-7
496
    movh       %3, %5
497
    punpcklbw  %3, %4
498
    psraw      %1, 6
499
    paddsw     %1, %3
500
    movh       %3, %6
501
    punpcklbw  %3, %4
502
    psraw      %2, 6
503
    paddsw     %2, %3
504
    packuswb   %2, %1
505
%endmacro
506

    
507
%macro STORE_DIFF 4
508
    movh       %2, %4
509
    punpcklbw  %2, %3
510
    psraw      %1, 6
511
    paddsw     %1, %2
512
    packuswb   %1, %1
513
    movh       %4, %1
514
%endmacro
515