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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.5 - (view) (download)

1 : Isibaar 1.1 ;/**************************************************************************
2 :     ; *
3 :     ; * XVID MPEG-4 VIDEO CODEC
4 :     ; * mmx/xmm sum of absolute difference
5 :     ; *
6 :     ; * 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 :     ; *
11 :     ; * 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 :     ; *
16 :     ; * 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 :     ; *
20 :     ; *************************************************************************/
21 :    
22 :     ;/**************************************************************************
23 :     ; *
24 :     ; * History:
25 :     ; *
26 :     ; * 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 :     ; *
30 :     ; *************************************************************************/
31 :    
32 :     bits 32
33 :    
34 :     %macro cglobal 1
35 : Isibaar 1.5 ; * 04.06.2002 rewrote some funcs (XMM mainly) -Skal-
36 : h 1.4 ; * 24.04.2002 sse2 dev16, faster sse2 sad16
37 : h 1.3 ; * 17.04.2002 sse2 sad16
38 : Isibaar 1.1 ; * 17.11.2001 bugfix and small improvement for dev16_xmm,
39 :     ; * removed terminate early in sad16_xmm
40 :     %define %1 _%1
41 :     %else
42 :     global %1
43 :     %endif
44 :     %endmacro
45 :    
46 :     section .data
47 :    
48 :     align 16
49 :     mmx_one times 4 dw 1
50 :    
51 :     section .text
52 :    
53 :     cglobal sad16_mmx
54 :     cglobal sad8_mmx
55 :     cglobal sad16bi_mmx
56 :     cglobal sad8bi_mmx
57 :    
58 :     cglobal dev16_mmx
59 :    
60 :     ;===========================================================================
61 :    
62 :     ;
63 :     ; uint32_t sad16_mmx(const uint8_t * const cur,
64 : Isibaar 1.5 ; const uint8_t * const ref,
65 :     cglobal sad16_xmm
66 :     cglobal sad16_sse2
67 :     cglobal sad16bi_xmm
68 :     ; const uint32_t stride,
69 :     cglobal sad8_xmm
70 :     ; (early termination ignore; slows this down)
71 :     cglobal dev16_xmm
72 :     cglobal dev16_sse2
73 : Isibaar 1.1 ;
74 :     ;===========================================================================
75 :    
76 :     %macro SAD_16x16_MMX 0
77 :     ; const uint8_t * const ref,
78 :     ; const uint32_t stride,
79 :     ; const uint32_t best_sad);
80 :     movq mm2, [eax+8]
81 :     movq mm3, [edx+8]
82 :    
83 :     movq mm4, mm0
84 :     psubusb mm0, mm1
85 : Isibaar 1.5 lea eax,[eax+ecx]
86 :     movq mm5, mm2
87 :     psubusb mm2, mm3
88 :     lea edx,[edx+ecx]
89 :    
90 :     psubusb mm1, mm4
91 :     por mm0, mm1
92 :     psubusb mm3, mm5
93 :     por mm2, mm3
94 :    
95 :     movq mm1,mm0
96 :     movq mm3,mm2
97 :    
98 :     punpcklbw mm0,mm7
99 :     punpckhbw mm1,mm7
100 :     punpcklbw mm2,mm7
101 :     punpckhbw mm3,mm7
102 :    
103 :     paddusw mm0,mm1
104 :     paddusw mm6,mm0
105 :     paddusw mm2,mm3
106 :     paddusw mm6,mm2
107 :     %endmacro
108 :    
109 :     align 16
110 :     sad16_mmx:
111 :    
112 :     mov eax, [esp+ 4] ; Src1
113 :     mov edx, [esp+ 8] ; Src2
114 :     mov ecx, [esp+12] ; Stride
115 :    
116 :     pxor mm6, mm6 ; accum
117 :     pxor mm7, mm7 ; zero
118 : Isibaar 1.1
119 : Isibaar 1.5 SAD_16x16_MMX
120 : Isibaar 1.1 SAD_16x16_MMX
121 : Isibaar 1.5 SAD_16x16_MMX
122 :     SAD_16x16_MMX
123 :     SAD_16x16_MMX
124 :     SAD_16x16_MMX
125 :     SAD_16x16_MMX
126 :     SAD_16x16_MMX
127 :    
128 :     .Loop
129 :     SAD_16x16_MMX
130 :     SAD_16x16_MMX
131 :     SAD_16x16_MMX
132 :     SAD_16x16_MMX
133 :     SAD_16x16_MMX
134 :     SAD_16x16_MMX
135 :     SAD_16x16_MMX
136 :     SAD_16x16_MMX
137 :    
138 :     pmaddwd mm6, [mmx_one] ; collapse
139 :     movq mm7, mm6
140 :     psrlq mm7, 32
141 :     paddd mm6, mm7
142 :    
143 :     movd eax, mm6
144 :    
145 :     ret
146 :    
147 :    
148 :     ;===========================================================================
149 :     ;
150 :     ; uint32_t sad8_mmx(const uint8_t * const cur,
151 : Isibaar 1.1 ; const uint8_t * const ref,
152 : Isibaar 1.5 ; const uint32_t stride);
153 : Isibaar 1.1 ;
154 : Isibaar 1.5 ;===========================================================================
155 : Isibaar 1.1
156 :     ;===========================================================================
157 :     ;
158 :     ; uint32_t sad16_xmm(const uint8_t * const cur,
159 :     ; const uint8_t * const ref,
160 :     ; const uint32_t stride,
161 :     ; const uint32_t best_sad);
162 :     ;
163 :     ;===========================================================================
164 :    
165 : Isibaar 1.5 %macro SAD_16x16_SSE 0
166 :     movq mm0, [eax]
167 :     psadbw mm0, [edx]
168 :     movq mm1, [eax+8]
169 :     add eax, ecx
170 :     psadbw mm1, [edx+8]
171 :     paddusw mm5,mm0
172 :     add edx, ecx
173 :     paddusw mm6,mm1
174 :     %endmacro
175 :    
176 : Isibaar 1.1 align 16
177 : Isibaar 1.5 sad16_xmm:
178 : Isibaar 1.1
179 : Isibaar 1.5 mov eax, [esp+ 4] ; Src1
180 :     mov edx, [esp+ 8] ; Src2
181 :     mov ecx, [esp+12] ; Stride
182 :    
183 :     pxor mm5, mm5 ; accum1
184 :     pxor mm6, mm6 ; accum2
185 :     .Loop
186 :     SAD_16x16_SSE
187 :     SAD_16x16_SSE
188 :     SAD_16x16_SSE
189 :     SAD_16x16_SSE
190 :     SAD_16x16_SSE
191 :     SAD_16x16_SSE
192 :     SAD_16x16_SSE
193 :     SAD_16x16_SSE
194 :    
195 :     SAD_16x16_SSE
196 :     SAD_16x16_SSE
197 :     SAD_16x16_SSE
198 :     SAD_16x16_SSE
199 :     SAD_16x16_SSE
200 :     SAD_16x16_SSE
201 :     SAD_16x16_SSE
202 :     SAD_16x16_SSE
203 :    
204 :     paddusw mm6,mm5
205 :     movd eax, mm6
206 :     ret
207 : Isibaar 1.1
208 : Isibaar 1.5 ;===========================================================================
209 :     ;
210 :     ; uint32_t sad16bi_xmm(const uint8_t * const cur,
211 :     ; const uint8_t * const ref1,
212 :     ; const uint8_t * const ref2,
213 :     ; const uint32_t stride);
214 :     ;
215 :     ;===========================================================================
216 : h 1.2
217 : Isibaar 1.5 %macro SADBI_16x16_SSE 0
218 :     movq mm0, [eax]
219 :     movq mm1, [eax+8]
220 : h 1.2
221 : Isibaar 1.5 movq mm2, [edx]
222 :     movq mm3, [edx+8]
223 : h 1.2
224 : Isibaar 1.5 pavgb mm2, [ebx]
225 :     add edx, ecx
226 : h 1.2
227 : Isibaar 1.5 pavgb mm3, [ebx+8]
228 :     add ebx, ecx
229 : h 1.2
230 : Isibaar 1.5 psadbw mm0, mm2
231 :     add eax, ecx
232 : h 1.2
233 : Isibaar 1.5 psadbw mm1, mm3
234 :     paddusw mm5,mm0
235 : h 1.2
236 : Isibaar 1.5 paddusw mm6,mm1
237 :     %endmacro
238 : h 1.2
239 : Isibaar 1.5 align 16
240 :     sad16bi_xmm:
241 :     push ebx
242 :     mov eax, [esp+4+ 4] ; Src
243 :     mov edx, [esp+4+ 8] ; Ref1
244 :     mov ebx, [esp+4+12] ; Ref2
245 :     mov ecx, [esp+4+16] ; Stride
246 :    
247 :     pxor mm5, mm5 ; accum1
248 :     pxor mm6, mm6 ; accum2
249 :     .Loop
250 :     SADBI_16x16_SSE
251 :     SADBI_16x16_SSE
252 :     SADBI_16x16_SSE
253 :     SADBI_16x16_SSE
254 :     SADBI_16x16_SSE
255 :     SADBI_16x16_SSE
256 :     SADBI_16x16_SSE
257 :     SADBI_16x16_SSE
258 :    
259 :     SADBI_16x16_SSE
260 :     SADBI_16x16_SSE
261 :     SADBI_16x16_SSE
262 :     SADBI_16x16_SSE
263 :     SADBI_16x16_SSE
264 :     SADBI_16x16_SSE
265 :     SADBI_16x16_SSE
266 :     SADBI_16x16_SSE
267 :    
268 :     paddusw mm6,mm5
269 :     movd eax, mm6
270 :     pop ebx
271 :     ret
272 : h 1.2 %macro SAD_8x8_MMX 0
273 : Isibaar 1.5 movq mm0, [eax]
274 :     movq mm1, [edx]
275 :    
276 :     movq mm2, [eax+ecx]
277 :     movq mm3, [edx+ecx]
278 :    
279 :     lea eax,[eax+2*ecx]
280 : h 1.2 lea edx,[edx+2*ecx]
281 : Isibaar 1.5
282 :     movq mm4, mm0
283 :     psubusb mm0, mm1
284 :     movq mm5, mm2
285 :     psubusb mm2, mm3
286 :    
287 :     psubusb mm1, mm4
288 :     por mm0, mm1
289 :     psubusb mm3, mm5
290 :     por mm2, mm3
291 :    
292 :     movq mm1,mm0
293 :     movq mm3,mm2
294 :    
295 :     punpcklbw mm0,mm7
296 :     punpckhbw mm1,mm7
297 :     punpcklbw mm2,mm7
298 :     punpckhbw mm3,mm7
299 :    
300 :     paddusw mm0,mm1
301 :     paddusw mm6,mm0
302 :     paddusw mm2,mm3
303 :     paddusw mm6,mm2
304 :     %endmacro
305 :    
306 :     align 16
307 :     sad8_mmx:
308 :    
309 :     mov eax, [esp+ 4] ; Src1
310 :     mov edx, [esp+ 8] ; Src2
311 :     mov ecx, [esp+12] ; Stride
312 :    
313 :     pxor mm6, mm6 ; accum
314 : h 1.2 pxor mm7, mm7 ; zero
315 : Isibaar 1.5
316 :     SAD_8x8_MMX
317 : h 1.2 SAD_8x8_MMX
318 : Isibaar 1.5 SAD_8x8_MMX
319 :     SAD_8x8_MMX
320 :    
321 :     pmaddwd mm6, [mmx_one] ; collapse
322 :     movq mm7, mm6
323 :     psrlq mm7, 32
324 :     paddd mm6, mm7
325 :     .Loop
326 :    
327 :     movd eax, mm6
328 :    
329 :     ret
330 :    
331 :    
332 :    
333 :    
334 :    
335 : h 1.2 ;===========================================================================
336 : Isibaar 1.5 ;
337 : h 1.2 ; uint32_t sad16bi_mmx(const uint8_t * const cur,
338 : Isibaar 1.5 ; const uint8_t * const ref1,
339 : h 1.2 movq mm0, [eax]
340 : Isibaar 1.5 movq mm2, [eax+8]
341 :     lea eax,[eax+ecx]
342 :     ; uint32_t sad8_xmm(const uint8_t * const cur,
343 :     ; const uint8_t * const ref,
344 :     ; const uint32_t stride);
345 :     ;
346 :     ;===========================================================================
347 : h 1.2
348 : Isibaar 1.5 %macro SAD_8x8_SSE 0
349 :     movq mm0, [eax]
350 :     movq mm1, [eax+ecx]
351 :    
352 :     psadbw mm0, [edx]
353 :     psadbw mm1, [edx+ecx]
354 :     add eax, ebx
355 :     add edx, ebx
356 : h 1.2
357 : Isibaar 1.5 paddusw mm5,mm0
358 :     paddusw mm6,mm1
359 :     %endmacro
360 : h 1.2
361 : Isibaar 1.5 align 16
362 :     sad8_xmm:
363 : h 1.2
364 : Isibaar 1.5 mov eax, [esp+ 4] ; Src1
365 :     mov edx, [esp+ 8] ; Src2
366 :     mov ecx, [esp+12] ; Stride
367 :     push ebx
368 :     lea ebx, [ecx+ecx]
369 :    
370 :     pxor mm5, mm5 ; accum1
371 :     pxor mm6, mm6 ; accum2
372 :     .Loop
373 :     SAD_8x8_SSE
374 :     SAD_8x8_SSE
375 :     SAD_8x8_SSE
376 :    
377 :     movq mm0, [eax]
378 :     movq mm1, [eax+ecx]
379 :     psadbw mm0, [edx]
380 :     psadbw mm1, [edx+ecx]
381 :    
382 :     pop ebx
383 : h 1.2
384 : Isibaar 1.5 paddusw mm5,mm0
385 :     paddusw mm6,mm1
386 : h 1.2
387 : Isibaar 1.5 paddusw mm6,mm5
388 :     movd eax, mm6
389 : h 1.2
390 : Isibaar 1.5 ret
391 : h 1.2
392 : Isibaar 1.5 ;===========================================================================
393 :     ;
394 :     movq mm1, mm0
395 :     movq mm3, mm2
396 :     punpcklbw mm0,mm7
397 :     punpcklbw mm2,mm7
398 : h 1.2 punpckhbw mm1,mm7
399 : Isibaar 1.5 punpckhbw mm3,mm7
400 :     paddw mm5, mm0
401 :     paddw mm6, mm1
402 :     paddw mm5, mm2
403 :     paddw mm6, mm3
404 :     %endmacro
405 :    
406 :     %macro ABS_16x16_MMX 0
407 :     movq mm0, [eax]
408 :     movq mm2, [eax+8]
409 :     lea eax,[eax+ecx]
410 :     movq mm1, mm0
411 :     movq mm3, mm2
412 :     punpcklbw mm0, mm7
413 :     punpcklbw mm2, mm7
414 : h 1.2 punpckhbw mm1, mm7
415 : Isibaar 1.5 punpckhbw mm3, mm7
416 :     movq mm4, mm6
417 :     psubusw mm4, mm0
418 :    
419 :     psubusw mm0, mm6
420 :     por mm0, mm4
421 :     movq mm4, mm6
422 :     psubusw mm4, mm1
423 :     psubusw mm1, mm6
424 :     por mm1, mm4
425 :    
426 :     psubusw mm4, mm0
427 :     psubusw mm4, mm2
428 :     psubusw mm0, mm6
429 :     por mm0, mm4
430 :     movq mm4, mm6
431 :     psubusw mm4, mm1
432 :     psubusw mm1, mm6
433 :     por mm1, mm4
434 :    
435 :     paddw mm0, mm1
436 :     psubusw mm4, mm2
437 :     psubusw mm2, mm6
438 :     por mm2, mm4
439 :     movq mm4, mm6
440 :     psubusw mm4, mm3
441 :     psubusw mm3, mm6
442 :     por mm3, mm4
443 : h 1.2
444 : Isibaar 1.5 paddw mm0, mm1
445 :     paddw mm2, mm3
446 :     paddw mm5, mm0
447 :     paddw mm5, mm2
448 :     pxor mm6, mm6 ; accum2
449 : h 1.2
450 : Isibaar 1.5 MEAN_16x16_MMX
451 :     MEAN_16x16_MMX
452 :     MEAN_16x16_MMX
453 :     MEAN_16x16_MMX
454 :     MEAN_16x16_MMX
455 :     MEAN_16x16_MMX
456 :     MEAN_16x16_MMX
457 :     MEAN_16x16_MMX
458 :    
459 :     MEAN_16x16_MMX
460 :     MEAN_16x16_MMX
461 :     MEAN_16x16_MMX
462 :     MEAN_16x16_MMX
463 :     MEAN_16x16_MMX
464 :     MEAN_16x16_MMX
465 :     MEAN_16x16_MMX
466 :     MEAN_16x16_MMX
467 :    
468 :     paddusw mm6, mm5
469 :     pmaddwd mm6, [mmx_one] ; collapse
470 :     movq mm5, mm6
471 :     psrlq mm5, 32
472 :     paddd mm6, mm5
473 :    
474 :     psllq mm6, 32 ; blank upper dword
475 :     psrlq mm6, 32 + 8 ; /= (16*16)
476 :    
477 :     punpckldq mm6, mm6
478 :     packssdw mm6, mm6
479 :    
480 :     ; mm6 contains the mean
481 :     ; mm5 is the new accum
482 :    
483 :     pxor mm5, mm5
484 :     psrlq mm6, 32 + 8 ; /= (16*16)
485 :    
486 :     punpckldq mm6, mm6
487 :     packssdw mm6, mm6
488 :     ABS_16x16_MMX
489 :     ; mm6 contains the mean
490 :     ; mm5 is the new accum
491 :     ABS_16x16_MMX
492 :     ABS_16x16_MMX
493 :     ABS_16x16_MMX
494 :    
495 :     ABS_16x16_MMX
496 :     ABS_16x16_MMX
497 :     ABS_16x16_MMX
498 :     ABS_16x16_MMX
499 :     ABS_16x16_MMX
500 :     ABS_16x16_MMX
501 :     ABS_16x16_MMX
502 :     ABS_16x16_MMX
503 :    
504 :     pmaddwd mm5, [mmx_one] ; collapse
505 :     movq mm6, mm5
506 :     psrlq mm6, 32
507 :     paddd mm6, mm5
508 :    
509 :     movd eax, mm6
510 :     ret
511 :     ret
512 :    
513 :     ;===========================================================================
514 :     ;
515 :     ; uint32_t dev16_xmm(const uint8_t * const cur,
516 :     ; const uint32_t stride);
517 : h 1.2 ;
518 : Isibaar 1.5 ;===========================================================================
519 :    
520 : h 1.2 %macro MEAN_16x16_SSE 0
521 : Isibaar 1.5 movq mm0, [eax]
522 :     movq mm1, [eax+8]
523 :     psadbw mm0, mm7
524 :     psadbw mm1, mm7
525 :     add eax, ecx
526 :     paddw mm5, mm0
527 : h 1.2 paddw mm6, mm1
528 : Isibaar 1.5 %endmacro
529 :    
530 :     %macro ABS_16x16_SSE 0
531 :     movq mm0, [eax]
532 :     movq mm1, [eax+8]
533 :     psadbw mm0, mm4
534 :     psadbw mm1, mm4
535 :     lea eax,[eax+ecx]
536 :     paddw mm5, mm0
537 :     paddw mm6, mm1
538 :     %endmacro
539 :    
540 :     align 16
541 :     dev16_xmm:
542 :    
543 :     mov eax, [esp+ 4] ; Src
544 :     mov ecx, [esp+ 8] ; Stride
545 :    
546 :     pxor mm7, mm7 ; zero
547 : h 1.2 pxor mm5, mm5 ; mean accums
548 : Isibaar 1.5 pxor mm6, mm6
549 :    
550 : h 1.2 MEAN_16x16_SSE
551 : Isibaar 1.5 MEAN_16x16_SSE
552 :     MEAN_16x16_SSE
553 :     MEAN_16x16_SSE
554 :     MEAN_16x16_SSE
555 :     MEAN_16x16_SSE
556 :     MEAN_16x16_SSE
557 :     MEAN_16x16_SSE
558 :    
559 :     MEAN_16x16_SSE
560 :     MEAN_16x16_SSE
561 :     MEAN_16x16_SSE
562 :     MEAN_16x16_SSE
563 :     MEAN_16x16_SSE
564 :     MEAN_16x16_SSE
565 :     MEAN_16x16_SSE
566 :     MEAN_16x16_SSE
567 :    
568 :     paddusw mm6, mm5
569 :    
570 :     movq mm4, mm6
571 :     psllq mm4, 32
572 :     paddd mm4, mm6
573 :     psrld mm4, 8 ; /= (16*16)
574 :    
575 :     packssdw mm4, mm4
576 :     packuswb mm4, mm4
577 :    
578 :     ; mm4 contains the mean
579 :    
580 :     mov eax, [esp+ 4] ; Src
581 :    
582 : h 1.2 pxor mm5, mm5 ; sums
583 : Isibaar 1.5 pxor mm6, mm6
584 :    
585 : h 1.2 ABS_16x16_SSE
586 : Isibaar 1.5 ABS_16x16_SSE
587 : h 1.2 ABS_16x16_SSE
588 : Isibaar 1.5 ABS_16x16_SSE
589 : h 1.2 ABS_16x16_SSE
590 : Isibaar 1.5 ABS_16x16_SSE
591 :     ABS_16x16_SSE
592 : h 1.2 ABS_16x16_SSE
593 : Isibaar 1.5
594 :     ABS_16x16_SSE
595 :     ABS_16x16_SSE
596 :     ABS_16x16_SSE
597 :     ABS_16x16_SSE
598 :     ABS_16x16_SSE
599 :     ABS_16x16_SSE
600 :     ABS_16x16_SSE
601 :     ABS_16x16_SSE
602 :    
603 :     paddusw mm6, mm5
604 :     movq mm7, mm6
605 :     psllq mm7, 32
606 :     paddd mm6, mm7
607 :    
608 :     movd eax, mm6
609 :     ret
610 : Isibaar 1.1
611 : Isibaar 1.5 ;===========================================================================
612 :     ;
613 :     ; uint32_t sad16_sse2(const uint8_t * const cur,
614 :     ; const uint8_t * const ref,
615 : Isibaar 1.1 ; const uint32_t stride,
616 : Isibaar 1.5 ; const uint32_t best_sad);
617 :     ;
618 : Isibaar 1.1 ; experimental - runs faster than xmm on a p4 1.6 / sd133 ram
619 : h 1.3 ;
620 :     ;===========================================================================
621 :    
622 :     align 16
623 :     cglobal sad16_sse2
624 :     sad16_sse2
625 :     push esi
626 :     push edi
627 :     push ebx
628 :    
629 :     mov esi, [esp + 12 + 4] ; cur
630 :     mov edi, [esp + 12 + 8] ; ref
631 :     movdqu xmm0, [edi] ; ref line 0
632 :     mov eax, [esp + 12 + 12] ; stride
633 :    
634 :     movdqu xmm1, [edi+eax] ; ref line 1
635 :     mov ebx, eax
636 :     mov ecx, eax
637 :     shl ebx, 2
638 :     movdqu xmm2, [edi+eax*2] ; ref line 2
639 : h 1.4 add ecx, ebx ; ecx = stride*5
640 : h 1.3 mov edx, ebx
641 :     sub ebx, eax ; ebx = stride*3
642 : h 1.4 movdqu xmm3, [edi+ebx] ; ref line 3
643 : h 1.3 add edx, ebx ; edx = stride*7
644 :    
645 :     pxor xmm7, xmm7 ; xmm7 = sum =0
646 : h 1.4
647 : h 1.3 psadbw xmm0, [esi] ; cur line 0
648 :     psadbw xmm1, [esi+eax] ; cur line 1
649 :     paddusw xmm7, xmm0
650 : h 1.4 psadbw xmm2, [esi+eax*2] ; cur line 2
651 : h 1.3 movdqu xmm0, [edi+eax*4] ; ref line 4
652 :     paddusw xmm7, xmm1
653 :     psadbw xmm3, [esi+ebx] ; cur line 3
654 :     movdqu xmm1, [edi+ecx] ; ref line 5
655 : h 1.4 paddusw xmm7, xmm2
656 :     movdqu xmm2, [edi+ebx*2] ; ref line 6
657 : h 1.3 paddusw xmm7, xmm3
658 : h 1.4
659 :     psadbw xmm0, [esi+eax*4] ; cur line 4
660 : h 1.3 movdqu xmm3, [edi+edx] ; ref line 7
661 : h 1.4 add edi, edx ; add 7 lines to ref
662 :     psadbw xmm1, [esi+ecx] ; cur line 5
663 : h 1.3 paddusw xmm7, xmm0
664 : h 1.4 movdqu xmm0, [edi+eax] ; ref line 8
665 : h 1.3 psadbw xmm2, [esi+ebx*2] ; cur line 6
666 :     paddusw xmm7, xmm1
667 : h 1.4 movdqu xmm1, [edi+eax*2] ; ref line 9
668 :     psadbw xmm3, [esi+edx] ; cur line 7
669 :     paddusw xmm7, xmm2
670 :     movdqu xmm2, [edi+ebx] ; ref line 10
671 : h 1.3 paddusw xmm7, xmm3
672 : h 1.4
673 :     add esi, edx
674 : h 1.3 movdqu xmm3, [edi+eax*4] ; ref line 11
675 : h 1.4 add edi, eax
676 :     add esi, eax ; esi,edi += 8 lines
677 : h 1.3
678 : h 1.4 psadbw xmm0, [esi] ; cur line 8
679 : h 1.3 psadbw xmm1, [esi+eax] ; cur line 9
680 :     paddusw xmm7, xmm0
681 : h 1.4 psadbw xmm2, [esi+eax*2] ; cur line 10
682 :     movdqu xmm0, [edi+eax*4] ; ref line 12
683 : h 1.3 paddusw xmm7, xmm1
684 : h 1.4 psadbw xmm3, [esi+ebx] ; cur line 11
685 : h 1.3 movdqu xmm1, [edi+ecx] ; ref line 13
686 : h 1.4 paddusw xmm7, xmm2
687 :     movdqu xmm2, [edi+ebx*2] ; ref line 14
688 : h 1.3 paddusw xmm7, xmm3
689 : h 1.4
690 :     psadbw xmm0, [esi+eax*4] ; cur line 12
691 : h 1.3 movdqu xmm3, [edi+edx] ; ref line 15
692 : h 1.4 psadbw xmm1, [esi+ecx] ; cur line 13
693 :     paddusw xmm7, xmm0
694 : h 1.3 psadbw xmm2, [esi+ebx*2] ; cur line 14
695 : h 1.4 paddusw xmm7, xmm1
696 : h 1.3 psadbw xmm3, [esi+edx] ; cur line 15
697 :     paddusw xmm7, xmm2
698 : h 1.4 paddusw xmm7, xmm3
699 :    
700 :     movhlps xmm6, xmm7 ; move high 8 xmm7 bytes to low 8 xmm6 bytes
701 : h 1.3 paddusw xmm7, xmm6
702 : h 1.4 movd eax, xmm7 ; return sum
703 : h 1.3
704 : h 1.4 pop ebx
705 : h 1.3 pop edi
706 :     pop esi
707 :    
708 :     ret
709 :    
710 :     ;===========================================================================
711 :     ;
712 :     ; uint32_t dev16_sse2(const uint8_t * const cur,
713 :     ; const uint32_t stride);
714 :     ;
715 :     ; not fully tested!
716 :     ;
717 : h 1.4 ;===========================================================================
718 :    
719 :     align 16
720 :     cglobal dev16_sse2
721 :     dev16_sse2
722 :    
723 :     push esi
724 :     push edi
725 :    
726 :     pxor xmm4, xmm4 ; xmm4 = sum
727 :     pxor xmm7, xmm7 ; xmm7 = 0
728 :    
729 :     mov esi, [esp + 8 + 4] ; cur
730 :     mov ecx, [esp + 8 + 8] ; stride
731 :     mov edi, esi
732 :     mov edx, ecx
733 :     shl edx, 1
734 :     add edx, ecx ; edx = stride*3
735 :    
736 :     movdqa xmm0, [esi]
737 :     movdqa xmm1, [esi+ecx]
738 :     psadbw xmm0, xmm7
739 :     movdqa xmm2, [esi+ecx*2]
740 :     paddw xmm4, xmm0
741 :     psadbw xmm1, xmm7
742 :     movdqa xmm3, [esi+edx]
743 :     paddw xmm4, xmm1
744 :     psadbw xmm2, xmm7
745 :     psadbw xmm3, xmm7
746 :     paddw xmm4, xmm2
747 :     paddw xmm4, xmm3
748 :     add esi, ecx ; esi += stride*4
749 :     add esi, edx
750 :    
751 :     movdqa xmm0, [esi]
752 :     movdqa xmm1, [esi+ecx]
753 :     psadbw xmm0, xmm7
754 :     movdqa xmm2, [esi+ecx*2]
755 :     paddw xmm4, xmm0
756 :     psadbw xmm1, xmm7
757 :     movdqa xmm3, [esi+edx]
758 :     paddw xmm4, xmm1
759 :     psadbw xmm2, xmm7
760 :     psadbw xmm3, xmm7
761 :     paddw xmm4, xmm2
762 :     paddw xmm4, xmm3
763 :     add esi, ecx
764 :     add esi, edx
765 :    
766 :     movdqa xmm0, [esi]
767 :     movdqa xmm1, [esi+ecx]
768 :     psadbw xmm0, xmm7
769 :     movdqa xmm2, [esi+ecx*2]
770 :     paddw xmm4, xmm0
771 :     psadbw xmm1, xmm7
772 :     movdqa xmm3, [esi+edx]
773 :     paddw xmm4, xmm1
774 :     psadbw xmm2, xmm7
775 :     psadbw xmm3, xmm7
776 :     paddw xmm4, xmm2
777 :     paddw xmm4, xmm3
778 :     add esi, ecx
779 :     add esi, edx
780 :    
781 :     movdqa xmm0, [esi]
782 :     movdqa xmm1, [esi+ecx]
783 :     psadbw xmm0, xmm7
784 :     movdqa xmm2, [esi+ecx*2]
785 :     paddw xmm4, xmm0
786 :     psadbw xmm1, xmm7
787 :     movdqa xmm3, [esi+edx]
788 :     paddw xmm4, xmm1
789 :     psadbw xmm2, xmm7
790 :     psadbw xmm3, xmm7
791 :     paddw xmm4, xmm2
792 :     paddw xmm4, xmm3
793 :    
794 :     movhlps xmm5, xmm4
795 :     paddw xmm4, xmm5
796 :     movlhps xmm4, xmm4
797 :     movdqa xmm5, xmm4
798 :     psllq xmm5, 32
799 :     paddd xmm4, xmm5
800 :    
801 :     psrld xmm4, 8
802 :     packssdw xmm4, xmm4
803 :     packuswb xmm4, xmm4
804 :    
805 :     pxor xmm6, xmm6 ; xmm6 = dev = 0
806 :    
807 :     movdqa xmm0, [edi]
808 :     movdqa xmm1, [edi+ecx]
809 :     psadbw xmm0, xmm4
810 :     movdqa xmm2, [edi+ecx*2]
811 :     paddw xmm6, xmm0
812 :     psadbw xmm1, xmm4
813 :     movdqa xmm3, [edi+edx]
814 :     paddw xmm6, xmm1
815 :     psadbw xmm2, xmm4
816 :     psadbw xmm3, xmm4
817 :     paddw xmm6, xmm2
818 :     paddw xmm6, xmm3
819 :     add edi, ecx
820 :     add edi, edx
821 :    
822 :     movdqa xmm0, [edi]
823 :     movdqa xmm1, [edi+ecx]
824 :     psadbw xmm0, xmm4
825 :     movdqa xmm2, [edi+ecx*2]
826 :     paddw xmm6, xmm0
827 :     psadbw xmm1, xmm4
828 :     movdqa xmm3, [edi+edx]
829 :     paddw xmm6, xmm1
830 :     psadbw xmm2, xmm4
831 :     psadbw xmm3, xmm4
832 :     paddw xmm6, xmm2
833 :     paddw xmm6, xmm3
834 :     add edi, ecx
835 :     add edi, edx
836 :    
837 :     movdqa xmm0, [edi]
838 :     movdqa xmm1, [edi+ecx]
839 :     psadbw xmm0, xmm4
840 :     movdqa xmm2, [edi+ecx*2]
841 :     paddw xmm6, xmm0
842 :     psadbw xmm1, xmm4
843 :     movdqa xmm3, [edi+edx]
844 :     paddw xmm6, xmm1
845 :     psadbw xmm2, xmm4
846 :     psadbw xmm3, xmm4
847 :     paddw xmm6, xmm2
848 :     paddw xmm6, xmm3
849 :     add edi, ecx
850 :     add edi, edx
851 :    
852 :     movdqa xmm0, [edi]
853 :     movdqa xmm1, [edi+ecx]
854 :     psadbw xmm0, xmm4
855 :     movdqa xmm2, [edi+ecx*2]
856 :     paddw xmm6, xmm0
857 :     psadbw xmm1, xmm4
858 :     movdqa xmm3, [edi+edx]
859 :     paddw xmm6, xmm1
860 :     psadbw xmm2, xmm4
861 :     psadbw xmm3, xmm4
862 :     paddw xmm6, xmm2
863 :     paddw xmm6, xmm3
864 :    
865 :     movhlps xmm7, xmm6
866 :     paddd xmm6, xmm7
867 :     movd eax, xmm6
868 :    
869 :     pop edi
870 :     pop esi
871 :    
872 :     ret

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