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

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

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

revision 329, Tue Jul 23 12:59:57 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  ; *     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.20 2008-11-26 01:04:34 Isibaar 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>  
 ; *  
 ; *************************************************************************/  
   
 bits 32  
   
 %macro cglobal 1  
         %ifdef PREFIX  
                 global _%1  
                 %define %1 _%1  
         %else  
                 global %1  
         %endif  
 %endmacro  
26    
27  section .data  %include "nasm.inc"
28    
29  align 16  ;=============================================================================
30  mmx_one times 4 dw 1  ; Read only data
31    ;=============================================================================
32    
33  section .text  DATA
34    
35  cglobal  sad16_mmx  ALIGN SECTION_ALIGN
36  cglobal  sad8_mmx  mmx_one:
37  cglobal  sad16bi_mmx          times 4 dw 1
 cglobal  sad8bi_mmx  
 cglobal  dev16_mmx  
38    
39  ;===========================================================================  ;=============================================================================
40  ;  ; Helper macros
41  ; 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    SECTION .rotext align=SECTION_ALIGN
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 133  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]  
312    
313      movq mm2, [eax+ecx]  ALIGN SECTION_ALIGN
     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  
   
     psubusb mm1, mm4  
     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 200  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,
341    ;                                     const uint8_t * const ref,
342    ;                                         const uint32_t stride,
343    ;                                         int32_t *sad);
344    ;
345    ;-----------------------------------------------------------------------------
346    
347    ALIGN SECTION_ALIGN
348    sad16v_mmx:
349    
350      mov _EAX, prm1 ; Src1
351      mov TMP1, prm2 ; Src2
352      mov TMP0, prm3 ; Stride
353    
354      push _EBX
355      push _EDI
356    %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
363  ;    pxor mm6, mm6 ; accum
364  ; uint32_t sad16bi_mmx(const uint8_t * const cur,    pxor mm7, mm7 ; zero
 ; const uint8_t * const ref1,  
 ; const uint8_t * const ref2,  
 ; const uint32_t stride);  
 ;  
 ;===========================================================================  
 %macro SADBI_16x16_MMX 2    ; SADBI_16x16_MMX( int_ptr_offset, bool_increment_ptr );  
365    
366     movq mm0, [edx+%1]    SADV_16x16_MMX
367     movq mm2, [ebx+%1]    SADV_16x16_MMX
368     movq mm1, mm0    SADV_16x16_MMX
369     movq mm3, mm2    SADV_16x16_MMX
370      SADV_16x16_MMX
371      SADV_16x16_MMX
372      SADV_16x16_MMX
373      SADV_16x16_MMX
374    
375  %if %2 != 0    pmaddwd mm5, [mmx_one] ; collapse
376     add edx, ecx    pmaddwd mm6, [mmx_one] ; collapse
 %endif  
377    
378     punpcklbw mm0, mm7    movq mm2, mm5
379     punpckhbw mm1, mm7    movq mm3, mm6
 punpcklbw mm2, mm7  
 punpckhbw mm3, mm7  
380    
381  %if %2 != 0    psrlq mm2, 32
382     add ebx, ecx    psrlq mm3, 32
 %endif  
383    
384  paddusw mm0, mm2    ; mm01 = ref1 + ref2    paddd mm5, mm2
385  paddusw mm1, mm3    paddd mm6, mm3
 paddusw mm0, [mmx_one] ; mm01 += 1  
 paddusw mm1, [mmx_one]  
 psrlw mm0, 1     ; mm01 >>= 1  
 psrlw mm1, 1  
386    
387     movq mm2, [eax+%1]    movd [_EBX], mm5
388     movq mm3, mm2    movd [_EBX + 4], mm6
    punpcklbw mm2, mm7          ; mm23 = src  
    punpckhbw mm3, mm7  
389    
390  %if %2 != 0    paddd mm5, mm6
    add eax, ecx  
 %endif  
391    
392     movq mm4, mm0    movd edi, mm5
    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  
393    
394     paddusw mm6,mm0             ; mm6 += mm01    pxor mm5, mm5
395     paddusw mm6,mm1    pxor mm6, mm6
396    
397  %endmacro    SADV_16x16_MMX
398      SADV_16x16_MMX
399      SADV_16x16_MMX
400      SADV_16x16_MMX
401      SADV_16x16_MMX
402      SADV_16x16_MMX
403      SADV_16x16_MMX
404      SADV_16x16_MMX
405    
406  align 16    pmaddwd mm5, [mmx_one] ; collapse
407      pmaddwd mm6, [mmx_one] ; collapse
408    
409      movq mm2, mm5
410      movq mm3, mm6
411    
412      psrlq mm2, 32
413      psrlq mm3, 32
414    
415      paddd mm5, mm2
416      paddd mm6, mm3
417    
418      movd [_EBX + 8], mm5
419      movd [_EBX + 12], mm6
420    
421      paddd mm5, mm6
422    
423      movd eax, mm5
424    
425      add _EAX, _EDI
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,
436    ; const uint8_t * const ref1,
437    ; const uint8_t * const ref2,
438    ; const uint32_t stride);
439    ;
440    ;-----------------------------------------------------------------------------
441    
442    ALIGN SECTION_ALIGN
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 314  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 351  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  ;===========================================================================  ;-----------------------------------------------------------------------------
   
 %macro MEAN_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  
     paddw mm5, mm0  
     paddw mm6, mm1  
     paddw mm5, mm2  
     paddw mm6, mm3  
 %endmacro  
553    
554  %macro ABS_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  
     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 458  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 484  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    
735    %ifidn __OUTPUT_FORMAT__,elf
736    section ".note.GNU-stack" noalloc noexec nowrite progbits
737    %endif
738    

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

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