[svn] / trunk / xvidcore / src / bitstream / x86_asm / cbp_mmx.asm Repository:
ViewVC logotype

Diff of /trunk/xvidcore/src/bitstream/x86_asm/cbp_mmx.asm

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

revision 1540, Sun Aug 29 10:02:38 2004 UTC revision 1629, Fri Aug 5 20:49:23 2005 UTC
# Line 3  Line 3 
3  ; *  XVID MPEG-4 VIDEO CODEC  ; *  XVID MPEG-4 VIDEO CODEC
4  ; *  - MMX CBP computation -  ; *  - MMX CBP computation -
5  ; *  ; *
6  ; *  Copyright (C) 2001-2003 Peter Ross <pross@xvid.org>  ; *  Copyright (C) 2005      Carlo Bramini <carlo.bramix@libero.it>
7    ; *                2001-2003 Peter Ross <pross@xvid.org>
8  ; *                2002-2003 Pascal Massimino <skal@planet-d.net>  ; *                2002-2003 Pascal Massimino <skal@planet-d.net>
9  ; *  ; *
10  ; *  This program is free software ; you can redistribute it and/or modify  ; *  This program is free software ; you can redistribute it and/or modify
# Line 20  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: cbp_mmx.asm,v 1.12 2004-08-29 10:02:38 edgomez Exp $  ; * $Id: cbp_mmx.asm,v 1.13 2005-08-05 20:49:23 Skal Exp $
25  ; *  ; *
26  ; ***************************************************************************/  ; ***************************************************************************/
27    
# Line 60  Line 61 
61    
62  ALIGN 16  ALIGN 16
63    
64    mult_mask:
65      db 0x10,0x20,0x04,0x08,0x01,0x02,0x00,0x00
66  ignore_dc:  ignore_dc:
67          dw 0, -1, -1, -1, -1, -1, -1, -1    dw 0, -1, -1, -1
68    
69  ;=============================================================================  ;=============================================================================
70  ; Code  ; Code
# Line 75  Line 78 
78  ; uint32_t calc_cbp_mmx(const int16_t coeff[6][64]);  ; uint32_t calc_cbp_mmx(const int16_t coeff[6][64]);
79  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
80    
81    %macro      MAKE_LOAD         1
82      por mm0, [eax-128*1+%1*8]
83      por mm1, [eax+128*0+%1*8]
84      por mm2, [eax+128*1+%1*8]
85      por mm3, [eax+128*2+%1*8]
86      por mm4, [eax+128*3+%1*8]
87      por mm5, [eax+128*4+%1*8]
88    %endmacro
89    
90  ALIGN 16  ALIGN 16
91  calc_cbp_mmx:  calc_cbp_mmx:
92    push ebx    mov eax, [esp + 4]            ; coeff
   push esi  
   
   mov esi, [esp + 8 + 4]        ; coeff  
   xor eax, eax                  ; cbp = 0  
   mov edx, (1 << 5)  
93    
94    movq mm7, [ignore_dc]    movq mm7, [ignore_dc]
95      pxor mm6, mm6                ; used only for comparing
96  .loop    movq mm0, [eax+128*0]
97    movq mm0, [esi]    movq mm1, [eax+128*1]
98    movq mm1, [esi+8]    movq mm2, [eax+128*2]
99      movq mm3, [eax+128*3]
100      movq mm4, [eax+128*4]
101      movq mm5, [eax+128*5]
102      add eax, 8+128
103    pand mm0, mm7    pand mm0, mm7
104      pand mm1, mm7
105      pand mm2, mm7
106      pand mm3, mm7
107      pand mm4, mm7
108      pand mm5, mm7
109    
110      MAKE_LOAD 0
111      MAKE_LOAD 1
112      MAKE_LOAD 2
113      MAKE_LOAD 3
114      MAKE_LOAD 4
115      MAKE_LOAD 5
116      MAKE_LOAD 6
117      MAKE_LOAD 7
118      MAKE_LOAD 8
119      MAKE_LOAD 9
120      MAKE_LOAD 10
121      MAKE_LOAD 11
122      MAKE_LOAD 12
123      MAKE_LOAD 13
124      MAKE_LOAD 14
125    
126      movq mm7, [mult_mask]
127      packssdw mm0, mm1
128      packssdw mm2, mm3
129      packssdw mm4, mm5
130      packssdw mm0, mm2
131      packssdw mm4, mm6
132      pcmpgtw mm0, mm6
133      pcmpgtw mm4, mm6
134      psrlw mm0, 15
135      psrlw mm4, 15
136      packuswb mm0, mm4
137      pmaddwd mm0, mm7
138    
   por mm0, [esi+16]  
   por mm1, [esi+24]  
   
   por mm0, [esi+32]  
   por mm1, [esi+40]  
   
   por mm0, [esi+48]  
   por mm1, [esi+56]  
   
   por mm0, [esi+64]  
   por mm1, [esi+72]  
   
   por mm0, [esi+80]  
   por mm1, [esi+88]  
   
   por mm0, [esi+96]  
   por mm1, [esi+104]  
   
   por mm0, [esi+112]  
   por mm1, [esi+120]  
   
   por mm0, mm1  
139    movq mm1, mm0    movq mm1, mm0
140    psrlq mm1, 32    psrlq mm1, 32
141    lea esi, [esi + 128]    paddusb mm0, mm1
   
   por mm0, mm1  
   movd ebx, mm0  
   
   test ebx, ebx  
   jz .next  
   or eax, edx     ; cbp |= 1 << (5-i)  
   
 .next  
   shr edx,1  
   jnc .loop  
   
   pop esi  
   pop ebx  
142    
143      movd eax, mm0
144      shr eax, 8
145      and eax, 0x3F
146    ret    ret
147  .endfunc  .endfunc
148    

Legend:
Removed from v.1540  
changed lines
  Added in v.1629

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