[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.6.2.1 - (view) (download)

1 : edgomez 1.6.2.1 ;/****************************************************************************
2 : Isibaar 1.1 ; *
3 : edgomez 1.6.2.1 ; * XVID MPEG-4 VIDEO CODEC
4 :     ; * - K7 optimized SAD operators -
5 : Isibaar 1.1 ; *
6 : edgomez 1.6.2.1 ; * 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.6.2.1 ; * 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.6.2.1 ; * 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.6.2.1 ; * 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.6.2.1 ; * $Id$
25 : Isibaar 1.1 ; *
26 : edgomez 1.6.2.1 ; ***************************************************************************/
27 : Isibaar 1.1
28 : edgomez 1.6.2.1 BITS 32
29 : suxen_drol 1.2
30 : edgomez 1.6.2.1 %macro cglobal 1
31 : Isibaar 1.1 %ifdef PREFIX
32 : edgomez 1.6.2.1 global _%1
33 : Isibaar 1.1 %define %1 _%1
34 :     %else
35 :     global %1
36 :     %endif
37 :     %endmacro
38 :    
39 : edgomez 1.6.2.1 ;=============================================================================
40 :     ; Read only data
41 :     ;=============================================================================
42 :    
43 :     SECTION .rodata
44 :    
45 :     ALIGN 16
46 :     mmx_one: times 4 dw 1
47 :    
48 :     ;=============================================================================
49 :     ; Helper macros
50 :     ;=============================================================================
51 :    
52 :     %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 : Isibaar 1.1
106 : edgomez 1.6.2.1 %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 : Isibaar 1.1
116 : edgomez 1.6.2.1 %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 : Isibaar 1.1
126 : edgomez 1.6.2.1 ;=============================================================================
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 : Isibaar 1.1
139 : edgomez 1.6.2.1 ;-----------------------------------------------------------------------------
140 : Isibaar 1.1 ;
141 :     ; uint32_t sad16_xmm(const uint8_t * const cur,
142 :     ; const uint8_t * const ref,
143 : suxen_drol 1.2 ; const uint32_t stride,
144 : Isibaar 1.1 ; const uint32_t best_sad);
145 : suxen_drol 1.2 ;
146 : edgomez 1.6.2.1 ;-----------------------------------------------------------------------------
147 : Isibaar 1.1
148 : edgomez 1.6.2.1 ALIGN 16
149 : Isibaar 1.1 sad16_xmm:
150 :    
151 : edgomez 1.6.2.1 mov eax, [esp+ 4] ; Src1
152 :     mov edx, [esp+ 8] ; Src2
153 :     mov ecx, [esp+12] ; Stride
154 :    
155 :     pxor mm5, mm5 ; accum1
156 :     pxor mm6, mm6 ; accum2
157 :    
158 :     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 :    
167 :     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 :    
176 :     paddusw mm6,mm5
177 :     movd eax, mm6
178 :     ret
179 : Isibaar 1.1
180 :    
181 : edgomez 1.6.2.1 ;-----------------------------------------------------------------------------
182 : Isibaar 1.1 ;
183 :     ; uint32_t sad8_xmm(const uint8_t * const cur,
184 :     ; const uint8_t * const ref,
185 :     ; const uint32_t stride);
186 :     ;
187 : edgomez 1.6.2.1 ;-----------------------------------------------------------------------------
188 : suxen_drol 1.2
189 : edgomez 1.6.2.1 ALIGN 16
190 : suxen_drol 1.2 sad8_xmm:
191 :    
192 : edgomez 1.6.2.1 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 1.2
198 : edgomez 1.6.2.1 pxor mm5, mm5 ; accum1
199 :     pxor mm6, mm6 ; accum2
200 : suxen_drol 1.2
201 : edgomez 1.6.2.1 SAD_8x8_SSE
202 :     SAD_8x8_SSE
203 :     SAD_8x8_SSE
204 : suxen_drol 1.2
205 : edgomez 1.6.2.1 movq mm0, [eax]
206 :     movq mm1, [eax+ecx]
207 :     psadbw mm0, [edx]
208 :     psadbw mm1, [edx+ecx]
209 : suxen_drol 1.2
210 : edgomez 1.6.2.1 pop ebx
211 : suxen_drol 1.2
212 : edgomez 1.6.2.1 paddusw mm5,mm0
213 :     paddusw mm6,mm1
214 : suxen_drol 1.2
215 : edgomez 1.6.2.1 paddusw mm6,mm5
216 :     movd eax, mm6
217 : suxen_drol 1.2
218 : edgomez 1.6.2.1 ret
219 : suxen_drol 1.2
220 : edgomez 1.6.2.1
221 :     ;-----------------------------------------------------------------------------
222 : suxen_drol 1.2 ;
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 1.6.2.1 ;-----------------------------------------------------------------------------
229 : Isibaar 1.1
230 : edgomez 1.6.2.1 ALIGN 16
231 :     sad16bi_xmm:
232 :     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 :    
238 :     pxor mm5, mm5 ; accum1
239 :     pxor mm6, mm6 ; accum2
240 :    
241 :     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 :    
250 :     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 :    
259 :     paddusw mm6,mm5
260 :     movd eax, mm6
261 :     pop ebx
262 :     ret
263 : Isibaar 1.1
264 : edgomez 1.6.2.1 ;-----------------------------------------------------------------------------
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 1.1
273 : edgomez 1.6.2.1 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 :    
281 :     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 :    
289 :     paddusw mm6,mm5
290 :     movd eax, mm6
291 :     pop ebx
292 :     ret
293 : suxen_drol 1.2
294 :    
295 : edgomez 1.6.2.1 ;-----------------------------------------------------------------------------
296 : suxen_drol 1.2 ;
297 :     ; uint32_t dev16_xmm(const uint8_t * const cur,
298 :     ; const uint32_t stride);
299 :     ;
300 : edgomez 1.6.2.1 ;-----------------------------------------------------------------------------
301 : Isibaar 1.1
302 : edgomez 1.6.2.1 ALIGN 16
303 : Isibaar 1.1 dev16_xmm:
304 :    
305 : edgomez 1.6.2.1 mov eax, [esp+ 4] ; Src
306 :     mov ecx, [esp+ 8] ; Stride
307 : Isibaar 1.1
308 : edgomez 1.6.2.1 pxor mm7, mm7 ; zero
309 :     pxor mm5, mm5 ; mean accums
310 :     pxor mm6, mm6
311 :    
312 :     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 :    
321 :     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 :    
330 :     paddusw mm6, mm5
331 :    
332 :     movq mm4, mm6
333 :     psllq mm4, 32
334 :     paddd mm4, mm6
335 :     psrld mm4, 8 ; /= (16*16)
336 :    
337 :     packssdw mm4, mm4
338 :     packuswb mm4, mm4
339 :    
340 :     ; mm4 contains the mean
341 :    
342 :     mov eax, [esp+ 4] ; Src
343 :    
344 :    
345 :     pxor mm5, mm5 ; sums
346 :     pxor mm6, mm6
347 :    
348 :     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 :    
357 :     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 :    
366 :     paddusw mm6, mm5
367 :     movq mm7, mm6
368 :     psllq mm7, 32
369 :     paddd mm6, mm7
370 : edgomez 1.6
371 : edgomez 1.6.2.1 movd eax, mm6
372 :     ret
373 : edgomez 1.6
374 : edgomez 1.6.2.1 ;-----------------------------------------------------------------------------
375 : edgomez 1.6 ;int sad16v_xmm(const uint8_t * const cur,
376 :     ; const uint8_t * const ref,
377 :     ; const uint32_t stride,
378 :     ; int* sad8);
379 : edgomez 1.6.2.1 ;-----------------------------------------------------------------------------
380 : edgomez 1.6
381 : edgomez 1.6.2.1 ALIGN 16
382 :     sad16v_xmm:
383 :     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 :    
389 :     pxor mm5, mm5 ; accum1
390 :     pxor mm6, mm6 ; accum2
391 :     pxor mm7, mm7 ; total
392 :    
393 :     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 :    
402 :     paddusw mm7, mm5
403 :     paddusw mm7, mm6
404 :     movd [ebx], mm5
405 :     movd [ebx+4], mm6
406 :    
407 :     pxor mm5, mm5 ; accum1
408 :     pxor mm6, mm6 ; accum2
409 :    
410 :     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