[svn] / trunk / xvidcore / src / quant / x86_asm / quantize_mmx.asm Repository:
ViewVC logotype

Diff of /trunk/xvidcore/src/quant/x86_asm/quantize_mmx.asm

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

revision 3, Fri Mar 8 02:46:11 2002 UTC revision 135, Wed Apr 24 12:21:43 2002 UTC
# Line 32  Line 32 
32  ; *  ; *
33  ; *     History:  ; *     History:
34  ; *  ; *
35    ; * 24.02.2002  sse2 quant_intra / dequant_intra (have to use movdqu ???)
36    ; * 17.04.2002  sse2 quant_inter / dequant_inter
37  ; * 26.12.2001  minor bug fixes, dequant saturate, further optimization  ; * 26.12.2001  minor bug fixes, dequant saturate, further optimization
38  ; * 19.11.2001  quant_inter_mmx now returns sum of abs. coefficient values  ; * 19.11.2001  quant_inter_mmx now returns sum of abs. coefficient values
39  ; *     04.11.2001      nasm version; (c)2001 peter ross <pross@cs.rmit.edu.au>  ; *     04.11.2001      nasm version; (c)2001 peter ross <pross@cs.rmit.edu.au>
# Line 58  Line 60 
60          %endif          %endif
61  %endmacro  %endmacro
62    
63  plus_one times 4        dw       1  align 16
64    
65    plus_one times 8        dw       1
66    
67    
68  ;===========================================================================  ;===========================================================================
69  ;  ;
# Line 70  Line 75 
75  times 4 dw %1 / 2  times 4 dw %1 / 2
76  %endmacro  %endmacro
77    
78  align ALIGN  align 16
79  mmx_sub  mmx_sub
80                  MMX_SUB 1                  MMX_SUB 1
81                  MMX_SUB 2                  MMX_SUB 2
# Line 120  Line 125 
125  times 4 dw  (1 << 16) / (%1 * 2) + 1  times 4 dw  (1 << 16) / (%1 * 2) + 1
126  %endmacro  %endmacro
127    
128  align ALIGN  align 16
129  mmx_div  mmx_div
130                  MMX_DIV 1                  MMX_DIV 1
131                  MMX_DIV 2                  MMX_DIV 2
# Line 170  Line 175 
175  %endif  %endif
176  %endmacro  %endmacro
177    
178  align ALIGN  align 16
179  mmx_add  mmx_add
180                  MMX_ADD 1                  MMX_ADD 1
181                  MMX_ADD 2                  MMX_ADD 2
# Line 215  Line 220 
220  times 4 dw %1 * 2  times 4 dw %1 * 2
221  %endmacro  %endmacro
222    
223  align ALIGN  align 16
224  mmx_mul  mmx_mul
225                  MMX_MUL 1                  MMX_MUL 1
226                  MMX_MUL 2                  MMX_MUL 2
# Line 260  Line 265 
265  mmx_32768_minus_2048                            times 4 dw (32768-2048)  mmx_32768_minus_2048                            times 4 dw (32768-2048)
266  mmx_32767_minus_2047                            times 4 dw (32767-2047)  mmx_32767_minus_2047                            times 4 dw (32767-2047)
267    
268    align 16
269    sse2_pos_2047                                           times 8 dw 2047
270    sse2_neg_2048                                           times 8 dw -2048
271    
272    
273  section .text  section .text
274    
# Line 371  Line 380 
380    
381  ;===========================================================================  ;===========================================================================
382  ;  ;
383    ; void quant_intra_sse2(int16_t * coeff,
384    ;                                       const int16_t const * data,
385    ;                                       const uint32_t quant,
386    ;                                       const uint32_t dcscalar);
387    ;
388    ;===========================================================================
389    
390    align ALIGN
391    cglobal quant_intra_sse2
392    quant_intra_sse2
393    
394                    push    esi
395                    push    edi
396    
397                    mov             edi, [esp + 8 + 4]                      ; coeff
398                    mov             esi, [esp + 8 + 8]                      ; data
399                    mov             eax, [esp + 8 + 12]                     ; quant
400    
401                    xor             ecx, ecx
402                    cmp             al, 1
403                    jz              near .qas2_q1loop
404    
405    .qas2_not1
406                    movq    mm7, [mmx_div + eax*8 - 8]
407                    movq2dq xmm7, mm7
408                    movlhps xmm7, xmm7
409    
410    align 16
411    .qas2_loop
412                    movdqa  xmm0, [esi + ecx*8]                     ; xmm0 = [1st]
413                    movdqa  xmm3, [esi + ecx*8 + 16]        ; xmm3 = [2nd]
414                    pxor    xmm1, xmm1
415                    pxor    xmm4, xmm4
416                    pcmpgtw xmm1, xmm0
417                    pcmpgtw xmm4, xmm3
418                    pxor    xmm0, xmm1
419                    pxor    xmm3, xmm4
420                    psubw   xmm0, xmm1
421                    psubw   xmm3, xmm4
422                    pmulhw  xmm0, xmm7
423                    pmulhw  xmm3, xmm7
424                    pxor    xmm0, xmm1
425                    pxor    xmm3, xmm4
426                    psubw   xmm0, xmm1
427                    psubw   xmm3, xmm4
428                    movdqa  [edi + ecx*8], xmm0
429                    movdqa  [edi + ecx*8 + 16], xmm3
430    
431                    add             ecx, 4
432                    cmp             ecx, 16
433                    jnz     .qas2_loop
434    
435    .qas2_done
436                    mov     ecx, [esp + 8 + 16]     ; dcscalar
437                    mov     edx, ecx
438                    movsx   eax, word [esi]
439                    shr     edx, 1
440                    cmp             eax, 0
441                    jg              .qas2_gtzero
442    
443                    sub             eax, edx
444                    jmp             short .qas2_mul
445    .qas2_gtzero
446                    add             eax, edx
447    .qas2_mul
448                    cdq
449                    idiv    ecx
450    
451                    mov             [edi], ax
452    
453                    pop             edi
454                    pop             esi
455    
456                    ret
457    
458    align 16
459    .qas2_q1loop
460                    movdqa  xmm0, [esi + ecx*8]                     ; xmm0 = [1st]
461                    movdqa  xmm3, [esi + ecx*8 + 16]        ; xmm3 = [2nd]
462                    pxor    xmm1, xmm1
463                    pxor    xmm4, xmm4
464                    pcmpgtw xmm1, xmm0
465                    pcmpgtw xmm4, xmm3
466                    pxor    xmm0, xmm1
467                    pxor    xmm3, xmm4
468                    psubw   xmm0, xmm1
469                    psubw   xmm3, xmm4
470                    psrlw   xmm0, 1
471                    psrlw   xmm3, 1
472                    pxor    xmm0, xmm1
473                    pxor    xmm3, xmm4
474                    psubw   xmm0, xmm1
475                    psubw   xmm3, xmm4
476                    movdqa  [edi + ecx*8], xmm0
477                    movdqa  [edi + ecx*8 + 16], xmm3
478    
479                    add             ecx, 4
480                    cmp             ecx, 16
481                    jnz             .qas2_q1loop
482                    jmp             near .qas2_done
483    
484    
485    
486    ;===========================================================================
487    ;
488  ; uint32_t quant_inter_mmx(int16_t * coeff,  ; uint32_t quant_inter_mmx(int16_t * coeff,
489  ;                                       const int16_t const * data,  ;                                       const int16_t const * data,
490  ;                                       const uint32_t quant);  ;                                       const uint32_t quant);
# Line 476  Line 590 
590    
591  ;===========================================================================  ;===========================================================================
592  ;  ;
593    ; uint32_t quant_inter_sse2(int16_t * coeff,
594    ;                                       const int16_t const * data,
595    ;                                       const uint32_t quant);
596    ;
597    ;===========================================================================
598    
599    align 16
600    cglobal quant_inter_sse2
601                    quant_inter_sse2
602    
603                    push    esi
604                    push    edi
605    
606                    mov             edi, [esp + 8 + 4]                      ; coeff
607                    mov             esi, [esp + 8 + 8]                      ; data
608                    mov             eax, [esp + 8 + 12]                     ; quant
609    
610                    xor             ecx, ecx
611    
612                    pxor    xmm5, xmm5                                      ; sum
613    
614                    movq    mm0, [mmx_sub + eax*8 - 8]      ; sub
615                    movq2dq xmm6, mm0                                       ; load into low 8 bytes
616                    movlhps xmm6, xmm6                                      ; duplicate into high 8 bytes
617    
618                    cmp             al, 1
619                    jz              near .qes2_q1loop
620    
621    .qes2_not1
622                    movq    mm0, [mmx_div + eax*8 - 8]      ; divider
623                    movq2dq xmm7, mm0
624                    movlhps xmm7, xmm7
625    
626    align 16
627    .qes2_loop
628                    movdqa  xmm0, [esi + ecx*8]                     ; xmm0 = [1st]
629                    movdqa  xmm3, [esi + ecx*8 + 16]        ; xmm3 = [2nd]
630                    pxor    xmm1, xmm1
631                    pxor    xmm4, xmm4
632                    pcmpgtw xmm1, xmm0
633                    pcmpgtw xmm4, xmm3
634                    pxor    xmm0, xmm1
635                    pxor    xmm3, xmm4
636                    psubw   xmm0, xmm1
637                    psubw   xmm3, xmm4
638                    psubusw xmm0, xmm6
639                    psubusw xmm3, xmm6
640                    pmulhw  xmm0, xmm7
641                    pmulhw  xmm3, xmm7
642                    paddw   xmm5, xmm0
643                    pxor    xmm0, xmm1
644                    paddw   xmm5, xmm3
645                    pxor    xmm3, xmm4
646                    psubw   xmm0, xmm1
647                    psubw   xmm3, xmm4
648                    movdqa  [edi + ecx*8], xmm0
649                    movdqa  [edi + ecx*8 + 16], xmm3
650    
651                    add             ecx, 4
652                    cmp             ecx, 16
653                    jnz             .qes2_loop
654    
655    .qes2_done
656                    movdqu  xmm6, [plus_one]
657                    pmaddwd xmm5, xmm6
658                    movhlps xmm6, xmm5
659                    paddd   xmm5, xmm6
660                    movdq2q mm0, xmm5
661    
662                    movq    mm5, mm0
663                    psrlq   mm5, 32
664                    paddd   mm0, mm5
665                    movd    eax, mm0                                        ; return sum
666    
667                    pop             edi
668                    pop             esi
669    
670                    ret
671    
672    align 16
673    .qes2_q1loop
674                    movdqa  xmm0, [esi + ecx*8]                     ; xmm0 = [1st]
675                    movdqa  xmm3, [esi + ecx*8 + 16]        ; xmm3 = [2nd]
676                    pxor    xmm1, xmm1
677                    pxor    xmm4, xmm4
678                    pcmpgtw xmm1, xmm0
679                    pcmpgtw xmm4, xmm3
680                    pxor    xmm0, xmm1
681                    pxor    xmm3, xmm4
682                    psubw   xmm0, xmm1
683                    psubw   xmm3, xmm4
684                    psubusw xmm0, xmm6
685                    psubusw xmm3, xmm6
686                    psrlw   xmm0, 1
687                    psrlw   xmm3, 1
688                    paddw   xmm5, xmm0
689                    pxor    xmm0, xmm1
690                    paddw   xmm5, xmm3
691                    pxor    xmm3, xmm4
692                    psubw   xmm0, xmm1
693                    psubw   xmm3, xmm4
694                    movdqa  [edi + ecx*8], xmm0
695                    movdqa  [edi + ecx*8 + 16], xmm3
696    
697                    add             ecx,4
698                    cmp             ecx,16
699                    jnz             .qes2_q1loop
700                    jmp             .qes2_done
701    
702    
703    
704    ;===========================================================================
705    ;
706  ; void dequant_intra_mmx(int16_t *data,  ; void dequant_intra_mmx(int16_t *data,
707  ;                                       const int16_t const *coeff,  ;                                       const int16_t const *coeff,
708  ;                                       const uint32_t quant,  ;                                       const uint32_t quant,
# Line 576  Line 803 
803                  ret                  ret
804  %endif  %endif
805    
806    
807    
808    ;===========================================================================
809    ;
810    ; void dequant_intra_sse2(int16_t *data,
811    ;                                       const int16_t const *coeff,
812    ;                                       const uint32_t quant,
813    ;                                       const uint32_t dcscalar);
814    ;
815    ;===========================================================================
816    
817    align 16
818    cglobal dequant_intra_sse2
819    dequant_intra_sse2
820    
821                    push    esi
822                    push    edi
823    
824                    mov             edi, [esp + 8 + 4]                      ; data
825                    mov             esi, [esp + 8 + 8]                      ; coeff
826                    mov             eax, [esp + 8 + 12]                     ; quant
827    
828                    movq    mm6, [mmx_add + eax*8 - 8]
829                    movq    mm7, [mmx_mul + eax*8 - 8]
830                    movq2dq xmm6, mm6
831                    movq2dq xmm7, mm7
832                    movlhps xmm6, xmm6
833                    movlhps xmm7, xmm7
834    
835                    xor             eax, eax
836    
837    align 16
838    .das2_loop
839                    movdqa  xmm0, [esi + eax*8]
840                    movdqa  xmm3, [esi + eax*8 + 16]
841                    pxor    xmm1, xmm1
842                    pxor    xmm4, xmm4
843                    pcmpgtw xmm1, xmm0
844                    pcmpgtw xmm4, xmm3
845                    pxor    xmm2, xmm2
846                    pxor    xmm5, xmm5
847                    pcmpeqw xmm2, xmm0
848                    pcmpeqw xmm5, xmm3
849                    pandn   xmm2, xmm6
850                    pandn   xmm5, xmm6
851                    pxor    xmm0, xmm1
852                    pxor    xmm3, xmm4
853                    psubw   xmm0, xmm1
854                    psubw   xmm3, xmm4
855                    pmullw  xmm0, xmm7
856                    pmullw  xmm3, xmm7
857                    paddw   xmm0, xmm2
858                    paddw   xmm3, xmm5
859                    pxor    xmm0, xmm1
860                    pxor    xmm3, xmm4
861                    psubw   xmm0, xmm1
862                    psubw   xmm3, xmm4
863    
864    %ifdef SATURATE
865                    movdqu  xmm2, [sse2_pos_2047]
866                    movdqu  xmm4, [sse2_neg_2048]
867                    pminsw  xmm0, xmm2
868                    pminsw  xmm3, xmm2
869                    pmaxsw  xmm0, xmm4
870                    pmaxsw  xmm3, xmm4
871    %endif
872    
873                    movdqa  [edi + eax*8], xmm0
874                    movdqa  [edi + eax*8 + 16], xmm3
875    
876                    add             eax, 4
877                    cmp             eax, 16
878                    jnz             near .das2_loop
879    
880                    mov             ax, [esi]                                       ; ax = data[0]
881                    imul    ax, [esp + 8 + 16]                      ; eax = data[0] * dcscalar
882    
883    %ifdef SATURATE
884                    cmp             ax, -2048
885                    jl              .das2_set_n2048
886                    cmp             ax, 2047
887                    jg              .das2_set_2047
888    %endif
889                    mov             [edi], ax
890    
891                    pop             edi
892                    pop             esi
893                    ret
894    
895    %ifdef SATURATE
896    align 16
897    .das2_set_n2048
898                    mov             word [edi], -2048
899                    pop             edi
900                    pop             esi
901                    ret
902    
903    align 16
904    .das2_set_2047
905                    mov             word [edi], 2047
906                    pop             edi
907                    pop             esi
908                    ret
909    %endif
910    
911    
912    
913  ;===========================================================================  ;===========================================================================
914  ;  ;
915  ; void dequant_inter_mmx(int16_t * data,  ; void dequant_inter_mmx(int16_t * data,
# Line 650  Line 984 
984                  pop     esi                  pop     esi
985    
986                  ret                  ret
987    
988    
989    ;===========================================================================
990    ;
991    ; void dequant_inter_sse2(int16_t * data,
992    ;                                       const int16_t * const coeff,
993    ;                                       const uint32_t quant);
994    ;
995    ;===========================================================================
996    
997    align 16
998    cglobal dequant_inter_sse2
999    dequant_inter_sse2
1000    
1001                    push    esi
1002                    push    edi
1003    
1004                    mov     edi, [esp + 8 + 4]      ; data
1005                    mov     esi, [esp + 8 + 8]      ; coeff
1006                    mov     eax, [esp + 8 + 12]     ; quant
1007                    movq    mm6, [mmx_add + eax * 8 - 8]
1008                    movq    mm7, [mmx_mul + eax * 8 - 8]
1009    
1010                    movq2dq xmm6, mm6
1011                    movq2dq xmm7, mm7
1012                    movlhps xmm6, xmm6
1013                    movlhps xmm7, xmm7
1014    
1015                    xor eax, eax
1016    
1017    align 16
1018    .des2_loop
1019                    movdqa  xmm0, [esi + eax*8]                     ; xmm0 = [coeff]
1020                    movdqa  xmm3, [esi + eax*8 + 16]
1021                    pxor    xmm1, xmm1
1022                    pxor    xmm4, xmm4
1023                    pcmpgtw xmm1, xmm0
1024                    pcmpgtw xmm4, xmm3
1025                    pxor    xmm2, xmm2
1026                    pxor    xmm5, xmm5
1027                    pcmpeqw xmm2, xmm0
1028                    pcmpeqw xmm5, xmm3
1029                    pandn   xmm2, xmm6
1030                    pandn   xmm5, xmm6
1031                    pxor    xmm0, xmm1
1032                    pxor    xmm3, xmm4
1033                    psubw   xmm0, xmm1
1034                    psubw   xmm3, xmm4
1035                    pmullw  xmm0, xmm7
1036                    pmullw  xmm3, xmm7
1037                    paddw   xmm0, xmm2
1038                    paddw   xmm3, xmm5
1039                    pxor    xmm0, xmm1
1040                    pxor    xmm3, xmm4
1041                    psubw   xmm0, xmm1
1042                    psubw   xmm3, xmm4
1043    
1044    %ifdef SATURATE
1045                    movdqu  xmm2, [sse2_pos_2047]
1046                    movdqu  xmm4, [sse2_neg_2048]
1047                    pminsw  xmm0, xmm2
1048                    pminsw  xmm3, xmm2
1049                    pmaxsw  xmm0, xmm4
1050                    pmaxsw  xmm3, xmm4
1051    %endif
1052    
1053                    movdqa  [edi + eax*8], xmm0
1054                    movdqa  [edi + eax*8 + 16], xmm3
1055    
1056                    add eax, 4
1057                    cmp eax, 16
1058                    jnz     near .des2_loop
1059    
1060                    pop     edi
1061                    pop     esi
1062    
1063                    ret

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

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