Parent Directory | Revision Log
Revision 1.5 - (view) (download)
1 : | Isibaar | 1.1 | ;/************************************************************************** |
2 : | ; * | ||
3 : | ; * XVID MPEG-4 VIDEO CODEC | ||
4 : | ; * mmx/xmm sum of absolute difference | ||
5 : | ; * | ||
6 : | ; * This program is free software; you can redistribute it and/or modify | ||
7 : | ; * it under the terms of the GNU General Public License as published by | ||
8 : | ; * the Free Software Foundation; either version 2 of the License, or | ||
9 : | ; * (at your option) any later version. | ||
10 : | ; * | ||
11 : | ; * This program is distributed in the hope that it will be useful, | ||
12 : | ; * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 : | ; * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 : | ; * GNU General Public License for more details. | ||
15 : | ; * | ||
16 : | ; * You should have received a copy of the GNU General Public License | ||
17 : | ; * along with this program; if not, write to the Free Software | ||
18 : | ; * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
19 : | ; * | ||
20 : | ; *************************************************************************/ | ||
21 : | |||
22 : | ;/************************************************************************** | ||
23 : | ; * | ||
24 : | ; * History: | ||
25 : | ; * | ||
26 : | ; * 23.07.2002 sad[16,8]bi_xmm; <pross@xvid.org> | ||
27 : | ; * 04.06.2002 cleanup -Skal- | ||
28 : | ; * 12.11.2001 inital version; (c)2001 peter ross <pross@cs.rmit.edu.au> | ||
29 : | ; * | ||
30 : | ; *************************************************************************/ | ||
31 : | |||
32 : | bits 32 | ||
33 : | |||
34 : | %macro cglobal 1 | ||
35 : | Isibaar | 1.5 | ; * 04.06.2002 rewrote some funcs (XMM mainly) -Skal- |
36 : | h | 1.4 | ; * 24.04.2002 sse2 dev16, faster sse2 sad16 |
37 : | h | 1.3 | ; * 17.04.2002 sse2 sad16 |
38 : | Isibaar | 1.1 | ; * 17.11.2001 bugfix and small improvement for dev16_xmm, |
39 : | ; * removed terminate early in sad16_xmm | ||
40 : | %define %1 _%1 | ||
41 : | %else | ||
42 : | global %1 | ||
43 : | %endif | ||
44 : | %endmacro | ||
45 : | |||
46 : | section .data | ||
47 : | |||
48 : | align 16 | ||
49 : | mmx_one times 4 dw 1 | ||
50 : | |||
51 : | section .text | ||
52 : | |||
53 : | cglobal sad16_mmx | ||
54 : | cglobal sad8_mmx | ||
55 : | cglobal sad16bi_mmx | ||
56 : | cglobal sad8bi_mmx | ||
57 : | |||
58 : | cglobal dev16_mmx | ||
59 : | |||
60 : | ;=========================================================================== | ||
61 : | |||
62 : | ; | ||
63 : | ; uint32_t sad16_mmx(const uint8_t * const cur, | ||
64 : | Isibaar | 1.5 | ; const uint8_t * const ref, |
65 : | cglobal sad16_xmm | ||
66 : | cglobal sad16_sse2 | ||
67 : | cglobal sad16bi_xmm | ||
68 : | ; const uint32_t stride, | ||
69 : | cglobal sad8_xmm | ||
70 : | ; (early termination ignore; slows this down) | ||
71 : | cglobal dev16_xmm | ||
72 : | cglobal dev16_sse2 | ||
73 : | Isibaar | 1.1 | ; |
74 : | ;=========================================================================== | ||
75 : | |||
76 : | %macro SAD_16x16_MMX 0 | ||
77 : | ; const uint8_t * const ref, | ||
78 : | ; const uint32_t stride, | ||
79 : | ; const uint32_t best_sad); | ||
80 : | movq mm2, [eax+8] | ||
81 : | movq mm3, [edx+8] | ||
82 : | |||
83 : | movq mm4, mm0 | ||
84 : | psubusb mm0, mm1 | ||
85 : | Isibaar | 1.5 | lea eax,[eax+ecx] |
86 : | movq mm5, mm2 | ||
87 : | psubusb mm2, mm3 | ||
88 : | lea edx,[edx+ecx] | ||
89 : | |||
90 : | psubusb mm1, mm4 | ||
91 : | por mm0, mm1 | ||
92 : | psubusb mm3, mm5 | ||
93 : | por mm2, mm3 | ||
94 : | |||
95 : | movq mm1,mm0 | ||
96 : | movq mm3,mm2 | ||
97 : | |||
98 : | punpcklbw mm0,mm7 | ||
99 : | punpckhbw mm1,mm7 | ||
100 : | punpcklbw mm2,mm7 | ||
101 : | punpckhbw mm3,mm7 | ||
102 : | |||
103 : | paddusw mm0,mm1 | ||
104 : | paddusw mm6,mm0 | ||
105 : | paddusw mm2,mm3 | ||
106 : | paddusw mm6,mm2 | ||
107 : | %endmacro | ||
108 : | |||
109 : | align 16 | ||
110 : | sad16_mmx: | ||
111 : | |||
112 : | mov eax, [esp+ 4] ; Src1 | ||
113 : | mov edx, [esp+ 8] ; Src2 | ||
114 : | mov ecx, [esp+12] ; Stride | ||
115 : | |||
116 : | pxor mm6, mm6 ; accum | ||
117 : | pxor mm7, mm7 ; zero | ||
118 : | Isibaar | 1.1 | |
119 : | Isibaar | 1.5 | SAD_16x16_MMX |
120 : | Isibaar | 1.1 | SAD_16x16_MMX |
121 : | Isibaar | 1.5 | SAD_16x16_MMX |
122 : | SAD_16x16_MMX | ||
123 : | SAD_16x16_MMX | ||
124 : | SAD_16x16_MMX | ||
125 : | SAD_16x16_MMX | ||
126 : | SAD_16x16_MMX | ||
127 : | |||
128 : | .Loop | ||
129 : | SAD_16x16_MMX | ||
130 : | SAD_16x16_MMX | ||
131 : | SAD_16x16_MMX | ||
132 : | SAD_16x16_MMX | ||
133 : | SAD_16x16_MMX | ||
134 : | SAD_16x16_MMX | ||
135 : | SAD_16x16_MMX | ||
136 : | SAD_16x16_MMX | ||
137 : | |||
138 : | pmaddwd mm6, [mmx_one] ; collapse | ||
139 : | movq mm7, mm6 | ||
140 : | psrlq mm7, 32 | ||
141 : | paddd mm6, mm7 | ||
142 : | |||
143 : | movd eax, mm6 | ||
144 : | |||
145 : | ret | ||
146 : | |||
147 : | |||
148 : | ;=========================================================================== | ||
149 : | ; | ||
150 : | ; uint32_t sad8_mmx(const uint8_t * const cur, | ||
151 : | Isibaar | 1.1 | ; const uint8_t * const ref, |
152 : | Isibaar | 1.5 | ; const uint32_t stride); |
153 : | Isibaar | 1.1 | ; |
154 : | Isibaar | 1.5 | ;=========================================================================== |
155 : | Isibaar | 1.1 | |
156 : | ;=========================================================================== | ||
157 : | ; | ||
158 : | ; uint32_t sad16_xmm(const uint8_t * const cur, | ||
159 : | ; const uint8_t * const ref, | ||
160 : | ; const uint32_t stride, | ||
161 : | ; const uint32_t best_sad); | ||
162 : | ; | ||
163 : | ;=========================================================================== | ||
164 : | |||
165 : | Isibaar | 1.5 | %macro SAD_16x16_SSE 0 |
166 : | movq mm0, [eax] | ||
167 : | psadbw mm0, [edx] | ||
168 : | movq mm1, [eax+8] | ||
169 : | add eax, ecx | ||
170 : | psadbw mm1, [edx+8] | ||
171 : | paddusw mm5,mm0 | ||
172 : | add edx, ecx | ||
173 : | paddusw mm6,mm1 | ||
174 : | %endmacro | ||
175 : | |||
176 : | Isibaar | 1.1 | align 16 |
177 : | Isibaar | 1.5 | sad16_xmm: |
178 : | Isibaar | 1.1 | |
179 : | Isibaar | 1.5 | mov eax, [esp+ 4] ; Src1 |
180 : | mov edx, [esp+ 8] ; Src2 | ||
181 : | mov ecx, [esp+12] ; Stride | ||
182 : | |||
183 : | pxor mm5, mm5 ; accum1 | ||
184 : | pxor mm6, mm6 ; accum2 | ||
185 : | .Loop | ||
186 : | SAD_16x16_SSE | ||
187 : | SAD_16x16_SSE | ||
188 : | SAD_16x16_SSE | ||
189 : | SAD_16x16_SSE | ||
190 : | SAD_16x16_SSE | ||
191 : | SAD_16x16_SSE | ||
192 : | SAD_16x16_SSE | ||
193 : | SAD_16x16_SSE | ||
194 : | |||
195 : | SAD_16x16_SSE | ||
196 : | SAD_16x16_SSE | ||
197 : | SAD_16x16_SSE | ||
198 : | SAD_16x16_SSE | ||
199 : | SAD_16x16_SSE | ||
200 : | SAD_16x16_SSE | ||
201 : | SAD_16x16_SSE | ||
202 : | SAD_16x16_SSE | ||
203 : | |||
204 : | paddusw mm6,mm5 | ||
205 : | movd eax, mm6 | ||
206 : | ret | ||
207 : | Isibaar | 1.1 | |
208 : | Isibaar | 1.5 | ;=========================================================================== |
209 : | ; | ||
210 : | ; uint32_t sad16bi_xmm(const uint8_t * const cur, | ||
211 : | ; const uint8_t * const ref1, | ||
212 : | ; const uint8_t * const ref2, | ||
213 : | ; const uint32_t stride); | ||
214 : | ; | ||
215 : | ;=========================================================================== | ||
216 : | h | 1.2 | |
217 : | Isibaar | 1.5 | %macro SADBI_16x16_SSE 0 |
218 : | movq mm0, [eax] | ||
219 : | movq mm1, [eax+8] | ||
220 : | h | 1.2 | |
221 : | Isibaar | 1.5 | movq mm2, [edx] |
222 : | movq mm3, [edx+8] | ||
223 : | h | 1.2 | |
224 : | Isibaar | 1.5 | pavgb mm2, [ebx] |
225 : | add edx, ecx | ||
226 : | h | 1.2 | |
227 : | Isibaar | 1.5 | pavgb mm3, [ebx+8] |
228 : | add ebx, ecx | ||
229 : | h | 1.2 | |
230 : | Isibaar | 1.5 | psadbw mm0, mm2 |
231 : | add eax, ecx | ||
232 : | h | 1.2 | |
233 : | Isibaar | 1.5 | psadbw mm1, mm3 |
234 : | paddusw mm5,mm0 | ||
235 : | h | 1.2 | |
236 : | Isibaar | 1.5 | paddusw mm6,mm1 |
237 : | %endmacro | ||
238 : | h | 1.2 | |
239 : | Isibaar | 1.5 | align 16 |
240 : | sad16bi_xmm: | ||
241 : | push ebx | ||
242 : | mov eax, [esp+4+ 4] ; Src | ||
243 : | mov edx, [esp+4+ 8] ; Ref1 | ||
244 : | mov ebx, [esp+4+12] ; Ref2 | ||
245 : | mov ecx, [esp+4+16] ; Stride | ||
246 : | |||
247 : | pxor mm5, mm5 ; accum1 | ||
248 : | pxor mm6, mm6 ; accum2 | ||
249 : | .Loop | ||
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 : | SADBI_16x16_SSE | ||
260 : | SADBI_16x16_SSE | ||
261 : | SADBI_16x16_SSE | ||
262 : | SADBI_16x16_SSE | ||
263 : | SADBI_16x16_SSE | ||
264 : | SADBI_16x16_SSE | ||
265 : | SADBI_16x16_SSE | ||
266 : | SADBI_16x16_SSE | ||
267 : | |||
268 : | paddusw mm6,mm5 | ||
269 : | movd eax, mm6 | ||
270 : | pop ebx | ||
271 : | ret | ||
272 : | h | 1.2 | %macro SAD_8x8_MMX 0 |
273 : | Isibaar | 1.5 | movq mm0, [eax] |
274 : | movq mm1, [edx] | ||
275 : | |||
276 : | movq mm2, [eax+ecx] | ||
277 : | movq mm3, [edx+ecx] | ||
278 : | |||
279 : | lea eax,[eax+2*ecx] | ||
280 : | h | 1.2 | lea edx,[edx+2*ecx] |
281 : | Isibaar | 1.5 | |
282 : | movq mm4, mm0 | ||
283 : | psubusb mm0, mm1 | ||
284 : | movq mm5, mm2 | ||
285 : | psubusb mm2, mm3 | ||
286 : | |||
287 : | psubusb mm1, mm4 | ||
288 : | por mm0, mm1 | ||
289 : | psubusb mm3, mm5 | ||
290 : | por mm2, mm3 | ||
291 : | |||
292 : | movq mm1,mm0 | ||
293 : | movq mm3,mm2 | ||
294 : | |||
295 : | punpcklbw mm0,mm7 | ||
296 : | punpckhbw mm1,mm7 | ||
297 : | punpcklbw mm2,mm7 | ||
298 : | punpckhbw mm3,mm7 | ||
299 : | |||
300 : | paddusw mm0,mm1 | ||
301 : | paddusw mm6,mm0 | ||
302 : | paddusw mm2,mm3 | ||
303 : | paddusw mm6,mm2 | ||
304 : | %endmacro | ||
305 : | |||
306 : | align 16 | ||
307 : | sad8_mmx: | ||
308 : | |||
309 : | mov eax, [esp+ 4] ; Src1 | ||
310 : | mov edx, [esp+ 8] ; Src2 | ||
311 : | mov ecx, [esp+12] ; Stride | ||
312 : | |||
313 : | pxor mm6, mm6 ; accum | ||
314 : | h | 1.2 | pxor mm7, mm7 ; zero |
315 : | Isibaar | 1.5 | |
316 : | SAD_8x8_MMX | ||
317 : | h | 1.2 | SAD_8x8_MMX |
318 : | Isibaar | 1.5 | SAD_8x8_MMX |
319 : | SAD_8x8_MMX | ||
320 : | |||
321 : | pmaddwd mm6, [mmx_one] ; collapse | ||
322 : | movq mm7, mm6 | ||
323 : | psrlq mm7, 32 | ||
324 : | paddd mm6, mm7 | ||
325 : | .Loop | ||
326 : | |||
327 : | movd eax, mm6 | ||
328 : | |||
329 : | ret | ||
330 : | |||
331 : | |||
332 : | |||
333 : | |||
334 : | |||
335 : | h | 1.2 | ;=========================================================================== |
336 : | Isibaar | 1.5 | ; |
337 : | h | 1.2 | ; uint32_t sad16bi_mmx(const uint8_t * const cur, |
338 : | Isibaar | 1.5 | ; const uint8_t * const ref1, |
339 : | h | 1.2 | movq mm0, [eax] |
340 : | Isibaar | 1.5 | movq mm2, [eax+8] |
341 : | lea eax,[eax+ecx] | ||
342 : | ; uint32_t sad8_xmm(const uint8_t * const cur, | ||
343 : | ; const uint8_t * const ref, | ||
344 : | ; const uint32_t stride); | ||
345 : | ; | ||
346 : | ;=========================================================================== | ||
347 : | h | 1.2 | |
348 : | Isibaar | 1.5 | %macro SAD_8x8_SSE 0 |
349 : | movq mm0, [eax] | ||
350 : | movq mm1, [eax+ecx] | ||
351 : | |||
352 : | psadbw mm0, [edx] | ||
353 : | psadbw mm1, [edx+ecx] | ||
354 : | add eax, ebx | ||
355 : | add edx, ebx | ||
356 : | h | 1.2 | |
357 : | Isibaar | 1.5 | paddusw mm5,mm0 |
358 : | paddusw mm6,mm1 | ||
359 : | %endmacro | ||
360 : | h | 1.2 | |
361 : | Isibaar | 1.5 | align 16 |
362 : | sad8_xmm: | ||
363 : | h | 1.2 | |
364 : | Isibaar | 1.5 | mov eax, [esp+ 4] ; Src1 |
365 : | mov edx, [esp+ 8] ; Src2 | ||
366 : | mov ecx, [esp+12] ; Stride | ||
367 : | push ebx | ||
368 : | lea ebx, [ecx+ecx] | ||
369 : | |||
370 : | pxor mm5, mm5 ; accum1 | ||
371 : | pxor mm6, mm6 ; accum2 | ||
372 : | .Loop | ||
373 : | SAD_8x8_SSE | ||
374 : | SAD_8x8_SSE | ||
375 : | SAD_8x8_SSE | ||
376 : | |||
377 : | movq mm0, [eax] | ||
378 : | movq mm1, [eax+ecx] | ||
379 : | psadbw mm0, [edx] | ||
380 : | psadbw mm1, [edx+ecx] | ||
381 : | |||
382 : | pop ebx | ||
383 : | h | 1.2 | |
384 : | Isibaar | 1.5 | paddusw mm5,mm0 |
385 : | paddusw mm6,mm1 | ||
386 : | h | 1.2 | |
387 : | Isibaar | 1.5 | paddusw mm6,mm5 |
388 : | movd eax, mm6 | ||
389 : | h | 1.2 | |
390 : | Isibaar | 1.5 | ret |
391 : | h | 1.2 | |
392 : | Isibaar | 1.5 | ;=========================================================================== |
393 : | ; | ||
394 : | movq mm1, mm0 | ||
395 : | movq mm3, mm2 | ||
396 : | punpcklbw mm0,mm7 | ||
397 : | punpcklbw mm2,mm7 | ||
398 : | h | 1.2 | punpckhbw mm1,mm7 |
399 : | Isibaar | 1.5 | punpckhbw mm3,mm7 |
400 : | paddw mm5, mm0 | ||
401 : | paddw mm6, mm1 | ||
402 : | paddw mm5, mm2 | ||
403 : | paddw mm6, mm3 | ||
404 : | %endmacro | ||
405 : | |||
406 : | %macro ABS_16x16_MMX 0 | ||
407 : | movq mm0, [eax] | ||
408 : | movq mm2, [eax+8] | ||
409 : | lea eax,[eax+ecx] | ||
410 : | movq mm1, mm0 | ||
411 : | movq mm3, mm2 | ||
412 : | punpcklbw mm0, mm7 | ||
413 : | punpcklbw mm2, mm7 | ||
414 : | h | 1.2 | punpckhbw mm1, mm7 |
415 : | Isibaar | 1.5 | punpckhbw mm3, mm7 |
416 : | movq mm4, mm6 | ||
417 : | psubusw mm4, mm0 | ||
418 : | |||
419 : | psubusw mm0, mm6 | ||
420 : | por mm0, mm4 | ||
421 : | movq mm4, mm6 | ||
422 : | psubusw mm4, mm1 | ||
423 : | psubusw mm1, mm6 | ||
424 : | por mm1, mm4 | ||
425 : | |||
426 : | psubusw mm4, mm0 | ||
427 : | psubusw mm4, mm2 | ||
428 : | psubusw mm0, mm6 | ||
429 : | por mm0, mm4 | ||
430 : | movq mm4, mm6 | ||
431 : | psubusw mm4, mm1 | ||
432 : | psubusw mm1, mm6 | ||
433 : | por mm1, mm4 | ||
434 : | |||
435 : | paddw mm0, mm1 | ||
436 : | psubusw mm4, mm2 | ||
437 : | psubusw mm2, mm6 | ||
438 : | por mm2, mm4 | ||
439 : | movq mm4, mm6 | ||
440 : | psubusw mm4, mm3 | ||
441 : | psubusw mm3, mm6 | ||
442 : | por mm3, mm4 | ||
443 : | h | 1.2 | |
444 : | Isibaar | 1.5 | paddw mm0, mm1 |
445 : | paddw mm2, mm3 | ||
446 : | paddw mm5, mm0 | ||
447 : | paddw mm5, mm2 | ||
448 : | pxor mm6, mm6 ; accum2 | ||
449 : | h | 1.2 | |
450 : | Isibaar | 1.5 | MEAN_16x16_MMX |
451 : | MEAN_16x16_MMX | ||
452 : | MEAN_16x16_MMX | ||
453 : | MEAN_16x16_MMX | ||
454 : | MEAN_16x16_MMX | ||
455 : | MEAN_16x16_MMX | ||
456 : | MEAN_16x16_MMX | ||
457 : | MEAN_16x16_MMX | ||
458 : | |||
459 : | MEAN_16x16_MMX | ||
460 : | MEAN_16x16_MMX | ||
461 : | MEAN_16x16_MMX | ||
462 : | MEAN_16x16_MMX | ||
463 : | MEAN_16x16_MMX | ||
464 : | MEAN_16x16_MMX | ||
465 : | MEAN_16x16_MMX | ||
466 : | MEAN_16x16_MMX | ||
467 : | |||
468 : | paddusw mm6, mm5 | ||
469 : | pmaddwd mm6, [mmx_one] ; collapse | ||
470 : | movq mm5, mm6 | ||
471 : | psrlq mm5, 32 | ||
472 : | paddd mm6, mm5 | ||
473 : | |||
474 : | psllq mm6, 32 ; blank upper dword | ||
475 : | psrlq mm6, 32 + 8 ; /= (16*16) | ||
476 : | |||
477 : | punpckldq mm6, mm6 | ||
478 : | packssdw mm6, mm6 | ||
479 : | |||
480 : | ; mm6 contains the mean | ||
481 : | ; mm5 is the new accum | ||
482 : | |||
483 : | pxor mm5, mm5 | ||
484 : | psrlq mm6, 32 + 8 ; /= (16*16) | ||
485 : | |||
486 : | punpckldq mm6, mm6 | ||
487 : | packssdw mm6, mm6 | ||
488 : | ABS_16x16_MMX | ||
489 : | ; mm6 contains the mean | ||
490 : | ; mm5 is the new accum | ||
491 : | ABS_16x16_MMX | ||
492 : | ABS_16x16_MMX | ||
493 : | ABS_16x16_MMX | ||
494 : | |||
495 : | ABS_16x16_MMX | ||
496 : | ABS_16x16_MMX | ||
497 : | ABS_16x16_MMX | ||
498 : | ABS_16x16_MMX | ||
499 : | ABS_16x16_MMX | ||
500 : | ABS_16x16_MMX | ||
501 : | ABS_16x16_MMX | ||
502 : | ABS_16x16_MMX | ||
503 : | |||
504 : | pmaddwd mm5, [mmx_one] ; collapse | ||
505 : | movq mm6, mm5 | ||
506 : | psrlq mm6, 32 | ||
507 : | paddd mm6, mm5 | ||
508 : | |||
509 : | movd eax, mm6 | ||
510 : | ret | ||
511 : | ret | ||
512 : | |||
513 : | ;=========================================================================== | ||
514 : | ; | ||
515 : | ; uint32_t dev16_xmm(const uint8_t * const cur, | ||
516 : | ; const uint32_t stride); | ||
517 : | h | 1.2 | ; |
518 : | Isibaar | 1.5 | ;=========================================================================== |
519 : | |||
520 : | h | 1.2 | %macro MEAN_16x16_SSE 0 |
521 : | Isibaar | 1.5 | movq mm0, [eax] |
522 : | movq mm1, [eax+8] | ||
523 : | psadbw mm0, mm7 | ||
524 : | psadbw mm1, mm7 | ||
525 : | add eax, ecx | ||
526 : | paddw mm5, mm0 | ||
527 : | h | 1.2 | paddw mm6, mm1 |
528 : | Isibaar | 1.5 | %endmacro |
529 : | |||
530 : | %macro ABS_16x16_SSE 0 | ||
531 : | movq mm0, [eax] | ||
532 : | movq mm1, [eax+8] | ||
533 : | psadbw mm0, mm4 | ||
534 : | psadbw mm1, mm4 | ||
535 : | lea eax,[eax+ecx] | ||
536 : | paddw mm5, mm0 | ||
537 : | paddw mm6, mm1 | ||
538 : | %endmacro | ||
539 : | |||
540 : | align 16 | ||
541 : | dev16_xmm: | ||
542 : | |||
543 : | mov eax, [esp+ 4] ; Src | ||
544 : | mov ecx, [esp+ 8] ; Stride | ||
545 : | |||
546 : | pxor mm7, mm7 ; zero | ||
547 : | h | 1.2 | pxor mm5, mm5 ; mean accums |
548 : | Isibaar | 1.5 | pxor mm6, mm6 |
549 : | |||
550 : | h | 1.2 | MEAN_16x16_SSE |
551 : | Isibaar | 1.5 | MEAN_16x16_SSE |
552 : | MEAN_16x16_SSE | ||
553 : | MEAN_16x16_SSE | ||
554 : | MEAN_16x16_SSE | ||
555 : | MEAN_16x16_SSE | ||
556 : | MEAN_16x16_SSE | ||
557 : | MEAN_16x16_SSE | ||
558 : | |||
559 : | MEAN_16x16_SSE | ||
560 : | MEAN_16x16_SSE | ||
561 : | MEAN_16x16_SSE | ||
562 : | MEAN_16x16_SSE | ||
563 : | MEAN_16x16_SSE | ||
564 : | MEAN_16x16_SSE | ||
565 : | MEAN_16x16_SSE | ||
566 : | MEAN_16x16_SSE | ||
567 : | |||
568 : | paddusw mm6, mm5 | ||
569 : | |||
570 : | movq mm4, mm6 | ||
571 : | psllq mm4, 32 | ||
572 : | paddd mm4, mm6 | ||
573 : | psrld mm4, 8 ; /= (16*16) | ||
574 : | |||
575 : | packssdw mm4, mm4 | ||
576 : | packuswb mm4, mm4 | ||
577 : | |||
578 : | ; mm4 contains the mean | ||
579 : | |||
580 : | mov eax, [esp+ 4] ; Src | ||
581 : | |||
582 : | h | 1.2 | pxor mm5, mm5 ; sums |
583 : | Isibaar | 1.5 | pxor mm6, mm6 |
584 : | |||
585 : | h | 1.2 | ABS_16x16_SSE |
586 : | Isibaar | 1.5 | ABS_16x16_SSE |
587 : | h | 1.2 | ABS_16x16_SSE |
588 : | Isibaar | 1.5 | ABS_16x16_SSE |
589 : | h | 1.2 | ABS_16x16_SSE |
590 : | Isibaar | 1.5 | ABS_16x16_SSE |
591 : | ABS_16x16_SSE | ||
592 : | h | 1.2 | ABS_16x16_SSE |
593 : | Isibaar | 1.5 | |
594 : | ABS_16x16_SSE | ||
595 : | ABS_16x16_SSE | ||
596 : | ABS_16x16_SSE | ||
597 : | ABS_16x16_SSE | ||
598 : | ABS_16x16_SSE | ||
599 : | ABS_16x16_SSE | ||
600 : | ABS_16x16_SSE | ||
601 : | ABS_16x16_SSE | ||
602 : | |||
603 : | paddusw mm6, mm5 | ||
604 : | movq mm7, mm6 | ||
605 : | psllq mm7, 32 | ||
606 : | paddd mm6, mm7 | ||
607 : | |||
608 : | movd eax, mm6 | ||
609 : | ret | ||
610 : | Isibaar | 1.1 | |
611 : | Isibaar | 1.5 | ;=========================================================================== |
612 : | ; | ||
613 : | ; uint32_t sad16_sse2(const uint8_t * const cur, | ||
614 : | ; const uint8_t * const ref, | ||
615 : | Isibaar | 1.1 | ; const uint32_t stride, |
616 : | Isibaar | 1.5 | ; const uint32_t best_sad); |
617 : | ; | ||
618 : | Isibaar | 1.1 | ; experimental - runs faster than xmm on a p4 1.6 / sd133 ram |
619 : | h | 1.3 | ; |
620 : | ;=========================================================================== | ||
621 : | |||
622 : | align 16 | ||
623 : | cglobal sad16_sse2 | ||
624 : | sad16_sse2 | ||
625 : | push esi | ||
626 : | push edi | ||
627 : | push ebx | ||
628 : | |||
629 : | mov esi, [esp + 12 + 4] ; cur | ||
630 : | mov edi, [esp + 12 + 8] ; ref | ||
631 : | movdqu xmm0, [edi] ; ref line 0 | ||
632 : | mov eax, [esp + 12 + 12] ; stride | ||
633 : | |||
634 : | movdqu xmm1, [edi+eax] ; ref line 1 | ||
635 : | mov ebx, eax | ||
636 : | mov ecx, eax | ||
637 : | shl ebx, 2 | ||
638 : | movdqu xmm2, [edi+eax*2] ; ref line 2 | ||
639 : | h | 1.4 | add ecx, ebx ; ecx = stride*5 |
640 : | h | 1.3 | mov edx, ebx |
641 : | sub ebx, eax ; ebx = stride*3 | ||
642 : | h | 1.4 | movdqu xmm3, [edi+ebx] ; ref line 3 |
643 : | h | 1.3 | add edx, ebx ; edx = stride*7 |
644 : | |||
645 : | pxor xmm7, xmm7 ; xmm7 = sum =0 | ||
646 : | h | 1.4 | |
647 : | h | 1.3 | psadbw xmm0, [esi] ; cur line 0 |
648 : | psadbw xmm1, [esi+eax] ; cur line 1 | ||
649 : | paddusw xmm7, xmm0 | ||
650 : | h | 1.4 | psadbw xmm2, [esi+eax*2] ; cur line 2 |
651 : | h | 1.3 | movdqu xmm0, [edi+eax*4] ; ref line 4 |
652 : | paddusw xmm7, xmm1 | ||
653 : | psadbw xmm3, [esi+ebx] ; cur line 3 | ||
654 : | movdqu xmm1, [edi+ecx] ; ref line 5 | ||
655 : | h | 1.4 | paddusw xmm7, xmm2 |
656 : | movdqu xmm2, [edi+ebx*2] ; ref line 6 | ||
657 : | h | 1.3 | paddusw xmm7, xmm3 |
658 : | h | 1.4 | |
659 : | psadbw xmm0, [esi+eax*4] ; cur line 4 | ||
660 : | h | 1.3 | movdqu xmm3, [edi+edx] ; ref line 7 |
661 : | h | 1.4 | add edi, edx ; add 7 lines to ref |
662 : | psadbw xmm1, [esi+ecx] ; cur line 5 | ||
663 : | h | 1.3 | paddusw xmm7, xmm0 |
664 : | h | 1.4 | movdqu xmm0, [edi+eax] ; ref line 8 |
665 : | h | 1.3 | psadbw xmm2, [esi+ebx*2] ; cur line 6 |
666 : | paddusw xmm7, xmm1 | ||
667 : | h | 1.4 | movdqu xmm1, [edi+eax*2] ; ref line 9 |
668 : | psadbw xmm3, [esi+edx] ; cur line 7 | ||
669 : | paddusw xmm7, xmm2 | ||
670 : | movdqu xmm2, [edi+ebx] ; ref line 10 | ||
671 : | h | 1.3 | paddusw xmm7, xmm3 |
672 : | h | 1.4 | |
673 : | add esi, edx | ||
674 : | h | 1.3 | movdqu xmm3, [edi+eax*4] ; ref line 11 |
675 : | h | 1.4 | add edi, eax |
676 : | add esi, eax ; esi,edi += 8 lines | ||
677 : | h | 1.3 | |
678 : | h | 1.4 | psadbw xmm0, [esi] ; cur line 8 |
679 : | h | 1.3 | psadbw xmm1, [esi+eax] ; cur line 9 |
680 : | paddusw xmm7, xmm0 | ||
681 : | h | 1.4 | psadbw xmm2, [esi+eax*2] ; cur line 10 |
682 : | movdqu xmm0, [edi+eax*4] ; ref line 12 | ||
683 : | h | 1.3 | paddusw xmm7, xmm1 |
684 : | h | 1.4 | psadbw xmm3, [esi+ebx] ; cur line 11 |
685 : | h | 1.3 | movdqu xmm1, [edi+ecx] ; ref line 13 |
686 : | h | 1.4 | paddusw xmm7, xmm2 |
687 : | movdqu xmm2, [edi+ebx*2] ; ref line 14 | ||
688 : | h | 1.3 | paddusw xmm7, xmm3 |
689 : | h | 1.4 | |
690 : | psadbw xmm0, [esi+eax*4] ; cur line 12 | ||
691 : | h | 1.3 | movdqu xmm3, [edi+edx] ; ref line 15 |
692 : | h | 1.4 | psadbw xmm1, [esi+ecx] ; cur line 13 |
693 : | paddusw xmm7, xmm0 | ||
694 : | h | 1.3 | psadbw xmm2, [esi+ebx*2] ; cur line 14 |
695 : | h | 1.4 | paddusw xmm7, xmm1 |
696 : | h | 1.3 | psadbw xmm3, [esi+edx] ; cur line 15 |
697 : | paddusw xmm7, xmm2 | ||
698 : | h | 1.4 | paddusw xmm7, xmm3 |
699 : | |||
700 : | movhlps xmm6, xmm7 ; move high 8 xmm7 bytes to low 8 xmm6 bytes | ||
701 : | h | 1.3 | paddusw xmm7, xmm6 |
702 : | h | 1.4 | movd eax, xmm7 ; return sum |
703 : | h | 1.3 | |
704 : | h | 1.4 | pop ebx |
705 : | h | 1.3 | pop edi |
706 : | pop esi | ||
707 : | |||
708 : | ret | ||
709 : | |||
710 : | ;=========================================================================== | ||
711 : | ; | ||
712 : | ; uint32_t dev16_sse2(const uint8_t * const cur, | ||
713 : | ; const uint32_t stride); | ||
714 : | ; | ||
715 : | ; not fully tested! | ||
716 : | ; | ||
717 : | h | 1.4 | ;=========================================================================== |
718 : | |||
719 : | align 16 | ||
720 : | cglobal dev16_sse2 | ||
721 : | dev16_sse2 | ||
722 : | |||
723 : | push esi | ||
724 : | push edi | ||
725 : | |||
726 : | pxor xmm4, xmm4 ; xmm4 = sum | ||
727 : | pxor xmm7, xmm7 ; xmm7 = 0 | ||
728 : | |||
729 : | mov esi, [esp + 8 + 4] ; cur | ||
730 : | mov ecx, [esp + 8 + 8] ; stride | ||
731 : | mov edi, esi | ||
732 : | mov edx, ecx | ||
733 : | shl edx, 1 | ||
734 : | add edx, ecx ; edx = stride*3 | ||
735 : | |||
736 : | movdqa xmm0, [esi] | ||
737 : | movdqa xmm1, [esi+ecx] | ||
738 : | psadbw xmm0, xmm7 | ||
739 : | movdqa xmm2, [esi+ecx*2] | ||
740 : | paddw xmm4, xmm0 | ||
741 : | psadbw xmm1, xmm7 | ||
742 : | movdqa xmm3, [esi+edx] | ||
743 : | paddw xmm4, xmm1 | ||
744 : | psadbw xmm2, xmm7 | ||
745 : | psadbw xmm3, xmm7 | ||
746 : | paddw xmm4, xmm2 | ||
747 : | paddw xmm4, xmm3 | ||
748 : | add esi, ecx ; esi += stride*4 | ||
749 : | add esi, edx | ||
750 : | |||
751 : | movdqa xmm0, [esi] | ||
752 : | movdqa xmm1, [esi+ecx] | ||
753 : | psadbw xmm0, xmm7 | ||
754 : | movdqa xmm2, [esi+ecx*2] | ||
755 : | paddw xmm4, xmm0 | ||
756 : | psadbw xmm1, xmm7 | ||
757 : | movdqa xmm3, [esi+edx] | ||
758 : | paddw xmm4, xmm1 | ||
759 : | psadbw xmm2, xmm7 | ||
760 : | psadbw xmm3, xmm7 | ||
761 : | paddw xmm4, xmm2 | ||
762 : | paddw xmm4, xmm3 | ||
763 : | add esi, ecx | ||
764 : | add esi, edx | ||
765 : | |||
766 : | movdqa xmm0, [esi] | ||
767 : | movdqa xmm1, [esi+ecx] | ||
768 : | psadbw xmm0, xmm7 | ||
769 : | movdqa xmm2, [esi+ecx*2] | ||
770 : | paddw xmm4, xmm0 | ||
771 : | psadbw xmm1, xmm7 | ||
772 : | movdqa xmm3, [esi+edx] | ||
773 : | paddw xmm4, xmm1 | ||
774 : | psadbw xmm2, xmm7 | ||
775 : | psadbw xmm3, xmm7 | ||
776 : | paddw xmm4, xmm2 | ||
777 : | paddw xmm4, xmm3 | ||
778 : | add esi, ecx | ||
779 : | add esi, edx | ||
780 : | |||
781 : | movdqa xmm0, [esi] | ||
782 : | movdqa xmm1, [esi+ecx] | ||
783 : | psadbw xmm0, xmm7 | ||
784 : | movdqa xmm2, [esi+ecx*2] | ||
785 : | paddw xmm4, xmm0 | ||
786 : | psadbw xmm1, xmm7 | ||
787 : | movdqa xmm3, [esi+edx] | ||
788 : | paddw xmm4, xmm1 | ||
789 : | psadbw xmm2, xmm7 | ||
790 : | psadbw xmm3, xmm7 | ||
791 : | paddw xmm4, xmm2 | ||
792 : | paddw xmm4, xmm3 | ||
793 : | |||
794 : | movhlps xmm5, xmm4 | ||
795 : | paddw xmm4, xmm5 | ||
796 : | movlhps xmm4, xmm4 | ||
797 : | movdqa xmm5, xmm4 | ||
798 : | psllq xmm5, 32 | ||
799 : | paddd xmm4, xmm5 | ||
800 : | |||
801 : | psrld xmm4, 8 | ||
802 : | packssdw xmm4, xmm4 | ||
803 : | packuswb xmm4, xmm4 | ||
804 : | |||
805 : | pxor xmm6, xmm6 ; xmm6 = dev = 0 | ||
806 : | |||
807 : | movdqa xmm0, [edi] | ||
808 : | movdqa xmm1, [edi+ecx] | ||
809 : | psadbw xmm0, xmm4 | ||
810 : | movdqa xmm2, [edi+ecx*2] | ||
811 : | paddw xmm6, xmm0 | ||
812 : | psadbw xmm1, xmm4 | ||
813 : | movdqa xmm3, [edi+edx] | ||
814 : | paddw xmm6, xmm1 | ||
815 : | psadbw xmm2, xmm4 | ||
816 : | psadbw xmm3, xmm4 | ||
817 : | paddw xmm6, xmm2 | ||
818 : | paddw xmm6, xmm3 | ||
819 : | add edi, ecx | ||
820 : | add edi, edx | ||
821 : | |||
822 : | movdqa xmm0, [edi] | ||
823 : | movdqa xmm1, [edi+ecx] | ||
824 : | psadbw xmm0, xmm4 | ||
825 : | movdqa xmm2, [edi+ecx*2] | ||
826 : | paddw xmm6, xmm0 | ||
827 : | psadbw xmm1, xmm4 | ||
828 : | movdqa xmm3, [edi+edx] | ||
829 : | paddw xmm6, xmm1 | ||
830 : | psadbw xmm2, xmm4 | ||
831 : | psadbw xmm3, xmm4 | ||
832 : | paddw xmm6, xmm2 | ||
833 : | paddw xmm6, xmm3 | ||
834 : | add edi, ecx | ||
835 : | add edi, edx | ||
836 : | |||
837 : | movdqa xmm0, [edi] | ||
838 : | movdqa xmm1, [edi+ecx] | ||
839 : | psadbw xmm0, xmm4 | ||
840 : | movdqa xmm2, [edi+ecx*2] | ||
841 : | paddw xmm6, xmm0 | ||
842 : | psadbw xmm1, xmm4 | ||
843 : | movdqa xmm3, [edi+edx] | ||
844 : | paddw xmm6, xmm1 | ||
845 : | psadbw xmm2, xmm4 | ||
846 : | psadbw xmm3, xmm4 | ||
847 : | paddw xmm6, xmm2 | ||
848 : | paddw xmm6, xmm3 | ||
849 : | add edi, ecx | ||
850 : | add edi, edx | ||
851 : | |||
852 : | movdqa xmm0, [edi] | ||
853 : | movdqa xmm1, [edi+ecx] | ||
854 : | psadbw xmm0, xmm4 | ||
855 : | movdqa xmm2, [edi+ecx*2] | ||
856 : | paddw xmm6, xmm0 | ||
857 : | psadbw xmm1, xmm4 | ||
858 : | movdqa xmm3, [edi+edx] | ||
859 : | paddw xmm6, xmm1 | ||
860 : | psadbw xmm2, xmm4 | ||
861 : | psadbw xmm3, xmm4 | ||
862 : | paddw xmm6, xmm2 | ||
863 : | paddw xmm6, xmm3 | ||
864 : | |||
865 : | movhlps xmm7, xmm6 | ||
866 : | paddd xmm6, xmm7 | ||
867 : | movd eax, xmm6 | ||
868 : | |||
869 : | pop edi | ||
870 : | pop esi | ||
871 : | |||
872 : | ret |
No admin address has been configured | ViewVC Help |
Powered by ViewVC 1.0.4 |