[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.4 - (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 : h 1.4 ; * 24.04.2002 sse2 dev16, faster sse2 sad16
36 : h 1.3 ; * 17.04.2002 sse2 sad16
37 : Isibaar 1.1 ; * 17.11.2001 bugfix and small improvement for dev16_xmm,
38 :     ; * removed terminate early in sad16_xmm
39 :     %define %1 _%1
40 :     %else
41 :     global %1
42 :     %endif
43 :    
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 :     ;
65 :     ;===========================================================================
66 :    
67 :     %macro SAD_16x16_MMX 0
68 :     ; const uint8_t * const ref,
69 :     ; const uint32_t stride,
70 :     ; const uint32_t best_sad);
71 :     movq mm2, [eax+8]
72 :     movq mm3, [edx+8]
73 :    
74 :     movq mm4, mm0
75 :     psubusb mm0, mm1
76 :    
77 :     cglobal sad16_mmx
78 :     sad16_mmx
79 :     push esi
80 :     push edi
81 :    
82 :     mov esi, [esp + 8 + 4] ; ref
83 :     mov edi, [esp + 8 + 8] ; cur
84 :     mov ecx, [esp + 8 + 12] ; stride
85 :     mov edx, 16
86 :    
87 :     pxor mm6, mm6 ; mm6 = sum = 0
88 :     pxor mm7, mm7 ; mm7 = 0
89 :     .loop
90 :     movq mm0, [esi] ; ref
91 :     movq mm1, [edi] ; cur
92 :    
93 :     movq mm2, [esi+8] ; ref2
94 :     movq mm3, [edi+8] ; cur2
95 :    
96 :     movq mm4, mm0
97 :     movq mm5, mm2
98 :    
99 :     psubusb mm0, mm1
100 :     psubusb mm2, mm3
101 :    
102 :     psubusb mm1, mm4
103 :     psubusb mm3, mm5
104 :    
105 :     por mm0, mm1 ; mm0 = |ref - cur|
106 :     por mm2, mm3 ; mm2 = |ref2 - cur2|
107 :    
108 :     movq mm1,mm0
109 :     movq mm3,mm2
110 :    
111 :     punpcklbw mm0,mm7
112 :     punpcklbw mm2,mm7
113 :     SAD_16x16_MMX
114 :     punpckhbw mm1,mm7
115 :     punpckhbw mm3,mm7
116 :     ; const uint8_t * const ref,
117 :     paddusw mm0,mm1
118 :     paddusw mm2,mm3
119 :    
120 :     paddusw mm6,mm0 ; sum += mm01
121 :     paddusw mm6,mm2 ; sum += mm23
122 :    
123 :     add esi, ecx
124 :     add edi, ecx
125 :     dec edx
126 :     jnz .loop
127 :    
128 :     pmaddwd mm6, [mmx_one] ; merge sum
129 :     movq mm7, mm6
130 :     psrlq mm7, 32
131 :     paddd mm6, mm7
132 :     movd eax, mm6
133 :    
134 :     pop edi
135 :     pop esi
136 :    
137 :     ret
138 :     ;
139 :    
140 :     ;===========================================================================
141 :     ;
142 :     ; uint32_t sad16_xmm(const uint8_t * const cur,
143 :     ; const uint8_t * const ref,
144 :     ; const uint32_t stride,
145 :     ; const uint32_t best_sad);
146 :     ;
147 :     ; experimental!
148 :     ;
149 :     ;===========================================================================
150 :    
151 :     align 16
152 :     cglobal sad16_xmm
153 :     sad16_xmm
154 :     push esi
155 :     push edi
156 :     push ebx
157 :    
158 :     mov esi, [esp + 12 + 4] ; ref
159 :     mov edi, [esp + 12 + 8] ; cur
160 :     mov ecx, [esp + 12 + 12] ; stride
161 :     mov ebx, [esp + 12 + 16] ; best_sad
162 : h 1.2 ; mov edx, 16
163 : Isibaar 1.1
164 :     pxor mm6, mm6 ; mm6 = sum = 0
165 : h 1.2 ;.loop
166 : Isibaar 1.1 movq mm0, [esi] ; ref
167 :     movq mm2, [esi+8] ; ref2
168 :    
169 :     psadbw mm0, [edi] ; mm0 = |ref - cur|
170 :     psadbw mm2, [edi+8] ; mm0 = |ref2 - cur2|
171 :    
172 :     paddusw mm6,mm0 ; sum += mm01
173 :     paddusw mm6,mm2 ; sum += mm23
174 :    
175 :     add esi, ecx
176 :     add edi, ecx
177 : h 1.2 ; dec edx
178 :     ; jnz .loop
179 :    
180 :     movq mm0, [esi]
181 :     movq mm2, [esi+8]
182 :    
183 :     psadbw mm0, [edi]
184 :     psadbw mm2, [edi+8]
185 :    
186 :     paddusw mm6,mm0
187 :     paddusw mm6,mm2
188 :    
189 :     add esi, ecx
190 :     add edi, ecx
191 :    
192 :     movq mm0, [esi]
193 :     movq mm2, [esi+8]
194 :    
195 :     psadbw mm0, [edi]
196 :     psadbw mm2, [edi+8]
197 :    
198 :     paddusw mm6,mm0
199 :     paddusw mm6,mm2
200 :    
201 :     add esi, ecx
202 :     add edi, ecx
203 :    
204 :     movq mm0, [esi]
205 :     movq mm2, [esi+8]
206 :    
207 :     psadbw mm0, [edi]
208 :     psadbw mm2, [edi+8]
209 :    
210 :     paddusw mm6,mm0
211 :     paddusw mm6,mm2
212 :     %macro SAD_8x8_MMX 0
213 :     add esi, ecx
214 :     add edi, ecx
215 :     lea edx,[edx+2*ecx]
216 :     movq mm0, [esi]
217 :     movq mm2, [esi+8]
218 :     pxor mm7, mm7 ; zero
219 :     psadbw mm0, [edi]
220 :     psadbw mm2, [edi+8]
221 :    
222 :     paddusw mm6,mm0
223 :     paddusw mm6,mm2
224 :     SAD_8x8_MMX
225 :     add esi, ecx
226 :     add edi, ecx
227 :     ;===========================================================================
228 :     movq mm0, [esi]
229 :     movq mm2, [esi+8]
230 :     ; uint32_t sad16bi_mmx(const uint8_t * const cur,
231 :     psadbw mm0, [edi]
232 :     psadbw mm2, [edi+8]
233 :    
234 :     paddusw mm6,mm0
235 :     paddusw mm6,mm2
236 :     movq mm0, [eax]
237 :     add esi, ecx
238 :     add edi, ecx
239 :    
240 :     movq mm0, [esi]
241 :     movq mm2, [esi+8]
242 :    
243 :     psadbw mm0, [edi]
244 :     psadbw mm2, [edi+8]
245 :    
246 :     paddusw mm6,mm0
247 :     paddusw mm6,mm2
248 :    
249 :     add esi, ecx
250 :     add edi, ecx
251 :    
252 :     movq mm0, [esi]
253 :     movq mm2, [esi+8]
254 :    
255 :     psadbw mm0, [edi]
256 :     psadbw mm2, [edi+8]
257 :    
258 :     paddusw mm6,mm0
259 :     paddusw mm6,mm2
260 :    
261 :     add esi, ecx
262 :     add edi, ecx
263 :    
264 :     movq mm0, [esi]
265 :     movq mm2, [esi+8]
266 :    
267 :     psadbw mm0, [edi]
268 :     psadbw mm2, [edi+8]
269 :    
270 :     paddusw mm6,mm0
271 :     paddusw mm6,mm2
272 :     punpckhbw mm1,mm7
273 :     add esi, ecx
274 :     add edi, ecx
275 :     punpckhbw mm1, mm7
276 :     movq mm0, [esi]
277 :     movq mm2, [esi+8]
278 :    
279 :     psadbw mm0, [edi]
280 :     psadbw mm2, [edi+8]
281 :    
282 :     paddusw mm6,mm0
283 :     paddusw mm6,mm2
284 :    
285 :     add esi, ecx
286 :     add edi, ecx
287 :     ;
288 :     movq mm0, [esi]
289 :     movq mm2, [esi+8]
290 :     %macro MEAN_16x16_SSE 0
291 :     psadbw mm0, [edi]
292 :     psadbw mm2, [edi+8]
293 :    
294 :     paddusw mm6,mm0
295 :     paddusw mm6,mm2
296 :     paddw mm6, mm1
297 :     add esi, ecx
298 :     add edi, ecx
299 :     pxor mm5, mm5 ; mean accums
300 :     movq mm0, [esi]
301 :     movq mm2, [esi+8]
302 :     MEAN_16x16_SSE
303 :     psadbw mm0, [edi]
304 :     psadbw mm2, [edi+8]
305 :    
306 :     paddusw mm6,mm0
307 :     paddusw mm6,mm2
308 :     pxor mm5, mm5 ; sums
309 :     add esi, ecx
310 :     add edi, ecx
311 :     ABS_16x16_SSE
312 :     movq mm0, [esi]
313 :     movq mm2, [esi+8]
314 :     ABS_16x16_SSE
315 :     psadbw mm0, [edi]
316 :     psadbw mm2, [edi+8]
317 :    
318 :     paddusw mm6,mm0
319 :     paddusw mm6,mm2
320 :     ABS_16x16_SSE
321 :     add esi, ecx
322 :     add edi, ecx
323 :     ABS_16x16_SSE
324 :     movq mm0, [esi]
325 :     movq mm2, [esi+8]
326 :    
327 :     psadbw mm0, [edi]
328 :     psadbw mm2, [edi+8]
329 :    
330 :     paddusw mm6,mm0
331 :     paddusw mm6,mm2
332 :    
333 :     add esi, ecx
334 :     add edi, ecx
335 :    
336 :     movq mm0, [esi]
337 :     movq mm2, [esi+8]
338 :    
339 :     psadbw mm0, [edi]
340 :     psadbw mm2, [edi+8]
341 :    
342 :     paddusw mm6,mm0
343 :     paddusw mm6,mm2
344 :    
345 :     add esi, ecx
346 :     add edi, ecx
347 :    
348 :     movq mm0, [esi]
349 :     movq mm2, [esi+8]
350 :    
351 :     psadbw mm0, [edi]
352 :     psadbw mm2, [edi+8]
353 :    
354 :     paddusw mm6,mm0
355 :     paddusw mm6,mm2
356 : Isibaar 1.1
357 :     movd eax, mm6
358 :    
359 :     .ret pop ebx
360 :     pop edi
361 :     pop esi
362 :    
363 :     ret
364 :    
365 :     ; const uint32_t stride,
366 :     ; experimental - runs faster than xmm on a p4 1.6 / sd133 ram
367 : h 1.3 ;
368 :     ;===========================================================================
369 :    
370 :     align 16
371 :     cglobal sad16_sse2
372 :     sad16_sse2
373 :     push esi
374 :     push edi
375 :     push ebx
376 :    
377 :     mov esi, [esp + 12 + 4] ; cur
378 :     mov edi, [esp + 12 + 8] ; ref
379 :     movdqu xmm0, [edi] ; ref line 0
380 :     mov eax, [esp + 12 + 12] ; stride
381 :    
382 :     movdqu xmm1, [edi+eax] ; ref line 1
383 :     mov ebx, eax
384 :     mov ecx, eax
385 :     shl ebx, 2
386 :     movdqu xmm2, [edi+eax*2] ; ref line 2
387 : h 1.4 add ecx, ebx ; ecx = stride*5
388 : h 1.3 mov edx, ebx
389 :     sub ebx, eax ; ebx = stride*3
390 : h 1.4 movdqu xmm3, [edi+ebx] ; ref line 3
391 : h 1.3 add edx, ebx ; edx = stride*7
392 :    
393 :     pxor xmm7, xmm7 ; xmm7 = sum =0
394 : h 1.4
395 : h 1.3 psadbw xmm0, [esi] ; cur line 0
396 :     psadbw xmm1, [esi+eax] ; cur line 1
397 :     paddusw xmm7, xmm0
398 : h 1.4 psadbw xmm2, [esi+eax*2] ; cur line 2
399 : h 1.3 movdqu xmm0, [edi+eax*4] ; ref line 4
400 :     paddusw xmm7, xmm1
401 :     psadbw xmm3, [esi+ebx] ; cur line 3
402 :     movdqu xmm1, [edi+ecx] ; ref line 5
403 : h 1.4 paddusw xmm7, xmm2
404 :     movdqu xmm2, [edi+ebx*2] ; ref line 6
405 : h 1.3 paddusw xmm7, xmm3
406 : h 1.4
407 :     psadbw xmm0, [esi+eax*4] ; cur line 4
408 : h 1.3 movdqu xmm3, [edi+edx] ; ref line 7
409 : h 1.4 add edi, edx ; add 7 lines to ref
410 :     psadbw xmm1, [esi+ecx] ; cur line 5
411 : h 1.3 paddusw xmm7, xmm0
412 : h 1.4 movdqu xmm0, [edi+eax] ; ref line 8
413 : h 1.3 psadbw xmm2, [esi+ebx*2] ; cur line 6
414 :     paddusw xmm7, xmm1
415 : h 1.4 movdqu xmm1, [edi+eax*2] ; ref line 9
416 :     psadbw xmm3, [esi+edx] ; cur line 7
417 :     paddusw xmm7, xmm2
418 :     movdqu xmm2, [edi+ebx] ; ref line 10
419 : h 1.3 paddusw xmm7, xmm3
420 : h 1.4
421 :     add esi, edx
422 : h 1.3 movdqu xmm3, [edi+eax*4] ; ref line 11
423 : h 1.4 add edi, eax
424 :     add esi, eax ; esi,edi += 8 lines
425 : h 1.3
426 : h 1.4 psadbw xmm0, [esi] ; cur line 8
427 : h 1.3 psadbw xmm1, [esi+eax] ; cur line 9
428 :     paddusw xmm7, xmm0
429 : h 1.4 psadbw xmm2, [esi+eax*2] ; cur line 10
430 :     movdqu xmm0, [edi+eax*4] ; ref line 12
431 : h 1.3 paddusw xmm7, xmm1
432 : h 1.4 psadbw xmm3, [esi+ebx] ; cur line 11
433 : h 1.3 movdqu xmm1, [edi+ecx] ; ref line 13
434 : h 1.4 paddusw xmm7, xmm2
435 :     movdqu xmm2, [edi+ebx*2] ; ref line 14
436 : h 1.3 paddusw xmm7, xmm3
437 : h 1.4
438 :     psadbw xmm0, [esi+eax*4] ; cur line 12
439 : h 1.3 movdqu xmm3, [edi+edx] ; ref line 15
440 : h 1.4 psadbw xmm1, [esi+ecx] ; cur line 13
441 :     paddusw xmm7, xmm0
442 : h 1.3 psadbw xmm2, [esi+ebx*2] ; cur line 14
443 : h 1.4 paddusw xmm7, xmm1
444 : h 1.3 psadbw xmm3, [esi+edx] ; cur line 15
445 :     paddusw xmm7, xmm2
446 : h 1.4 paddusw xmm7, xmm3
447 :    
448 :     movhlps xmm6, xmm7 ; move high 8 xmm7 bytes to low 8 xmm6 bytes
449 : h 1.3 paddusw xmm7, xmm6
450 : h 1.4 movd eax, xmm7 ; return sum
451 : h 1.3
452 : h 1.4 pop ebx
453 : h 1.3 pop edi
454 :     pop esi
455 :    
456 :     ret
457 :    
458 :     ;===========================================================================
459 :     ;
460 :     ; uint32_t dev16_sse2(const uint8_t * const cur,
461 :     ; const uint32_t stride);
462 :     ;
463 :     ; not fully tested!
464 :     ;
465 :    
466 :    
467 :    
468 : Isibaar 1.1 ;===========================================================================
469 :     ;
470 :     ; uint32_t sad8_mmx(const uint8_t * const cur,
471 :     ; const uint8_t * const ref,
472 :     ; const uint32_t stride);
473 :     ;
474 :     ;===========================================================================
475 :     align 16
476 :     cglobal sad8_mmx
477 :     sad8_mmx
478 :     push esi
479 :     push edi
480 :    
481 :     mov esi, [esp + 8 + 4] ; ref
482 :     mov edi, [esp + 8 + 8] ; cur
483 :     mov ecx, [esp + 8 + 12] ; stride
484 :     mov eax, 4
485 :    
486 :     pxor mm6, mm6 ; mm6 = sum = 0
487 :     pxor mm7, mm7 ; mm7 = 0
488 :     .loop
489 :     movq mm0, [esi] ; ref
490 :     movq mm1, [edi] ; cur
491 :    
492 :     movq mm2, [esi+ecx] ; ref2
493 :     movq mm3, [edi+ecx] ; cur2
494 :    
495 :     movq mm4, mm0
496 :     movq mm5, mm2
497 :    
498 :     psubusb mm0, mm1
499 :     psubusb mm2, mm3
500 :    
501 :     psubusb mm1, mm4
502 :     psubusb mm3, mm5
503 :    
504 :     por mm0, mm1 ; mm0 = |ref - cur|
505 :     por mm2, mm3 ; mm2 = |ref2 - cur2|
506 :    
507 :     movq mm1,mm0
508 :     movq mm3,mm2
509 :    
510 :     punpcklbw mm0,mm7
511 :     punpcklbw mm2,mm7
512 :    
513 :     punpckhbw mm1,mm7
514 :     punpckhbw mm3,mm7
515 :    
516 :     paddusw mm0,mm1
517 :     paddusw mm2,mm3
518 :    
519 :     paddusw mm6,mm0 ; sum += mm01
520 :     paddusw mm6,mm2 ; sum += mm23
521 :    
522 :     add esi, ecx
523 :     add edi, ecx
524 :     add esi, ecx
525 :     add edi, ecx
526 :     dec eax
527 :     jnz .loop
528 :    
529 :     pmaddwd mm6, [mmx_one] ; merge sum
530 :     movq mm7, mm6
531 :     psrlq mm7, 32
532 :     paddd mm6, mm7
533 :     movd eax, mm6
534 :    
535 :     pop edi
536 :     pop esi
537 :    
538 :     ret
539 :    
540 :    
541 :    
542 :    
543 :     ;===========================================================================
544 :     ;
545 :     ; uint32_t sad8_xmm(const uint8_t * const cur,
546 :     ; const uint8_t * const ref,
547 :     ; const uint32_t stride);
548 :     ;
549 :     ; experimental!
550 :     ;
551 :     ;===========================================================================
552 :     align 16
553 :     cglobal sad8_xmm
554 :     sad8_xmm
555 :     push esi
556 :     push edi
557 :    
558 :     mov esi, [esp + 8 + 4] ; ref
559 :     mov edi, [esp + 8 + 8] ; cur
560 :     mov ecx, [esp + 8 + 12] ; stride
561 :     mov edx, ecx
562 :     shl edx, 1
563 :    
564 : h 1.2 ; mov eax, 4
565 : Isibaar 1.1
566 :     pxor mm6, mm6 ; mm6 = sum = 0
567 : h 1.2 ;.loop
568 : Isibaar 1.1 movq mm0, [esi] ; ref
569 :     movq mm2, [esi+ecx] ; ref2
570 :    
571 :     psadbw mm0, [edi] ; mm0 = |ref - cur|
572 :     psadbw mm2, [edi+ecx] ; mm0 = |ref2 - cur2|
573 :    
574 :     paddusw mm6,mm0 ; sum += mm01
575 :     paddusw mm6,mm2 ; sum += mm23
576 :    
577 :     add esi, edx
578 :     add edi, edx
579 : h 1.2 ; dec eax
580 :     ; jnz .loop
581 :    
582 :     movq mm0, [esi]
583 :     movq mm2, [esi+ecx]
584 :    
585 :     psadbw mm0, [edi]
586 :     psadbw mm2, [edi+ecx]
587 :    
588 :     paddusw mm6,mm0
589 :     paddusw mm6,mm2
590 :    
591 :     add esi, edx
592 :     add edi, edx
593 :    
594 :     movq mm0, [esi]
595 :     movq mm2, [esi+ecx]
596 :    
597 :     psadbw mm0, [edi]
598 :     psadbw mm2, [edi+ecx]
599 :    
600 :     paddusw mm6,mm0
601 :     paddusw mm6,mm2
602 :    
603 :     add esi, edx
604 :     add edi, edx
605 :    
606 :     movq mm0, [esi]
607 :     movq mm2, [esi+ecx]
608 :    
609 :     psadbw mm0, [edi]
610 :     psadbw mm2, [edi+ecx]
611 :    
612 :     paddusw mm6,mm0
613 :     paddusw mm6,mm2
614 : Isibaar 1.1
615 :     movd eax, mm6
616 :    
617 :     pop edi
618 :     pop esi
619 :    
620 :     ret
621 :    
622 :    
623 :    
624 :     ;===========================================================================
625 :     ;
626 :     ; uint32_t dev16_mmx(const uint8_t * const cur,
627 :     ; const uint32_t stride);
628 :     ;
629 :     ;===========================================================================
630 :    
631 :     align 16
632 :     cglobal dev16_mmx
633 :     dev16_mmx
634 :    
635 :     push esi
636 :     push edi
637 :    
638 :     pxor mm4, mm4 ; mm23 = sum = 0
639 :     pxor mm5, mm5
640 :    
641 :     mov esi, [esp + 8 + 4] ; cur
642 :     mov ecx, [esp + 8 + 8] ; stride
643 :     mov edi, esi
644 :    
645 :     mov eax, 16
646 :     pxor mm7, mm7 ; mm7 = 0
647 :     .loop1
648 :     movq mm0, [esi]
649 :     movq mm2, [esi + 8]
650 :    
651 :     movq mm1, mm0
652 :     movq mm3, mm2
653 :    
654 :     punpcklbw mm0, mm7
655 :     punpcklbw mm2, mm7
656 :    
657 :     punpckhbw mm1, mm7
658 :     punpckhbw mm3, mm7
659 :    
660 :     paddw mm0, mm1
661 :     paddw mm2, mm3
662 :    
663 :     paddw mm4, mm0
664 :     paddw mm5, mm2
665 :    
666 :     add esi, ecx
667 :     dec eax
668 :     jnz .loop1
669 :    
670 :     paddusw mm4, mm5
671 :     pmaddwd mm4, [mmx_one] ; merge sum
672 :     movq mm5, mm4
673 :     psrlq mm5, 32
674 :     paddd mm4, mm5
675 :    
676 :     psllq mm4, 32 ; blank upper dword
677 :     psrlq mm4, 32 + 8 ; mm4 /= (16*16)
678 :    
679 :     punpckldq mm4, mm4
680 :     packssdw mm4, mm4 ; mm4 = mean
681 :    
682 :     pxor mm6, mm6 ; mm6 = dev = 0
683 :     mov eax, 16
684 :     .loop2
685 :     movq mm0, [edi]
686 :     movq mm2, [edi + 8]
687 :    
688 :     movq mm1, mm0
689 :     movq mm3, mm2
690 :    
691 :     punpcklbw mm0, mm7
692 :     punpcklbw mm2, mm7
693 :    
694 :     punpckhbw mm1, mm7 ; mm01 = cur
695 :     punpckhbw mm3, mm7 ; mm23 = cur2
696 :    
697 :     movq mm5, mm4 ;
698 :     psubusw mm5, mm0 ;
699 :     psubusw mm0, mm4 ;
700 :     por mm0, mm5 ;
701 :     movq mm5, mm4 ;
702 :     psubusw mm5, mm1 ;
703 :     psubusw mm1, mm4 ;
704 :     por mm1, mm5 ; mm01 = |mm01 - mm4|
705 :    
706 :    
707 :     movq mm5, mm4 ;
708 :     psubusw mm5, mm2 ;
709 :     psubusw mm2, mm4 ;
710 :     por mm2, mm5 ;
711 :    
712 :     movq mm5, mm4 ;
713 :     psubusw mm5, mm3 ;
714 :     psubusw mm3, mm4 ;
715 :     por mm3, mm5 ; mm23 = |mm23 - mm4|
716 :    
717 :     paddw mm0, mm1
718 :     paddw mm2, mm3
719 :    
720 :     paddw mm6, mm0
721 :     paddw mm6, mm2 ; dev += mm01 + mm23
722 :    
723 :     add edi, ecx
724 :     dec eax
725 :     jnz .loop2
726 :    
727 :     pmaddwd mm6, [mmx_one] ; merge dev
728 :     movq mm7, mm6
729 :     psrlq mm7, 32
730 :     paddd mm6, mm7
731 :     movd eax, mm6
732 :    
733 :     pop edi
734 :     pop esi
735 :    
736 :     ret
737 :    
738 :    
739 :    
740 :     ;===========================================================================
741 :     ;
742 :     ; uint32_t dev16_xmm(const uint8_t * const cur,
743 :     ; const uint32_t stride);
744 :     ;
745 :     ; experimental!
746 :     ;
747 :     ;===========================================================================
748 :    
749 :     align 16
750 :     cglobal dev16_xmm
751 :     dev16_xmm
752 :    
753 :     push esi
754 :     push edi
755 :    
756 :     pxor mm4, mm4 ; mm23 = sum = 0
757 :    
758 :     mov esi, [esp + 8 + 4] ; cur
759 :     mov ecx, [esp + 8 + 8] ; stride
760 :     mov edi, esi
761 :    
762 : h 1.2 ; mov eax, 16
763 : Isibaar 1.1 pxor mm7, mm7 ; mm7 = 0
764 : h 1.2 ;.loop1
765 : Isibaar 1.1 movq mm0, [esi]
766 :     movq mm2, [esi + 8]
767 :    
768 :     psadbw mm0, mm7 ; abs(cur0 - 0) + abs(cur1 - 0) + ... + abs(cur7 - 0) -> mm0
769 :     psadbw mm2, mm7 ; abs(cur8 - 0) + abs(cur9 - 0) + ... + abs(cur15 - 0) -> mm2
770 :    
771 :     paddw mm4,mm0 ; mean += mm0
772 :     paddw mm4,mm2 ; mean += mm2
773 :    
774 :     add esi, ecx
775 : h 1.2 ; dec eax
776 :     ; jnz .loop1
777 :    
778 :     movq mm0, [esi]
779 :     movq mm2, [esi + 8]
780 :    
781 :     psadbw mm0, mm7
782 :     psadbw mm2, mm7
783 :    
784 :     paddw mm4,mm0
785 :     paddw mm4,mm2
786 :    
787 :     add esi, ecx
788 :    
789 :     movq mm0, [esi]
790 :     movq mm2, [esi + 8]
791 :    
792 :     psadbw mm0, mm7
793 :     psadbw mm2, mm7
794 :    
795 :     paddw mm4,mm0
796 :     paddw mm4,mm2
797 :    
798 :     add esi, ecx
799 :    
800 :     movq mm0, [esi]
801 :     movq mm2, [esi + 8]
802 :    
803 :     psadbw mm0, mm7
804 :     psadbw mm2, mm7
805 :    
806 :     paddw mm4,mm0
807 :     paddw mm4,mm2
808 :    
809 :     add esi, ecx
810 :    
811 :     movq mm0, [esi]
812 :     movq mm2, [esi + 8]
813 :    
814 :     psadbw mm0, mm7
815 :     psadbw mm2, mm7
816 :    
817 :     paddw mm4,mm0
818 :     paddw mm4,mm2
819 :    
820 :     add esi, ecx
821 :    
822 :     movq mm0, [esi]
823 :     movq mm2, [esi + 8]
824 :    
825 :     psadbw mm0, mm7
826 :     psadbw mm2, mm7
827 :    
828 :     paddw mm4,mm0
829 :     paddw mm4,mm2
830 :    
831 :     add esi, ecx
832 :    
833 :     movq mm0, [esi]
834 :     movq mm2, [esi + 8]
835 :    
836 :     psadbw mm0, mm7
837 :     psadbw mm2, mm7
838 :    
839 :     paddw mm4,mm0
840 :     paddw mm4,mm2
841 :    
842 :     add esi, ecx
843 :    
844 :     movq mm0, [esi]
845 :     movq mm2, [esi + 8]
846 :    
847 :     psadbw mm0, mm7
848 :     psadbw mm2, mm7
849 :    
850 :     paddw mm4,mm0
851 :     paddw mm4,mm2
852 :    
853 :     add esi, ecx
854 :    
855 :     movq mm0, [esi]
856 :     movq mm2, [esi + 8]
857 :    
858 :     psadbw mm0, mm7
859 :     psadbw mm2, mm7
860 :    
861 :     paddw mm4,mm0
862 :     paddw mm4,mm2
863 :    
864 :     add esi, ecx
865 :    
866 :     movq mm0, [esi]
867 :     movq mm2, [esi + 8]
868 :    
869 :     psadbw mm0, mm7
870 :     psadbw mm2, mm7
871 :    
872 :     paddw mm4,mm0
873 :     paddw mm4,mm2
874 :    
875 :     add esi, ecx
876 :    
877 :     movq mm0, [esi]
878 :     movq mm2, [esi + 8]
879 :    
880 :     psadbw mm0, mm7
881 :     psadbw mm2, mm7
882 :    
883 :     paddw mm4,mm0
884 :     paddw mm4,mm2
885 :    
886 :     add esi, ecx
887 :    
888 :     movq mm0, [esi]
889 :     movq mm2, [esi + 8]
890 :    
891 :     psadbw mm0, mm7
892 :     psadbw mm2, mm7
893 :    
894 :     paddw mm4,mm0
895 :     paddw mm4,mm2
896 :    
897 :     add esi, ecx
898 :    
899 :     movq mm0, [esi]
900 :     movq mm2, [esi + 8]
901 :    
902 :     psadbw mm0, mm7
903 :     psadbw mm2, mm7
904 :    
905 :     paddw mm4,mm0
906 :     paddw mm4,mm2
907 :    
908 :     add esi, ecx
909 :    
910 :     movq mm0, [esi]
911 :     movq mm2, [esi + 8]
912 :    
913 :     psadbw mm0, mm7
914 :     psadbw mm2, mm7
915 :    
916 :     paddw mm4,mm0
917 :     paddw mm4,mm2
918 :    
919 :     add esi, ecx
920 :    
921 :     movq mm0, [esi]
922 :     movq mm2, [esi + 8]
923 :    
924 :     psadbw mm0, mm7
925 :     psadbw mm2, mm7
926 :    
927 :     paddw mm4,mm0
928 :     paddw mm4,mm2
929 :    
930 :     add esi, ecx
931 :    
932 :     movq mm0, [esi]
933 :     movq mm2, [esi + 8]
934 :    
935 :     psadbw mm0, mm7
936 :     psadbw mm2, mm7
937 :    
938 :     paddw mm4,mm0
939 :     paddw mm4,mm2
940 : Isibaar 1.1
941 :     movq mm5, mm4
942 :     psllq mm5, 32
943 :     paddd mm4, mm5
944 :    
945 :     psrld mm4, 8
946 :     packssdw mm4, mm4
947 :     packuswb mm4, mm4
948 :    
949 :     pxor mm6, mm6 ; mm6 = dev = 0
950 : h 1.2 ; mov eax, 16
951 :     ;.loop2
952 : Isibaar 1.1 movq mm0, [edi]
953 :     movq mm2, [edi + 8]
954 :    
955 :     psadbw mm0, mm4 ; mm0 = |cur - mean|
956 :     psadbw mm2, mm4 ; mm0 = |cur2 - mean|
957 :    
958 :     paddw mm6,mm0 ; dev += mm01
959 :     paddw mm6,mm2 ; dev += mm23
960 :    
961 :     add edi, ecx
962 : h 1.2 ; dec eax
963 :     ; jnz .loop2
964 :    
965 :     movq mm0, [edi]
966 :     movq mm2, [edi + 8]
967 :    
968 :     psadbw mm0, mm4
969 :     psadbw mm2, mm4
970 :    
971 :     paddw mm6,mm0
972 :     paddw mm6,mm2
973 :    
974 :     add edi, ecx
975 :    
976 :     movq mm0, [edi]
977 :     movq mm2, [edi + 8]
978 :    
979 :     psadbw mm0, mm4
980 :     psadbw mm2, mm4
981 :    
982 :     paddw mm6,mm0
983 :     paddw mm6,mm2
984 :    
985 :     add edi, ecx
986 :    
987 :     movq mm0, [edi]
988 :     movq mm2, [edi + 8]
989 :    
990 :     psadbw mm0, mm4
991 :     psadbw mm2, mm4
992 :    
993 :     paddw mm6,mm0
994 :     paddw mm6,mm2
995 :    
996 :     add edi, ecx
997 :    
998 :     movq mm0, [edi]
999 :     movq mm2, [edi + 8]
1000 :    
1001 :     psadbw mm0, mm4
1002 :     psadbw mm2, mm4
1003 :    
1004 :     paddw mm6,mm0
1005 :     paddw mm6,mm2
1006 :    
1007 :     add edi, ecx
1008 :    
1009 :     movq mm0, [edi]
1010 :     movq mm2, [edi + 8]
1011 :    
1012 :     psadbw mm0, mm4
1013 :     psadbw mm2, mm4
1014 :    
1015 :     paddw mm6,mm0
1016 :     paddw mm6,mm2
1017 :    
1018 :     add edi, ecx
1019 :    
1020 :     movq mm0, [edi]
1021 :     movq mm2, [edi + 8]
1022 :    
1023 :     psadbw mm0, mm4
1024 :     psadbw mm2, mm4
1025 :    
1026 :     paddw mm6,mm0
1027 :     paddw mm6,mm2
1028 :    
1029 :     add edi, ecx
1030 :    
1031 :     movq mm0, [edi]
1032 :     movq mm2, [edi + 8]
1033 :    
1034 :     psadbw mm0, mm4
1035 :     psadbw mm2, mm4
1036 :    
1037 :     paddw mm6,mm0
1038 :     paddw mm6,mm2
1039 :    
1040 :     add edi, ecx
1041 :    
1042 :     movq mm0, [edi]
1043 :     movq mm2, [edi + 8]
1044 :    
1045 :     psadbw mm0, mm4
1046 :     psadbw mm2, mm4
1047 :    
1048 :     paddw mm6,mm0
1049 :     paddw mm6,mm2
1050 :    
1051 :     add edi, ecx
1052 :    
1053 :     movq mm0, [edi]
1054 :     movq mm2, [edi + 8]
1055 :    
1056 :     psadbw mm0, mm4
1057 :     psadbw mm2, mm4
1058 :    
1059 :     paddw mm6,mm0
1060 :     paddw mm6,mm2
1061 :    
1062 :     add edi, ecx
1063 :    
1064 :     movq mm0, [edi]
1065 :     movq mm2, [edi + 8]
1066 :    
1067 :     psadbw mm0, mm4
1068 :     psadbw mm2, mm4
1069 :    
1070 :     paddw mm6,mm0
1071 :     paddw mm6,mm2
1072 :    
1073 :     add edi, ecx
1074 :    
1075 :     movq mm0, [edi]
1076 :     movq mm2, [edi + 8]
1077 :    
1078 :     psadbw mm0, mm4
1079 :     psadbw mm2, mm4
1080 :    
1081 :     paddw mm6,mm0
1082 :     paddw mm6,mm2
1083 :    
1084 :     add edi, ecx
1085 :    
1086 :     movq mm0, [edi]
1087 :     movq mm2, [edi + 8]
1088 :    
1089 :     psadbw mm0, mm4
1090 :     psadbw mm2, mm4
1091 :    
1092 :     paddw mm6,mm0
1093 :     paddw mm6,mm2
1094 :    
1095 :     add edi, ecx
1096 :    
1097 :     movq mm0, [edi]
1098 :     movq mm2, [edi + 8]
1099 :    
1100 :     psadbw mm0, mm4
1101 :     psadbw mm2, mm4
1102 :    
1103 :     paddw mm6,mm0
1104 :     paddw mm6,mm2
1105 :    
1106 :     add edi, ecx
1107 :    
1108 :     movq mm0, [edi]
1109 :     movq mm2, [edi + 8]
1110 :    
1111 :     psadbw mm0, mm4
1112 :     psadbw mm2, mm4
1113 :    
1114 :     paddw mm6,mm0
1115 :     paddw mm6,mm2
1116 :    
1117 :     add edi, ecx
1118 :    
1119 :     movq mm0, [edi]
1120 :     movq mm2, [edi + 8]
1121 :    
1122 :     psadbw mm0, mm4
1123 :     psadbw mm2, mm4
1124 :    
1125 :     paddw mm6,mm0
1126 :     paddw mm6,mm2
1127 : Isibaar 1.1
1128 : h 1.4 movq mm7, mm6
1129 :     psllq mm7, 32
1130 :     paddd mm6, mm7
1131 :     movd eax, mm6
1132 :    
1133 :     pop edi
1134 :     pop esi
1135 :    
1136 :     ret
1137 :    
1138 :    
1139 :     ;===========================================================================
1140 :    
1141 :     align 16
1142 :     cglobal dev16_sse2
1143 :     dev16_sse2
1144 :    
1145 :     push esi
1146 :     push edi
1147 :    
1148 :     pxor xmm4, xmm4 ; xmm4 = sum
1149 :     pxor xmm7, xmm7 ; xmm7 = 0
1150 :    
1151 :     mov esi, [esp + 8 + 4] ; cur
1152 :     mov ecx, [esp + 8 + 8] ; stride
1153 :     mov edi, esi
1154 :     mov edx, ecx
1155 :     shl edx, 1
1156 :     add edx, ecx ; edx = stride*3
1157 :    
1158 :     movdqa xmm0, [esi]
1159 :     movdqa xmm1, [esi+ecx]
1160 :     psadbw xmm0, xmm7
1161 :     movdqa xmm2, [esi+ecx*2]
1162 :     paddw xmm4, xmm0
1163 :     psadbw xmm1, xmm7
1164 :     movdqa xmm3, [esi+edx]
1165 :     paddw xmm4, xmm1
1166 :     psadbw xmm2, xmm7
1167 :     psadbw xmm3, xmm7
1168 :     paddw xmm4, xmm2
1169 :     paddw xmm4, xmm3
1170 :     add esi, ecx ; esi += stride*4
1171 :     add esi, edx
1172 :    
1173 :     movdqa xmm0, [esi]
1174 :     movdqa xmm1, [esi+ecx]
1175 :     psadbw xmm0, xmm7
1176 :     movdqa xmm2, [esi+ecx*2]
1177 :     paddw xmm4, xmm0
1178 :     psadbw xmm1, xmm7
1179 :     movdqa xmm3, [esi+edx]
1180 :     paddw xmm4, xmm1
1181 :     psadbw xmm2, xmm7
1182 :     psadbw xmm3, xmm7
1183 :     paddw xmm4, xmm2
1184 :     paddw xmm4, xmm3
1185 :     add esi, ecx
1186 :     add esi, edx
1187 :    
1188 :     movdqa xmm0, [esi]
1189 :     movdqa xmm1, [esi+ecx]
1190 :     psadbw xmm0, xmm7
1191 :     movdqa xmm2, [esi+ecx*2]
1192 :     paddw xmm4, xmm0
1193 :     psadbw xmm1, xmm7
1194 :     movdqa xmm3, [esi+edx]
1195 :     paddw xmm4, xmm1
1196 :     psadbw xmm2, xmm7
1197 :     psadbw xmm3, xmm7
1198 :     paddw xmm4, xmm2
1199 :     paddw xmm4, xmm3
1200 :     add esi, ecx
1201 :     add esi, edx
1202 :    
1203 :     movdqa xmm0, [esi]
1204 :     movdqa xmm1, [esi+ecx]
1205 :     psadbw xmm0, xmm7
1206 :     movdqa xmm2, [esi+ecx*2]
1207 :     paddw xmm4, xmm0
1208 :     psadbw xmm1, xmm7
1209 :     movdqa xmm3, [esi+edx]
1210 :     paddw xmm4, xmm1
1211 :     psadbw xmm2, xmm7
1212 :     psadbw xmm3, xmm7
1213 :     paddw xmm4, xmm2
1214 :     paddw xmm4, xmm3
1215 :    
1216 :     movhlps xmm5, xmm4
1217 :     paddw xmm4, xmm5
1218 :     movlhps xmm4, xmm4
1219 :     movdqa xmm5, xmm4
1220 :     psllq xmm5, 32
1221 :     paddd xmm4, xmm5
1222 :    
1223 :     psrld xmm4, 8
1224 :     packssdw xmm4, xmm4
1225 :     packuswb xmm4, xmm4
1226 :    
1227 :     pxor xmm6, xmm6 ; xmm6 = dev = 0
1228 :    
1229 :     movdqa xmm0, [edi]
1230 :     movdqa xmm1, [edi+ecx]
1231 :     psadbw xmm0, xmm4
1232 :     movdqa xmm2, [edi+ecx*2]
1233 :     paddw xmm6, xmm0
1234 :     psadbw xmm1, xmm4
1235 :     movdqa xmm3, [edi+edx]
1236 :     paddw xmm6, xmm1
1237 :     psadbw xmm2, xmm4
1238 :     psadbw xmm3, xmm4
1239 :     paddw xmm6, xmm2
1240 :     paddw xmm6, xmm3
1241 :     add edi, ecx
1242 :     add edi, edx
1243 :    
1244 :     movdqa xmm0, [edi]
1245 :     movdqa xmm1, [edi+ecx]
1246 :     psadbw xmm0, xmm4
1247 :     movdqa xmm2, [edi+ecx*2]
1248 :     paddw xmm6, xmm0
1249 :     psadbw xmm1, xmm4
1250 :     movdqa xmm3, [edi+edx]
1251 :     paddw xmm6, xmm1
1252 :     psadbw xmm2, xmm4
1253 :     psadbw xmm3, xmm4
1254 :     paddw xmm6, xmm2
1255 :     paddw xmm6, xmm3
1256 :     add edi, ecx
1257 :     add edi, edx
1258 :    
1259 :     movdqa xmm0, [edi]
1260 :     movdqa xmm1, [edi+ecx]
1261 :     psadbw xmm0, xmm4
1262 :     movdqa xmm2, [edi+ecx*2]
1263 :     paddw xmm6, xmm0
1264 :     psadbw xmm1, xmm4
1265 :     movdqa xmm3, [edi+edx]
1266 :     paddw xmm6, xmm1
1267 :     psadbw xmm2, xmm4
1268 :     psadbw xmm3, xmm4
1269 :     paddw xmm6, xmm2
1270 :     paddw xmm6, xmm3
1271 :     add edi, ecx
1272 :     add edi, edx
1273 :    
1274 :     movdqa xmm0, [edi]
1275 :     movdqa xmm1, [edi+ecx]
1276 :     psadbw xmm0, xmm4
1277 :     movdqa xmm2, [edi+ecx*2]
1278 :     paddw xmm6, xmm0
1279 :     psadbw xmm1, xmm4
1280 :     movdqa xmm3, [edi+edx]
1281 :     paddw xmm6, xmm1
1282 :     psadbw xmm2, xmm4
1283 :     psadbw xmm3, xmm4
1284 :     paddw xmm6, xmm2
1285 :     paddw xmm6, xmm3
1286 :    
1287 :     movhlps xmm7, xmm6
1288 :     paddd xmm6, xmm7
1289 :     movd eax, xmm6
1290 :    
1291 :     pop edi
1292 :     pop esi
1293 :    
1294 :     ret

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