[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 430, Fri Sep 6 16:59:47 2002 UTC branches/release-1_2-branch/xvidcore/src/motion/x86_asm/sad_xmm.asm revision 1877, Wed Sep 16 17:11:39 2009 UTC
# Line 1  Line 1 
1  ;/*****************************************************************************  ;/****************************************************************************
2  ; *  ; *
3  ; *  XVID MPEG-4 VIDEO CODEC  ; *  XVID MPEG-4 VIDEO CODEC
4  ; *  xmm (extended mmx) sum of absolute difference  ; *  - K7 optimized SAD operators -
5  ; *  ; *
6  ; *  Copyright(C) 2002 Peter Ross <pross@xvid.org>  ; *  Copyright(C) 2001 Peter Ross <pross@xvid.org>
7  ; *  Copyright(C) 2002 Michael Militzer <michael@xvid.org>  ; *               2001-2008 Michael Militzer <michael@xvid.org>
8  ; *  Copyright(C) 2002 -Skal-  ; *               2002 Pascal Massimino <skal@planet-d.net>
9  ; *  ; *
10  ; *  This program is an implementation of a part of one or more MPEG-4  ; *  This program is free software; you can redistribute it and/or modify it
11  ; *  Video tools as specified in ISO/IEC 14496-2 standard.  Those intending  ; *  under the terms of the GNU General Public License as published by
 ; *  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.  
 ; *  
 ; *  This program is free software; you can redistribute it and/or modify  
 ; *  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 30  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  ; *************************************************************************/  ; * $Id: sad_xmm.asm,v 1.13.2.2 2009-09-16 17:11:39 Isibaar Exp $
25    ; *
26    ; ***************************************************************************/
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
53    
54    %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    %macro SADBI_16x16_SSE 0
66      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    %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  %endmacro
106    
107  section .data  %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  align 16  ;=============================================================================
118  mmx_one times 4 dw 1  ; Code
119    ;=============================================================================
120    
121  section .text  TEXT
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  ;===========================================================================  ;-----------------------------------------------------------------------------
138    
139  %macro SAD_16x16_SSE 0  ALIGN SECTION_ALIGN
     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  
   
 align 16  
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 107  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  
180    
181      paddusw mm5,mm0  ALIGN SECTION_ALIGN
     paddusw mm6,mm1  
 %endmacro  
   
 align 16  
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 146  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 160  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  ;===========================================================================  ;-----------------------------------------------------------------------------
   
 %macro SADBI_16x16_SSE 0  
     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  
222    
223  align 16  ALIGN SECTION_ALIGN
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 224  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]  
270    
271     movq mm2, [edx]  ALIGN SECTION_ALIGN
    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  
   
 align 16  
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 276  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  ;===========================================================================  ;-----------------------------------------------------------------------------
305    
306  %macro MEAN_16x16_SSE 0  ALIGN SECTION_ALIGN
     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  
   
 align 16  
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 347  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
350      pxor mm6, mm6      pxor mm6, mm6
# Line 377  Line 374 
374    
375      movd eax, mm6      movd eax, mm6
376      ret      ret
377    ENDFUNC
378    
379    ;-----------------------------------------------------------------------------
380    ;int sad16v_xmm(const uint8_t * const cur,
381    ;               const uint8_t * const ref,
382    ;               const uint32_t stride,
383    ;               int* sad8);
384    ;-----------------------------------------------------------------------------
385    
386    ALIGN SECTION_ALIGN
387    sad16v_xmm:
388      mov _EAX, prm1 ; Src1
389      mov TMP1, prm2 ; Src2
390      mov TMP0, prm3 ; Stride
391    
392      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
400      pxor mm6, mm6 ; accum2
401      pxor mm7, mm7 ; total
402    
403      SAD_16x16_SSE
404      SAD_16x16_SSE
405      SAD_16x16_SSE
406      SAD_16x16_SSE
407      SAD_16x16_SSE
408      SAD_16x16_SSE
409      SAD_16x16_SSE
410      SAD_16x16_SSE
411    
412      paddusw mm7, mm5
413      paddusw mm7, mm6
414      movd [_EBX], mm5
415      movd [_EBX+4], mm6
416    
417      pxor mm5, mm5 ; accum1
418      pxor mm6, mm6 ; accum2
419    
420      SAD_16x16_SSE
421      SAD_16x16_SSE
422      SAD_16x16_SSE
423      SAD_16x16_SSE
424      SAD_16x16_SSE
425      SAD_16x16_SSE
426      SAD_16x16_SSE
427      SAD_16x16_SSE
428    
429      paddusw mm7, mm5
430      paddusw mm7, mm6
431      movd [_EBX+8], mm5
432      movd [_EBX+12], mm6
433    
434      movd eax, mm7
435      pop _EBX
436      ret
437    ENDFUNC
438    
439    NON_EXEC_STACK

Legend:
Removed from v.430  
changed lines
  Added in v.1877

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