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

« back to all changes in this revision

Viewing changes to libavcodec/x86/x86inc.asm

  • Committer: Bazaar Package Importer
  • Author(s): Reinhard Tartler, Jonathan Nieder, Reinhard Tartler
  • Date: 2011-05-13 12:31:33 UTC
  • mfrom: (1.2.2 upstream)
  • mto: (1.3.4 sid)
  • mto: This revision was merged to the branch mainline in revision 4.
  • Revision ID: james.westby@ubuntu.com-20110513123133-zqcsj91sf5489y4s
Tags: 4:0.7~beta2-1
[ Jonathan Nieder ]
* only install doc/APIChanges in *-dev and libav-doc packages
* move note on source package lineage to README.Debian
* install NEWS.Debian in libavcodec-dev
* use dpkg source format 3.0 (quilt)
* allow "debian/rules clean" as unprivileged user

[ Reinhard Tartler ]
* New upstream release

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
;*****************************************************************************
2
2
;* x86inc.asm
3
3
;*****************************************************************************
4
 
;* Copyright (C) 2005-2008 x264 project
 
4
;* Copyright (C) 2005-2011 x264 project
5
5
;*
6
6
;* Authors: Loren Merritt <lorenm@u.washington.edu>
7
7
;*          Anton Mitrofanov <BugMaster@narod.ru>
 
8
;*          Jason Garrett-Glaser <darkshikari@gmail.com>
8
9
;*
9
10
;* Permission to use, copy, modify, and/or distribute this software for any
10
11
;* purpose with or without fee is hereby granted, provided that the above
499
500
%endmacro
500
501
 
501
502
%macro INIT_MMX 0
 
503
    %assign avx_enabled 0
502
504
    %define RESET_MM_PERMUTATION INIT_MMX
503
505
    %define mmsize 8
504
506
    %define num_mmregs 8
520
522
%endmacro
521
523
 
522
524
%macro INIT_XMM 0
 
525
    %assign avx_enabled 0
523
526
    %define RESET_MM_PERMUTATION INIT_XMM
524
527
    %define mmsize 16
525
528
    %define num_mmregs 8
538
541
    %endrep
539
542
%endmacro
540
543
 
 
544
%macro INIT_AVX 0
 
545
    INIT_XMM
 
546
    %assign avx_enabled 1
 
547
    %define PALIGNR PALIGNR_SSSE3
 
548
    %define RESET_MM_PERMUTATION INIT_AVX
 
549
%endmacro
 
550
 
 
551
%macro INIT_YMM 0
 
552
    %assign avx_enabled 1
 
553
    %define RESET_MM_PERMUTATION INIT_YMM
 
554
    %define mmsize 32
 
555
    %define num_mmregs 8
 
556
    %ifdef ARCH_X86_64
 
557
    %define num_mmregs 16
 
558
    %endif
 
559
    %define mova vmovaps
 
560
    %define movu vmovups
 
561
    %assign %%i 0
 
562
    %rep num_mmregs
 
563
    CAT_XDEFINE m, %%i, ymm %+ %%i
 
564
    CAT_XDEFINE nymm, %%i, %%i
 
565
    %assign %%i %%i+1
 
566
    %endrep
 
567
%endmacro
 
568
 
541
569
INIT_MMX
542
570
 
543
571
; I often want to use macros that permute their arguments. e.g. there's no
645
673
        sub %1, %2
646
674
    %endif
647
675
%endmacro
 
676
 
 
677
;=============================================================================
 
678
; AVX abstraction layer
 
679
;=============================================================================
 
680
 
 
681
%assign i 0
 
682
%rep 16
 
683
    %if i < 8
 
684
        CAT_XDEFINE sizeofmm, i, 8
 
685
    %endif
 
686
    CAT_XDEFINE sizeofxmm, i, 16
 
687
    CAT_XDEFINE sizeofymm, i, 32
 
688
%assign i i+1
 
689
%endrep
 
690
%undef i
 
691
 
 
692
;%1 == instruction
 
693
;%2 == 1 if float, 0 if int
 
694
;%3 == 0 if 3-operand (xmm, xmm, xmm), 1 if 4-operand (xmm, xmm, xmm, imm)
 
695
;%4 == number of operands given
 
696
;%5+: operands
 
697
%macro RUN_AVX_INSTR 6-7+
 
698
    %if sizeof%5==32
 
699
        v%1 %5, %6, %7
 
700
    %else
 
701
        %if sizeof%5==8
 
702
            %define %%regmov movq
 
703
        %elif %2
 
704
            %define %%regmov movaps
 
705
        %else
 
706
            %define %%regmov movdqa
 
707
        %endif
 
708
 
 
709
        %if %4>=3+%3
 
710
            %ifnidn %5, %6
 
711
                %if avx_enabled && sizeof%5==16
 
712
                    v%1 %5, %6, %7
 
713
                %else
 
714
                    %%regmov %5, %6
 
715
                    %1 %5, %7
 
716
                %endif
 
717
            %else
 
718
                %1 %5, %7
 
719
            %endif
 
720
        %elif %3
 
721
            %1 %5, %6, %7
 
722
        %else
 
723
            %1 %5, %6
 
724
        %endif
 
725
    %endif
 
726
%endmacro
 
727
 
 
728
;%1 == instruction
 
729
;%2 == 1 if float, 0 if int
 
730
;%3 == 0 if 3-operand (xmm, xmm, xmm), 1 if 4-operand (xmm, xmm, xmm, imm)
 
731
%macro AVX_INSTR 3
 
732
    %macro %1 2-8 fnord, fnord, fnord, %1, %2, %3
 
733
        %ifidn %3, fnord
 
734
            RUN_AVX_INSTR %6, %7, %8, 2, %1, %2
 
735
        %elifidn %4, fnord
 
736
            RUN_AVX_INSTR %6, %7, %8, 3, %1, %2, %3
 
737
        %elifidn %5, fnord
 
738
            RUN_AVX_INSTR %6, %7, %8, 4, %1, %2, %3, %4
 
739
        %else
 
740
            RUN_AVX_INSTR %6, %7, %8, 5, %1, %2, %3, %4, %5
 
741
        %endif
 
742
    %endmacro
 
743
%endmacro
 
744
 
 
745
AVX_INSTR addpd, 1, 0
 
746
AVX_INSTR addps, 1, 0
 
747
AVX_INSTR addsd, 1, 0
 
748
AVX_INSTR addss, 1, 0
 
749
AVX_INSTR addsubpd, 1, 0
 
750
AVX_INSTR addsubps, 1, 0
 
751
AVX_INSTR andpd, 1, 0
 
752
AVX_INSTR andps, 1, 0
 
753
AVX_INSTR andnpd, 1, 0
 
754
AVX_INSTR andnps, 1, 0
 
755
AVX_INSTR blendpd, 1, 0
 
756
AVX_INSTR blendps, 1, 0
 
757
AVX_INSTR blendvpd, 1, 0
 
758
AVX_INSTR blendvps, 1, 0
 
759
AVX_INSTR cmppd, 1, 0
 
760
AVX_INSTR cmpps, 1, 0
 
761
AVX_INSTR cmpsd, 1, 0
 
762
AVX_INSTR cmpss, 1, 0
 
763
AVX_INSTR divpd, 1, 0
 
764
AVX_INSTR divps, 1, 0
 
765
AVX_INSTR divsd, 1, 0
 
766
AVX_INSTR divss, 1, 0
 
767
AVX_INSTR dppd, 1, 0
 
768
AVX_INSTR dpps, 1, 0
 
769
AVX_INSTR haddpd, 1, 0
 
770
AVX_INSTR haddps, 1, 0
 
771
AVX_INSTR hsubpd, 1, 0
 
772
AVX_INSTR hsubps, 1, 0
 
773
AVX_INSTR maxpd, 1, 0
 
774
AVX_INSTR maxps, 1, 0
 
775
AVX_INSTR maxsd, 1, 0
 
776
AVX_INSTR maxss, 1, 0
 
777
AVX_INSTR minpd, 1, 0
 
778
AVX_INSTR minps, 1, 0
 
779
AVX_INSTR minsd, 1, 0
 
780
AVX_INSTR minss, 1, 0
 
781
AVX_INSTR mpsadbw, 0, 1
 
782
AVX_INSTR mulpd, 1, 0
 
783
AVX_INSTR mulps, 1, 0
 
784
AVX_INSTR mulsd, 1, 0
 
785
AVX_INSTR mulss, 1, 0
 
786
AVX_INSTR orpd, 1, 0
 
787
AVX_INSTR orps, 1, 0
 
788
AVX_INSTR packsswb, 0, 0
 
789
AVX_INSTR packssdw, 0, 0
 
790
AVX_INSTR packuswb, 0, 0
 
791
AVX_INSTR packusdw, 0, 0
 
792
AVX_INSTR paddb, 0, 0
 
793
AVX_INSTR paddw, 0, 0
 
794
AVX_INSTR paddd, 0, 0
 
795
AVX_INSTR paddq, 0, 0
 
796
AVX_INSTR paddsb, 0, 0
 
797
AVX_INSTR paddsw, 0, 0
 
798
AVX_INSTR paddusb, 0, 0
 
799
AVX_INSTR paddusw, 0, 0
 
800
AVX_INSTR palignr, 0, 1
 
801
AVX_INSTR pand, 0, 0
 
802
AVX_INSTR pandn, 0, 0
 
803
AVX_INSTR pavgb, 0, 0
 
804
AVX_INSTR pavgw, 0, 0
 
805
AVX_INSTR pblendvb, 0, 0
 
806
AVX_INSTR pblendw, 0, 1
 
807
AVX_INSTR pcmpestri, 0, 0
 
808
AVX_INSTR pcmpestrm, 0, 0
 
809
AVX_INSTR pcmpistri, 0, 0
 
810
AVX_INSTR pcmpistrm, 0, 0
 
811
AVX_INSTR pcmpeqb, 0, 0
 
812
AVX_INSTR pcmpeqw, 0, 0
 
813
AVX_INSTR pcmpeqd, 0, 0
 
814
AVX_INSTR pcmpeqq, 0, 0
 
815
AVX_INSTR pcmpgtb, 0, 0
 
816
AVX_INSTR pcmpgtw, 0, 0
 
817
AVX_INSTR pcmpgtd, 0, 0
 
818
AVX_INSTR pcmpgtq, 0, 0
 
819
AVX_INSTR phaddw, 0, 0
 
820
AVX_INSTR phaddd, 0, 0
 
821
AVX_INSTR phaddsw, 0, 0
 
822
AVX_INSTR phsubw, 0, 0
 
823
AVX_INSTR phsubd, 0, 0
 
824
AVX_INSTR phsubsw, 0, 0
 
825
AVX_INSTR pmaddwd, 0, 0
 
826
AVX_INSTR pmaddubsw, 0, 0
 
827
AVX_INSTR pmaxsb, 0, 0
 
828
AVX_INSTR pmaxsw, 0, 0
 
829
AVX_INSTR pmaxsd, 0, 0
 
830
AVX_INSTR pmaxub, 0, 0
 
831
AVX_INSTR pmaxuw, 0, 0
 
832
AVX_INSTR pmaxud, 0, 0
 
833
AVX_INSTR pminsb, 0, 0
 
834
AVX_INSTR pminsw, 0, 0
 
835
AVX_INSTR pminsd, 0, 0
 
836
AVX_INSTR pminub, 0, 0
 
837
AVX_INSTR pminuw, 0, 0
 
838
AVX_INSTR pminud, 0, 0
 
839
AVX_INSTR pmulhuw, 0, 0
 
840
AVX_INSTR pmulhrsw, 0, 0
 
841
AVX_INSTR pmulhw, 0, 0
 
842
AVX_INSTR pmullw, 0, 0
 
843
AVX_INSTR pmulld, 0, 0
 
844
AVX_INSTR pmuludq, 0, 0
 
845
AVX_INSTR pmuldq, 0, 0
 
846
AVX_INSTR por, 0, 0
 
847
AVX_INSTR psadbw, 0, 0
 
848
AVX_INSTR pshufb, 0, 0
 
849
AVX_INSTR psignb, 0, 0
 
850
AVX_INSTR psignw, 0, 0
 
851
AVX_INSTR psignd, 0, 0
 
852
AVX_INSTR psllw, 0, 0
 
853
AVX_INSTR pslld, 0, 0
 
854
AVX_INSTR psllq, 0, 0
 
855
AVX_INSTR pslldq, 0, 0
 
856
AVX_INSTR psraw, 0, 0
 
857
AVX_INSTR psrad, 0, 0
 
858
AVX_INSTR psrlw, 0, 0
 
859
AVX_INSTR psrld, 0, 0
 
860
AVX_INSTR psrlq, 0, 0
 
861
AVX_INSTR psrldq, 0, 0
 
862
AVX_INSTR psubb, 0, 0
 
863
AVX_INSTR psubw, 0, 0
 
864
AVX_INSTR psubd, 0, 0
 
865
AVX_INSTR psubq, 0, 0
 
866
AVX_INSTR psubsb, 0, 0
 
867
AVX_INSTR psubsw, 0, 0
 
868
AVX_INSTR psubusb, 0, 0
 
869
AVX_INSTR psubusw, 0, 0
 
870
AVX_INSTR punpckhbw, 0, 0
 
871
AVX_INSTR punpckhwd, 0, 0
 
872
AVX_INSTR punpckhdq, 0, 0
 
873
AVX_INSTR punpckhqdq, 0, 0
 
874
AVX_INSTR punpcklbw, 0, 0
 
875
AVX_INSTR punpcklwd, 0, 0
 
876
AVX_INSTR punpckldq, 0, 0
 
877
AVX_INSTR punpcklqdq, 0, 0
 
878
AVX_INSTR pxor, 0, 0
 
879
AVX_INSTR shufps, 0, 1
 
880
AVX_INSTR subpd, 1, 0
 
881
AVX_INSTR subps, 1, 0
 
882
AVX_INSTR subsd, 1, 0
 
883
AVX_INSTR subss, 1, 0
 
884
AVX_INSTR unpckhpd, 1, 0
 
885
AVX_INSTR unpckhps, 1, 0
 
886
AVX_INSTR unpcklpd, 1, 0
 
887
AVX_INSTR unpcklps, 1, 0
 
888
AVX_INSTR xorpd, 1, 0
 
889
AVX_INSTR xorps, 1, 0
 
890
 
 
891
; 3DNow instructions, for sharing code between AVX, SSE and 3DN
 
892
AVX_INSTR pfadd, 1, 0
 
893
AVX_INSTR pfsub, 1, 0
 
894
AVX_INSTR pfmul, 1, 0