[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.7, Tue Jul 11 10:01:27 2006 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 131  Line 129 
129          times 4 dw 0          times 4 dw 0
130    
131  ;=============================================================================  ;=============================================================================
132    ; rounding
133    ;=============================================================================
134    
135    mmx_rounding:
136            dw (1<<13)
137            dw 0
138            dw (1<<13)
139            dw 0
140    
141    ;=============================================================================
142  ; Code  ; Code
143  ;=============================================================================  ;=============================================================================
144    
# Line 141  Line 149 
149  cglobal dequant_mpeg_intra_mmx  cglobal dequant_mpeg_intra_mmx
150  cglobal dequant_mpeg_inter_mmx  cglobal dequant_mpeg_inter_mmx
151    
152    
153    %macro QUANT_MMX        1
154            movq    mm0, [eax + 16*(%1)]                    ; data
155            movq    mm2, [ecx + 16*(%1) + 128]              ; intra_matrix_rec
156            movq    mm4, [eax + 16*(%1) + 8]                ; data
157            movq    mm6, [ecx + 16*(%1) + 128 + 8]  ; intra_matrix_rec
158    
159            movq    mm1, mm0
160            movq    mm5, mm4
161    
162            pmullw  mm0, mm2                                        ; low results
163            pmulhw  mm1, mm2                                        ; high results
164            pmullw  mm4, mm6                                        ; low results
165            pmulhw  mm5, mm6                                        ; high results
166    
167            movq    mm2, mm0
168            movq    mm6, mm4
169    
170            punpckhwd mm0, mm1
171            punpcklwd mm2, mm1
172            punpckhwd mm4, mm5
173            punpcklwd mm6, mm5
174    
175            paddd   mm2, mm7
176            paddd   mm0, mm7
177            paddd   mm6, mm7
178            paddd   mm4, mm7
179    
180            psrad   mm2, 14
181            psrad   mm0, 14
182            psrad   mm6, 14
183            psrad   mm4, 14
184    
185            packssdw mm2, mm0
186            packssdw mm6, mm4
187    
188            movq    [edi + 16*(%1)], mm2
189            movq    [edi + 16*(%1)+8], mm6
190    %endmacro
191    
192  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
193  ;  ;
194  ; uint32_t quant_mpeg_intra_mmx(int16_t * coeff,  ; uint32_t quant_mpeg_intra_mmx(int16_t * coeff,
195  ;                               const int16_t const * data,  ;                               const int16_t const * data,
196  ;                               const uint32_t quant,  ;                               const uint32_t quant,
197  ;                               const uint32_t dcscalar);  ;                               const uint32_t dcscalar,
198    ;                               const uint16_t *mpeg_matrices);
199  ;  ;
200  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
201    
202  ALIGN 16  ALIGN 16
203  quant_mpeg_intra_mmx:  quant_mpeg_intra_mmx:
204    
   push ecx  
   push esi  
205    push edi    push edi
206      movq mm7, [mmx_rounding]
207    
208    mov edi, [esp + 12 + 4]       ; coeff    mov eax, [esp + 4 + 8]                ; data
209    mov esi, [esp + 12 + 8]       ; data    mov ecx, [esp + 4 + 20]               ; mpeg_quant_matrices
210    mov eax, [esp + 12 + 12]      ; quant    mov edi, [esp + 4 + 4]                ; coeff
211    
212    movq mm5, [quantd + eax * 8 - 8] ; quantd -> mm5    QUANT_MMX(0)
213      QUANT_MMX(1)
214    xor ecx, ecx    QUANT_MMX(2)
215    cmp al, 1    QUANT_MMX(3)
216    jz near .q1loop    QUANT_MMX(4)
217      QUANT_MMX(5)
218    cmp al, 2    QUANT_MMX(6)
219    jz near .q2loop    QUANT_MMX(7)
220    
221    movq mm7, [mmx_div + eax * 8 - 8] ; multipliers[quant] -> mm7    ; calculate DC
222      movsx eax, word [eax]     ; data[0]
223  ALIGN 16    mov ecx, [esp + 4 + 16]   ; dcscalar
 .loop  
   movq mm0, [esi + 8*ecx]       ; mm0 = [1st]  
   movq mm3, [esi + 8*ecx + 8]   ;  
   pxor mm1, mm1                 ; mm1 = 0  
   pxor mm4, mm4  
   pcmpgtw mm1, mm0              ; mm1 = (0 > mm0)  
   pcmpgtw mm4, mm3  
   pxor mm0, mm1                 ; mm0 = |mm0|  
   pxor mm3, mm4                 ;  
   psubw mm0, mm1                ; displace  
   psubw mm3, mm4                ;  
   psllw mm0, 4                  ; level << 4  
   psllw mm3, 4  
   movq mm2, [intra_matrix + 8*ecx]  
   psrlw mm2, 1                  ; intra_matrix[i]>>1  
   paddw mm0, mm2  
   movq mm2, [intra_matrix_fix + ecx*8]  
   pmulhw mm0, mm2                       ; (level<<4 + intra_matrix[i]>>1) / intra_matrix[i]  
   movq mm2, [intra_matrix + 8*ecx + 8]  
   psrlw mm2, 1  
   paddw mm3, mm2  
   movq mm2, [intra_matrix_fix + ecx*8 + 8]  
   pmulhw mm3, mm2  
   paddw mm0, mm5                ; + quantd  
   paddw mm3, mm5  
   pmulhw mm0, mm7               ; mm0 = (mm0 / 2Q) >> 16  
   pmulhw mm3, mm7               ;  
   psrlw mm0, 1                  ; additional shift by 1 => 16 + 1 = 17  
   psrlw mm3, 1  
   pxor mm0, mm1                 ; mm0 *= sign(mm0)  
   pxor mm3, mm4                 ;  
   psubw mm0, mm1                ; undisplace  
   psubw mm3, mm4                ;  
   
   movq [edi + 8*ecx], mm0  
   movq [edi + 8*ecx + 8], mm3  
   
   add ecx,2  
   cmp ecx,16  
   jnz near .loop  
   
 .done  
   ; caclulate  data[0] // (int32_t)dcscalar)  
   mov ecx, [esp + 12 + 16]  ; dcscalar  
224    mov edx, ecx    mov edx, ecx
   movsx eax, word [esi]     ; data[0]  
225    shr edx, 1                ; edx = dcscalar /2    shr edx, 1                ; edx = dcscalar /2
226    cmp eax, 0    mov edi, edx
227    jg .gtzero    neg edi
228    
229      cmp eax, 0
230      cmovg edx, edi
231    sub eax, edx    sub eax, edx
232    jmp short .mul  
233  .gtzero    mov edi, [esp + 4 + 4]        ; coeff again
234    add eax, edx  
 .mul  
235    cdq                       ; expand eax -> edx:eax    cdq                       ; expand eax -> edx:eax
236    idiv ecx                  ; eax = edx:eax / dcscalar    idiv ecx                  ; eax = edx:eax / dcscalar
237    
238    mov [edi], ax             ; coeff[0] = ax    mov [edi], ax             ; coeff[0] = ax
239    
240    pop edi    pop edi
   pop esi  
   pop ecx  
241    
242    xor eax, eax              ; return(0);    xor eax, eax              ; return(0);
243    ret    ret
244    .endfunc
 ALIGN 16  
 .q1loop  
   movq mm0, [esi + 8*ecx]       ; mm0 = [1st]  
   movq mm3, [esi + 8*ecx + 8]   ;  
   pxor mm1, mm1                 ; mm1 = 0  
   pxor mm4, mm4                 ;  
   pcmpgtw mm1, mm0              ; mm1 = (0 > mm0)  
   pcmpgtw mm4, mm3              ;  
   pxor mm0, mm1                 ; mm0 = |mm0|  
   pxor mm3, mm4                 ;  
   psubw mm0, mm1                ; displace  
   psubw mm3, mm4                ;  
   psllw mm0, 4  
   psllw mm3, 4  
   movq mm2, [intra_matrix + 8*ecx]  
   psrlw mm2, 1  
   paddw mm0, mm2  
   movq mm2, [intra_matrix_fix + ecx*8]  
   pmulhw mm0, mm2                       ; (level<<4 + intra_matrix[i]>>1) / intra_matrix[i]  
   movq mm2, [intra_matrix + 8*ecx + 8]  
   psrlw mm2, 1  
   paddw mm3, mm2  
   movq mm2, [intra_matrix_fix + ecx*8 + 8]  
   pmulhw mm3, mm2  
   paddw mm0, mm5  
   paddw mm3, mm5  
   psrlw mm0, 1              ; mm0 >>= 1   (/2)  
   psrlw mm3, 1              ;  
   pxor mm0, mm1             ; mm0 *= sign(mm0)  
   pxor mm3, mm4             ;  
   psubw mm0, mm1            ; undisplace  
   psubw mm3, mm4            ;  
   movq [edi + 8*ecx], mm0  
   movq [edi + 8*ecx + 8], mm3  
   
   add ecx, 2  
   cmp ecx, 16  
   jnz near .q1loop  
   jmp near .done  
   
   
 ALIGN 16  
 .q2loop  
   movq mm0, [esi + 8*ecx]       ; mm0 = [1st]  
   movq mm3, [esi + 8*ecx + 8]   ;  
   pxor mm1, mm1                 ; mm1 = 0  
   pxor mm4, mm4                 ;  
   pcmpgtw mm1, mm0              ; mm1 = (0 > mm0)  
   pcmpgtw mm4, mm3              ;  
   pxor mm0, mm1                 ; mm0 = |mm0|  
   pxor mm3, mm4                 ;  
   psubw mm0, mm1                ; displace  
   psubw mm3, mm4                ;  
   psllw mm0, 4  
   psllw mm3, 4  
   movq mm2, [intra_matrix + 8*ecx]  
   psrlw mm2, 1  
   paddw mm0, mm2  
   movq mm2, [intra_matrix_fix + ecx*8]  
   pmulhw mm0, mm2                       ; (level<<4 + intra_matrix[i]>>1) / intra_matrix[i]  
   movq mm2, [intra_matrix + 8*ecx + 8]  
   psrlw mm2, 1  
   paddw mm3, mm2  
   movq mm2, [intra_matrix_fix + ecx*8 + 8]  
   pmulhw mm3, mm2  
   paddw mm0, mm5  
   paddw mm3, mm5  
   psrlw mm0, 2                  ; mm0 >>= 1   (/4)  
   psrlw mm3, 2                  ;  
   pxor mm0, mm1                 ; mm0 *= sign(mm0)  
   pxor mm3, mm4                 ;  
   psubw mm0, mm1                ; undisplace  
   psubw mm3, mm4            ;  
   movq [edi + 8*ecx], mm0  
   movq [edi + 8*ecx + 8], mm3  
   
   add ecx,2  
   cmp ecx,16  
   jnz near .q2loop  
   jmp near .done  
245    
246    
247  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
248  ;  ;
249  ; uint32_t quant_mpeg_inter_mmx(int16_t * coeff,  ; uint32_t quant_mpeg_inter_mmx(int16_t * coeff,
250  ;                               const int16_t const * data,  ;                               const int16_t const * data,
251  ;                               const uint32_t quant);  ;                               const uint32_t quant,
252    ;                               const uint16_t *mpeg_matrices);
253  ;  ;
254  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
255    
# Line 336  Line 259 
259    push ecx    push ecx
260    push esi    push esi
261    push edi    push edi
262      push ebx
263    
264    mov edi, [esp + 12 + 4]       ; coeff    mov edi, [esp + 16 + 4]       ; coeff
265    mov esi, [esp + 12 + 8]       ; data    mov esi, [esp + 16 + 8]       ; data
266    mov eax, [esp + 12 + 12]  ; quant    mov eax, [esp + 16 + 12]  ; quant
267      mov ebx, [esp + 16 + 16]              ; mpeg_quant_matrices
268    
269    xor ecx, ecx    xor ecx, ecx
270    
# Line 367  Line 292 
292    psubw mm3, mm4                ;    psubw mm3, mm4                ;
293    psllw mm0, 4    psllw mm0, 4
294    psllw mm3, 4    psllw mm3, 4
295    movq mm2, [inter_matrix + 8*ecx]    movq mm2, [ebx + 512 + 8*ecx]
296    psrlw mm2, 1    psrlw mm2, 1
297    paddw mm0, mm2    paddw mm0, mm2
298    movq mm2, [inter_matrix_fix + ecx*8]    movq mm2, [ebx + 768 + ecx*8]
299    pmulhw mm0, mm2               ; (level<<4 + inter_matrix[i]>>1) / inter_matrix[i]    pmulhw mm0, mm2               ; (level<<4 + inter_matrix[i]>>1) / inter_matrix[i]
300    movq mm2, [inter_matrix + 8*ecx + 8]    movq mm2, [ebx + 512 + 8*ecx + 8]
301    psrlw mm2, 1    psrlw mm2, 1
302    paddw mm3, mm2    paddw mm3, mm2
303    movq mm2, [inter_matrix_fix + ecx*8 + 8]    movq mm2, [ebx + 768 + ecx*8 + 8]
304    pmulhw mm3, mm2    pmulhw mm3, mm2
305    pmulhw mm0, mm7               ; mm0 = (mm0 / 2Q) >> 16    pmulhw mm0, mm7               ; mm0 = (mm0 / 2Q) >> 16
306    pmulhw mm3, mm7               ;    pmulhw mm3, mm7               ;
# Line 401  Line 326 
326    paddd mm0, mm5    paddd mm0, mm5
327    movd eax, mm0                 ; return sum    movd eax, mm0                 ; return sum
328    
329      pop ebx
330    pop edi    pop edi
331    pop esi    pop esi
332    pop ecx    pop ecx
# Line 421  Line 347 
347    psubw mm3, mm4                ;    psubw mm3, mm4                ;
348    psllw mm0, 4    psllw mm0, 4
349    psllw mm3, 4    psllw mm3, 4
350    movq mm2, [inter_matrix + 8*ecx]    movq mm2, [ebx + 512 + 8*ecx]
351    psrlw mm2, 1    psrlw mm2, 1
352    paddw mm0, mm2    paddw mm0, mm2
353    movq mm2, [inter_matrix_fix + ecx*8]    movq mm2, [ebx + 768 + ecx*8]
354    pmulhw mm0, mm2               ; (level<<4 + inter_matrix[i]>>1) / inter_matrix[i]    pmulhw mm0, mm2               ; (level<<4 + inter_matrix[i]>>1) / inter_matrix[i]
355    movq mm2, [inter_matrix + 8*ecx + 8]    movq mm2, [ebx + 512 + 8*ecx + 8]
356    psrlw mm2, 1    psrlw mm2, 1
357    paddw mm3, mm2    paddw mm3, mm2
358    movq mm2, [inter_matrix_fix + ecx*8 + 8]    movq mm2, [ebx + 768 + ecx*8 + 8]
359    pmulhw mm3, mm2    pmulhw mm3, mm2
360    psrlw mm0, 1                  ; mm0 >>= 1   (/2)    psrlw mm0, 1                  ; mm0 >>= 1   (/2)
361    psrlw mm3, 1                  ;    psrlw mm3, 1                  ;
# Line 448  Line 374 
374    
375    jmp .done    jmp .done
376    
   
377  ALIGN 16  ALIGN 16
378  .q2loop  .q2loop
379    movq mm0, [esi + 8*ecx]       ; mm0 = [1st]    movq mm0, [esi + 8*ecx]       ; mm0 = [1st]
# Line 463  Line 388 
388    psubw mm3, mm4                ;    psubw mm3, mm4                ;
389    psllw mm0, 4    psllw mm0, 4
390    psllw mm3, 4    psllw mm3, 4
391    movq mm2, [inter_matrix + 8*ecx]    movq mm2, [ebx + 512 + 8*ecx]
392    psrlw mm2, 1    psrlw mm2, 1
393    paddw mm0, mm2    paddw mm0, mm2
394    movq mm2, [inter_matrix_fix + ecx*8]    movq mm2, [ebx + 768 + ecx*8]
395    pmulhw mm0, mm2               ; (level<<4 + inter_matrix[i]>>1) / inter_matrix[i]    pmulhw mm0, mm2               ; (level<<4 + inter_matrix[i]>>1) / inter_matrix[i]
396    movq mm2, [inter_matrix + 8*ecx + 8]    movq mm2, [ebx + 512 + 8*ecx + 8]
397    psrlw mm2, 1    psrlw mm2, 1
398    paddw mm3, mm2    paddw mm3, mm2
399    movq mm2, [inter_matrix_fix + ecx*8 + 8]    movq mm2, [ebx + 768 + ecx*8 + 8]
400    pmulhw mm3, mm2    pmulhw mm3, mm2
401    psrlw mm0, 2                  ; mm0 >>= 1   (/2)    psrlw mm0, 2                  ; mm0 >>= 1   (/2)
402    psrlw mm3, 2                  ;    psrlw mm3, 2                  ;
# Line 489  Line 414 
414    jnz near .q2loop    jnz near .q2loop
415    
416    jmp .done    jmp .done
417    .endfunc
418    
419    
420  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
# Line 496  Line 422 
422  ; uint32_t dequant_mpeg_intra_mmx(int16_t *data,  ; uint32_t dequant_mpeg_intra_mmx(int16_t *data,
423  ;                                 const int16_t const *coeff,  ;                                 const int16_t const *coeff,
424  ;                                 const uint32_t quant,  ;                                 const uint32_t quant,
425  ;                                 const uint32_t dcscalar);  ;                                 const uint32_t dcscalar,
426    ;                                 const uint16_t *mpeg_matrices);
427  ;  ;
428  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
429    
# Line 519  Line 446 
446    psubw mm0, mm1    ; -> mm0 = abs(coeff[i]), mm1 = sign of coeff[i]    psubw mm0, mm1    ; -> mm0 = abs(coeff[i]), mm1 = sign of coeff[i]
447    
448    movq mm2, mm7     ; mm2 = quant    movq mm2, mm7     ; mm2 = quant
449    pmullw mm2, [intra_matrix + 8*eax + 8*16 ]  ; matrix[i]*quant.    pmullw mm2, [ebx + 8*eax + 8*16 ]  ; matrix[i]*quant.
450    
451    movq mm6, mm2    movq mm6, mm2
452    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 469 
469  ALIGN 16  ALIGN 16
470  dequant_mpeg_intra_mmx:  dequant_mpeg_intra_mmx:
471    
472    mov edx, [esp+4]  ; data    push ebx
473    mov ecx, [esp+8]  ; coeff  
474    mov eax, [esp+12] ; quant    mov edx, [esp + 4 + 4]  ; data
475      mov ecx, [esp + 4 + 8]  ; coeff
476      mov eax, [esp + 4 + 12] ; quant
477      mov ebx, [esp + 4 + 20] ; mpeg_quant_matrices
478    
479    movq mm7, [mmx_mul_quant  + eax*8 - 8]    movq mm7, [mmx_mul_quant  + eax*8 - 8]
480    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 491 
491    movq mm2, mm7     ; mm2 = quant    movq mm2, mm7     ; mm2 = quant
492    
493    pcmpgtw mm4, mm3  ; mm4 = sgn(c')    pcmpgtw mm4, mm3  ; mm4 = sgn(c')
494    pmullw mm2,  [intra_matrix + 8*eax + 8*16 ]  ; matrix[i]*quant    pmullw mm2,  [ebx + 8*eax + 8*16 ]  ; matrix[i]*quant
495    
496    pxor mm0, mm1     ; negate if negative    pxor mm0, mm1     ; negate if negative
497    pxor mm3, mm4     ; negate if negative    pxor mm3, mm4     ; negate if negative
# Line 577  Line 507 
507    pmulhw mm0, mm5   ; high of coeff*(matrix*quant)    pmulhw mm0, mm5   ; high of coeff*(matrix*quant)
508    movq mm5, mm7     ; mm2 = quant    movq mm5, mm7     ; mm2 = quant
509    
510    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
511    
512    movq mm6, mm5    movq mm6, mm5
513    add eax,2   ; z-flag will be tested later    add eax,2   ; z-flag will be tested later
# Line 609  Line 539 
539    
540      ; deal with DC      ; deal with DC
541    movd mm0, [ecx]    movd mm0, [ecx]
542    pmullw mm0, [esp+16]  ; dcscalar    pmullw mm0, [esp + 4 + 16]  ; dcscalar
543    movq mm2, [mmx_32767_minus_2047]    movq mm2, [mmx_32767_minus_2047]
544    paddsw mm0, mm2    paddsw mm0, mm2
545    psubsw mm0, mm2    psubsw mm0, mm2
# Line 620  Line 550 
550    mov [edx], ax    mov [edx], ax
551    
552    xor eax, eax    xor eax, eax
553    
554      pop ebx
555    
556    ret    ret
557    .endfunc
558    
559  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
560  ;  ;
561  ; uint32_t dequant_mpeg_inter_mmx(int16_t * data,  ; uint32_t dequant_mpeg_inter_mmx(int16_t * data,
562  ;                                 const int16_t * const coeff,  ;                                 const int16_t * const coeff,
563  ;                                 const uint32_t quant);  ;                                 const uint32_t quant,
564    ;                                 const uint16_t *mpeg_matrices);
565  ;  ;
566  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
567    
# Line 638  Line 573 
573  ALIGN 16  ALIGN 16
574  dequant_mpeg_inter_mmx:  dequant_mpeg_inter_mmx:
575    
576    mov edx, [esp+ 4]        ; data    push ebx
577    mov ecx, [esp+ 8]        ; coeff  
578    mov eax, [esp+12]        ; quant    mov edx, [esp + 4 + 4]        ; data
579      mov ecx, [esp + 4 + 8]        ; coeff
580      mov eax, [esp + 4 + 12]        ; quant
581      mov ebx, [esp + 4 + 16]                  ; mpeg_quant_matrices
582    
583    movq mm7, [mmx_mul_quant  + eax*8 - 8]    movq mm7, [mmx_mul_quant  + eax*8 - 8]
584    mov eax, -16    mov eax, -16
585    paddw mm7, mm7    ; << 1    paddw mm7, mm7    ; << 1
# Line 675  Line 614 
614      ; we're short on register, here. Poor pairing...      ; we're short on register, here. Poor pairing...
615    
616    movq mm4, mm7     ; (matrix*quant)    movq mm4, mm7     ; (matrix*quant)
617    pmullw mm4,  [inter_matrix + 8*eax + 8*16 -2*8]    pmullw mm4,  [ebx + 512 + 8*eax + 8*16 -2*8]
618    movq mm5, mm4    movq mm5, mm4
619    pmulhw mm5, mm0   ; high of c*(matrix*quant)    pmulhw mm5, mm0   ; high of c*(matrix*quant)
620    pmullw mm0, mm4   ; low  of c*(matrix*quant)    pmullw mm0, mm4   ; low  of c*(matrix*quant)
621    
622    movq mm4, mm7     ; (matrix*quant)    movq mm4, mm7     ; (matrix*quant)
623    pmullw mm4,  [inter_matrix + 8*eax + 8*16 -2*8 + 8]    pmullw mm4,  [ebx + 512 + 8*eax + 8*16 -2*8 + 8]
624    
625    pcmpgtw mm5, [zero]    pcmpgtw mm5, [zero]
626    paddusw mm0, mm5    paddusw mm0, mm5
# Line 725  Line 664 
664    xor word [edx + 2*63], ax    xor word [edx + 2*63], ax
665    
666    xor eax, eax    xor eax, eax
667    
668      pop ebx
669    
670    ret    ret
671    .endfunc
672    

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

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