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

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