[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 1535 - (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 : edgomez 1535 ; * $Id: sad_3dne.asm,v 1.5 2004-08-22 11:46:10 edgomez 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 :     global _%1:function
35 :     %define %1 _%1:function
36 :     %else
37 :     global _%1
38 :     %define %1 _%1
39 :     %endif
40 : edgomez 851 %else
41 : edgomez 1535 %ifdef MARK_FUNCS
42 :     global %1:function
43 :     %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 :     movq mm0, [dword eax+edx]
184 :     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 :    
269 :    
270 :     ;-----------------------------------------------------------------------------
271 : edgomez 851 ;
272 :     ; uint32_t sad8_3dne(const uint8_t * const cur,
273 :     ; const uint8_t * const ref,
274 :     ; const uint32_t stride);
275 :     ;
276 : edgomez 1382 ;-----------------------------------------------------------------------------
277 :    
278 :     ALIGN 16
279 : edgomez 851 sad8_3dne:
280 :    
281 : edgomez 1382 mov eax, [esp+ 4] ; Src1
282 :     mov ecx, [esp+12] ; Stride
283 :     mov edx, [esp+ 8] ; Src2
284 :     push ebx
285 :     lea ebx, [ecx+2*ecx]
286 : edgomez 851
287 : edgomez 1382 movq mm0, [byte eax] ;0
288 :     psadbw mm0, [byte edx]
289 :     movq mm1, [eax+ecx] ;1
290 :     psadbw mm1, [edx+ecx]
291 : edgomez 851
292 : edgomez 1382 movq mm2, [eax+2*ecx] ;2
293 :     psadbw mm2, [edx+2*ecx]
294 :     movq mm3, [eax+ebx] ;3
295 :     psadbw mm3, [edx+ebx]
296 : edgomez 851
297 : edgomez 1382 paddd mm0, mm1
298 : edgomez 851
299 : edgomez 1382 movq mm4, [byte eax+4*ecx];4
300 :     psadbw mm4, [edx+4*ecx]
301 :     movq mm5, [eax+2*ebx] ;6
302 :     psadbw mm5, [edx+2*ebx]
303 : edgomez 851
304 : edgomez 1382 paddd mm2, mm3
305 :     paddd mm0, mm2
306 : edgomez 851
307 : edgomez 1382 lea ebx, [ebx+4*ecx] ;3+4=7
308 :     lea ecx, [ecx+4*ecx] ; 5
309 :     movq mm6, [eax+ecx] ;5
310 :     psadbw mm6, [edx+ecx]
311 :     movq mm7, [eax+ebx] ;7
312 :     psadbw mm7, [edx+ebx]
313 :     paddd mm4, mm5
314 :     paddd mm6, mm7
315 :     paddd mm0, mm4
316 :     mov ebx, [esp]
317 :     add esp, byte 4
318 :     paddd mm0, mm6
319 :     movd eax, mm0
320 : edgomez 851
321 : edgomez 1382 ret
322 : edgomez 851
323 : edgomez 1382
324 :     ;-----------------------------------------------------------------------------
325 : edgomez 851 ;
326 :     ; uint32_t sad16bi_3dne(const uint8_t * const cur,
327 :     ; const uint8_t * const ref1,
328 :     ; const uint8_t * const ref2,
329 :     ; const uint32_t stride);
330 :     ;
331 : edgomez 1382 ;-----------------------------------------------------------------------------
332 : edgomez 851 ;optimization: 14% faster
333 :    
334 : edgomez 1382 ALIGN 16
335 :     sad16bi_3dne:
336 :     mov eax, [esp+ 4] ; Src
337 :     mov edx, [esp+ 8] ; Ref1
338 :     mov ecx, [esp+16] ; Stride
339 :     push ebx
340 :     mov ebx, [esp+4+12] ; Ref2
341 : edgomez 851
342 : edgomez 1382 SADBI_16x16_SSE0
343 :     SADBI_16x16_SSE
344 :     SADBI_16x16_SSE
345 :     SADBI_16x16_SSE
346 :     SADBI_16x16_SSE
347 :     SADBI_16x16_SSE
348 :     SADBI_16x16_SSE
349 : edgomez 851
350 : edgomez 1382 SADBI_16x16_SSE
351 :     SADBI_16x16_SSE
352 :     SADBI_16x16_SSE
353 :     SADBI_16x16_SSE
354 :     SADBI_16x16_SSE
355 :     SADBI_16x16_SSE
356 :     SADBI_16x16_SSE
357 :     SADBI_16x16_SSE
358 :     paddusw mm5,mm0
359 :     paddusw mm6,mm1
360 : edgomez 851
361 : edgomez 1382 pop ebx
362 :     paddusw mm6,mm5
363 :     movd eax, mm6
364 : edgomez 851
365 : edgomez 1382 ret
366 : edgomez 851
367 : edgomez 1382 ;-----------------------------------------------------------------------------
368 :     ;
369 :     ; uint32_t sad8bi_3dne(const uint8_t * const cur,
370 :     ; const uint8_t * const ref1,
371 :     ; const uint8_t * const ref2,
372 :     ; const uint32_t stride);
373 :     ;
374 :     ;-----------------------------------------------------------------------------
375 : edgomez 851
376 : edgomez 1382 ALIGN 16
377 :     sad8bi_3dne:
378 :     mov eax, [esp+12] ; Ref2
379 :     mov edx, [esp+ 8] ; Ref1
380 :     mov ecx, [esp+16] ; Stride
381 :     push ebx
382 :     mov ebx, [esp+4+ 4] ; Src
383 : edgomez 851
384 : edgomez 1382 movq mm2, [edx]
385 :     movq mm3, [edx+ecx]
386 :     pavgb mm2, [eax]
387 :     pavgb mm3, [eax+ecx]
388 :     lea edx, [edx+2*ecx]
389 :     lea eax, [eax+2*ecx]
390 :     movq mm5, [ebx]
391 :     movq mm6, [ebx+ecx]
392 :     lea ebx, [ebx+2*ecx]
393 :     psadbw mm5, mm2
394 :     psadbw mm6, mm3
395 : edgomez 851
396 : edgomez 1382 movq mm2, [edx]
397 :     movq mm3, [edx+ecx]
398 :     pavgb mm2, [eax]
399 :     pavgb mm3, [eax+ecx]
400 :     lea edx, [edx+2*ecx]
401 :     lea eax, [eax+2*ecx]
402 :     movq mm0, [ebx]
403 :     movq mm1, [ebx+ecx]
404 :     lea ebx, [ebx+2*ecx]
405 :     psadbw mm0, mm2
406 :     psadbw mm1, mm3
407 : edgomez 851
408 : edgomez 1382 movq mm2, [edx]
409 :     movq mm3, [edx+ecx]
410 :     pavgb mm2, [eax]
411 :     pavgb mm3, [eax+ecx]
412 :     lea edx, [edx+2*ecx]
413 :     lea eax, [eax+2*ecx]
414 :     paddusw mm5,mm0
415 :     paddusw mm6,mm1
416 :     movq mm0, [ebx]
417 :     movq mm1, [ebx+ecx]
418 :     lea ebx, [ebx+2*ecx]
419 :     psadbw mm0, mm2
420 :     psadbw mm1, mm3
421 : edgomez 851
422 : edgomez 1382 movq mm2, [edx]
423 :     movq mm3, [edx+ecx]
424 :     pavgb mm2, [eax]
425 :     pavgb mm3, [eax+ecx]
426 :     paddusw mm5,mm0
427 :     paddusw mm6,mm1
428 :     movq mm0, [ebx]
429 :     movq mm1, [ebx+ecx]
430 :     psadbw mm0, mm2
431 :     psadbw mm1, mm3
432 :     paddusw mm5,mm0
433 :     paddusw mm6,mm1
434 : edgomez 851
435 : edgomez 1382 paddusw mm6,mm5
436 :     mov ebx,[esp]
437 :     add esp,byte 4
438 :     movd eax, mm6
439 : edgomez 851
440 : edgomez 1382 ret
441 : edgomez 851
442 :    
443 :     ;===========================================================================
444 :     ;
445 :     ; uint32_t dev16_3dne(const uint8_t * const cur,
446 :     ; const uint32_t stride);
447 :     ;
448 :     ;===========================================================================
449 :     ; optimization: 25 % faster
450 :    
451 : edgomez 1382 ALIGN 16
452 :     dev16_3dne:
453 : edgomez 851
454 : edgomez 1382 mov eax, [esp+ 4] ; Src
455 :     mov ecx, [esp+ 8] ; Stride
456 :     lea edx, [ecx+2*ecx]
457 : edgomez 851
458 : edgomez 1382 pxor mm4, mm4
459 : edgomez 851
460 : edgomez 1382 ALIGN 8
461 :     ABS_16x16_SSE 0
462 :     ABS_16x16_SSE 1
463 :     ABS_16x16_SSE 1
464 :     ABS_16x16_SSE 1
465 :     ABS_16x16_SSE 1
466 : edgomez 851
467 : edgomez 1382 paddd mm1, mm2
468 :     paddd mm3, mm5
469 : edgomez 851
470 : edgomez 1382 ABS_16x16_SSE 2
471 : edgomez 851
472 : edgomez 1382 paddd mm7, mm6
473 :     paddd mm1, mm3
474 :     mov eax, [esp+ 4] ; Src
475 :     paddd mm7, mm1
476 :     punpcklbw mm7, mm7 ;xxyyaazz
477 :     pshufw mm4, mm7, 055h ; mm4 contains the mean
478 :    
479 :    
480 :     pxor mm1, mm1
481 :    
482 :     ABS_16x16_SSE 0
483 :     ABS_16x16_SSE 1
484 :     ABS_16x16_SSE 1
485 :     ABS_16x16_SSE 1
486 :     ABS_16x16_SSE 1
487 :    
488 :     paddd mm1, mm2
489 :     paddd mm3, mm5
490 :    
491 :     ABS_16x16_SSE 2
492 :    
493 :     paddd mm7, mm6
494 :     paddd mm1, mm3
495 :     paddd mm7, mm1
496 :     movd eax, mm7
497 :    
498 :     ret

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