[svn] / trunk / xvidcore / src / motion / x86_asm / sad_xmm.asm Repository:
ViewVC logotype

Annotation of /trunk/xvidcore/src/motion/x86_asm/sad_xmm.asm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1540 - (view) (download)

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 : edgomez 1540 ; * $Id: sad_xmm.asm,v 1.10 2004-08-29 10:02:38 edgomez 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 : edgomez 1535 %else
36 :     global _%1
37 :     %define %1 _%1
38 :     %endif
39 : Isibaar 262 %else
40 : edgomez 1535 %ifdef MARK_FUNCS
41 : edgomez 1540 global %1:function %1.endfunc-%1
42 : edgomez 1535 %else
43 :     global %1
44 :     %endif
45 : Isibaar 262 %endif
46 :     %endmacro
47 :    
48 : edgomez 1382 ;=============================================================================
49 :     ; Read only data
50 :     ;=============================================================================
51 : Isibaar 262
52 : edgomez 1382 %ifdef FORMAT_COFF
53 : edgomez 1519 SECTION .rodata
54 : edgomez 1382 %else
55 : edgomez 1519 SECTION .rodata align=16
56 : edgomez 1382 %endif
57 : Isibaar 262
58 : edgomez 1382 ALIGN 16
59 :     mmx_one: times 4 dw 1
60 : Isibaar 262
61 : edgomez 1382 ;=============================================================================
62 :     ; Helper macros
63 :     ;=============================================================================
64 : Isibaar 262
65 : edgomez 1382 %macro SAD_16x16_SSE 0
66 :     movq mm0, [eax]
67 :     psadbw mm0, [edx]
68 :     movq mm1, [eax+8]
69 :     add eax, ecx
70 :     psadbw mm1, [edx+8]
71 :     paddusw mm5, mm0
72 :     add edx, ecx
73 :     paddusw mm6, mm1
74 :     %endmacro
75 :    
76 :     %macro SAD_8x8_SSE 0
77 :     movq mm0, [eax]
78 :     movq mm1, [eax+ecx]
79 :     psadbw mm0, [edx]
80 :     psadbw mm1, [edx+ecx]
81 :     add eax, ebx
82 :     add edx, ebx
83 :     paddusw mm5, mm0
84 :     paddusw mm6, mm1
85 :     %endmacro
86 :    
87 :     %macro SADBI_16x16_SSE 0
88 :     movq mm0, [eax]
89 :     movq mm1, [eax+8]
90 :     movq mm2, [edx]
91 :     movq mm3, [edx+8]
92 :     pavgb mm2, [ebx]
93 :     add edx, ecx
94 :     pavgb mm3, [ebx+8]
95 :     add ebx, ecx
96 :     psadbw mm0, mm2
97 :     add eax, ecx
98 :     psadbw mm1, mm3
99 :     paddusw mm5, mm0
100 :     paddusw mm6, mm1
101 :     %endmacro
102 :    
103 :     %macro SADBI_8x8_XMM 0
104 :     movq mm0, [eax]
105 :     movq mm1, [eax+ecx]
106 :     movq mm2, [edx]
107 :     movq mm3, [edx+ecx]
108 :     pavgb mm2, [ebx]
109 :     lea edx, [edx+2*ecx]
110 :     pavgb mm3, [ebx+ecx]
111 :     lea ebx, [ebx+2*ecx]
112 :     psadbw mm0, mm2
113 :     lea eax, [eax+2*ecx]
114 :     psadbw mm1, mm3
115 :     paddusw mm5, mm0
116 :     paddusw mm6, mm1
117 :     %endmacro
118 :    
119 :     %macro MEAN_16x16_SSE 0
120 :     movq mm0, [eax]
121 :     movq mm1, [eax+8]
122 :     psadbw mm0, mm7
123 :     psadbw mm1, mm7
124 :     add eax, ecx
125 :     paddw mm5, mm0
126 :     paddw mm6, mm1
127 :     %endmacro
128 :    
129 :     %macro ABS_16x16_SSE 0
130 :     movq mm0, [eax]
131 :     movq mm1, [eax+8]
132 :     psadbw mm0, mm4
133 :     psadbw mm1, mm4
134 :     lea eax, [eax+ecx]
135 :     paddw mm5, mm0
136 :     paddw mm6, mm1
137 :     %endmacro
138 :    
139 :     ;=============================================================================
140 :     ; Code
141 :     ;=============================================================================
142 :    
143 :     SECTION .text
144 :    
145 :     cglobal sad16_xmm
146 :     cglobal sad8_xmm
147 :     cglobal sad16bi_xmm
148 :     cglobal sad8bi_xmm
149 :     cglobal dev16_xmm
150 :     cglobal sad16v_xmm
151 :    
152 :     ;-----------------------------------------------------------------------------
153 : Isibaar 262 ;
154 :     ; uint32_t sad16_xmm(const uint8_t * const cur,
155 :     ; const uint8_t * const ref,
156 : suxen_drol 329 ; const uint32_t stride,
157 : Isibaar 262 ; const uint32_t best_sad);
158 : suxen_drol 329 ;
159 : edgomez 1382 ;-----------------------------------------------------------------------------
160 : Isibaar 262
161 : edgomez 1382 ALIGN 16
162 : Isibaar 262 sad16_xmm:
163 :    
164 : edgomez 1382 mov eax, [esp+ 4] ; Src1
165 :     mov edx, [esp+ 8] ; Src2
166 :     mov ecx, [esp+12] ; Stride
167 : Isibaar 262
168 : edgomez 1382 pxor mm5, mm5 ; accum1
169 :     pxor mm6, mm6 ; accum2
170 : Isibaar 262
171 : edgomez 1382 SAD_16x16_SSE
172 :     SAD_16x16_SSE
173 :     SAD_16x16_SSE
174 :     SAD_16x16_SSE
175 :     SAD_16x16_SSE
176 :     SAD_16x16_SSE
177 :     SAD_16x16_SSE
178 :     SAD_16x16_SSE
179 : Isibaar 262
180 : edgomez 1382 SAD_16x16_SSE
181 :     SAD_16x16_SSE
182 :     SAD_16x16_SSE
183 :     SAD_16x16_SSE
184 :     SAD_16x16_SSE
185 :     SAD_16x16_SSE
186 :     SAD_16x16_SSE
187 :     SAD_16x16_SSE
188 : Isibaar 262
189 : edgomez 1382 paddusw mm6,mm5
190 :     movd eax, mm6
191 :     ret
192 : edgomez 1540 .endfunc
193 : Isibaar 262
194 :    
195 : edgomez 1382 ;-----------------------------------------------------------------------------
196 : Isibaar 262 ;
197 :     ; uint32_t sad8_xmm(const uint8_t * const cur,
198 :     ; const uint8_t * const ref,
199 :     ; const uint32_t stride);
200 :     ;
201 : edgomez 1382 ;-----------------------------------------------------------------------------
202 : Isibaar 262
203 : edgomez 1382 ALIGN 16
204 : suxen_drol 329 sad8_xmm:
205 :    
206 : edgomez 1382 mov eax, [esp+ 4] ; Src1
207 :     mov edx, [esp+ 8] ; Src2
208 :     mov ecx, [esp+12] ; Stride
209 :     push ebx
210 :     lea ebx, [ecx+ecx]
211 : suxen_drol 329
212 : edgomez 1382 pxor mm5, mm5 ; accum1
213 :     pxor mm6, mm6 ; accum2
214 : suxen_drol 329
215 : edgomez 1382 SAD_8x8_SSE
216 :     SAD_8x8_SSE
217 :     SAD_8x8_SSE
218 : suxen_drol 329
219 : edgomez 1382 movq mm0, [eax]
220 :     movq mm1, [eax+ecx]
221 :     psadbw mm0, [edx]
222 :     psadbw mm1, [edx+ecx]
223 : suxen_drol 329
224 : edgomez 1382 pop ebx
225 : suxen_drol 329
226 : edgomez 1382 paddusw mm5,mm0
227 :     paddusw mm6,mm1
228 : suxen_drol 329
229 : edgomez 1382 paddusw mm6,mm5
230 :     movd eax, mm6
231 : suxen_drol 329
232 : edgomez 1382 ret
233 : edgomez 1540 .endfunc
234 : suxen_drol 329
235 : edgomez 1382
236 :     ;-----------------------------------------------------------------------------
237 : suxen_drol 329 ;
238 :     ; uint32_t sad16bi_xmm(const uint8_t * const cur,
239 :     ; const uint8_t * const ref1,
240 :     ; const uint8_t * const ref2,
241 :     ; const uint32_t stride);
242 :     ;
243 : edgomez 1382 ;-----------------------------------------------------------------------------
244 : suxen_drol 329
245 : edgomez 1382 ALIGN 16
246 : Isibaar 262 sad16bi_xmm:
247 : edgomez 1382 push ebx
248 :     mov eax, [esp+4+ 4] ; Src
249 :     mov edx, [esp+4+ 8] ; Ref1
250 :     mov ebx, [esp+4+12] ; Ref2
251 :     mov ecx, [esp+4+16] ; Stride
252 : Isibaar 262
253 : edgomez 1382 pxor mm5, mm5 ; accum1
254 :     pxor mm6, mm6 ; accum2
255 : Isibaar 262
256 : edgomez 1382 SADBI_16x16_SSE
257 :     SADBI_16x16_SSE
258 :     SADBI_16x16_SSE
259 :     SADBI_16x16_SSE
260 :     SADBI_16x16_SSE
261 :     SADBI_16x16_SSE
262 :     SADBI_16x16_SSE
263 :     SADBI_16x16_SSE
264 : Isibaar 262
265 : edgomez 1382 SADBI_16x16_SSE
266 :     SADBI_16x16_SSE
267 :     SADBI_16x16_SSE
268 :     SADBI_16x16_SSE
269 :     SADBI_16x16_SSE
270 :     SADBI_16x16_SSE
271 :     SADBI_16x16_SSE
272 :     SADBI_16x16_SSE
273 : Isibaar 262
274 : edgomez 1382 paddusw mm6,mm5
275 :     movd eax, mm6
276 :     pop ebx
277 :     ret
278 : edgomez 1540 .endfunc
279 : Isibaar 262
280 : edgomez 1382 ;-----------------------------------------------------------------------------
281 :     ;
282 :     ; uint32_t sad8bi_xmm(const uint8_t * const cur,
283 :     ; const uint8_t * const ref1,
284 :     ; const uint8_t * const ref2,
285 :     ; const uint32_t stride);
286 :     ;
287 :     ;-----------------------------------------------------------------------------
288 : Isibaar 262
289 : edgomez 1382 ALIGN 16
290 :     sad8bi_xmm:
291 :     push ebx
292 :     mov eax, [esp+4+ 4] ; Src
293 :     mov edx, [esp+4+ 8] ; Ref1
294 :     mov ebx, [esp+4+12] ; Ref2
295 :     mov ecx, [esp+4+16] ; Stride
296 : Isibaar 262
297 : edgomez 1382 pxor mm5, mm5 ; accum1
298 :     pxor mm6, mm6 ; accum2
299 :     .Loop
300 :     SADBI_8x8_XMM
301 :     SADBI_8x8_XMM
302 :     SADBI_8x8_XMM
303 :     SADBI_8x8_XMM
304 : Isibaar 262
305 : edgomez 1382 paddusw mm6,mm5
306 :     movd eax, mm6
307 :     pop ebx
308 :     ret
309 : edgomez 1540 .endfunc
310 : Isibaar 262
311 :    
312 : edgomez 1382 ;-----------------------------------------------------------------------------
313 : suxen_drol 329 ;
314 :     ; uint32_t dev16_xmm(const uint8_t * const cur,
315 :     ; const uint32_t stride);
316 :     ;
317 : edgomez 1382 ;-----------------------------------------------------------------------------
318 : suxen_drol 329
319 : edgomez 1382 ALIGN 16
320 : Isibaar 262 dev16_xmm:
321 :    
322 : edgomez 1382 mov eax, [esp+ 4] ; Src
323 :     mov ecx, [esp+ 8] ; Stride
324 : Isibaar 262
325 : edgomez 1382 pxor mm7, mm7 ; zero
326 :     pxor mm5, mm5 ; mean accums
327 :     pxor mm6, mm6
328 : Isibaar 262
329 : edgomez 1382 MEAN_16x16_SSE
330 :     MEAN_16x16_SSE
331 :     MEAN_16x16_SSE
332 :     MEAN_16x16_SSE
333 :     MEAN_16x16_SSE
334 :     MEAN_16x16_SSE
335 :     MEAN_16x16_SSE
336 :     MEAN_16x16_SSE
337 : Isibaar 262
338 : edgomez 1382 MEAN_16x16_SSE
339 :     MEAN_16x16_SSE
340 :     MEAN_16x16_SSE
341 :     MEAN_16x16_SSE
342 :     MEAN_16x16_SSE
343 :     MEAN_16x16_SSE
344 :     MEAN_16x16_SSE
345 :     MEAN_16x16_SSE
346 : Isibaar 262
347 : edgomez 1382 paddusw mm6, mm5
348 : Isibaar 262
349 : edgomez 1382 movq mm4, mm6
350 :     psllq mm4, 32
351 :     paddd mm4, mm6
352 :     psrld mm4, 8 ; /= (16*16)
353 : Isibaar 262
354 : edgomez 1382 packssdw mm4, mm4
355 :     packuswb mm4, mm4
356 : Isibaar 262
357 : edgomez 1382 ; mm4 contains the mean
358 : Isibaar 262
359 : edgomez 1382 mov eax, [esp+ 4] ; Src
360 : edgomez 851
361 : Isibaar 262
362 : edgomez 1382 pxor mm5, mm5 ; sums
363 :     pxor mm6, mm6
364 : Isibaar 262
365 : edgomez 1382 ABS_16x16_SSE
366 :     ABS_16x16_SSE
367 :     ABS_16x16_SSE
368 :     ABS_16x16_SSE
369 :     ABS_16x16_SSE
370 :     ABS_16x16_SSE
371 :     ABS_16x16_SSE
372 :     ABS_16x16_SSE
373 : Isibaar 262
374 : edgomez 1382 ABS_16x16_SSE
375 :     ABS_16x16_SSE
376 :     ABS_16x16_SSE
377 :     ABS_16x16_SSE
378 :     ABS_16x16_SSE
379 :     ABS_16x16_SSE
380 :     ABS_16x16_SSE
381 :     ABS_16x16_SSE
382 : Isibaar 262
383 : edgomez 1382 paddusw mm6, mm5
384 :     movq mm7, mm6
385 :     psllq mm7, 32
386 :     paddd mm6, mm7
387 : edgomez 851
388 : edgomez 1382 movd eax, mm6
389 :     ret
390 : edgomez 1540 .endfunc
391 : edgomez 851
392 : edgomez 1382 ;-----------------------------------------------------------------------------
393 : edgomez 851 ;int sad16v_xmm(const uint8_t * const cur,
394 :     ; const uint8_t * const ref,
395 :     ; const uint32_t stride,
396 :     ; int* sad8);
397 : edgomez 1382 ;-----------------------------------------------------------------------------
398 :    
399 :     ALIGN 16
400 : edgomez 851 sad16v_xmm:
401 : edgomez 1382 push ebx
402 :     mov eax, [esp+4+ 4] ; Src1
403 :     mov edx, [esp+4+ 8] ; Src2
404 :     mov ecx, [esp+4+12] ; Stride
405 :     mov ebx, [esp+4+16] ; sad ptr
406 : edgomez 851
407 : edgomez 1382 pxor mm5, mm5 ; accum1
408 :     pxor mm6, mm6 ; accum2
409 :     pxor mm7, mm7 ; total
410 : edgomez 851
411 : edgomez 1382 SAD_16x16_SSE
412 :     SAD_16x16_SSE
413 :     SAD_16x16_SSE
414 :     SAD_16x16_SSE
415 :     SAD_16x16_SSE
416 :     SAD_16x16_SSE
417 :     SAD_16x16_SSE
418 :     SAD_16x16_SSE
419 : edgomez 851
420 : edgomez 1382 paddusw mm7, mm5
421 :     paddusw mm7, mm6
422 :     movd [ebx], mm5
423 :     movd [ebx+4], mm6
424 : edgomez 851
425 : edgomez 1382 pxor mm5, mm5 ; accum1
426 :     pxor mm6, mm6 ; accum2
427 : edgomez 851
428 : edgomez 1382 SAD_16x16_SSE
429 :     SAD_16x16_SSE
430 :     SAD_16x16_SSE
431 :     SAD_16x16_SSE
432 :     SAD_16x16_SSE
433 :     SAD_16x16_SSE
434 :     SAD_16x16_SSE
435 :     SAD_16x16_SSE
436 :    
437 :     paddusw mm7, mm5
438 :     paddusw mm7, mm6
439 :     movd [ebx+8], mm5
440 :     movd [ebx+12], mm6
441 :    
442 :     movd eax, mm7
443 :     pop ebx
444 :     ret
445 : edgomez 1540 .endfunc
446 :    

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