[svn] / branches / dev-api-4 / xvidcore / src / motion / x86_asm / sad_mmx.asm Repository:
ViewVC logotype

Diff of /branches/dev-api-4/xvidcore/src/motion/x86_asm/sad_mmx.asm

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

trunk/xvidcore/src/motion/x86_asm/sad_mmx.asm revision 262, Sun Jul 7 09:45:40 2002 UTC branches/dev-api-4/xvidcore/src/motion/x86_asm/sad_mmx.asm revision 1198, Mon Nov 3 15:51:50 2003 UTC
# Line 1  Line 1 
1  ;/**************************************************************************  ;/****************************************************************************
2  ; *  ; *
3  ; *     XVID MPEG-4 VIDEO CODEC  ; *     XVID MPEG-4 VIDEO CODEC
4  ; *     mmx 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  ; *               2002 Pascal Massimino <skal@planet-d.net>
8    ; *
9    ; *  This program is free software; you can redistribute it and/or modify it
10    ; *  under the terms of the GNU General Public License as published by
11  ; *     the Free Software Foundation; either version 2 of the License, or  ; *     the Free Software Foundation; either version 2 of the License, or
12  ; *     (at your option) any later version.  ; *     (at your option) any later version.
13  ; *  ; *
# Line 15  Line 18 
18  ; *  ; *
19  ; *     You should have received a copy of the GNU General Public License  ; *     You should have received a copy of the GNU General Public License
20  ; *     along with this program; if not, write to the Free Software  ; *     along with this program; if not, write to the Free Software
21  ; *     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  ; *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 ; *  
 ; *************************************************************************/  
   
 ;/**************************************************************************  
22  ; *  ; *
23  ; *     History:  ; * $Id: sad_mmx.asm,v 1.11.2.2 2003-11-03 15:51:50 edgomez Exp $
24  ; *  ; *
25  ; * 23.07.2002  sad[16,8]bi_xmm; <pross@xvid.org>  ; ***************************************************************************/
 ; * 04.06.2002  cleanup -Skal-  
 ; *     12.11.2001      inital version; (c)2001 peter ross <pross@cs.rmit.edu.au>  
 ; *  
 ; *************************************************************************/  
26    
27  bits 32  BITS 32
28    
29  %macro cglobal 1  %macro cglobal 1
30            %ifdef PREFIX
31                  global _%1                  global _%1
32                  %define %1 _%1                  %define %1 _%1
33          %else          %else
# Line 39  Line 35 
35          %endif          %endif
36  %endmacro  %endmacro
37    
38  section .data  ;=============================================================================
39    ; Read only data
40  align 16  ;=============================================================================
 mmx_one times 4 dw 1  
41    
42  section .text  %ifdef FORMAT_COFF
43    SECTION .rodata data
44  cglobal  sad16_mmx  %else
45  cglobal  sad8_mmx  SECTION .rodata data align=16
46  cglobal  sad16bi_mmx  %endif
 cglobal  sad8bi_mmx  
 cglobal  dev16_mmx  
47    
48  ;===========================================================================  ALIGN 16
49  ;  mmx_one:
50  ; uint32_t sad16_mmx(const uint8_t * const cur,          times 4 dw 1
51  ;                                        const uint8_t * const ref,  
52  ;                                        const uint32_t stride,  ;=============================================================================
53  ; (early termination ignore; slows this down)  ; Helper macros
54  ;  ;=============================================================================
 ;===========================================================================  
55    
56  %macro SAD_16x16_MMX 0  %macro SAD_16x16_MMX 0
57      movq mm0, [eax]      movq mm0, [eax]
# Line 94  Line 86 
86      paddusw mm6,mm2      paddusw mm6,mm2
87  %endmacro  %endmacro
88    
 align 16  
 sad16_mmx:  
   
     mov eax, [esp+ 4] ; Src1  
     mov edx, [esp+ 8] ; Src2  
     mov ecx, [esp+12] ; Stride  
   
     pxor mm6, mm6 ; accum  
     pxor mm7, mm7 ; zero  
   
     SAD_16x16_MMX  
     SAD_16x16_MMX  
     SAD_16x16_MMX  
     SAD_16x16_MMX  
     SAD_16x16_MMX  
     SAD_16x16_MMX  
     SAD_16x16_MMX  
     SAD_16x16_MMX  
   
     SAD_16x16_MMX  
     SAD_16x16_MMX  
     SAD_16x16_MMX  
     SAD_16x16_MMX  
     SAD_16x16_MMX  
     SAD_16x16_MMX  
     SAD_16x16_MMX  
     SAD_16x16_MMX  
   
     pmaddwd mm6, [mmx_one] ; collapse  
     movq mm7, mm6  
     psrlq mm7, 32  
     paddd mm6, mm7  
   
     movd eax, mm6  
   
     ret  
   
   
 ;===========================================================================  
 ;  
 ; uint32_t sad8_mmx(const uint8_t * const cur,  
 ;                                       const uint8_t * const ref,  
 ;                                       const uint32_t stride);  
 ;  
 ;===========================================================================  
   
89  %macro SAD_8x8_MMX  0  %macro SAD_8x8_MMX  0
90      movq mm0, [eax]      movq mm0, [eax]
91      movq mm1, [edx]      movq mm1, [edx]
# Line 174  Line 120 
120      paddusw mm6,mm2      paddusw mm6,mm2
121  %endmacro  %endmacro
122    
123  align 16  %macro SADV_16x16_MMX 0
124  sad8_mmx:    movq mm0, [eax]
125      movq mm1, [edx]
126    
127      mov eax, [esp+ 4] ; Src1    movq mm2, [eax+8]
128      mov edx, [esp+ 8] ; Src2    movq mm3, [edx+8]
     mov ecx, [esp+12] ; Stride  
129    
130      pxor mm6, mm6 ; accum    movq mm4, mm0
131      pxor mm7, mm7 ; zero    psubusb mm0, mm1
132    
133      SAD_8x8_MMX    psubusb mm1, mm4
134      SAD_8x8_MMX    por mm0, mm1
135      SAD_8x8_MMX    lea eax,[eax+ecx]
     SAD_8x8_MMX  
136    
137      pmaddwd mm6, [mmx_one] ; collapse    movq mm4, mm2
138      movq mm7, mm6    psubusb mm2, mm3
     psrlq mm7, 32  
     paddd mm6, mm7  
139    
140      movd eax, mm6    psubusb mm3, mm4
141      por mm2, mm3
142      lea edx,[edx+ecx]
143    
144      ret    movq mm1,mm0
145      movq mm3,mm2
146    
147      punpcklbw mm0,mm7
148      punpckhbw mm1,mm7
149      punpcklbw mm2,mm7
150      punpckhbw mm3,mm7
151    
152      paddusw mm0,mm1
153      paddusw mm2,mm3
154    
155      paddusw mm5, mm0
156      paddusw mm6, mm2
157    %endmacro
158    
159    %macro SADBI_16x16_MMX 2    ; SADBI_16x16_MMX( int_ptr_offset, bool_increment_ptr );
160    
161      movq mm0, [edx+%1]
162      movq mm2, [ebx+%1]
163      movq mm1, mm0
164      movq mm3, mm2
165    
166  ;===========================================================================  %if %2 != 0
167  ;    add edx, ecx
168  ; uint32_t sad16bi_mmx(const uint8_t * const cur,  %endif
169  ; const uint8_t * const ref1,  
170      punpcklbw mm0, mm7
171      punpckhbw mm1, mm7
172      punpcklbw mm2, mm7
173      punpckhbw mm3, mm7
174    
175    %if %2 != 0
176      add ebx, ecx
177    %endif
178    
179      paddusw mm0, mm2              ; mm01 = ref1 + ref2
180      paddusw mm1, mm3
181      paddusw mm0, [mmx_one]        ; mm01 += 1
182      paddusw mm1, [mmx_one]
183      psrlw mm0, 1                  ; mm01 >>= 1
184      psrlw mm1, 1
185    
186      movq mm2, [eax+%1]
187      movq mm3, mm2
188      punpcklbw mm2, mm7            ; mm23 = src
189      punpckhbw mm3, mm7
190    
191    %if %2 != 0
192      add eax, ecx
193    %endif
194    
195      movq mm4, mm0
196      movq mm5, mm1
197      psubusw mm0, mm2
198      psubusw mm1, mm3
199      psubusw mm2, mm4
200      psubusw mm3, mm5
201      por mm0, mm2                  ; mm01 = ABS(mm01 - mm23)
202      por mm1, mm3
203    
204      paddusw mm6, mm0              ; mm6 += mm01
205      paddusw mm6, mm1
206    
207    %endmacro
208    
209    %macro MEAN_16x16_MMX 0
210      movq mm0, [eax]      movq mm0, [eax]
211      movq mm2, [eax+8]      movq mm2, [eax+8]
212      lea eax,[eax+ecx]      lea eax,[eax+ecx]
# Line 256  Line 257 
257          paddw mm5, mm2          paddw mm5, mm2
258  %endmacro  %endmacro
259    
260  align 16  ;=============================================================================
261    ; Code
262    ;=============================================================================
263    
264    SECTION .text
265    
266    cglobal  sad16_mmx
267    cglobal  sad16v_mmx
268    cglobal  sad8_mmx
269    cglobal  sad16bi_mmx
270    cglobal  sad8bi_mmx
271    cglobal  dev16_mmx
272    
273    ;-----------------------------------------------------------------------------
274    ;
275    ; uint32_t sad16_mmx(const uint8_t * const cur,
276    ;                                        const uint8_t * const ref,
277    ;                                        const uint32_t stride,
278    ;                                        const uint32_t best_sad);
279    ;
280    ; (early termination ignore; slows this down)
281    ;
282    ;-----------------------------------------------------------------------------
283    
284    ALIGN 16
285    sad16_mmx:
286    
287      mov eax, [esp+ 4] ; Src1
288      mov edx, [esp+ 8] ; Src2
289      mov ecx, [esp+12] ; Stride
290    
291      pxor mm6, mm6 ; accum
292      pxor mm7, mm7 ; zero
293    
294      SAD_16x16_MMX
295      SAD_16x16_MMX
296      SAD_16x16_MMX
297      SAD_16x16_MMX
298      SAD_16x16_MMX
299      SAD_16x16_MMX
300      SAD_16x16_MMX
301      SAD_16x16_MMX
302    
303      SAD_16x16_MMX
304      SAD_16x16_MMX
305      SAD_16x16_MMX
306      SAD_16x16_MMX
307      SAD_16x16_MMX
308      SAD_16x16_MMX
309      SAD_16x16_MMX
310      SAD_16x16_MMX
311    
312      pmaddwd mm6, [mmx_one] ; collapse
313      movq mm7, mm6
314      psrlq mm7, 32
315      paddd mm6, mm7
316    
317      movd eax, mm6
318    
319      ret
320    
321    ;-----------------------------------------------------------------------------
322    ;
323    ; uint32_t sad8_mmx(const uint8_t * const cur,
324    ;                                       const uint8_t * const ref,
325    ;                                       const uint32_t stride);
326    ;
327    ;-----------------------------------------------------------------------------
328    
329    ALIGN 16
330    sad8_mmx:
331    
332      mov eax, [esp+ 4] ; Src1
333      mov edx, [esp+ 8] ; Src2
334      mov ecx, [esp+12] ; Stride
335    
336      pxor mm6, mm6 ; accum
337      pxor mm7, mm7 ; zero
338    
339      SAD_8x8_MMX
340      SAD_8x8_MMX
341      SAD_8x8_MMX
342      SAD_8x8_MMX
343    
344      pmaddwd mm6, [mmx_one] ; collapse
345      movq mm7, mm6
346      psrlq mm7, 32
347      paddd mm6, mm7
348    
349      movd eax, mm6
350    
351      ret
352    
353    ;-----------------------------------------------------------------------------
354    ;
355    ; uint32_t sad16v_mmx(const uint8_t * const cur,
356    ;                                     const uint8_t * const ref,
357    ;                                         const uint32_t stride,
358    ;                                         int32_t *sad);
359    ;
360    ;-----------------------------------------------------------------------------
361    
362    ALIGN 16
363    sad16v_mmx:
364    
365      push ebx
366      push edi
367    
368      mov eax, [esp + 8 + 4] ; Src1
369      mov edx, [esp + 8 + 8] ; Src2
370      mov ecx, [esp + 8 + 12] ; Stride
371      mov ebx, [esp + 8 + 16] ; sad ptr
372    
373      pxor mm5, mm5 ; accum
374      pxor mm6, mm6 ; accum
375      pxor mm7, mm7 ; zero
376    
377      SADV_16x16_MMX
378      SADV_16x16_MMX
379      SADV_16x16_MMX
380      SADV_16x16_MMX
381      SADV_16x16_MMX
382      SADV_16x16_MMX
383      SADV_16x16_MMX
384      SADV_16x16_MMX
385    
386      pmaddwd mm5, [mmx_one] ; collapse
387      pmaddwd mm6, [mmx_one] ; collapse
388    
389      movq mm2, mm5
390      movq mm3, mm6
391    
392      psrlq mm2, 32
393      psrlq mm3, 32
394    
395      paddd mm5, mm2
396      paddd mm6, mm3
397    
398      movd [ebx], mm5
399      movd [ebx + 4], mm6
400    
401      paddd mm5, mm6
402    
403      movd edi, mm5
404    
405      pxor mm5, mm5
406      pxor mm6, mm6
407    
408      SADV_16x16_MMX
409      SADV_16x16_MMX
410      SADV_16x16_MMX
411      SADV_16x16_MMX
412      SADV_16x16_MMX
413      SADV_16x16_MMX
414      SADV_16x16_MMX
415      SADV_16x16_MMX
416    
417      pmaddwd mm5, [mmx_one] ; collapse
418      pmaddwd mm6, [mmx_one] ; collapse
419    
420      movq mm2, mm5
421      movq mm3, mm6
422    
423      psrlq mm2, 32
424      psrlq mm3, 32
425    
426      paddd mm5, mm2
427      paddd mm6, mm3
428    
429      movd [ebx + 8], mm5
430      movd [ebx + 12], mm6
431    
432      paddd mm5, mm6
433    
434      movd eax, mm5
435    
436      add eax, edi
437    
438      pop edi
439      pop ebx
440    
441      ret
442    
443    ;-----------------------------------------------------------------------------
444    ;
445    ; uint32_t sad16bi_mmx(const uint8_t * const cur,
446    ; const uint8_t * const ref1,
447    ; const uint8_t * const ref2,
448    ; const uint32_t stride);
449    ;
450    ;-----------------------------------------------------------------------------
451    
452    ALIGN 16
453    sad16bi_mmx:
454      push ebx
455      mov eax, [esp+4+ 4] ; Src
456      mov edx, [esp+4+ 8] ; Ref1
457      mov ebx, [esp+4+12] ; Ref2
458      mov ecx, [esp+4+16] ; Stride
459    
460      pxor mm6, mm6 ; accum2
461      pxor mm7, mm7
462    .Loop
463      SADBI_16x16_MMX 0, 0
464      SADBI_16x16_MMX 8, 1
465      SADBI_16x16_MMX 0, 0
466      SADBI_16x16_MMX 8, 1
467      SADBI_16x16_MMX 0, 0
468      SADBI_16x16_MMX 8, 1
469      SADBI_16x16_MMX 0, 0
470      SADBI_16x16_MMX 8, 1
471      SADBI_16x16_MMX 0, 0
472      SADBI_16x16_MMX 8, 1
473      SADBI_16x16_MMX 0, 0
474      SADBI_16x16_MMX 8, 1
475      SADBI_16x16_MMX 0, 0
476      SADBI_16x16_MMX 8, 1
477      SADBI_16x16_MMX 0, 0
478      SADBI_16x16_MMX 8, 1
479    
480      SADBI_16x16_MMX 0, 0
481      SADBI_16x16_MMX 8, 1
482      SADBI_16x16_MMX 0, 0
483      SADBI_16x16_MMX 8, 1
484      SADBI_16x16_MMX 0, 0
485      SADBI_16x16_MMX 8, 1
486      SADBI_16x16_MMX 0, 0
487      SADBI_16x16_MMX 8, 1
488      SADBI_16x16_MMX 0, 0
489      SADBI_16x16_MMX 8, 1
490      SADBI_16x16_MMX 0, 0
491      SADBI_16x16_MMX 8, 1
492      SADBI_16x16_MMX 0, 0
493      SADBI_16x16_MMX 8, 1
494      SADBI_16x16_MMX 0, 0
495      SADBI_16x16_MMX 8, 1
496    
497      pmaddwd mm6, [mmx_one] ; collapse
498      movq mm7, mm6
499      psrlq mm7, 32
500      paddd mm6, mm7
501    
502      movd eax, mm6
503      pop ebx
504    
505      ret
506    
507    ;-----------------------------------------------------------------------------
508    ;
509    ; uint32_t sad8bi_mmx(const uint8_t * const cur,
510    ; const uint8_t * const ref1,
511    ; const uint8_t * const ref2,
512    ; const uint32_t stride);
513    ;
514    ;-----------------------------------------------------------------------------
515    
516    ALIGN 16
517    sad8bi_mmx:
518      push ebx
519      mov eax, [esp+4+ 4] ; Src
520      mov edx, [esp+4+ 8] ; Ref1
521      mov ebx, [esp+4+12] ; Ref2
522      mov ecx, [esp+4+16] ; Stride
523    
524      pxor mm6, mm6 ; accum2
525      pxor mm7, mm7
526    .Loop
527      SADBI_16x16_MMX 0, 1
528      SADBI_16x16_MMX 0, 1
529      SADBI_16x16_MMX 0, 1
530      SADBI_16x16_MMX 0, 1
531      SADBI_16x16_MMX 0, 1
532      SADBI_16x16_MMX 0, 1
533      SADBI_16x16_MMX 0, 1
534      SADBI_16x16_MMX 0, 1
535    
536      pmaddwd mm6, [mmx_one] ; collapse
537      movq mm7, mm6
538      psrlq mm7, 32
539      paddd mm6, mm7
540    
541      movd eax, mm6
542      pop ebx
543      ret
544    
545    ;-----------------------------------------------------------------------------
546    ;
547    ; uint32_t dev16_mmx(const uint8_t * const cur,
548    ;                                       const uint32_t stride);
549    ;
550    ;-----------------------------------------------------------------------------
551    
552    ALIGN 16
553  dev16_mmx:  dev16_mmx:
554      mov eax, [esp+ 4] ; Src      mov eax, [esp+ 4] ; Src
555      mov ecx, [esp+ 8] ; Stride      mov ecx, [esp+ 8] ; Stride
# Line 325  Line 618 
618      paddd mm6, mm5      paddd mm6, mm5
619    
620      movd eax, mm6      movd eax, mm6
621    
622      ret      ret

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

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