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

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

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

revision 1519, Sat Jul 24 11:46:08 2004 UTC revision 1719, Tue Jul 11 10:01:27 2006 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.3 2004-07-24 11:46:08 edgomez Exp $  ; * $Id: quantize_mpeg_mmx.asm,v 1.7 2006-07-11 10:01:27 chl Exp $
25  ; *  ; *
26  ; *************************************************************************/  ; *************************************************************************/
27    
# 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 120  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 130  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,
# Line 143  Line 202 
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    push ebx    movq mm7, [mmx_rounding]
   
   mov edi, [esp + 16 + 4]       ; coeff  
   mov esi, [esp + 16 + 8]       ; data  
   mov eax, [esp + 16 + 12]      ; quant  
   mov ebx, [esp + 16 + 20]              ; mpeg_quant_matrices  
207    
208    movq mm5, [quantd + eax * 8 - 8] ; quantd -> mm5    mov eax, [esp + 4 + 8]                ; data
209      mov ecx, [esp + 4 + 20]               ; mpeg_quant_matrices
210    xor ecx, ecx    mov edi, [esp + 4 + 4]                ; coeff
211    cmp al, 1  
212    jz near .q1loop    QUANT_MMX(0)
213      QUANT_MMX(1)
214    cmp al, 2    QUANT_MMX(2)
215    jz near .q2loop    QUANT_MMX(3)
216      QUANT_MMX(4)
217    movq mm7, [mmx_div + eax * 8 - 8] ; multipliers[quant] -> mm7    QUANT_MMX(5)
218      QUANT_MMX(6)
219  ALIGN 16    QUANT_MMX(7)
220  .loop  
221    movq mm0, [esi + 8*ecx]       ; mm0 = [1st]    ; calculate DC
222    movq mm3, [esi + 8*ecx + 8]   ;    movsx eax, word [eax]     ; data[0]
223    pxor mm1, mm1                 ; mm1 = 0    mov ecx, [esp + 4 + 16]   ; dcscalar
   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, [ebx + 8*ecx]  
   psrlw mm2, 1                  ; intra_matrix[i]>>1  
   paddw mm0, mm2  
   movq mm2, [ebx + 256 + ecx*8]  
   pmulhw mm0, mm2                       ; (level<<4 + intra_matrix[i]>>1) / intra_matrix[i]  
   movq mm2, [ebx + 8*ecx + 8]  
   psrlw mm2, 1  
   paddw mm3, mm2  
   movq mm2, [ebx + 256 + 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 + 16 + 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    
   pop ebx  
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, [ebx + 8*ecx]  
   psrlw mm2, 1  
   paddw mm0, mm2  
   movq mm2, [ebx + 256 + ecx*8]  
   pmulhw mm0, mm2                       ; (level<<4 + intra_matrix[i]>>1) / intra_matrix[i]  
   movq mm2, [ebx + 8*ecx + 8]  
   psrlw mm2, 1  
   paddw mm3, mm2  
   movq mm2, [ebx + 256 + 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, [ebx + 8*ecx]  
   psrlw mm2, 1  
   paddw mm0, mm2  
   movq mm2, [ebx + 256 + ecx*8]  
   pmulhw mm0, mm2                       ; (level<<4 + intra_matrix[i]>>1) / intra_matrix[i]  
   movq mm2, [ebx + 8*ecx + 8]  
   psrlw mm2, 1  
   paddw mm3, mm2  
   movq mm2, [ebx + 256 + 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  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
# Line 445  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 486  Line 414 
414    jnz near .q2loop    jnz near .q2loop
415    
416    jmp .done    jmp .done
417    .endfunc
418    
419    
420  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
# Line 625  Line 554 
554    pop ebx    pop ebx
555    
556    ret    ret
557    .endfunc
558    
559  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
560  ;  ;
# Line 738  Line 668 
668    pop ebx    pop ebx
669    
670    ret    ret
671    .endfunc
672    

Legend:
Removed from v.1519  
changed lines
  Added in v.1719

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