[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 1540 - (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 1540 ; * $Id: sad_mmx.asm,v 1.16 2004-08-29 10:02:38 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 : edgomez 1540 global _%1:function %1.endfunc-%1
33 :     %define %1 _%1:function %1.endfunc-%1
34 : edgomez 1535 %else
35 :     global _%1
36 :     %define %1 _%1
37 :     %endif
38 : Isibaar 262 %else
39 : edgomez 1535 %ifdef MARK_FUNCS
40 : edgomez 1540 global %1:function %1.endfunc-%1
41 : edgomez 1535 %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 1540 .endfunc
332 : edgomez 851
333 : edgomez 1382 ;-----------------------------------------------------------------------------
334 :     ;
335 :     ; uint32_t sad8_mmx(const uint8_t * const cur,
336 :     ; const uint8_t * const ref,
337 :     ; const uint32_t stride);
338 :     ;
339 :     ;-----------------------------------------------------------------------------
340 : edgomez 851
341 : edgomez 1382 ALIGN 16
342 :     sad8_mmx:
343 : edgomez 851
344 : edgomez 1382 mov eax, [esp+ 4] ; Src1
345 :     mov edx, [esp+ 8] ; Src2
346 :     mov ecx, [esp+12] ; Stride
347 : edgomez 851
348 : edgomez 1382 pxor mm6, mm6 ; accum
349 :     pxor mm7, mm7 ; zero
350 : edgomez 851
351 : edgomez 1382 SAD_8x8_MMX
352 :     SAD_8x8_MMX
353 :     SAD_8x8_MMX
354 :     SAD_8x8_MMX
355 : edgomez 851
356 : edgomez 1382 pmaddwd mm6, [mmx_one] ; collapse
357 :     movq mm7, mm6
358 :     psrlq mm7, 32
359 :     paddd mm6, mm7
360 : edgomez 851
361 : edgomez 1382 movd eax, mm6
362 : edgomez 851
363 : edgomez 1382 ret
364 : edgomez 1540 .endfunc
365 : edgomez 851
366 : edgomez 1382 ;-----------------------------------------------------------------------------
367 :     ;
368 :     ; uint32_t sad16v_mmx(const uint8_t * const cur,
369 :     ; const uint8_t * const ref,
370 :     ; const uint32_t stride,
371 :     ; int32_t *sad);
372 :     ;
373 :     ;-----------------------------------------------------------------------------
374 : edgomez 851
375 : edgomez 1382 ALIGN 16
376 :     sad16v_mmx:
377 : edgomez 851
378 : edgomez 1382 push ebx
379 :     push edi
380 : edgomez 851
381 : edgomez 1382 mov eax, [esp + 8 + 4] ; Src1
382 :     mov edx, [esp + 8 + 8] ; Src2
383 :     mov ecx, [esp + 8 + 12] ; Stride
384 :     mov ebx, [esp + 8 + 16] ; sad ptr
385 : edgomez 851
386 : edgomez 1382 pxor mm5, mm5 ; accum
387 :     pxor mm6, mm6 ; accum
388 :     pxor mm7, mm7 ; zero
389 : suxen_drol 329
390 : edgomez 1382 SADV_16x16_MMX
391 :     SADV_16x16_MMX
392 :     SADV_16x16_MMX
393 :     SADV_16x16_MMX
394 :     SADV_16x16_MMX
395 :     SADV_16x16_MMX
396 :     SADV_16x16_MMX
397 :     SADV_16x16_MMX
398 : suxen_drol 329
399 : edgomez 1382 pmaddwd mm5, [mmx_one] ; collapse
400 :     pmaddwd mm6, [mmx_one] ; collapse
401 : suxen_drol 329
402 : edgomez 1382 movq mm2, mm5
403 :     movq mm3, mm6
404 : suxen_drol 329
405 : edgomez 1382 psrlq mm2, 32
406 :     psrlq mm3, 32
407 : suxen_drol 329
408 : edgomez 1382 paddd mm5, mm2
409 :     paddd mm6, mm3
410 : suxen_drol 329
411 : edgomez 1382 movd [ebx], mm5
412 :     movd [ebx + 4], mm6
413 : suxen_drol 329
414 : edgomez 1382 paddd mm5, mm6
415 : suxen_drol 329
416 : edgomez 1382 movd edi, mm5
417 : suxen_drol 329
418 : edgomez 1382 pxor mm5, mm5
419 :     pxor mm6, mm6
420 : suxen_drol 329
421 : edgomez 1382 SADV_16x16_MMX
422 :     SADV_16x16_MMX
423 :     SADV_16x16_MMX
424 :     SADV_16x16_MMX
425 :     SADV_16x16_MMX
426 :     SADV_16x16_MMX
427 :     SADV_16x16_MMX
428 :     SADV_16x16_MMX
429 : suxen_drol 329
430 : edgomez 1382 pmaddwd mm5, [mmx_one] ; collapse
431 :     pmaddwd mm6, [mmx_one] ; collapse
432 : suxen_drol 329
433 : edgomez 1382 movq mm2, mm5
434 :     movq mm3, mm6
435 : suxen_drol 329
436 : edgomez 1382 psrlq mm2, 32
437 :     psrlq mm3, 32
438 : suxen_drol 329
439 : edgomez 1382 paddd mm5, mm2
440 :     paddd mm6, mm3
441 : suxen_drol 329
442 : edgomez 1382 movd [ebx + 8], mm5
443 :     movd [ebx + 12], mm6
444 : suxen_drol 329
445 : edgomez 1382 paddd mm5, mm6
446 : suxen_drol 329
447 : edgomez 1382 movd eax, mm5
448 : suxen_drol 329
449 : edgomez 1382 add eax, edi
450 : suxen_drol 329
451 : edgomez 1382 pop edi
452 :     pop ebx
453 : suxen_drol 329
454 : edgomez 1382 ret
455 : edgomez 1540 .endfunc
456 : suxen_drol 329
457 : edgomez 1382 ;-----------------------------------------------------------------------------
458 :     ;
459 :     ; uint32_t sad16bi_mmx(const uint8_t * const cur,
460 :     ; const uint8_t * const ref1,
461 :     ; const uint8_t * const ref2,
462 :     ; const uint32_t stride);
463 :     ;
464 :     ;-----------------------------------------------------------------------------
465 : suxen_drol 329
466 : edgomez 1382 ALIGN 16
467 :     sad16bi_mmx:
468 :     push ebx
469 :     mov eax, [esp+4+ 4] ; Src
470 :     mov edx, [esp+4+ 8] ; Ref1
471 :     mov ebx, [esp+4+12] ; Ref2
472 :     mov ecx, [esp+4+16] ; Stride
473 : suxen_drol 329
474 : edgomez 1382 pxor mm6, mm6 ; accum2
475 :     pxor mm7, mm7
476 :     .Loop
477 :     SADBI_16x16_MMX 0, 0
478 :     SADBI_16x16_MMX 8, 1
479 :     SADBI_16x16_MMX 0, 0
480 :     SADBI_16x16_MMX 8, 1
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 :    
494 :     SADBI_16x16_MMX 0, 0
495 :     SADBI_16x16_MMX 8, 1
496 :     SADBI_16x16_MMX 0, 0
497 :     SADBI_16x16_MMX 8, 1
498 :     SADBI_16x16_MMX 0, 0
499 :     SADBI_16x16_MMX 8, 1
500 :     SADBI_16x16_MMX 0, 0
501 :     SADBI_16x16_MMX 8, 1
502 :     SADBI_16x16_MMX 0, 0
503 :     SADBI_16x16_MMX 8, 1
504 :     SADBI_16x16_MMX 0, 0
505 :     SADBI_16x16_MMX 8, 1
506 :     SADBI_16x16_MMX 0, 0
507 :     SADBI_16x16_MMX 8, 1
508 :     SADBI_16x16_MMX 0, 0
509 :     SADBI_16x16_MMX 8, 1
510 :    
511 :     pmaddwd mm6, [mmx_one] ; collapse
512 :     movq mm7, mm6
513 :     psrlq mm7, 32
514 :     paddd mm6, mm7
515 :    
516 :     movd eax, mm6
517 :     pop ebx
518 :    
519 :     ret
520 : edgomez 1540 .endfunc
521 : edgomez 1382
522 :     ;-----------------------------------------------------------------------------
523 : suxen_drol 329 ;
524 : edgomez 1382 ; uint32_t sad8bi_mmx(const uint8_t * const cur,
525 :     ; const uint8_t * const ref1,
526 :     ; const uint8_t * const ref2,
527 :     ; const uint32_t stride);
528 : suxen_drol 329 ;
529 : edgomez 1382 ;-----------------------------------------------------------------------------
530 : suxen_drol 329
531 : edgomez 1382 ALIGN 16
532 :     sad8bi_mmx:
533 :     push ebx
534 :     mov eax, [esp+4+ 4] ; Src
535 :     mov edx, [esp+4+ 8] ; Ref1
536 :     mov ebx, [esp+4+12] ; Ref2
537 :     mov ecx, [esp+4+16] ; Stride
538 : Isibaar 262
539 : edgomez 1382 pxor mm6, mm6 ; accum2
540 :     pxor mm7, mm7
541 :     .Loop
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 :     SADBI_16x16_MMX 0, 1
547 :     SADBI_16x16_MMX 0, 1
548 :     SADBI_16x16_MMX 0, 1
549 :     SADBI_16x16_MMX 0, 1
550 : Isibaar 262
551 : edgomez 1382 pmaddwd mm6, [mmx_one] ; collapse
552 :     movq mm7, mm6
553 :     psrlq mm7, 32
554 :     paddd mm6, mm7
555 : Isibaar 262
556 : edgomez 1382 movd eax, mm6
557 :     pop ebx
558 :     ret
559 : edgomez 1540 .endfunc
560 : Isibaar 262
561 : edgomez 1382 ;-----------------------------------------------------------------------------
562 :     ;
563 :     ; uint32_t dev16_mmx(const uint8_t * const cur,
564 :     ; const uint32_t stride);
565 :     ;
566 :     ;-----------------------------------------------------------------------------
567 :    
568 :     ALIGN 16
569 : Isibaar 262 dev16_mmx:
570 : edgomez 1382 mov eax, [esp+ 4] ; Src
571 :     mov ecx, [esp+ 8] ; Stride
572 : Isibaar 262
573 : edgomez 1382 pxor mm7, mm7 ; zero
574 :     pxor mm5, mm5 ; accum1
575 :     pxor mm6, mm6 ; accum2
576 : Isibaar 262
577 : edgomez 1382 MEAN_16x16_MMX
578 :     MEAN_16x16_MMX
579 :     MEAN_16x16_MMX
580 :     MEAN_16x16_MMX
581 :     MEAN_16x16_MMX
582 :     MEAN_16x16_MMX
583 :     MEAN_16x16_MMX
584 :     MEAN_16x16_MMX
585 : Isibaar 262
586 : edgomez 1382 MEAN_16x16_MMX
587 :     MEAN_16x16_MMX
588 :     MEAN_16x16_MMX
589 :     MEAN_16x16_MMX
590 :     MEAN_16x16_MMX
591 :     MEAN_16x16_MMX
592 :     MEAN_16x16_MMX
593 :     MEAN_16x16_MMX
594 : Isibaar 262
595 : edgomez 1382 paddusw mm6, mm5
596 :     pmaddwd mm6, [mmx_one] ; collapse
597 :     movq mm5, mm6
598 :     psrlq mm5, 32
599 :     paddd mm6, mm5
600 : Isibaar 262
601 : edgomez 1382 psllq mm6, 32 ; blank upper dword
602 :     psrlq mm6, 32 + 8 ; /= (16*16)
603 : Isibaar 262
604 : edgomez 1382 punpckldq mm6, mm6
605 :     packssdw mm6, mm6
606 :    
607 : Isibaar 262 ; mm6 contains the mean
608 :     ; mm5 is the new accum
609 :    
610 : edgomez 1382 pxor mm5, mm5
611 :     mov eax, [esp+ 4] ; Src
612 : Isibaar 262
613 : edgomez 1382 ABS_16x16_MMX
614 :     ABS_16x16_MMX
615 :     ABS_16x16_MMX
616 :     ABS_16x16_MMX
617 :     ABS_16x16_MMX
618 :     ABS_16x16_MMX
619 :     ABS_16x16_MMX
620 :     ABS_16x16_MMX
621 : Isibaar 262
622 : edgomez 1382 ABS_16x16_MMX
623 :     ABS_16x16_MMX
624 :     ABS_16x16_MMX
625 :     ABS_16x16_MMX
626 :     ABS_16x16_MMX
627 :     ABS_16x16_MMX
628 :     ABS_16x16_MMX
629 :     ABS_16x16_MMX
630 : Isibaar 262
631 : edgomez 1382 pmaddwd mm5, [mmx_one] ; collapse
632 :     movq mm6, mm5
633 :     psrlq mm6, 32
634 :     paddd mm6, mm5
635 : Isibaar 262
636 : edgomez 1382 movd eax, mm6
637 :    
638 :     ret
639 : edgomez 1540 .endfunc
640 : edgomez 1382
641 :     ;-----------------------------------------------------------------------------
642 :     ;
643 :     ; uint32_t sse8_16bit_mmx(const int16_t *b1,
644 :     ; const int16_t *b2,
645 :     ; const uint32_t stride);
646 :     ;
647 :     ;-----------------------------------------------------------------------------
648 :    
649 : edgomez 1424 %macro ROW_SSE_16bit_MMX 2
650 : edgomez 1382 movq mm0, [%1]
651 :     movq mm1, [%1+8]
652 :     psubw mm0, [%2]
653 :     psubw mm1, [%2+8]
654 :     pmaddwd mm0, mm0
655 :     pmaddwd mm1, mm1
656 :     paddd mm2, mm0
657 :     paddd mm2, mm1
658 : edgomez 1424 %endmacro
659 : edgomez 1382
660 :     sse8_16bit_mmx:
661 :     push esi
662 :     push edi
663 :    
664 :     ;; Load the function params
665 :     mov esi, [esp+8+4]
666 :     mov edi, [esp+8+8]
667 :     mov edx, [esp+8+12]
668 :    
669 :     ;; Reset the sse accumulator
670 :     pxor mm2, mm2
671 :    
672 :     ;; Let's go
673 : edgomez 1424 %rep 8
674 :     ROW_SSE_16bit_MMX esi, edi
675 : edgomez 1382 lea esi, [esi+edx]
676 :     lea edi, [edi+edx]
677 : edgomez 1424 %endrep
678 : edgomez 1382
679 :     ;; Finish adding each dword of the accumulator
680 :     movq mm3, mm2
681 :     psrlq mm2, 32
682 :     paddd mm2, mm3
683 :     movd eax, mm2
684 :    
685 :     ;; All done
686 :     pop edi
687 :     pop esi
688 :     ret
689 : edgomez 1540 .endfunc
690 : edgomez 1424
691 :     ;-----------------------------------------------------------------------------
692 :     ;
693 :     ; uint32_t sse8_8bit_mmx(const int8_t *b1,
694 :     ; const int8_t *b2,
695 :     ; const uint32_t stride);
696 :     ;
697 :     ;-----------------------------------------------------------------------------
698 :    
699 :     %macro ROW_SSE_8bit_MMX 2
700 :     movq mm0, [%1] ; load a row
701 :     movq mm2, [%2] ; load a row
702 :    
703 :     movq mm1, mm0 ; copy row
704 :     movq mm3, mm2 ; copy row
705 :    
706 :     punpcklbw mm0, mm7 ; turn the 4low elements into 16bit
707 :     punpckhbw mm1, mm7 ; turn the 4high elements into 16bit
708 :    
709 :     punpcklbw mm2, mm7 ; turn the 4low elements into 16bit
710 :     punpckhbw mm3, mm7 ; turn the 4high elements into 16bit
711 :    
712 :     psubw mm0, mm2 ; low part of src-dst
713 :     psubw mm1, mm3 ; high part of src-dst
714 :    
715 :     pmaddwd mm0, mm0 ; compute the square sum
716 :     pmaddwd mm1, mm1 ; compute the square sum
717 :    
718 :     paddd mm6, mm0 ; add to the accumulator
719 :     paddd mm6, mm1 ; add to the accumulator
720 :     %endmacro
721 :    
722 :     sse8_8bit_mmx:
723 :     push esi
724 :     push edi
725 :    
726 :     ;; Load the function params
727 :     mov esi, [esp+8+4]
728 :     mov edi, [esp+8+8]
729 :     mov edx, [esp+8+12]
730 :    
731 :     ;; Reset the sse accumulator
732 :     pxor mm6, mm6
733 :    
734 :     ;; Used to interleave 8bit data with 0x00 values
735 :     pxor mm7, mm7
736 :    
737 :     ;; Let's go
738 :     %rep 8
739 :     ROW_SSE_8bit_MMX esi, edi
740 :     lea esi, [esi+edx]
741 :     lea edi, [edi+edx]
742 :     %endrep
743 :    
744 :     ;; Finish adding each dword of the accumulator
745 :     movq mm7, mm6
746 :     psrlq mm6, 32
747 :     paddd mm6, mm7
748 :     movd eax, mm6
749 :    
750 :     ;; All done
751 :     pop edi
752 :     pop esi
753 :     ret
754 : edgomez 1540 .endfunc
755 :    

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