[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 1382, Mon Mar 22 22:36:25 2004 UTC revision 1793, Tue Nov 11 20:46:24 2008 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.9 2004-03-22 22:36:23 edgomez Exp $  ; * $Id: cbp_mmx.asm,v 1.16 2008-11-11 20:46:24 Isibaar Exp $
25  ; *  ; *
26  ; ***************************************************************************/  ; ***************************************************************************/
27    
# Line 32  Line 33 
33    
34  %macro cglobal 1  %macro cglobal 1
35          %ifdef PREFIX          %ifdef PREFIX
36                    %ifdef MARK_FUNCS
37                            global _%1:function %1.endfunc-%1
38                            %define %1 _%1:function %1.endfunc-%1
39                            %define ENDFUNC .endfunc
40                    %else
41                  global _%1                  global _%1
42                  %define %1 _%1                  %define %1 _%1
43                            %define ENDFUNC
44                    %endif
45            %else
46                    %ifdef MARK_FUNCS
47                            global %1:function %1.endfunc-%1
48                            %define ENDFUNC .endfunc
49          %else          %else
50                  global %1                  global %1
51                            %define ENDFUNC
52                    %endif
53          %endif          %endif
54  %endmacro  %endmacro
55    
# Line 44  Line 58 
58  ;=============================================================================  ;=============================================================================
59    
60  %ifdef FORMAT_COFF  %ifdef FORMAT_COFF
61  SECTION .rodata data  SECTION .rodata
62  %else  %else
63  SECTION .rodata data align=16  SECTION .rodata align=16
64  %endif  %endif
65    
66  ALIGN 16  ALIGN 16
67    
68    mult_mask:
69      db 0x10,0x20,0x04,0x08,0x01,0x02,0x00,0x00
70  ignore_dc:  ignore_dc:
71          dw 0, -1, -1, -1, -1, -1, -1, -1    dw 0, -1, -1, -1
72    
73  ;=============================================================================  ;=============================================================================
74  ; Code  ; Code
# Line 66  Line 82 
82  ; uint32_t calc_cbp_mmx(const int16_t coeff[6][64]);  ; uint32_t calc_cbp_mmx(const int16_t coeff[6][64]);
83  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
84    
85    %macro      MAKE_LOAD         1
86      por mm0, [eax-128*1+%1*8]
87      por mm1, [eax+128*0+%1*8]
88      por mm2, [eax+128*1+%1*8]
89      por mm3, [eax+128*2+%1*8]
90      por mm4, [eax+128*3+%1*8]
91      por mm5, [eax+128*4+%1*8]
92    %endmacro
93    
94  ALIGN 16  ALIGN 16
95  calc_cbp_mmx:  calc_cbp_mmx:
96    push ebx    mov eax, [esp + 4]            ; coeff
   push esi  
   
   mov esi, [esp + 8 + 4]        ; coeff  
   xor eax, eax                  ; cbp = 0  
   mov edx, (1 << 5)  
97    
98    movq mm7, [ignore_dc]    movq mm7, [ignore_dc]
99      pxor mm6, mm6                ; used only for comparing
100  .loop    movq mm0, [eax+128*0]
101    movq mm0, [esi]    movq mm1, [eax+128*1]
102    movq mm1, [esi+8]    movq mm2, [eax+128*2]
103      movq mm3, [eax+128*3]
104      movq mm4, [eax+128*4]
105      movq mm5, [eax+128*5]
106      add eax, 8+128
107    pand mm0, mm7    pand mm0, mm7
108      pand mm1, mm7
109      pand mm2, mm7
110      pand mm3, mm7
111      pand mm4, mm7
112      pand mm5, mm7
113    
114      MAKE_LOAD 0
115      MAKE_LOAD 1
116      MAKE_LOAD 2
117      MAKE_LOAD 3
118      MAKE_LOAD 4
119      MAKE_LOAD 5
120      MAKE_LOAD 6
121      MAKE_LOAD 7
122      MAKE_LOAD 8
123      MAKE_LOAD 9
124      MAKE_LOAD 10
125      MAKE_LOAD 11
126      MAKE_LOAD 12
127      MAKE_LOAD 13
128      MAKE_LOAD 14
129    
130      movq mm7, [mult_mask]
131      packssdw mm0, mm1
132      packssdw mm2, mm3
133      packssdw mm4, mm5
134      packssdw mm0, mm2
135      packssdw mm4, mm6
136      pcmpeqw mm0, mm6
137      pcmpeqw mm4, mm6
138      pcmpeqw mm0, mm6
139      pcmpeqw mm4, mm6
140      psrlw mm0, 15
141      psrlw mm4, 15
142      packuswb mm0, mm4
143      pmaddwd mm0, mm7
144    
   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  
145    movq mm1, mm0    movq mm1, mm0
146    psrlq mm1, 32    psrlq mm1, 32
147    lea esi, [esi + 128]    paddusb mm0, mm1
148    
149    por mm0, mm1    movd eax, mm0
150    movd ebx, mm0    shr eax, 8
151      and eax, 0x3F
152    test ebx, ebx    ret
153    jz .next  ENDFUNC
   or eax, edx     ; cbp |= 1 << (5-i)  
154    
 .next  
   shr edx,1  
   jnc .loop  
155    
156    pop esi  %ifidn __OUTPUT_FORMAT__,elf
157    pop ebx  section ".note.GNU-stack" noalloc noexec nowrite progbits
158    %endif
159    
   ret  

Legend:
Removed from v.1382  
changed lines
  Added in v.1793

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