[svn] / branches / release-1_2-branch / xvidcore / src / motion / x86_asm / sad_xmm.asm Repository:
ViewVC logotype

Annotation of /branches/release-1_2-branch/xvidcore/src/motion/x86_asm/sad_xmm.asm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1793 - (view) (download)
Original Path: trunk/xvidcore/src/motion/x86_asm/sad_xmm.asm

1 : edgomez 1382 ;/****************************************************************************
2 : Isibaar 262 ; *
3 : edgomez 1382 ; * XVID MPEG-4 VIDEO CODEC
4 :     ; * - K7 optimized SAD operators -
5 : Isibaar 262 ; *
6 : edgomez 1382 ; * Copyright(C) 2001 Peter Ross <pross@xvid.org>
7 :     ; * 2001 Michael Militzer <isibaar@xvid.org>
8 :     ; * 2002 Pascal Massimino <skal@planet-d.net>
9 : Isibaar 262 ; *
10 : edgomez 1382 ; * This program is free software; you can redistribute it and/or modify it
11 :     ; * under the terms of the GNU General Public License as published by
12 :     ; * the Free Software Foundation; either version 2 of the License, or
13 :     ; * (at your option) any later version.
14 : Isibaar 262 ; *
15 : edgomez 1382 ; * This program is distributed in the hope that it will be useful,
16 :     ; * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 :     ; * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 :     ; * GNU General Public License for more details.
19 : Isibaar 262 ; *
20 : edgomez 1382 ; * You should have received a copy of the GNU General Public License
21 :     ; * along with this program; if not, write to the Free Software
22 :     ; * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 : Isibaar 262 ; *
24 : Isibaar 1793 ; * $Id: sad_xmm.asm,v 1.12 2008-11-11 20:46:24 Isibaar Exp $
25 : Isibaar 262 ; *
26 : edgomez 1382 ; ***************************************************************************/
27 : Isibaar 262
28 : edgomez 1382 BITS 32
29 : suxen_drol 329
30 : edgomez 1382 %macro cglobal 1
31 : Isibaar 262 %ifdef PREFIX
32 : edgomez 1535 %ifdef MARK_FUNCS
33 : edgomez 1540 global _%1:function %1.endfunc-%1
34 :     %define %1 _%1:function %1.endfunc-%1
35 : Isibaar 1793 %define ENDFUNC .endfunc
36 : edgomez 1535 %else
37 :     global _%1
38 :     %define %1 _%1
39 : Isibaar 1793 %define ENDFUNC
40 : edgomez 1535 %endif
41 : Isibaar 262 %else
42 : edgomez 1535 %ifdef MARK_FUNCS
43 : edgomez 1540 global %1:function %1.endfunc-%1
44 : Isibaar 1793 %define ENDFUNC .endfunc
45 : edgomez 1535 %else
46 :     global %1
47 : Isibaar 1793 %define ENDFUNC
48 : edgomez 1535 %endif
49 : Isibaar 262 %endif
50 :     %endmacro
51 :    
52 : edgomez 1382 ;=============================================================================
53 :     ; Read only data
54 :     ;=============================================================================
55 : Isibaar 262
56 : edgomez 1382 %ifdef FORMAT_COFF
57 : edgomez 1519 SECTION .rodata
58 : edgomez 1382 %else
59 : edgomez 1519 SECTION .rodata align=16
60 : edgomez 1382 %endif
61 : Isibaar 262
62 : edgomez 1382 ALIGN 16
63 :     mmx_one: times 4 dw 1
64 : Isibaar 262
65 : edgomez 1382 ;=============================================================================
66 :     ; Helper macros
67 :     ;=============================================================================
68 : Isibaar 262
69 : edgomez 1382 %macro SAD_16x16_SSE 0
70 :     movq mm0, [eax]
71 :     psadbw mm0, [edx]
72 :     movq mm1, [eax+8]
73 :     add eax, ecx
74 :     psadbw mm1, [edx+8]
75 :     paddusw mm5, mm0
76 :     add edx, ecx
77 :     paddusw mm6, mm1
78 :     %endmacro
79 :    
80 :     %macro SAD_8x8_SSE 0
81 :     movq mm0, [eax]
82 :     movq mm1, [eax+ecx]
83 :     psadbw mm0, [edx]
84 :     psadbw mm1, [edx+ecx]
85 :     add eax, ebx
86 :     add edx, ebx
87 :     paddusw mm5, mm0
88 :     paddusw mm6, mm1
89 :     %endmacro
90 :    
91 :     %macro SADBI_16x16_SSE 0
92 :     movq mm0, [eax]
93 :     movq mm1, [eax+8]
94 :     movq mm2, [edx]
95 :     movq mm3, [edx+8]
96 :     pavgb mm2, [ebx]
97 :     add edx, ecx
98 :     pavgb mm3, [ebx+8]
99 :     add ebx, ecx
100 :     psadbw mm0, mm2
101 :     add eax, ecx
102 :     psadbw mm1, mm3
103 :     paddusw mm5, mm0
104 :     paddusw mm6, mm1
105 :     %endmacro
106 :    
107 :     %macro SADBI_8x8_XMM 0
108 :     movq mm0, [eax]
109 :     movq mm1, [eax+ecx]
110 :     movq mm2, [edx]
111 :     movq mm3, [edx+ecx]
112 :     pavgb mm2, [ebx]
113 :     lea edx, [edx+2*ecx]
114 :     pavgb mm3, [ebx+ecx]
115 :     lea ebx, [ebx+2*ecx]
116 :     psadbw mm0, mm2
117 :     lea eax, [eax+2*ecx]
118 :     psadbw mm1, mm3
119 :     paddusw mm5, mm0
120 :     paddusw mm6, mm1
121 :     %endmacro
122 :    
123 :     %macro MEAN_16x16_SSE 0
124 :     movq mm0, [eax]
125 :     movq mm1, [eax+8]
126 :     psadbw mm0, mm7
127 :     psadbw mm1, mm7
128 :     add eax, ecx
129 :     paddw mm5, mm0
130 :     paddw mm6, mm1
131 :     %endmacro
132 :    
133 :     %macro ABS_16x16_SSE 0
134 :     movq mm0, [eax]
135 :     movq mm1, [eax+8]
136 :     psadbw mm0, mm4
137 :     psadbw mm1, mm4
138 :     lea eax, [eax+ecx]
139 :     paddw mm5, mm0
140 :     paddw mm6, mm1
141 :     %endmacro
142 :    
143 :     ;=============================================================================
144 :     ; Code
145 :     ;=============================================================================
146 :    
147 :     SECTION .text
148 :    
149 :     cglobal sad16_xmm
150 :     cglobal sad8_xmm
151 :     cglobal sad16bi_xmm
152 :     cglobal sad8bi_xmm
153 :     cglobal dev16_xmm
154 :     cglobal sad16v_xmm
155 :    
156 :     ;-----------------------------------------------------------------------------
157 : Isibaar 262 ;
158 :     ; uint32_t sad16_xmm(const uint8_t * const cur,
159 :     ; const uint8_t * const ref,
160 : suxen_drol 329 ; const uint32_t stride,
161 : Isibaar 262 ; const uint32_t best_sad);
162 : suxen_drol 329 ;
163 : edgomez 1382 ;-----------------------------------------------------------------------------
164 : Isibaar 262
165 : edgomez 1382 ALIGN 16
166 : Isibaar 262 sad16_xmm:
167 :    
168 : edgomez 1382 mov eax, [esp+ 4] ; Src1
169 :     mov edx, [esp+ 8] ; Src2
170 :     mov ecx, [esp+12] ; Stride
171 : Isibaar 262
172 : edgomez 1382 pxor mm5, mm5 ; accum1
173 :     pxor mm6, mm6 ; accum2
174 : Isibaar 262
175 : edgomez 1382 SAD_16x16_SSE
176 :     SAD_16x16_SSE
177 :     SAD_16x16_SSE
178 :     SAD_16x16_SSE
179 :     SAD_16x16_SSE
180 :     SAD_16x16_SSE
181 :     SAD_16x16_SSE
182 :     SAD_16x16_SSE
183 : Isibaar 262
184 : edgomez 1382 SAD_16x16_SSE
185 :     SAD_16x16_SSE
186 :     SAD_16x16_SSE
187 :     SAD_16x16_SSE
188 :     SAD_16x16_SSE
189 :     SAD_16x16_SSE
190 :     SAD_16x16_SSE
191 :     SAD_16x16_SSE
192 : Isibaar 262
193 : edgomez 1382 paddusw mm6,mm5
194 :     movd eax, mm6
195 :     ret
196 : Isibaar 1793 ENDFUNC
197 : Isibaar 262
198 :    
199 : edgomez 1382 ;-----------------------------------------------------------------------------
200 : Isibaar 262 ;
201 :     ; uint32_t sad8_xmm(const uint8_t * const cur,
202 :     ; const uint8_t * const ref,
203 :     ; const uint32_t stride);
204 :     ;
205 : edgomez 1382 ;-----------------------------------------------------------------------------
206 : Isibaar 262
207 : edgomez 1382 ALIGN 16
208 : suxen_drol 329 sad8_xmm:
209 :    
210 : edgomez 1382 mov eax, [esp+ 4] ; Src1
211 :     mov edx, [esp+ 8] ; Src2
212 :     mov ecx, [esp+12] ; Stride
213 :     push ebx
214 :     lea ebx, [ecx+ecx]
215 : suxen_drol 329
216 : edgomez 1382 pxor mm5, mm5 ; accum1
217 :     pxor mm6, mm6 ; accum2
218 : suxen_drol 329
219 : edgomez 1382 SAD_8x8_SSE
220 :     SAD_8x8_SSE
221 :     SAD_8x8_SSE
222 : suxen_drol 329
223 : edgomez 1382 movq mm0, [eax]
224 :     movq mm1, [eax+ecx]
225 :     psadbw mm0, [edx]
226 :     psadbw mm1, [edx+ecx]
227 : suxen_drol 329
228 : edgomez 1382 pop ebx
229 : suxen_drol 329
230 : edgomez 1382 paddusw mm5,mm0
231 :     paddusw mm6,mm1
232 : suxen_drol 329
233 : edgomez 1382 paddusw mm6,mm5
234 :     movd eax, mm6
235 : suxen_drol 329
236 : edgomez 1382 ret
237 : Isibaar 1793 ENDFUNC
238 : suxen_drol 329
239 : edgomez 1382
240 :     ;-----------------------------------------------------------------------------
241 : suxen_drol 329 ;
242 :     ; uint32_t sad16bi_xmm(const uint8_t * const cur,
243 :     ; const uint8_t * const ref1,
244 :     ; const uint8_t * const ref2,
245 :     ; const uint32_t stride);
246 :     ;
247 : edgomez 1382 ;-----------------------------------------------------------------------------
248 : suxen_drol 329
249 : edgomez 1382 ALIGN 16
250 : Isibaar 262 sad16bi_xmm:
251 : edgomez 1382 push ebx
252 :     mov eax, [esp+4+ 4] ; Src
253 :     mov edx, [esp+4+ 8] ; Ref1
254 :     mov ebx, [esp+4+12] ; Ref2
255 :     mov ecx, [esp+4+16] ; Stride
256 : Isibaar 262
257 : edgomez 1382 pxor mm5, mm5 ; accum1
258 :     pxor mm6, mm6 ; accum2
259 : Isibaar 262
260 : edgomez 1382 SADBI_16x16_SSE
261 :     SADBI_16x16_SSE
262 :     SADBI_16x16_SSE
263 :     SADBI_16x16_SSE
264 :     SADBI_16x16_SSE
265 :     SADBI_16x16_SSE
266 :     SADBI_16x16_SSE
267 :     SADBI_16x16_SSE
268 : Isibaar 262
269 : edgomez 1382 SADBI_16x16_SSE
270 :     SADBI_16x16_SSE
271 :     SADBI_16x16_SSE
272 :     SADBI_16x16_SSE
273 :     SADBI_16x16_SSE
274 :     SADBI_16x16_SSE
275 :     SADBI_16x16_SSE
276 :     SADBI_16x16_SSE
277 : Isibaar 262
278 : edgomez 1382 paddusw mm6,mm5
279 :     movd eax, mm6
280 :     pop ebx
281 :     ret
282 : Isibaar 1793 ENDFUNC
283 : Isibaar 262
284 : edgomez 1382 ;-----------------------------------------------------------------------------
285 :     ;
286 :     ; uint32_t sad8bi_xmm(const uint8_t * const cur,
287 :     ; const uint8_t * const ref1,
288 :     ; const uint8_t * const ref2,
289 :     ; const uint32_t stride);
290 :     ;
291 :     ;-----------------------------------------------------------------------------
292 : Isibaar 262
293 : edgomez 1382 ALIGN 16
294 :     sad8bi_xmm:
295 :     push ebx
296 :     mov eax, [esp+4+ 4] ; Src
297 :     mov edx, [esp+4+ 8] ; Ref1
298 :     mov ebx, [esp+4+12] ; Ref2
299 :     mov ecx, [esp+4+16] ; Stride
300 : Isibaar 262
301 : edgomez 1382 pxor mm5, mm5 ; accum1
302 :     pxor mm6, mm6 ; accum2
303 : Isibaar 1793 .Loop:
304 : edgomez 1382 SADBI_8x8_XMM
305 :     SADBI_8x8_XMM
306 :     SADBI_8x8_XMM
307 :     SADBI_8x8_XMM
308 : Isibaar 262
309 : edgomez 1382 paddusw mm6,mm5
310 :     movd eax, mm6
311 :     pop ebx
312 :     ret
313 : Isibaar 1793 ENDFUNC
314 : Isibaar 262
315 :    
316 : edgomez 1382 ;-----------------------------------------------------------------------------
317 : suxen_drol 329 ;
318 :     ; uint32_t dev16_xmm(const uint8_t * const cur,
319 :     ; const uint32_t stride);
320 :     ;
321 : edgomez 1382 ;-----------------------------------------------------------------------------
322 : suxen_drol 329
323 : edgomez 1382 ALIGN 16
324 : Isibaar 262 dev16_xmm:
325 :    
326 : edgomez 1382 mov eax, [esp+ 4] ; Src
327 :     mov ecx, [esp+ 8] ; Stride
328 : Isibaar 262
329 : edgomez 1382 pxor mm7, mm7 ; zero
330 :     pxor mm5, mm5 ; mean accums
331 :     pxor mm6, mm6
332 : Isibaar 262
333 : edgomez 1382 MEAN_16x16_SSE
334 :     MEAN_16x16_SSE
335 :     MEAN_16x16_SSE
336 :     MEAN_16x16_SSE
337 :     MEAN_16x16_SSE
338 :     MEAN_16x16_SSE
339 :     MEAN_16x16_SSE
340 :     MEAN_16x16_SSE
341 : Isibaar 262
342 : edgomez 1382 MEAN_16x16_SSE
343 :     MEAN_16x16_SSE
344 :     MEAN_16x16_SSE
345 :     MEAN_16x16_SSE
346 :     MEAN_16x16_SSE
347 :     MEAN_16x16_SSE
348 :     MEAN_16x16_SSE
349 :     MEAN_16x16_SSE
350 : Isibaar 262
351 : edgomez 1382 paddusw mm6, mm5
352 : Isibaar 262
353 : edgomez 1382 movq mm4, mm6
354 :     psllq mm4, 32
355 :     paddd mm4, mm6
356 :     psrld mm4, 8 ; /= (16*16)
357 : Isibaar 262
358 : edgomez 1382 packssdw mm4, mm4
359 :     packuswb mm4, mm4
360 : Isibaar 262
361 : edgomez 1382 ; mm4 contains the mean
362 : Isibaar 262
363 : edgomez 1382 mov eax, [esp+ 4] ; Src
364 : edgomez 851
365 : Isibaar 262
366 : edgomez 1382 pxor mm5, mm5 ; sums
367 :     pxor mm6, mm6
368 : Isibaar 262
369 : edgomez 1382 ABS_16x16_SSE
370 :     ABS_16x16_SSE
371 :     ABS_16x16_SSE
372 :     ABS_16x16_SSE
373 :     ABS_16x16_SSE
374 :     ABS_16x16_SSE
375 :     ABS_16x16_SSE
376 :     ABS_16x16_SSE
377 : Isibaar 262
378 : edgomez 1382 ABS_16x16_SSE
379 :     ABS_16x16_SSE
380 :     ABS_16x16_SSE
381 :     ABS_16x16_SSE
382 :     ABS_16x16_SSE
383 :     ABS_16x16_SSE
384 :     ABS_16x16_SSE
385 :     ABS_16x16_SSE
386 : Isibaar 262
387 : edgomez 1382 paddusw mm6, mm5
388 :     movq mm7, mm6
389 :     psllq mm7, 32
390 :     paddd mm6, mm7
391 : edgomez 851
392 : edgomez 1382 movd eax, mm6
393 :     ret
394 : Isibaar 1793 ENDFUNC
395 : edgomez 851
396 : edgomez 1382 ;-----------------------------------------------------------------------------
397 : edgomez 851 ;int sad16v_xmm(const uint8_t * const cur,
398 :     ; const uint8_t * const ref,
399 :     ; const uint32_t stride,
400 :     ; int* sad8);
401 : edgomez 1382 ;-----------------------------------------------------------------------------
402 :    
403 :     ALIGN 16
404 : edgomez 851 sad16v_xmm:
405 : edgomez 1382 push ebx
406 :     mov eax, [esp+4+ 4] ; Src1
407 :     mov edx, [esp+4+ 8] ; Src2
408 :     mov ecx, [esp+4+12] ; Stride
409 :     mov ebx, [esp+4+16] ; sad ptr
410 : edgomez 851
411 : edgomez 1382 pxor mm5, mm5 ; accum1
412 :     pxor mm6, mm6 ; accum2
413 :     pxor mm7, mm7 ; total
414 : edgomez 851
415 : edgomez 1382 SAD_16x16_SSE
416 :     SAD_16x16_SSE
417 :     SAD_16x16_SSE
418 :     SAD_16x16_SSE
419 :     SAD_16x16_SSE
420 :     SAD_16x16_SSE
421 :     SAD_16x16_SSE
422 :     SAD_16x16_SSE
423 : edgomez 851
424 : edgomez 1382 paddusw mm7, mm5
425 :     paddusw mm7, mm6
426 :     movd [ebx], mm5
427 :     movd [ebx+4], mm6
428 : edgomez 851
429 : edgomez 1382 pxor mm5, mm5 ; accum1
430 :     pxor mm6, mm6 ; accum2
431 : edgomez 851
432 : edgomez 1382 SAD_16x16_SSE
433 :     SAD_16x16_SSE
434 :     SAD_16x16_SSE
435 :     SAD_16x16_SSE
436 :     SAD_16x16_SSE
437 :     SAD_16x16_SSE
438 :     SAD_16x16_SSE
439 :     SAD_16x16_SSE
440 :    
441 :     paddusw mm7, mm5
442 :     paddusw mm7, mm6
443 :     movd [ebx+8], mm5
444 :     movd [ebx+12], mm6
445 :    
446 :     movd eax, mm7
447 :     pop ebx
448 :     ret
449 : Isibaar 1793 ENDFUNC
450 : edgomez 1540
451 : Isibaar 1790
452 :     %ifidn __OUTPUT_FORMAT__,elf
453 :     section ".note.GNU-stack" noalloc noexec nowrite progbits
454 :     %endif
455 :    

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