[svn] / branches / release-1_2-branch / xvidcore / src / motion / x86_asm / sad_mmx.asm Repository:
ViewVC logotype

Diff of /branches/release-1_2-branch/xvidcore/src/motion/x86_asm/sad_mmx.asm

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

trunk/xvidcore/src/motion/x86_asm/sad_mmx.asm revision 1382, Mon Mar 22 22:36:25 2004 UTC branches/release-1_2-branch/xvidcore/src/motion/x86_asm/sad_mmx.asm revision 1877, Wed Sep 16 17:11:39 2009 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.12 2004-03-22 22:36:24 edgomez Exp $  ; * $Id: sad_mmx.asm,v 1.20.2.2 2009-09-16 17:11:39 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 data  
 %else  
 SECTION .rodata data 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  TEXT
246    
247  cglobal sad16_mmx  cglobal sad16_mmx
248  cglobal sad16v_mmx  cglobal sad16v_mmx
# Line 270  Line 251 
251  cglobal sad8bi_mmx  cglobal sad8bi_mmx
252  cglobal dev16_mmx  cglobal dev16_mmx
253  cglobal sse8_16bit_mmx  cglobal sse8_16bit_mmx
254    cglobal sse8_8bit_mmx
255    
256  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
257  ;  ;
# Line 282  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 318  Line 300 
300    movd eax, mm6    movd eax, mm6
301    
302    ret    ret
303    ENDFUNC
304    
305  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
306  ;  ;
# Line 327  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 350  Line 333 
333    movd eax, mm6    movd eax, mm6
334    
335    ret    ret
336    ENDFUNC
337    
338  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
339  ;  ;
# Line 360  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 396  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 427  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 450  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 501  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 514  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 540  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 550  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 593  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 621  Line 622 
622    movd eax, mm6    movd eax, mm6
623    
624    ret    ret
625    ENDFUNC
626    
627  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
628  ;  ;
# Line 630  Line 632 
632  ;  ;
633  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
634    
635  %macro ROW_SSE_MMX 2  %macro ROW_SSE_16bit_MMX 2
636    movq mm0, [%1]    movq mm0, [%1]
637    movq mm1, [%1+8]    movq mm1, [%1+8]
638    psubw mm0, [%2]    psubw mm0, [%2]
# Line 642  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    ROW_SSE_MMX esi, edi  %rep 8
658    lea esi, [esi+edx]    ROW_SSE_16bit_MMX _EAX, TMP0
659    lea edi, [edi+edx]    lea _EAX, [_EAX+TMP1]
660    ROW_SSE_MMX esi, edi    lea TMP0, [TMP0+TMP1]
661    lea esi, [esi+edx]  %endrep
   lea edi, [edi+edx]  
   ROW_SSE_MMX esi, edi  
   lea esi, [esi+edx]  
   lea edi, [edi+edx]  
   ROW_SSE_MMX esi, edi  
   lea esi, [esi+edx]  
   lea edi, [edi+edx]  
   ROW_SSE_MMX esi, edi  
   lea esi, [esi+edx]  
   lea edi, [edi+edx]  
   ROW_SSE_MMX esi, edi  
   lea esi, [esi+edx]  
   lea edi, [edi+edx]  
   ROW_SSE_MMX esi, edi  
   lea esi, [esi+edx]  
   lea edi, [edi+edx]  
   ROW_SSE_MMX esi, edi  
   lea esi, [esi+edx]  
   lea edi, [edi+edx]  
662    
663    ;; Finish adding each dword of the accumulator    ;; Finish adding each dword of the accumulator
664    movq mm3, mm2    movq mm3, mm2
# Line 686  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    ;
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
732    ENDFUNC
733    
734    NON_EXEC_STACK

Legend:
Removed from v.1382  
changed lines
  Added in v.1877

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