[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 1790 - (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 : Isibaar 1790 ; * $Id: sad_mmx.asm,v 1.18 2008-08-19 09:06:48 Isibaar 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 : Isibaar 262
78 : edgomez 1382 psubusb mm1, mm4
79 :     psubusb mm3, mm5
80 : suxen_drol 1599 por mm0, mm1
81 : edgomez 1382 por mm2, mm3
82 : Isibaar 262
83 : edgomez 1382 movq mm1, mm0
84 :     punpcklbw mm0,mm7
85 : suxen_drol 1599 movq mm3, mm2
86 : edgomez 1382 punpckhbw mm1,mm7
87 : suxen_drol 1599 lea edx, [edx+ecx]
88 : edgomez 1382 punpcklbw mm2,mm7
89 :     paddusw mm0, mm1
90 : suxen_drol 1599 punpckhbw mm3,mm7
91 : edgomez 1382 paddusw mm6, mm0
92 :     paddusw mm2, mm3
93 :     paddusw mm6, mm2
94 : suxen_drol 1599
95 : Isibaar 262 %endmacro
96 :    
97 : edgomez 1382 %macro SAD_8x8_MMX 0
98 :     movq mm0, [eax]
99 :     movq mm1, [edx]
100 : Isibaar 262
101 : edgomez 1382 movq mm2, [eax+ecx]
102 :     movq mm3, [edx+ecx]
103 : Isibaar 262
104 : edgomez 1382 lea eax,[eax+2*ecx]
105 :     lea edx,[edx+2*ecx]
106 : Isibaar 262
107 : edgomez 1382 movq mm4, mm0
108 :     psubusb mm0, mm1
109 :     movq mm5, mm2
110 :     psubusb mm2, mm3
111 : Isibaar 262
112 : edgomez 1382 psubusb mm1, mm4
113 :     psubusb mm3, mm5
114 : suxen_drol 1599 por mm0, mm1
115 : edgomez 1382 por mm2, mm3
116 : Isibaar 262
117 : edgomez 1382 movq mm1,mm0
118 :     punpcklbw mm0,mm7
119 : suxen_drol 1599 movq mm3,mm2
120 : edgomez 1382 punpckhbw mm1,mm7
121 :     punpcklbw mm2,mm7
122 :     paddusw mm0,mm1
123 : suxen_drol 1599 punpckhbw mm3,mm7
124 : edgomez 1382 paddusw mm6,mm0
125 :     paddusw mm2,mm3
126 :     paddusw mm6,mm2
127 :     %endmacro
128 : Isibaar 262
129 : suxen_drol 1599
130 : edgomez 1382 %macro SADV_16x16_MMX 0
131 :     movq mm0, [eax]
132 :     movq mm1, [edx]
133 : Isibaar 262
134 : edgomez 1382 movq mm2, [eax+8]
135 :     movq mm4, mm0
136 : suxen_drol 1599 movq mm3, [edx+8]
137 : edgomez 1382 psubusb mm0, mm1
138 : Isibaar 262
139 : edgomez 1382 psubusb mm1, mm4
140 :     lea eax,[eax+ecx]
141 : suxen_drol 1599 por mm0, mm1
142 : Isibaar 262
143 : edgomez 1382 movq mm4, mm2
144 :     psubusb mm2, mm3
145 : Isibaar 262
146 : edgomez 1382 psubusb mm3, mm4
147 :     por mm2, mm3
148 : suxen_drol 1599
149 : edgomez 1382 movq mm1,mm0
150 :     punpcklbw mm0,mm7
151 : suxen_drol 1599 movq mm3,mm2
152 : edgomez 1382 punpckhbw mm1,mm7
153 :     punpcklbw mm2,mm7
154 :     paddusw mm0,mm1
155 : suxen_drol 1599 punpckhbw mm3,mm7
156 : edgomez 1382 paddusw mm5, mm0
157 : suxen_drol 1599 paddusw mm2,mm3
158 :     lea edx,[edx+ecx]
159 : edgomez 1382 paddusw mm6, mm2
160 : Isibaar 262 %endmacro
161 :    
162 : edgomez 1382 %macro SADBI_16x16_MMX 2 ; SADBI_16x16_MMX( int_ptr_offset, bool_increment_ptr );
163 : Isibaar 262
164 : edgomez 1382 movq mm0, [edx+%1]
165 :     movq mm2, [ebx+%1]
166 :     movq mm1, mm0
167 :     movq mm3, mm2
168 : Isibaar 262
169 : edgomez 1382 %if %2 != 0
170 :     add edx, ecx
171 :     %endif
172 : Isibaar 262
173 : edgomez 1382 punpcklbw mm0, mm7
174 :     punpckhbw mm1, mm7
175 :     punpcklbw mm2, mm7
176 :     punpckhbw mm3, mm7
177 : Isibaar 262
178 : edgomez 1382 %if %2 != 0
179 :     add ebx, ecx
180 :     %endif
181 : Isibaar 262
182 : edgomez 1382 paddusw mm0, mm2 ; mm01 = ref1 + ref2
183 :     paddusw mm1, mm3
184 :     paddusw mm0, [mmx_one] ; mm01 += 1
185 :     paddusw mm1, [mmx_one]
186 :     psrlw mm0, 1 ; mm01 >>= 1
187 :     psrlw mm1, 1
188 : Isibaar 262
189 : edgomez 1382 movq mm2, [eax+%1]
190 :     movq mm3, mm2
191 :     punpcklbw mm2, mm7 ; mm23 = src
192 :     punpckhbw mm3, mm7
193 : Isibaar 262
194 : edgomez 1382 %if %2 != 0
195 :     add eax, ecx
196 :     %endif
197 : Isibaar 262
198 : edgomez 1382 movq mm4, mm0
199 :     movq mm5, mm1
200 :     psubusw mm0, mm2
201 :     psubusw mm1, mm3
202 :     psubusw mm2, mm4
203 :     psubusw mm3, mm5
204 :     por mm0, mm2 ; mm01 = ABS(mm01 - mm23)
205 :     por mm1, mm3
206 : Isibaar 262
207 : edgomez 1382 paddusw mm6, mm0 ; mm6 += mm01
208 :     paddusw mm6, mm1
209 : Isibaar 262
210 : edgomez 1382 %endmacro
211 : edgomez 851
212 : edgomez 1382 %macro MEAN_16x16_MMX 0
213 :     movq mm0, [eax]
214 :     movq mm2, [eax+8]
215 :     lea eax, [eax+ecx]
216 :     movq mm1, mm0
217 :     punpcklbw mm0, mm7
218 : suxen_drol 1599 movq mm3, mm2
219 : edgomez 1382 punpckhbw mm1, mm7
220 :     paddw mm5, mm0
221 : suxen_drol 1599 punpcklbw mm2, mm7
222 : edgomez 1382 paddw mm6, mm1
223 : suxen_drol 1599 punpckhbw mm3, mm7
224 : edgomez 1382 paddw mm5, mm2
225 :     paddw mm6, mm3
226 :     %endmacro
227 : edgomez 851
228 : edgomez 1382 %macro ABS_16x16_MMX 0
229 :     movq mm0, [eax]
230 :     movq mm2, [eax+8]
231 :     lea eax, [eax+ecx]
232 :     movq mm1, mm0
233 :     movq mm3, mm2
234 :     punpcklbw mm0, mm7
235 :     punpcklbw mm2, mm7
236 :     punpckhbw mm1, mm7
237 :     punpckhbw mm3, mm7
238 :     movq mm4, mm6
239 :     psubusw mm4, mm0
240 : edgomez 851
241 : edgomez 1382 psubusw mm0, mm6
242 :     por mm0, mm4
243 :     movq mm4, mm6
244 :     psubusw mm4, mm1
245 :     psubusw mm1, mm6
246 :     por mm1, mm4
247 : edgomez 851
248 : edgomez 1382 movq mm4, mm6
249 :     psubusw mm4, mm2
250 :     psubusw mm2, mm6
251 :     por mm2, mm4
252 :     movq mm4, mm6
253 :     psubusw mm4, mm3
254 :     psubusw mm3, mm6
255 :     por mm3, mm4
256 : edgomez 851
257 : edgomez 1382 paddw mm0, mm1
258 :     paddw mm2, mm3
259 :     paddw mm5, mm0
260 :     paddw mm5, mm2
261 :     %endmacro
262 : edgomez 851
263 : edgomez 1382 ;=============================================================================
264 :     ; Code
265 :     ;=============================================================================
266 : edgomez 851
267 : edgomez 1382 SECTION .text
268 : edgomez 851
269 : edgomez 1382 cglobal sad16_mmx
270 :     cglobal sad16v_mmx
271 :     cglobal sad8_mmx
272 :     cglobal sad16bi_mmx
273 :     cglobal sad8bi_mmx
274 :     cglobal dev16_mmx
275 :     cglobal sse8_16bit_mmx
276 : edgomez 1424 cglobal sse8_8bit_mmx
277 : edgomez 1382
278 :     ;-----------------------------------------------------------------------------
279 :     ;
280 :     ; uint32_t sad16_mmx(const uint8_t * const cur,
281 :     ; const uint8_t * const ref,
282 :     ; const uint32_t stride,
283 :     ; const uint32_t best_sad);
284 :     ;
285 :     ; (early termination ignore; slows this down)
286 :     ;
287 :     ;-----------------------------------------------------------------------------
288 : edgomez 851
289 : edgomez 1382 ALIGN 16
290 :     sad16_mmx:
291 : edgomez 851
292 : edgomez 1382 mov eax, [esp+ 4] ; Src1
293 :     mov edx, [esp+ 8] ; Src2
294 :     mov ecx, [esp+12] ; Stride
295 : edgomez 851
296 : edgomez 1382 pxor mm6, mm6 ; accum
297 :     pxor mm7, mm7 ; zero
298 : edgomez 851
299 : edgomez 1382 SAD_16x16_MMX
300 :     SAD_16x16_MMX
301 :     SAD_16x16_MMX
302 :     SAD_16x16_MMX
303 :     SAD_16x16_MMX
304 :     SAD_16x16_MMX
305 :     SAD_16x16_MMX
306 :     SAD_16x16_MMX
307 : edgomez 851
308 : edgomez 1382 SAD_16x16_MMX
309 :     SAD_16x16_MMX
310 :     SAD_16x16_MMX
311 :     SAD_16x16_MMX
312 :     SAD_16x16_MMX
313 :     SAD_16x16_MMX
314 :     SAD_16x16_MMX
315 :     SAD_16x16_MMX
316 : edgomez 851
317 : edgomez 1382 pmaddwd mm6, [mmx_one] ; collapse
318 :     movq mm7, mm6
319 :     psrlq mm7, 32
320 :     paddd mm6, mm7
321 : edgomez 851
322 : edgomez 1382 movd eax, mm6
323 : edgomez 851
324 : edgomez 1382 ret
325 : edgomez 1540 .endfunc
326 : edgomez 851
327 : edgomez 1382 ;-----------------------------------------------------------------------------
328 :     ;
329 :     ; uint32_t sad8_mmx(const uint8_t * const cur,
330 :     ; const uint8_t * const ref,
331 :     ; const uint32_t stride);
332 :     ;
333 :     ;-----------------------------------------------------------------------------
334 : edgomez 851
335 : edgomez 1382 ALIGN 16
336 :     sad8_mmx:
337 : edgomez 851
338 : edgomez 1382 mov eax, [esp+ 4] ; Src1
339 :     mov edx, [esp+ 8] ; Src2
340 :     mov ecx, [esp+12] ; Stride
341 : edgomez 851
342 : edgomez 1382 pxor mm6, mm6 ; accum
343 :     pxor mm7, mm7 ; zero
344 : edgomez 851
345 : edgomez 1382 SAD_8x8_MMX
346 :     SAD_8x8_MMX
347 :     SAD_8x8_MMX
348 :     SAD_8x8_MMX
349 : edgomez 851
350 : edgomez 1382 pmaddwd mm6, [mmx_one] ; collapse
351 :     movq mm7, mm6
352 :     psrlq mm7, 32
353 :     paddd mm6, mm7
354 : edgomez 851
355 : edgomez 1382 movd eax, mm6
356 : edgomez 851
357 : edgomez 1382 ret
358 : edgomez 1540 .endfunc
359 : edgomez 851
360 : edgomez 1382 ;-----------------------------------------------------------------------------
361 :     ;
362 :     ; uint32_t sad16v_mmx(const uint8_t * const cur,
363 :     ; const uint8_t * const ref,
364 :     ; const uint32_t stride,
365 :     ; int32_t *sad);
366 :     ;
367 :     ;-----------------------------------------------------------------------------
368 : edgomez 851
369 : edgomez 1382 ALIGN 16
370 :     sad16v_mmx:
371 : edgomez 851
372 : edgomez 1382 push ebx
373 :     push edi
374 : edgomez 851
375 : edgomez 1382 mov eax, [esp + 8 + 4] ; Src1
376 :     mov edx, [esp + 8 + 8] ; Src2
377 :     mov ecx, [esp + 8 + 12] ; Stride
378 :     mov ebx, [esp + 8 + 16] ; sad ptr
379 : edgomez 851
380 : edgomez 1382 pxor mm5, mm5 ; accum
381 :     pxor mm6, mm6 ; accum
382 :     pxor mm7, mm7 ; zero
383 : suxen_drol 329
384 : edgomez 1382 SADV_16x16_MMX
385 :     SADV_16x16_MMX
386 :     SADV_16x16_MMX
387 :     SADV_16x16_MMX
388 :     SADV_16x16_MMX
389 :     SADV_16x16_MMX
390 :     SADV_16x16_MMX
391 :     SADV_16x16_MMX
392 : suxen_drol 329
393 : edgomez 1382 pmaddwd mm5, [mmx_one] ; collapse
394 :     pmaddwd mm6, [mmx_one] ; collapse
395 : suxen_drol 329
396 : edgomez 1382 movq mm2, mm5
397 :     movq mm3, mm6
398 : suxen_drol 329
399 : edgomez 1382 psrlq mm2, 32
400 :     psrlq mm3, 32
401 : suxen_drol 329
402 : edgomez 1382 paddd mm5, mm2
403 :     paddd mm6, mm3
404 : suxen_drol 329
405 : edgomez 1382 movd [ebx], mm5
406 :     movd [ebx + 4], mm6
407 : suxen_drol 329
408 : edgomez 1382 paddd mm5, mm6
409 : suxen_drol 329
410 : edgomez 1382 movd edi, mm5
411 : suxen_drol 329
412 : edgomez 1382 pxor mm5, mm5
413 :     pxor mm6, mm6
414 : suxen_drol 329
415 : edgomez 1382 SADV_16x16_MMX
416 :     SADV_16x16_MMX
417 :     SADV_16x16_MMX
418 :     SADV_16x16_MMX
419 :     SADV_16x16_MMX
420 :     SADV_16x16_MMX
421 :     SADV_16x16_MMX
422 :     SADV_16x16_MMX
423 : suxen_drol 329
424 : edgomez 1382 pmaddwd mm5, [mmx_one] ; collapse
425 :     pmaddwd mm6, [mmx_one] ; collapse
426 : suxen_drol 329
427 : edgomez 1382 movq mm2, mm5
428 :     movq mm3, mm6
429 : suxen_drol 329
430 : edgomez 1382 psrlq mm2, 32
431 :     psrlq mm3, 32
432 : suxen_drol 329
433 : edgomez 1382 paddd mm5, mm2
434 :     paddd mm6, mm3
435 : suxen_drol 329
436 : edgomez 1382 movd [ebx + 8], mm5
437 :     movd [ebx + 12], mm6
438 : suxen_drol 329
439 : edgomez 1382 paddd mm5, mm6
440 : suxen_drol 329
441 : edgomez 1382 movd eax, mm5
442 : suxen_drol 329
443 : edgomez 1382 add eax, edi
444 : suxen_drol 329
445 : edgomez 1382 pop edi
446 :     pop ebx
447 : suxen_drol 329
448 : edgomez 1382 ret
449 : edgomez 1540 .endfunc
450 : suxen_drol 329
451 : edgomez 1382 ;-----------------------------------------------------------------------------
452 :     ;
453 :     ; uint32_t sad16bi_mmx(const uint8_t * const cur,
454 :     ; const uint8_t * const ref1,
455 :     ; const uint8_t * const ref2,
456 :     ; const uint32_t stride);
457 :     ;
458 :     ;-----------------------------------------------------------------------------
459 : suxen_drol 329
460 : edgomez 1382 ALIGN 16
461 :     sad16bi_mmx:
462 :     push ebx
463 :     mov eax, [esp+4+ 4] ; Src
464 :     mov edx, [esp+4+ 8] ; Ref1
465 :     mov ebx, [esp+4+12] ; Ref2
466 :     mov ecx, [esp+4+16] ; Stride
467 : suxen_drol 329
468 : edgomez 1382 pxor mm6, mm6 ; accum2
469 :     pxor mm7, mm7
470 :     .Loop
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 :     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 :    
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 :     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 :    
505 :     pmaddwd mm6, [mmx_one] ; collapse
506 :     movq mm7, mm6
507 :     psrlq mm7, 32
508 :     paddd mm6, mm7
509 :    
510 :     movd eax, mm6
511 :     pop ebx
512 :    
513 :     ret
514 : edgomez 1540 .endfunc
515 : edgomez 1382
516 :     ;-----------------------------------------------------------------------------
517 : suxen_drol 329 ;
518 : edgomez 1382 ; uint32_t sad8bi_mmx(const uint8_t * const cur,
519 :     ; const uint8_t * const ref1,
520 :     ; const uint8_t * const ref2,
521 :     ; const uint32_t stride);
522 : suxen_drol 329 ;
523 : edgomez 1382 ;-----------------------------------------------------------------------------
524 : suxen_drol 329
525 : edgomez 1382 ALIGN 16
526 :     sad8bi_mmx:
527 :     push ebx
528 :     mov eax, [esp+4+ 4] ; Src
529 :     mov edx, [esp+4+ 8] ; Ref1
530 :     mov ebx, [esp+4+12] ; Ref2
531 :     mov ecx, [esp+4+16] ; Stride
532 : Isibaar 262
533 : edgomez 1382 pxor mm6, mm6 ; accum2
534 :     pxor mm7, mm7
535 :     .Loop
536 :     SADBI_16x16_MMX 0, 1
537 :     SADBI_16x16_MMX 0, 1
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 : Isibaar 262
545 : edgomez 1382 pmaddwd mm6, [mmx_one] ; collapse
546 :     movq mm7, mm6
547 :     psrlq mm7, 32
548 :     paddd mm6, mm7
549 : Isibaar 262
550 : edgomez 1382 movd eax, mm6
551 :     pop ebx
552 :     ret
553 : edgomez 1540 .endfunc
554 : Isibaar 262
555 : edgomez 1382 ;-----------------------------------------------------------------------------
556 :     ;
557 :     ; uint32_t dev16_mmx(const uint8_t * const cur,
558 :     ; const uint32_t stride);
559 :     ;
560 :     ;-----------------------------------------------------------------------------
561 :    
562 :     ALIGN 16
563 : Isibaar 262 dev16_mmx:
564 : edgomez 1382 mov eax, [esp+ 4] ; Src
565 :     mov ecx, [esp+ 8] ; Stride
566 : Isibaar 262
567 : edgomez 1382 pxor mm7, mm7 ; zero
568 :     pxor mm5, mm5 ; accum1
569 :     pxor mm6, mm6 ; accum2
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 MEAN_16x16_MMX
581 :     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 : Isibaar 262
589 : edgomez 1382 paddusw mm6, mm5
590 :     pmaddwd mm6, [mmx_one] ; collapse
591 :     movq mm5, mm6
592 :     psrlq mm5, 32
593 :     paddd mm6, mm5
594 : Isibaar 262
595 : edgomez 1382 psllq mm6, 32 ; blank upper dword
596 :     psrlq mm6, 32 + 8 ; /= (16*16)
597 : Isibaar 262
598 : edgomez 1382 punpckldq mm6, mm6
599 :     packssdw mm6, mm6
600 :    
601 : Isibaar 262 ; mm6 contains the mean
602 :     ; mm5 is the new accum
603 :    
604 : edgomez 1382 pxor mm5, mm5
605 :     mov eax, [esp+ 4] ; Src
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 ABS_16x16_MMX
617 :     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 : Isibaar 262
625 : edgomez 1382 pmaddwd mm5, [mmx_one] ; collapse
626 :     movq mm6, mm5
627 :     psrlq mm6, 32
628 :     paddd mm6, mm5
629 : Isibaar 262
630 : edgomez 1382 movd eax, mm6
631 :    
632 :     ret
633 : edgomez 1540 .endfunc
634 : edgomez 1382
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 1540 .endfunc
684 : edgomez 1424
685 :     ;-----------------------------------------------------------------------------
686 :     ;
687 :     ; uint32_t sse8_8bit_mmx(const int8_t *b1,
688 :     ; const int8_t *b2,
689 :     ; const uint32_t stride);
690 :     ;
691 :     ;-----------------------------------------------------------------------------
692 :    
693 :     %macro ROW_SSE_8bit_MMX 2
694 :     movq mm0, [%1] ; load a row
695 :     movq mm2, [%2] ; load a row
696 :    
697 :     movq mm1, mm0 ; copy row
698 :     movq mm3, mm2 ; copy row
699 :    
700 :     punpcklbw mm0, mm7 ; turn the 4low elements into 16bit
701 :     punpckhbw mm1, mm7 ; turn the 4high elements into 16bit
702 :    
703 :     punpcklbw mm2, mm7 ; turn the 4low elements into 16bit
704 :     punpckhbw mm3, mm7 ; turn the 4high elements into 16bit
705 :    
706 :     psubw mm0, mm2 ; low part of src-dst
707 :     psubw mm1, mm3 ; high part of src-dst
708 :    
709 :     pmaddwd mm0, mm0 ; compute the square sum
710 :     pmaddwd mm1, mm1 ; compute the square sum
711 :    
712 :     paddd mm6, mm0 ; add to the accumulator
713 :     paddd mm6, mm1 ; add to the accumulator
714 :     %endmacro
715 :    
716 :     sse8_8bit_mmx:
717 :     push esi
718 :     push edi
719 :    
720 :     ;; Load the function params
721 :     mov esi, [esp+8+4]
722 :     mov edi, [esp+8+8]
723 :     mov edx, [esp+8+12]
724 :    
725 :     ;; Reset the sse accumulator
726 :     pxor mm6, mm6
727 :    
728 :     ;; Used to interleave 8bit data with 0x00 values
729 :     pxor mm7, mm7
730 :    
731 :     ;; Let's go
732 :     %rep 8
733 :     ROW_SSE_8bit_MMX esi, edi
734 :     lea esi, [esi+edx]
735 :     lea edi, [edi+edx]
736 :     %endrep
737 :    
738 :     ;; Finish adding each dword of the accumulator
739 :     movq mm7, mm6
740 :     psrlq mm6, 32
741 :     paddd mm6, mm7
742 :     movd eax, mm6
743 :    
744 :     ;; All done
745 :     pop edi
746 :     pop esi
747 :     ret
748 : edgomez 1540 .endfunc
749 :    
750 : Isibaar 1790
751 :     %ifidn __OUTPUT_FORMAT__,elf
752 :     section ".note.GNU-stack" noalloc noexec nowrite progbits
753 :     %endif
754 :    

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