[svn] / trunk / xvidcore / src / motion / x86_asm / sad_3dne.asm Repository:
ViewVC logotype

Annotation of /trunk/xvidcore/src/motion/x86_asm/sad_3dne.asm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1793 - (view) (download)

1 : edgomez 1382 ;/****************************************************************************
2 : edgomez 851 ; *
3 : edgomez 1382 ; * XVID MPEG-4 VIDEO CODEC
4 :     ; * - K7 optimized SAD operators -
5 : edgomez 851 ; *
6 : edgomez 1382 ; * Copyright(C) 2002 Jaan Kalda
7 : edgomez 851 ; *
8 : edgomez 1382 ; * This program is free software; you can redistribute it and/or modify it
9 :     ; * under the terms of the GNU General Public License as published by
10 :     ; * the Free Software Foundation; either version 2 of the License, or
11 :     ; * (at your option) any later version.
12 : edgomez 851 ; *
13 : edgomez 1382 ; * This program is distributed in the hope that it will be useful,
14 :     ; * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 :     ; * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 :     ; * GNU General Public License for more details.
17 : edgomez 851 ; *
18 : edgomez 1382 ; * You should have received a copy of the GNU General Public License
19 :     ; * along with this program; if not, write to the Free Software
20 :     ; * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 : edgomez 851 ; *
22 : Isibaar 1793 ; * $Id: sad_3dne.asm,v 1.9 2008-11-11 20:46:24 Isibaar Exp $
23 : edgomez 1382 ; *
24 :     ; ***************************************************************************/
25 : edgomez 851
26 : edgomez 1382 ; these 3dne functions are compatible with iSSE, but are optimized specifically
27 :     ; for K7 pipelines
28 : edgomez 851
29 : edgomez 1382 BITS 32
30 :    
31 :     %macro cglobal 1
32 : edgomez 851 %ifdef PREFIX
33 : edgomez 1535 %ifdef MARK_FUNCS
34 : edgomez 1540 global _%1:function %1.endfunc-%1
35 :     %define %1 _%1:function %1.endfunc-%1
36 : Isibaar 1793 %define ENDFUNC .endfunc
37 : edgomez 1535 %else
38 :     global _%1
39 :     %define %1 _%1
40 : Isibaar 1793 %define ENDFUNC
41 : edgomez 1535 %endif
42 : edgomez 851 %else
43 : edgomez 1535 %ifdef MARK_FUNCS
44 : edgomez 1540 global %1:function %1.endfunc-%1
45 : Isibaar 1793 %define ENDFUNC .endfunc
46 : edgomez 1535 %else
47 :     global %1
48 : Isibaar 1793 %define ENDFUNC
49 : edgomez 1535 %endif
50 : edgomez 851 %endif
51 :     %endmacro
52 :    
53 : edgomez 1382 ;=============================================================================
54 :     ; Read only data
55 :     ;=============================================================================
56 :    
57 : edgomez 851 %ifdef FORMAT_COFF
58 : edgomez 1519 SECTION .rodata
59 : edgomez 851 %else
60 : edgomez 1519 SECTION .rodata align=16
61 : edgomez 851 %endif
62 :    
63 : edgomez 1382 ALIGN 16
64 :     mmx_one:
65 :     times 4 dw 1
66 : edgomez 851
67 : edgomez 1382 ;=============================================================================
68 :     ; Helper macros
69 :     ;=============================================================================
70 : edgomez 851
71 : edgomez 1382 ;; %1 block number (0..4)
72 :     %macro SAD_16x16_SSE 1
73 :     movq mm7, [eax]
74 :     movq mm6, [eax+8]
75 :     psadbw mm7, [edx]
76 :     psadbw mm6, [edx+8]
77 :     %if (%1)
78 :     paddd mm1, mm5
79 :     %endif
80 :     movq mm5, [eax+ecx]
81 :     movq mm4, [eax+ecx+8]
82 :     psadbw mm5, [edx+ecx]
83 :     psadbw mm4, [edx+ecx+8]
84 :     movq mm3, [eax+2*ecx]
85 :     movq mm2, [eax+2*ecx+8]
86 :     psadbw mm3, [edx+2*ecx]
87 :     psadbw mm2, [edx+2*ecx+8]
88 :     %if (%1)
89 :     movd [esp+4*(%1-1)], mm1
90 :     %else
91 :     sub esp, byte 12
92 :     %endif
93 :     movq mm1, [eax+ebx]
94 :     movq mm0, [eax+ebx+8]
95 :     psadbw mm1, [edx+ebx]
96 :     psadbw mm0, [edx+ebx+8]
97 :     lea eax, [eax+4*ecx]
98 :     lea edx, [edx+4*ecx]
99 :     paddd mm7, mm6
100 :     paddd mm5, mm4
101 :     paddd mm3, mm2
102 :     paddd mm1, mm0
103 :     paddd mm5, mm7
104 :     paddd mm1, mm3
105 :     %endmacro
106 : edgomez 851
107 : edgomez 1382 %macro SADBI_16x16_SSE0 0
108 :     movq mm2, [edx]
109 :     movq mm3, [edx+8]
110 :    
111 :     movq mm5, [byte eax]
112 :     movq mm6, [eax+8]
113 :     pavgb mm2, [byte ebx]
114 :     pavgb mm3, [ebx+8]
115 :    
116 :     add edx, ecx
117 :     psadbw mm5, mm2
118 :     psadbw mm6, mm3
119 :    
120 :     add eax, ecx
121 :     add ebx, ecx
122 :     movq mm2, [byte edx]
123 :    
124 :     movq mm3, [edx+8]
125 :     movq mm0, [byte eax]
126 :    
127 :     movq mm1, [eax+8]
128 :     pavgb mm2, [byte ebx]
129 :    
130 :     pavgb mm3, [ebx+8]
131 :     add edx, ecx
132 :     add eax, ecx
133 :    
134 :     add ebx, ecx
135 :     psadbw mm0, mm2
136 :     psadbw mm1, mm3
137 :    
138 :     %endmacro
139 :    
140 :     %macro SADBI_16x16_SSE 0
141 :     movq mm2, [byte edx]
142 :     movq mm3, [edx+8]
143 :     paddusw mm5, mm0
144 :     paddusw mm6, mm1
145 :     movq mm0, [eax]
146 :     movq mm1, [eax+8]
147 :     pavgb mm2, [ebx]
148 :     pavgb mm3, [ebx+8]
149 :     add edx, ecx
150 :     add eax, ecx
151 :     add ebx, ecx
152 :     psadbw mm0, mm2
153 :     psadbw mm1, mm3
154 :     %endmacro
155 :    
156 :     %macro SADBI_8x8_3dne 0
157 :     movq mm2, [edx]
158 :     movq mm3, [edx+ecx]
159 :     pavgb mm2, [eax]
160 :     pavgb mm3, [eax+ecx]
161 :     lea edx, [edx+2*ecx]
162 :     lea eax, [eax+2*ecx]
163 :     paddusw mm5, mm0
164 :     paddusw mm6, mm1
165 :     movq mm0, [ebx]
166 :     movq mm1, [ebx+ecx]
167 :     lea ebx, [ebx+2*ecx]
168 :     psadbw mm0, mm2
169 :     psadbw mm1, mm3
170 :     %endmacro
171 :    
172 :     %macro ABS_16x16_SSE 1
173 :     %if (%1 == 0)
174 :     movq mm7, [eax]
175 :     psadbw mm7, mm4
176 :     mov esi, esi
177 :     movq mm6, [eax+8]
178 :     movq mm5, [eax+ecx]
179 :     movq mm3, [eax+ecx+8]
180 :     psadbw mm6, mm4
181 :    
182 :     movq mm2, [byte eax+2*ecx]
183 :     psadbw mm5, mm4
184 :     movq mm1, [eax+2*ecx+8]
185 :     psadbw mm3, mm4
186 :    
187 : suxen_drol 1787 movq mm0, [eax+edx+0]
188 : edgomez 1382 psadbw mm2, mm4
189 :     add eax, edx
190 :     psadbw mm1, mm4
191 :     %endif
192 :     %if (%1 == 1)
193 :     psadbw mm0, mm4
194 :     paddd mm7, mm0
195 :     movq mm0, [eax+8]
196 :     psadbw mm0, mm4
197 :     paddd mm6, mm0
198 :    
199 :     movq mm0, [byte eax+ecx]
200 :     psadbw mm0, mm4
201 :    
202 :     paddd mm5, mm0
203 :     movq mm0, [eax+ecx+8]
204 :    
205 :     psadbw mm0, mm4
206 :     paddd mm3, mm0
207 :     movq mm0, [eax+2*ecx]
208 :     psadbw mm0, mm4
209 :     paddd mm2, mm0
210 :    
211 :     movq mm0, [eax+2*ecx+8]
212 :     add eax, edx
213 :     psadbw mm0, mm4
214 :     paddd mm1, mm0
215 :     movq mm0, [eax]
216 :     %endif
217 :     %if (%1 == 2)
218 :     psadbw mm0, mm4
219 :     paddd mm7, mm0
220 :     movq mm0, [eax+8]
221 :     psadbw mm0, mm4
222 :     paddd mm6, mm0
223 :     %endif
224 :     %endmacro
225 :    
226 :     ;=============================================================================
227 :     ; Code
228 :     ;=============================================================================
229 :    
230 :     SECTION .text
231 :    
232 :     cglobal sad16_3dne
233 :     cglobal sad8_3dne
234 :     cglobal sad16bi_3dne
235 :     cglobal sad8bi_3dne
236 :     cglobal dev16_3dne
237 :    
238 :     ;-----------------------------------------------------------------------------
239 : edgomez 851 ;
240 :     ; uint32_t sad16_3dne(const uint8_t * const cur,
241 : edgomez 1382 ; const uint8_t * const ref,
242 :     ; const uint32_t stride,
243 :     ; const uint32_t best_sad);
244 : edgomez 851 ;
245 : edgomez 1382 ;-----------------------------------------------------------------------------
246 :    
247 : edgomez 851 ; optimization: 21% faster
248 : edgomez 1382
249 :     ALIGN 16
250 : edgomez 851 sad16_3dne:
251 : edgomez 1382 mov eax, [esp+ 4] ; Src1
252 :     mov edx, [esp+ 8] ; Src2
253 :     mov ecx, [esp+12] ; Stride
254 :     push ebx
255 :     lea ebx, [2*ecx+ecx]
256 : edgomez 851
257 : edgomez 1382 SAD_16x16_SSE 0
258 :     SAD_16x16_SSE 1
259 :     SAD_16x16_SSE 2
260 :     SAD_16x16_SSE 3
261 : edgomez 851
262 : edgomez 1382 mov ecx, [esp]
263 :     add ecx, [esp+4]
264 :     add ecx, [esp+8]
265 :     paddd mm1, mm5
266 :     mov ebx, [esp+12]
267 :     add esp, byte 4+12
268 :     movd eax, mm1
269 :     add eax, ecx
270 : edgomez 851
271 : edgomez 1382 ret
272 : Isibaar 1793 ENDFUNC
273 : edgomez 1382
274 :    
275 :     ;-----------------------------------------------------------------------------
276 : edgomez 851 ;
277 :     ; uint32_t sad8_3dne(const uint8_t * const cur,
278 :     ; const uint8_t * const ref,
279 :     ; const uint32_t stride);
280 :     ;
281 : edgomez 1382 ;-----------------------------------------------------------------------------
282 :    
283 :     ALIGN 16
284 : edgomez 851 sad8_3dne:
285 :    
286 : edgomez 1382 mov eax, [esp+ 4] ; Src1
287 :     mov ecx, [esp+12] ; Stride
288 :     mov edx, [esp+ 8] ; Src2
289 :     push ebx
290 :     lea ebx, [ecx+2*ecx]
291 : edgomez 851
292 : edgomez 1382 movq mm0, [byte eax] ;0
293 :     psadbw mm0, [byte edx]
294 :     movq mm1, [eax+ecx] ;1
295 :     psadbw mm1, [edx+ecx]
296 : edgomez 851
297 : edgomez 1382 movq mm2, [eax+2*ecx] ;2
298 :     psadbw mm2, [edx+2*ecx]
299 :     movq mm3, [eax+ebx] ;3
300 :     psadbw mm3, [edx+ebx]
301 : edgomez 851
302 : edgomez 1382 paddd mm0, mm1
303 : edgomez 851
304 : edgomez 1382 movq mm4, [byte eax+4*ecx];4
305 :     psadbw mm4, [edx+4*ecx]
306 :     movq mm5, [eax+2*ebx] ;6
307 :     psadbw mm5, [edx+2*ebx]
308 : edgomez 851
309 : edgomez 1382 paddd mm2, mm3
310 :     paddd mm0, mm2
311 : edgomez 851
312 : edgomez 1382 lea ebx, [ebx+4*ecx] ;3+4=7
313 :     lea ecx, [ecx+4*ecx] ; 5
314 :     movq mm6, [eax+ecx] ;5
315 :     psadbw mm6, [edx+ecx]
316 :     movq mm7, [eax+ebx] ;7
317 :     psadbw mm7, [edx+ebx]
318 :     paddd mm4, mm5
319 :     paddd mm6, mm7
320 :     paddd mm0, mm4
321 :     mov ebx, [esp]
322 :     add esp, byte 4
323 :     paddd mm0, mm6
324 :     movd eax, mm0
325 : edgomez 851
326 : edgomez 1382 ret
327 : Isibaar 1793 ENDFUNC
328 : edgomez 851
329 : edgomez 1382
330 :     ;-----------------------------------------------------------------------------
331 : edgomez 851 ;
332 :     ; uint32_t sad16bi_3dne(const uint8_t * const cur,
333 :     ; const uint8_t * const ref1,
334 :     ; const uint8_t * const ref2,
335 :     ; const uint32_t stride);
336 :     ;
337 : edgomez 1382 ;-----------------------------------------------------------------------------
338 : edgomez 851 ;optimization: 14% faster
339 :    
340 : edgomez 1382 ALIGN 16
341 :     sad16bi_3dne:
342 :     mov eax, [esp+ 4] ; Src
343 :     mov edx, [esp+ 8] ; Ref1
344 :     mov ecx, [esp+16] ; Stride
345 :     push ebx
346 :     mov ebx, [esp+4+12] ; Ref2
347 : edgomez 851
348 : edgomez 1382 SADBI_16x16_SSE0
349 :     SADBI_16x16_SSE
350 :     SADBI_16x16_SSE
351 :     SADBI_16x16_SSE
352 :     SADBI_16x16_SSE
353 :     SADBI_16x16_SSE
354 :     SADBI_16x16_SSE
355 : edgomez 851
356 : edgomez 1382 SADBI_16x16_SSE
357 :     SADBI_16x16_SSE
358 :     SADBI_16x16_SSE
359 :     SADBI_16x16_SSE
360 :     SADBI_16x16_SSE
361 :     SADBI_16x16_SSE
362 :     SADBI_16x16_SSE
363 :     SADBI_16x16_SSE
364 :     paddusw mm5,mm0
365 :     paddusw mm6,mm1
366 : edgomez 851
367 : edgomez 1382 pop ebx
368 :     paddusw mm6,mm5
369 :     movd eax, mm6
370 : edgomez 851
371 : edgomez 1382 ret
372 : Isibaar 1793 ENDFUNC
373 : edgomez 851
374 : edgomez 1382 ;-----------------------------------------------------------------------------
375 :     ;
376 :     ; uint32_t sad8bi_3dne(const uint8_t * const cur,
377 :     ; const uint8_t * const ref1,
378 :     ; const uint8_t * const ref2,
379 :     ; const uint32_t stride);
380 :     ;
381 :     ;-----------------------------------------------------------------------------
382 : edgomez 851
383 : edgomez 1382 ALIGN 16
384 :     sad8bi_3dne:
385 :     mov eax, [esp+12] ; Ref2
386 :     mov edx, [esp+ 8] ; Ref1
387 :     mov ecx, [esp+16] ; Stride
388 :     push ebx
389 :     mov ebx, [esp+4+ 4] ; Src
390 : edgomez 851
391 : edgomez 1382 movq mm2, [edx]
392 :     movq mm3, [edx+ecx]
393 :     pavgb mm2, [eax]
394 :     pavgb mm3, [eax+ecx]
395 :     lea edx, [edx+2*ecx]
396 :     lea eax, [eax+2*ecx]
397 :     movq mm5, [ebx]
398 :     movq mm6, [ebx+ecx]
399 :     lea ebx, [ebx+2*ecx]
400 :     psadbw mm5, mm2
401 :     psadbw mm6, mm3
402 : edgomez 851
403 : edgomez 1382 movq mm2, [edx]
404 :     movq mm3, [edx+ecx]
405 :     pavgb mm2, [eax]
406 :     pavgb mm3, [eax+ecx]
407 :     lea edx, [edx+2*ecx]
408 :     lea eax, [eax+2*ecx]
409 :     movq mm0, [ebx]
410 :     movq mm1, [ebx+ecx]
411 :     lea ebx, [ebx+2*ecx]
412 :     psadbw mm0, mm2
413 :     psadbw mm1, mm3
414 : edgomez 851
415 : edgomez 1382 movq mm2, [edx]
416 :     movq mm3, [edx+ecx]
417 :     pavgb mm2, [eax]
418 :     pavgb mm3, [eax+ecx]
419 :     lea edx, [edx+2*ecx]
420 :     lea eax, [eax+2*ecx]
421 :     paddusw mm5,mm0
422 :     paddusw mm6,mm1
423 :     movq mm0, [ebx]
424 :     movq mm1, [ebx+ecx]
425 :     lea ebx, [ebx+2*ecx]
426 :     psadbw mm0, mm2
427 :     psadbw mm1, mm3
428 : edgomez 851
429 : edgomez 1382 movq mm2, [edx]
430 :     movq mm3, [edx+ecx]
431 :     pavgb mm2, [eax]
432 :     pavgb mm3, [eax+ecx]
433 :     paddusw mm5,mm0
434 :     paddusw mm6,mm1
435 :     movq mm0, [ebx]
436 :     movq mm1, [ebx+ecx]
437 :     psadbw mm0, mm2
438 :     psadbw mm1, mm3
439 :     paddusw mm5,mm0
440 :     paddusw mm6,mm1
441 : edgomez 851
442 : edgomez 1382 paddusw mm6,mm5
443 :     mov ebx,[esp]
444 :     add esp,byte 4
445 :     movd eax, mm6
446 : edgomez 851
447 : edgomez 1382 ret
448 : Isibaar 1793 ENDFUNC
449 : edgomez 851
450 :    
451 :     ;===========================================================================
452 :     ;
453 :     ; uint32_t dev16_3dne(const uint8_t * const cur,
454 :     ; const uint32_t stride);
455 :     ;
456 :     ;===========================================================================
457 :     ; optimization: 25 % faster
458 :    
459 : edgomez 1382 ALIGN 16
460 :     dev16_3dne:
461 : edgomez 851
462 : edgomez 1382 mov eax, [esp+ 4] ; Src
463 :     mov ecx, [esp+ 8] ; Stride
464 :     lea edx, [ecx+2*ecx]
465 : edgomez 851
466 : edgomez 1382 pxor mm4, mm4
467 : edgomez 851
468 : edgomez 1382 ALIGN 8
469 :     ABS_16x16_SSE 0
470 :     ABS_16x16_SSE 1
471 :     ABS_16x16_SSE 1
472 :     ABS_16x16_SSE 1
473 :     ABS_16x16_SSE 1
474 : edgomez 851
475 : edgomez 1382 paddd mm1, mm2
476 :     paddd mm3, mm5
477 : edgomez 851
478 : edgomez 1382 ABS_16x16_SSE 2
479 : edgomez 851
480 : edgomez 1382 paddd mm7, mm6
481 :     paddd mm1, mm3
482 :     mov eax, [esp+ 4] ; Src
483 :     paddd mm7, mm1
484 :     punpcklbw mm7, mm7 ;xxyyaazz
485 :     pshufw mm4, mm7, 055h ; mm4 contains the mean
486 :    
487 :    
488 :     pxor mm1, mm1
489 :    
490 :     ABS_16x16_SSE 0
491 :     ABS_16x16_SSE 1
492 :     ABS_16x16_SSE 1
493 :     ABS_16x16_SSE 1
494 :     ABS_16x16_SSE 1
495 :    
496 :     paddd mm1, mm2
497 :     paddd mm3, mm5
498 :    
499 :     ABS_16x16_SSE 2
500 :    
501 :     paddd mm7, mm6
502 :     paddd mm1, mm3
503 :     paddd mm7, mm1
504 :     movd eax, mm7
505 :    
506 :     ret
507 : Isibaar 1793 ENDFUNC
508 : edgomez 1540
509 : Isibaar 1790
510 :     %ifidn __OUTPUT_FORMAT__,elf
511 :     section ".note.GNU-stack" noalloc noexec nowrite progbits
512 :     %endif
513 :    

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