[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 655, Sun Nov 17 00:57:58 2002 UTC revision 1629, Fri Aug 5 20:49:23 2005 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 file is part of XviD, a free MPEG-4 video encoder/decoder  ; *  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>
9  ; *  ; *
10  ; *  XviD is free software; you can redistribute it and/or modify it  ; *  This program is free software ; you can redistribute it and/or modify
11  ; *  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
12  ; *  the Free Software Foundation; either version 2 of the License, or  ; *  the Free Software Foundation; either version 2 of the License, or
13  ; *  (at your option) any later version.  ; *  (at your option) any later version.
14  ; *  ; *
# Line 19  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  ; *  Under section 8 of the GNU General Public License, the copyright  ; * $Id: cbp_mmx.asm,v 1.13 2005-08-05 20:49:23 Skal Exp $
 ; *  holders of XVID explicitly forbid distribution in the following  
 ; *  countries:  
 ; *  
 ; *    - Japan  
 ; *    - United States of America  
 ; *  
 ; *  Linking XviD statically or dynamically with other modules is making a  
 ; *  combined work based on XviD.  Thus, the terms and conditions of the  
 ; *  GNU General Public License cover the whole combination.  
 ; *  
 ; *  As a special exception, the copyright holders of XviD give you  
 ; *  permission to link XviD with independent modules that communicate with  
 ; *  XviD solely through the VFW1.1 and DShow interfaces, regardless of the  
 ; *  license terms of these independent modules, and to copy and distribute  
 ; *  the resulting combined work under terms of your choice, provided that  
 ; *  every copy of the combined work is accompanied by a complete copy of  
 ; *  the source code of XviD (the version of XviD used to produce the  
 ; *  combined work), being distributed under the terms of the GNU General  
 ; *  Public License plus this exception.  An independent module is a module  
 ; *  which is not derived from or based on XviD.  
 ; *  
 ; *  Note that people who make modified versions of XviD are not obligated  
 ; *  to grant this special exception for their modified versions; it is  
 ; *  their choice whether to do so.  The GNU General Public License gives  
 ; *  permission to release a modified version without this exception; this  
 ; *  exception also makes it possible to release a modified version which  
 ; *  carries forward this exception.  
25  ; *  ; *
26  ; * $Id: cbp_mmx.asm,v 1.7 2002-11-17 00:57:57 edgomez Exp $  ; ***************************************************************************/
 ; *  
 ; *************************************************************************/  
27    
28  bits 32  BITS 32
29    
30  section .data  ;=============================================================================
31    ; Macros
32    ;=============================================================================
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                    %else
40                  global _%1                  global _%1
41                  %define %1 _%1                  %define %1 _%1
42                    %endif
43            %else
44                    %ifdef MARK_FUNCS
45                            global %1:function %1.endfunc-%1
46          %else          %else
47                  global %1                  global %1
48          %endif          %endif
49            %endif
50  %endmacro  %endmacro
51    
52  align 16  ;=============================================================================
53    ; Local data
54    ;=============================================================================
55    
56  ignore_dc       dw              0, -1, -1, -1, -1, -1, -1, -1  %ifdef FORMAT_COFF
57    SECTION .rodata
58    %else
59    SECTION .rodata align=16
60    %endif
61    
62  section .text  ALIGN 16
63    
64    mult_mask:
65      db 0x10,0x20,0x04,0x08,0x01,0x02,0x00,0x00
66    ignore_dc:
67      dw 0, -1, -1, -1
68    
69    ;=============================================================================
70    ; Code
71    ;=============================================================================
72    
73    SECTION .text
74    
75  cglobal calc_cbp_mmx  cglobal calc_cbp_mmx
76    
77  ;===========================================================================  ;-----------------------------------------------------------------------------
 ;  
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  align 16  %macro      MAKE_LOAD         1
82  calc_cbp_mmx:    por mm0, [eax-128*1+%1*8]
83    push  ebx    por mm1, [eax+128*0+%1*8]
84    push  esi    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    mov       esi, [esp + 8 + 4]  ; coeff  ALIGN 16
91    xor           eax, eax                        ; cbp = 0  calc_cbp_mmx:
92    mov           edx, (1 << 5)    mov eax, [esp + 4]            ; coeff
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
148    

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

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