[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 1519 - (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 1519 ; * $Id: sad_mmx.asm,v 1.14 2004-07-24 11:46:08 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 : edgomez 1519 SECTION .rodata
44 : edgomez 1382 %else
45 : edgomez 1519 SECTION .rodata align=16
46 : edgomez 1382 %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 : edgomez 1424 cglobal sse8_8bit_mmx
274 : edgomez 1382
275 :     ;-----------------------------------------------------------------------------
276 :     ;
277 :     ; uint32_t sad16_mmx(const uint8_t * const cur,
278 :     ; const uint8_t * const ref,
279 :     ; const uint32_t stride,
280 :     ; const uint32_t best_sad);
281 :     ;
282 :     ; (early termination ignore; slows this down)
283 :     ;
284 :     ;-----------------------------------------------------------------------------
285 : edgomez 851
286 : edgomez 1382 ALIGN 16
287 :     sad16_mmx:
288 : edgomez 851
289 : edgomez 1382 mov eax, [esp+ 4] ; Src1
290 :     mov edx, [esp+ 8] ; Src2
291 :     mov ecx, [esp+12] ; Stride
292 : edgomez 851
293 : edgomez 1382 pxor mm6, mm6 ; accum
294 :     pxor mm7, mm7 ; zero
295 : edgomez 851
296 : edgomez 1382 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 :     SAD_16x16_MMX
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 pmaddwd mm6, [mmx_one] ; collapse
315 :     movq mm7, mm6
316 :     psrlq mm7, 32
317 :     paddd mm6, mm7
318 : edgomez 851
319 : edgomez 1382 movd eax, mm6
320 : edgomez 851
321 : edgomez 1382 ret
322 : edgomez 851
323 : edgomez 1382 ;-----------------------------------------------------------------------------
324 :     ;
325 :     ; uint32_t sad8_mmx(const uint8_t * const cur,
326 :     ; const uint8_t * const ref,
327 :     ; const uint32_t stride);
328 :     ;
329 :     ;-----------------------------------------------------------------------------
330 : edgomez 851
331 : edgomez 1382 ALIGN 16
332 :     sad8_mmx:
333 : edgomez 851
334 : edgomez 1382 mov eax, [esp+ 4] ; Src1
335 :     mov edx, [esp+ 8] ; Src2
336 :     mov ecx, [esp+12] ; Stride
337 : edgomez 851
338 : edgomez 1382 pxor mm6, mm6 ; accum
339 :     pxor mm7, mm7 ; zero
340 : edgomez 851
341 : edgomez 1382 SAD_8x8_MMX
342 :     SAD_8x8_MMX
343 :     SAD_8x8_MMX
344 :     SAD_8x8_MMX
345 : edgomez 851
346 : edgomez 1382 pmaddwd mm6, [mmx_one] ; collapse
347 :     movq mm7, mm6
348 :     psrlq mm7, 32
349 :     paddd mm6, mm7
350 : edgomez 851
351 : edgomez 1382 movd eax, mm6
352 : edgomez 851
353 : edgomez 1382 ret
354 : edgomez 851
355 : edgomez 1382 ;-----------------------------------------------------------------------------
356 :     ;
357 :     ; uint32_t sad16v_mmx(const uint8_t * const cur,
358 :     ; const uint8_t * const ref,
359 :     ; const uint32_t stride,
360 :     ; int32_t *sad);
361 :     ;
362 :     ;-----------------------------------------------------------------------------
363 : edgomez 851
364 : edgomez 1382 ALIGN 16
365 :     sad16v_mmx:
366 : edgomez 851
367 : edgomez 1382 push ebx
368 :     push edi
369 : edgomez 851
370 : edgomez 1382 mov eax, [esp + 8 + 4] ; Src1
371 :     mov edx, [esp + 8 + 8] ; Src2
372 :     mov ecx, [esp + 8 + 12] ; Stride
373 :     mov ebx, [esp + 8 + 16] ; sad ptr
374 : edgomez 851
375 : edgomez 1382 pxor mm5, mm5 ; accum
376 :     pxor mm6, mm6 ; accum
377 :     pxor mm7, mm7 ; zero
378 : suxen_drol 329
379 : edgomez 1382 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 :     SADV_16x16_MMX
387 : suxen_drol 329
388 : edgomez 1382 pmaddwd mm5, [mmx_one] ; collapse
389 :     pmaddwd mm6, [mmx_one] ; collapse
390 : suxen_drol 329
391 : edgomez 1382 movq mm2, mm5
392 :     movq mm3, mm6
393 : suxen_drol 329
394 : edgomez 1382 psrlq mm2, 32
395 :     psrlq mm3, 32
396 : suxen_drol 329
397 : edgomez 1382 paddd mm5, mm2
398 :     paddd mm6, mm3
399 : suxen_drol 329
400 : edgomez 1382 movd [ebx], mm5
401 :     movd [ebx + 4], mm6
402 : suxen_drol 329
403 : edgomez 1382 paddd mm5, mm6
404 : suxen_drol 329
405 : edgomez 1382 movd edi, mm5
406 : suxen_drol 329
407 : edgomez 1382 pxor mm5, mm5
408 :     pxor mm6, mm6
409 : suxen_drol 329
410 : edgomez 1382 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 :     SADV_16x16_MMX
418 : suxen_drol 329
419 : edgomez 1382 pmaddwd mm5, [mmx_one] ; collapse
420 :     pmaddwd mm6, [mmx_one] ; collapse
421 : suxen_drol 329
422 : edgomez 1382 movq mm2, mm5
423 :     movq mm3, mm6
424 : suxen_drol 329
425 : edgomez 1382 psrlq mm2, 32
426 :     psrlq mm3, 32
427 : suxen_drol 329
428 : edgomez 1382 paddd mm5, mm2
429 :     paddd mm6, mm3
430 : suxen_drol 329
431 : edgomez 1382 movd [ebx + 8], mm5
432 :     movd [ebx + 12], mm6
433 : suxen_drol 329
434 : edgomez 1382 paddd mm5, mm6
435 : suxen_drol 329
436 : edgomez 1382 movd eax, mm5
437 : suxen_drol 329
438 : edgomez 1382 add eax, edi
439 : suxen_drol 329
440 : edgomez 1382 pop edi
441 :     pop ebx
442 : suxen_drol 329
443 : edgomez 1382 ret
444 : suxen_drol 329
445 : edgomez 1382 ;-----------------------------------------------------------------------------
446 :     ;
447 :     ; uint32_t sad16bi_mmx(const uint8_t * const cur,
448 :     ; const uint8_t * const ref1,
449 :     ; const uint8_t * const ref2,
450 :     ; const uint32_t stride);
451 :     ;
452 :     ;-----------------------------------------------------------------------------
453 : suxen_drol 329
454 : edgomez 1382 ALIGN 16
455 :     sad16bi_mmx:
456 :     push ebx
457 :     mov eax, [esp+4+ 4] ; Src
458 :     mov edx, [esp+4+ 8] ; Ref1
459 :     mov ebx, [esp+4+12] ; Ref2
460 :     mov ecx, [esp+4+16] ; Stride
461 : suxen_drol 329
462 : edgomez 1382 pxor mm6, mm6 ; accum2
463 :     pxor mm7, mm7
464 :     .Loop
465 :     SADBI_16x16_MMX 0, 0
466 :     SADBI_16x16_MMX 8, 1
467 :     SADBI_16x16_MMX 0, 0
468 :     SADBI_16x16_MMX 8, 1
469 :     SADBI_16x16_MMX 0, 0
470 :     SADBI_16x16_MMX 8, 1
471 :     SADBI_16x16_MMX 0, 0
472 :     SADBI_16x16_MMX 8, 1
473 :     SADBI_16x16_MMX 0, 0
474 :     SADBI_16x16_MMX 8, 1
475 :     SADBI_16x16_MMX 0, 0
476 :     SADBI_16x16_MMX 8, 1
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 :    
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 :     SADBI_16x16_MMX 0, 0
491 :     SADBI_16x16_MMX 8, 1
492 :     SADBI_16x16_MMX 0, 0
493 :     SADBI_16x16_MMX 8, 1
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 :    
499 :     pmaddwd mm6, [mmx_one] ; collapse
500 :     movq mm7, mm6
501 :     psrlq mm7, 32
502 :     paddd mm6, mm7
503 :    
504 :     movd eax, mm6
505 :     pop ebx
506 :    
507 :     ret
508 :    
509 :     ;-----------------------------------------------------------------------------
510 : suxen_drol 329 ;
511 : edgomez 1382 ; uint32_t sad8bi_mmx(const uint8_t * const cur,
512 :     ; const uint8_t * const ref1,
513 :     ; const uint8_t * const ref2,
514 :     ; const uint32_t stride);
515 : suxen_drol 329 ;
516 : edgomez 1382 ;-----------------------------------------------------------------------------
517 : suxen_drol 329
518 : edgomez 1382 ALIGN 16
519 :     sad8bi_mmx:
520 :     push ebx
521 :     mov eax, [esp+4+ 4] ; Src
522 :     mov edx, [esp+4+ 8] ; Ref1
523 :     mov ebx, [esp+4+12] ; Ref2
524 :     mov ecx, [esp+4+16] ; Stride
525 : Isibaar 262
526 : edgomez 1382 pxor mm6, mm6 ; accum2
527 :     pxor mm7, mm7
528 :     .Loop
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 :     SADBI_16x16_MMX 0, 1
537 : Isibaar 262
538 : edgomez 1382 pmaddwd mm6, [mmx_one] ; collapse
539 :     movq mm7, mm6
540 :     psrlq mm7, 32
541 :     paddd mm6, mm7
542 : Isibaar 262
543 : edgomez 1382 movd eax, mm6
544 :     pop ebx
545 :     ret
546 : Isibaar 262
547 : edgomez 1382 ;-----------------------------------------------------------------------------
548 :     ;
549 :     ; uint32_t dev16_mmx(const uint8_t * const cur,
550 :     ; const uint32_t stride);
551 :     ;
552 :     ;-----------------------------------------------------------------------------
553 :    
554 :     ALIGN 16
555 : Isibaar 262 dev16_mmx:
556 : edgomez 1382 mov eax, [esp+ 4] ; Src
557 :     mov ecx, [esp+ 8] ; Stride
558 : Isibaar 262
559 : edgomez 1382 pxor mm7, mm7 ; zero
560 :     pxor mm5, mm5 ; accum1
561 :     pxor mm6, mm6 ; accum2
562 : Isibaar 262
563 : edgomez 1382 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 :     MEAN_16x16_MMX
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 paddusw mm6, mm5
582 :     pmaddwd mm6, [mmx_one] ; collapse
583 :     movq mm5, mm6
584 :     psrlq mm5, 32
585 :     paddd mm6, mm5
586 : Isibaar 262
587 : edgomez 1382 psllq mm6, 32 ; blank upper dword
588 :     psrlq mm6, 32 + 8 ; /= (16*16)
589 : Isibaar 262
590 : edgomez 1382 punpckldq mm6, mm6
591 :     packssdw mm6, mm6
592 :    
593 : Isibaar 262 ; mm6 contains the mean
594 :     ; mm5 is the new accum
595 :    
596 : edgomez 1382 pxor mm5, mm5
597 :     mov eax, [esp+ 4] ; Src
598 : Isibaar 262
599 : edgomez 1382 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 :     ABS_16x16_MMX
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 pmaddwd mm5, [mmx_one] ; collapse
618 :     movq mm6, mm5
619 :     psrlq mm6, 32
620 :     paddd mm6, mm5
621 : Isibaar 262
622 : edgomez 1382 movd eax, mm6
623 :    
624 :     ret
625 :    
626 :     ;-----------------------------------------------------------------------------
627 :     ;
628 :     ; uint32_t sse8_16bit_mmx(const int16_t *b1,
629 :     ; const int16_t *b2,
630 :     ; const uint32_t stride);
631 :     ;
632 :     ;-----------------------------------------------------------------------------
633 :    
634 : edgomez 1424 %macro ROW_SSE_16bit_MMX 2
635 : edgomez 1382 movq mm0, [%1]
636 :     movq mm1, [%1+8]
637 :     psubw mm0, [%2]
638 :     psubw mm1, [%2+8]
639 :     pmaddwd mm0, mm0
640 :     pmaddwd mm1, mm1
641 :     paddd mm2, mm0
642 :     paddd mm2, mm1
643 : edgomez 1424 %endmacro
644 : edgomez 1382
645 :     sse8_16bit_mmx:
646 :     push esi
647 :     push edi
648 :    
649 :     ;; Load the function params
650 :     mov esi, [esp+8+4]
651 :     mov edi, [esp+8+8]
652 :     mov edx, [esp+8+12]
653 :    
654 :     ;; Reset the sse accumulator
655 :     pxor mm2, mm2
656 :    
657 :     ;; Let's go
658 : edgomez 1424 %rep 8
659 :     ROW_SSE_16bit_MMX esi, edi
660 : edgomez 1382 lea esi, [esi+edx]
661 :     lea edi, [edi+edx]
662 : edgomez 1424 %endrep
663 : edgomez 1382
664 :     ;; Finish adding each dword of the accumulator
665 :     movq mm3, mm2
666 :     psrlq mm2, 32
667 :     paddd mm2, mm3
668 :     movd eax, mm2
669 :    
670 :     ;; All done
671 :     pop edi
672 :     pop esi
673 :     ret
674 : edgomez 1424
675 :     ;-----------------------------------------------------------------------------
676 :     ;
677 :     ; uint32_t sse8_8bit_mmx(const int8_t *b1,
678 :     ; const int8_t *b2,
679 :     ; const uint32_t stride);
680 :     ;
681 :     ;-----------------------------------------------------------------------------
682 :    
683 :     %macro ROW_SSE_8bit_MMX 2
684 :     movq mm0, [%1] ; load a row
685 :     movq mm2, [%2] ; load a row
686 :    
687 :     movq mm1, mm0 ; copy row
688 :     movq mm3, mm2 ; copy row
689 :    
690 :     punpcklbw mm0, mm7 ; turn the 4low elements into 16bit
691 :     punpckhbw mm1, mm7 ; turn the 4high elements into 16bit
692 :    
693 :     punpcklbw mm2, mm7 ; turn the 4low elements into 16bit
694 :     punpckhbw mm3, mm7 ; turn the 4high elements into 16bit
695 :    
696 :     psubw mm0, mm2 ; low part of src-dst
697 :     psubw mm1, mm3 ; high part of src-dst
698 :    
699 :     pmaddwd mm0, mm0 ; compute the square sum
700 :     pmaddwd mm1, mm1 ; compute the square sum
701 :    
702 :     paddd mm6, mm0 ; add to the accumulator
703 :     paddd mm6, mm1 ; add to the accumulator
704 :     %endmacro
705 :    
706 :     sse8_8bit_mmx:
707 :     push esi
708 :     push edi
709 :    
710 :     ;; Load the function params
711 :     mov esi, [esp+8+4]
712 :     mov edi, [esp+8+8]
713 :     mov edx, [esp+8+12]
714 :    
715 :     ;; Reset the sse accumulator
716 :     pxor mm6, mm6
717 :    
718 :     ;; Used to interleave 8bit data with 0x00 values
719 :     pxor mm7, mm7
720 :    
721 :     ;; Let's go
722 :     %rep 8
723 :     ROW_SSE_8bit_MMX esi, edi
724 :     lea esi, [esi+edx]
725 :     lea edi, [edi+edx]
726 :     %endrep
727 :    
728 :     ;; Finish adding each dword of the accumulator
729 :     movq mm7, mm6
730 :     psrlq mm6, 32
731 :     paddd mm6, mm7
732 :     movd eax, mm6
733 :    
734 :     ;; All done
735 :     pop edi
736 :     pop esi
737 :     ret

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