[svn] / tags / branch-release-1-0 / xvidcore / src / dct / x86_asm / idct_mmx.asm Repository:
ViewVC logotype

Diff of /tags/branch-release-1-0/xvidcore/src/dct/x86_asm/idct_mmx.asm

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 3, Fri Mar 8 02:46:11 2002 UTC revision 154, Thu May 2 22:35:41 2002 UTC
# Line 45  Line 45 
45  %define RND_FRW_ROW     262144 * (BITS_FRW_ACC - 1)       ; 1 << (SHIFT_FRW_ROW-1)  %define RND_FRW_ROW     262144 * (BITS_FRW_ACC - 1)       ; 1 << (SHIFT_FRW_ROW-1)
46    
47    
48  section .data  section .data data align=16
49    
50  align 16  align 16
51    
# Line 753  Line 753 
753          DCT_8_INV_COL_4 eax+8, eax+8          DCT_8_INV_COL_4 eax+8, eax+8
754    
755          ret          ret
756    
757    ;=============================================================================
758    ;         The code below this line is for SSE2-equipped processors
759    ;         By Dmitry Rozhdestvensky
760    ;=============================================================================
761    
762    section .data
763    
764    align 16
765    
766    tab_i_04_s2 dw 16384, 21407, 16384, 8867 ; movq-> w05 w04 w01 w00
767                    dw 16384, -8867, 16384, -21407 ; w13 w12 w09 w08
768                    dw 16384, 8867, -16384, -21407 ; w07 w06 w03 w02
769                    dw -16384, 21407, 16384, -8867 ; w15 w14 w11 w10
770                    dw 22725, 19266, 19266, -4520 ; w21 w20 w17 w16
771                    dw 12873, -22725, 4520, -12873 ; w29 w28 w25 w24
772                    dw 12873, 4520, -22725, -12873 ; w23 w22 w19 w18
773                    dw 4520, 19266, 19266, -22725 ; w31 w30 w27 w26
774    
775    ; Table for rows 1,7 - constants are multiplied by cos_1_16
776    
777    tab_i_17_s2     dw 22725, 29692, 22725, 12299 ; movq-> w05 w04 w01 w00
778                    dw 22725, -12299, 22725, -29692 ; w13 w12 w09 w08
779                    dw 22725, 12299, -22725, -29692 ; w07 w06 w03 w02
780                    dw -22725, 29692, 22725, -12299 ; w15 w14 w11 w10
781                    dw 31521, 26722, 26722, -6270 ; w21 w20 w17 w16
782                    dw 17855, -31521, 6270, -17855 ; w29 w28 w25 w24
783                    dw 17855, 6270, -31521, -17855 ; w23 w22 w19 w18
784                    dw 6270, 26722, 26722, -31521 ; w31 w30 w27 w26
785    
786    ; Table for rows 2,6 - constants are multiplied by cos_2_16
787    
788    tab_i_26_s2     dw 21407, 27969, 21407, 11585 ; movq-> w05 w04 w01 w00
789                    dw 21407, -11585, 21407, -27969 ; w13 w12 w09 w08
790                    dw 21407, 11585, -21407, -27969 ; w07 w06 w03 w02
791                    dw -21407, 27969, 21407, -11585 ; w15 w14 w11 w10
792                    dw 29692, 25172, 25172, -5906 ; w21 w20 w17 w16
793                    dw 16819, -29692, 5906, -16819 ; w29 w28 w25 w24
794                    dw 16819, 5906, -29692, -16819 ; w23 w22 w19 w18
795                    dw 5906, 25172, 25172, -29692 ; w31 w30 w27 w26
796    
797    ; Table for rows 3,5 - constants are multiplied by cos_3_16
798    
799    tab_i_35_s2     dw 19266, 25172, 19266, 10426 ; movq-> w05 w04 w01 w00
800                    dw 19266, -10426, 19266, -25172 ; w13 w12 w09 w08
801                    dw 19266, 10426, -19266, -25172 ; w07 w06 w03 w02
802                    dw -19266, 25172, 19266, -10426 ; w15 w14 w11 w10
803                    dw 26722, 22654, 22654, -5315 ; w21 w20 w17 w16
804                    dw 15137, -26722, 5315, -15137 ; w29 w28 w25 w24
805                    dw 15137, 5315, -26722, -15137 ; w23 w22 w19 w18
806                    dw 5315, 22654, 22654, -26722 ; w31 w30 w27 w26
807    
808    %if SHIFT_INV_ROW == 12   ; assume SHIFT_INV_ROW == 12
809    rounder_2_0      dd  65536, 65536
810                     dd  65536, 65536
811    rounder_2_4      dd      0,     0
812                     dd      0,     0
813    rounder_2_1      dd   7195,  7195
814                     dd   7195,  7195
815    rounder_2_7      dd   1024,  1024
816                     dd   1024,  1024
817    rounder_2_2      dd   4520,  4520
818                     dd   4520,  4520
819    rounder_2_6      dd   1024,  1024
820                     dd   1024,  1024
821    rounder_2_3      dd   2407,  2407
822                     dd   2407,  2407
823    rounder_2_5      dd    240,   240
824                     dd    240,   240
825    
826    %elif SHIFT_INV_ROW == 11   ; assume SHIFT_INV_ROW == 11
827    rounder_2_0      dd  65536, 65536
828                     dd  65536, 65536
829    rounder_2_4      dd      0,     0
830                     dd      0,     0
831    rounder_2_1      dd   3597,  3597
832                     dd   3597,  3597
833    rounder_2_7      dd    512,   512
834                     dd    512,   512
835    rounder_2_2      dd   2260,  2260
836                     dd   2260,  2260
837    rounder_2_6      dd    512,   512
838                     dd    512,   512
839    rounder_2_3      dd   1203,  1203
840                     dd   1203,  1203
841    rounder_2_5      dd    120,   120
842                     dd    120,   120
843    %else
844    
845    %error invalid _SHIFT_INV_ROW_
846    
847    %endif
848    
849      tg_1_16_2     dw  13036,  13036,  13036,  13036       ; tg * (2<<16) + 0.5
850                    dw  13036,  13036,  13036,  13036
851      tg_2_16_2     dw  27146,  27146,  27146,  27146       ; tg * (2<<16) + 0.5
852                    dw  27146,  27146,  27146,  27146
853      tg_3_16_2     dw -21746, -21746, -21746, -21746       ; tg * (2<<16) + 0.5
854                    dw -21746, -21746, -21746, -21746
855    ocos_4_16_2     dw  23170,  23170,  23170,  23170       ; cos * (2<<15) + 0.5
856                    dw  23170,  23170,  23170,  23170
857    
858    %macro DCT_8_INV_ROW_1_sse2  4
859    
860            pshufhw         xmm1,[%1],11011000b     ;x 75643210
861            pshuflw         xmm1,xmm1,11011000b     ;x 75643120
862            pshufd          xmm0,xmm1,00000000b     ;x 20202020
863            pmaddwd         xmm0,[%3]               ;w 13 12 9 8 5410
864                                                            ;a 3210 first part
865    
866            pshufd          xmm2,xmm1,10101010b     ;x 64646464
867            pmaddwd         xmm2,[%3+16]            ;w 15 14 11 10 7632
868                                                            ;a 3210 second part
869    
870            paddd           xmm2,xmm0                       ;a 3210 ready
871            paddd           xmm2,[%4]               ;must be 4 dwords long, not 2 as for sse1
872            movdqa          xmm5,xmm2
873    
874            pshufd          xmm3,xmm1,01010101b     ;x 31313131
875            pmaddwd         xmm3,[%3+32]            ;w 29 28 25 24 21 20 17 16
876                                                            ;b 3210 first part
877    
878            pshufd          xmm4,xmm1,11111111b     ;x 75757575
879            pmaddwd         xmm4,[%3+48]            ;w 31 30 27 26 23 22 19 18
880                                                           ;b 3210 second part
881            paddd           xmm3,xmm4                       ;b 3210 ready
882    
883            paddd           xmm2,xmm3                       ;will be y 3210
884            psubd           xmm5,xmm3                       ;will be y 4567
885            psrad           xmm2,SHIFT_INV_ROW
886            psrad           xmm5,SHIFT_INV_ROW
887            packssdw        xmm2,xmm5                      ;y 45673210
888            pshufhw         xmm6,xmm2,00011011b     ;y 76543210
889            movdqa          [%2],xmm6
890    
891    %endmacro
892    
893    %macro DCT_8_INV_COL_4_sse2          2
894    
895            movdqa          xmm0,[%1+16*0]          ;x0 (all columns)
896            movdqa          xmm2,[%1+16*4]          ;x4
897            movdqa          xmm1,xmm0
898    
899            movdqa          xmm4,[%1+16*2]          ;x2
900            movdqa          xmm5,[%1+16*6]          ;x6
901            movdqa          xmm6,[tg_2_16_2]
902            movdqa          xmm7,xmm6
903    
904            paddsw          xmm0,xmm2                       ;u04=x0+x4
905            psubsw          xmm1,xmm2                       ;v04=x0-x4
906            movdqa          xmm3,xmm0
907            movdqa          xmm2,xmm1
908    
909            pmulhw          xmm6,xmm4
910            pmulhw          xmm7,xmm5
911            psubsw          xmm6,xmm5                       ;v26=x2*T2-x6
912            paddsw          xmm7,xmm4                       ;u26=x6*T2+x2
913    
914            paddsw          xmm1,xmm6                       ;a1=v04+v26
915            paddsw          xmm0,xmm7                       ;a0=u04+u26
916            psubsw          xmm2,xmm6                       ;a2=v04-v26
917            psubsw          xmm3,xmm7                       ;a3=u04-u26
918    
919            movdqa          [%2+16*0],xmm0          ;store a3-a0 to
920            movdqa          [%2+16*6],xmm1          ;free registers
921            movdqa          [%2+16*2],xmm2
922            movdqa          [%2+16*4],xmm3
923    
924            movdqa          xmm0,[%1+16*1]          ;x1
925            movdqa          xmm1,[%1+16*7]          ;x7
926            movdqa          xmm2,[tg_1_16_2]
927            movdqa          xmm3,xmm2
928    
929            movdqa          xmm4,[%1+16*3]          ;x3
930            movdqa          xmm5,[%1+16*5]          ;x5
931            movdqa          xmm6,[tg_3_16_2]
932            movdqa          xmm7,xmm6
933    
934            pmulhw          xmm2,xmm0
935            pmulhw          xmm3,xmm1
936            psubsw          xmm2,xmm1                       ;v17=x1*T1-x7
937            paddsw          xmm3,xmm0                       ;u17=x7*T1+x1
938            movdqa          xmm0,xmm3                       ;u17
939            movdqa          xmm1,xmm2                       ;v17
940    
941            pmulhw          xmm6,xmm4                       ;x3*(t3-1)
942            pmulhw          xmm7,xmm5                       ;x5*(t3-1)
943            paddsw          xmm6,xmm4
944            paddsw          xmm7,xmm5
945            psubsw          xmm6,xmm5                       ;v35=x3*T3-x5
946            paddsw          xmm7,xmm4                       ;u35=x5*T3+x3
947    
948            movdqa          xmm4,[ocos_4_16_2]
949    
950            paddsw          xmm0,xmm7                       ;b0=u17+u35
951            psubsw          xmm1,xmm6                       ;b3=v17-v35
952            psubsw          xmm3,xmm7                       ;u12=u17-v35
953            paddsw          xmm2,xmm6                       ;v12=v17+v35
954    
955            movdqa          xmm5,xmm3
956            paddsw          xmm3,xmm2                       ;tb1
957            psubsw          xmm5,xmm2                       ;tb2
958            pmulhw          xmm5,xmm4
959            pmulhw          xmm4,xmm3
960            paddsw          xmm5,xmm5
961            paddsw          xmm4,xmm4
962    
963            movdqa          xmm6,[%2+16*0]          ;a0
964            movdqa          xmm7,xmm6
965            movdqa          xmm2,[%2+16*4]          ;a3
966            movdqa          xmm3,xmm2
967    
968            paddsw          xmm6,xmm0
969            psubsw          xmm7,xmm0
970            psraw           xmm6,SHIFT_INV_COL      ;y0=a0+b0
971            psraw           xmm7,SHIFT_INV_COL      ;y7=a0-b0
972            movdqa          [%2+16*0],xmm6
973            movdqa          [%2+16*7],xmm7
974    
975            paddsw          xmm2,xmm1
976            psubsw          xmm3,xmm1
977            psraw           xmm2,SHIFT_INV_COL      ;y3=a3+b3
978            psraw           xmm3,SHIFT_INV_COL      ;y4=a3-b3
979            movdqa          [%2+16*3],xmm2
980            movdqa          [%2+16*4],xmm3
981    
982            movdqa          xmm0,[%2+16*6]          ;a1
983            movdqa          xmm1,xmm0
984            movdqa          xmm6,[%2+16*2]          ;a2
985            movdqa          xmm7,xmm6
986    
987    
988            paddsw          xmm0,xmm4
989            psubsw          xmm1,xmm4
990            psraw           xmm0,SHIFT_INV_COL      ;y1=a1+b1
991            psraw           xmm1,SHIFT_INV_COL      ;y6=a1-b1
992            movdqa          [%2+16*1],xmm0
993            movdqa          [%2+16*6],xmm1
994    
995            paddsw          xmm6,xmm5
996            psubsw          xmm7,xmm5
997            psraw           xmm6,SHIFT_INV_COL      ;y2=a2+b2
998            psraw           xmm7,SHIFT_INV_COL      ;y5=a2-b2
999            movdqa          [%2+16*2],xmm6
1000            movdqa          [%2+16*5],xmm7
1001    
1002    %endmacro
1003    
1004    section .text
1005    
1006    align 16
1007    cglobal idct_sse2
1008    idct_sse2
1009    
1010            mov eax, dword [esp + 4]
1011    
1012            DCT_8_INV_ROW_1_sse2 eax+0, eax+0, tab_i_04_s2, rounder_2_0
1013            DCT_8_INV_ROW_1_sse2 eax+16, eax+16, tab_i_17_s2, rounder_2_1
1014            DCT_8_INV_ROW_1_sse2 eax+32, eax+32, tab_i_26_s2, rounder_2_2
1015            DCT_8_INV_ROW_1_sse2 eax+48, eax+48, tab_i_35_s2, rounder_2_3
1016            DCT_8_INV_ROW_1_sse2 eax+64, eax+64, tab_i_04_s2, rounder_2_4
1017            DCT_8_INV_ROW_1_sse2 eax+80, eax+80, tab_i_35_s2, rounder_2_5
1018            DCT_8_INV_ROW_1_sse2 eax+96, eax+96, tab_i_26_s2, rounder_2_6
1019            DCT_8_INV_ROW_1_sse2 eax+112, eax+112, tab_i_17_s2, rounder_2_7
1020    
1021            DCT_8_INV_COL_4_sse2 eax, eax
1022            ;DCT_8_INV_COL_4 eax+8, eax+8
1023    
1024            ret

Legend:
Removed from v.3  
changed lines
  Added in v.154

No admin address has been configured
ViewVC Help
Powered by ViewVC 1.0.4