[svn] / branches / dev-api-4 / xvidcore / src / quant / x86_asm / quantize_mpeg_mmx.asm Repository:
ViewVC logotype

Diff of /branches/dev-api-4/xvidcore/src/quant/x86_asm/quantize_mpeg_mmx.asm

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

revision 1229, Sun Nov 30 09:45:52 2003 UTC revision 1230, Sun Nov 30 16:13:16 2003 UTC
# Line 21  Line 21 
21  ; *  along with this program ; if not, write to the Free Software  ; *  along with this program ; if not, write to the Free Software
22  ; *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA  ; *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
23  ; *  ; *
24  ; * $Id: quantize_mpeg_mmx.asm,v 1.1.2.4 2003-11-03 15:51:50 edgomez Exp $  ; * $Id: quantize_mpeg_mmx.asm,v 1.1.2.5 2003-11-30 16:13:16 edgomez Exp $
25  ; *  ; *
26  ; *************************************************************************/  ; *************************************************************************/
27    
# Line 76  Line 76 
76          %assign quant quant+1          %assign quant quant+1
77  %endrep  %endrep
78    
 ;-----------------------------------------------------------------------------  
 ; intra matrix  
 ;-----------------------------------------------------------------------------  
   
 cextern intra_matrix  
 cextern intra_matrix_fix  
   
 ;-----------------------------------------------------------------------------  
 ; inter matrix  
 ;-----------------------------------------------------------------------------  
   
 cextern inter_matrix  
 cextern inter_matrix_fix  
   
   
79  %define VM18P 3  %define VM18P 3
80  %define VM18Q 4  %define VM18Q 4
81    
# Line 150  Line 135 
135  ; uint32_t quant_mpeg_intra_mmx(int16_t * coeff,  ; uint32_t quant_mpeg_intra_mmx(int16_t * coeff,
136  ;                               const int16_t const * data,  ;                               const int16_t const * data,
137  ;                               const uint32_t quant,  ;                               const uint32_t quant,
138  ;                               const uint32_t dcscalar);  ;                               const uint32_t dcscalar,
139    ;                               const uint16_t *mpeg_matrices);
140  ;  ;
141  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
142    
# Line 160  Line 146 
146    push ecx    push ecx
147    push esi    push esi
148    push edi    push edi
149      push ebx
150    
151    mov edi, [esp + 12 + 4]       ; coeff    mov edi, [esp + 16 + 4]       ; coeff
152    mov esi, [esp + 12 + 8]       ; data    mov esi, [esp + 16 + 8]       ; data
153    mov eax, [esp + 12 + 12]      ; quant    mov eax, [esp + 16 + 12]      ; quant
154      mov ebx, [esp + 16 + 20]              ; mpeg_quant_matrices
155    
156    movq mm5, [quantd + eax * 8 - 8] ; quantd -> mm5    movq mm5, [quantd + eax * 8 - 8] ; quantd -> mm5
157    
# Line 190  Line 178 
178    psubw mm3, mm4                ;    psubw mm3, mm4                ;
179    psllw mm0, 4                  ; level << 4    psllw mm0, 4                  ; level << 4
180    psllw mm3, 4    psllw mm3, 4
181    movq mm2, [intra_matrix + 8*ecx]    movq mm2, [ebx + 8*ecx]
182    psrlw mm2, 1                  ; intra_matrix[i]>>1    psrlw mm2, 1                  ; intra_matrix[i]>>1
183    paddw mm0, mm2    paddw mm0, mm2
184    movq mm2, [intra_matrix_fix + ecx*8]    movq mm2, [ebx + 256 + ecx*8]
185    pmulhw mm0, mm2                       ; (level<<4 + intra_matrix[i]>>1) / intra_matrix[i]    pmulhw mm0, mm2                       ; (level<<4 + intra_matrix[i]>>1) / intra_matrix[i]
186    movq mm2, [intra_matrix + 8*ecx + 8]    movq mm2, [ebx + 8*ecx + 8]
187    psrlw mm2, 1    psrlw mm2, 1
188    paddw mm3, mm2    paddw mm3, mm2
189    movq mm2, [intra_matrix_fix + ecx*8 + 8]    movq mm2, [ebx + 256 + ecx*8 + 8]
190    pmulhw mm3, mm2    pmulhw mm3, mm2
191    paddw mm0, mm5                ; + quantd    paddw mm0, mm5                ; + quantd
192    paddw mm3, mm5    paddw mm3, mm5
# Line 220  Line 208 
208    
209  .done  .done
210    ; caclulate  data[0] // (int32_t)dcscalar)    ; caclulate  data[0] // (int32_t)dcscalar)
211    mov ecx, [esp + 12 + 16]  ; dcscalar    mov ecx, [esp + 16 + 16]  ; dcscalar
212    mov edx, ecx    mov edx, ecx
213    movsx eax, word [esi]     ; data[0]    movsx eax, word [esi]     ; data[0]
214    shr edx, 1                ; edx = dcscalar /2    shr edx, 1                ; edx = dcscalar /2
# Line 237  Line 225 
225    
226    mov [edi], ax             ; coeff[0] = ax    mov [edi], ax             ; coeff[0] = ax
227    
228      pop ebx
229    pop edi    pop edi
230    pop esi    pop esi
231    pop ecx    pop ecx
# Line 258  Line 247 
247    psubw mm3, mm4                ;    psubw mm3, mm4                ;
248    psllw mm0, 4    psllw mm0, 4
249    psllw mm3, 4    psllw mm3, 4
250    movq mm2, [intra_matrix + 8*ecx]    movq mm2, [ebx + 8*ecx]
251    psrlw mm2, 1    psrlw mm2, 1
252    paddw mm0, mm2    paddw mm0, mm2
253    movq mm2, [intra_matrix_fix + ecx*8]    movq mm2, [ebx + 256 + ecx*8]
254    pmulhw mm0, mm2                       ; (level<<4 + intra_matrix[i]>>1) / intra_matrix[i]    pmulhw mm0, mm2                       ; (level<<4 + intra_matrix[i]>>1) / intra_matrix[i]
255    movq mm2, [intra_matrix + 8*ecx + 8]    movq mm2, [ebx + 8*ecx + 8]
256    psrlw mm2, 1    psrlw mm2, 1
257    paddw mm3, mm2    paddw mm3, mm2
258    movq mm2, [intra_matrix_fix + ecx*8 + 8]    movq mm2, [ebx + 256 + ecx*8 + 8]
259    pmulhw mm3, mm2    pmulhw mm3, mm2
260    paddw mm0, mm5    paddw mm0, mm5
261    paddw mm3, mm5    paddw mm3, mm5
# Line 299  Line 288 
288    psubw mm3, mm4                ;    psubw mm3, mm4                ;
289    psllw mm0, 4    psllw mm0, 4
290    psllw mm3, 4    psllw mm3, 4
291    movq mm2, [intra_matrix + 8*ecx]    movq mm2, [ebx + 8*ecx]
292    psrlw mm2, 1    psrlw mm2, 1
293    paddw mm0, mm2    paddw mm0, mm2
294    movq mm2, [intra_matrix_fix + ecx*8]    movq mm2, [ebx + 256 + ecx*8]
295    pmulhw mm0, mm2                       ; (level<<4 + intra_matrix[i]>>1) / intra_matrix[i]    pmulhw mm0, mm2                       ; (level<<4 + intra_matrix[i]>>1) / intra_matrix[i]
296    movq mm2, [intra_matrix + 8*ecx + 8]    movq mm2, [ebx + 8*ecx + 8]
297    psrlw mm2, 1    psrlw mm2, 1
298    paddw mm3, mm2    paddw mm3, mm2
299    movq mm2, [intra_matrix_fix + ecx*8 + 8]    movq mm2, [ebx + 256 + ecx*8 + 8]
300    pmulhw mm3, mm2    pmulhw mm3, mm2
301    paddw mm0, mm5    paddw mm0, mm5
302    paddw mm3, mm5    paddw mm3, mm5
# Line 330  Line 319 
319  ;  ;
320  ; uint32_t quant_mpeg_inter_mmx(int16_t * coeff,  ; uint32_t quant_mpeg_inter_mmx(int16_t * coeff,
321  ;                               const int16_t const * data,  ;                               const int16_t const * data,
322  ;                               const uint32_t quant);  ;                               const uint32_t quant,
323    ;                               const uint16_t *mpeg_matrices);
324  ;  ;
325  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
326    
# Line 340  Line 330 
330    push ecx    push ecx
331    push esi    push esi
332    push edi    push edi
333      push ebx
334    
335    mov edi, [esp + 12 + 4]       ; coeff    mov edi, [esp + 16 + 4]       ; coeff
336    mov esi, [esp + 12 + 8]       ; data    mov esi, [esp + 16 + 8]       ; data
337    mov eax, [esp + 12 + 12]  ; quant    mov eax, [esp + 16 + 12]  ; quant
338      mov ebx, [esp + 16 + 16]              ; mpeg_quant_matrices
339    
340    xor ecx, ecx    xor ecx, ecx
341    
# Line 371  Line 363 
363    psubw mm3, mm4                ;    psubw mm3, mm4                ;
364    psllw mm0, 4    psllw mm0, 4
365    psllw mm3, 4    psllw mm3, 4
366    movq mm2, [inter_matrix + 8*ecx]    movq mm2, [ebx + 512 + 8*ecx]
367    psrlw mm2, 1    psrlw mm2, 1
368    paddw mm0, mm2    paddw mm0, mm2
369    movq mm2, [inter_matrix_fix + ecx*8]    movq mm2, [ebx + 768 + ecx*8]
370    pmulhw mm0, mm2               ; (level<<4 + inter_matrix[i]>>1) / inter_matrix[i]    pmulhw mm0, mm2               ; (level<<4 + inter_matrix[i]>>1) / inter_matrix[i]
371    movq mm2, [inter_matrix + 8*ecx + 8]    movq mm2, [ebx + 512 + 8*ecx + 8]
372    psrlw mm2, 1    psrlw mm2, 1
373    paddw mm3, mm2    paddw mm3, mm2
374    movq mm2, [inter_matrix_fix + ecx*8 + 8]    movq mm2, [ebx + 768 + ecx*8 + 8]
375    pmulhw mm3, mm2    pmulhw mm3, mm2
376    pmulhw mm0, mm7               ; mm0 = (mm0 / 2Q) >> 16    pmulhw mm0, mm7               ; mm0 = (mm0 / 2Q) >> 16
377    pmulhw mm3, mm7               ;    pmulhw mm3, mm7               ;
# Line 405  Line 397 
397    paddd mm0, mm5    paddd mm0, mm5
398    movd eax, mm0                 ; return sum    movd eax, mm0                 ; return sum
399    
400      pop ebx
401    pop edi    pop edi
402    pop esi    pop esi
403    pop ecx    pop ecx
# Line 425  Line 418 
418    psubw mm3, mm4                ;    psubw mm3, mm4                ;
419    psllw mm0, 4    psllw mm0, 4
420    psllw mm3, 4    psllw mm3, 4
421    movq mm2, [inter_matrix + 8*ecx]    movq mm2, [ebx + 512 + 8*ecx]
422    psrlw mm2, 1    psrlw mm2, 1
423    paddw mm0, mm2    paddw mm0, mm2
424    movq mm2, [inter_matrix_fix + ecx*8]    movq mm2, [ebx + 768 + ecx*8]
425    pmulhw mm0, mm2               ; (level<<4 + inter_matrix[i]>>1) / inter_matrix[i]    pmulhw mm0, mm2               ; (level<<4 + inter_matrix[i]>>1) / inter_matrix[i]
426    movq mm2, [inter_matrix + 8*ecx + 8]    movq mm2, [ebx + 512 + 8*ecx + 8]
427    psrlw mm2, 1    psrlw mm2, 1
428    paddw mm3, mm2    paddw mm3, mm2
429    movq mm2, [inter_matrix_fix + ecx*8 + 8]    movq mm2, [ebx + 768 + ecx*8 + 8]
430    pmulhw mm3, mm2    pmulhw mm3, mm2
431    psrlw mm0, 1                  ; mm0 >>= 1   (/2)    psrlw mm0, 1                  ; mm0 >>= 1   (/2)
432    psrlw mm3, 1                  ;    psrlw mm3, 1                  ;
# Line 467  Line 460 
460    psubw mm3, mm4                ;    psubw mm3, mm4                ;
461    psllw mm0, 4    psllw mm0, 4
462    psllw mm3, 4    psllw mm3, 4
463    movq mm2, [inter_matrix + 8*ecx]    movq mm2, [ebx + 512 + 8*ecx]
464    psrlw mm2, 1    psrlw mm2, 1
465    paddw mm0, mm2    paddw mm0, mm2
466    movq mm2, [inter_matrix_fix + ecx*8]    movq mm2, [ebx + 768 + ecx*8]
467    pmulhw mm0, mm2               ; (level<<4 + inter_matrix[i]>>1) / inter_matrix[i]    pmulhw mm0, mm2               ; (level<<4 + inter_matrix[i]>>1) / inter_matrix[i]
468    movq mm2, [inter_matrix + 8*ecx + 8]    movq mm2, [ebx + 512 + 8*ecx + 8]
469    psrlw mm2, 1    psrlw mm2, 1
470    paddw mm3, mm2    paddw mm3, mm2
471    movq mm2, [inter_matrix_fix + ecx*8 + 8]    movq mm2, [ebx + 768 + ecx*8 + 8]
472    pmulhw mm3, mm2    pmulhw mm3, mm2
473    psrlw mm0, 2                  ; mm0 >>= 1   (/2)    psrlw mm0, 2                  ; mm0 >>= 1   (/2)
474    psrlw mm3, 2                  ;    psrlw mm3, 2                  ;
# Line 500  Line 493 
493  ; uint32_t dequant_mpeg_intra_mmx(int16_t *data,  ; uint32_t dequant_mpeg_intra_mmx(int16_t *data,
494  ;                                 const int16_t const *coeff,  ;                                 const int16_t const *coeff,
495  ;                                 const uint32_t quant,  ;                                 const uint32_t quant,
496  ;                                 const uint32_t dcscalar);  ;                                 const uint32_t dcscalar,
497    ;                                 const uint16_t *mpeg_matrices);
498  ;  ;
499  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
500    
# Line 523  Line 517 
517    psubw mm0, mm1    ; -> mm0 = abs(coeff[i]), mm1 = sign of coeff[i]    psubw mm0, mm1    ; -> mm0 = abs(coeff[i]), mm1 = sign of coeff[i]
518    
519    movq mm2, mm7     ; mm2 = quant    movq mm2, mm7     ; mm2 = quant
520    pmullw mm2, [intra_matrix + 8*eax + 8*16 ]  ; matrix[i]*quant.    pmullw mm2, [ebx + 8*eax + 8*16 ]  ; matrix[i]*quant.
521    
522    movq mm6, mm2    movq mm6, mm2
523    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 546  Line 540 
540  ALIGN 16  ALIGN 16
541  dequant_mpeg_intra_mmx:  dequant_mpeg_intra_mmx:
542    
543    mov edx, [esp+4]  ; data    push ebx
544    mov ecx, [esp+8]  ; coeff  
545    mov eax, [esp+12] ; quant    mov edx, [esp + 4 + 4]  ; data
546      mov ecx, [esp + 4 + 8]  ; coeff
547      mov eax, [esp + 4 + 12] ; quant
548      mov ebx, [esp + 4 + 20] ; mpeg_quant_matrices
549    
550    movq mm7, [mmx_mul_quant  + eax*8 - 8]    movq mm7, [mmx_mul_quant  + eax*8 - 8]
551    mov eax, -16      ; to keep ALIGNed, we regularly process coeff[0]    mov eax, -16      ; to keep ALIGNed, we regularly process coeff[0]
# Line 565  Line 562 
562    movq mm2, mm7     ; mm2 = quant    movq mm2, mm7     ; mm2 = quant
563    
564    pcmpgtw mm4, mm3  ; mm4 = sgn(c')    pcmpgtw mm4, mm3  ; mm4 = sgn(c')
565    pmullw mm2,  [intra_matrix + 8*eax + 8*16 ]  ; matrix[i]*quant    pmullw mm2,  [ebx + 8*eax + 8*16 ]  ; matrix[i]*quant
566    
567    pxor mm0, mm1     ; negate if negative    pxor mm0, mm1     ; negate if negative
568    pxor mm3, mm4     ; negate if negative    pxor mm3, mm4     ; negate if negative
# Line 581  Line 578 
578    pmulhw mm0, mm5   ; high of coeff*(matrix*quant)    pmulhw mm0, mm5   ; high of coeff*(matrix*quant)
579    movq mm5, mm7     ; mm2 = quant    movq mm5, mm7     ; mm2 = quant
580    
581    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
582    
583    movq mm6, mm5    movq mm6, mm5
584    add eax,2   ; z-flag will be tested later    add eax,2   ; z-flag will be tested later
# Line 613  Line 610 
610    
611      ; deal with DC      ; deal with DC
612    movd mm0, [ecx]    movd mm0, [ecx]
613    pmullw mm0, [esp+16]  ; dcscalar    pmullw mm0, [esp + 4 + 16]  ; dcscalar
614    movq mm2, [mmx_32767_minus_2047]    movq mm2, [mmx_32767_minus_2047]
615    paddsw mm0, mm2    paddsw mm0, mm2
616    psubsw mm0, mm2    psubsw mm0, mm2
# Line 624  Line 621 
621    mov [edx], ax    mov [edx], ax
622    
623    xor eax, eax    xor eax, eax
624    
625      pop ebx
626    
627    ret    ret
628    
629  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
630  ;  ;
631  ; uint32_t dequant_mpeg_inter_mmx(int16_t * data,  ; uint32_t dequant_mpeg_inter_mmx(int16_t * data,
632  ;                                 const int16_t * const coeff,  ;                                 const int16_t * const coeff,
633  ;                                 const uint32_t quant);  ;                                 const uint32_t quant,
634    ;                                 const uint16_t *mpeg_matrices);
635  ;  ;
636  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
637    
# Line 642  Line 643 
643  ALIGN 16  ALIGN 16
644  dequant_mpeg_inter_mmx:  dequant_mpeg_inter_mmx:
645    
646    mov edx, [esp+ 4]        ; data    push ebx
647    mov ecx, [esp+ 8]        ; coeff  
648    mov eax, [esp+12]        ; quant    mov edx, [esp + 4 + 4]        ; data
649      mov ecx, [esp + 4 + 8]        ; coeff
650      mov eax, [esp + 4 + 12]        ; quant
651      mov ebx, [esp + 4 + 16]                  ; mpeg_quant_matrices
652    
653    movq mm7, [mmx_mul_quant  + eax*8 - 8]    movq mm7, [mmx_mul_quant  + eax*8 - 8]
654    mov eax, -16    mov eax, -16
655    paddw mm7, mm7    ; << 1    paddw mm7, mm7    ; << 1
# Line 679  Line 684 
684      ; we're short on register, here. Poor pairing...      ; we're short on register, here. Poor pairing...
685    
686    movq mm4, mm7     ; (matrix*quant)    movq mm4, mm7     ; (matrix*quant)
687    pmullw mm4,  [inter_matrix + 8*eax + 8*16 -2*8]    pmullw mm4,  [ebx + 512 + 8*eax + 8*16 -2*8]
688    movq mm5, mm4    movq mm5, mm4
689    pmulhw mm5, mm0   ; high of c*(matrix*quant)    pmulhw mm5, mm0   ; high of c*(matrix*quant)
690    pmullw mm0, mm4   ; low  of c*(matrix*quant)    pmullw mm0, mm4   ; low  of c*(matrix*quant)
691    
692    movq mm4, mm7     ; (matrix*quant)    movq mm4, mm7     ; (matrix*quant)
693    pmullw mm4,  [inter_matrix + 8*eax + 8*16 -2*8 + 8]    pmullw mm4,  [ebx + 512 + 8*eax + 8*16 -2*8 + 8]
694    
695    pcmpgtw mm5, [zero]    pcmpgtw mm5, [zero]
696    paddusw mm0, mm5    paddusw mm0, mm5
# Line 729  Line 734 
734    xor word [edx + 2*63], ax    xor word [edx + 2*63], ax
735    
736    xor eax, eax    xor eax, eax
737    
738      pop ebx
739    
740    ret    ret

Legend:
Removed from v.1229  
changed lines
  Added in v.1230

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