[svn] / branches / dev-api-4 / xvidcore / src / motion / x86_asm / sad_xmm.asm Repository:
ViewVC logotype

Annotation of /branches/dev-api-4/xvidcore/src/motion/x86_asm/sad_xmm.asm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1192 - (view) (download)

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

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