[cvs] / xvidcore / src / quant / x86_asm / quantize_mpeg_mmx.asm Repository:
ViewVC logotype

Diff of /xvidcore/src/quant/x86_asm/quantize_mpeg_mmx.asm

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

revision 1.1.2.3, Tue Oct 28 22:23:03 2003 UTC revision 1.5, Sun Aug 29 10:02:38 2004 UTC
# Line 31  Line 31 
31    
32  %macro cglobal 1  %macro cglobal 1
33          %ifdef PREFIX          %ifdef PREFIX
34                    %ifdef MARK_FUNCS
35                            global _%1:function %1.endfunc-%1
36                            %define %1 _%1:function %1.endfunc-%1
37                    %else
38                  global _%1                  global _%1
39                  %define %1 _%1                  %define %1 _%1
40                    %endif
41            %else
42                    %ifdef MARK_FUNCS
43                            global %1:function %1.endfunc-%1
44          %else          %else
45                  global %1                  global %1
46          %endif          %endif
47            %endif
48  %endmacro  %endmacro
49    
50  %macro cextern 1  %macro cextern 1
# Line 51  Line 60 
60  ; Local data (Read Only)  ; Local data (Read Only)
61  ;=============================================================================  ;=============================================================================
62    
63    %ifdef FORMAT_COFF
64  SECTION .rodata  SECTION .rodata
65    %else
66    SECTION .rodata align=16
67    %endif
68    
69  mmx_one:  mmx_one:
70          times 4 dw       1          times 4 dw       1
# Line 72  Line 85 
85          %assign quant quant+1          %assign quant quant+1
86  %endrep  %endrep
87    
 ;-----------------------------------------------------------------------------  
 ; intra matrix  
 ;-----------------------------------------------------------------------------  
   
 cextern intra_matrix  
 cextern intra_matrix_fix  
   
 ;-----------------------------------------------------------------------------  
 ; inter matrix  
 ;-----------------------------------------------------------------------------  
   
 cextern inter_matrix  
 cextern inter_matrix_fix  
   
   
88  %define VM18P 3  %define VM18P 3
89  %define VM18Q 4  %define VM18Q 4
90    
# Line 146  Line 144 
144  ; uint32_t quant_mpeg_intra_mmx(int16_t * coeff,  ; uint32_t quant_mpeg_intra_mmx(int16_t * coeff,
145  ;                               const int16_t const * data,  ;                               const int16_t const * data,
146  ;                               const uint32_t quant,  ;                               const uint32_t quant,
147  ;                               const uint32_t dcscalar);  ;                               const uint32_t dcscalar,
148    ;                               const uint16_t *mpeg_matrices);
149  ;  ;
150  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
151    
# Line 156  Line 155 
155    push ecx    push ecx
156    push esi    push esi
157    push edi    push edi
158      push ebx
159    
160    mov edi, [esp + 12 + 4]       ; coeff    mov edi, [esp + 16 + 4]       ; coeff
161    mov esi, [esp + 12 + 8]       ; data    mov esi, [esp + 16 + 8]       ; data
162    mov eax, [esp + 12 + 12]      ; quant    mov eax, [esp + 16 + 12]      ; quant
163      mov ebx, [esp + 16 + 20]              ; mpeg_quant_matrices
164    
165    movq mm5, [quantd + eax * 8 - 8] ; quantd -> mm5    movq mm5, [quantd + eax * 8 - 8] ; quantd -> mm5
166    
# Line 186  Line 187 
187    psubw mm3, mm4                ;    psubw mm3, mm4                ;
188    psllw mm0, 4                  ; level << 4    psllw mm0, 4                  ; level << 4
189    psllw mm3, 4    psllw mm3, 4
190    movq mm2, [intra_matrix + 8*ecx]    movq mm2, [ebx + 8*ecx]
191    psrlw mm2, 1                  ; intra_matrix[i]>>1    psrlw mm2, 1                  ; intra_matrix[i]>>1
192    paddw mm0, mm2    paddw mm0, mm2
193    movq mm2, [intra_matrix_fix + ecx*8]    movq mm2, [ebx + 256 + ecx*8]
194    pmulhw mm0, mm2                       ; (level<<4 + intra_matrix[i]>>1) / intra_matrix[i]    pmulhw mm0, mm2                       ; (level<<4 + intra_matrix[i]>>1) / intra_matrix[i]
195    movq mm2, [intra_matrix + 8*ecx + 8]    movq mm2, [ebx + 8*ecx + 8]
196    psrlw mm2, 1    psrlw mm2, 1
197    paddw mm3, mm2    paddw mm3, mm2
198    movq mm2, [intra_matrix_fix + ecx*8 + 8]    movq mm2, [ebx + 256 + ecx*8 + 8]
199    pmulhw mm3, mm2    pmulhw mm3, mm2
200    paddw mm0, mm5                ; + quantd    paddw mm0, mm5                ; + quantd
201    paddw mm3, mm5    paddw mm3, mm5
# Line 216  Line 217 
217    
218  .done  .done
219    ; caclulate  data[0] // (int32_t)dcscalar)    ; caclulate  data[0] // (int32_t)dcscalar)
220    mov ecx, [esp + 12 + 16]  ; dcscalar    mov ecx, [esp + 16 + 16]  ; dcscalar
221    mov edx, ecx    mov edx, ecx
222    movsx eax, word [esi]     ; data[0]    movsx eax, word [esi]     ; data[0]
223    shr edx, 1                ; edx = dcscalar /2    shr edx, 1                ; edx = dcscalar /2
# Line 233  Line 234 
234    
235    mov [edi], ax             ; coeff[0] = ax    mov [edi], ax             ; coeff[0] = ax
236    
237      pop ebx
238    pop edi    pop edi
239    pop esi    pop esi
240    pop ecx    pop ecx
# Line 254  Line 256 
256    psubw mm3, mm4                ;    psubw mm3, mm4                ;
257    psllw mm0, 4    psllw mm0, 4
258    psllw mm3, 4    psllw mm3, 4
259    movq mm2, [intra_matrix + 8*ecx]    movq mm2, [ebx + 8*ecx]
260    psrlw mm2, 1    psrlw mm2, 1
261    paddw mm0, mm2    paddw mm0, mm2
262    movq mm2, [intra_matrix_fix + ecx*8]    movq mm2, [ebx + 256 + ecx*8]
263    pmulhw mm0, mm2                       ; (level<<4 + intra_matrix[i]>>1) / intra_matrix[i]    pmulhw mm0, mm2                       ; (level<<4 + intra_matrix[i]>>1) / intra_matrix[i]
264    movq mm2, [intra_matrix + 8*ecx + 8]    movq mm2, [ebx + 8*ecx + 8]
265    psrlw mm2, 1    psrlw mm2, 1
266    paddw mm3, mm2    paddw mm3, mm2
267    movq mm2, [intra_matrix_fix + ecx*8 + 8]    movq mm2, [ebx + 256 + ecx*8 + 8]
268    pmulhw mm3, mm2    pmulhw mm3, mm2
269    paddw mm0, mm5    paddw mm0, mm5
270    paddw mm3, mm5    paddw mm3, mm5
# Line 295  Line 297 
297    psubw mm3, mm4                ;    psubw mm3, mm4                ;
298    psllw mm0, 4    psllw mm0, 4
299    psllw mm3, 4    psllw mm3, 4
300    movq mm2, [intra_matrix + 8*ecx]    movq mm2, [ebx + 8*ecx]
301    psrlw mm2, 1    psrlw mm2, 1
302    paddw mm0, mm2    paddw mm0, mm2
303    movq mm2, [intra_matrix_fix + ecx*8]    movq mm2, [ebx + 256 + ecx*8]
304    pmulhw mm0, mm2                       ; (level<<4 + intra_matrix[i]>>1) / intra_matrix[i]    pmulhw mm0, mm2                       ; (level<<4 + intra_matrix[i]>>1) / intra_matrix[i]
305    movq mm2, [intra_matrix + 8*ecx + 8]    movq mm2, [ebx + 8*ecx + 8]
306    psrlw mm2, 1    psrlw mm2, 1
307    paddw mm3, mm2    paddw mm3, mm2
308    movq mm2, [intra_matrix_fix + ecx*8 + 8]    movq mm2, [ebx + 256 + ecx*8 + 8]
309    pmulhw mm3, mm2    pmulhw mm3, mm2
310    paddw mm0, mm5    paddw mm0, mm5
311    paddw mm3, mm5    paddw mm3, mm5
# Line 320  Line 322 
322    cmp ecx,16    cmp ecx,16
323    jnz near .q2loop    jnz near .q2loop
324    jmp near .done    jmp near .done
325    .endfunc
326    
327  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
328  ;  ;
329  ; uint32_t quant_mpeg_inter_mmx(int16_t * coeff,  ; uint32_t quant_mpeg_inter_mmx(int16_t * coeff,
330  ;                               const int16_t const * data,  ;                               const int16_t const * data,
331  ;                               const uint32_t quant);  ;                               const uint32_t quant,
332    ;                               const uint16_t *mpeg_matrices);
333  ;  ;
334  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
335    
# Line 336  Line 339 
339    push ecx    push ecx
340    push esi    push esi
341    push edi    push edi
342      push ebx
343    
344    mov edi, [esp + 12 + 4]       ; coeff    mov edi, [esp + 16 + 4]       ; coeff
345    mov esi, [esp + 12 + 8]       ; data    mov esi, [esp + 16 + 8]       ; data
346    mov eax, [esp + 12 + 12]  ; quant    mov eax, [esp + 16 + 12]  ; quant
347      mov ebx, [esp + 16 + 16]              ; mpeg_quant_matrices
348    
349    xor ecx, ecx    xor ecx, ecx
350    
# Line 367  Line 372 
372    psubw mm3, mm4                ;    psubw mm3, mm4                ;
373    psllw mm0, 4    psllw mm0, 4
374    psllw mm3, 4    psllw mm3, 4
375    movq mm2, [inter_matrix + 8*ecx]    movq mm2, [ebx + 512 + 8*ecx]
376    psrlw mm2, 1    psrlw mm2, 1
377    paddw mm0, mm2    paddw mm0, mm2
378    movq mm2, [inter_matrix_fix + ecx*8]    movq mm2, [ebx + 768 + ecx*8]
379    pmulhw mm0, mm2               ; (level<<4 + inter_matrix[i]>>1) / inter_matrix[i]    pmulhw mm0, mm2               ; (level<<4 + inter_matrix[i]>>1) / inter_matrix[i]
380    movq mm2, [inter_matrix + 8*ecx + 8]    movq mm2, [ebx + 512 + 8*ecx + 8]
381    psrlw mm2, 1    psrlw mm2, 1
382    paddw mm3, mm2    paddw mm3, mm2
383    movq mm2, [inter_matrix_fix + ecx*8 + 8]    movq mm2, [ebx + 768 + ecx*8 + 8]
384    pmulhw mm3, mm2    pmulhw mm3, mm2
385    pmulhw mm0, mm7               ; mm0 = (mm0 / 2Q) >> 16    pmulhw mm0, mm7               ; mm0 = (mm0 / 2Q) >> 16
386    pmulhw mm3, mm7               ;    pmulhw mm3, mm7               ;
# Line 401  Line 406 
406    paddd mm0, mm5    paddd mm0, mm5
407    movd eax, mm0                 ; return sum    movd eax, mm0                 ; return sum
408    
409      pop ebx
410    pop edi    pop edi
411    pop esi    pop esi
412    pop ecx    pop ecx
# Line 421  Line 427 
427    psubw mm3, mm4                ;    psubw mm3, mm4                ;
428    psllw mm0, 4    psllw mm0, 4
429    psllw mm3, 4    psllw mm3, 4
430    movq mm2, [inter_matrix + 8*ecx]    movq mm2, [ebx + 512 + 8*ecx]
431    psrlw mm2, 1    psrlw mm2, 1
432    paddw mm0, mm2    paddw mm0, mm2
433    movq mm2, [inter_matrix_fix + ecx*8]    movq mm2, [ebx + 768 + ecx*8]
434    pmulhw mm0, mm2               ; (level<<4 + inter_matrix[i]>>1) / inter_matrix[i]    pmulhw mm0, mm2               ; (level<<4 + inter_matrix[i]>>1) / inter_matrix[i]
435    movq mm2, [inter_matrix + 8*ecx + 8]    movq mm2, [ebx + 512 + 8*ecx + 8]
436    psrlw mm2, 1    psrlw mm2, 1
437    paddw mm3, mm2    paddw mm3, mm2
438    movq mm2, [inter_matrix_fix + ecx*8 + 8]    movq mm2, [ebx + 768 + ecx*8 + 8]
439    pmulhw mm3, mm2    pmulhw mm3, mm2
440    psrlw mm0, 1                  ; mm0 >>= 1   (/2)    psrlw mm0, 1                  ; mm0 >>= 1   (/2)
441    psrlw mm3, 1                  ;    psrlw mm3, 1                  ;
# Line 448  Line 454 
454    
455    jmp .done    jmp .done
456    
   
457  ALIGN 16  ALIGN 16
458  .q2loop  .q2loop
459    movq mm0, [esi + 8*ecx]       ; mm0 = [1st]    movq mm0, [esi + 8*ecx]       ; mm0 = [1st]
# Line 463  Line 468 
468    psubw mm3, mm4                ;    psubw mm3, mm4                ;
469    psllw mm0, 4    psllw mm0, 4
470    psllw mm3, 4    psllw mm3, 4
471    movq mm2, [inter_matrix + 8*ecx]    movq mm2, [ebx + 512 + 8*ecx]
472    psrlw mm2, 1    psrlw mm2, 1
473    paddw mm0, mm2    paddw mm0, mm2
474    movq mm2, [inter_matrix_fix + ecx*8]    movq mm2, [ebx + 768 + ecx*8]
475    pmulhw mm0, mm2               ; (level<<4 + inter_matrix[i]>>1) / inter_matrix[i]    pmulhw mm0, mm2               ; (level<<4 + inter_matrix[i]>>1) / inter_matrix[i]
476    movq mm2, [inter_matrix + 8*ecx + 8]    movq mm2, [ebx + 512 + 8*ecx + 8]
477    psrlw mm2, 1    psrlw mm2, 1
478    paddw mm3, mm2    paddw mm3, mm2
479    movq mm2, [inter_matrix_fix + ecx*8 + 8]    movq mm2, [ebx + 768 + ecx*8 + 8]
480    pmulhw mm3, mm2    pmulhw mm3, mm2
481    psrlw mm0, 2                  ; mm0 >>= 1   (/2)    psrlw mm0, 2                  ; mm0 >>= 1   (/2)
482    psrlw mm3, 2                  ;    psrlw mm3, 2                  ;
# Line 489  Line 494 
494    jnz near .q2loop    jnz near .q2loop
495    
496    jmp .done    jmp .done
497    .endfunc
498    
499    
500  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
# Line 496  Line 502 
502  ; uint32_t dequant_mpeg_intra_mmx(int16_t *data,  ; uint32_t dequant_mpeg_intra_mmx(int16_t *data,
503  ;                                 const int16_t const *coeff,  ;                                 const int16_t const *coeff,
504  ;                                 const uint32_t quant,  ;                                 const uint32_t quant,
505  ;                                 const uint32_t dcscalar);  ;                                 const uint32_t dcscalar,
506    ;                                 const uint16_t *mpeg_matrices);
507  ;  ;
508  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
509    
# Line 519  Line 526 
526    psubw mm0, mm1    ; -> mm0 = abs(coeff[i]), mm1 = sign of coeff[i]    psubw mm0, mm1    ; -> mm0 = abs(coeff[i]), mm1 = sign of coeff[i]
527    
528    movq mm2, mm7     ; mm2 = quant    movq mm2, mm7     ; mm2 = quant
529    pmullw mm2, [intra_matrix + 8*eax + 8*16 ]  ; matrix[i]*quant.    pmullw mm2, [ebx + 8*eax + 8*16 ]  ; matrix[i]*quant.
530    
531    movq mm6, mm2    movq mm6, mm2
532    pmulhw mm2, mm0   ; high of coeff*(matrix*quant)  (should be 0 if no overflow)    pmulhw mm2, mm0   ; high of coeff*(matrix*quant)  (should be 0 if no overflow)
# Line 542  Line 549 
549  ALIGN 16  ALIGN 16
550  dequant_mpeg_intra_mmx:  dequant_mpeg_intra_mmx:
551    
552    mov edx, [esp+4]  ; data    push ebx
553    mov ecx, [esp+8]  ; coeff  
554    mov eax, [esp+12] ; quant    mov edx, [esp + 4 + 4]  ; data
555      mov ecx, [esp + 4 + 8]  ; coeff
556      mov eax, [esp + 4 + 12] ; quant
557      mov ebx, [esp + 4 + 20] ; mpeg_quant_matrices
558    
559    movq mm7, [mmx_mul_quant  + eax*8 - 8]    movq mm7, [mmx_mul_quant  + eax*8 - 8]
560    mov eax, -16      ; to keep ALIGNed, we regularly process coeff[0]    mov eax, -16      ; to keep ALIGNed, we regularly process coeff[0]
# Line 561  Line 571 
571    movq mm2, mm7     ; mm2 = quant    movq mm2, mm7     ; mm2 = quant
572    
573    pcmpgtw mm4, mm3  ; mm4 = sgn(c')    pcmpgtw mm4, mm3  ; mm4 = sgn(c')
574    pmullw mm2,  [intra_matrix + 8*eax + 8*16 ]  ; matrix[i]*quant    pmullw mm2,  [ebx + 8*eax + 8*16 ]  ; matrix[i]*quant
575    
576    pxor mm0, mm1     ; negate if negative    pxor mm0, mm1     ; negate if negative
577    pxor mm3, mm4     ; negate if negative    pxor mm3, mm4     ; negate if negative
# Line 577  Line 587 
587    pmulhw mm0, mm5   ; high of coeff*(matrix*quant)    pmulhw mm0, mm5   ; high of coeff*(matrix*quant)
588    movq mm5, mm7     ; mm2 = quant    movq mm5, mm7     ; mm2 = quant
589    
590    pmullw mm5,  [intra_matrix + 8*eax + 8*16 +8]  ; matrix[i+1]*quant    pmullw mm5,  [ebx + 8*eax + 8*16 +8]  ; matrix[i+1]*quant
591    
592    movq mm6, mm5    movq mm6, mm5
593    add eax,2   ; z-flag will be tested later    add eax,2   ; z-flag will be tested later
# Line 609  Line 619 
619    
620      ; deal with DC      ; deal with DC
621    movd mm0, [ecx]    movd mm0, [ecx]
622    pmullw mm0, [esp+16]  ; dcscalar    pmullw mm0, [esp + 4 + 16]  ; dcscalar
623    movq mm2, [mmx_32767_minus_2047]    movq mm2, [mmx_32767_minus_2047]
624    paddsw mm0, mm2    paddsw mm0, mm2
625    psubsw mm0, mm2    psubsw mm0, mm2
# Line 620  Line 630 
630    mov [edx], ax    mov [edx], ax
631    
632    xor eax, eax    xor eax, eax
633    
634      pop ebx
635    
636    ret    ret
637    .endfunc
638    
639  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
640  ;  ;
641  ; uint32_t dequant_mpeg_inter_mmx(int16_t * data,  ; uint32_t dequant_mpeg_inter_mmx(int16_t * data,
642  ;                                 const int16_t * const coeff,  ;                                 const int16_t * const coeff,
643  ;                                 const uint32_t quant);  ;                                 const uint32_t quant,
644    ;                                 const uint16_t *mpeg_matrices);
645  ;  ;
646  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
647    
# Line 638  Line 653 
653  ALIGN 16  ALIGN 16
654  dequant_mpeg_inter_mmx:  dequant_mpeg_inter_mmx:
655    
656    mov edx, [esp+ 4]        ; data    push ebx
657    mov ecx, [esp+ 8]        ; coeff  
658    mov eax, [esp+12]        ; quant    mov edx, [esp + 4 + 4]        ; data
659      mov ecx, [esp + 4 + 8]        ; coeff
660      mov eax, [esp + 4 + 12]        ; quant
661      mov ebx, [esp + 4 + 16]                  ; mpeg_quant_matrices
662    
663    movq mm7, [mmx_mul_quant  + eax*8 - 8]    movq mm7, [mmx_mul_quant  + eax*8 - 8]
664    mov eax, -16    mov eax, -16
665    paddw mm7, mm7    ; << 1    paddw mm7, mm7    ; << 1
# Line 675  Line 694 
694      ; we're short on register, here. Poor pairing...      ; we're short on register, here. Poor pairing...
695    
696    movq mm4, mm7     ; (matrix*quant)    movq mm4, mm7     ; (matrix*quant)
697    pmullw mm4,  [inter_matrix + 8*eax + 8*16 -2*8]    pmullw mm4,  [ebx + 512 + 8*eax + 8*16 -2*8]
698    movq mm5, mm4    movq mm5, mm4
699    pmulhw mm5, mm0   ; high of c*(matrix*quant)    pmulhw mm5, mm0   ; high of c*(matrix*quant)
700    pmullw mm0, mm4   ; low  of c*(matrix*quant)    pmullw mm0, mm4   ; low  of c*(matrix*quant)
701    
702    movq mm4, mm7     ; (matrix*quant)    movq mm4, mm7     ; (matrix*quant)
703    pmullw mm4,  [inter_matrix + 8*eax + 8*16 -2*8 + 8]    pmullw mm4,  [ebx + 512 + 8*eax + 8*16 -2*8 + 8]
704    
705    pcmpgtw mm5, [zero]    pcmpgtw mm5, [zero]
706    paddusw mm0, mm5    paddusw mm0, mm5
# Line 725  Line 744 
744    xor word [edx + 2*63], ax    xor word [edx + 2*63], ax
745    
746    xor eax, eax    xor eax, eax
747    
748      pop ebx
749    
750    ret    ret
751    .endfunc
752    

Legend:
Removed from v.1.1.2.3  
changed lines
  Added in v.1.5

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