~ubuntu-branches/ubuntu/trusty/libav/trusty-proposed

« back to all changes in this revision

Viewing changes to libavcodec/x86/h264_deblock.asm

  • Committer: Package Import Robot
  • Author(s): Reinhard Tartler
  • Date: 2013-10-22 23:24:08 UTC
  • mfrom: (1.3.36 sid)
  • Revision ID: package-import@ubuntu.com-20131022232408-b8tvvn4pyzri9mi3
Tags: 6:9.10-1ubuntu1
* Build all -extra flavors from this source package, as libav got demoted
  from main to universe, cf LP: #1243235
* Simplify debian/rules to follow exactly the code that debian executes
* New upstream (LP: #1180288) fixes lots of security issues (LP: #1242802)
* Merge from unstable, remaining changes:
  - build-depend on libtiff5-dev rather than libtiff4-dev,
    avoids FTBFS caused by imlib
  - follow the regular debian codepaths

Show diffs side-by-side

added added

removed removed

Lines of Context:
24
24
;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
25
25
;******************************************************************************
26
26
 
27
 
%include "x86inc.asm"
28
 
%include "x86util.asm"
 
27
%include "libavutil/x86/x86util.asm"
 
28
 
 
29
SECTION_RODATA
 
30
 
 
31
pb_3_1: times 4 db 3, 1
29
32
 
30
33
SECTION .text
31
34
 
200
203
; out: %4 = |%1-%2|>%3
201
204
; clobbers: %5
202
205
%macro DIFF_GT2 5
203
 
%ifdef ARCH_X86_64
 
206
%if ARCH_X86_64
204
207
    psubusb %5, %2, %1
205
208
    psubusb %4, %1, %2
206
209
%else
278
281
    mova    %4, %2
279
282
%endmacro
280
283
 
281
 
%ifdef ARCH_X86_64
 
284
%if ARCH_X86_64
282
285
;-----------------------------------------------------------------------------
283
286
; void deblock_v_luma( uint8_t *pix, int stride, int alpha, int beta, int8_t *tc0 )
284
287
;-----------------------------------------------------------------------------
285
 
%macro DEBLOCK_LUMA 1
286
 
cglobal deblock_v_luma_8_%1, 5,5,10
 
288
%macro DEBLOCK_LUMA 0
 
289
cglobal deblock_v_luma_8, 5,5,10
287
290
    movd    m8, [r4] ; tc0
288
291
    lea     r4, [r1*3]
289
292
    dec     r2d        ; alpha-1
327
330
;-----------------------------------------------------------------------------
328
331
; void deblock_h_luma( uint8_t *pix, int stride, int alpha, int beta, int8_t *tc0 )
329
332
;-----------------------------------------------------------------------------
330
 
INIT_MMX
331
 
cglobal deblock_h_luma_8_%1, 5,7
332
 
    movsxd r10, r1d
333
 
    lea    r11, [r10+r10*2]
 
333
INIT_MMX cpuname
 
334
cglobal deblock_h_luma_8, 5,9
 
335
    movsxd r7,  r1d
 
336
    lea    r8,  [r7+r7*2]
334
337
    lea    r6,  [r0-4]
335
 
    lea    r5,  [r0-4+r11]
336
 
%ifdef WIN64
 
338
    lea    r5,  [r0-4+r8]
 
339
%if WIN64
337
340
    sub    rsp, 0x98
338
341
    %define pix_tmp rsp+0x30
339
342
%else
342
345
%endif
343
346
 
344
347
    ; transpose 6x16 -> tmp space
345
 
    TRANSPOSE6x8_MEM  PASS8ROWS(r6, r5, r10, r11), pix_tmp
346
 
    lea    r6, [r6+r10*8]
347
 
    lea    r5, [r5+r10*8]
348
 
    TRANSPOSE6x8_MEM  PASS8ROWS(r6, r5, r10, r11), pix_tmp+8
 
348
    TRANSPOSE6x8_MEM  PASS8ROWS(r6, r5, r7, r8), pix_tmp
 
349
    lea    r6, [r6+r7*8]
 
350
    lea    r5, [r5+r7*8]
 
351
    TRANSPOSE6x8_MEM  PASS8ROWS(r6, r5, r7, r8), pix_tmp+8
349
352
 
350
353
    ; vertical filter
351
354
    ; alpha, beta, tc0 are still in r2d, r3d, r4
352
 
    ; don't backup r6, r5, r10, r11 because deblock_v_luma_sse2 doesn't use them
 
355
    ; don't backup r6, r5, r7, r8 because deblock_v_luma_sse2 doesn't use them
353
356
    lea    r0, [pix_tmp+0x30]
354
357
    mov    r1d, 0x10
355
 
%ifdef WIN64
 
358
%if WIN64
356
359
    mov    [rsp+0x20], r4
357
360
%endif
358
 
    call   deblock_v_luma_8_%1
 
361
    call   deblock_v_luma_8
359
362
 
360
363
    ; transpose 16x4 -> original space  (only the middle 4 rows were changed by the filter)
361
364
    add    r6, 2
364
367
    movq   m1, [pix_tmp+0x28]
365
368
    movq   m2, [pix_tmp+0x38]
366
369
    movq   m3, [pix_tmp+0x48]
367
 
    TRANSPOSE8x4B_STORE  PASS8ROWS(r6, r5, r10, r11)
 
370
    TRANSPOSE8x4B_STORE  PASS8ROWS(r6, r5, r7, r8)
368
371
 
369
 
    shl    r10, 3
370
 
    sub    r6,  r10
371
 
    sub    r5,  r10
372
 
    shr    r10, 3
 
372
    shl    r7,  3
 
373
    sub    r6,  r7
 
374
    sub    r5,  r7
 
375
    shr    r7,  3
373
376
    movq   m0, [pix_tmp+0x10]
374
377
    movq   m1, [pix_tmp+0x20]
375
378
    movq   m2, [pix_tmp+0x30]
376
379
    movq   m3, [pix_tmp+0x40]
377
 
    TRANSPOSE8x4B_STORE  PASS8ROWS(r6, r5, r10, r11)
 
380
    TRANSPOSE8x4B_STORE  PASS8ROWS(r6, r5, r7, r8)
378
381
 
379
 
%ifdef WIN64
 
382
%if WIN64
380
383
    add    rsp, 0x98
381
384
%else
382
385
    add    rsp, 0x68
384
387
    RET
385
388
%endmacro
386
389
 
387
 
INIT_XMM
388
 
DEBLOCK_LUMA sse2
389
 
INIT_AVX
390
 
DEBLOCK_LUMA avx
 
390
INIT_XMM sse2
 
391
DEBLOCK_LUMA
 
392
INIT_XMM avx
 
393
DEBLOCK_LUMA
391
394
 
392
395
%else
393
396
 
394
 
%macro DEBLOCK_LUMA 3
 
397
%macro DEBLOCK_LUMA 2
395
398
;-----------------------------------------------------------------------------
396
399
; void deblock_v8_luma( uint8_t *pix, int stride, int alpha, int beta, int8_t *tc0 )
397
400
;-----------------------------------------------------------------------------
398
 
cglobal deblock_%2_luma_8_%1, 5,5
 
401
cglobal deblock_%1_luma_8, 5,5,8,2*%2
399
402
    lea     r4, [r1*3]
400
403
    dec     r2     ; alpha-1
401
404
    neg     r4
402
405
    dec     r3     ; beta-1
403
406
    add     r4, r0 ; pix-3*stride
404
 
    %assign pad 2*%3+12-(stack_offset&15)
405
 
    SUB     esp, pad
406
407
 
407
408
    mova    m0, [r4+r1]   ; p1
408
409
    mova    m1, [r4+2*r1] ; p0
415
416
    movd    m4, [r3] ; tc0
416
417
    punpcklbw m4, m4
417
418
    punpcklbw m4, m4 ; tc = 4x tc0[3], 4x tc0[2], 4x tc0[1], 4x tc0[0]
418
 
    mova   [esp+%3], m4 ; tc
 
419
    mova   [esp+%2], m4 ; tc
419
420
    pcmpgtb m4, m3
420
421
    mova    m3, [r4] ; p2
421
422
    pand    m4, m7
423
424
 
424
425
    DIFF_GT2 m1, m3, m5, m6, m7 ; |p2-p0| > beta-1
425
426
    pand    m6, m4
426
 
    pand    m4, [esp+%3] ; tc
 
427
    pand    m4, [esp+%2] ; tc
427
428
    psubb   m7, m4, m6
428
429
    pand    m6, m4
429
430
    LUMA_Q1 m0, m3, [r4], [r4+r1], m6, m4
431
432
    mova    m4, [r0+2*r1] ; q2
432
433
    DIFF_GT2 m2, m4, m5, m6, m3 ; |q2-q0| > beta-1
433
434
    pand    m6, [esp] ; mask
434
 
    mova    m5, [esp+%3] ; tc
 
435
    mova    m5, [esp+%2] ; tc
435
436
    psubb   m7, m6
436
437
    pand    m5, m6
437
438
    mova    m3, [r0+r1]
440
441
    DEBLOCK_P0_Q0
441
442
    mova    [r4+2*r1], m1
442
443
    mova    [r0], m2
443
 
    ADD     esp, pad
444
444
    RET
445
445
 
446
446
;-----------------------------------------------------------------------------
447
447
; void deblock_h_luma( uint8_t *pix, int stride, int alpha, int beta, int8_t *tc0 )
448
448
;-----------------------------------------------------------------------------
449
 
INIT_MMX
450
 
cglobal deblock_h_luma_8_%1, 0,5
 
449
INIT_MMX cpuname
 
450
cglobal deblock_h_luma_8, 0,5,8,0x60+HAVE_ALIGNED_STACK*12
451
451
    mov    r0, r0mp
452
452
    mov    r3, r1m
453
453
    lea    r4, [r3*3]
454
454
    sub    r0, 4
455
455
    lea    r1, [r0+r4]
456
 
    %assign pad 0x78-(stack_offset&15)
457
 
    SUB    esp, pad
458
 
%define pix_tmp esp+12
 
456
%define pix_tmp esp+12*HAVE_ALIGNED_STACK
459
457
 
460
458
    ; transpose 6x16 -> tmp space
461
459
    TRANSPOSE6x8_MEM  PASS8ROWS(r0, r1, r3, r4), pix_tmp
470
468
    PUSH   dword r2m
471
469
    PUSH   dword 16
472
470
    PUSH   dword r0
473
 
    call   deblock_%2_luma_8_%1
474
 
%ifidn %2, v8
 
471
    call   deblock_%1_luma_8
 
472
%ifidn %1, v8
475
473
    add    dword [esp   ], 8 ; pix_tmp+0x38
476
474
    add    dword [esp+16], 2 ; tc0+2
477
 
    call   deblock_%2_luma_8_%1
 
475
    call   deblock_%1_luma_8
478
476
%endif
479
477
    ADD    esp, 20
480
478
 
497
495
    movq   m3, [pix_tmp+0x48]
498
496
    TRANSPOSE8x4B_STORE  PASS8ROWS(r0, r1, r3, r4)
499
497
 
500
 
    ADD    esp, pad
501
498
    RET
502
499
%endmacro ; DEBLOCK_LUMA
503
500
 
504
 
INIT_MMX
505
 
DEBLOCK_LUMA mmxext, v8, 8
506
 
INIT_XMM
507
 
DEBLOCK_LUMA sse2, v, 16
508
 
INIT_AVX
509
 
DEBLOCK_LUMA avx, v, 16
 
501
INIT_MMX mmxext
 
502
DEBLOCK_LUMA v8, 8
 
503
INIT_XMM sse2
 
504
DEBLOCK_LUMA v, 16
 
505
INIT_XMM avx
 
506
DEBLOCK_LUMA v, 16
510
507
 
511
508
%endif ; ARCH
512
509
 
513
510
 
514
511
 
515
512
%macro LUMA_INTRA_P012 4 ; p0..p3 in memory
516
 
%ifdef ARCH_X86_64
 
513
%if ARCH_X86_64
517
514
    pavgb t0, p2, p1
518
515
    pavgb t1, p0, q0
519
516
%else
524
521
%endif
525
522
    pavgb t0, t1 ; ((p2+p1+1)/2 + (p0+q0+1)/2 + 1)/2
526
523
    mova  t5, t1
527
 
%ifdef ARCH_X86_64
 
524
%if ARCH_X86_64
528
525
    paddb t2, p2, p1
529
526
    paddb t3, p0, q0
530
527
%else
542
539
    pand  t2, mpb_1
543
540
    psubb t0, t2 ; p1' = (p2+p1+p0+q0+2)/4;
544
541
 
545
 
%ifdef ARCH_X86_64
 
542
%if ARCH_X86_64
546
543
    pavgb t1, p2, q1
547
544
    psubb t2, p2, q1
548
545
%else
608
605
    %define mask1p mask1q
609
606
%endmacro
610
607
 
611
 
%macro DEBLOCK_LUMA_INTRA 2
 
608
%macro DEBLOCK_LUMA_INTRA 1
612
609
    %define p1 m0
613
610
    %define p0 m1
614
611
    %define q0 m2
617
614
    %define t1 m5
618
615
    %define t2 m6
619
616
    %define t3 m7
620
 
%ifdef ARCH_X86_64
 
617
%if ARCH_X86_64
621
618
    %define p2 m8
622
619
    %define q2 m9
623
620
    %define t4 m10
624
621
    %define t5 m11
625
622
    %define mask0 m12
626
623
    %define mask1p m13
 
624
%if WIN64
 
625
    %define mask1q [rsp]
 
626
%else
627
627
    %define mask1q [rsp-24]
 
628
%endif
628
629
    %define mpb_0 m14
629
630
    %define mpb_1 m15
630
631
%else
631
 
    %define spill(x) [esp+16*x+((stack_offset+4)&15)]
 
632
    %define spill(x) [esp+16*x]
632
633
    %define p2 [r4+r1]
633
634
    %define q2 [r0+2*r1]
634
635
    %define t4 spill(0)
643
644
;-----------------------------------------------------------------------------
644
645
; void deblock_v_luma_intra( uint8_t *pix, int stride, int alpha, int beta )
645
646
;-----------------------------------------------------------------------------
646
 
cglobal deblock_%2_luma_intra_8_%1, 4,6,16
647
 
%ifndef ARCH_X86_64
648
 
    sub     esp, 0x60
 
647
%if WIN64
 
648
cglobal deblock_%1_luma_intra_8, 4,6,16,0x10
 
649
%else
 
650
cglobal deblock_%1_luma_intra_8, 4,6,16,ARCH_X86_64*0x50-0x50
649
651
%endif
650
652
    lea     r4, [r1*4]
651
653
    lea     r5, [r1*3] ; 3*stride
659
661
    mova    p0, [r4+r5]
660
662
    mova    q0, [r0]
661
663
    mova    q1, [r0+r1]
662
 
%ifdef ARCH_X86_64
 
664
%if ARCH_X86_64
663
665
    pxor    mpb_0, mpb_0
664
666
    mova    mpb_1, [pb_1]
665
667
    LOAD_MASK r2d, r3d, t5 ; m5=beta-1, t5=alpha-1, m7=mask0
695
697
    LUMA_INTRA_SWAP_PQ
696
698
    LUMA_INTRA_P012 [r0], [r0+r1], [r0+2*r1], [r0+r5]
697
699
.end:
698
 
%ifndef ARCH_X86_64
699
 
    add     esp, 0x60
700
 
%endif
701
700
    RET
702
701
 
703
 
INIT_MMX
704
 
%ifdef ARCH_X86_64
 
702
INIT_MMX cpuname
 
703
%if ARCH_X86_64
705
704
;-----------------------------------------------------------------------------
706
705
; void deblock_h_luma_intra( uint8_t *pix, int stride, int alpha, int beta )
707
706
;-----------------------------------------------------------------------------
708
 
cglobal deblock_h_luma_intra_8_%1, 4,7
709
 
    movsxd r10, r1d
710
 
    lea    r11, [r10*3]
 
707
cglobal deblock_h_luma_intra_8, 4,9
 
708
    movsxd r7,  r1d
 
709
    lea    r8,  [r7*3]
711
710
    lea    r6,  [r0-4]
712
 
    lea    r5,  [r0-4+r11]
 
711
    lea    r5,  [r0-4+r8]
713
712
    sub    rsp, 0x88
714
713
    %define pix_tmp rsp
715
714
 
716
715
    ; transpose 8x16 -> tmp space
717
 
    TRANSPOSE8x8_MEM  PASS8ROWS(r6, r5, r10, r11), PASS8ROWS(pix_tmp, pix_tmp+0x30, 0x10, 0x30)
718
 
    lea    r6, [r6+r10*8]
719
 
    lea    r5, [r5+r10*8]
720
 
    TRANSPOSE8x8_MEM  PASS8ROWS(r6, r5, r10, r11), PASS8ROWS(pix_tmp+8, pix_tmp+0x38, 0x10, 0x30)
 
716
    TRANSPOSE8x8_MEM  PASS8ROWS(r6, r5, r7, r8), PASS8ROWS(pix_tmp, pix_tmp+0x30, 0x10, 0x30)
 
717
    lea    r6, [r6+r7*8]
 
718
    lea    r5, [r5+r7*8]
 
719
    TRANSPOSE8x8_MEM  PASS8ROWS(r6, r5, r7, r8), PASS8ROWS(pix_tmp+8, pix_tmp+0x38, 0x10, 0x30)
721
720
 
722
721
    lea    r0,  [pix_tmp+0x40]
723
722
    mov    r1,  0x10
724
 
    call   deblock_v_luma_intra_8_%1
 
723
    call   deblock_v_luma_intra_8
725
724
 
726
725
    ; transpose 16x6 -> original space (but we can't write only 6 pixels, so really 16x8)
727
 
    lea    r5, [r6+r11]
728
 
    TRANSPOSE8x8_MEM  PASS8ROWS(pix_tmp+8, pix_tmp+0x38, 0x10, 0x30), PASS8ROWS(r6, r5, r10, r11)
729
 
    shl    r10, 3
730
 
    sub    r6,  r10
731
 
    sub    r5,  r10
732
 
    shr    r10, 3
733
 
    TRANSPOSE8x8_MEM  PASS8ROWS(pix_tmp, pix_tmp+0x30, 0x10, 0x30), PASS8ROWS(r6, r5, r10, r11)
 
726
    lea    r5, [r6+r8]
 
727
    TRANSPOSE8x8_MEM  PASS8ROWS(pix_tmp+8, pix_tmp+0x38, 0x10, 0x30), PASS8ROWS(r6, r5, r7, r8)
 
728
    shl    r7,  3
 
729
    sub    r6,  r7
 
730
    sub    r5,  r7
 
731
    shr    r7,  3
 
732
    TRANSPOSE8x8_MEM  PASS8ROWS(pix_tmp, pix_tmp+0x30, 0x10, 0x30), PASS8ROWS(r6, r5, r7, r8)
734
733
    add    rsp, 0x88
735
734
    RET
736
735
%else
737
 
cglobal deblock_h_luma_intra_8_%1, 2,4
 
736
cglobal deblock_h_luma_intra_8, 2,4,8,0x80
738
737
    lea    r3,  [r1*3]
739
738
    sub    r0,  4
740
739
    lea    r2,  [r0+r3]
741
 
%assign pad 0x8c-(stack_offset&15)
742
 
    SUB    rsp, pad
743
740
    %define pix_tmp rsp
744
741
 
745
742
    ; transpose 8x16 -> tmp space
753
750
    PUSH   dword r2m
754
751
    PUSH   dword 16
755
752
    PUSH   r0
756
 
    call   deblock_%2_luma_intra_8_%1
757
 
%ifidn %2, v8
 
753
    call   deblock_%1_luma_intra_8
 
754
%ifidn %1, v8
758
755
    add    dword [rsp], 8 ; pix_tmp+8
759
 
    call   deblock_%2_luma_intra_8_%1
 
756
    call   deblock_%1_luma_intra_8
760
757
%endif
761
758
    ADD    esp, 16
762
759
 
770
767
    lea    r0,  [r0+r1*8]
771
768
    lea    r2,  [r2+r1*8]
772
769
    TRANSPOSE8x8_MEM  PASS8ROWS(pix_tmp+8, pix_tmp+0x38, 0x10, 0x30), PASS8ROWS(r0, r2, r1, r3)
773
 
    ADD    rsp, pad
774
770
    RET
775
771
%endif ; ARCH_X86_64
776
772
%endmacro ; DEBLOCK_LUMA_INTRA
777
773
 
778
 
INIT_XMM
779
 
DEBLOCK_LUMA_INTRA sse2, v
780
 
INIT_AVX
781
 
DEBLOCK_LUMA_INTRA avx , v
782
 
%ifndef ARCH_X86_64
783
 
INIT_MMX
784
 
DEBLOCK_LUMA_INTRA mmxext, v8
 
774
INIT_XMM sse2
 
775
DEBLOCK_LUMA_INTRA v
 
776
INIT_XMM avx
 
777
DEBLOCK_LUMA_INTRA v
 
778
%if ARCH_X86_64 == 0
 
779
INIT_MMX mmxext
 
780
DEBLOCK_LUMA_INTRA v8
785
781
%endif
786
782
 
787
 
INIT_MMX
 
783
INIT_MMX mmxext
788
784
 
789
785
%macro CHROMA_V_START 0
790
786
    dec    r2d      ; alpha-1
809
805
;-----------------------------------------------------------------------------
810
806
; void ff_deblock_v_chroma( uint8_t *pix, int stride, int alpha, int beta, int8_t *tc0 )
811
807
;-----------------------------------------------------------------------------
812
 
cglobal deblock_v_chroma_8_mmxext, 5,6
 
808
cglobal deblock_v_chroma_8, 5,6
813
809
    CHROMA_V_START
814
810
    movq  m0, [t5]
815
811
    movq  m1, [t5+r1]
823
819
;-----------------------------------------------------------------------------
824
820
; void ff_deblock_h_chroma( uint8_t *pix, int stride, int alpha, int beta, int8_t *tc0 )
825
821
;-----------------------------------------------------------------------------
826
 
cglobal deblock_h_chroma_8_mmxext, 5,7
827
 
%ifdef ARCH_X86_64
 
822
cglobal deblock_h_chroma_8, 5,7
 
823
%if UNIX64
828
824
    %define buf0 [rsp-24]
829
825
    %define buf1 [rsp-16]
 
826
%elif WIN64
 
827
    sub   rsp, 16
 
828
    %define buf0 [rsp]
 
829
    %define buf1 [rsp+8]
830
830
%else
831
831
    %define buf0 r0m
832
832
    %define buf1 r2m
839
839
    movq  m0, buf0
840
840
    movq  m3, buf1
841
841
    TRANSPOSE8x4B_STORE PASS8ROWS(t5, r0, r1, t6)
 
842
%if WIN64
 
843
    add   rsp, 16
 
844
%endif
842
845
    RET
843
846
 
844
847
ALIGN 16
869
872
;-----------------------------------------------------------------------------
870
873
; void ff_deblock_v_chroma_intra( uint8_t *pix, int stride, int alpha, int beta )
871
874
;-----------------------------------------------------------------------------
872
 
cglobal deblock_v_chroma_intra_8_mmxext, 4,5
 
875
cglobal deblock_v_chroma_intra_8, 4,5
873
876
    CHROMA_V_START
874
877
    movq  m0, [t5]
875
878
    movq  m1, [t5+r1]
883
886
;-----------------------------------------------------------------------------
884
887
; void ff_deblock_h_chroma_intra( uint8_t *pix, int stride, int alpha, int beta )
885
888
;-----------------------------------------------------------------------------
886
 
cglobal deblock_h_chroma_intra_8_mmxext, 4,6
 
889
cglobal deblock_h_chroma_intra_8, 4,6
887
890
    CHROMA_H_START
888
891
    TRANSPOSE4x8_LOAD  bw, wd, dq, PASS8ROWS(t5, r0, r1, t6)
889
892
    call ff_chroma_intra_body_mmxext
904
907
    paddb  m1, m5
905
908
    paddb  m2, m6
906
909
    ret
 
910
 
 
911
;-----------------------------------------------------------------------------
 
912
; void h264_loop_filter_strength(int16_t bs[2][4][4], uint8_t nnz[40],
 
913
;                                int8_t ref[2][40], int16_t mv[2][40][2],
 
914
;                                int bidir,    int edges,    int step,
 
915
;                                int mask_mv0, int mask_mv1, int field);
 
916
;
 
917
; bidir    is 0 or 1
 
918
; edges    is 1 or 4
 
919
; step     is 1 or 2
 
920
; mask_mv0 is 0 or 3
 
921
; mask_mv1 is 0 or 1
 
922
; field    is 0 or 1
 
923
;-----------------------------------------------------------------------------
 
924
%macro loop_filter_strength_iteration 7 ; edges, step, mask_mv,
 
925
                                        ; dir, d_idx, mask_dir, bidir
 
926
%define edgesd    %1
 
927
%define stepd     %2
 
928
%define mask_mvd  %3
 
929
%define dir       %4
 
930
%define d_idx     %5
 
931
%define mask_dir  %6
 
932
%define bidir     %7
 
933
    xor          b_idxd, b_idxd ; for (b_idx = 0; b_idx < edges; b_idx += step)
 
934
%%.b_idx_loop:
 
935
%if mask_dir == 0
 
936
    pxor             m0, m0
 
937
%endif
 
938
    test         b_idxd, dword mask_mvd
 
939
    jnz %%.skip_loop_iter                       ; if (!(b_idx & mask_mv))
 
940
%if bidir == 1
 
941
    movd             m2, [refq+b_idxq+d_idx+12] ; { ref0[bn] }
 
942
    punpckldq        m2, [refq+b_idxq+d_idx+52] ; { ref0[bn], ref1[bn] }
 
943
    pshufw           m0, [refq+b_idxq+12], 0x44 ; { ref0[b],  ref0[b]  }
 
944
    pshufw           m1, [refq+b_idxq+52], 0x44 ; { ref1[b],  ref1[b]  }
 
945
    pshufw           m3, m2, 0x4E               ; { ref1[bn], ref0[bn] }
 
946
    psubb            m0, m2                     ; { ref0[b] != ref0[bn],
 
947
                                                ;   ref0[b] != ref1[bn] }
 
948
    psubb            m1, m3                     ; { ref1[b] != ref1[bn],
 
949
                                                ;   ref1[b] != ref0[bn] }
 
950
 
 
951
    por              m0, m1
 
952
    mova             m1, [mvq+b_idxq*4+(d_idx+12)*4]
 
953
    mova             m2, [mvq+b_idxq*4+(d_idx+12)*4+mmsize]
 
954
    mova             m3, m1
 
955
    mova             m4, m2
 
956
    psubw            m1, [mvq+b_idxq*4+12*4]
 
957
    psubw            m2, [mvq+b_idxq*4+12*4+mmsize]
 
958
    psubw            m3, [mvq+b_idxq*4+52*4]
 
959
    psubw            m4, [mvq+b_idxq*4+52*4+mmsize]
 
960
    packsswb         m1, m2
 
961
    packsswb         m3, m4
 
962
    paddb            m1, m6
 
963
    paddb            m3, m6
 
964
    psubusb          m1, m5 ; abs(mv[b] - mv[bn]) >= limit
 
965
    psubusb          m3, m5
 
966
    packsswb         m1, m3
 
967
 
 
968
    por              m0, m1
 
969
    mova             m1, [mvq+b_idxq*4+(d_idx+52)*4]
 
970
    mova             m2, [mvq+b_idxq*4+(d_idx+52)*4+mmsize]
 
971
    mova             m3, m1
 
972
    mova             m4, m2
 
973
    psubw            m1, [mvq+b_idxq*4+12*4]
 
974
    psubw            m2, [mvq+b_idxq*4+12*4+mmsize]
 
975
    psubw            m3, [mvq+b_idxq*4+52*4]
 
976
    psubw            m4, [mvq+b_idxq*4+52*4+mmsize]
 
977
    packsswb         m1, m2
 
978
    packsswb         m3, m4
 
979
    paddb            m1, m6
 
980
    paddb            m3, m6
 
981
    psubusb          m1, m5 ; abs(mv[b] - mv[bn]) >= limit
 
982
    psubusb          m3, m5
 
983
    packsswb         m1, m3
 
984
 
 
985
    pshufw           m1, m1, 0x4E
 
986
    por              m0, m1
 
987
    pshufw           m1, m0, 0x4E
 
988
    pminub           m0, m1
 
989
%else ; bidir == 0
 
990
    movd             m0, [refq+b_idxq+12]
 
991
    psubb            m0, [refq+b_idxq+d_idx+12] ; ref[b] != ref[bn]
 
992
 
 
993
    mova             m1, [mvq+b_idxq*4+12*4]
 
994
    mova             m2, [mvq+b_idxq*4+12*4+mmsize]
 
995
    psubw            m1, [mvq+b_idxq*4+(d_idx+12)*4]
 
996
    psubw            m2, [mvq+b_idxq*4+(d_idx+12)*4+mmsize]
 
997
    packsswb         m1, m2
 
998
    paddb            m1, m6
 
999
    psubusb          m1, m5 ; abs(mv[b] - mv[bn]) >= limit
 
1000
    packsswb         m1, m1
 
1001
    por              m0, m1
 
1002
%endif ; bidir == 1/0
 
1003
 
 
1004
%%.skip_loop_iter:
 
1005
    movd             m1, [nnzq+b_idxq+12]
 
1006
    por              m1, [nnzq+b_idxq+d_idx+12] ; nnz[b] || nnz[bn]
 
1007
 
 
1008
    pminub           m1, m7
 
1009
    pminub           m0, m7
 
1010
    psllw            m1, 1
 
1011
    pxor             m2, m2
 
1012
    pmaxub           m1, m0
 
1013
    punpcklbw        m1, m2
 
1014
    movq [bsq+b_idxq+32*dir], m1
 
1015
 
 
1016
    add          b_idxd, dword stepd
 
1017
    cmp          b_idxd, dword edgesd
 
1018
    jl %%.b_idx_loop
 
1019
%endmacro
 
1020
 
 
1021
INIT_MMX mmxext
 
1022
cglobal h264_loop_filter_strength, 9, 9, 0, bs, nnz, ref, mv, bidir, edges, \
 
1023
                                            step, mask_mv0, mask_mv1, field
 
1024
%define b_idxq bidirq
 
1025
%define b_idxd bidird
 
1026
    cmp    dword fieldm, 0
 
1027
    mova             m7, [pb_1]
 
1028
    mova             m5, [pb_3]
 
1029
    je .nofield
 
1030
    mova             m5, [pb_3_1]
 
1031
.nofield:
 
1032
    mova             m6, m5
 
1033
    paddb            m5, m5
 
1034
 
 
1035
    shl     dword stepd, 3
 
1036
    shl    dword edgesd, 3
 
1037
%if ARCH_X86_32
 
1038
%define mask_mv0d mask_mv0m
 
1039
%define mask_mv1d mask_mv1m
 
1040
%endif
 
1041
    shl dword mask_mv1d, 3
 
1042
    shl dword mask_mv0d, 3
 
1043
 
 
1044
    cmp    dword bidird, 0
 
1045
    jne .bidir
 
1046
    loop_filter_strength_iteration edgesd, stepd, mask_mv1d, 1, -8,  0, 0
 
1047
    loop_filter_strength_iteration     32,     8, mask_mv0d, 0, -1, -1, 0
 
1048
 
 
1049
    mova             m0, [bsq+mmsize*0]
 
1050
    mova             m1, [bsq+mmsize*1]
 
1051
    mova             m2, [bsq+mmsize*2]
 
1052
    mova             m3, [bsq+mmsize*3]
 
1053
    TRANSPOSE4x4W 0, 1, 2, 3, 4
 
1054
    mova  [bsq+mmsize*0], m0
 
1055
    mova  [bsq+mmsize*1], m1
 
1056
    mova  [bsq+mmsize*2], m2
 
1057
    mova  [bsq+mmsize*3], m3
 
1058
    RET
 
1059
 
 
1060
.bidir:
 
1061
    loop_filter_strength_iteration edgesd, stepd, mask_mv1d, 1, -8,  0, 1
 
1062
    loop_filter_strength_iteration     32,     8, mask_mv0d, 0, -1, -1, 1
 
1063
 
 
1064
    mova             m0, [bsq+mmsize*0]
 
1065
    mova             m1, [bsq+mmsize*1]
 
1066
    mova             m2, [bsq+mmsize*2]
 
1067
    mova             m3, [bsq+mmsize*3]
 
1068
    TRANSPOSE4x4W 0, 1, 2, 3, 4
 
1069
    mova  [bsq+mmsize*0], m0
 
1070
    mova  [bsq+mmsize*1], m1
 
1071
    mova  [bsq+mmsize*2], m2
 
1072
    mova  [bsq+mmsize*3], m3
 
1073
    RET