[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 53, Fri Mar 22 04:37:03 2002 UTC revision 1844, Thu Dec 4 14:41:50 2008 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) 2005      Carlo Bramini <carlo.bramix@libero.it>
7  ; *     Video tools as specified in ISO/IEC 14496-2 standard.  Those intending  ; *                2001-2003 Peter Ross <pross@xvid.org>
8  ; *     to use this software module in hardware or software products are  ; *                2002-2003 Pascal Massimino <skal@planet-d.net>
 ; *     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.  
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
11  ; *     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 19 
19  ; *  ; *
20  ; *     You should have received a copy of the GNU General Public License  ; *     You should have received a copy of the GNU General Public License
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., 675 Mass Ave, Cambridge, MA 02139, USA.  ; *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
23  ; *  ; *
24  ; *************************************************************************/  ; * $Id: cbp_mmx.asm,v 1.18 2008-12-04 14:41:50 Isibaar Exp $
   
 ;/**************************************************************************  
 ; *  
 ; *     History:  
 ; *  
 ; *     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>  
25  ; *  ; *
26  ; *************************************************************************/  ; ***************************************************************************/
27    
28    ;=============================================================================
29    ; Macros
30    ;=============================================================================
31    
32  bits 32  %include "nasm.inc"
33    
34  section .data  ;=============================================================================
35    ; Local data
36    ;=============================================================================
37    
38  %macro cglobal 1  DATA
 %ifdef PREFIX  
 global _%1  
 %define %1 _%1  
 %else  
 global %1  
 %endif  
 %endmacro  
39    
40  ignore_dc       dw              0, -1, -1, -1  ALIGN SECTION_ALIGN
41    
42    mult_mask:
43      db 0x10,0x20,0x04,0x08,0x01,0x02,0x00,0x00
44    ignore_dc:
45      dw 0, -1, -1, -1
46    
47  section .text  ;=============================================================================
48    ; Code
49    ;=============================================================================
50    
51    TEXT
52    
 ;===========================================================================  
 ;  
 ; uint32_t calc_cbp_mmx(const int16_t coeff[6][64]);  
 ;  
 ;===========================================================================  
   
 align 16  
53  cglobal calc_cbp_mmx  cglobal calc_cbp_mmx
 calc_cbp_mmx  
                                 push    ebx  
                                 push    ecx  
                                 push    edx  
                                 push    esi  
   
                 mov     esi, [esp + 16 + 4]              ; coeff  
                                 movq    mm7, [ignore_dc]  
   
                                 xor             eax, eax                ; cbp = 0  
                                 mov             edx, 6  
 .loop  
                 movq    mm0, [esi]  
                                 pand    mm0, mm7  
                 movq    mm1, [esi+8]  
54    
55                  por     mm0, [esi+16]  ;-----------------------------------------------------------------------------
56                  por     mm1, [esi+24]  ; uint32_t calc_cbp_mmx(const int16_t coeff[6][64]);
57    ;-----------------------------------------------------------------------------
                 por     mm0, [esi+32]  
                 por     mm1, [esi+40]  
   
                 por     mm0, [esi+48]  
                 por     mm1, [esi+56]  
   
                 por     mm0, [esi+64]  
                 por     mm1, [esi+72]  
58    
59                  por     mm0, [esi+80]  %macro      MAKE_LOAD         2
60                  por     mm1, [esi+88]    por mm0, [%2-128*1+%1*8]
61      por mm1, [%2+128*0+%1*8]
62      por mm2, [%2+128*1+%1*8]
63      por mm3, [%2+128*2+%1*8]
64      por mm4, [%2+128*3+%1*8]
65      por mm5, [%2+128*4+%1*8]
66    %endmacro
67    
68                  por     mm0, [esi+96]  ALIGN SECTION_ALIGN
69                  por     mm1, [esi+104]  calc_cbp_mmx:
70      mov _EAX, prm1            ; coeff
71    
72                  por     mm0, [esi+112]    movq mm7, [ignore_dc]
73                  por     mm1, [esi+120]    pxor mm6, mm6                ; used only for comparing
74      movq mm0, [_EAX+128*0]
75      movq mm1, [_EAX+128*1]
76      movq mm2, [_EAX+128*2]
77      movq mm3, [_EAX+128*3]
78      movq mm4, [_EAX+128*4]
79      movq mm5, [_EAX+128*5]
80      add _EAX, 8+128
81      pand mm0, mm7
82      pand mm1, mm7
83      pand mm2, mm7
84      pand mm3, mm7
85      pand mm4, mm7
86      pand mm5, mm7
87    
88      MAKE_LOAD 0, _EAX
89      MAKE_LOAD 1, _EAX
90      MAKE_LOAD 2, _EAX
91      MAKE_LOAD 3, _EAX
92      MAKE_LOAD 4, _EAX
93      MAKE_LOAD 5, _EAX
94      MAKE_LOAD 6, _EAX
95      MAKE_LOAD 7, _EAX
96      MAKE_LOAD 8, _EAX
97      MAKE_LOAD 9, _EAX
98      MAKE_LOAD 10, _EAX
99      MAKE_LOAD 11, _EAX
100      MAKE_LOAD 12, _EAX
101      MAKE_LOAD 13, _EAX
102      MAKE_LOAD 14, _EAX
103    
104      movq mm7, [mult_mask]
105      packssdw mm0, mm1
106      packssdw mm2, mm3
107      packssdw mm4, mm5
108      packssdw mm0, mm2
109      packssdw mm4, mm6
110      pcmpeqw mm0, mm6
111      pcmpeqw mm4, mm6
112      pcmpeqw mm0, mm6
113      pcmpeqw mm4, mm6
114      psrlw mm0, 15
115      psrlw mm4, 15
116      packuswb mm0, mm4
117      pmaddwd mm0, mm7
118    
                 por     mm0, mm1  
119                  movq    mm1, mm0                  movq    mm1, mm0
120                  psrlq   mm1, 32                  psrlq   mm1, 32
121                  por     mm0, mm1    paddusb mm0, mm1
                                 movd    ebx, mm0  
122    
123                                  add             esi, 128    movd eax, mm0
124      shr _EAX, 8
125      and _EAX, 0x3F
126      ret
127    ENDFUNC
128    
                                 or              ebx, ebx  
                                 jz              .iterate  
129    
130                                  ; cbp |= 1 << (edx-1)  %ifidn __OUTPUT_FORMAT__,elf
131    section ".note.GNU-stack" noalloc noexec nowrite progbits
132                                  ; Change by Chenm001 <chenm001@163.com>  %endif
                                 ;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  
   
                                 pop     esi  
                                 pop     edx  
                                 pop     ecx  
                                 pop     ebx  
133    
                                 ret  

Legend:
Removed from v.53  
changed lines
  Added in v.1844

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