[svn] / trunk / xvidcore / src / motion / x86_asm / sad_xmm.asm Repository:
ViewVC logotype

Diff of /trunk/xvidcore/src/motion/x86_asm/sad_xmm.asm

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

revision 262, Sun Jul 7 09:45:40 2002 UTC revision 1795, Wed Nov 26 01:04:34 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 free software; you can redistribute it and/or modify  ; *  Copyright(C) 2001 Peter Ross <pross@xvid.org>
7  ; *     it under the terms of the GNU General Public License as published by  ; *               2001-2008 Michael Militzer <michael@xvid.org>
8    ; *               2002 Pascal Massimino <skal@planet-d.net>
9    ; *
10    ; *  This program is free software; you can redistribute it and/or modify it
11    ; *  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 15  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  ; *     History:  ; * $Id: sad_xmm.asm,v 1.13 2008-11-26 01:04:34 Isibaar Exp $
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  %macro cglobal 1  
30          %ifdef PREFIX  ;=============================================================================
31                  global _%1  ; Read only data
32                  %define %1 _%1  ;=============================================================================
33          %else  
34                  global %1  DATA
35          %endif  
36    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  %endmacro
64    
65  section .data  %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  align 16  %macro SADBI_8x8_XMM 0
82  mmx_one times 4 dw 1    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  section .text  %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,
135  ;                                       const uint32_t best_sad);  ;                                       const uint32_t best_sad);
136  cglobal  sad8_xmm  ;
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 104  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  ;===========================================================================  ;-----------------------------------------------------------------------------
180    
181  %macro SADBI_16x16_SSE 0  ALIGN SECTION_ALIGN
182      movq mm0, [eax]  sad8_xmm:
     movq mm1, [eax+8]  
183    
184      movq mm2, [edx]    mov _EAX, prm1 ; Src1
185      movq mm3, [edx+8]    mov TMP1, prm2 ; Src2
186      mov TMP0, prm3 ; Stride
187      push _EBX
188      lea _EBX, [TMP0+TMP0]
189    
190      pavgb mm2, [ebx]    pxor mm5, mm5 ; accum1
191      add edx, ecx    pxor mm6, mm6 ; accum2
192    
193      pavgb mm3, [ebx+8]    SAD_8x8_SSE
194      add ebx, ecx    SAD_8x8_SSE
195      SAD_8x8_SSE
196    
197      psadbw mm0, mm2    movq mm0, [_EAX]
198      add eax, ecx    movq mm1, [_EAX+TMP0]
199      psadbw mm0, [TMP1]
200      psadbw mm1, [TMP1+TMP0]
201    
202      psadbw mm1, mm3    pop _EBX
     paddusw mm5,mm0  
203    
204      paddusw mm5,mm0
205      paddusw mm6,mm1      paddusw mm6,mm1
 %endmacro  
206    
207  align 16    paddusw mm6,mm5
208  sad16bi_xmm:    movd eax, mm6
209      push ebx  
210      mov eax, [esp+4+ 4] ; Src    ret
211      mov edx, [esp+4+ 8] ; Ref1  ENDFUNC
212      mov ebx, [esp+4+12] ; Ref2  
     mov ecx, [esp+4+16] ; Stride  
213    
214    ;-----------------------------------------------------------------------------
215    ;
216    ; uint32_t sad16bi_xmm(const uint8_t * const cur,
217    ;                                       const uint8_t * const ref1,
218    ;                                       const uint8_t * const ref2,
219    ;                                       const uint32_t stride);
220    ;
221    ;-----------------------------------------------------------------------------
222    
223    ALIGN SECTION_ALIGN
224    sad16bi_xmm:
225      mov _EAX, prm1 ; Src
226      mov TMP1, prm2 ; Ref1
227      mov TMP0, prm4 ; Stride
228    
229      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 167  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  ;===========================================================================  ;-----------------------------------------------------------------------------
270    
271  ;===========================================================================  ALIGN SECTION_ALIGN
272  ;  sad8bi_xmm:
273  ; uint32_t sad8_xmm(const uint8_t * const cur,    mov _EAX, prm1 ; Src
274  ;                                       const uint8_t * const ref,    mov TMP1, prm2 ; Ref1
275  ;                                       const uint32_t stride);    mov TMP0, prm4 ; Stride
276  ;  
277  ;===========================================================================    push _EBX
278    %ifdef ARCH_IS_X86_64
279  %macro SAD_8x8_SSE 0    mov _EBX, prm3
280      movq mm0, [eax]  %else
281      movq mm1, [eax+ecx]    mov _EBX, [_ESP+4+12] ; Ref2
282  %macro MEAN_16x16_SSE 0  %endif
     psadbw mm0, [edx]  
     psadbw mm1, [edx+ecx]  
     add eax, ebx  
     add edx, ebx  
   
     paddusw mm5,mm0  
     paddusw mm6,mm1  
 %endmacro  
   
 align 16  
 sad8_xmm:  
   
     mov eax, [esp+ 4] ; Src1  
     mov edx, [esp+ 8] ; Src2  
     mov ecx, [esp+12] ; Stride  
     push ebx  
     lea ebx, [ecx+ecx]  
283    
284      pxor mm5, mm5 ; accum1      pxor mm5, mm5 ; accum1
285      pxor mm6, mm6 ; accum2      pxor mm6, mm6 ; accum2
286    .Loop:
287      SAD_8x8_SSE    SADBI_8x8_XMM
288      SAD_8x8_SSE    SADBI_8x8_XMM
289      SAD_8x8_SSE    SADBI_8x8_XMM
290      SADBI_8x8_XMM
     movq mm0, [eax]  
     movq mm1, [eax+ecx]  
     psadbw mm0, [edx]  
     psadbw mm1, [edx+ecx]  
   
     pop ebx  
   
     paddusw mm5,mm0  
     paddusw mm6,mm1  
291    
292      paddusw mm6,mm5      paddusw mm6,mm5
293      movd eax, mm6      movd eax, mm6
294      pop _EBX
295      ret      ret
296      movq mm0, [eax]  ENDFUNC
     movq mm1, [eax+8]  
     psadbw mm0, mm7  
     psadbw mm1, mm7  
     add eax, ecx  
     paddw mm5, mm0  
     paddw mm6, mm1  
 %endmacro  
297    
 %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  
298    
299  align 16  ;-----------------------------------------------------------------------------
300    ;
301    ; uint32_t dev16_xmm(const uint8_t * const cur,
302    ;                                       const uint32_t stride);
303    ;
304    ;-----------------------------------------------------------------------------
305    
306    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 289  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 319  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    
440    %ifidn __OUTPUT_FORMAT__,elf
441    section ".note.GNU-stack" noalloc noexec nowrite progbits
442    %endif
443    

Legend:
Removed from v.262  
changed lines
  Added in v.1795

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