[svn] / branches / dev-api-4 / xvidcore / src / motion / x86_asm / sad_3dne.asm Repository:
ViewVC logotype

Annotation of /branches/dev-api-4/xvidcore/src/motion/x86_asm/sad_3dne.asm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1192 - (view) (download)

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

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