[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 1535 - (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 1535 ; * $Id: sad_mmx.asm,v 1.15 2004-08-22 11:46:10 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 1535 %ifdef MARK_FUNCS
32 :     global _%1:function
33 :     %define %1 _%1:function
34 :     %else
35 :     global _%1
36 :     %define %1 _%1
37 :     %endif
38 : Isibaar 262 %else
39 : edgomez 1535 %ifdef MARK_FUNCS
40 :     global %1:function
41 :     %else
42 :     global %1
43 :     %endif
44 : Isibaar 262 %endif
45 :     %endmacro
46 :    
47 : edgomez 1382 ;=============================================================================
48 :     ; Read only data
49 :     ;=============================================================================
50 : Isibaar 262
51 : edgomez 1382 %ifdef FORMAT_COFF
52 : edgomez 1519 SECTION .rodata
53 : edgomez 1382 %else
54 : edgomez 1519 SECTION .rodata align=16
55 : edgomez 1382 %endif
56 : Isibaar 262
57 : edgomez 1382 ALIGN 16
58 :     mmx_one:
59 :     times 4 dw 1
60 : Isibaar 262
61 : edgomez 1382 ;=============================================================================
62 :     ; Helper macros
63 :     ;=============================================================================
64 : Isibaar 262
65 :     %macro SAD_16x16_MMX 0
66 : edgomez 1382 movq mm0, [eax]
67 :     movq mm1, [edx]
68 : Isibaar 262
69 : edgomez 1382 movq mm2, [eax+8]
70 :     movq mm3, [edx+8]
71 : Isibaar 262
72 : edgomez 1382 movq mm4, mm0
73 :     psubusb mm0, mm1
74 :     lea eax, [eax+ecx]
75 :     movq mm5, mm2
76 :     psubusb mm2, mm3
77 :     lea edx, [edx+ecx]
78 : Isibaar 262
79 : edgomez 1382 psubusb mm1, mm4
80 :     por mm0, mm1
81 :     psubusb mm3, mm5
82 :     por mm2, mm3
83 : Isibaar 262
84 : edgomez 1382 movq mm1, mm0
85 :     movq mm3, mm2
86 : Isibaar 262
87 : edgomez 1382 punpcklbw mm0,mm7
88 :     punpckhbw mm1,mm7
89 :     punpcklbw mm2,mm7
90 :     punpckhbw mm3,mm7
91 : Isibaar 262
92 : edgomez 1382 paddusw mm0, mm1
93 :     paddusw mm6, mm0
94 :     paddusw mm2, mm3
95 :     paddusw mm6, mm2
96 : Isibaar 262 %endmacro
97 :    
98 : edgomez 1382 %macro SAD_8x8_MMX 0
99 :     movq mm0, [eax]
100 :     movq mm1, [edx]
101 : Isibaar 262
102 : edgomez 1382 movq mm2, [eax+ecx]
103 :     movq mm3, [edx+ecx]
104 : Isibaar 262
105 : edgomez 1382 lea eax,[eax+2*ecx]
106 :     lea edx,[edx+2*ecx]
107 : Isibaar 262
108 : edgomez 1382 movq mm4, mm0
109 :     psubusb mm0, mm1
110 :     movq mm5, mm2
111 :     psubusb mm2, mm3
112 : Isibaar 262
113 : edgomez 1382 psubusb mm1, mm4
114 :     por mm0, mm1
115 :     psubusb mm3, mm5
116 :     por mm2, mm3
117 : Isibaar 262
118 : edgomez 1382 movq mm1,mm0
119 :     movq mm3,mm2
120 : Isibaar 262
121 : edgomez 1382 punpcklbw mm0,mm7
122 :     punpckhbw mm1,mm7
123 :     punpcklbw mm2,mm7
124 :     punpckhbw mm3,mm7
125 : Isibaar 262
126 : edgomez 1382 paddusw mm0,mm1
127 :     paddusw mm6,mm0
128 :     paddusw mm2,mm3
129 :     paddusw mm6,mm2
130 :     %endmacro
131 : Isibaar 262
132 : edgomez 1382 %macro SADV_16x16_MMX 0
133 :     movq mm0, [eax]
134 :     movq mm1, [edx]
135 : Isibaar 262
136 : edgomez 1382 movq mm2, [eax+8]
137 :     movq mm3, [edx+8]
138 : Isibaar 262
139 : edgomez 1382 movq mm4, mm0
140 :     psubusb mm0, mm1
141 : Isibaar 262
142 : edgomez 1382 psubusb mm1, mm4
143 :     por mm0, mm1
144 :     lea eax,[eax+ecx]
145 : Isibaar 262
146 : edgomez 1382 movq mm4, mm2
147 :     psubusb mm2, mm3
148 : Isibaar 262
149 : edgomez 1382 psubusb mm3, mm4
150 :     por mm2, mm3
151 :     lea edx,[edx+ecx]
152 : Isibaar 262
153 : edgomez 1382 movq mm1,mm0
154 :     movq mm3,mm2
155 : Isibaar 262
156 : edgomez 1382 punpcklbw mm0,mm7
157 :     punpckhbw mm1,mm7
158 :     punpcklbw mm2,mm7
159 :     punpckhbw mm3,mm7
160 : Isibaar 262
161 : edgomez 1382 paddusw mm0,mm1
162 :     paddusw mm2,mm3
163 :    
164 :     paddusw mm5, mm0
165 :     paddusw mm6, mm2
166 : Isibaar 262 %endmacro
167 :    
168 : edgomez 1382 %macro SADBI_16x16_MMX 2 ; SADBI_16x16_MMX( int_ptr_offset, bool_increment_ptr );
169 : Isibaar 262
170 : edgomez 1382 movq mm0, [edx+%1]
171 :     movq mm2, [ebx+%1]
172 :     movq mm1, mm0
173 :     movq mm3, mm2
174 : Isibaar 262
175 : edgomez 1382 %if %2 != 0
176 :     add edx, ecx
177 :     %endif
178 : Isibaar 262
179 : edgomez 1382 punpcklbw mm0, mm7
180 :     punpckhbw mm1, mm7
181 :     punpcklbw mm2, mm7
182 :     punpckhbw mm3, mm7
183 : Isibaar 262
184 : edgomez 1382 %if %2 != 0
185 :     add ebx, ecx
186 :     %endif
187 : Isibaar 262
188 : edgomez 1382 paddusw mm0, mm2 ; mm01 = ref1 + ref2
189 :     paddusw mm1, mm3
190 :     paddusw mm0, [mmx_one] ; mm01 += 1
191 :     paddusw mm1, [mmx_one]
192 :     psrlw mm0, 1 ; mm01 >>= 1
193 :     psrlw mm1, 1
194 : Isibaar 262
195 : edgomez 1382 movq mm2, [eax+%1]
196 :     movq mm3, mm2
197 :     punpcklbw mm2, mm7 ; mm23 = src
198 :     punpckhbw mm3, mm7
199 : Isibaar 262
200 : edgomez 1382 %if %2 != 0
201 :     add eax, ecx
202 :     %endif
203 : Isibaar 262
204 : edgomez 1382 movq mm4, mm0
205 :     movq mm5, mm1
206 :     psubusw mm0, mm2
207 :     psubusw mm1, mm3
208 :     psubusw mm2, mm4
209 :     psubusw mm3, mm5
210 :     por mm0, mm2 ; mm01 = ABS(mm01 - mm23)
211 :     por mm1, mm3
212 : Isibaar 262
213 : edgomez 1382 paddusw mm6, mm0 ; mm6 += mm01
214 :     paddusw mm6, mm1
215 : Isibaar 262
216 : edgomez 1382 %endmacro
217 : edgomez 851
218 : edgomez 1382 %macro MEAN_16x16_MMX 0
219 :     movq mm0, [eax]
220 :     movq mm2, [eax+8]
221 :     lea eax, [eax+ecx]
222 :     movq mm1, mm0
223 :     movq mm3, mm2
224 :     punpcklbw mm0, mm7
225 :     punpcklbw mm2, mm7
226 :     punpckhbw mm1, mm7
227 :     punpckhbw mm3, mm7
228 :     paddw mm5, mm0
229 :     paddw mm6, mm1
230 :     paddw mm5, mm2
231 :     paddw mm6, mm3
232 :     %endmacro
233 : edgomez 851
234 : edgomez 1382 %macro ABS_16x16_MMX 0
235 :     movq mm0, [eax]
236 :     movq mm2, [eax+8]
237 :     lea eax, [eax+ecx]
238 :     movq mm1, mm0
239 :     movq mm3, mm2
240 :     punpcklbw mm0, mm7
241 :     punpcklbw mm2, mm7
242 :     punpckhbw mm1, mm7
243 :     punpckhbw mm3, mm7
244 :     movq mm4, mm6
245 :     psubusw mm4, mm0
246 : edgomez 851
247 : edgomez 1382 psubusw mm0, mm6
248 :     por mm0, mm4
249 :     movq mm4, mm6
250 :     psubusw mm4, mm1
251 :     psubusw mm1, mm6
252 :     por mm1, mm4
253 : edgomez 851
254 : edgomez 1382 movq mm4, mm6
255 :     psubusw mm4, mm2
256 :     psubusw mm2, mm6
257 :     por mm2, mm4
258 :     movq mm4, mm6
259 :     psubusw mm4, mm3
260 :     psubusw mm3, mm6
261 :     por mm3, mm4
262 : edgomez 851
263 : edgomez 1382 paddw mm0, mm1
264 :     paddw mm2, mm3
265 :     paddw mm5, mm0
266 :     paddw mm5, mm2
267 :     %endmacro
268 : edgomez 851
269 : edgomez 1382 ;=============================================================================
270 :     ; Code
271 :     ;=============================================================================
272 : edgomez 851
273 : edgomez 1382 SECTION .text
274 : edgomez 851
275 : edgomez 1382 cglobal sad16_mmx
276 :     cglobal sad16v_mmx
277 :     cglobal sad8_mmx
278 :     cglobal sad16bi_mmx
279 :     cglobal sad8bi_mmx
280 :     cglobal dev16_mmx
281 :     cglobal sse8_16bit_mmx
282 : edgomez 1424 cglobal sse8_8bit_mmx
283 : edgomez 1382
284 :     ;-----------------------------------------------------------------------------
285 :     ;
286 :     ; uint32_t sad16_mmx(const uint8_t * const cur,
287 :     ; const uint8_t * const ref,
288 :     ; const uint32_t stride,
289 :     ; const uint32_t best_sad);
290 :     ;
291 :     ; (early termination ignore; slows this down)
292 :     ;
293 :     ;-----------------------------------------------------------------------------
294 : edgomez 851
295 : edgomez 1382 ALIGN 16
296 :     sad16_mmx:
297 : edgomez 851
298 : edgomez 1382 mov eax, [esp+ 4] ; Src1
299 :     mov edx, [esp+ 8] ; Src2
300 :     mov ecx, [esp+12] ; Stride
301 : edgomez 851
302 : edgomez 1382 pxor mm6, mm6 ; accum
303 :     pxor mm7, mm7 ; zero
304 : edgomez 851
305 : edgomez 1382 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 :     SAD_16x16_MMX
313 : edgomez 851
314 : edgomez 1382 SAD_16x16_MMX
315 :     SAD_16x16_MMX
316 :     SAD_16x16_MMX
317 :     SAD_16x16_MMX
318 :     SAD_16x16_MMX
319 :     SAD_16x16_MMX
320 :     SAD_16x16_MMX
321 :     SAD_16x16_MMX
322 : edgomez 851
323 : edgomez 1382 pmaddwd mm6, [mmx_one] ; collapse
324 :     movq mm7, mm6
325 :     psrlq mm7, 32
326 :     paddd mm6, mm7
327 : edgomez 851
328 : edgomez 1382 movd eax, mm6
329 : edgomez 851
330 : edgomez 1382 ret
331 : edgomez 851
332 : edgomez 1382 ;-----------------------------------------------------------------------------
333 :     ;
334 :     ; uint32_t sad8_mmx(const uint8_t * const cur,
335 :     ; const uint8_t * const ref,
336 :     ; const uint32_t stride);
337 :     ;
338 :     ;-----------------------------------------------------------------------------
339 : edgomez 851
340 : edgomez 1382 ALIGN 16
341 :     sad8_mmx:
342 : edgomez 851
343 : edgomez 1382 mov eax, [esp+ 4] ; Src1
344 :     mov edx, [esp+ 8] ; Src2
345 :     mov ecx, [esp+12] ; Stride
346 : edgomez 851
347 : edgomez 1382 pxor mm6, mm6 ; accum
348 :     pxor mm7, mm7 ; zero
349 : edgomez 851
350 : edgomez 1382 SAD_8x8_MMX
351 :     SAD_8x8_MMX
352 :     SAD_8x8_MMX
353 :     SAD_8x8_MMX
354 : edgomez 851
355 : edgomez 1382 pmaddwd mm6, [mmx_one] ; collapse
356 :     movq mm7, mm6
357 :     psrlq mm7, 32
358 :     paddd mm6, mm7
359 : edgomez 851
360 : edgomez 1382 movd eax, mm6
361 : edgomez 851
362 : edgomez 1382 ret
363 : edgomez 851
364 : edgomez 1382 ;-----------------------------------------------------------------------------
365 :     ;
366 :     ; uint32_t sad16v_mmx(const uint8_t * const cur,
367 :     ; const uint8_t * const ref,
368 :     ; const uint32_t stride,
369 :     ; int32_t *sad);
370 :     ;
371 :     ;-----------------------------------------------------------------------------
372 : edgomez 851
373 : edgomez 1382 ALIGN 16
374 :     sad16v_mmx:
375 : edgomez 851
376 : edgomez 1382 push ebx
377 :     push edi
378 : edgomez 851
379 : edgomez 1382 mov eax, [esp + 8 + 4] ; Src1
380 :     mov edx, [esp + 8 + 8] ; Src2
381 :     mov ecx, [esp + 8 + 12] ; Stride
382 :     mov ebx, [esp + 8 + 16] ; sad ptr
383 : edgomez 851
384 : edgomez 1382 pxor mm5, mm5 ; accum
385 :     pxor mm6, mm6 ; accum
386 :     pxor mm7, mm7 ; zero
387 : suxen_drol 329
388 : edgomez 1382 SADV_16x16_MMX
389 :     SADV_16x16_MMX
390 :     SADV_16x16_MMX
391 :     SADV_16x16_MMX
392 :     SADV_16x16_MMX
393 :     SADV_16x16_MMX
394 :     SADV_16x16_MMX
395 :     SADV_16x16_MMX
396 : suxen_drol 329
397 : edgomez 1382 pmaddwd mm5, [mmx_one] ; collapse
398 :     pmaddwd mm6, [mmx_one] ; collapse
399 : suxen_drol 329
400 : edgomez 1382 movq mm2, mm5
401 :     movq mm3, mm6
402 : suxen_drol 329
403 : edgomez 1382 psrlq mm2, 32
404 :     psrlq mm3, 32
405 : suxen_drol 329
406 : edgomez 1382 paddd mm5, mm2
407 :     paddd mm6, mm3
408 : suxen_drol 329
409 : edgomez 1382 movd [ebx], mm5
410 :     movd [ebx + 4], mm6
411 : suxen_drol 329
412 : edgomez 1382 paddd mm5, mm6
413 : suxen_drol 329
414 : edgomez 1382 movd edi, mm5
415 : suxen_drol 329
416 : edgomez 1382 pxor mm5, mm5
417 :     pxor mm6, mm6
418 : suxen_drol 329
419 : edgomez 1382 SADV_16x16_MMX
420 :     SADV_16x16_MMX
421 :     SADV_16x16_MMX
422 :     SADV_16x16_MMX
423 :     SADV_16x16_MMX
424 :     SADV_16x16_MMX
425 :     SADV_16x16_MMX
426 :     SADV_16x16_MMX
427 : suxen_drol 329
428 : edgomez 1382 pmaddwd mm5, [mmx_one] ; collapse
429 :     pmaddwd mm6, [mmx_one] ; collapse
430 : suxen_drol 329
431 : edgomez 1382 movq mm2, mm5
432 :     movq mm3, mm6
433 : suxen_drol 329
434 : edgomez 1382 psrlq mm2, 32
435 :     psrlq mm3, 32
436 : suxen_drol 329
437 : edgomez 1382 paddd mm5, mm2
438 :     paddd mm6, mm3
439 : suxen_drol 329
440 : edgomez 1382 movd [ebx + 8], mm5
441 :     movd [ebx + 12], mm6
442 : suxen_drol 329
443 : edgomez 1382 paddd mm5, mm6
444 : suxen_drol 329
445 : edgomez 1382 movd eax, mm5
446 : suxen_drol 329
447 : edgomez 1382 add eax, edi
448 : suxen_drol 329
449 : edgomez 1382 pop edi
450 :     pop ebx
451 : suxen_drol 329
452 : edgomez 1382 ret
453 : suxen_drol 329
454 : edgomez 1382 ;-----------------------------------------------------------------------------
455 :     ;
456 :     ; uint32_t sad16bi_mmx(const uint8_t * const cur,
457 :     ; const uint8_t * const ref1,
458 :     ; const uint8_t * const ref2,
459 :     ; const uint32_t stride);
460 :     ;
461 :     ;-----------------------------------------------------------------------------
462 : suxen_drol 329
463 : edgomez 1382 ALIGN 16
464 :     sad16bi_mmx:
465 :     push ebx
466 :     mov eax, [esp+4+ 4] ; Src
467 :     mov edx, [esp+4+ 8] ; Ref1
468 :     mov ebx, [esp+4+12] ; Ref2
469 :     mov ecx, [esp+4+16] ; Stride
470 : suxen_drol 329
471 : edgomez 1382 pxor mm6, mm6 ; accum2
472 :     pxor mm7, mm7
473 :     .Loop
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 :     SADBI_16x16_MMX 0, 0
481 :     SADBI_16x16_MMX 8, 1
482 :     SADBI_16x16_MMX 0, 0
483 :     SADBI_16x16_MMX 8, 1
484 :     SADBI_16x16_MMX 0, 0
485 :     SADBI_16x16_MMX 8, 1
486 :     SADBI_16x16_MMX 0, 0
487 :     SADBI_16x16_MMX 8, 1
488 :     SADBI_16x16_MMX 0, 0
489 :     SADBI_16x16_MMX 8, 1
490 :    
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 :     SADBI_16x16_MMX 0, 0
498 :     SADBI_16x16_MMX 8, 1
499 :     SADBI_16x16_MMX 0, 0
500 :     SADBI_16x16_MMX 8, 1
501 :     SADBI_16x16_MMX 0, 0
502 :     SADBI_16x16_MMX 8, 1
503 :     SADBI_16x16_MMX 0, 0
504 :     SADBI_16x16_MMX 8, 1
505 :     SADBI_16x16_MMX 0, 0
506 :     SADBI_16x16_MMX 8, 1
507 :    
508 :     pmaddwd mm6, [mmx_one] ; collapse
509 :     movq mm7, mm6
510 :     psrlq mm7, 32
511 :     paddd mm6, mm7
512 :    
513 :     movd eax, mm6
514 :     pop ebx
515 :    
516 :     ret
517 :    
518 :     ;-----------------------------------------------------------------------------
519 : suxen_drol 329 ;
520 : edgomez 1382 ; uint32_t sad8bi_mmx(const uint8_t * const cur,
521 :     ; const uint8_t * const ref1,
522 :     ; const uint8_t * const ref2,
523 :     ; const uint32_t stride);
524 : suxen_drol 329 ;
525 : edgomez 1382 ;-----------------------------------------------------------------------------
526 : suxen_drol 329
527 : edgomez 1382 ALIGN 16
528 :     sad8bi_mmx:
529 :     push ebx
530 :     mov eax, [esp+4+ 4] ; Src
531 :     mov edx, [esp+4+ 8] ; Ref1
532 :     mov ebx, [esp+4+12] ; Ref2
533 :     mov ecx, [esp+4+16] ; Stride
534 : Isibaar 262
535 : edgomez 1382 pxor mm6, mm6 ; accum2
536 :     pxor mm7, mm7
537 :     .Loop
538 :     SADBI_16x16_MMX 0, 1
539 :     SADBI_16x16_MMX 0, 1
540 :     SADBI_16x16_MMX 0, 1
541 :     SADBI_16x16_MMX 0, 1
542 :     SADBI_16x16_MMX 0, 1
543 :     SADBI_16x16_MMX 0, 1
544 :     SADBI_16x16_MMX 0, 1
545 :     SADBI_16x16_MMX 0, 1
546 : Isibaar 262
547 : edgomez 1382 pmaddwd mm6, [mmx_one] ; collapse
548 :     movq mm7, mm6
549 :     psrlq mm7, 32
550 :     paddd mm6, mm7
551 : Isibaar 262
552 : edgomez 1382 movd eax, mm6
553 :     pop ebx
554 :     ret
555 : Isibaar 262
556 : edgomez 1382 ;-----------------------------------------------------------------------------
557 :     ;
558 :     ; uint32_t dev16_mmx(const uint8_t * const cur,
559 :     ; const uint32_t stride);
560 :     ;
561 :     ;-----------------------------------------------------------------------------
562 :    
563 :     ALIGN 16
564 : Isibaar 262 dev16_mmx:
565 : edgomez 1382 mov eax, [esp+ 4] ; Src
566 :     mov ecx, [esp+ 8] ; Stride
567 : Isibaar 262
568 : edgomez 1382 pxor mm7, mm7 ; zero
569 :     pxor mm5, mm5 ; accum1
570 :     pxor mm6, mm6 ; accum2
571 : Isibaar 262
572 : edgomez 1382 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 :     MEAN_16x16_MMX
580 : Isibaar 262
581 : edgomez 1382 MEAN_16x16_MMX
582 :     MEAN_16x16_MMX
583 :     MEAN_16x16_MMX
584 :     MEAN_16x16_MMX
585 :     MEAN_16x16_MMX
586 :     MEAN_16x16_MMX
587 :     MEAN_16x16_MMX
588 :     MEAN_16x16_MMX
589 : Isibaar 262
590 : edgomez 1382 paddusw mm6, mm5
591 :     pmaddwd mm6, [mmx_one] ; collapse
592 :     movq mm5, mm6
593 :     psrlq mm5, 32
594 :     paddd mm6, mm5
595 : Isibaar 262
596 : edgomez 1382 psllq mm6, 32 ; blank upper dword
597 :     psrlq mm6, 32 + 8 ; /= (16*16)
598 : Isibaar 262
599 : edgomez 1382 punpckldq mm6, mm6
600 :     packssdw mm6, mm6
601 :    
602 : Isibaar 262 ; mm6 contains the mean
603 :     ; mm5 is the new accum
604 :    
605 : edgomez 1382 pxor mm5, mm5
606 :     mov eax, [esp+ 4] ; Src
607 : Isibaar 262
608 : edgomez 1382 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 :     ABS_16x16_MMX
616 : Isibaar 262
617 : edgomez 1382 ABS_16x16_MMX
618 :     ABS_16x16_MMX
619 :     ABS_16x16_MMX
620 :     ABS_16x16_MMX
621 :     ABS_16x16_MMX
622 :     ABS_16x16_MMX
623 :     ABS_16x16_MMX
624 :     ABS_16x16_MMX
625 : Isibaar 262
626 : edgomez 1382 pmaddwd mm5, [mmx_one] ; collapse
627 :     movq mm6, mm5
628 :     psrlq mm6, 32
629 :     paddd mm6, mm5
630 : Isibaar 262
631 : edgomez 1382 movd eax, mm6
632 :    
633 :     ret
634 :    
635 :     ;-----------------------------------------------------------------------------
636 :     ;
637 :     ; uint32_t sse8_16bit_mmx(const int16_t *b1,
638 :     ; const int16_t *b2,
639 :     ; const uint32_t stride);
640 :     ;
641 :     ;-----------------------------------------------------------------------------
642 :    
643 : edgomez 1424 %macro ROW_SSE_16bit_MMX 2
644 : edgomez 1382 movq mm0, [%1]
645 :     movq mm1, [%1+8]
646 :     psubw mm0, [%2]
647 :     psubw mm1, [%2+8]
648 :     pmaddwd mm0, mm0
649 :     pmaddwd mm1, mm1
650 :     paddd mm2, mm0
651 :     paddd mm2, mm1
652 : edgomez 1424 %endmacro
653 : edgomez 1382
654 :     sse8_16bit_mmx:
655 :     push esi
656 :     push edi
657 :    
658 :     ;; Load the function params
659 :     mov esi, [esp+8+4]
660 :     mov edi, [esp+8+8]
661 :     mov edx, [esp+8+12]
662 :    
663 :     ;; Reset the sse accumulator
664 :     pxor mm2, mm2
665 :    
666 :     ;; Let's go
667 : edgomez 1424 %rep 8
668 :     ROW_SSE_16bit_MMX esi, edi
669 : edgomez 1382 lea esi, [esi+edx]
670 :     lea edi, [edi+edx]
671 : edgomez 1424 %endrep
672 : edgomez 1382
673 :     ;; Finish adding each dword of the accumulator
674 :     movq mm3, mm2
675 :     psrlq mm2, 32
676 :     paddd mm2, mm3
677 :     movd eax, mm2
678 :    
679 :     ;; All done
680 :     pop edi
681 :     pop esi
682 :     ret
683 : edgomez 1424
684 :     ;-----------------------------------------------------------------------------
685 :     ;
686 :     ; uint32_t sse8_8bit_mmx(const int8_t *b1,
687 :     ; const int8_t *b2,
688 :     ; const uint32_t stride);
689 :     ;
690 :     ;-----------------------------------------------------------------------------
691 :    
692 :     %macro ROW_SSE_8bit_MMX 2
693 :     movq mm0, [%1] ; load a row
694 :     movq mm2, [%2] ; load a row
695 :    
696 :     movq mm1, mm0 ; copy row
697 :     movq mm3, mm2 ; copy row
698 :    
699 :     punpcklbw mm0, mm7 ; turn the 4low elements into 16bit
700 :     punpckhbw mm1, mm7 ; turn the 4high elements into 16bit
701 :    
702 :     punpcklbw mm2, mm7 ; turn the 4low elements into 16bit
703 :     punpckhbw mm3, mm7 ; turn the 4high elements into 16bit
704 :    
705 :     psubw mm0, mm2 ; low part of src-dst
706 :     psubw mm1, mm3 ; high part of src-dst
707 :    
708 :     pmaddwd mm0, mm0 ; compute the square sum
709 :     pmaddwd mm1, mm1 ; compute the square sum
710 :    
711 :     paddd mm6, mm0 ; add to the accumulator
712 :     paddd mm6, mm1 ; add to the accumulator
713 :     %endmacro
714 :    
715 :     sse8_8bit_mmx:
716 :     push esi
717 :     push edi
718 :    
719 :     ;; Load the function params
720 :     mov esi, [esp+8+4]
721 :     mov edi, [esp+8+8]
722 :     mov edx, [esp+8+12]
723 :    
724 :     ;; Reset the sse accumulator
725 :     pxor mm6, mm6
726 :    
727 :     ;; Used to interleave 8bit data with 0x00 values
728 :     pxor mm7, mm7
729 :    
730 :     ;; Let's go
731 :     %rep 8
732 :     ROW_SSE_8bit_MMX esi, edi
733 :     lea esi, [esi+edx]
734 :     lea edi, [edi+edx]
735 :     %endrep
736 :    
737 :     ;; Finish adding each dword of the accumulator
738 :     movq mm7, mm6
739 :     psrlq mm6, 32
740 :     paddd mm6, mm7
741 :     movd eax, mm6
742 :    
743 :     ;; All done
744 :     pop edi
745 :     pop esi
746 :     ret

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