[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 1519, Sat Jul 24 11:46:08 2004 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.14 2004-07-24 11:46:08 edgomez 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  
                 global _%1  
                 %define %1 _%1  
         %else  
                 global %1  
         %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 54  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
   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
72    
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 102  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
   punpckhbw mm3,mm7  
   
100    paddusw mm0,mm1    paddusw mm0,mm1
101      punpckhbw mm3,mm7
102    paddusw mm6,mm0    paddusw mm6,mm0
103    paddusw mm2,mm3    paddusw mm2,mm3
104    paddusw mm6,mm2    paddusw mm6,mm2
105  %endmacro  %endmacro
106    
 %macro SADV_16x16_MMX 0  
   movq mm0, [eax]  
   movq mm1, [edx]  
107    
108    movq mm2, [eax+8]  %macro SADV_16x16_MMX 0
109    movq mm3, [edx+8]    movq mm0, [_EAX]
110      movq mm1, [TMP1]
111    
112      movq mm2, [_EAX+8]
113    movq mm4, mm0    movq mm4, mm0
114      movq mm3, [TMP1+8]
115    psubusb mm0, mm1    psubusb mm0, mm1
116    
117    psubusb mm1, mm4    psubusb mm1, mm4
118      lea _EAX,[_EAX+TMP0]
119    por mm0, mm1    por mm0, mm1
   lea eax,[eax+ecx]  
120    
121    movq mm4, mm2    movq mm4, mm2
122    psubusb mm2, mm3    psubusb mm2, mm3
123    
124    psubusb mm3, mm4    psubusb mm3, mm4
125    por mm2, mm3    por mm2, mm3
   lea edx,[edx+ecx]  
126    
127    movq mm1,mm0    movq mm1,mm0
   movq mm3,mm2  
   
128    punpcklbw mm0,mm7    punpcklbw mm0,mm7
129      movq mm3,mm2
130    punpckhbw mm1,mm7    punpckhbw mm1,mm7
131    punpcklbw mm2,mm7    punpcklbw mm2,mm7
   punpckhbw mm3,mm7  
   
132    paddusw mm0,mm1    paddusw mm0,mm1
133    paddusw mm2,mm3    punpckhbw mm3,mm7
   
134    paddusw mm5, mm0    paddusw mm5, mm0
135      paddusw mm2,mm3
136      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 173  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 183  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 207  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
   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 261  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 283  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 319  Line 300 
300    movd eax, mm6    movd eax, mm6
301    
302    ret    ret
303    ENDFUNC
304    
305  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
306  ;  ;
# Line 328  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 351  Line 333 
333    movd eax, mm6    movd eax, mm6
334    
335    ret    ret
336    ENDFUNC
337    
338  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
339  ;  ;
# Line 361  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 397  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 428  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
432    
433  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
434  ;  ;
# Line 451  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
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 502  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  ;  ;
# Line 515  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
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 541  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  ;  ;
# Line 551  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 594  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 622  Line 622 
622    movd eax, mm6    movd eax, mm6
623    
624    ret    ret
625    ENDFUNC
626    
627  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
628  ;  ;
# Line 643  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 668  Line 667 
667    movd eax, mm2    movd eax, mm2
668    
669    ;; All done    ;; All done
   pop edi  
   pop esi  
670    ret    ret
671    ENDFUNC
672    
673  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
674  ;  ;
# Line 704  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 720  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 732  Line 728 
728    movd eax, mm6    movd eax, mm6
729    
730    ;; All done    ;; All done
   pop edi  
   pop esi  
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.1519  
changed lines
  Added in v.1795

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