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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.9 - (view) (download)

1 : edgomez 1.3 ;/****************************************************************************
2 : edgomez 1.2 ; *
3 : edgomez 1.3 ; * XVID MPEG-4 VIDEO CODEC
4 :     ; * - K7 optimized SAD operators -
5 : edgomez 1.2 ; *
6 : edgomez 1.3 ; * Copyright(C) 2002 Jaan Kalda
7 : edgomez 1.2 ; *
8 : edgomez 1.3 ; * 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 1.2 ; *
13 : edgomez 1.3 ; * 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 1.2 ; *
18 : edgomez 1.3 ; * 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 1.2 ; *
22 : Isibaar 1.9 ; * $Id: sad_3dne.asm,v 1.8 2008/08/19 09:06:48 Isibaar Exp $
23 : edgomez 1.3 ; *
24 :     ; ***************************************************************************/
25 :    
26 :     ; these 3dne functions are compatible with iSSE, but are optimized specifically
27 :     ; for K7 pipelines
28 : edgomez 1.2
29 : edgomez 1.3 BITS 32
30 : edgomez 1.2
31 : edgomez 1.3 %macro cglobal 1
32 : edgomez 1.2 %ifdef PREFIX
33 : edgomez 1.5 %ifdef MARK_FUNCS
34 : edgomez 1.6 global _%1:function %1.endfunc-%1
35 :     %define %1 _%1:function %1.endfunc-%1
36 : Isibaar 1.9 %define ENDFUNC .endfunc
37 : edgomez 1.5 %else
38 :     global _%1
39 :     %define %1 _%1
40 : Isibaar 1.9 %define ENDFUNC
41 : edgomez 1.5 %endif
42 : edgomez 1.2 %else
43 : edgomez 1.5 %ifdef MARK_FUNCS
44 : edgomez 1.6 global %1:function %1.endfunc-%1
45 : Isibaar 1.9 %define ENDFUNC .endfunc
46 : edgomez 1.5 %else
47 :     global %1
48 : Isibaar 1.9 %define ENDFUNC
49 : edgomez 1.5 %endif
50 : edgomez 1.2 %endif
51 :     %endmacro
52 :    
53 : edgomez 1.3 ;=============================================================================
54 :     ; Read only data
55 :     ;=============================================================================
56 :    
57 : edgomez 1.2 %ifdef FORMAT_COFF
58 : edgomez 1.4 SECTION .rodata
59 : edgomez 1.3 %else
60 : edgomez 1.4 SECTION .rodata align=16
61 : edgomez 1.3 %endif
62 :    
63 :     ALIGN 16
64 :     mmx_one:
65 :     times 4 dw 1
66 :    
67 :     ;=============================================================================
68 :     ; Helper macros
69 :     ;=============================================================================
70 :    
71 :     ;; %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 : edgomez 1.2 %else
91 : edgomez 1.3 sub esp, byte 12
92 : edgomez 1.2 %endif
93 : edgomez 1.3 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 :    
107 :     %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 : edgomez 1.2
156 : edgomez 1.3 %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 : edgomez 1.2
172 : edgomez 1.3 %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 1.7 movq mm0, [eax+edx+0]
188 : edgomez 1.3 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 : edgomez 1.2
226 : edgomez 1.3 ;=============================================================================
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 : edgomez 1.2
238 : edgomez 1.3 ;-----------------------------------------------------------------------------
239 : edgomez 1.2 ;
240 :     ; uint32_t sad16_3dne(const uint8_t * const cur,
241 : edgomez 1.3 ; const uint8_t * const ref,
242 :     ; const uint32_t stride,
243 :     ; const uint32_t best_sad);
244 : edgomez 1.2 ;
245 : edgomez 1.3 ;-----------------------------------------------------------------------------
246 :    
247 : edgomez 1.2 ; optimization: 21% faster
248 : edgomez 1.3
249 :     ALIGN 16
250 : edgomez 1.2 sad16_3dne:
251 : edgomez 1.3 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 :    
257 :     SAD_16x16_SSE 0
258 :     SAD_16x16_SSE 1
259 :     SAD_16x16_SSE 2
260 :     SAD_16x16_SSE 3
261 :    
262 :     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 1.2
271 : edgomez 1.3 ret
272 : Isibaar 1.9 ENDFUNC
273 : edgomez 1.2
274 :    
275 : edgomez 1.3 ;-----------------------------------------------------------------------------
276 : edgomez 1.2 ;
277 :     ; uint32_t sad8_3dne(const uint8_t * const cur,
278 :     ; const uint8_t * const ref,
279 :     ; const uint32_t stride);
280 :     ;
281 : edgomez 1.3 ;-----------------------------------------------------------------------------
282 :    
283 :     ALIGN 16
284 : edgomez 1.2 sad8_3dne:
285 :    
286 : edgomez 1.3 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 :    
292 :     movq mm0, [byte eax] ;0
293 :     psadbw mm0, [byte edx]
294 :     movq mm1, [eax+ecx] ;1
295 :     psadbw mm1, [edx+ecx]
296 :    
297 :     movq mm2, [eax+2*ecx] ;2
298 :     psadbw mm2, [edx+2*ecx]
299 :     movq mm3, [eax+ebx] ;3
300 :     psadbw mm3, [edx+ebx]
301 :    
302 :     paddd mm0, mm1
303 :    
304 :     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 :    
309 :     paddd mm2, mm3
310 :     paddd mm0, mm2
311 :    
312 :     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 1.2
326 : edgomez 1.3 ret
327 : Isibaar 1.9 ENDFUNC
328 : edgomez 1.2
329 :    
330 : edgomez 1.3 ;-----------------------------------------------------------------------------
331 : edgomez 1.2 ;
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 1.3 ;-----------------------------------------------------------------------------
338 : edgomez 1.2 ;optimization: 14% faster
339 :    
340 : edgomez 1.3 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 :    
348 :     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 :    
356 :     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 :    
367 :     pop ebx
368 :     paddusw mm6,mm5
369 :     movd eax, mm6
370 :    
371 :     ret
372 : Isibaar 1.9 ENDFUNC
373 : edgomez 1.3
374 :     ;-----------------------------------------------------------------------------
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 1.2
383 : edgomez 1.3 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 :    
391 :     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 :    
403 :     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 :    
415 :     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 :    
429 :     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 :    
442 :     paddusw mm6,mm5
443 :     mov ebx,[esp]
444 :     add esp,byte 4
445 :     movd eax, mm6
446 : edgomez 1.2
447 : edgomez 1.3 ret
448 : Isibaar 1.9 ENDFUNC
449 : edgomez 1.2
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 1.3 ALIGN 16
460 : edgomez 1.2 dev16_3dne:
461 :    
462 : edgomez 1.3 mov eax, [esp+ 4] ; Src
463 :     mov ecx, [esp+ 8] ; Stride
464 :     lea edx, [ecx+2*ecx]
465 :    
466 :     pxor mm4, mm4
467 :    
468 :     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 :    
475 :     paddd mm1, mm2
476 :     paddd mm3, mm5
477 :    
478 :     ABS_16x16_SSE 2
479 :    
480 :     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 1.9 ENDFUNC
508 : edgomez 1.6
509 : Isibaar 1.8
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