[svn] / branches / dev-api-4 / xvidcore / src / dct / x86_asm / idct_mmx.asm Repository:
ViewVC logotype

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

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

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