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

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