[svn] / branches / release-1_2-branch / xvidcore / src / motion / x86_asm / sad_xmm.asm Repository:
ViewVC logotype

Diff of /branches/release-1_2-branch/xvidcore/src/motion/x86_asm/sad_xmm.asm

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

trunk/xvidcore/src/motion/x86_asm/sad_xmm.asm revision 851, Sat Feb 15 15:22:19 2003 UTC branches/release-1_2-branch/xvidcore/src/motion/x86_asm/sad_xmm.asm revision 1820, Fri Nov 28 16:54:45 2008 UTC
# Line 1  Line 1 
1  ;/**************************************************************************  ;/****************************************************************************
2  ; *  ; *
3  ; *     XVID MPEG-4 VIDEO CODEC  ; *     XVID MPEG-4 VIDEO CODEC
4  ; *     xmm sum of absolute difference  ; *  - K7 optimized SAD operators -
5  ; *  ; *
6  ; *     This program is an implementation of a part of one or more MPEG-4  ; *  Copyright(C) 2001 Peter Ross <pross@xvid.org>
7  ; *     Video tools as specified in ISO/IEC 14496-2 standard.  Those intending  ; *               2001-2008 Michael Militzer <michael@xvid.org>
8  ; *     to use this software module in hardware or software products are  ; *               2002 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 it
11  ; *     it under the terms of the GNU General Public License as published by  ; *  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 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: sad_xmm.asm,v 1.13 2008-11-26 01:04:34 Isibaar Exp $
   
 ;/**************************************************************************  
 ; *  
 ; *     History:  
25  ; *  ; *
26  ; * 23.07.2002  sad8bi_xmm; <pross@xvid.org>  ; ***************************************************************************/
 ; * 04.06.2002  rewrote some funcs (XMM mainly)     -Skal-  
 ; * 17.11.2001  bugfix and small improvement for dev16_xmm,  
 ; *             removed terminate early in sad16_xmm (Isibaar)  
 ; *     12.11.2001      inital version; (c)2001 peter ross <pross@cs.rmit.edu.au>  
 ; *  
 ; *************************************************************************/  
27    
28  bits 32  %include "nasm.inc"
29    
30  %macro cglobal 1  ;=============================================================================
31          %ifdef PREFIX  ; Read only data
32                  global _%1  ;=============================================================================
33                  %define %1 _%1  
34          %else  DATA
35                  global %1  
36          %endif  ALIGN SECTION_ALIGN
37    mmx_one: times 4 dw 1
38    
39    ;=============================================================================
40    ; Helper macros
41    ;=============================================================================
42    
43    %macro SAD_16x16_SSE 0
44      movq mm0, [_EAX]
45      psadbw mm0, [TMP1]
46      movq mm1, [_EAX+8]
47      add _EAX, TMP0
48      psadbw mm1, [TMP1+8]
49      paddusw mm5, mm0
50      add TMP1, TMP0
51      paddusw mm6, mm1
52  %endmacro  %endmacro
53    
54  section .data  %macro SAD_8x8_SSE 0
55      movq mm0, [_EAX]
56      movq mm1, [_EAX+TMP0]
57      psadbw mm0, [TMP1]
58      psadbw mm1, [TMP1+TMP0]
59      add _EAX, _EBX
60      add TMP1, _EBX
61            paddusw mm5, mm0
62            paddusw mm6, mm1
63    %endmacro
64    
65  align 16  %macro SADBI_16x16_SSE 0
66  mmx_one times 4 dw 1    movq mm0, [_EAX]
67      movq mm1, [_EAX+8]
68      movq mm2, [TMP1]
69      movq mm3, [TMP1+8]
70      pavgb mm2, [_EBX]
71      add TMP1, TMP0
72      pavgb mm3, [_EBX+8]
73      add _EBX, TMP0
74      psadbw mm0, mm2
75      add _EAX, TMP0
76      psadbw mm1, mm3
77      paddusw mm5, mm0
78      paddusw mm6, mm1
79    %endmacro
80    
81  section .text  %macro SADBI_8x8_XMM 0
82      movq mm0, [_EAX]
83      movq mm1, [_EAX+TMP0]
84      movq mm2, [TMP1]
85      movq mm3, [TMP1+TMP0]
86      pavgb mm2, [_EBX]
87      lea TMP1, [TMP1+2*TMP0]
88      pavgb mm3, [_EBX+TMP0]
89      lea _EBX, [_EBX+2*TMP0]
90      psadbw mm0, mm2
91      lea _EAX, [_EAX+2*TMP0]
92      psadbw mm1, mm3
93      paddusw mm5, mm0
94      paddusw mm6, mm1
95    %endmacro
96    
97    %macro MEAN_16x16_SSE 0
98      movq mm0, [_EAX]
99      movq mm1, [_EAX+8]
100      psadbw mm0, mm7
101      psadbw mm1, mm7
102      add _EAX, TMP0
103      paddw mm5, mm0
104      paddw mm6, mm1
105    %endmacro
106    
107    %macro ABS_16x16_SSE 0
108      movq mm0, [_EAX]
109      movq mm1, [_EAX+8]
110      psadbw mm0, mm4
111      psadbw mm1, mm4
112      lea _EAX, [_EAX+TMP0]
113      paddw mm5, mm0
114      paddw mm6, mm1
115    %endmacro
116    
117    ;=============================================================================
118    ; Code
119    ;=============================================================================
120    
121    SECTION .rotext align=SECTION_ALIGN
122    
123  cglobal  sad16_xmm  cglobal  sad16_xmm
124  cglobal  sad8_xmm  cglobal  sad8_xmm
125  cglobal  sad16bi_xmm  cglobal  sad16bi_xmm
126  cglobal  sad8bi_xmm  cglobal  sad8bi_xmm
127  cglobal  dev16_xmm  cglobal  dev16_xmm
128    cglobal sad16v_xmm
129    
130  ;===========================================================================  ;-----------------------------------------------------------------------------
131  ;  ;
132  ; uint32_t sad16_xmm(const uint8_t * const cur,  ; uint32_t sad16_xmm(const uint8_t * const cur,
133  ;                                       const uint8_t * const ref,  ;                                       const uint8_t * const ref,
134  ;                                       const uint32_t stride,  ;                                       const uint32_t stride,
135  ;                                       const uint32_t best_sad);  ;                                       const uint32_t best_sad);
136  ;  ;
137  ;===========================================================================  ;-----------------------------------------------------------------------------
   
 %macro SAD_16x16_SSE 0  
     movq mm0, [eax]  
     psadbw mm0, [edx]  
     movq mm1, [eax+8]  
     add eax, ecx  
     psadbw mm1, [edx+8]  
     paddusw mm5,mm0  
     add edx, ecx  
     paddusw mm6,mm1  
 %endmacro  
138    
139  align 16  ALIGN SECTION_ALIGN
140  sad16_xmm:  sad16_xmm:
141    
142      mov eax, [esp+ 4] ; Src1    mov _EAX, prm1 ; Src1
143      mov edx, [esp+ 8] ; Src2    mov TMP1, prm2 ; Src2
144      mov ecx, [esp+12] ; Stride    mov TMP0, prm3 ; Stride
145    
146      pxor mm5, mm5 ; accum1      pxor mm5, mm5 ; accum1
147      pxor mm6, mm6 ; accum2      pxor mm6, mm6 ; accum2
# Line 115  Line 167 
167      paddusw mm6,mm5      paddusw mm6,mm5
168      movd eax, mm6      movd eax, mm6
169      ret      ret
170    ENDFUNC
171    
172    
173  ;===========================================================================  ;-----------------------------------------------------------------------------
174  ;  ;
175  ; uint32_t sad8_xmm(const uint8_t * const cur,  ; uint32_t sad8_xmm(const uint8_t * const cur,
176  ;                                       const uint8_t * const ref,  ;                                       const uint8_t * const ref,
177  ;                                       const uint32_t stride);  ;                                       const uint32_t stride);
178  ;  ;
179  ;===========================================================================  ;-----------------------------------------------------------------------------
   
 %macro SAD_8x8_SSE 0  
     movq mm0, [eax]  
     movq mm1, [eax+ecx]  
   
     psadbw mm0, [edx]  
     psadbw mm1, [edx+ecx]  
     add eax, ebx  
     add edx, ebx  
   
     paddusw mm5,mm0  
     paddusw mm6,mm1  
 %endmacro  
180    
181  align 16  ALIGN SECTION_ALIGN
182  sad8_xmm:  sad8_xmm:
183    
184      mov eax, [esp+ 4] ; Src1    mov _EAX, prm1 ; Src1
185      mov edx, [esp+ 8] ; Src2    mov TMP1, prm2 ; Src2
186      mov ecx, [esp+12] ; Stride    mov TMP0, prm3 ; Stride
187      push ebx    push _EBX
188      lea ebx, [ecx+ecx]    lea _EBX, [TMP0+TMP0]
189    
190      pxor mm5, mm5 ; accum1      pxor mm5, mm5 ; accum1
191      pxor mm6, mm6 ; accum2      pxor mm6, mm6 ; accum2
# Line 154  Line 194 
194      SAD_8x8_SSE      SAD_8x8_SSE
195      SAD_8x8_SSE      SAD_8x8_SSE
196    
197      movq mm0, [eax]    movq mm0, [_EAX]
198      movq mm1, [eax+ecx]    movq mm1, [_EAX+TMP0]
199      psadbw mm0, [edx]    psadbw mm0, [TMP1]
200      psadbw mm1, [edx+ecx]    psadbw mm1, [TMP1+TMP0]
201    
202      pop ebx    pop _EBX
203    
204      paddusw mm5,mm0      paddusw mm5,mm0
205      paddusw mm6,mm1      paddusw mm6,mm1
# Line 168  Line 208 
208      movd eax, mm6      movd eax, mm6
209    
210      ret      ret
211    ENDFUNC
212    
213    
214  ;===========================================================================  ;-----------------------------------------------------------------------------
215  ;  ;
216  ; uint32_t sad16bi_xmm(const uint8_t * const cur,  ; uint32_t sad16bi_xmm(const uint8_t * const cur,
217  ;                                       const uint8_t * const ref1,  ;                                       const uint8_t * const ref1,
218  ;                                       const uint8_t * const ref2,  ;                                       const uint8_t * const ref2,
219  ;                                       const uint32_t stride);  ;                                       const uint32_t stride);
220  ;  ;
221  ;===========================================================================  ;-----------------------------------------------------------------------------
222    
223  %macro SADBI_16x16_SSE 0  ALIGN SECTION_ALIGN
     movq mm0, [eax]  
     movq mm1, [eax+8]  
   
     movq mm2, [edx]  
     movq mm3, [edx+8]  
   
     pavgb mm2, [ebx]  
     add edx, ecx  
   
     pavgb mm3, [ebx+8]  
     add ebx, ecx  
   
     psadbw mm0, mm2  
     add eax, ecx  
   
     psadbw mm1, mm3  
     paddusw mm5,mm0  
   
     paddusw mm6,mm1  
 %endmacro  
   
 align 16  
224  sad16bi_xmm:  sad16bi_xmm:
225      push ebx    mov _EAX, prm1 ; Src
226      mov eax, [esp+4+ 4] ; Src    mov TMP1, prm2 ; Ref1
227      mov edx, [esp+4+ 8] ; Ref1    mov TMP0, prm4 ; Stride
228      mov ebx, [esp+4+12] ; Ref2  
229      mov ecx, [esp+4+16] ; Stride    push _EBX
230    %ifdef ARCH_IS_X86_64
231      mov _EBX, prm3
232    %else
233      mov _EBX, [_ESP+4+12] ; Ref2
234    %endif
235      pxor mm5, mm5 ; accum1      pxor mm5, mm5 ; accum1
236      pxor mm6, mm6 ; accum2      pxor mm6, mm6 ; accum2
237    
# Line 232  Line 255 
255    
256      paddusw mm6,mm5      paddusw mm6,mm5
257      movd eax, mm6      movd eax, mm6
258      pop ebx    pop _EBX
259      ret      ret
260    ENDFUNC
261    
262  ;===========================================================================  ;-----------------------------------------------------------------------------
263  ;  ;
264  ; uint32_t sad8bi_xmm(const uint8_t * const cur,  ; uint32_t sad8bi_xmm(const uint8_t * const cur,
265  ; const uint8_t * const ref1,  ; const uint8_t * const ref1,
266  ; const uint8_t * const ref2,  ; const uint8_t * const ref2,
267  ; const uint32_t stride);  ; const uint32_t stride);
268  ;  ;
269  ;===========================================================================  ;-----------------------------------------------------------------------------
   
 %macro SADBI_8x8_XMM 0  
    movq mm0, [eax]  
    movq mm1, [eax+ecx]  
   
    movq mm2, [edx]  
    movq mm3, [edx+ecx]  
   
    pavgb mm2, [ebx]  
    lea edx, [edx+2*ecx]  
   
    pavgb mm3, [ebx+ecx]  
    lea ebx, [ebx+2*ecx]  
   
    psadbw mm0, mm2  
    lea eax, [eax+2*ecx]  
   
    psadbw mm1, mm3  
    paddusw mm5,mm0  
   
    paddusw mm6,mm1  
 %endmacro  
270    
271  align 16  ALIGN SECTION_ALIGN
272  sad8bi_xmm:  sad8bi_xmm:
273     push ebx    mov _EAX, prm1 ; Src
274     mov eax, [esp+4+ 4] ; Src    mov TMP1, prm2 ; Ref1
275     mov edx, [esp+4+ 8] ; Ref1    mov TMP0, prm4 ; Stride
276     mov ebx, [esp+4+12] ; Ref2  
277     mov ecx, [esp+4+16] ; Stride    push _EBX
278    %ifdef ARCH_IS_X86_64
279      mov _EBX, prm3
280    %else
281      mov _EBX, [_ESP+4+12] ; Ref2
282    %endif
283    
284     pxor mm5, mm5 ; accum1     pxor mm5, mm5 ; accum1
285     pxor mm6, mm6 ; accum2     pxor mm6, mm6 ; accum2
286  .Loop  .Loop:
287     SADBI_8x8_XMM     SADBI_8x8_XMM
288     SADBI_8x8_XMM     SADBI_8x8_XMM
289     SADBI_8x8_XMM     SADBI_8x8_XMM
# Line 284  Line 291 
291    
292     paddusw mm6,mm5     paddusw mm6,mm5
293     movd eax, mm6     movd eax, mm6
294     pop ebx    pop _EBX
295     ret     ret
296    ENDFUNC
297    
298    
299  ;===========================================================================  ;-----------------------------------------------------------------------------
300  ;  ;
301  ; uint32_t dev16_xmm(const uint8_t * const cur,  ; uint32_t dev16_xmm(const uint8_t * const cur,
302  ;                                       const uint32_t stride);  ;                                       const uint32_t stride);
303  ;  ;
304  ;===========================================================================  ;-----------------------------------------------------------------------------
   
 %macro MEAN_16x16_SSE 0  
     movq mm0, [eax]  
     movq mm1, [eax+8]  
     psadbw mm0, mm7  
     psadbw mm1, mm7  
     add eax, ecx  
     paddw mm5, mm0  
     paddw mm6, mm1  
 %endmacro  
   
 %macro ABS_16x16_SSE 0  
     movq mm0, [eax]  
     movq mm1, [eax+8]  
     psadbw mm0, mm4  
     psadbw mm1, mm4  
     lea eax,[eax+ecx]  
     paddw mm5, mm0  
     paddw mm6, mm1  
 %endmacro  
305    
306  align 16  ALIGN SECTION_ALIGN
307  dev16_xmm:  dev16_xmm:
308    
309      mov eax, [esp+ 4] ; Src    mov _EAX, prm1 ; Src
310      mov ecx, [esp+ 8] ; Stride    mov TMP0, prm2 ; Stride
311    
312      pxor mm7, mm7 ; zero      pxor mm7, mm7 ; zero
313      pxor mm5, mm5 ; mean accums      pxor mm5, mm5 ; mean accums
# Line 355  Line 343 
343    
344      ; mm4 contains the mean      ; mm4 contains the mean
345    
346      mov eax, [esp+ 4] ; Src    mov _EAX, prm1 ; Src
347    
348    
349      pxor mm5, mm5 ; sums      pxor mm5, mm5 ; sums
# Line 386  Line 374 
374    
375      movd eax, mm6      movd eax, mm6
376      ret      ret
377    ENDFUNC
378    
379  cglobal sad16v_xmm  ;-----------------------------------------------------------------------------
   
 ;===========================================================================  
380  ;int sad16v_xmm(const uint8_t * const cur,  ;int sad16v_xmm(const uint8_t * const cur,
381  ;               const uint8_t * const ref,  ;               const uint8_t * const ref,
382  ;               const uint32_t stride,  ;               const uint32_t stride,
383  ;               int* sad8);  ;               int* sad8);
384  ;===========================================================================  ;-----------------------------------------------------------------------------
385  align 16  
386    ALIGN SECTION_ALIGN
387  sad16v_xmm:  sad16v_xmm:
388      push ebx    mov _EAX, prm1 ; Src1
389      mov eax, [esp+4+ 4] ; Src1    mov TMP1, prm2 ; Src2
390      mov edx, [esp+4+ 8] ; Src2    mov TMP0, prm3 ; Stride
391      mov ecx, [esp+4+12] ; Stride  
392      mov ebx, [esp+4+16] ; sad ptr    push _EBX
393    %ifdef ARCH_IS_X86_64
394      mov _EBX, prm4
395    %else
396      mov _EBX, [_ESP+4+16] ; sad ptr
397    %endif
398    
399      pxor mm5, mm5 ; accum1      pxor mm5, mm5 ; accum1
400      pxor mm6, mm6 ; accum2      pxor mm6, mm6 ; accum2
401      pxor mm7, mm7 ; total      pxor mm7, mm7 ; total
402    
403      SAD_16x16_SSE      SAD_16x16_SSE
404      SAD_16x16_SSE      SAD_16x16_SSE
405      SAD_16x16_SSE      SAD_16x16_SSE
# Line 414  Line 408 
408      SAD_16x16_SSE      SAD_16x16_SSE
409      SAD_16x16_SSE      SAD_16x16_SSE
410      SAD_16x16_SSE      SAD_16x16_SSE
411    
412      paddusw mm7, mm5      paddusw mm7, mm5
413      paddusw mm7, mm6      paddusw mm7, mm6
414      movd [ebx], mm5    movd [_EBX], mm5
415      movd [ebx+4], mm6    movd [_EBX+4], mm6
416    
417      pxor mm5, mm5 ; accum1      pxor mm5, mm5 ; accum1
418      pxor mm6, mm6 ; accum2      pxor mm6, mm6 ; accum2
419    
420      SAD_16x16_SSE      SAD_16x16_SSE
421      SAD_16x16_SSE      SAD_16x16_SSE
422      SAD_16x16_SSE      SAD_16x16_SSE
# Line 429  Line 425 
425      SAD_16x16_SSE      SAD_16x16_SSE
426      SAD_16x16_SSE      SAD_16x16_SSE
427      SAD_16x16_SSE      SAD_16x16_SSE
428    
429      paddusw mm7, mm5      paddusw mm7, mm5
430      paddusw mm7, mm6      paddusw mm7, mm6
431      movd [ebx+8], mm5    movd [_EBX+8], mm5
432      movd [ebx+12], mm6    movd [_EBX+12], mm6
433    
434      movd eax, mm7      movd eax, mm7
435      pop ebx    pop _EBX
436      ret      ret
437  ;--------  ENDFUNC
438    
439    
440    %ifidn __OUTPUT_FORMAT__,elf
441    section ".note.GNU-stack" noalloc noexec nowrite progbits
442    %endif
443    

Legend:
Removed from v.851  
changed lines
  Added in v.1820

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