[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 366, Wed Aug 7 10:09:00 2002 UTC revision 367, Fri Aug 9 10:45:05 2002 UTC
# Line 32  Line 32 
32  ; *  ; *
33  ; *     History:  ; *     History:
34  ; *  ; *
35    ; * 09.08.2002  sse2 dequant funcs revamped
36  ; * 14.06.2002  mmx+xmm dequant_* funcs revamped  -Skal-  ; * 14.06.2002  mmx+xmm dequant_* funcs revamped  -Skal-
37  ; * 24.02.2002  sse2 quant_intra / dequant_intra (have to use movdqu ???)  ; * 24.02.2002  sse2 quant_intra / dequant_intra (have to use movdqu ???)
38  ; * 17.04.2002  sse2 quant_inter / dequant_inter  ; * 17.04.2002  sse2 quant_inter / dequant_inter
# Line 261  Line 262 
262  ;  ;
263  ;===========================================================================  ;===========================================================================
264    
265  align 8  align 16
266  mmx_32768_minus_2048                            times 4 dw (32768-2048)  sse2_2047       times 8 dw 2047
 mmx_32767_minus_2047                            times 4 dw (32767-2047)  
267    
268  align 16  align 16
269  mmx_2047 times 4 dw 2047  mmx_2047 times 4 dw 2047
270    
271  align 16  align 8
272  sse2_pos_2047                                           times 8 dw 2047  mmx_32768_minus_2048                            times 4 dw (32768-2048)
273  sse2_neg_2048                                           times 8 dw -2048  mmx_32767_minus_2047                            times 4 dw (32767-2047)
274    
275    
276  section .text  section .text
# Line 855  Line 855 
855    
856    ret    ret
857    
858    
859  ;===========================================================================  ;===========================================================================
860  ;  ;
861  ; void dequant_intra_sse2(int16_t *data,  ; void dequant_intra_sse2(int16_t *data,
# Line 863  Line 864 
864  ;                                       const uint32_t dcscalar);  ;                                       const uint32_t dcscalar);
865  ;  ;
866  ;===========================================================================  ;===========================================================================
867    align ALIGN
 align 16  
868  cglobal dequant_intra_sse2  cglobal dequant_intra_sse2
869  dequant_intra_sse2:  dequant_intra_sse2:
870            mov edx, [esp+ 4]        ; data
871                  push    esi          mov ecx, [esp+ 8]        ; coeff
872                  push    edi          mov eax, [esp+12]        ; quant
   
                 mov             edi, [esp + 8 + 4]                      ; data  
                 mov             esi, [esp + 8 + 8]                      ; coeff  
                 mov             eax, [esp + 8 + 12]                     ; quant  
   
873                  movq    mm6, [mmx_add + eax*8 - 8]                  movq    mm6, [mmx_add + eax*8 - 8]
874                  movq    mm7, [mmx_mul + eax*8 - 8]                  movq    mm7, [mmx_mul + eax*8 - 8]
875                  movq2dq xmm6, mm6                  movq2dq xmm6, mm6
876                  movq2dq xmm7, mm7                  movq2dq xmm7, mm7
877                  movlhps xmm6, xmm6                  movlhps xmm6, xmm6
878                  movlhps xmm7, xmm7                  movlhps xmm7, xmm7
879            mov eax, -16
880    
881                  xor             eax, eax  align ALIGN
882    .loop
883  align 16          movdqa xmm0, [ecx + 8*16 + 8*eax]      ; c  = coeff[i]
884  .das2_loop          movdqa xmm3, [ecx + 8*16 + 8*eax+ 16]
                 movdqa  xmm0, [esi + eax*8]  
                 movdqa  xmm3, [esi + eax*8 + 16]  
885                  pxor    xmm1, xmm1                  pxor    xmm1, xmm1
886                  pxor    xmm4, xmm4                  pxor    xmm4, xmm4
887                  pcmpgtw xmm1, xmm0          pcmpgtw xmm1, xmm0  ; sign(c)
888                  pcmpgtw xmm4, xmm3                  pcmpgtw xmm4, xmm3
889                  pxor    xmm2, xmm2                  pxor    xmm2, xmm2
890                  pxor    xmm5, xmm5                  pxor    xmm5, xmm5
891                  pcmpeqw xmm2, xmm0          pcmpeqw xmm2, xmm0  ; c is zero
892                  pcmpeqw xmm5, xmm3                  pcmpeqw xmm5, xmm3
893                  pandn   xmm2, xmm6          pandn xmm2, xmm6    ; offset = isZero ? 0 : quant_add
894                  pandn   xmm5, xmm6                  pandn   xmm5, xmm6
895                  pxor    xmm0, xmm1          pxor xmm0, xmm1     ; negate if negative
896                  pxor    xmm3, xmm4                  pxor    xmm3, xmm4
897                  psubw   xmm0, xmm1                  psubw   xmm0, xmm1
898                  psubw   xmm3, xmm4                  psubw   xmm3, xmm4
899                  pmullw  xmm0, xmm7          pmullw xmm0, xmm7 ; *= 2Q
900                  pmullw  xmm3, xmm7                  pmullw  xmm3, xmm7
901                  paddw   xmm0, xmm2          paddw xmm0, xmm2 ; + offset
902                  paddw   xmm3, xmm5                  paddw   xmm3, xmm5
903                  pxor    xmm0, xmm1          paddw xmm0, xmm1 ; negate back
904                  pxor    xmm3, xmm4          paddw xmm3, xmm4
                 psubw   xmm0, xmm1  
                 psubw   xmm3, xmm4  
905    
906  %ifdef SATURATE          ; saturates to +2047
907                  movdqu  xmm2, [sse2_pos_2047]          movdqa xmm2, [sse2_2047]
                 movdqu  xmm4, [sse2_neg_2048]  
908                  pminsw  xmm0, xmm2                  pminsw  xmm0, xmm2
                 pminsw  xmm3, xmm2  
                 pmaxsw  xmm0, xmm4  
                 pmaxsw  xmm3, xmm4  
 %endif  
   
                 movdqa  [edi + eax*8], xmm0  
                 movdqa  [edi + eax*8 + 16], xmm3  
   
909                  add             eax, 4                  add             eax, 4
910                  cmp             eax, 16          pminsw xmm3, xmm2
                 jnz             near .das2_loop  
911    
912                  mov             ax, [esi]                                       ; ax = data[0]          pxor xmm0, xmm1
913                  imul    ax, [esp + 8 + 16]                      ; eax = data[0] * dcscalar          pxor xmm3, xmm4
914            movdqa [edx + 8*16 - 8*4 + 8*eax], xmm0
915            movdqa [edx + 8*16 - 8*4 + 8*eax + 16], xmm3
916            jnz     near .loop
917    
918  %ifdef SATURATE          ; deal with DC
919                  cmp             ax, -2048          movd mm0, [ecx]
920                  jl              .das2_set_n2048          pmullw mm0, [esp+16]    ; dcscalar
921                  cmp             ax, 2047          movq mm2, [mmx_32767_minus_2047]
922                  jg              .das2_set_2047          paddsw mm0, mm2
923  %endif          psubsw mm0, mm2
924                  mov             [edi], ax          movq mm2, [mmx_32768_minus_2048]
925            psubsw mm0, mm2
926            paddsw mm0, mm2
927            movd eax, mm0
928            mov [edx], ax
929    
                 pop             edi  
                 pop             esi  
930                  ret                  ret
931    
 %ifdef SATURATE  
 align 16  
 .das2_set_n2048  
                 mov             word [edi], -2048  
                 pop             edi  
                 pop             esi  
                 ret  
932    
933  align 16  
 .das2_set_2047  
                 mov             word [edi], 2047  
                 pop             edi  
                 pop             esi  
                 ret  
 %endif  
934    
935  ;===========================================================================  ;===========================================================================
936  ;  ;
# Line 1086  Line 1060 
1060  ;                                       const uint32_t quant);  ;                                       const uint32_t quant);
1061  ;  ;
1062  ;===========================================================================  ;===========================================================================
1063    align ALIGN
 align 16  
1064  cglobal dequant_inter_sse2  cglobal dequant_inter_sse2
1065  dequant_inter_sse2  dequant_inter_sse2
1066            mov edx, [esp + 4]      ; data
1067                  push    esi          mov ecx, [esp + 8]      ; coeff
1068                  push    edi          mov eax, [esp + 12]     ; quant
   
                 mov     edi, [esp + 8 + 4]      ; data  
                 mov     esi, [esp + 8 + 8]      ; coeff  
                 mov     eax, [esp + 8 + 12]     ; quant  
1069                  movq    mm6, [mmx_add + eax * 8 - 8]                  movq    mm6, [mmx_add + eax * 8 - 8]
1070                  movq    mm7, [mmx_mul + eax * 8 - 8]                  movq    mm7, [mmx_mul + eax * 8 - 8]
   
1071                  movq2dq xmm6, mm6                  movq2dq xmm6, mm6
1072                  movq2dq xmm7, mm7                  movq2dq xmm7, mm7
1073                  movlhps xmm6, xmm6                  movlhps xmm6, xmm6
1074                  movlhps xmm7, xmm7                  movlhps xmm7, xmm7
1075            mov eax, -16
1076    
1077                  xor eax, eax  align ALIGN
1078    .loop
1079            movdqa xmm0, [ecx + 8*16 + 8*eax]  ; c  = coeff[i]
1080            movdqa xmm3, [ecx + 8*16 + 8*eax + 16]
1081    
 align 16  
 .des2_loop  
                 movdqa  xmm0, [esi + eax*8]                     ; xmm0 = [coeff]  
                 movdqa  xmm3, [esi + eax*8 + 16]  
1082                  pxor    xmm1, xmm1                  pxor    xmm1, xmm1
1083                  pxor    xmm4, xmm4                  pxor    xmm4, xmm4
1084                  pcmpgtw xmm1, xmm0          pcmpgtw xmm1, xmm0  ; sign(c)
1085                  pcmpgtw xmm4, xmm3                  pcmpgtw xmm4, xmm3
1086                  pxor    xmm2, xmm2                  pxor    xmm2, xmm2
1087                  pxor    xmm5, xmm5                  pxor    xmm5, xmm5
1088                  pcmpeqw xmm2, xmm0          pcmpeqw xmm2, xmm0  ; c is zero
1089                  pcmpeqw xmm5, xmm3                  pcmpeqw xmm5, xmm3
1090                  pandn   xmm2, xmm6                  pandn   xmm2, xmm6
1091                  pandn   xmm5, xmm6                  pandn   xmm5, xmm6
1092                  pxor    xmm0, xmm1          pxor xmm0, xmm1  ; negate if negative
1093                  pxor    xmm3, xmm4                  pxor    xmm3, xmm4
1094                  psubw   xmm0, xmm1                  psubw   xmm0, xmm1
1095                  psubw   xmm3, xmm4                  psubw   xmm3, xmm4
1096                  pmullw  xmm0, xmm7          pmullw xmm0, xmm7  ; *= 2Q
1097                  pmullw  xmm3, xmm7                  pmullw  xmm3, xmm7
1098                  paddw   xmm0, xmm2          paddw xmm0, xmm2  ; + offset
1099                  paddw   xmm3, xmm5                  paddw   xmm3, xmm5
                 pxor    xmm0, xmm1  
                 pxor    xmm3, xmm4  
                 psubw   xmm0, xmm1  
                 psubw   xmm3, xmm4  
   
 %ifdef SATURATE  
                 movdqu  xmm2, [sse2_pos_2047]  
                 movdqu  xmm4, [sse2_neg_2048]  
                 pminsw  xmm0, xmm2  
                 pminsw  xmm3, xmm2  
                 pmaxsw  xmm0, xmm4  
                 pmaxsw  xmm3, xmm4  
 %endif  
1100    
1101                  movdqa  [edi + eax*8], xmm0          paddw xmm0, xmm1  ; start restoring sign
1102                  movdqa  [edi + eax*8 + 16], xmm3          paddw xmm3, xmm4
1103    
1104            ; saturates to +2047
1105            movdqa xmm2, [sse2_2047]
1106            pminsw xmm0, xmm2
1107                  add eax, 4                  add eax, 4
1108                  cmp eax, 16          pminsw xmm3, xmm2
                 jnz     near .des2_loop  
1109    
1110                  pop     edi          pxor xmm0, xmm1 ; finish restoring sign
1111                  pop     esi          pxor xmm3, xmm4
1112            movdqa [edx + 8*16 - 8*4 + 8*eax], xmm0
1113            movdqa [edx + 8*16 - 8*4 + 8*eax + 16], xmm3
1114            jnz     near .loop
1115    
1116                  ret                  ret

Legend:
Removed from v.366  
changed lines
  Added in v.367

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