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

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