[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 1535 - (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 1535 ; * $Id: sad_xmm.asm,v 1.9 2004-08-22 11:46:10 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 :     global _%1:function
34 :     %define %1 _%1:function
35 :     %else
36 :     global _%1
37 :     %define %1 _%1
38 :     %endif
39 : Isibaar 262 %else
40 : edgomez 1535 %ifdef MARK_FUNCS
41 :     global %1:function
42 :     %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 : Isibaar 262
193 :    
194 : edgomez 1382 ;-----------------------------------------------------------------------------
195 : Isibaar 262 ;
196 :     ; uint32_t sad8_xmm(const uint8_t * const cur,
197 :     ; const uint8_t * const ref,
198 :     ; const uint32_t stride);
199 :     ;
200 : edgomez 1382 ;-----------------------------------------------------------------------------
201 : Isibaar 262
202 : edgomez 1382 ALIGN 16
203 : suxen_drol 329 sad8_xmm:
204 :    
205 : edgomez 1382 mov eax, [esp+ 4] ; Src1
206 :     mov edx, [esp+ 8] ; Src2
207 :     mov ecx, [esp+12] ; Stride
208 :     push ebx
209 :     lea ebx, [ecx+ecx]
210 : suxen_drol 329
211 : edgomez 1382 pxor mm5, mm5 ; accum1
212 :     pxor mm6, mm6 ; accum2
213 : suxen_drol 329
214 : edgomez 1382 SAD_8x8_SSE
215 :     SAD_8x8_SSE
216 :     SAD_8x8_SSE
217 : suxen_drol 329
218 : edgomez 1382 movq mm0, [eax]
219 :     movq mm1, [eax+ecx]
220 :     psadbw mm0, [edx]
221 :     psadbw mm1, [edx+ecx]
222 : suxen_drol 329
223 : edgomez 1382 pop ebx
224 : suxen_drol 329
225 : edgomez 1382 paddusw mm5,mm0
226 :     paddusw mm6,mm1
227 : suxen_drol 329
228 : edgomez 1382 paddusw mm6,mm5
229 :     movd eax, mm6
230 : suxen_drol 329
231 : edgomez 1382 ret
232 : suxen_drol 329
233 : edgomez 1382
234 :     ;-----------------------------------------------------------------------------
235 : suxen_drol 329 ;
236 :     ; uint32_t sad16bi_xmm(const uint8_t * const cur,
237 :     ; const uint8_t * const ref1,
238 :     ; const uint8_t * const ref2,
239 :     ; const uint32_t stride);
240 :     ;
241 : edgomez 1382 ;-----------------------------------------------------------------------------
242 : suxen_drol 329
243 : edgomez 1382 ALIGN 16
244 : Isibaar 262 sad16bi_xmm:
245 : edgomez 1382 push ebx
246 :     mov eax, [esp+4+ 4] ; Src
247 :     mov edx, [esp+4+ 8] ; Ref1
248 :     mov ebx, [esp+4+12] ; Ref2
249 :     mov ecx, [esp+4+16] ; Stride
250 : Isibaar 262
251 : edgomez 1382 pxor mm5, mm5 ; accum1
252 :     pxor mm6, mm6 ; accum2
253 : Isibaar 262
254 : edgomez 1382 SADBI_16x16_SSE
255 :     SADBI_16x16_SSE
256 :     SADBI_16x16_SSE
257 :     SADBI_16x16_SSE
258 :     SADBI_16x16_SSE
259 :     SADBI_16x16_SSE
260 :     SADBI_16x16_SSE
261 :     SADBI_16x16_SSE
262 : Isibaar 262
263 : edgomez 1382 SADBI_16x16_SSE
264 :     SADBI_16x16_SSE
265 :     SADBI_16x16_SSE
266 :     SADBI_16x16_SSE
267 :     SADBI_16x16_SSE
268 :     SADBI_16x16_SSE
269 :     SADBI_16x16_SSE
270 :     SADBI_16x16_SSE
271 : Isibaar 262
272 : edgomez 1382 paddusw mm6,mm5
273 :     movd eax, mm6
274 :     pop ebx
275 :     ret
276 : Isibaar 262
277 : edgomez 1382 ;-----------------------------------------------------------------------------
278 :     ;
279 :     ; uint32_t sad8bi_xmm(const uint8_t * const cur,
280 :     ; const uint8_t * const ref1,
281 :     ; const uint8_t * const ref2,
282 :     ; const uint32_t stride);
283 :     ;
284 :     ;-----------------------------------------------------------------------------
285 : Isibaar 262
286 : edgomez 1382 ALIGN 16
287 :     sad8bi_xmm:
288 :     push ebx
289 :     mov eax, [esp+4+ 4] ; Src
290 :     mov edx, [esp+4+ 8] ; Ref1
291 :     mov ebx, [esp+4+12] ; Ref2
292 :     mov ecx, [esp+4+16] ; Stride
293 : Isibaar 262
294 : edgomez 1382 pxor mm5, mm5 ; accum1
295 :     pxor mm6, mm6 ; accum2
296 :     .Loop
297 :     SADBI_8x8_XMM
298 :     SADBI_8x8_XMM
299 :     SADBI_8x8_XMM
300 :     SADBI_8x8_XMM
301 : Isibaar 262
302 : edgomez 1382 paddusw mm6,mm5
303 :     movd eax, mm6
304 :     pop ebx
305 :     ret
306 : Isibaar 262
307 :    
308 : edgomez 1382 ;-----------------------------------------------------------------------------
309 : suxen_drol 329 ;
310 :     ; uint32_t dev16_xmm(const uint8_t * const cur,
311 :     ; const uint32_t stride);
312 :     ;
313 : edgomez 1382 ;-----------------------------------------------------------------------------
314 : suxen_drol 329
315 : edgomez 1382 ALIGN 16
316 : Isibaar 262 dev16_xmm:
317 :    
318 : edgomez 1382 mov eax, [esp+ 4] ; Src
319 :     mov ecx, [esp+ 8] ; Stride
320 : Isibaar 262
321 : edgomez 1382 pxor mm7, mm7 ; zero
322 :     pxor mm5, mm5 ; mean accums
323 :     pxor mm6, mm6
324 : Isibaar 262
325 : edgomez 1382 MEAN_16x16_SSE
326 :     MEAN_16x16_SSE
327 :     MEAN_16x16_SSE
328 :     MEAN_16x16_SSE
329 :     MEAN_16x16_SSE
330 :     MEAN_16x16_SSE
331 :     MEAN_16x16_SSE
332 :     MEAN_16x16_SSE
333 : Isibaar 262
334 : edgomez 1382 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 :     MEAN_16x16_SSE
342 : Isibaar 262
343 : edgomez 1382 paddusw mm6, mm5
344 : Isibaar 262
345 : edgomez 1382 movq mm4, mm6
346 :     psllq mm4, 32
347 :     paddd mm4, mm6
348 :     psrld mm4, 8 ; /= (16*16)
349 : Isibaar 262
350 : edgomez 1382 packssdw mm4, mm4
351 :     packuswb mm4, mm4
352 : Isibaar 262
353 : edgomez 1382 ; mm4 contains the mean
354 : Isibaar 262
355 : edgomez 1382 mov eax, [esp+ 4] ; Src
356 : edgomez 851
357 : Isibaar 262
358 : edgomez 1382 pxor mm5, mm5 ; sums
359 :     pxor mm6, mm6
360 : Isibaar 262
361 : edgomez 1382 ABS_16x16_SSE
362 :     ABS_16x16_SSE
363 :     ABS_16x16_SSE
364 :     ABS_16x16_SSE
365 :     ABS_16x16_SSE
366 :     ABS_16x16_SSE
367 :     ABS_16x16_SSE
368 :     ABS_16x16_SSE
369 : Isibaar 262
370 : edgomez 1382 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 :     ABS_16x16_SSE
378 : Isibaar 262
379 : edgomez 1382 paddusw mm6, mm5
380 :     movq mm7, mm6
381 :     psllq mm7, 32
382 :     paddd mm6, mm7
383 : edgomez 851
384 : edgomez 1382 movd eax, mm6
385 :     ret
386 : edgomez 851
387 : edgomez 1382 ;-----------------------------------------------------------------------------
388 : edgomez 851 ;int sad16v_xmm(const uint8_t * const cur,
389 :     ; const uint8_t * const ref,
390 :     ; const uint32_t stride,
391 :     ; int* sad8);
392 : edgomez 1382 ;-----------------------------------------------------------------------------
393 :    
394 :     ALIGN 16
395 : edgomez 851 sad16v_xmm:
396 : edgomez 1382 push ebx
397 :     mov eax, [esp+4+ 4] ; Src1
398 :     mov edx, [esp+4+ 8] ; Src2
399 :     mov ecx, [esp+4+12] ; Stride
400 :     mov ebx, [esp+4+16] ; sad ptr
401 : edgomez 851
402 : edgomez 1382 pxor mm5, mm5 ; accum1
403 :     pxor mm6, mm6 ; accum2
404 :     pxor mm7, mm7 ; total
405 : edgomez 851
406 : edgomez 1382 SAD_16x16_SSE
407 :     SAD_16x16_SSE
408 :     SAD_16x16_SSE
409 :     SAD_16x16_SSE
410 :     SAD_16x16_SSE
411 :     SAD_16x16_SSE
412 :     SAD_16x16_SSE
413 :     SAD_16x16_SSE
414 : edgomez 851
415 : edgomez 1382 paddusw mm7, mm5
416 :     paddusw mm7, mm6
417 :     movd [ebx], mm5
418 :     movd [ebx+4], mm6
419 : edgomez 851
420 : edgomez 1382 pxor mm5, mm5 ; accum1
421 :     pxor mm6, mm6 ; accum2
422 : edgomez 851
423 : edgomez 1382 SAD_16x16_SSE
424 :     SAD_16x16_SSE
425 :     SAD_16x16_SSE
426 :     SAD_16x16_SSE
427 :     SAD_16x16_SSE
428 :     SAD_16x16_SSE
429 :     SAD_16x16_SSE
430 :     SAD_16x16_SSE
431 :    
432 :     paddusw mm7, mm5
433 :     paddusw mm7, mm6
434 :     movd [ebx+8], mm5
435 :     movd [ebx+12], mm6
436 :    
437 :     movd eax, mm7
438 :     pop ebx
439 :     ret

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