[cvs] / xvidcore / src / motion / x86_asm / sad_xmm.asm Repository:
ViewVC logotype

Annotation of /xvidcore/src/motion/x86_asm/sad_xmm.asm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.10 - (view) (download)

1 : edgomez 1.7 ;/****************************************************************************
2 : Isibaar 1.1 ; *
3 : edgomez 1.7 ; * XVID MPEG-4 VIDEO CODEC
4 :     ; * - K7 optimized SAD operators -
5 : Isibaar 1.1 ; *
6 : edgomez 1.7 ; * Copyright(C) 2001 Peter Ross <pross@xvid.org>
7 :     ; * 2001 Michael Militzer <isibaar@xvid.org>
8 :     ; * 2002 Pascal Massimino <skal@planet-d.net>
9 : edgomez 1.6 ; *
10 : edgomez 1.7 ; * This program is free software; you can redistribute it and/or modify it
11 :     ; * under the terms of the GNU General Public License as published by
12 :     ; * the Free Software Foundation; either version 2 of the License, or
13 :     ; * (at your option) any later version.
14 : edgomez 1.6 ; *
15 : edgomez 1.7 ; * This program is distributed in the hope that it will be useful,
16 :     ; * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 :     ; * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 :     ; * GNU General Public License for more details.
19 : edgomez 1.6 ; *
20 : edgomez 1.7 ; * You should have received a copy of the GNU General Public License
21 :     ; * along with this program; if not, write to the Free Software
22 :     ; * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 : Isibaar 1.1 ; *
24 : edgomez 1.7 ; * $Id$
25 : Isibaar 1.1 ; *
26 : edgomez 1.7 ; ***************************************************************************/
27 : Isibaar 1.1
28 : edgomez 1.7 BITS 32
29 : suxen_drol 1.2
30 : edgomez 1.7 %macro cglobal 1
31 : Isibaar 1.1 %ifdef PREFIX
32 : edgomez 1.9 %ifdef MARK_FUNCS
33 : edgomez 1.10 global _%1:function %1.endfunc-%1
34 :     %define %1 _%1:function %1.endfunc-%1
35 : edgomez 1.9 %else
36 :     global _%1
37 :     %define %1 _%1
38 :     %endif
39 : Isibaar 1.1 %else
40 : edgomez 1.9 %ifdef MARK_FUNCS
41 : edgomez 1.10 global %1:function %1.endfunc-%1
42 : edgomez 1.9 %else
43 :     global %1
44 :     %endif
45 : Isibaar 1.1 %endif
46 :     %endmacro
47 :    
48 : edgomez 1.7 ;=============================================================================
49 :     ; Read only data
50 :     ;=============================================================================
51 :    
52 :     %ifdef FORMAT_COFF
53 : edgomez 1.8 SECTION .rodata
54 : edgomez 1.7 %else
55 : edgomez 1.8 SECTION .rodata align=16
56 : edgomez 1.7 %endif
57 :    
58 :     ALIGN 16
59 :     mmx_one: times 4 dw 1
60 :    
61 :     ;=============================================================================
62 :     ; Helper macros
63 :     ;=============================================================================
64 :    
65 :     %macro SAD_16x16_SSE 0
66 :     movq mm0, [eax]
67 :     psadbw mm0, [edx]
68 :     movq mm1, [eax+8]
69 :     add eax, ecx
70 :     psadbw mm1, [edx+8]
71 :     paddusw mm5, mm0
72 :     add edx, ecx
73 :     paddusw mm6, mm1
74 :     %endmacro
75 :    
76 :     %macro SAD_8x8_SSE 0
77 :     movq mm0, [eax]
78 :     movq mm1, [eax+ecx]
79 :     psadbw mm0, [edx]
80 :     psadbw mm1, [edx+ecx]
81 :     add eax, ebx
82 :     add edx, ebx
83 :     paddusw mm5, mm0
84 :     paddusw mm6, mm1
85 :     %endmacro
86 :    
87 :     %macro SADBI_16x16_SSE 0
88 :     movq mm0, [eax]
89 :     movq mm1, [eax+8]
90 :     movq mm2, [edx]
91 :     movq mm3, [edx+8]
92 :     pavgb mm2, [ebx]
93 :     add edx, ecx
94 :     pavgb mm3, [ebx+8]
95 :     add ebx, ecx
96 :     psadbw mm0, mm2
97 :     add eax, ecx
98 :     psadbw mm1, mm3
99 :     paddusw mm5, mm0
100 :     paddusw mm6, mm1
101 :     %endmacro
102 :    
103 :     %macro SADBI_8x8_XMM 0
104 :     movq mm0, [eax]
105 :     movq mm1, [eax+ecx]
106 :     movq mm2, [edx]
107 :     movq mm3, [edx+ecx]
108 :     pavgb mm2, [ebx]
109 :     lea edx, [edx+2*ecx]
110 :     pavgb mm3, [ebx+ecx]
111 :     lea ebx, [ebx+2*ecx]
112 :     psadbw mm0, mm2
113 :     lea eax, [eax+2*ecx]
114 :     psadbw mm1, mm3
115 :     paddusw mm5, mm0
116 :     paddusw mm6, mm1
117 :     %endmacro
118 : Isibaar 1.1
119 : edgomez 1.7 %macro MEAN_16x16_SSE 0
120 :     movq mm0, [eax]
121 :     movq mm1, [eax+8]
122 :     psadbw mm0, mm7
123 :     psadbw mm1, mm7
124 :     add eax, ecx
125 :     paddw mm5, mm0
126 :     paddw mm6, mm1
127 :     %endmacro
128 : Isibaar 1.1
129 : edgomez 1.7 %macro ABS_16x16_SSE 0
130 :     movq mm0, [eax]
131 :     movq mm1, [eax+8]
132 :     psadbw mm0, mm4
133 :     psadbw mm1, mm4
134 :     lea eax, [eax+ecx]
135 :     paddw mm5, mm0
136 :     paddw mm6, mm1
137 :     %endmacro
138 : Isibaar 1.1
139 : edgomez 1.7 ;=============================================================================
140 :     ; Code
141 :     ;=============================================================================
142 :    
143 :     SECTION .text
144 :    
145 :     cglobal sad16_xmm
146 :     cglobal sad8_xmm
147 :     cglobal sad16bi_xmm
148 :     cglobal sad8bi_xmm
149 :     cglobal dev16_xmm
150 :     cglobal sad16v_xmm
151 : Isibaar 1.1
152 : edgomez 1.7 ;-----------------------------------------------------------------------------
153 : Isibaar 1.1 ;
154 :     ; uint32_t sad16_xmm(const uint8_t * const cur,
155 :     ; const uint8_t * const ref,
156 : suxen_drol 1.2 ; const uint32_t stride,
157 : Isibaar 1.1 ; const uint32_t best_sad);
158 : suxen_drol 1.2 ;
159 : edgomez 1.7 ;-----------------------------------------------------------------------------
160 : Isibaar 1.1
161 : edgomez 1.7 ALIGN 16
162 : Isibaar 1.1 sad16_xmm:
163 :    
164 : edgomez 1.7 mov eax, [esp+ 4] ; Src1
165 :     mov edx, [esp+ 8] ; Src2
166 :     mov ecx, [esp+12] ; Stride
167 :    
168 :     pxor mm5, mm5 ; accum1
169 :     pxor mm6, mm6 ; accum2
170 :    
171 :     SAD_16x16_SSE
172 :     SAD_16x16_SSE
173 :     SAD_16x16_SSE
174 :     SAD_16x16_SSE
175 :     SAD_16x16_SSE
176 :     SAD_16x16_SSE
177 :     SAD_16x16_SSE
178 :     SAD_16x16_SSE
179 :    
180 :     SAD_16x16_SSE
181 :     SAD_16x16_SSE
182 :     SAD_16x16_SSE
183 :     SAD_16x16_SSE
184 :     SAD_16x16_SSE
185 :     SAD_16x16_SSE
186 :     SAD_16x16_SSE
187 :     SAD_16x16_SSE
188 :    
189 :     paddusw mm6,mm5
190 :     movd eax, mm6
191 :     ret
192 : edgomez 1.10 .endfunc
193 : Isibaar 1.1
194 :    
195 : edgomez 1.7 ;-----------------------------------------------------------------------------
196 : Isibaar 1.1 ;
197 :     ; uint32_t sad8_xmm(const uint8_t * const cur,
198 :     ; const uint8_t * const ref,
199 :     ; const uint32_t stride);
200 :     ;
201 : edgomez 1.7 ;-----------------------------------------------------------------------------
202 : Isibaar 1.1
203 : edgomez 1.7 ALIGN 16
204 :     sad8_xmm:
205 : suxen_drol 1.2
206 : edgomez 1.7 mov eax, [esp+ 4] ; Src1
207 :     mov edx, [esp+ 8] ; Src2
208 :     mov ecx, [esp+12] ; Stride
209 :     push ebx
210 :     lea ebx, [ecx+ecx]
211 : suxen_drol 1.2
212 : edgomez 1.7 pxor mm5, mm5 ; accum1
213 :     pxor mm6, mm6 ; accum2
214 : suxen_drol 1.2
215 : edgomez 1.7 SAD_8x8_SSE
216 :     SAD_8x8_SSE
217 :     SAD_8x8_SSE
218 : suxen_drol 1.2
219 : edgomez 1.7 movq mm0, [eax]
220 :     movq mm1, [eax+ecx]
221 :     psadbw mm0, [edx]
222 :     psadbw mm1, [edx+ecx]
223 : suxen_drol 1.2
224 : edgomez 1.7 pop ebx
225 : suxen_drol 1.2
226 : edgomez 1.7 paddusw mm5,mm0
227 :     paddusw mm6,mm1
228 : suxen_drol 1.2
229 : edgomez 1.7 paddusw mm6,mm5
230 :     movd eax, mm6
231 : suxen_drol 1.2
232 : edgomez 1.7 ret
233 : edgomez 1.10 .endfunc
234 : suxen_drol 1.2
235 :    
236 : edgomez 1.7 ;-----------------------------------------------------------------------------
237 : suxen_drol 1.2 ;
238 :     ; uint32_t sad16bi_xmm(const uint8_t * const cur,
239 :     ; const uint8_t * const ref1,
240 :     ; const uint8_t * const ref2,
241 :     ; const uint32_t stride);
242 :     ;
243 : edgomez 1.7 ;-----------------------------------------------------------------------------
244 : suxen_drol 1.2
245 : edgomez 1.7 ALIGN 16
246 :     sad16bi_xmm:
247 :     push ebx
248 :     mov eax, [esp+4+ 4] ; Src
249 :     mov edx, [esp+4+ 8] ; Ref1
250 :     mov ebx, [esp+4+12] ; Ref2
251 :     mov ecx, [esp+4+16] ; Stride
252 :    
253 :     pxor mm5, mm5 ; accum1
254 :     pxor mm6, mm6 ; accum2
255 :    
256 :     SADBI_16x16_SSE
257 :     SADBI_16x16_SSE
258 :     SADBI_16x16_SSE
259 :     SADBI_16x16_SSE
260 :     SADBI_16x16_SSE
261 :     SADBI_16x16_SSE
262 :     SADBI_16x16_SSE
263 :     SADBI_16x16_SSE
264 :    
265 :     SADBI_16x16_SSE
266 :     SADBI_16x16_SSE
267 :     SADBI_16x16_SSE
268 :     SADBI_16x16_SSE
269 :     SADBI_16x16_SSE
270 :     SADBI_16x16_SSE
271 :     SADBI_16x16_SSE
272 :     SADBI_16x16_SSE
273 :    
274 :     paddusw mm6,mm5
275 :     movd eax, mm6
276 :     pop ebx
277 :     ret
278 : edgomez 1.10 .endfunc
279 : Isibaar 1.1
280 : edgomez 1.7 ;-----------------------------------------------------------------------------
281 :     ;
282 :     ; uint32_t sad8bi_xmm(const uint8_t * const cur,
283 :     ; const uint8_t * const ref1,
284 :     ; const uint8_t * const ref2,
285 :     ; const uint32_t stride);
286 :     ;
287 :     ;-----------------------------------------------------------------------------
288 : Isibaar 1.1
289 : edgomez 1.7 ALIGN 16
290 :     sad8bi_xmm:
291 :     push ebx
292 :     mov eax, [esp+4+ 4] ; Src
293 :     mov edx, [esp+4+ 8] ; Ref1
294 :     mov ebx, [esp+4+12] ; Ref2
295 :     mov ecx, [esp+4+16] ; Stride
296 :    
297 :     pxor mm5, mm5 ; accum1
298 :     pxor mm6, mm6 ; accum2
299 :     .Loop
300 :     SADBI_8x8_XMM
301 :     SADBI_8x8_XMM
302 :     SADBI_8x8_XMM
303 :     SADBI_8x8_XMM
304 :    
305 :     paddusw mm6,mm5
306 :     movd eax, mm6
307 :     pop ebx
308 :     ret
309 : edgomez 1.10 .endfunc
310 : suxen_drol 1.2
311 :    
312 : edgomez 1.7 ;-----------------------------------------------------------------------------
313 : suxen_drol 1.2 ;
314 :     ; uint32_t dev16_xmm(const uint8_t * const cur,
315 :     ; const uint32_t stride);
316 :     ;
317 : edgomez 1.7 ;-----------------------------------------------------------------------------
318 : Isibaar 1.1
319 : edgomez 1.7 ALIGN 16
320 : Isibaar 1.1 dev16_xmm:
321 :    
322 : edgomez 1.7 mov eax, [esp+ 4] ; Src
323 :     mov ecx, [esp+ 8] ; Stride
324 : Isibaar 1.1
325 : edgomez 1.7 pxor mm7, mm7 ; zero
326 :     pxor mm5, mm5 ; mean accums
327 :     pxor mm6, mm6
328 :    
329 :     MEAN_16x16_SSE
330 :     MEAN_16x16_SSE
331 :     MEAN_16x16_SSE
332 :     MEAN_16x16_SSE
333 :     MEAN_16x16_SSE
334 :     MEAN_16x16_SSE
335 :     MEAN_16x16_SSE
336 :     MEAN_16x16_SSE
337 :    
338 :     MEAN_16x16_SSE
339 :     MEAN_16x16_SSE
340 :     MEAN_16x16_SSE
341 :     MEAN_16x16_SSE
342 :     MEAN_16x16_SSE
343 :     MEAN_16x16_SSE
344 :     MEAN_16x16_SSE
345 :     MEAN_16x16_SSE
346 :    
347 :     paddusw mm6, mm5
348 :    
349 :     movq mm4, mm6
350 :     psllq mm4, 32
351 :     paddd mm4, mm6
352 :     psrld mm4, 8 ; /= (16*16)
353 :    
354 :     packssdw mm4, mm4
355 :     packuswb mm4, mm4
356 :    
357 :     ; mm4 contains the mean
358 :    
359 :     mov eax, [esp+ 4] ; Src
360 :    
361 :    
362 :     pxor mm5, mm5 ; sums
363 :     pxor mm6, mm6
364 :    
365 :     ABS_16x16_SSE
366 :     ABS_16x16_SSE
367 :     ABS_16x16_SSE
368 :     ABS_16x16_SSE
369 :     ABS_16x16_SSE
370 :     ABS_16x16_SSE
371 :     ABS_16x16_SSE
372 :     ABS_16x16_SSE
373 :    
374 :     ABS_16x16_SSE
375 :     ABS_16x16_SSE
376 :     ABS_16x16_SSE
377 :     ABS_16x16_SSE
378 :     ABS_16x16_SSE
379 :     ABS_16x16_SSE
380 :     ABS_16x16_SSE
381 :     ABS_16x16_SSE
382 :    
383 :     paddusw mm6, mm5
384 :     movq mm7, mm6
385 :     psllq mm7, 32
386 :     paddd mm6, mm7
387 : edgomez 1.6
388 : edgomez 1.7 movd eax, mm6
389 :     ret
390 : edgomez 1.10 .endfunc
391 : edgomez 1.6
392 : edgomez 1.7 ;-----------------------------------------------------------------------------
393 : edgomez 1.6 ;int sad16v_xmm(const uint8_t * const cur,
394 :     ; const uint8_t * const ref,
395 :     ; const uint32_t stride,
396 :     ; int* sad8);
397 : edgomez 1.7 ;-----------------------------------------------------------------------------
398 :    
399 :     ALIGN 16
400 : edgomez 1.6 sad16v_xmm:
401 : edgomez 1.7 push ebx
402 :     mov eax, [esp+4+ 4] ; Src1
403 :     mov edx, [esp+4+ 8] ; Src2
404 :     mov ecx, [esp+4+12] ; Stride
405 :     mov ebx, [esp+4+16] ; sad ptr
406 :    
407 :     pxor mm5, mm5 ; accum1
408 :     pxor mm6, mm6 ; accum2
409 :     pxor mm7, mm7 ; total
410 :    
411 :     SAD_16x16_SSE
412 :     SAD_16x16_SSE
413 :     SAD_16x16_SSE
414 :     SAD_16x16_SSE
415 :     SAD_16x16_SSE
416 :     SAD_16x16_SSE
417 :     SAD_16x16_SSE
418 :     SAD_16x16_SSE
419 :    
420 :     paddusw mm7, mm5
421 :     paddusw mm7, mm6
422 :     movd [ebx], mm5
423 :     movd [ebx+4], mm6
424 :    
425 :     pxor mm5, mm5 ; accum1
426 :     pxor mm6, mm6 ; accum2
427 :    
428 :     SAD_16x16_SSE
429 :     SAD_16x16_SSE
430 :     SAD_16x16_SSE
431 :     SAD_16x16_SSE
432 :     SAD_16x16_SSE
433 :     SAD_16x16_SSE
434 :     SAD_16x16_SSE
435 :     SAD_16x16_SSE
436 :    
437 :     paddusw mm7, mm5
438 :     paddusw mm7, mm6
439 :     movd [ebx+8], mm5
440 :     movd [ebx+12], mm6
441 :    
442 :     movd eax, mm7
443 :     pop ebx
444 :     ret
445 : edgomez 1.10 .endfunc
446 :    

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