[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.7 - (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.7 global _%1
33 : Isibaar 1.1 %define %1 _%1
34 :     %else
35 :     global %1
36 :     %endif
37 :     %endmacro
38 :    
39 : edgomez 1.7 ;=============================================================================
40 :     ; Read only data
41 :     ;=============================================================================
42 :    
43 :     %ifdef FORMAT_COFF
44 :     SECTION .rodata data
45 :     %else
46 :     SECTION .rodata data align=16
47 :     %endif
48 :    
49 :     ALIGN 16
50 :     mmx_one: times 4 dw 1
51 :    
52 :     ;=============================================================================
53 :     ; Helper macros
54 :     ;=============================================================================
55 :    
56 :     %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 : Isibaar 1.1
110 : edgomez 1.7 %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 : Isibaar 1.1
120 : edgomez 1.7 %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 : Isibaar 1.1
130 : edgomez 1.7 ;=============================================================================
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 : Isibaar 1.1
143 : edgomez 1.7 ;-----------------------------------------------------------------------------
144 : Isibaar 1.1 ;
145 :     ; uint32_t sad16_xmm(const uint8_t * const cur,
146 :     ; const uint8_t * const ref,
147 : suxen_drol 1.2 ; const uint32_t stride,
148 : Isibaar 1.1 ; const uint32_t best_sad);
149 : suxen_drol 1.2 ;
150 : edgomez 1.7 ;-----------------------------------------------------------------------------
151 : Isibaar 1.1
152 : edgomez 1.7 ALIGN 16
153 : Isibaar 1.1 sad16_xmm:
154 :    
155 : edgomez 1.7 mov eax, [esp+ 4] ; Src1
156 :     mov edx, [esp+ 8] ; Src2
157 :     mov ecx, [esp+12] ; Stride
158 :    
159 :     pxor mm5, mm5 ; accum1
160 :     pxor mm6, mm6 ; accum2
161 :    
162 :     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 :    
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 :     paddusw mm6,mm5
181 :     movd eax, mm6
182 :     ret
183 : Isibaar 1.1
184 :    
185 : edgomez 1.7 ;-----------------------------------------------------------------------------
186 : Isibaar 1.1 ;
187 :     ; uint32_t sad8_xmm(const uint8_t * const cur,
188 :     ; const uint8_t * const ref,
189 :     ; const uint32_t stride);
190 :     ;
191 : edgomez 1.7 ;-----------------------------------------------------------------------------
192 : Isibaar 1.1
193 : edgomez 1.7 ALIGN 16
194 :     sad8_xmm:
195 : suxen_drol 1.2
196 : edgomez 1.7 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 1.2
202 : edgomez 1.7 pxor mm5, mm5 ; accum1
203 :     pxor mm6, mm6 ; accum2
204 : suxen_drol 1.2
205 : edgomez 1.7 SAD_8x8_SSE
206 :     SAD_8x8_SSE
207 :     SAD_8x8_SSE
208 : suxen_drol 1.2
209 : edgomez 1.7 movq mm0, [eax]
210 :     movq mm1, [eax+ecx]
211 :     psadbw mm0, [edx]
212 :     psadbw mm1, [edx+ecx]
213 : suxen_drol 1.2
214 : edgomez 1.7 pop ebx
215 : suxen_drol 1.2
216 : edgomez 1.7 paddusw mm5,mm0
217 :     paddusw mm6,mm1
218 : suxen_drol 1.2
219 : edgomez 1.7 paddusw mm6,mm5
220 :     movd eax, mm6
221 : suxen_drol 1.2
222 : edgomez 1.7 ret
223 : suxen_drol 1.2
224 :    
225 : edgomez 1.7 ;-----------------------------------------------------------------------------
226 : suxen_drol 1.2 ;
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 1.7 ;-----------------------------------------------------------------------------
233 : suxen_drol 1.2
234 : edgomez 1.7 ALIGN 16
235 :     sad16bi_xmm:
236 :     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 :    
242 :     pxor mm5, mm5 ; accum1
243 :     pxor mm6, mm6 ; accum2
244 :    
245 :     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 :    
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 :     paddusw mm6,mm5
264 :     movd eax, mm6
265 :     pop ebx
266 :     ret
267 : Isibaar 1.1
268 : edgomez 1.7 ;-----------------------------------------------------------------------------
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 1.1
277 : edgomez 1.7 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 :    
285 :     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 :    
293 :     paddusw mm6,mm5
294 :     movd eax, mm6
295 :     pop ebx
296 :     ret
297 : suxen_drol 1.2
298 :    
299 : edgomez 1.7 ;-----------------------------------------------------------------------------
300 : suxen_drol 1.2 ;
301 :     ; uint32_t dev16_xmm(const uint8_t * const cur,
302 :     ; const uint32_t stride);
303 :     ;
304 : edgomez 1.7 ;-----------------------------------------------------------------------------
305 : Isibaar 1.1
306 : edgomez 1.7 ALIGN 16
307 : Isibaar 1.1 dev16_xmm:
308 :    
309 : edgomez 1.7 mov eax, [esp+ 4] ; Src
310 :     mov ecx, [esp+ 8] ; Stride
311 : Isibaar 1.1
312 : edgomez 1.7 pxor mm7, mm7 ; zero
313 :     pxor mm5, mm5 ; mean accums
314 :     pxor mm6, mm6
315 :    
316 :     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 :    
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 :     paddusw mm6, mm5
335 :    
336 :     movq mm4, mm6
337 :     psllq mm4, 32
338 :     paddd mm4, mm6
339 :     psrld mm4, 8 ; /= (16*16)
340 :    
341 :     packssdw mm4, mm4
342 :     packuswb mm4, mm4
343 :    
344 :     ; mm4 contains the mean
345 :    
346 :     mov eax, [esp+ 4] ; Src
347 :    
348 :    
349 :     pxor mm5, mm5 ; sums
350 :     pxor mm6, mm6
351 :    
352 :     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 :    
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 :     paddusw mm6, mm5
371 :     movq mm7, mm6
372 :     psllq mm7, 32
373 :     paddd mm6, mm7
374 : edgomez 1.6
375 : edgomez 1.7 movd eax, mm6
376 :     ret
377 : edgomez 1.6
378 : edgomez 1.7 ;-----------------------------------------------------------------------------
379 : edgomez 1.6 ;int sad16v_xmm(const uint8_t * const cur,
380 :     ; const uint8_t * const ref,
381 :     ; const uint32_t stride,
382 :     ; int* sad8);
383 : edgomez 1.7 ;-----------------------------------------------------------------------------
384 :    
385 :     ALIGN 16
386 : edgomez 1.6 sad16v_xmm:
387 : edgomez 1.7 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 :    
393 :     pxor mm5, mm5 ; accum1
394 :     pxor mm6, mm6 ; accum2
395 :     pxor mm7, mm7 ; total
396 :    
397 :     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 :    
406 :     paddusw mm7, mm5
407 :     paddusw mm7, mm6
408 :     movd [ebx], mm5
409 :     movd [ebx+4], mm6
410 :    
411 :     pxor mm5, mm5 ; accum1
412 :     pxor mm6, mm6 ; accum2
413 :    
414 :     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