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

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