[svn] / branches / release-1_0-branch / xvidcore / src / bitstream / x86_asm / cbp_mmx.asm Repository:
ViewVC logotype

Diff of /branches/release-1_0-branch/xvidcore/src/bitstream/x86_asm/cbp_mmx.asm

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

trunk/xvidcore/src/bitstream/x86_asm/cbp_mmx.asm revision 126, Wed Apr 17 10:54:19 2002 UTC branches/release-1_0-branch/xvidcore/src/bitstream/x86_asm/cbp_mmx.asm revision 1518, Sat Jul 24 11:38:12 2004 UTC
# Line 1  Line 1 
1  ;/**************************************************************************  ;/****************************************************************************
2  ; *  ; *
3  ; *     XVID MPEG-4 VIDEO CODEC  ; *     XVID MPEG-4 VIDEO CODEC
4  ; *     mmx cbp calc  ; *  - MMX CBP computation -
5  ; *  ; *
6  ; *     This program is an implementation of a part of one or more MPEG-4  ; *  Copyright (C) 2001-2003 Peter Ross <pross@xvid.org>
7  ; *     Video tools as specified in ISO/IEC 14496-2 standard.  Those intending  ; *                2002-2003 Pascal Massimino <skal@planet-d.net>
 ; *     to use this software module in hardware or software products are  
 ; *     advised that its use may infringe existing patents or copyrights, and  
 ; *     any such use would be at such party's own risk.  The original  
 ; *     developer of this software module and his/her company, and subsequent  
 ; *     editors and their companies, will have no liability for use of this  
 ; *     software or modifications or derivatives thereof.  
8  ; *  ; *
9  ; *     This program is free software; you can redistribute it and/or modify  ; *     This program is free software; you can redistribute it and/or modify
10  ; *     it under the terms of the GNU General Public License as published by  ; *     it under the terms of the GNU General Public License as published by
# Line 24  Line 18 
18  ; *  ; *
19  ; *     You should have received a copy of the GNU General Public License  ; *     You should have received a copy of the GNU General Public License
20  ; *     along with this program; if not, write to the Free Software  ; *     along with this program; if not, write to the Free Software
21  ; *     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  ; *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
22  ; *  ; *
23  ; *************************************************************************/  ; * $Id: cbp_mmx.asm,v 1.9.2.1 2004-07-24 11:38:12 edgomez Exp $
   
 ;/**************************************************************************  
 ; *  
 ; *     History:  
 ; *  
 ; * 17.04.2002  sse2 stuff  
 ; * 22.03.2002      0.01          ; Min Chen <chenm001@163.com>  
 ; *                               ; use 386 cpu's 'BTS' to replace 'cbp |= 1 << (edx-1)'  
 ; *     24.11.2001      inital version; (c)2001 peter ross <pross@cs.rmit.edu.au>  
24  ; *  ; *
25  ; *************************************************************************/  ; ***************************************************************************/
26    
27    BITS 32
28    
29  bits 32  ;=============================================================================
30    ; Macros
31  section .data  ;=============================================================================
32    
33  %macro cglobal 1  %macro cglobal 1
34  %ifdef PREFIX  %ifdef PREFIX
# Line 53  Line 39 
39  %endif  %endif
40  %endmacro  %endmacro
41    
42  align 16  ;=============================================================================
43    ; Local data
44    ;=============================================================================
45    
46  ignore_dc       dw              0, -1, -1, -1, -1, -1, -1, -1  %ifdef FORMAT_COFF
47    SECTION .rodata
48    %else
49    SECTION .rodata align=16
50    %endif
51    
52    ALIGN 16
53    
54  section .text  ignore_dc:
55            dw 0, -1, -1, -1, -1, -1, -1, -1
56    
57    ;=============================================================================
58    ; Code
59    ;=============================================================================
60    
61  ;===========================================================================  SECTION .text
 ;  
 ; uint32_t calc_cbp_mmx(const int16_t coeff[6][64]);  
 ;  
 ;===========================================================================  
62    
 align 16  
63  cglobal calc_cbp_mmx  cglobal calc_cbp_mmx
64  calc_cbp_mmx  
65    ;-----------------------------------------------------------------------------
66    ; uint32_t calc_cbp_mmx(const int16_t coeff[6][64]);
67    ;-----------------------------------------------------------------------------
68    
69    ALIGN 16
70    calc_cbp_mmx:
71                                  push    ebx                                  push    ebx
                                 push    ecx  
                                 push    edx  
72                                  push    esi                                  push    esi
73    
74                  mov     esi, [esp + 16 + 4]              ; coeff    mov esi, [esp + 8 + 4]        ; coeff
75      xor eax, eax                  ; cbp = 0
76      mov edx, (1 << 5)
77    
78                                  movq    mm7, [ignore_dc]                                  movq    mm7, [ignore_dc]
79    
                                 xor             eax, eax                ; cbp = 0  
                                 mov             edx, 6  
80  .loop  .loop
81                  movq    mm0, [esi]                  movq    mm0, [esi]
                                 pand    mm0, mm7  
82                  movq    mm1, [esi+8]                  movq    mm1, [esi+8]
83      pand mm0, mm7
84    
85                  por     mm0, [esi+16]                  por     mm0, [esi+16]
86                  por     mm1, [esi+24]                  por     mm1, [esi+24]
# Line 109  Line 106 
106                  por     mm0, mm1                  por     mm0, mm1
107                  movq    mm1, mm0                  movq    mm1, mm0
108                  psrlq   mm1, 32                  psrlq   mm1, 32
109      lea esi, [esi + 128]
110    
111                  por     mm0, mm1                  por     mm0, mm1
112                                  movd    ebx, mm0                                  movd    ebx, mm0
113    
114                                  add             esi, 128    test ebx, ebx
115      jz .next
116                                  or              ebx, ebx    or eax, edx     ; cbp |= 1 << (5-i)
117                                  jz              .iterate  
118    .next
119                                  ; cbp |= 1 << (edx-1)    shr edx,1
120      jnc .loop
                                 ; Change by Chenm001 <chenm001@163.com>  
                                 ;mov             ecx, edx  
                                 ;dec             ecx  
                                 ;mov             ebx, 1  
                                 ;shl             ebx, cl  
                                 ;or              eax, ebx  
                                 lea             ebx,[edx-1]  
                                 bts             eax,ebx  
   
 .iterate                dec     edx  
                                 jnz             .loop  
121    
122                                  pop     esi                                  pop     esi
                                 pop     edx  
                                 pop     ecx  
123                                  pop     ebx                                  pop     ebx
124    
125                                  ret                                  ret
   
   
   
 ;===========================================================================  
 ;  
 ; uint32_t calc_cbp_sse2(const int16_t coeff[6][64]);  
 ;  
 ; not enabled - slower than mmx?  
 ;  
 ;===========================================================================  
   
 align 16  
 cglobal calc_cbp_sse2  
 calc_cbp_sse2  
                                 push    esi  
   
                                 mov     esi, [esp + 4 + 4]              ; coeff  
                                 movdqa  xmm7, [ignore_dc]               ; mask to ignore dc value  
   
                                 xor             eax, eax                                ; cbp = 0  
                                 pxor    xmm6, xmm6                              ; zeroes to help psadbw  
   
 .first                  movdqa  xmm0, [esi]  
                                 pand    xmm0, xmm7  
                                 movdqa  xmm1, [esi+16]  
   
                                 por             xmm0, [esi+32]  
                                 por             xmm1, [esi+48]  
                                 por             xmm0, [esi+64]  
                                 por             xmm1, [esi+80]  
                                 por             xmm0, [esi+96]  
                                 por             xmm1, [esi+112]  
   
                                 por             xmm0, xmm1                              ; xmm0 = xmm1 = 128 bits worth of info  
                                 psadbw  xmm0, xmm6                              ; contains 2 dwords with sums  
                                 movhlps xmm1, xmm0                              ; move high dword from xmm0 to low xmm1  
                                 por             xmm0, xmm1                              ; combine  
                                 movd    ecx, xmm0                               ; if ecx set, values were found  
   
                                 add             esi, 128  
   
                                 or              ecx, ecx  
                                 jz              .second  
   
                                 bts             eax, 5  
   
 .second                 movdqa  xmm0, [esi]  
                                 pand    xmm0, xmm7  
                                 movdqa  xmm1, [esi+16]  
   
                                 por             xmm0, [esi+32]  
                                 por             xmm1, [esi+48]  
                                 por             xmm0, [esi+64]  
                                 por             xmm1, [esi+80]  
                                 por             xmm0, [esi+96]  
                                 por             xmm1, [esi+112]  
   
                                 por             xmm0, xmm1  
                                 psadbw  xmm0, xmm6  
                                 movhlps xmm1, xmm0  
                                 por             xmm0, xmm1  
                                 movd    ecx, xmm0  
   
                                 add             esi, 128  
   
                                 or              ecx, ecx  
                                 jz              .third  
   
                                 bts             eax, 4  
   
 .third                  movdqa  xmm0, [esi]  
                                 pand    xmm0, xmm7  
                                 movdqa  xmm1, [esi+16]  
   
                                 por             xmm0, [esi+32]  
                                 por             xmm1, [esi+48]  
                                 por             xmm0, [esi+64]  
                                 por             xmm1, [esi+80]  
                                 por             xmm0, [esi+96]  
                                 por             xmm1, [esi+112]  
   
                                 por             xmm0, xmm1  
                                 psadbw  xmm0, xmm6  
                                 movhlps xmm1, xmm0  
                                 por             xmm0, xmm1  
                                 movd    ecx, xmm0  
   
                                 add             esi, 128  
   
                                 or              ecx, ecx  
                                 jz              .fourth  
   
                                 bts             eax, 3  
   
 .fourth                 movdqa  xmm0, [esi]  
                                 pand    xmm0, xmm7  
                                 movdqa  xmm1, [esi+16]  
   
                                 por             xmm0, [esi+32]  
                                 por             xmm1, [esi+48]  
                                 por             xmm0, [esi+64]  
                                 por             xmm1, [esi+80]  
                                 por             xmm0, [esi+96]  
                                 por             xmm1, [esi+112]  
   
                                 por             xmm0, xmm1  
                                 psadbw  xmm0, xmm6  
                                 movhlps xmm1, xmm0  
                                 por             xmm0, xmm1  
                                 movd    ecx, xmm0  
   
                                 add             esi, 128  
   
                                 or              ecx, ecx  
                                 jz              .fifth  
   
                                 bts             eax, 2  
   
 .fifth                  movdqa  xmm0, [esi]  
                                 pand    xmm0, xmm7  
                                 movdqa  xmm1, [esi+16]  
   
                                 por             xmm0, [esi+32]  
                                 por             xmm1, [esi+48]  
                                 por             xmm0, [esi+64]  
                                 por             xmm1, [esi+80]  
                                 por             xmm0, [esi+96]  
                                 por             xmm1, [esi+112]  
   
                                 por             xmm0, xmm1  
                                 psadbw  xmm0, xmm6  
                                 movhlps xmm1, xmm0  
                                 por             xmm0, xmm1  
                                 movd    ecx, xmm0  
   
                                 add             esi, 128  
   
                                 or              ecx, ecx  
                                 jz              .sixth  
   
                                 bts             eax, 1  
   
 .sixth                  movdqa  xmm0, [esi]  
                                 pand    xmm0, xmm7  
                                 movdqa  xmm1, [esi+16]  
   
                                 por             xmm0, [esi+32]  
                                 por             xmm1, [esi+48]  
                                 por             xmm0, [esi+64]  
                                 por             xmm1, [esi+80]  
                                 por             xmm0, [esi+96]  
                                 por             xmm1, [esi+112]  
   
                                 por             xmm0, xmm1  
                                 psadbw  xmm0, xmm6  
                                 movhlps xmm1, xmm0  
                                 por             xmm0, xmm1  
                                 movd    ecx, xmm0  
   
                                 or              ecx, ecx  
                                 jz              .end  
   
                                 bts             eax, 0  
   
 .end                    pop     esi  
   
                                 ret  

Legend:
Removed from v.126  
changed lines
  Added in v.1518

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