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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.9 - (view) (download)

1 : edgomez 1.7 ;/****************************************************************************
2 : Isibaar 1.1 ; *
3 : edgomez 1.7 ; * XVID MPEG-4 VIDEO CODEC
4 :     ; * - K7 optimized SAD operators -
5 : Isibaar 1.1 ; *
6 : edgomez 1.7 ; * Copyright(C) 2001 Peter Ross <pross@xvid.org>
7 :     ; * 2001 Michael Militzer <isibaar@xvid.org>
8 :     ; * 2002 Pascal Massimino <skal@planet-d.net>
9 : edgomez 1.6 ; *
10 : edgomez 1.7 ; * 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 : edgomez 1.6 ; *
15 : edgomez 1.7 ; * 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 : edgomez 1.6 ; *
20 : edgomez 1.7 ; * 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 1.1 ; *
24 : edgomez 1.7 ; * $Id$
25 : Isibaar 1.1 ; *
26 : edgomez 1.7 ; ***************************************************************************/
27 : Isibaar 1.1
28 : edgomez 1.7 BITS 32
29 : suxen_drol 1.2
30 : edgomez 1.7 %macro cglobal 1
31 : Isibaar 1.1 %ifdef PREFIX
32 : edgomez 1.9 %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 1.1 %else
40 : edgomez 1.9 %ifdef MARK_FUNCS
41 :     global %1:function
42 :     %else
43 :     global %1
44 :     %endif
45 : Isibaar 1.1 %endif
46 :     %endmacro
47 :    
48 : edgomez 1.7 ;=============================================================================
49 :     ; Read only data
50 :     ;=============================================================================
51 :    
52 :     %ifdef FORMAT_COFF
53 : edgomez 1.8 SECTION .rodata
54 : edgomez 1.7 %else
55 : edgomez 1.8 SECTION .rodata align=16
56 : edgomez 1.7 %endif
57 :    
58 :     ALIGN 16
59 :     mmx_one: times 4 dw 1
60 :    
61 :     ;=============================================================================
62 :     ; Helper macros
63 :     ;=============================================================================
64 :    
65 :     %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 : Isibaar 1.1
119 : edgomez 1.7 %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 : Isibaar 1.1
129 : edgomez 1.7 %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 : Isibaar 1.1
139 : edgomez 1.7 ;=============================================================================
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 : Isibaar 1.1
152 : edgomez 1.7 ;-----------------------------------------------------------------------------
153 : Isibaar 1.1 ;
154 :     ; uint32_t sad16_xmm(const uint8_t * const cur,
155 :     ; const uint8_t * const ref,
156 : suxen_drol 1.2 ; const uint32_t stride,
157 : Isibaar 1.1 ; const uint32_t best_sad);
158 : suxen_drol 1.2 ;
159 : edgomez 1.7 ;-----------------------------------------------------------------------------
160 : Isibaar 1.1
161 : edgomez 1.7 ALIGN 16
162 : Isibaar 1.1 sad16_xmm:
163 :    
164 : edgomez 1.7 mov eax, [esp+ 4] ; Src1
165 :     mov edx, [esp+ 8] ; Src2
166 :     mov ecx, [esp+12] ; Stride
167 :    
168 :     pxor mm5, mm5 ; accum1
169 :     pxor mm6, mm6 ; accum2
170 :    
171 :     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 :    
180 :     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 :    
189 :     paddusw mm6,mm5
190 :     movd eax, mm6
191 :     ret
192 : Isibaar 1.1
193 :    
194 : edgomez 1.7 ;-----------------------------------------------------------------------------
195 : Isibaar 1.1 ;
196 :     ; uint32_t sad8_xmm(const uint8_t * const cur,
197 :     ; const uint8_t * const ref,
198 :     ; const uint32_t stride);
199 :     ;
200 : edgomez 1.7 ;-----------------------------------------------------------------------------
201 : Isibaar 1.1
202 : edgomez 1.7 ALIGN 16
203 :     sad8_xmm:
204 : suxen_drol 1.2
205 : edgomez 1.7 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 1.2
211 : edgomez 1.7 pxor mm5, mm5 ; accum1
212 :     pxor mm6, mm6 ; accum2
213 : suxen_drol 1.2
214 : edgomez 1.7 SAD_8x8_SSE
215 :     SAD_8x8_SSE
216 :     SAD_8x8_SSE
217 : suxen_drol 1.2
218 : edgomez 1.7 movq mm0, [eax]
219 :     movq mm1, [eax+ecx]
220 :     psadbw mm0, [edx]
221 :     psadbw mm1, [edx+ecx]
222 : suxen_drol 1.2
223 : edgomez 1.7 pop ebx
224 : suxen_drol 1.2
225 : edgomez 1.7 paddusw mm5,mm0
226 :     paddusw mm6,mm1
227 : suxen_drol 1.2
228 : edgomez 1.7 paddusw mm6,mm5
229 :     movd eax, mm6
230 : suxen_drol 1.2
231 : edgomez 1.7 ret
232 : suxen_drol 1.2
233 :    
234 : edgomez 1.7 ;-----------------------------------------------------------------------------
235 : suxen_drol 1.2 ;
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 1.7 ;-----------------------------------------------------------------------------
242 : suxen_drol 1.2
243 : edgomez 1.7 ALIGN 16
244 :     sad16bi_xmm:
245 :     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 :    
251 :     pxor mm5, mm5 ; accum1
252 :     pxor mm6, mm6 ; accum2
253 :    
254 :     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 :    
263 :     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 :    
272 :     paddusw mm6,mm5
273 :     movd eax, mm6
274 :     pop ebx
275 :     ret
276 : Isibaar 1.1
277 : edgomez 1.7 ;-----------------------------------------------------------------------------
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 1.1
286 : edgomez 1.7 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 :    
294 :     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 :    
302 :     paddusw mm6,mm5
303 :     movd eax, mm6
304 :     pop ebx
305 :     ret
306 : suxen_drol 1.2
307 :    
308 : edgomez 1.7 ;-----------------------------------------------------------------------------
309 : suxen_drol 1.2 ;
310 :     ; uint32_t dev16_xmm(const uint8_t * const cur,
311 :     ; const uint32_t stride);
312 :     ;
313 : edgomez 1.7 ;-----------------------------------------------------------------------------
314 : Isibaar 1.1
315 : edgomez 1.7 ALIGN 16
316 : Isibaar 1.1 dev16_xmm:
317 :    
318 : edgomez 1.7 mov eax, [esp+ 4] ; Src
319 :     mov ecx, [esp+ 8] ; Stride
320 : Isibaar 1.1
321 : edgomez 1.7 pxor mm7, mm7 ; zero
322 :     pxor mm5, mm5 ; mean accums
323 :     pxor mm6, mm6
324 :    
325 :     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 :    
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 :     MEAN_16x16_SSE
342 :    
343 :     paddusw mm6, mm5
344 :    
345 :     movq mm4, mm6
346 :     psllq mm4, 32
347 :     paddd mm4, mm6
348 :     psrld mm4, 8 ; /= (16*16)
349 :    
350 :     packssdw mm4, mm4
351 :     packuswb mm4, mm4
352 :    
353 :     ; mm4 contains the mean
354 :    
355 :     mov eax, [esp+ 4] ; Src
356 :    
357 :    
358 :     pxor mm5, mm5 ; sums
359 :     pxor mm6, mm6
360 :    
361 :     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 :    
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 :     ABS_16x16_SSE
378 :    
379 :     paddusw mm6, mm5
380 :     movq mm7, mm6
381 :     psllq mm7, 32
382 :     paddd mm6, mm7
383 : edgomez 1.6
384 : edgomez 1.7 movd eax, mm6
385 :     ret
386 : edgomez 1.6
387 : edgomez 1.7 ;-----------------------------------------------------------------------------
388 : edgomez 1.6 ;int sad16v_xmm(const uint8_t * const cur,
389 :     ; const uint8_t * const ref,
390 :     ; const uint32_t stride,
391 :     ; int* sad8);
392 : edgomez 1.7 ;-----------------------------------------------------------------------------
393 :    
394 :     ALIGN 16
395 : edgomez 1.6 sad16v_xmm:
396 : edgomez 1.7 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 :    
402 :     pxor mm5, mm5 ; accum1
403 :     pxor mm6, mm6 ; accum2
404 :     pxor mm7, mm7 ; total
405 :    
406 :     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 :    
415 :     paddusw mm7, mm5
416 :     paddusw mm7, mm6
417 :     movd [ebx], mm5
418 :     movd [ebx+4], mm6
419 :    
420 :     pxor mm5, mm5 ; accum1
421 :     pxor mm6, mm6 ; accum2
422 :    
423 :     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