[cvs] / xvidcore / src / motion / x86_asm / sad_3dn.asm Repository:
ViewVC logotype

Diff of /xvidcore/src/motion/x86_asm/sad_3dn.asm

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

revision 1.4, Sun Nov 17 00:32:06 2002 UTC revision 1.11, Tue Nov 11 20:46:24 2008 UTC
# Line 1  Line 1 
1  ;/*****************************************************************************  ;/****************************************************************************
2  ; *  ; *
3  ; *  XVID MPEG-4 VIDEO CODEC  ; *  XVID MPEG-4 VIDEO CODEC
4  ; *  3dnow (*but without xmm*) sum of absolute difference  ; *  - 3DNow sad operators w/o XMM instructions -
5  ; *  ; *
6  ; *  Copyright(C) 2002 Peter Ross <pross@xvid.org>  ; *  Copyright(C) 2002 Peter ross <pross@xvid.org>
7  ; *  ; *
8  ; *  This file is part of XviD, a free MPEG-4 video encoder/decoder  ; *  This program is free software; you can redistribute it and/or modify it
 ; *  
 ; *  XviD is free software; you can redistribute it and/or modify it  
9  ; *  under the terms of the GNU General Public License as published by  ; *  under the terms of the GNU General Public License as published by
10  ; *  the Free Software Foundation; either version 2 of the License, or  ; *  the Free Software Foundation; either version 2 of the License, or
11  ; *  (at your option) any later version.  ; *  (at your option) any later version.
# Line 21  Line 19 
19  ; *  along with this program; if not, write to the Free Software  ; *  along with this program; if not, write to the Free Software
20  ; *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA  ; *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
21  ; *  ; *
 ; *  Under section 8 of the GNU General Public License, the copyright  
 ; *  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.  
 ; *  
22  ; * $Id$  ; * $Id$
23  ; *  ; *
24  ; ****************************************************************************/  ; ***************************************************************************/
25    
26  bits 32  BITS 32
27    
28  %macro cglobal 1  %macro cglobal 1
29          %ifdef PREFIX          %ifdef PREFIX
30                    %ifdef MARK_FUNCS
31                            global _%1:function %1.endfunc-%1
32                            %define %1 _%1:function %1.endfunc-%1
33                            %define ENDFUNC .endfunc
34                    %else
35                  global _%1                  global _%1
36                  %define %1 _%1                  %define %1 _%1
37                            %define ENDFUNC
38                    %endif
39            %else
40                    %ifdef MARK_FUNCS
41                            global %1:function %1.endfunc-%1
42                            %define ENDFUNC .endfunc
43          %else          %else
44                  global %1                  global %1
45                            %define ENDFUNC
46                    %endif
47          %endif          %endif
48  %endmacro  %endmacro
49    
50  section .data  ;=============================================================================
51    ; Read only data
52  align 16  ;=============================================================================
 mmx_one times 4 dw 1  
53    
54  section .text  %ifdef FORMAT_COFF
55    SECTION .rodata
56  cglobal  sad16bi_3dn  %else
57  cglobal  sad8bi_3dn  SECTION .rodata align=16
58    %endif
 ;===========================================================================  
 ;  
 ; uint32_t sad16bi_3dn(const uint8_t * const cur,  
 ; const uint8_t * const ref1,  
 ; const uint8_t * const ref2,  
 ; const uint32_t stride);  
 ;  
 ;===========================================================================  
59    
60    ALIGN 16
61    mmx_one:
62            times 4 dw 1
63    
64    ;=============================================================================
65    ; Helper macros
66    ;=============================================================================
67  %macro SADBI_16x16_3DN 0  %macro SADBI_16x16_3DN 0
68     movq mm0, [eax] ; src     movq mm0, [eax] ; src
69     movq mm2, [eax+8]     movq mm2, [eax+8]
# Line 120  Line 100 
100     paddusw mm6,mm2     paddusw mm6,mm2
101  %endmacro  %endmacro
102    
103  align 16  %macro SADBI_8x8_3DN 0
104      movq mm0, [eax] ; src
105      movq mm2, [eax+ecx]
106    
107      movq mm1, [edx] ; ref1
108      movq mm3, [edx+ecx]
109      pavgusb mm1, [ebx] ; ref2
110      lea edx, [edx+2*ecx]
111      pavgusb mm3, [ebx+ecx]
112      lea ebx, [ebx+2*ecx]
113    
114      movq mm4, mm0
115      lea eax, [eax+2*ecx]
116      psubusb mm0, mm1
117      movq mm5, mm2
118      psubusb mm2, mm3
119    
120      psubusb mm1, mm4
121      por mm0, mm1
122      psubusb mm3, mm5
123      por mm2, mm3
124    
125      movq mm1, mm0
126      movq mm3, mm2
127    
128      punpcklbw mm0,mm7
129      punpckhbw mm1,mm7
130      punpcklbw mm2,mm7
131      punpckhbw mm3,mm7
132    
133      paddusw mm0,mm1
134      paddusw mm2,mm3
135      paddusw mm6,mm0
136      paddusw mm6,mm2
137    %endmacro
138    
139    ;=============================================================================
140    ; Code
141    ;=============================================================================
142    
143    SECTION .text
144    
145    cglobal  sad16bi_3dn
146    cglobal  sad8bi_3dn
147    
148    ;-----------------------------------------------------------------------------
149    ;
150    ; uint32_t sad16bi_3dn(const uint8_t * const cur,
151    ; const uint8_t * const ref1,
152    ; const uint8_t * const ref2,
153    ; const uint32_t stride);
154    ;
155    ;-----------------------------------------------------------------------------
156    
157    ALIGN 16
158  sad16bi_3dn:  sad16bi_3dn:
159     push ebx     push ebx
160     mov eax, [esp+4+ 4] ; Src     mov eax, [esp+4+ 4] ; Src
# Line 130  Line 164 
164    
165     pxor mm6, mm6 ; accum2     pxor mm6, mm6 ; accum2
166  pxor mm7, mm7  pxor mm7, mm7
167  .Loop  .Loop:
168     SADBI_16x16_3DN     SADBI_16x16_3DN
169     SADBI_16x16_3DN     SADBI_16x16_3DN
170     SADBI_16x16_3DN     SADBI_16x16_3DN
# Line 159  Line 193 
193     pop ebx     pop ebx
194    
195     ret     ret
196    ENDFUNC
197    
198    ;-----------------------------------------------------------------------------
   
 ;===========================================================================  
199  ;  ;
200  ; uint32_t sad8bi_3dn(const uint8_t * const cur,  ; uint32_t sad8bi_3dn(const uint8_t * const cur,
201  ; const uint8_t * const ref1,  ; const uint8_t * const ref1,
202  ; const uint8_t * const ref2,  ; const uint8_t * const ref2,
203  ; const uint32_t stride);  ; const uint32_t stride);
204  ;  ;
205  ;===========================================================================  ;-----------------------------------------------------------------------------
   
 %macro SADBI_8x8_3DN 0  
    movq mm0, [eax] ; src  
    movq mm2, [eax+ecx]  
   
    movq mm1, [edx] ; ref1  
    movq mm3, [edx+ecx]  
    pavgusb mm1, [ebx] ; ref2  
    lea edx,[edx+2*ecx]  
    pavgusb mm3, [ebx+ecx]  
    lea ebx,[ebx+2*ecx]  
   
    movq mm4, mm0  
    lea eax,[eax+2*ecx]  
    psubusb mm0, mm1  
    movq mm5, mm2  
    psubusb mm2, mm3  
   
    psubusb mm1, mm4  
    por mm0, mm1  
    psubusb mm3, mm5  
    por mm2, mm3  
206    
207     movq mm1,mm0  ALIGN 16
    movq mm3,mm2  
   
    punpcklbw mm0,mm7  
    punpckhbw mm1,mm7  
    punpcklbw mm2,mm7  
    punpckhbw mm3,mm7  
   
    paddusw mm0,mm1  
    paddusw mm2,mm3  
    paddusw mm6,mm0  
    paddusw mm6,mm2  
 %endmacro  
   
 align 16  
208  sad8bi_3dn:  sad8bi_3dn:
209     push ebx     push ebx
210     mov eax, [esp+4+ 4] ; Src     mov eax, [esp+4+ 4] ; Src
# Line 217  Line 214 
214    
215     pxor mm6, mm6 ; accum2     pxor mm6, mm6 ; accum2
216  pxor mm7, mm7  pxor mm7, mm7
217  .Loop  .Loop:
218     SADBI_8x8_3DN     SADBI_8x8_3DN
219     SADBI_8x8_3DN     SADBI_8x8_3DN
220     SADBI_8x8_3DN     SADBI_8x8_3DN
# Line 233  Line 230 
230     pop ebx     pop ebx
231    
232     ret     ret
233    ENDFUNC
234    
235    
236    %ifidn __OUTPUT_FORMAT__,elf
237    section ".note.GNU-stack" noalloc noexec nowrite progbits
238    %endif
239    

Legend:
Removed from v.1.4  
changed lines
  Added in v.1.11

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