[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 1382 - (view) (download)

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

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