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

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