[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 134, Tue Apr 23 19:09:04 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 62  Line 64 
64    
65  plus_one times 8        dw       1  plus_one times 8        dw       1
66    
67    
68  ;===========================================================================  ;===========================================================================
69  ;  ;
70  ; subtract by Q/2 table  ; subtract by Q/2 table
# Line 377  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 508  Line 616 
616                  movlhps xmm6, xmm6                                      ; duplicate into high 8 bytes                  movlhps xmm6, xmm6                                      ; duplicate into high 8 bytes
617    
618                  cmp             al, 1                  cmp             al, 1
619                  jnz             .not1                  jz              near .qes2_q1loop
                 jmp             .q1loop  
620    
621  .not1  .qes2_not1
622                  movq    mm0, [mmx_div + eax*8 - 8]      ; divider                  movq    mm0, [mmx_div + eax*8 - 8]      ; divider
623                  movq2dq xmm7, mm0                  movq2dq xmm7, mm0
624                  movlhps xmm7, xmm7                  movlhps xmm7, xmm7
625    
626  align 16  align 16
627  .loop  .qes2_loop
628                  movdqa  xmm0, [esi + ecx*8]                     ; xmm0 = [1st]                  movdqa  xmm0, [esi + ecx*8]                     ; xmm0 = [1st]
629                  movdqa  xmm3, [esi + ecx*8 + 16]        ; xmm3 = [2nd]                  movdqa  xmm3, [esi + ecx*8 + 16]        ; xmm3 = [2nd]
630                  pxor    xmm1, xmm1                                      ; xmm1 = 0                  pxor    xmm1, xmm1
631                  pxor    xmm4, xmm4                  pxor    xmm4, xmm4
632                  pcmpgtw xmm1, xmm0                                      ; xmm1 = (0 > xmm0)                  pcmpgtw xmm1, xmm0
633                  pcmpgtw xmm4, xmm3                  pcmpgtw xmm4, xmm3
634                  pxor    xmm0, xmm1                                      ; xmm0 = |xmm0|                  pxor    xmm0, xmm1
635                  pxor    xmm3, xmm4                  pxor    xmm3, xmm4
636                  psubw   xmm0, xmm1                                      ; displace                  psubw   xmm0, xmm1
637                  psubw   xmm3, xmm4                  psubw   xmm3, xmm4
638                  psubusw xmm0, xmm6                                      ; xmm0 -= sub (unsigned, dont go < 0)                  psubusw xmm0, xmm6
639                  psubusw xmm3, xmm6                  psubusw xmm3, xmm6
640                  pmulhw  xmm0, xmm7                                      ; xmm0 = (xmm0 / 2Q) >> 16                  pmulhw  xmm0, xmm7
641                  pmulhw  xmm3, xmm7                  pmulhw  xmm3, xmm7
642                  paddw   xmm5, xmm0                                      ; sum += xmm0                  paddw   xmm5, xmm0
643                  pxor    xmm0, xmm1                                      ; xmm0 *= sign(xmm0)                  pxor    xmm0, xmm1
644                  paddw   xmm5, xmm3                  paddw   xmm5, xmm3
645                  pxor    xmm3, xmm4                  pxor    xmm3, xmm4
646                  psubw   xmm0, xmm1                                      ; undisplace                  psubw   xmm0, xmm1
647                  psubw   xmm3, xmm4                  psubw   xmm3, xmm4
648                  movdqa  [edi + ecx*8], xmm0                  movdqa  [edi + ecx*8], xmm0
649                  movdqa  [edi + ecx*8 + 16], xmm3                  movdqa  [edi + ecx*8 + 16], xmm3
650    
651                  add             ecx, 4                  add             ecx, 4
652                  cmp             ecx, 16                  cmp             ecx, 16
653                  jnz             .loop                  jnz             .qes2_loop
654    
655  .done  .qes2_done
656                  pmaddwd xmm5, [plus_one]                  movdqu  xmm6, [plus_one]
657                    pmaddwd xmm5, xmm6
658                  movhlps xmm6, xmm5                  movhlps xmm6, xmm5
659                  paddd   xmm5, xmm6                  paddd   xmm5, xmm6
660                  movdq2q mm0, xmm5                  movdq2q mm0, xmm5
# Line 562  Line 670 
670                  ret                  ret
671    
672  align 16  align 16
673  .q1loop  .qes2_q1loop
674                  movq    mm0, [esi + 8*ecx]              ; mm0 = [1st]                  movdqa  xmm0, [esi + ecx*8]                     ; xmm0 = [1st]
675                  movq    mm3, [esi + 8*ecx+ 8]           ;                  movdqa  xmm3, [esi + ecx*8 + 16]        ; xmm3 = [2nd]
676                  pxor    mm1, mm1                ; mm1 = 0                  pxor    xmm1, xmm1
677                  pxor    mm4, mm4                ;                  pxor    xmm4, xmm4
678                  pcmpgtw mm1, mm0                ; mm1 = (0 > mm0)                  pcmpgtw xmm1, xmm0
679                  pcmpgtw mm4, mm3                ;                  pcmpgtw xmm4, xmm3
680                  pxor    mm0, mm1                ; mm0 = |mm0|                  pxor    xmm0, xmm1
681                  pxor    mm3, mm4                ;                  pxor    xmm3, xmm4
682                  psubw   mm0, mm1                ; displace                  psubw   xmm0, xmm1
683                  psubw   mm3, mm4                ;                  psubw   xmm3, xmm4
684                  psubusw mm0, mm6                ; mm0 -= sub (unsigned, dont go < 0)                  psubusw xmm0, xmm6
685                  psubusw mm3, mm6                ;                  psubusw xmm3, xmm6
686                  psrlw   mm0, 1                  ; mm0 >>= 1   (/2)                  psrlw   xmm0, 1
687                  psrlw   mm3, 1                  ;                  psrlw   xmm3, 1
688                  paddw   mm5, mm0                ; sum += mm0                  paddw   xmm5, xmm0
689                  pxor    mm0, mm1                ; mm0 *= sign(mm0)                  pxor    xmm0, xmm1
690                  paddw   mm5, mm3                ;                  paddw   xmm5, xmm3
691                  pxor    mm3, mm4                ;                  pxor    xmm3, xmm4
692                  psubw   mm0, mm1                ; undisplace                  psubw   xmm0, xmm1
693                  psubw   mm3, mm4                  psubw   xmm3, xmm4
694                  movq    [edi + 8*ecx], mm0                  movdqa  [edi + ecx*8], xmm0
695                  movq    [edi + 8*ecx + 8], mm3                  movdqa  [edi + ecx*8 + 16], xmm3
696    
697                  add ecx,2                  add             ecx,4
698                  cmp ecx,16                  cmp ecx,16
699                  jnz     .q1loop                  jnz             .qes2_q1loop
700                    jmp             .qes2_done
                 jmp     .done  
701    
702    
703    
# Line 696  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 801  Line 1015 
1015                  xor eax, eax                  xor eax, eax
1016    
1017  align 16  align 16
1018  .loop  .des2_loop
1019                  movdqa  xmm0, [esi + eax*8]                     ; xmm0 = [coeff]                  movdqa  xmm0, [esi + eax*8]                     ; xmm0 = [coeff]
1020                  movdqa  xmm3, [esi + eax*8 + 16]                  movdqa  xmm3, [esi + eax*8 + 16]
1021                  pxor    xmm1, xmm1                  pxor    xmm1, xmm1
# Line 828  Line 1042 
1042                  psubw   xmm3, xmm4                  psubw   xmm3, xmm4
1043    
1044  %ifdef SATURATE  %ifdef SATURATE
1045                  movdqa  xmm2, [sse2_pos_2047]                  movdqu  xmm2, [sse2_pos_2047]
1046                  movdqa  xmm4, [sse2_neg_2048]                  movdqu  xmm4, [sse2_neg_2048]
1047                  pminsw  xmm0, xmm2                  pminsw  xmm0, xmm2
1048                  pminsw  xmm3, xmm2                  pminsw  xmm3, xmm2
1049                  pmaxsw  xmm0, xmm4                  pmaxsw  xmm0, xmm4
# Line 841  Line 1055 
1055    
1056                  add eax, 4                  add eax, 4
1057                  cmp eax, 16                  cmp eax, 16
1058                  jnz     near .loop                  jnz     near .des2_loop
1059    
1060                  pop     edi                  pop     edi
1061                  pop     esi                  pop     esi

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

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