Revision 3f87f39c libavcodec/x86/x86util.asm

View differences:

libavcodec/x86/x86util.asm
93 93
    SBUTTERFLY qdq, %4, %8, %2
94 94
    SWAP %2, %5
95 95
    SWAP %4, %7
96
%if 0<11
96
%if %0<11
97 97
    movdqa m%5, %10
98 98
%endif
99 99
%endif
......
165 165
    palignr %1, %2, %3
166 166
%endmacro
167 167

  
168
%macro SUMSUB_BA 2
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
169 184
    paddw   %1, %2
170 185
    paddw   %2, %2
171 186
    psubw   %2, %1
187
%else
188
    mova    %3, %1
189
    paddw   %1, %2
190
    psubw   %2, %3
191
%endif
172 192
%endmacro
173 193

  
174
%macro SUMSUB_BADC 4
194
%macro SUMSUB_BADC 4-5
195
%if %0==5
196
    SUMSUB_BA %1, %2, %5
197
    SUMSUB_BA %3, %4, %5
198
%else
175 199
    paddw   %1, %2
176 200
    paddw   %3, %4
177 201
    paddw   %2, %2
178 202
    paddw   %4, %4
179 203
    psubw   %2, %1
180 204
    psubw   %4, %3
205
%endif
181 206
%endmacro
182 207

  
183
%macro HADAMARD8_1D 8
184
    SUMSUB_BADC %1, %5, %2, %6
185
    SUMSUB_BADC %3, %7, %4, %8
208
%macro HADAMARD4_V 4+
209
    SUMSUB_BADC %1, %2, %3, %4
186 210
    SUMSUB_BADC %1, %3, %2, %4
187
    SUMSUB_BADC %5, %7, %6, %8
211
%endmacro
212

  
213
%macro HADAMARD8_V 8+
188 214
    SUMSUB_BADC %1, %2, %3, %4
189 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
190 365
%endmacro
191 366

  
192 367
%macro SUMSUB2_AB 3
......
197 372
    psubw   %3, %2
198 373
%endmacro
199 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

  
200 383
%macro SUMSUBD2_AB 4
201 384
    mova    %4, %1
202 385
    mova    %3, %2
203 386
    psraw   %2, 1
204
    psraw   %4, 1
205
    paddw   %1, %2
206
    psubw   %4, %3
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
207 418
%endmacro
208 419

  
209 420
%macro LOAD_DIFF 5
......
222 433
%endif
223 434
%endmacro
224 435

  
225
%macro LOAD_DIFF_8x4P 6-8 r0,r2 ; 4x dest, 2x temp, 2x pointer
226
    LOAD_DIFF %1, %5, none, [%7],      [%8]
227
    LOAD_DIFF %2, %6, none, [%7+r1],   [%8+r3]
228
    LOAD_DIFF %3, %5, none, [%7+2*r1], [%8+2*r3]
229
    LOAD_DIFF %4, %6, none, [%7+r4],   [%8+r5]
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]
230 441
%endmacro
231 442

  
232
%macro STORE_DIFF 4
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
233 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
234 508
    movh       %2, %4
235 509
    punpcklbw  %2, %3
510
    psraw      %1, 6
236 511
    paddsw     %1, %2
237 512
    packuswb   %1, %1
238 513
    movh       %4, %1

Also available in: Unified diff