[svn] / trunk / xvidcore / src / motion / x86_asm / sad_mmx.asm Repository:
ViewVC logotype

Annotation of /trunk/xvidcore/src/motion/x86_asm/sad_mmx.asm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 851 - (view) (download)

1 : edgomez 851 ;/**************************************************************************
2 : Isibaar 262 ; *
3 : edgomez 851 ; * XVID MPEG-4 VIDEO CODEC
4 :     ; * mmx sum of absolute difference
5 : Isibaar 262 ; *
6 : edgomez 851 ; * This program is free software; you can redistribute it and/or modify
7 :     ; * it under the terms of the GNU General Public License as published by
8 :     ; * the Free Software Foundation; either version 2 of the License, or
9 :     ; * (at your option) any later version.
10 : Isibaar 262 ; *
11 : edgomez 851 ; * This program is distributed in the hope that it will be useful,
12 :     ; * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 :     ; * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 :     ; * GNU General Public License for more details.
15 : Isibaar 262 ; *
16 : edgomez 851 ; * You should have received a copy of the GNU General Public License
17 :     ; * along with this program; if not, write to the Free Software
18 :     ; * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19 : Isibaar 262 ; *
20 : edgomez 851 ; *************************************************************************/
21 :    
22 :     ;/**************************************************************************
23 : Isibaar 262 ; *
24 : edgomez 851 ; * History:
25 : Isibaar 262 ; *
26 : edgomez 851 ; * 23.07.2002 sad[16,8]bi_xmm; <pross@xvid.org>
27 :     ; * 04.06.2002 cleanup -Skal-
28 :     ; * 12.11.2001 inital version; (c)2001 peter ross <pross@cs.rmit.edu.au>
29 : edgomez 652 ; *
30 : edgomez 851 ; *************************************************************************/
31 : Isibaar 262
32 :     bits 32
33 :    
34 :     %macro cglobal 1
35 : suxen_drol 329 %ifdef PREFIX
36 : Isibaar 262 global _%1
37 :     %define %1 _%1
38 :     %else
39 :     global %1
40 :     %endif
41 :     %endmacro
42 :    
43 :     section .data
44 :    
45 :     align 16
46 :     mmx_one times 4 dw 1
47 :    
48 :     section .text
49 :    
50 :     cglobal sad16_mmx
51 : edgomez 851 cglobal sad16v_mmx
52 : Isibaar 262 cglobal sad8_mmx
53 :     cglobal sad16bi_mmx
54 :     cglobal sad8bi_mmx
55 :     cglobal dev16_mmx
56 :    
57 :     ;===========================================================================
58 :     ;
59 :     ; uint32_t sad16_mmx(const uint8_t * const cur,
60 :     ; const uint8_t * const ref,
61 :     ; const uint32_t stride,
62 : suxen_drol 329 ; const uint32_t best_sad);
63 :     ;
64 : Isibaar 262 ; (early termination ignore; slows this down)
65 :     ;
66 :     ;===========================================================================
67 :    
68 :     %macro SAD_16x16_MMX 0
69 :     movq mm0, [eax]
70 :     movq mm1, [edx]
71 :    
72 :     movq mm2, [eax+8]
73 :     movq mm3, [edx+8]
74 :    
75 :     movq mm4, mm0
76 :     psubusb mm0, mm1
77 :     lea eax,[eax+ecx]
78 :     movq mm5, mm2
79 :     psubusb mm2, mm3
80 :     lea edx,[edx+ecx]
81 :    
82 :     psubusb mm1, mm4
83 :     por mm0, mm1
84 :     psubusb mm3, mm5
85 :     por mm2, mm3
86 :    
87 :     movq mm1,mm0
88 :     movq mm3,mm2
89 :    
90 :     punpcklbw mm0,mm7
91 :     punpckhbw mm1,mm7
92 :     punpcklbw mm2,mm7
93 :     punpckhbw mm3,mm7
94 :    
95 :     paddusw mm0,mm1
96 :     paddusw mm6,mm0
97 :     paddusw mm2,mm3
98 :     paddusw mm6,mm2
99 :     %endmacro
100 :    
101 :     align 16
102 :     sad16_mmx:
103 :    
104 :     mov eax, [esp+ 4] ; Src1
105 :     mov edx, [esp+ 8] ; Src2
106 :     mov ecx, [esp+12] ; Stride
107 :    
108 :     pxor mm6, mm6 ; accum
109 :     pxor mm7, mm7 ; zero
110 :    
111 :     SAD_16x16_MMX
112 :     SAD_16x16_MMX
113 :     SAD_16x16_MMX
114 :     SAD_16x16_MMX
115 :     SAD_16x16_MMX
116 :     SAD_16x16_MMX
117 :     SAD_16x16_MMX
118 :     SAD_16x16_MMX
119 :    
120 :     SAD_16x16_MMX
121 :     SAD_16x16_MMX
122 :     SAD_16x16_MMX
123 :     SAD_16x16_MMX
124 :     SAD_16x16_MMX
125 :     SAD_16x16_MMX
126 :     SAD_16x16_MMX
127 :     SAD_16x16_MMX
128 :    
129 :     pmaddwd mm6, [mmx_one] ; collapse
130 :     movq mm7, mm6
131 :     psrlq mm7, 32
132 :     paddd mm6, mm7
133 :    
134 :     movd eax, mm6
135 :    
136 :     ret
137 :    
138 :    
139 :     ;===========================================================================
140 :     ;
141 :     ; uint32_t sad8_mmx(const uint8_t * const cur,
142 :     ; const uint8_t * const ref,
143 :     ; const uint32_t stride);
144 :     ;
145 :     ;===========================================================================
146 :    
147 :     %macro SAD_8x8_MMX 0
148 :     movq mm0, [eax]
149 :     movq mm1, [edx]
150 :    
151 :     movq mm2, [eax+ecx]
152 :     movq mm3, [edx+ecx]
153 :    
154 :     lea eax,[eax+2*ecx]
155 :     lea edx,[edx+2*ecx]
156 :    
157 :     movq mm4, mm0
158 :     psubusb mm0, mm1
159 :     movq mm5, mm2
160 :     psubusb mm2, mm3
161 :    
162 :     psubusb mm1, mm4
163 :     por mm0, mm1
164 :     psubusb mm3, mm5
165 :     por mm2, mm3
166 :    
167 :     movq mm1,mm0
168 :     movq mm3,mm2
169 :    
170 :     punpcklbw mm0,mm7
171 :     punpckhbw mm1,mm7
172 :     punpcklbw mm2,mm7
173 :     punpckhbw mm3,mm7
174 :    
175 :     paddusw mm0,mm1
176 :     paddusw mm6,mm0
177 :     paddusw mm2,mm3
178 :     paddusw mm6,mm2
179 :     %endmacro
180 :    
181 :     align 16
182 :     sad8_mmx:
183 :    
184 :     mov eax, [esp+ 4] ; Src1
185 :     mov edx, [esp+ 8] ; Src2
186 :     mov ecx, [esp+12] ; Stride
187 :    
188 :     pxor mm6, mm6 ; accum
189 :     pxor mm7, mm7 ; zero
190 :    
191 :     SAD_8x8_MMX
192 :     SAD_8x8_MMX
193 :     SAD_8x8_MMX
194 :     SAD_8x8_MMX
195 :    
196 :     pmaddwd mm6, [mmx_one] ; collapse
197 :     movq mm7, mm6
198 :     psrlq mm7, 32
199 :     paddd mm6, mm7
200 :    
201 :     movd eax, mm6
202 :    
203 :     ret
204 :    
205 :    
206 : edgomez 851 ;===========================================================================
207 :     ;
208 :     ; uint32_t sad16v_mmx(const uint8_t * const cur,
209 :     ; const uint8_t * const ref,
210 :     ; const uint32_t stride,
211 :     ; int32_t *sad);
212 :     ;
213 :     ;===========================================================================
214 : Isibaar 262
215 : edgomez 851 %macro SADV_16x16_MMX 0
216 :     movq mm0, [eax]
217 :     movq mm1, [edx]
218 : Isibaar 262
219 : edgomez 851 movq mm2, [eax+8]
220 :     movq mm3, [edx+8]
221 : Isibaar 262
222 : edgomez 851 movq mm4, mm0
223 :     psubusb mm0, mm1
224 :    
225 :     psubusb mm1, mm4
226 :     por mm0, mm1
227 :     lea eax,[eax+ecx]
228 :    
229 :     movq mm4, mm2
230 :     psubusb mm2, mm3
231 :    
232 :     psubusb mm3, mm4
233 :     por mm2, mm3
234 :     lea edx,[edx+ecx]
235 :    
236 :     movq mm1,mm0
237 :     movq mm3,mm2
238 :    
239 :     punpcklbw mm0,mm7
240 :     punpckhbw mm1,mm7
241 :     punpcklbw mm2,mm7
242 :     punpckhbw mm3,mm7
243 :    
244 :     paddusw mm0,mm1
245 :     paddusw mm2,mm3
246 :    
247 :     paddusw mm5, mm0
248 :     paddusw mm6, mm2
249 :     %endmacro
250 :    
251 :     align 16
252 :     sad16v_mmx:
253 :    
254 :     push ebx
255 :     push edi
256 :    
257 :     mov eax, [esp + 8 + 4] ; Src1
258 :     mov edx, [esp + 8 + 8] ; Src2
259 :     mov ecx, [esp + 8 + 12] ; Stride
260 :     mov ebx, [esp + 8 + 16] ; sad ptr
261 :    
262 :     pxor mm5, mm5 ; accum
263 :     pxor mm6, mm6 ; accum
264 :     pxor mm7, mm7 ; zero
265 :    
266 :     SADV_16x16_MMX
267 :     SADV_16x16_MMX
268 :     SADV_16x16_MMX
269 :     SADV_16x16_MMX
270 :     SADV_16x16_MMX
271 :     SADV_16x16_MMX
272 :     SADV_16x16_MMX
273 :     SADV_16x16_MMX
274 :    
275 :     pmaddwd mm5, [mmx_one] ; collapse
276 :     pmaddwd mm6, [mmx_one] ; collapse
277 :    
278 :     movq mm2, mm5
279 :     movq mm3, mm6
280 :    
281 :     psrlq mm2, 32
282 :     psrlq mm3, 32
283 :    
284 :     paddd mm5, mm2
285 :     paddd mm6, mm3
286 :    
287 :     movd [ebx], mm5
288 :     movd [ebx + 4], mm6
289 :    
290 :     paddd mm5, mm6
291 :    
292 :     movd edi, mm5
293 :    
294 :     pxor mm5, mm5
295 :     pxor mm6, mm6
296 :    
297 :     SADV_16x16_MMX
298 :     SADV_16x16_MMX
299 :     SADV_16x16_MMX
300 :     SADV_16x16_MMX
301 :     SADV_16x16_MMX
302 :     SADV_16x16_MMX
303 :     SADV_16x16_MMX
304 :     SADV_16x16_MMX
305 :    
306 :     pmaddwd mm5, [mmx_one] ; collapse
307 :     pmaddwd mm6, [mmx_one] ; collapse
308 :    
309 :     movq mm2, mm5
310 :     movq mm3, mm6
311 :    
312 :     psrlq mm2, 32
313 :     psrlq mm3, 32
314 :    
315 :     paddd mm5, mm2
316 :     paddd mm6, mm3
317 :    
318 :     movd [ebx + 8], mm5
319 :     movd [ebx + 12], mm6
320 :    
321 :     paddd mm5, mm6
322 :    
323 :     movd eax, mm5
324 :    
325 :     add eax, edi
326 :    
327 :     pop edi
328 :     pop ebx
329 :     ret
330 :    
331 :    
332 :    
333 : Isibaar 262 ;===========================================================================
334 :     ;
335 :     ; uint32_t sad16bi_mmx(const uint8_t * const cur,
336 :     ; const uint8_t * const ref1,
337 : suxen_drol 329 ; const uint8_t * const ref2,
338 :     ; const uint32_t stride);
339 :     ;
340 :     ;===========================================================================
341 :     %macro SADBI_16x16_MMX 2 ; SADBI_16x16_MMX( int_ptr_offset, bool_increment_ptr );
342 :    
343 :     movq mm0, [edx+%1]
344 :     movq mm2, [ebx+%1]
345 :     movq mm1, mm0
346 :     movq mm3, mm2
347 :    
348 :     %if %2 != 0
349 :     add edx, ecx
350 :     %endif
351 :    
352 :     punpcklbw mm0, mm7
353 :     punpckhbw mm1, mm7
354 :     punpcklbw mm2, mm7
355 :     punpckhbw mm3, mm7
356 :    
357 :     %if %2 != 0
358 :     add ebx, ecx
359 :     %endif
360 :    
361 :     paddusw mm0, mm2 ; mm01 = ref1 + ref2
362 :     paddusw mm1, mm3
363 :     paddusw mm0, [mmx_one] ; mm01 += 1
364 :     paddusw mm1, [mmx_one]
365 :     psrlw mm0, 1 ; mm01 >>= 1
366 :     psrlw mm1, 1
367 :    
368 :     movq mm2, [eax+%1]
369 :     movq mm3, mm2
370 :     punpcklbw mm2, mm7 ; mm23 = src
371 :     punpckhbw mm3, mm7
372 :    
373 :     %if %2 != 0
374 :     add eax, ecx
375 :     %endif
376 :    
377 :     movq mm4, mm0
378 :     movq mm5, mm1
379 :     psubusw mm0, mm2
380 :     psubusw mm1, mm3
381 :     psubusw mm2, mm4
382 :     psubusw mm3, mm5
383 :     por mm0, mm2 ; mm01 = ABS(mm01 - mm23)
384 :     por mm1, mm3
385 :    
386 :     paddusw mm6,mm0 ; mm6 += mm01
387 :     paddusw mm6,mm1
388 :    
389 :     %endmacro
390 :    
391 :     align 16
392 :     sad16bi_mmx:
393 :     push ebx
394 :     mov eax, [esp+4+ 4] ; Src
395 :     mov edx, [esp+4+ 8] ; Ref1
396 :     mov ebx, [esp+4+12] ; Ref2
397 :     mov ecx, [esp+4+16] ; Stride
398 :    
399 :     pxor mm6, mm6 ; accum2
400 :     pxor mm7, mm7
401 :     .Loop
402 :     SADBI_16x16_MMX 0, 0
403 :     SADBI_16x16_MMX 8, 1
404 :     SADBI_16x16_MMX 0, 0
405 :     SADBI_16x16_MMX 8, 1
406 :     SADBI_16x16_MMX 0, 0
407 :     SADBI_16x16_MMX 8, 1
408 :     SADBI_16x16_MMX 0, 0
409 :     SADBI_16x16_MMX 8, 1
410 :     SADBI_16x16_MMX 0, 0
411 :     SADBI_16x16_MMX 8, 1
412 :     SADBI_16x16_MMX 0, 0
413 :     SADBI_16x16_MMX 8, 1
414 :     SADBI_16x16_MMX 0, 0
415 :     SADBI_16x16_MMX 8, 1
416 :     SADBI_16x16_MMX 0, 0
417 :     SADBI_16x16_MMX 8, 1
418 :    
419 :     SADBI_16x16_MMX 0, 0
420 :     SADBI_16x16_MMX 8, 1
421 :     SADBI_16x16_MMX 0, 0
422 :     SADBI_16x16_MMX 8, 1
423 :     SADBI_16x16_MMX 0, 0
424 :     SADBI_16x16_MMX 8, 1
425 :     SADBI_16x16_MMX 0, 0
426 :     SADBI_16x16_MMX 8, 1
427 :     SADBI_16x16_MMX 0, 0
428 :     SADBI_16x16_MMX 8, 1
429 :     SADBI_16x16_MMX 0, 0
430 :     SADBI_16x16_MMX 8, 1
431 :     SADBI_16x16_MMX 0, 0
432 :     SADBI_16x16_MMX 8, 1
433 :     SADBI_16x16_MMX 0, 0
434 :     SADBI_16x16_MMX 8, 1
435 :    
436 :     pmaddwd mm6, [mmx_one] ; collapse
437 :     movq mm7, mm6
438 :     psrlq mm7, 32
439 :     paddd mm6, mm7
440 :    
441 :     movd eax, mm6
442 :     pop ebx
443 :     ret
444 :    
445 :     ;===========================================================================
446 :     ;
447 :     ; uint32_t sad8bi_mmx(const uint8_t * const cur,
448 :     ; const uint8_t * const ref1,
449 :     ; const uint8_t * const ref2,
450 :     ; const uint32_t stride);
451 :     ;
452 :     ;===========================================================================
453 :     align 16
454 :     sad8bi_mmx:
455 :     push ebx
456 :     mov eax, [esp+4+ 4] ; Src
457 :     mov edx, [esp+4+ 8] ; Ref1
458 :     mov ebx, [esp+4+12] ; Ref2
459 :     mov ecx, [esp+4+16] ; Stride
460 :    
461 :     pxor mm6, mm6 ; accum2
462 :     pxor mm7, mm7
463 :     .Loop
464 :     SADBI_16x16_MMX 0, 1
465 :     SADBI_16x16_MMX 0, 1
466 :     SADBI_16x16_MMX 0, 1
467 :     SADBI_16x16_MMX 0, 1
468 :     SADBI_16x16_MMX 0, 1
469 :     SADBI_16x16_MMX 0, 1
470 :     SADBI_16x16_MMX 0, 1
471 :     SADBI_16x16_MMX 0, 1
472 :    
473 :     pmaddwd mm6, [mmx_one] ; collapse
474 :     movq mm7, mm6
475 :     psrlq mm7, 32
476 :     paddd mm6, mm7
477 :    
478 :     movd eax, mm6
479 :     pop ebx
480 :     ret
481 :    
482 :    
483 :    
484 :    
485 :     ;===========================================================================
486 :     ;
487 :     ; uint32_t dev16_mmx(const uint8_t * const cur,
488 :     ; const uint32_t stride);
489 :     ;
490 :     ;===========================================================================
491 :    
492 :     %macro MEAN_16x16_MMX 0
493 : Isibaar 262 movq mm0, [eax]
494 :     movq mm2, [eax+8]
495 :     lea eax,[eax+ecx]
496 :     movq mm1, mm0
497 :     movq mm3, mm2
498 :     punpcklbw mm0,mm7
499 :     punpcklbw mm2,mm7
500 :     punpckhbw mm1,mm7
501 :     punpckhbw mm3,mm7
502 :     paddw mm5, mm0
503 :     paddw mm6, mm1
504 :     paddw mm5, mm2
505 :     paddw mm6, mm3
506 :     %endmacro
507 :    
508 :     %macro ABS_16x16_MMX 0
509 :     movq mm0, [eax]
510 :     movq mm2, [eax+8]
511 :     lea eax,[eax+ecx]
512 :     movq mm1, mm0
513 :     movq mm3, mm2
514 :     punpcklbw mm0, mm7
515 :     punpcklbw mm2, mm7
516 :     punpckhbw mm1, mm7
517 :     punpckhbw mm3, mm7
518 :     movq mm4, mm6
519 :     psubusw mm4, mm0
520 :    
521 :     psubusw mm0, mm6
522 :     por mm0, mm4
523 :     movq mm4, mm6
524 :     psubusw mm4, mm1
525 :     psubusw mm1, mm6
526 :     por mm1, mm4
527 :    
528 :     movq mm4, mm6
529 :     psubusw mm4, mm2
530 :     psubusw mm2, mm6
531 :     por mm2, mm4
532 :     movq mm4, mm6
533 :     psubusw mm4, mm3
534 :     psubusw mm3, mm6
535 :     por mm3, mm4
536 :    
537 :     paddw mm0, mm1
538 :     paddw mm2, mm3
539 :     paddw mm5, mm0
540 :     paddw mm5, mm2
541 :     %endmacro
542 :    
543 :     align 16
544 :     dev16_mmx:
545 :     mov eax, [esp+ 4] ; Src
546 :     mov ecx, [esp+ 8] ; Stride
547 :    
548 :     pxor mm7, mm7 ; zero
549 :     pxor mm5, mm5 ; accum1
550 :     pxor mm6, mm6 ; accum2
551 :    
552 :     MEAN_16x16_MMX
553 :     MEAN_16x16_MMX
554 :     MEAN_16x16_MMX
555 :     MEAN_16x16_MMX
556 :     MEAN_16x16_MMX
557 :     MEAN_16x16_MMX
558 :     MEAN_16x16_MMX
559 :     MEAN_16x16_MMX
560 :    
561 :     MEAN_16x16_MMX
562 :     MEAN_16x16_MMX
563 :     MEAN_16x16_MMX
564 :     MEAN_16x16_MMX
565 :     MEAN_16x16_MMX
566 :     MEAN_16x16_MMX
567 :     MEAN_16x16_MMX
568 :     MEAN_16x16_MMX
569 :    
570 :     paddusw mm6, mm5
571 :     pmaddwd mm6, [mmx_one] ; collapse
572 :     movq mm5, mm6
573 :     psrlq mm5, 32
574 :     paddd mm6, mm5
575 :    
576 :     psllq mm6, 32 ; blank upper dword
577 :     psrlq mm6, 32 + 8 ; /= (16*16)
578 :    
579 :     punpckldq mm6, mm6
580 :     packssdw mm6, mm6
581 :    
582 :     ; mm6 contains the mean
583 :     ; mm5 is the new accum
584 :    
585 :     pxor mm5, mm5
586 :     mov eax, [esp+ 4] ; Src
587 :    
588 :     ABS_16x16_MMX
589 :     ABS_16x16_MMX
590 :     ABS_16x16_MMX
591 :     ABS_16x16_MMX
592 :     ABS_16x16_MMX
593 :     ABS_16x16_MMX
594 :     ABS_16x16_MMX
595 :     ABS_16x16_MMX
596 :    
597 :     ABS_16x16_MMX
598 :     ABS_16x16_MMX
599 :     ABS_16x16_MMX
600 :     ABS_16x16_MMX
601 :     ABS_16x16_MMX
602 :     ABS_16x16_MMX
603 :     ABS_16x16_MMX
604 :     ABS_16x16_MMX
605 :    
606 :     pmaddwd mm5, [mmx_one] ; collapse
607 :     movq mm6, mm5
608 :     psrlq mm6, 32
609 :     paddd mm6, mm5
610 :    
611 :     movd eax, mm6
612 : edgomez 851 ret

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