[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 1787 - (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 : suxen_drol 1787 ; * $Id: sad_3dne.asm,v 1.7 2007-09-11 12:41:13 suxen_drol 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 : edgomez 1535 %else
37 :     global _%1
38 :     %define %1 _%1
39 :     %endif
40 : edgomez 851 %else
41 : edgomez 1535 %ifdef MARK_FUNCS
42 : edgomez 1540 global %1:function %1.endfunc-%1
43 : edgomez 1535 %else
44 :     global %1
45 :     %endif
46 : edgomez 851 %endif
47 :     %endmacro
48 :    
49 : edgomez 1382 ;=============================================================================
50 :     ; Read only data
51 :     ;=============================================================================
52 :    
53 : edgomez 851 %ifdef FORMAT_COFF
54 : edgomez 1519 SECTION .rodata
55 : edgomez 851 %else
56 : edgomez 1519 SECTION .rodata align=16
57 : edgomez 851 %endif
58 :    
59 : edgomez 1382 ALIGN 16
60 :     mmx_one:
61 :     times 4 dw 1
62 : edgomez 851
63 : edgomez 1382 ;=============================================================================
64 :     ; Helper macros
65 :     ;=============================================================================
66 : edgomez 851
67 : edgomez 1382 ;; %1 block number (0..4)
68 :     %macro SAD_16x16_SSE 1
69 :     movq mm7, [eax]
70 :     movq mm6, [eax+8]
71 :     psadbw mm7, [edx]
72 :     psadbw mm6, [edx+8]
73 :     %if (%1)
74 :     paddd mm1, mm5
75 :     %endif
76 :     movq mm5, [eax+ecx]
77 :     movq mm4, [eax+ecx+8]
78 :     psadbw mm5, [edx+ecx]
79 :     psadbw mm4, [edx+ecx+8]
80 :     movq mm3, [eax+2*ecx]
81 :     movq mm2, [eax+2*ecx+8]
82 :     psadbw mm3, [edx+2*ecx]
83 :     psadbw mm2, [edx+2*ecx+8]
84 :     %if (%1)
85 :     movd [esp+4*(%1-1)], mm1
86 :     %else
87 :     sub esp, byte 12
88 :     %endif
89 :     movq mm1, [eax+ebx]
90 :     movq mm0, [eax+ebx+8]
91 :     psadbw mm1, [edx+ebx]
92 :     psadbw mm0, [edx+ebx+8]
93 :     lea eax, [eax+4*ecx]
94 :     lea edx, [edx+4*ecx]
95 :     paddd mm7, mm6
96 :     paddd mm5, mm4
97 :     paddd mm3, mm2
98 :     paddd mm1, mm0
99 :     paddd mm5, mm7
100 :     paddd mm1, mm3
101 :     %endmacro
102 : edgomez 851
103 : edgomez 1382 %macro SADBI_16x16_SSE0 0
104 :     movq mm2, [edx]
105 :     movq mm3, [edx+8]
106 :    
107 :     movq mm5, [byte eax]
108 :     movq mm6, [eax+8]
109 :     pavgb mm2, [byte ebx]
110 :     pavgb mm3, [ebx+8]
111 :    
112 :     add edx, ecx
113 :     psadbw mm5, mm2
114 :     psadbw mm6, mm3
115 :    
116 :     add eax, ecx
117 :     add ebx, ecx
118 :     movq mm2, [byte edx]
119 :    
120 :     movq mm3, [edx+8]
121 :     movq mm0, [byte eax]
122 :    
123 :     movq mm1, [eax+8]
124 :     pavgb mm2, [byte ebx]
125 :    
126 :     pavgb mm3, [ebx+8]
127 :     add edx, ecx
128 :     add eax, ecx
129 :    
130 :     add ebx, ecx
131 :     psadbw mm0, mm2
132 :     psadbw mm1, mm3
133 :    
134 :     %endmacro
135 :    
136 :     %macro SADBI_16x16_SSE 0
137 :     movq mm2, [byte edx]
138 :     movq mm3, [edx+8]
139 :     paddusw mm5, mm0
140 :     paddusw mm6, mm1
141 :     movq mm0, [eax]
142 :     movq mm1, [eax+8]
143 :     pavgb mm2, [ebx]
144 :     pavgb mm3, [ebx+8]
145 :     add edx, ecx
146 :     add eax, ecx
147 :     add ebx, ecx
148 :     psadbw mm0, mm2
149 :     psadbw mm1, mm3
150 :     %endmacro
151 :    
152 :     %macro SADBI_8x8_3dne 0
153 :     movq mm2, [edx]
154 :     movq mm3, [edx+ecx]
155 :     pavgb mm2, [eax]
156 :     pavgb mm3, [eax+ecx]
157 :     lea edx, [edx+2*ecx]
158 :     lea eax, [eax+2*ecx]
159 :     paddusw mm5, mm0
160 :     paddusw mm6, mm1
161 :     movq mm0, [ebx]
162 :     movq mm1, [ebx+ecx]
163 :     lea ebx, [ebx+2*ecx]
164 :     psadbw mm0, mm2
165 :     psadbw mm1, mm3
166 :     %endmacro
167 :    
168 :     %macro ABS_16x16_SSE 1
169 :     %if (%1 == 0)
170 :     movq mm7, [eax]
171 :     psadbw mm7, mm4
172 :     mov esi, esi
173 :     movq mm6, [eax+8]
174 :     movq mm5, [eax+ecx]
175 :     movq mm3, [eax+ecx+8]
176 :     psadbw mm6, mm4
177 :    
178 :     movq mm2, [byte eax+2*ecx]
179 :     psadbw mm5, mm4
180 :     movq mm1, [eax+2*ecx+8]
181 :     psadbw mm3, mm4
182 :    
183 : suxen_drol 1787 movq mm0, [eax+edx+0]
184 : edgomez 1382 psadbw mm2, mm4
185 :     add eax, edx
186 :     psadbw mm1, mm4
187 :     %endif
188 :     %if (%1 == 1)
189 :     psadbw mm0, mm4
190 :     paddd mm7, mm0
191 :     movq mm0, [eax+8]
192 :     psadbw mm0, mm4
193 :     paddd mm6, mm0
194 :    
195 :     movq mm0, [byte eax+ecx]
196 :     psadbw mm0, mm4
197 :    
198 :     paddd mm5, mm0
199 :     movq mm0, [eax+ecx+8]
200 :    
201 :     psadbw mm0, mm4
202 :     paddd mm3, mm0
203 :     movq mm0, [eax+2*ecx]
204 :     psadbw mm0, mm4
205 :     paddd mm2, mm0
206 :    
207 :     movq mm0, [eax+2*ecx+8]
208 :     add eax, edx
209 :     psadbw mm0, mm4
210 :     paddd mm1, mm0
211 :     movq mm0, [eax]
212 :     %endif
213 :     %if (%1 == 2)
214 :     psadbw mm0, mm4
215 :     paddd mm7, mm0
216 :     movq mm0, [eax+8]
217 :     psadbw mm0, mm4
218 :     paddd mm6, mm0
219 :     %endif
220 :     %endmacro
221 :    
222 :     ;=============================================================================
223 :     ; Code
224 :     ;=============================================================================
225 :    
226 :     SECTION .text
227 :    
228 :     cglobal sad16_3dne
229 :     cglobal sad8_3dne
230 :     cglobal sad16bi_3dne
231 :     cglobal sad8bi_3dne
232 :     cglobal dev16_3dne
233 :    
234 :     ;-----------------------------------------------------------------------------
235 : edgomez 851 ;
236 :     ; uint32_t sad16_3dne(const uint8_t * const cur,
237 : edgomez 1382 ; const uint8_t * const ref,
238 :     ; const uint32_t stride,
239 :     ; const uint32_t best_sad);
240 : edgomez 851 ;
241 : edgomez 1382 ;-----------------------------------------------------------------------------
242 :    
243 : edgomez 851 ; optimization: 21% faster
244 : edgomez 1382
245 :     ALIGN 16
246 : edgomez 851 sad16_3dne:
247 : edgomez 1382 mov eax, [esp+ 4] ; Src1
248 :     mov edx, [esp+ 8] ; Src2
249 :     mov ecx, [esp+12] ; Stride
250 :     push ebx
251 :     lea ebx, [2*ecx+ecx]
252 : edgomez 851
253 : edgomez 1382 SAD_16x16_SSE 0
254 :     SAD_16x16_SSE 1
255 :     SAD_16x16_SSE 2
256 :     SAD_16x16_SSE 3
257 : edgomez 851
258 : edgomez 1382 mov ecx, [esp]
259 :     add ecx, [esp+4]
260 :     add ecx, [esp+8]
261 :     paddd mm1, mm5
262 :     mov ebx, [esp+12]
263 :     add esp, byte 4+12
264 :     movd eax, mm1
265 :     add eax, ecx
266 : edgomez 851
267 : edgomez 1382 ret
268 : edgomez 1540 .endfunc
269 : edgomez 1382
270 :    
271 :     ;-----------------------------------------------------------------------------
272 : edgomez 851 ;
273 :     ; uint32_t sad8_3dne(const uint8_t * const cur,
274 :     ; const uint8_t * const ref,
275 :     ; const uint32_t stride);
276 :     ;
277 : edgomez 1382 ;-----------------------------------------------------------------------------
278 :    
279 :     ALIGN 16
280 : edgomez 851 sad8_3dne:
281 :    
282 : edgomez 1382 mov eax, [esp+ 4] ; Src1
283 :     mov ecx, [esp+12] ; Stride
284 :     mov edx, [esp+ 8] ; Src2
285 :     push ebx
286 :     lea ebx, [ecx+2*ecx]
287 : edgomez 851
288 : edgomez 1382 movq mm0, [byte eax] ;0
289 :     psadbw mm0, [byte edx]
290 :     movq mm1, [eax+ecx] ;1
291 :     psadbw mm1, [edx+ecx]
292 : edgomez 851
293 : edgomez 1382 movq mm2, [eax+2*ecx] ;2
294 :     psadbw mm2, [edx+2*ecx]
295 :     movq mm3, [eax+ebx] ;3
296 :     psadbw mm3, [edx+ebx]
297 : edgomez 851
298 : edgomez 1382 paddd mm0, mm1
299 : edgomez 851
300 : edgomez 1382 movq mm4, [byte eax+4*ecx];4
301 :     psadbw mm4, [edx+4*ecx]
302 :     movq mm5, [eax+2*ebx] ;6
303 :     psadbw mm5, [edx+2*ebx]
304 : edgomez 851
305 : edgomez 1382 paddd mm2, mm3
306 :     paddd mm0, mm2
307 : edgomez 851
308 : edgomez 1382 lea ebx, [ebx+4*ecx] ;3+4=7
309 :     lea ecx, [ecx+4*ecx] ; 5
310 :     movq mm6, [eax+ecx] ;5
311 :     psadbw mm6, [edx+ecx]
312 :     movq mm7, [eax+ebx] ;7
313 :     psadbw mm7, [edx+ebx]
314 :     paddd mm4, mm5
315 :     paddd mm6, mm7
316 :     paddd mm0, mm4
317 :     mov ebx, [esp]
318 :     add esp, byte 4
319 :     paddd mm0, mm6
320 :     movd eax, mm0
321 : edgomez 851
322 : edgomez 1382 ret
323 : edgomez 1540 .endfunc
324 : edgomez 851
325 : edgomez 1382
326 :     ;-----------------------------------------------------------------------------
327 : edgomez 851 ;
328 :     ; uint32_t sad16bi_3dne(const uint8_t * const cur,
329 :     ; const uint8_t * const ref1,
330 :     ; const uint8_t * const ref2,
331 :     ; const uint32_t stride);
332 :     ;
333 : edgomez 1382 ;-----------------------------------------------------------------------------
334 : edgomez 851 ;optimization: 14% faster
335 :    
336 : edgomez 1382 ALIGN 16
337 :     sad16bi_3dne:
338 :     mov eax, [esp+ 4] ; Src
339 :     mov edx, [esp+ 8] ; Ref1
340 :     mov ecx, [esp+16] ; Stride
341 :     push ebx
342 :     mov ebx, [esp+4+12] ; Ref2
343 : edgomez 851
344 : edgomez 1382 SADBI_16x16_SSE0
345 :     SADBI_16x16_SSE
346 :     SADBI_16x16_SSE
347 :     SADBI_16x16_SSE
348 :     SADBI_16x16_SSE
349 :     SADBI_16x16_SSE
350 :     SADBI_16x16_SSE
351 : edgomez 851
352 : edgomez 1382 SADBI_16x16_SSE
353 :     SADBI_16x16_SSE
354 :     SADBI_16x16_SSE
355 :     SADBI_16x16_SSE
356 :     SADBI_16x16_SSE
357 :     SADBI_16x16_SSE
358 :     SADBI_16x16_SSE
359 :     SADBI_16x16_SSE
360 :     paddusw mm5,mm0
361 :     paddusw mm6,mm1
362 : edgomez 851
363 : edgomez 1382 pop ebx
364 :     paddusw mm6,mm5
365 :     movd eax, mm6
366 : edgomez 851
367 : edgomez 1382 ret
368 : edgomez 1540 .endfunc
369 : edgomez 851
370 : edgomez 1382 ;-----------------------------------------------------------------------------
371 :     ;
372 :     ; uint32_t sad8bi_3dne(const uint8_t * const cur,
373 :     ; const uint8_t * const ref1,
374 :     ; const uint8_t * const ref2,
375 :     ; const uint32_t stride);
376 :     ;
377 :     ;-----------------------------------------------------------------------------
378 : edgomez 851
379 : edgomez 1382 ALIGN 16
380 :     sad8bi_3dne:
381 :     mov eax, [esp+12] ; Ref2
382 :     mov edx, [esp+ 8] ; Ref1
383 :     mov ecx, [esp+16] ; Stride
384 :     push ebx
385 :     mov ebx, [esp+4+ 4] ; Src
386 : edgomez 851
387 : edgomez 1382 movq mm2, [edx]
388 :     movq mm3, [edx+ecx]
389 :     pavgb mm2, [eax]
390 :     pavgb mm3, [eax+ecx]
391 :     lea edx, [edx+2*ecx]
392 :     lea eax, [eax+2*ecx]
393 :     movq mm5, [ebx]
394 :     movq mm6, [ebx+ecx]
395 :     lea ebx, [ebx+2*ecx]
396 :     psadbw mm5, mm2
397 :     psadbw mm6, mm3
398 : edgomez 851
399 : edgomez 1382 movq mm2, [edx]
400 :     movq mm3, [edx+ecx]
401 :     pavgb mm2, [eax]
402 :     pavgb mm3, [eax+ecx]
403 :     lea edx, [edx+2*ecx]
404 :     lea eax, [eax+2*ecx]
405 :     movq mm0, [ebx]
406 :     movq mm1, [ebx+ecx]
407 :     lea ebx, [ebx+2*ecx]
408 :     psadbw mm0, mm2
409 :     psadbw mm1, mm3
410 : edgomez 851
411 : edgomez 1382 movq mm2, [edx]
412 :     movq mm3, [edx+ecx]
413 :     pavgb mm2, [eax]
414 :     pavgb mm3, [eax+ecx]
415 :     lea edx, [edx+2*ecx]
416 :     lea eax, [eax+2*ecx]
417 :     paddusw mm5,mm0
418 :     paddusw mm6,mm1
419 :     movq mm0, [ebx]
420 :     movq mm1, [ebx+ecx]
421 :     lea ebx, [ebx+2*ecx]
422 :     psadbw mm0, mm2
423 :     psadbw mm1, mm3
424 : edgomez 851
425 : edgomez 1382 movq mm2, [edx]
426 :     movq mm3, [edx+ecx]
427 :     pavgb mm2, [eax]
428 :     pavgb mm3, [eax+ecx]
429 :     paddusw mm5,mm0
430 :     paddusw mm6,mm1
431 :     movq mm0, [ebx]
432 :     movq mm1, [ebx+ecx]
433 :     psadbw mm0, mm2
434 :     psadbw mm1, mm3
435 :     paddusw mm5,mm0
436 :     paddusw mm6,mm1
437 : edgomez 851
438 : edgomez 1382 paddusw mm6,mm5
439 :     mov ebx,[esp]
440 :     add esp,byte 4
441 :     movd eax, mm6
442 : edgomez 851
443 : edgomez 1382 ret
444 : edgomez 1540 .endfunc
445 : edgomez 851
446 :    
447 :     ;===========================================================================
448 :     ;
449 :     ; uint32_t dev16_3dne(const uint8_t * const cur,
450 :     ; const uint32_t stride);
451 :     ;
452 :     ;===========================================================================
453 :     ; optimization: 25 % faster
454 :    
455 : edgomez 1382 ALIGN 16
456 :     dev16_3dne:
457 : edgomez 851
458 : edgomez 1382 mov eax, [esp+ 4] ; Src
459 :     mov ecx, [esp+ 8] ; Stride
460 :     lea edx, [ecx+2*ecx]
461 : edgomez 851
462 : edgomez 1382 pxor mm4, mm4
463 : edgomez 851
464 : edgomez 1382 ALIGN 8
465 :     ABS_16x16_SSE 0
466 :     ABS_16x16_SSE 1
467 :     ABS_16x16_SSE 1
468 :     ABS_16x16_SSE 1
469 :     ABS_16x16_SSE 1
470 : edgomez 851
471 : edgomez 1382 paddd mm1, mm2
472 :     paddd mm3, mm5
473 : edgomez 851
474 : edgomez 1382 ABS_16x16_SSE 2
475 : edgomez 851
476 : edgomez 1382 paddd mm7, mm6
477 :     paddd mm1, mm3
478 :     mov eax, [esp+ 4] ; Src
479 :     paddd mm7, mm1
480 :     punpcklbw mm7, mm7 ;xxyyaazz
481 :     pshufw mm4, mm7, 055h ; mm4 contains the mean
482 :    
483 :    
484 :     pxor mm1, mm1
485 :    
486 :     ABS_16x16_SSE 0
487 :     ABS_16x16_SSE 1
488 :     ABS_16x16_SSE 1
489 :     ABS_16x16_SSE 1
490 :     ABS_16x16_SSE 1
491 :    
492 :     paddd mm1, mm2
493 :     paddd mm3, mm5
494 :    
495 :     ABS_16x16_SSE 2
496 :    
497 :     paddd mm7, mm6
498 :     paddd mm1, mm3
499 :     paddd mm7, mm1
500 :     movd eax, mm7
501 :    
502 :     ret
503 : edgomez 1540 .endfunc
504 :    

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