[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 1794, Fri Nov 14 15:43:28 2008 UTC revision 1795, Wed Nov 26 01:04:34 2008 UTC
# Line 20  Line 20 
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., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA  ; *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
22  ; *  ; *
23  ; * $Id: sad_mmx.asm,v 1.19 2008-11-11 20:46:24 Isibaar Exp $  ; * $Id: sad_mmx.asm,v 1.20 2008-11-26 01:04:34 Isibaar Exp $
24  ; *  ; *
25  ; ***************************************************************************/  ; ***************************************************************************/
26    
27  BITS 32  %include "nasm.inc"
   
 %macro cglobal 1  
         %ifdef PREFIX  
                 %ifdef MARK_FUNCS  
                         global _%1:function %1.endfunc-%1  
                         %define %1 _%1:function %1.endfunc-%1  
                         %define ENDFUNC .endfunc  
                 %else  
                         global _%1  
                         %define %1 _%1  
                         %define ENDFUNC  
                 %endif  
         %else  
                 %ifdef MARK_FUNCS  
                         global %1:function %1.endfunc-%1  
                         %define ENDFUNC .endfunc  
                 %else  
                         global %1  
                         %define ENDFUNC  
                 %endif  
         %endif  
 %endmacro  
28    
29  ;=============================================================================  ;=============================================================================
30  ; Read only data  ; Read only data
31  ;=============================================================================  ;=============================================================================
32    
33  %ifdef FORMAT_COFF  DATA
 SECTION .rodata  
 %else  
 SECTION .rodata align=16  
 %endif  
34    
35  ALIGN 16  ALIGN SECTION_ALIGN
36  mmx_one:  mmx_one:
37          times 4 dw 1          times 4 dw 1
38    
# Line 67  Line 41 
41  ;=============================================================================  ;=============================================================================
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
55    
# Line 88  Line 62 
62    punpcklbw mm0,mm7    punpcklbw mm0,mm7
63    movq mm3, mm2    movq mm3, mm2
64    punpckhbw mm1,mm7    punpckhbw mm1,mm7
65    lea edx, [edx+ecx]    lea TMP1, [TMP1+TMP0]
66    punpcklbw mm2,mm7    punpcklbw mm2,mm7
67    paddusw mm0, mm1    paddusw mm0, mm1
68    punpckhbw mm3,mm7    punpckhbw mm3,mm7
# Line 99  Line 73 
73  %endmacro  %endmacro
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 132  Line 106 
106    
107    
108  %macro SADV_16x16_MMX 0  %macro SADV_16x16_MMX 0
109    movq mm0, [eax]    movq mm0, [_EAX]
110    movq mm1, [edx]    movq mm1, [TMP1]
111    
112    movq mm2, [eax+8]    movq mm2, [_EAX+8]
113    movq mm4, mm0    movq mm4, mm0
114    movq mm3, [edx+8]    movq mm3, [TMP1+8]
115    psubusb mm0, mm1    psubusb mm0, mm1
116    
117    psubusb mm1, mm4    psubusb mm1, mm4
118    lea eax,[eax+ecx]    lea _EAX,[_EAX+TMP0]
119    por mm0, mm1    por mm0, mm1
120    
121    movq mm4, mm2    movq mm4, mm2
# Line 159  Line 133 
133    punpckhbw mm3,mm7    punpckhbw mm3,mm7
134    paddusw mm5, mm0    paddusw mm5, mm0
135    paddusw mm2,mm3    paddusw mm2,mm3
136    lea edx,[edx+ecx]    lea TMP1,[TMP1+TMP0]
137    paddusw mm6, mm2    paddusw mm6, mm2
138  %endmacro  %endmacro
139    
140  %macro SADBI_16x16_MMX 2    ; SADBI_16x16_MMX( int_ptr_offset, bool_increment_ptr );  %macro SADBI_16x16_MMX 2    ; SADBI_16x16_MMX( int_ptr_offset, bool_increment_ptr );
141    
142    movq mm0, [edx+%1]    movq mm0, [TMP1+%1]
143    movq mm2, [ebx+%1]    movq mm2, [_EBX+%1]
144    movq mm1, mm0    movq mm1, mm0
145    movq mm3, mm2    movq mm3, mm2
146    
147  %if %2 != 0  %if %2 != 0
148    add edx, ecx    add TMP1, TMP0
149  %endif  %endif
150    
151    punpcklbw mm0, mm7    punpcklbw mm0, mm7
# Line 180  Line 154 
154    punpckhbw mm3, mm7    punpckhbw mm3, mm7
155    
156  %if %2 != 0  %if %2 != 0
157    add ebx, ecx    add _EBX, TMP0
158  %endif  %endif
159    
160    paddusw mm0, mm2              ; mm01 = ref1 + ref2    paddusw mm0, mm2              ; mm01 = ref1 + ref2
# Line 190  Line 164 
164    psrlw mm0, 1                  ; mm01 >>= 1    psrlw mm0, 1                  ; mm01 >>= 1
165    psrlw mm1, 1    psrlw mm1, 1
166    
167    movq mm2, [eax+%1]    movq mm2, [_EAX+%1]
168    movq mm3, mm2    movq mm3, mm2
169    punpcklbw mm2, mm7            ; mm23 = src    punpcklbw mm2, mm7            ; mm23 = src
170    punpckhbw mm3, mm7    punpckhbw mm3, mm7
171    
172  %if %2 != 0  %if %2 != 0
173    add eax, ecx    add _EAX, TMP0
174  %endif  %endif
175    
176    movq mm4, mm0    movq mm4, mm0
# Line 214  Line 188 
188  %endmacro  %endmacro
189    
190  %macro MEAN_16x16_MMX 0  %macro MEAN_16x16_MMX 0
191    movq mm0, [eax]    movq mm0, [_EAX]
192    movq mm2, [eax+8]    movq mm2, [_EAX+8]
193    lea eax, [eax+ecx]    lea _EAX, [_EAX+TMP0]
194    movq mm1, mm0    movq mm1, mm0
195    punpcklbw mm0, mm7    punpcklbw mm0, mm7
196    movq mm3, mm2    movq mm3, mm2
# Line 230  Line 204 
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 268  Line 242 
242  ; Code  ; Code
243  ;=============================================================================  ;=============================================================================
244    
245  SECTION .text  SECTION .rotext align=SECTION_ALIGN
246    
247  cglobal sad16_mmx  cglobal sad16_mmx
248  cglobal sad16v_mmx  cglobal sad16v_mmx
# Line 290  Line 264 
264  ;  ;
265  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
266    
267  ALIGN 16  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 336  Line 310 
310  ;  ;
311  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
312    
313  ALIGN 16  ALIGN SECTION_ALIGN
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 370  Line 344 
344  ;  ;
345  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
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 406  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 437  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
426    
427    pop edi    pop _EDI
428    pop ebx    pop _EBX
429    
430    ret    ret
431  ENDFUNC  ENDFUNC
# Line 461  Line 439 
439  ;  ;
440  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
441    
442  ALIGN 16  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
# Line 512  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  ENDFUNC
# Line 526  Line 509 
509  ;  ;
510  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
511    
512  ALIGN 16  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
# Line 552  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  ENDFUNC
546    
# Line 563  Line 551 
551  ;  ;
552  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
553    
554  ALIGN 16  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 606  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 656  Line 644 
644  %endmacro  %endmacro
645    
646  sse8_16bit_mmx:  sse8_16bit_mmx:
   push esi  
   push edi  
647    
648    ;; Load the function params    ;; Load the function params
649    mov esi, [esp+8+4]    mov _EAX, prm1
650    mov edi, [esp+8+8]    mov TMP0, prm2
651    mov edx, [esp+8+12]    mov TMP1, prm3
652    
653    ;; Reset the sse accumulator    ;; Reset the sse accumulator
654    pxor mm2, mm2    pxor mm2, mm2
655    
656    ;; Let's go    ;; Let's go
657  %rep 8  %rep 8
658    ROW_SSE_16bit_MMX esi, edi    ROW_SSE_16bit_MMX _EAX, TMP0
659    lea esi, [esi+edx]    lea _EAX, [_EAX+TMP1]
660    lea edi, [edi+edx]    lea TMP0, [TMP0+TMP1]
661  %endrep  %endrep
662    
663    ;; Finish adding each dword of the accumulator    ;; Finish adding each dword of the accumulator
# Line 681  Line 667 
667    movd eax, mm2    movd eax, mm2
668    
669    ;; All done    ;; All done
   pop edi  
   pop esi  
670    ret    ret
671  ENDFUNC  ENDFUNC
672    
# Line 718  Line 702 
702  %endmacro  %endmacro
703    
704  sse8_8bit_mmx:  sse8_8bit_mmx:
   push esi  
   push edi  
705    
706    ;; Load the function params    ;; Load the function params
707    mov esi, [esp+8+4]    mov _EAX, prm1
708    mov edi, [esp+8+8]    mov TMP0, prm2
709    mov edx, [esp+8+12]    mov TMP1, prm3
710    
711    ;; Reset the sse accumulator    ;; Reset the sse accumulator
712    pxor mm6, mm6    pxor mm6, mm6
# Line 734  Line 716 
716    
717    ;; Let's go    ;; Let's go
718  %rep 8  %rep 8
719    ROW_SSE_8bit_MMX esi, edi    ROW_SSE_8bit_MMX _EAX, TMP0
720    lea esi, [esi+edx]    lea _EAX, [_EAX+TMP1]
721    lea edi, [edi+edx]    lea TMP0, [TMP0+TMP1]
722  %endrep  %endrep
723    
724    ;; Finish adding each dword of the accumulator    ;; Finish adding each dword of the accumulator
# Line 746  Line 728 
728    movd eax, mm6    movd eax, mm6
729    
730    ;; All done    ;; All done
   pop edi  
   pop esi  
731    ret    ret
732  ENDFUNC  ENDFUNC
733    

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

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