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

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

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

revision 1.7.2.1, Tue Sep 24 16:30:34 2002 UTC revision 1.22, Wed Sep 16 17:07:58 2009 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
 ; *  
 ; *************************************************************************/  
   
 ;/**************************************************************************  
 ; *  
 ; *     History:  
22  ; *  ; *
23  ; * 23.07.2002  sad[16,8]bi_xmm; <pross@xvid.org>  ; * $Id$
 ; * 04.06.2002  cleanup -Skal-  
 ; *     12.11.2001      inital version; (c)2001 peter ross <pross@cs.rmit.edu.au>  
24  ; *  ; *
25  ; *************************************************************************/  ; ***************************************************************************/
26    
27  bits 32  %include "nasm.inc"
28    
29  %macro cglobal 1  ;=============================================================================
30          %ifdef PREFIX  ; Read only data
31                  global _%1  ;=============================================================================
                 %define %1 _%1  
         %else  
                 global %1  
         %endif  
 %endmacro  
32    
33  section .data  DATA
34    
35  align 16  ALIGN SECTION_ALIGN
36  mmx_one times 4 dw 1  mmx_one:
37            times 4 dw 1
38    
39  section .text  ;=============================================================================
40    ; Helper macros
41  cglobal  sad16_mmx  ;=============================================================================
 cglobal  sad16v_mmx  
 cglobal  sad8_mmx  
 cglobal  sad16bi_mmx  
 cglobal  sad8bi_mmx  
 cglobal  dev16_mmx  
   
 ;===========================================================================  
 ;  
 ; uint32_t sad16_mmx(const uint8_t * const cur,  
 ;                                        const uint8_t * const ref,  
 ;                                        const uint32_t stride,  
 ;                                        const uint32_t best_sad);  
 ;  
 ; (early termination ignore; slows this down)  
 ;  
 ;===========================================================================  
42    
43  %macro SAD_16x16_MMX 0  %macro SAD_16x16_MMX 0
44      movq mm0, [eax]    movq mm0, [_EAX]
45      movq mm1, [edx]    movq mm1, [TMP1]
46    
47      movq mm2, [eax+8]    movq mm2, [_EAX+8]
48      movq mm3, [edx+8]    movq mm3, [TMP1+8]
49    
50      movq mm4, mm0      movq mm4, mm0
51      psubusb mm0, mm1      psubusb mm0, mm1
52      lea eax,[eax+ecx]    lea _EAX, [_EAX+TMP0]
53      movq mm5, mm2      movq mm5, mm2
54      psubusb mm2, mm3      psubusb mm2, mm3
     lea edx,[edx+ecx]  
55    
56      psubusb mm1, mm4      psubusb mm1, mm4
     por mm0, mm1  
57      psubusb mm3, mm5      psubusb mm3, mm5
58      por mm0, mm1
59      por mm2, mm3      por mm2, mm3
60    
61      movq mm1,mm0      movq mm1,mm0
62      punpcklbw mm0,mm7
63      movq mm3,mm2      movq mm3,mm2
64      punpckhbw mm1,mm7
65      lea TMP1, [TMP1+TMP0]
66      punpcklbw mm2,mm7
67      paddusw mm0, mm1
68      punpckhbw mm3,mm7
69      paddusw mm6, mm0
70      paddusw mm2, mm3
71      paddusw mm6, mm2
72    
73    %endmacro
74    
75    %macro SAD_8x8_MMX      0
76      movq mm0, [_EAX]
77      movq mm1, [TMP1]
78    
79      movq mm2, [_EAX+TMP0]
80      movq mm3, [TMP1+TMP0]
81    
82      lea _EAX,[_EAX+2*TMP0]
83      lea TMP1,[TMP1+2*TMP0]
84    
85      movq mm4, mm0
86      psubusb mm0, mm1
87      movq mm5, mm2
88      psubusb mm2, mm3
89    
90      psubusb mm1, mm4
91      psubusb mm3, mm5
92      por mm0, mm1
93      por mm2, mm3
94    
95      movq mm1,mm0
96      punpcklbw mm0,mm7      punpcklbw mm0,mm7
97      movq mm3,mm2
98      punpckhbw mm1,mm7      punpckhbw mm1,mm7
99      punpcklbw mm2,mm7      punpcklbw mm2,mm7
100      paddusw mm0,mm1
101      punpckhbw mm3,mm7      punpckhbw mm3,mm7
102      paddusw mm6,mm0
103      paddusw mm2,mm3
104      paddusw mm6,mm2
105    %endmacro
106    
107    
108    %macro SADV_16x16_MMX 0
109      movq mm0, [_EAX]
110      movq mm1, [TMP1]
111    
112      movq mm2, [_EAX+8]
113      movq mm4, mm0
114      movq mm3, [TMP1+8]
115      psubusb mm0, mm1
116    
117      psubusb mm1, mm4
118      lea _EAX,[_EAX+TMP0]
119      por mm0, mm1
120    
121      movq mm4, mm2
122      psubusb mm2, mm3
123    
124      psubusb mm3, mm4
125      por mm2, mm3
126    
127      movq mm1,mm0
128      punpcklbw mm0,mm7
129      movq mm3,mm2
130      punpckhbw mm1,mm7
131      punpcklbw mm2,mm7
132      paddusw mm0,mm1      paddusw mm0,mm1
133      paddusw mm6,mm0    punpckhbw mm3,mm7
134      paddusw mm5, mm0
135      paddusw mm2,mm3      paddusw mm2,mm3
136      lea TMP1,[TMP1+TMP0]
137      paddusw mm6,mm2      paddusw mm6,mm2
138  %endmacro  %endmacro
139    
140  align 16  %macro SADBI_16x16_MMX 2    ; SADBI_16x16_MMX( int_ptr_offset, bool_increment_ptr );
141    
142      movq mm0, [TMP1+%1]
143      movq mm2, [_EBX+%1]
144      movq mm1, mm0
145      movq mm3, mm2
146    
147    %if %2 != 0
148      add TMP1, TMP0
149    %endif
150    
151      punpcklbw mm0, mm7
152      punpckhbw mm1, mm7
153      punpcklbw mm2, mm7
154      punpckhbw mm3, mm7
155    
156    %if %2 != 0
157      add _EBX, TMP0
158    %endif
159    
160      paddusw mm0, mm2              ; mm01 = ref1 + ref2
161      paddusw mm1, mm3
162      paddusw mm0, [mmx_one]        ; mm01 += 1
163      paddusw mm1, [mmx_one]
164      psrlw mm0, 1                  ; mm01 >>= 1
165      psrlw mm1, 1
166    
167      movq mm2, [_EAX+%1]
168      movq mm3, mm2
169      punpcklbw mm2, mm7            ; mm23 = src
170      punpckhbw mm3, mm7
171    
172    %if %2 != 0
173      add _EAX, TMP0
174    %endif
175    
176      movq mm4, mm0
177      movq mm5, mm1
178      psubusw mm0, mm2
179      psubusw mm1, mm3
180      psubusw mm2, mm4
181      psubusw mm3, mm5
182      por mm0, mm2                  ; mm01 = ABS(mm01 - mm23)
183      por mm1, mm3
184    
185      paddusw mm6, mm0              ; mm6 += mm01
186      paddusw mm6, mm1
187    
188    %endmacro
189    
190    %macro MEAN_16x16_MMX 0
191      movq mm0, [_EAX]
192      movq mm2, [_EAX+8]
193      lea _EAX, [_EAX+TMP0]
194      movq mm1, mm0
195      punpcklbw mm0, mm7
196      movq mm3, mm2
197      punpckhbw mm1, mm7
198      paddw mm5, mm0
199      punpcklbw mm2, mm7
200      paddw mm6, mm1
201      punpckhbw mm3, mm7
202      paddw mm5, mm2
203      paddw mm6, mm3
204    %endmacro
205    
206    %macro ABS_16x16_MMX 0
207      movq mm0, [_EAX]
208      movq mm2, [_EAX+8]
209      lea _EAX, [_EAX+TMP0]
210      movq mm1, mm0
211      movq mm3, mm2
212      punpcklbw mm0, mm7
213      punpcklbw mm2, mm7
214      punpckhbw mm1, mm7
215      punpckhbw mm3, mm7
216      movq mm4, mm6
217      psubusw mm4, mm0
218    
219      psubusw mm0, mm6
220      por mm0, mm4
221      movq mm4, mm6
222      psubusw mm4, mm1
223      psubusw mm1, mm6
224      por mm1, mm4
225    
226      movq mm4, mm6
227      psubusw mm4, mm2
228      psubusw mm2, mm6
229      por mm2, mm4
230      movq mm4, mm6
231      psubusw mm4, mm3
232      psubusw mm3, mm6
233      por mm3, mm4
234    
235      paddw mm0, mm1
236      paddw mm2, mm3
237      paddw mm5, mm0
238      paddw mm5, mm2
239    %endmacro
240    
241    ;=============================================================================
242    ; Code
243    ;=============================================================================
244    
245    TEXT
246    
247    cglobal sad16_mmx
248    cglobal sad16v_mmx
249    cglobal sad8_mmx
250    cglobal sad16bi_mmx
251    cglobal sad8bi_mmx
252    cglobal dev16_mmx
253    cglobal sse8_16bit_mmx
254    cglobal sse8_8bit_mmx
255    
256    ;-----------------------------------------------------------------------------
257    ;
258    ; uint32_t sad16_mmx(const uint8_t * const cur,
259    ;                                        const uint8_t * const ref,
260    ;                                        const uint32_t stride,
261    ;                                        const uint32_t best_sad);
262    ;
263    ; (early termination ignore; slows this down)
264    ;
265    ;-----------------------------------------------------------------------------
266    
267    ALIGN SECTION_ALIGN
268  sad16_mmx:  sad16_mmx:
269    
270      mov eax, [esp+ 4] ; Src1    mov _EAX, prm1 ; Src1
271      mov edx, [esp+ 8] ; Src2    mov TMP1, prm2 ; Src2
272      mov ecx, [esp+12] ; Stride    mov TMP0, prm3 ; Stride
273    
274      pxor mm6, mm6 ; accum      pxor mm6, mm6 ; accum
275      pxor mm7, mm7 ; zero      pxor mm7, mm7 ; zero
# Line 134  Line 300 
300      movd eax, mm6      movd eax, mm6
301    
302      ret      ret
303    ENDFUNC
304    
305    ;-----------------------------------------------------------------------------
 ;===========================================================================  
306  ;  ;
307  ; uint32_t sad8_mmx(const uint8_t * const cur,  ; uint32_t sad8_mmx(const uint8_t * const cur,
308  ;                                       const uint8_t * const ref,  ;                                       const uint8_t * const ref,
309  ;                                       const uint32_t stride);  ;                                       const uint32_t stride);
310  ;  ;
311  ;===========================================================================  ;-----------------------------------------------------------------------------
   
 %macro SAD_8x8_MMX  0  
     movq mm0, [eax]  
     movq mm1, [edx]  
   
     movq mm2, [eax+ecx]  
     movq mm3, [edx+ecx]  
   
     lea eax,[eax+2*ecx]  
     lea edx,[edx+2*ecx]  
   
     movq mm4, mm0  
     psubusb mm0, mm1  
     movq mm5, mm2  
     psubusb mm2, mm3  
312    
313      psubusb mm1, mm4  ALIGN SECTION_ALIGN
     por mm0, mm1  
     psubusb mm3, mm5  
     por mm2, mm3  
   
     movq mm1,mm0  
     movq mm3,mm2  
   
     punpcklbw mm0,mm7  
     punpckhbw mm1,mm7  
     punpcklbw mm2,mm7  
     punpckhbw mm3,mm7  
   
     paddusw mm0,mm1  
     paddusw mm6,mm0  
     paddusw mm2,mm3  
     paddusw mm6,mm2  
 %endmacro  
   
 align 16  
314  sad8_mmx:  sad8_mmx:
315    
316      mov eax, [esp+ 4] ; Src1    mov _EAX, prm1 ; Src1
317      mov edx, [esp+ 8] ; Src2    mov TMP1, prm2 ; Src2
318      mov ecx, [esp+12] ; Stride    mov TMP0, prm3 ; Stride
319    
320      pxor mm6, mm6 ; accum      pxor mm6, mm6 ; accum
321      pxor mm7, mm7 ; zero      pxor mm7, mm7 ; zero
# Line 201  Line 333 
333      movd eax, mm6      movd eax, mm6
334    
335      ret      ret
336    ENDFUNC
337    
338    ;-----------------------------------------------------------------------------
 ;===========================================================================  
339  ;  ;
340  ; uint32_t sad16v_mmx(const uint8_t * const cur,  ; uint32_t sad16v_mmx(const uint8_t * const cur,
341  ;                                     const uint8_t * const ref,  ;                                     const uint8_t * const ref,
342  ;                                         const uint32_t stride,  ;                                         const uint32_t stride,
343  ;                                         int32_t *sad);  ;                                         int32_t *sad);
344  ;  ;
345  ;===========================================================================  ;-----------------------------------------------------------------------------
   
 %macro SADV_16x16_MMX 0  
     movq mm0, [eax]  
     movq mm1, [edx]  
   
     movq mm2, [eax+8]  
     movq mm3, [edx+8]  
   
     movq mm4, mm0  
     psubusb mm0, mm1  
   
     psubusb mm1, mm4  
     por mm0, mm1  
     lea eax,[eax+ecx]  
   
     movq mm4, mm2  
     psubusb mm2, mm3  
   
     psubusb mm3, mm4  
     por mm2, mm3  
     lea edx,[edx+ecx]  
   
     movq mm1,mm0  
     movq mm3,mm2  
   
     punpcklbw mm0,mm7  
     punpckhbw mm1,mm7  
     punpcklbw mm2,mm7  
     punpckhbw mm3,mm7  
   
     paddusw mm0,mm1  
     paddusw mm2,mm3  
   
         paddusw mm5, mm0  
         paddusw mm6, mm2  
 %endmacro  
346    
347  align 16  ALIGN SECTION_ALIGN
348  sad16v_mmx:  sad16v_mmx:
349    
350          push ebx    mov _EAX, prm1 ; Src1
351          push edi    mov TMP1, prm2 ; Src2
352      mov TMP0, prm3 ; Stride
353      mov eax, [esp + 8 + 4] ; Src1  
354      mov edx, [esp + 8 + 8] ; Src2    push _EBX
355      mov ecx, [esp + 8 + 12] ; Stride    push _EDI
356      mov ebx, [esp + 8 + 16] ; sad ptr  %ifdef ARCH_IS_X86_64
357      mov _EBX, prm4
358    %else
359      mov _EBX, [_ESP + 8 + 16] ; sad ptr
360    %endif
361    
362          pxor mm5, mm5 ; accum          pxor mm5, mm5 ; accum
363      pxor mm6, mm6 ; accum      pxor mm6, mm6 ; accum
# Line 284  Line 384 
384      paddd mm5, mm2      paddd mm5, mm2
385      paddd mm6, mm3      paddd mm6, mm3
386    
387          movd [ebx], mm5    movd [_EBX], mm5
388          movd [ebx + 4], mm6    movd [_EBX + 4], mm6
389    
390          paddd mm5, mm6          paddd mm5, mm6
391    
# Line 315  Line 415 
415      paddd mm5, mm2      paddd mm5, mm2
416      paddd mm6, mm3      paddd mm6, mm3
417    
418          movd [ebx + 8], mm5    movd [_EBX + 8], mm5
419          movd [ebx + 12], mm6    movd [_EBX + 12], mm6
420    
421          paddd mm5, mm6          paddd mm5, mm6
422    
423          movd eax, mm5          movd eax, mm5
424    
425      add eax, edi    add _EAX, _EDI
   
         pop edi  
     pop ebx  
         ret  
426    
427      pop _EDI
428      pop _EBX
429    
430      ret
431    ENDFUNC
432    
433  ;===========================================================================  ;-----------------------------------------------------------------------------
434  ;  ;
435  ; uint32_t sad16bi_mmx(const uint8_t * const cur,  ; uint32_t sad16bi_mmx(const uint8_t * const cur,
436  ; const uint8_t * const ref1,  ; const uint8_t * const ref1,
437  ; const uint8_t * const ref2,  ; const uint8_t * const ref2,
438  ; const uint32_t stride);  ; const uint32_t stride);
439  ;  ;
440  ;===========================================================================  ;-----------------------------------------------------------------------------
 %macro SADBI_16x16_MMX 2    ; SADBI_16x16_MMX( int_ptr_offset, bool_increment_ptr );  
   
    movq mm0, [edx+%1]  
    movq mm2, [ebx+%1]  
    movq mm1, mm0  
    movq mm3, mm2  
   
 %if %2 != 0  
    add edx, ecx  
 %endif  
   
    punpcklbw mm0, mm7  
    punpckhbw mm1, mm7  
 punpcklbw mm2, mm7  
 punpckhbw mm3, mm7  
   
 %if %2 != 0  
    add ebx, ecx  
 %endif  
   
 paddusw mm0, mm2    ; mm01 = ref1 + ref2  
 paddusw mm1, mm3  
 paddusw mm0, [mmx_one] ; mm01 += 1  
 paddusw mm1, [mmx_one]  
 psrlw mm0, 1     ; mm01 >>= 1  
 psrlw mm1, 1  
   
    movq mm2, [eax+%1]  
    movq mm3, mm2  
    punpcklbw mm2, mm7          ; mm23 = src  
    punpckhbw mm3, mm7  
   
 %if %2 != 0  
    add eax, ecx  
 %endif  
   
    movq mm4, mm0  
    movq mm5, mm1  
    psubusw mm0, mm2  
    psubusw mm1, mm3  
    psubusw mm2, mm4  
    psubusw mm3, mm5  
    por mm0, mm2                ; mm01 = ABS(mm01 - mm23)  
    por mm1, mm3  
   
    paddusw mm6,mm0             ; mm6 += mm01  
    paddusw mm6,mm1  
441    
442  %endmacro  ALIGN SECTION_ALIGN
   
 align 16  
443  sad16bi_mmx:  sad16bi_mmx:
444     push ebx    mov _EAX, prm1 ; Src
445     mov eax, [esp+4+ 4] ; Src    mov TMP1, prm2 ; Ref1
446     mov edx, [esp+4+ 8] ; Ref1    mov TMP0, prm4 ; Stride
447     mov ebx, [esp+4+12] ; Ref2  
448     mov ecx, [esp+4+16] ; Stride    push _EBX
449    %ifdef ARCH_IS_X86_64
450      mov _EBX, prm3 ; Ref2
451    %else
452      mov _EBX, [_ESP+4+12] ; Ref2
453    %endif
454    
455     pxor mm6, mm6 ; accum2     pxor mm6, mm6 ; accum2
456  pxor mm7, mm7  pxor mm7, mm7
457  .Loop  .Loop:
458     SADBI_16x16_MMX 0, 0     SADBI_16x16_MMX 0, 0
459     SADBI_16x16_MMX 8, 1     SADBI_16x16_MMX 8, 1
460     SADBI_16x16_MMX 0, 0     SADBI_16x16_MMX 0, 0
# Line 439  Line 495 
495     paddd mm6, mm7     paddd mm6, mm7
496    
497     movd eax, mm6     movd eax, mm6
498     pop ebx    pop _EBX
499    
500     ret     ret
501    ENDFUNC
502    
503  ;===========================================================================  ;-----------------------------------------------------------------------------
504  ;  ;
505  ; uint32_t sad8bi_mmx(const uint8_t * const cur,  ; uint32_t sad8bi_mmx(const uint8_t * const cur,
506  ; const uint8_t * const ref1,  ; const uint8_t * const ref1,
507  ; const uint8_t * const ref2,  ; const uint8_t * const ref2,
508  ; const uint32_t stride);  ; const uint32_t stride);
509  ;  ;
510  ;===========================================================================  ;-----------------------------------------------------------------------------
511  align 16  
512    ALIGN SECTION_ALIGN
513  sad8bi_mmx:  sad8bi_mmx:
514     push ebx    mov _EAX, prm1 ; Src
515     mov eax, [esp+4+ 4] ; Src    mov TMP1, prm2 ; Ref1
516     mov edx, [esp+4+ 8] ; Ref1    mov TMP0, prm4 ; Stride
517     mov ebx, [esp+4+12] ; Ref2  
518     mov ecx, [esp+4+16] ; Stride    push _EBX
519    %ifdef ARCH_IS_X86_64
520      mov _EBX, prm3
521    %else
522      mov _EBX, [_ESP+4+12] ; Ref2
523    %endif
524    
525     pxor mm6, mm6 ; accum2     pxor mm6, mm6 ; accum2
526  pxor mm7, mm7  pxor mm7, mm7
527  .Loop  .Loop:
528     SADBI_16x16_MMX 0, 1     SADBI_16x16_MMX 0, 1
529     SADBI_16x16_MMX 0, 1     SADBI_16x16_MMX 0, 1
530     SADBI_16x16_MMX 0, 1     SADBI_16x16_MMX 0, 1
# Line 476  Line 540 
540     paddd mm6, mm7     paddd mm6, mm7
541    
542     movd eax, mm6     movd eax, mm6
543     pop ebx    pop _EBX
544     ret     ret
545    ENDFUNC
546    
547    ;-----------------------------------------------------------------------------
   
   
 ;===========================================================================  
548  ;  ;
549  ; uint32_t dev16_mmx(const uint8_t * const cur,  ; uint32_t dev16_mmx(const uint8_t * const cur,
550  ;                                       const uint32_t stride);  ;                                       const uint32_t stride);
551  ;  ;
552  ;===========================================================================  ;-----------------------------------------------------------------------------
553    
554  %macro MEAN_16x16_MMX 0  ALIGN SECTION_ALIGN
     movq mm0, [eax]  
     movq mm2, [eax+8]  
     lea eax,[eax+ecx]  
     movq mm1, mm0  
     movq mm3, mm2  
     punpcklbw mm0,mm7  
     punpcklbw mm2,mm7  
     punpckhbw mm1,mm7  
     punpckhbw mm3,mm7  
     paddw mm5, mm0  
     paddw mm6, mm1  
     paddw mm5, mm2  
     paddw mm6, mm3  
 %endmacro  
   
 %macro ABS_16x16_MMX 0  
     movq mm0, [eax]  
     movq mm2, [eax+8]  
     lea eax,[eax+ecx]  
     movq mm1, mm0  
     movq mm3, mm2  
     punpcklbw mm0, mm7  
     punpcklbw mm2, mm7  
     punpckhbw mm1, mm7  
     punpckhbw mm3, mm7  
     movq mm4, mm6  
         psubusw mm4, mm0  
   
         psubusw mm0, mm6  
         por mm0, mm4  
         movq mm4, mm6  
         psubusw mm4, mm1  
         psubusw mm1, mm6  
         por mm1, mm4  
   
     movq mm4, mm6  
         psubusw mm4, mm2  
         psubusw mm2, mm6  
         por mm2, mm4  
         movq mm4, mm6  
         psubusw mm4, mm3  
         psubusw mm3, mm6  
         por mm3, mm4  
   
         paddw mm0, mm1  
         paddw mm2, mm3  
         paddw mm5, mm0  
         paddw mm5, mm2  
 %endmacro  
   
 align 16  
555  dev16_mmx:  dev16_mmx:
556      mov eax, [esp+ 4] ; Src    mov _EAX, prm1 ; Src
557      mov ecx, [esp+ 8] ; Stride    mov TMP0, prm2 ; Stride
558    
559      pxor mm7, mm7 ; zero      pxor mm7, mm7 ; zero
560      pxor mm5, mm5 ; accum1      pxor mm5, mm5 ; accum1
# Line 583  Line 594 
594      ; mm5 is the new accum      ; mm5 is the new accum
595    
596      pxor mm5, mm5      pxor mm5, mm5
597      mov eax, [esp+ 4] ; Src    mov _EAX, prm1         ; Src
598    
599      ABS_16x16_MMX      ABS_16x16_MMX
600      ABS_16x16_MMX      ABS_16x16_MMX
# Line 609  Line 620 
620      paddd mm6, mm5      paddd mm6, mm5
621    
622      movd eax, mm6      movd eax, mm6
623    
624      ret
625    ENDFUNC
626    
627    ;-----------------------------------------------------------------------------
628    ;
629    ; uint32_t sse8_16bit_mmx(const int16_t *b1,
630    ;                         const int16_t *b2,
631    ;                         const uint32_t stride);
632    ;
633    ;-----------------------------------------------------------------------------
634    
635    %macro ROW_SSE_16bit_MMX 2
636      movq mm0, [%1]
637      movq mm1, [%1+8]
638      psubw mm0, [%2]
639      psubw mm1, [%2+8]
640      pmaddwd mm0, mm0
641      pmaddwd mm1, mm1
642      paddd mm2, mm0
643      paddd mm2, mm1
644    %endmacro
645    
646    sse8_16bit_mmx:
647    
648      ;; Load the function params
649      mov _EAX, prm1
650      mov TMP0, prm2
651      mov TMP1, prm3
652    
653      ;; Reset the sse accumulator
654      pxor mm2, mm2
655    
656      ;; Let's go
657    %rep 8
658      ROW_SSE_16bit_MMX _EAX, TMP0
659      lea _EAX, [_EAX+TMP1]
660      lea TMP0, [TMP0+TMP1]
661    %endrep
662    
663      ;; Finish adding each dword of the accumulator
664      movq mm3, mm2
665      psrlq mm2, 32
666      paddd mm2, mm3
667      movd eax, mm2
668    
669      ;; All done
670      ret
671    ENDFUNC
672    
673    ;-----------------------------------------------------------------------------
674    ;
675    ; uint32_t sse8_8bit_mmx(const int8_t *b1,
676    ;                        const int8_t *b2,
677    ;                        const uint32_t stride);
678    ;
679    ;-----------------------------------------------------------------------------
680    
681    %macro ROW_SSE_8bit_MMX 2
682      movq mm0, [%1] ; load a row
683      movq mm2, [%2] ; load a row
684    
685      movq mm1, mm0  ; copy row
686      movq mm3, mm2  ; copy row
687    
688      punpcklbw mm0, mm7 ; turn the 4low elements into 16bit
689      punpckhbw mm1, mm7 ; turn the 4high elements into 16bit
690    
691      punpcklbw mm2, mm7 ; turn the 4low elements into 16bit
692      punpckhbw mm3, mm7 ; turn the 4high elements into 16bit
693    
694      psubw mm0, mm2 ; low  part of src-dst
695      psubw mm1, mm3 ; high part of src-dst
696    
697      pmaddwd mm0, mm0 ; compute the square sum
698      pmaddwd mm1, mm1 ; compute the square sum
699    
700      paddd mm6, mm0 ; add to the accumulator
701      paddd mm6, mm1 ; add to the accumulator
702    %endmacro
703    
704    sse8_8bit_mmx:
705    
706      ;; Load the function params
707      mov _EAX, prm1
708      mov TMP0, prm2
709      mov TMP1, prm3
710    
711      ;; Reset the sse accumulator
712      pxor mm6, mm6
713    
714      ;; Used to interleave 8bit data with 0x00 values
715      pxor mm7, mm7
716    
717      ;; Let's go
718    %rep 8
719      ROW_SSE_8bit_MMX _EAX, TMP0
720      lea _EAX, [_EAX+TMP1]
721      lea TMP0, [TMP0+TMP1]
722    %endrep
723    
724      ;; Finish adding each dword of the accumulator
725      movq mm7, mm6
726      psrlq mm6, 32
727      paddd mm6, mm7
728      movd eax, mm6
729    
730      ;; All done
731      ret      ret
732    ENDFUNC
733    
734    NON_EXEC_STACK

Legend:
Removed from v.1.7.2.1  
changed lines
  Added in v.1.22

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