[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 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  ; *     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>  
 ; *  
 ; *************************************************************************/  
26    
27  bits 32  %include "nasm.inc"
28    
29  %macro cglobal 1  ;=============================================================================
30                  global _%1  ; Read only data
31                  %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  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,  
 ; (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
     movq mm3,mm2  
   
62      punpcklbw mm0,mm7      punpcklbw mm0,mm7
63      movq mm3, mm2
64      punpckhbw mm1,mm7      punpckhbw mm1,mm7
65      lea TMP1, [TMP1+TMP0]
66      punpcklbw mm2,mm7      punpcklbw mm2,mm7
     punpckhbw mm3,mm7  
   
67      paddusw mm0,mm1      paddusw mm0,mm1
68      punpckhbw mm3,mm7
69      paddusw mm6,mm0      paddusw mm6,mm0
70      paddusw mm2,mm3      paddusw mm2,mm3
71      paddusw mm6,mm2      paddusw mm6,mm2
 %endmacro  
   
 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  
72    
73    %endmacro
 ;===========================================================================  
 ;  
 ; uint32_t sad8_mmx(const uint8_t * const cur,  
 ;                                       const uint8_t * const ref,  
 ;                                       const uint32_t stride);  
 ;  
 ;===========================================================================  
74    
75  %macro SAD_8x8_MMX  0  %macro SAD_8x8_MMX  0
76      movq mm0, [eax]    movq mm0, [_EAX]
77      movq mm1, [edx]    movq mm1, [TMP1]
78    
79      movq mm2, [eax+ecx]    movq mm2, [_EAX+TMP0]
80      movq mm3, [edx+ecx]    movq mm3, [TMP1+TMP0]
81    
82      lea eax,[eax+2*ecx]    lea _EAX,[_EAX+2*TMP0]
83      lea edx,[edx+2*ecx]    lea TMP1,[TMP1+2*TMP0]
84    
85      movq mm4, mm0      movq mm4, mm0
86      psubusb mm0, mm1      psubusb mm0, mm1
# Line 156  Line 88 
88      psubusb mm2, mm3      psubusb mm2, mm3
89    
90      psubusb mm1, mm4      psubusb mm1, mm4
     por mm0, mm1  
91      psubusb mm3, mm5      psubusb mm3, mm5
92      por mm0, mm1
93      por mm2, mm3      por mm2, mm3
94    
95      movq mm1,mm0      movq mm1,mm0
     movq mm3,mm2  
   
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 );
 sad8_mmx:  
141    
142      mov eax, [esp+ 4] ; Src1    movq mm0, [TMP1+%1]
143      mov edx, [esp+ 8] ; Src2    movq mm2, [_EBX+%1]
144      mov ecx, [esp+12] ; Stride    movq mm1, mm0
145      movq mm3, mm2
146    
147      pxor mm6, mm6 ; accum  %if %2 != 0
148      pxor mm7, mm7 ; zero    add TMP1, TMP0
149    %endif
150    
151      SAD_8x8_MMX    punpcklbw mm0, mm7
152      SAD_8x8_MMX    punpckhbw mm1, mm7
153      SAD_8x8_MMX    punpcklbw mm2, mm7
154      SAD_8x8_MMX    punpckhbw mm3, mm7
155    
156      pmaddwd mm6, [mmx_one] ; collapse  %if %2 != 0
157      movq mm7, mm6    add _EBX, TMP0
158      psrlq mm7, 32  %endif
     paddd mm6, mm7  
159    
160      movd eax, mm6    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      ret    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  ; uint32_t sad16bi_mmx(const uint8_t * const cur,    movq mm2, [_EAX+8]
193  ; const uint8_t * const ref1,    lea _EAX, [_EAX+TMP0]
     movq mm0, [eax]  
     movq mm2, [eax+8]  
     lea eax,[eax+ecx]  
194      movq mm1, mm0      movq mm1, mm0
     movq mm3, mm2  
195      punpcklbw mm0,mm7      punpcklbw mm0,mm7
196      punpcklbw mm2,mm7    movq mm3, mm2
197      punpckhbw mm1,mm7      punpckhbw mm1,mm7
     punpckhbw mm3,mm7  
198      paddw mm5, mm0      paddw mm5, mm0
199      punpcklbw mm2, mm7
200      paddw mm6, mm1      paddw mm6, mm1
201      punpckhbw mm3, mm7
202      paddw mm5, mm2      paddw mm5, mm2
203      paddw mm6, mm3      paddw mm6, mm3
204  %endmacro  %endmacro
205    
206  %macro ABS_16x16_MMX 0  %macro ABS_16x16_MMX 0
207      movq mm0, [eax]    movq mm0, [_EAX]
208      movq mm2, [eax+8]    movq mm2, [_EAX+8]
209      lea eax,[eax+ecx]    lea _EAX, [_EAX+TMP0]
210      movq mm1, mm0      movq mm1, mm0
211      movq mm3, mm2      movq mm3, mm2
212      punpcklbw mm0, mm7      punpcklbw mm0, mm7
# Line 256  Line 238 
238          paddw mm5, mm2          paddw mm5, mm2
239  %endmacro  %endmacro
240    
241  align 16  ;=============================================================================
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:
269    
270      mov _EAX, prm1 ; Src1
271      mov TMP1, prm2 ; Src2
272      mov TMP0, prm3 ; Stride
273    
274      pxor mm6, mm6 ; accum
275      pxor mm7, mm7 ; zero
276    
277      SAD_16x16_MMX
278      SAD_16x16_MMX
279      SAD_16x16_MMX
280      SAD_16x16_MMX
281      SAD_16x16_MMX
282      SAD_16x16_MMX
283      SAD_16x16_MMX
284      SAD_16x16_MMX
285    
286      SAD_16x16_MMX
287      SAD_16x16_MMX
288      SAD_16x16_MMX
289      SAD_16x16_MMX
290      SAD_16x16_MMX
291      SAD_16x16_MMX
292      SAD_16x16_MMX
293      SAD_16x16_MMX
294    
295      pmaddwd mm6, [mmx_one] ; collapse
296      movq mm7, mm6
297      psrlq mm7, 32
298      paddd mm6, mm7
299    
300      movd eax, mm6
301    
302      ret
303    ENDFUNC
304    
305    ;-----------------------------------------------------------------------------
306    ;
307    ; uint32_t sad8_mmx(const uint8_t * const cur,
308    ;                                       const uint8_t * const ref,
309    ;                                       const uint32_t stride);
310    ;
311    ;-----------------------------------------------------------------------------
312    
313    ALIGN SECTION_ALIGN
314    sad8_mmx:
315    
316      mov _EAX, prm1 ; Src1
317      mov TMP1, prm2 ; Src2
318      mov TMP0, prm3 ; Stride
319    
320      pxor mm6, mm6 ; accum
321      pxor mm7, mm7 ; zero
322    
323      SAD_8x8_MMX
324      SAD_8x8_MMX
325      SAD_8x8_MMX
326      SAD_8x8_MMX
327    
328      pmaddwd mm6, [mmx_one] ; collapse
329      movq mm7, mm6
330      psrlq mm7, 32
331      paddd mm6, mm7
332    
333      movd eax, mm6
334    
335      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      pxor mm7, mm7 ; zero
365    
366      SADV_16x16_MMX
367      SADV_16x16_MMX
368      SADV_16x16_MMX
369      SADV_16x16_MMX
370      SADV_16x16_MMX
371      SADV_16x16_MMX
372      SADV_16x16_MMX
373      SADV_16x16_MMX
374    
375      pmaddwd mm5, [mmx_one] ; collapse
376      pmaddwd mm6, [mmx_one] ; collapse
377    
378      movq mm2, mm5
379      movq mm3, mm6
380    
381      psrlq mm2, 32
382      psrlq mm3, 32
383    
384      paddd mm5, mm2
385      paddd mm6, mm3
386    
387      movd [_EBX], mm5
388      movd [_EBX + 4], mm6
389    
390      paddd mm5, mm6
391    
392      movd edi, mm5
393    
394      pxor mm5, mm5
395      pxor mm6, mm6
396    
397      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      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:
444      mov _EAX, prm1 ; Src
445      mov TMP1, prm2 ; Ref1
446      mov TMP0, prm4 ; Stride
447    
448      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
456      pxor mm7, mm7
457    .Loop:
458      SADBI_16x16_MMX 0, 0
459      SADBI_16x16_MMX 8, 1
460      SADBI_16x16_MMX 0, 0
461      SADBI_16x16_MMX 8, 1
462      SADBI_16x16_MMX 0, 0
463      SADBI_16x16_MMX 8, 1
464      SADBI_16x16_MMX 0, 0
465      SADBI_16x16_MMX 8, 1
466      SADBI_16x16_MMX 0, 0
467      SADBI_16x16_MMX 8, 1
468      SADBI_16x16_MMX 0, 0
469      SADBI_16x16_MMX 8, 1
470      SADBI_16x16_MMX 0, 0
471      SADBI_16x16_MMX 8, 1
472      SADBI_16x16_MMX 0, 0
473      SADBI_16x16_MMX 8, 1
474    
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      SADBI_16x16_MMX 0, 0
480      SADBI_16x16_MMX 8, 1
481      SADBI_16x16_MMX 0, 0
482      SADBI_16x16_MMX 8, 1
483      SADBI_16x16_MMX 0, 0
484      SADBI_16x16_MMX 8, 1
485      SADBI_16x16_MMX 0, 0
486      SADBI_16x16_MMX 8, 1
487      SADBI_16x16_MMX 0, 0
488      SADBI_16x16_MMX 8, 1
489      SADBI_16x16_MMX 0, 0
490      SADBI_16x16_MMX 8, 1
491    
492      pmaddwd mm6, [mmx_one] ; collapse
493      movq mm7, mm6
494      psrlq mm7, 32
495      paddd mm6, mm7
496    
497      movd eax, mm6
498      pop _EBX
499    
500      ret
501    ENDFUNC
502    
503    ;-----------------------------------------------------------------------------
504    ;
505    ; uint32_t sad8bi_mmx(const uint8_t * const cur,
506    ; const uint8_t * const ref1,
507    ; const uint8_t * const ref2,
508    ; const uint32_t stride);
509    ;
510    ;-----------------------------------------------------------------------------
511    
512    ALIGN SECTION_ALIGN
513    sad8bi_mmx:
514      mov _EAX, prm1 ; Src
515      mov TMP1, prm2 ; Ref1
516      mov TMP0, prm4 ; Stride
517    
518      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
526      pxor mm7, mm7
527    .Loop:
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      SADBI_16x16_MMX 0, 1
536    
537      pmaddwd mm6, [mmx_one] ; collapse
538      movq mm7, mm6
539      psrlq mm7, 32
540      paddd mm6, mm7
541    
542      movd eax, mm6
543      pop _EBX
544      ret
545    ENDFUNC
546    
547    ;-----------------------------------------------------------------------------
548    ;
549    ; uint32_t dev16_mmx(const uint8_t * const cur,
550    ;                                       const uint32_t stride);
551    ;
552    ;-----------------------------------------------------------------------------
553    
554    ALIGN SECTION_ALIGN
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 299  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 325  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.262  
changed lines
  Added in v.1795

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