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

Annotation of /branches/dev-api-4/xvidcore/src/image/x86_asm/interpolate8x8_mmx.asm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 851 - (view) (download)
Original Path: trunk/xvidcore/src/image/x86_asm/interpolate8x8_mmx.asm

1 : edgomez 851 ;/**************************************************************************
2 : Isibaar 262 ; *
3 : edgomez 851 ; * XVID MPEG-4 VIDEO CODEC
4 :     ; * mmx 8x8 block-based halfpel interpolation
5 : Isibaar 262 ; *
6 : edgomez 851 ; * 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 : Isibaar 262 ; *
11 : edgomez 851 ; * 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 : Isibaar 262 ; *
16 : edgomez 851 ; * 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 : Isibaar 262 ; *
20 : edgomez 851 ; *************************************************************************/
21 :    
22 :     ;/**************************************************************************
23 : Isibaar 262 ; *
24 : edgomez 851 ; * History:
25 : Isibaar 262 ; *
26 : edgomez 851 ; * 05.10.2002 added some qpel mmx code - Isibaar
27 :     ; * 06.07.2002 mmx cleanup - Isibaar
28 :     ; * 22.12.2001 inital version; (c)2001 peter ross <pross@cs.rmit.edu.au>
29 : edgomez 651 ; *
30 : edgomez 851 ; *************************************************************************/
31 : Isibaar 262
32 : edgomez 851
33 : Isibaar 262 bits 32
34 :    
35 :     %macro cglobal 1
36 :     %ifdef PREFIX
37 :     global _%1
38 :     %define %1 _%1
39 :     %else
40 :     global %1
41 :     %endif
42 :     %endmacro
43 :    
44 :     section .data
45 :    
46 :     align 16
47 :    
48 :     ;===========================================================================
49 : edgomez 851 ; (16 - r) rounding table
50 :     ;===========================================================================
51 :    
52 :     rounding_lowpass_mmx
53 :     times 4 dw 16
54 :     times 4 dw 15
55 :    
56 :     ;===========================================================================
57 : Isibaar 262 ; (1 - r) rounding table
58 :     ;===========================================================================
59 :    
60 :     rounding1_mmx
61 :     times 4 dw 1
62 :     times 4 dw 0
63 :    
64 :     ;===========================================================================
65 :     ; (2 - r) rounding table
66 :     ;===========================================================================
67 :    
68 :     rounding2_mmx
69 :     times 4 dw 2
70 :     times 4 dw 1
71 :    
72 :     mmx_one
73 :     times 8 db 1
74 :    
75 : edgomez 851 mmx_two
76 :     times 8 db 2
77 :    
78 :     mmx_three
79 :     times 8 db 3
80 :    
81 :     mmx_five
82 :     times 4 dw 5
83 :    
84 :     mmx_mask
85 :     times 8 db 254
86 :    
87 :     mmx_mask2
88 :     times 8 db 252
89 :    
90 : Isibaar 262 section .text
91 :    
92 :     %macro CALC_AVG 6
93 :     punpcklbw %3, %6
94 :     punpckhbw %4, %6
95 :    
96 :     paddusw %1, %3 ; mm01 += mm23
97 :     paddusw %2, %4
98 :     paddusw %1, %5 ; mm01 += rounding
99 :     paddusw %2, %5
100 :    
101 :     psrlw %1, 1 ; mm01 >>= 1
102 :     psrlw %2, 1
103 :    
104 :     %endmacro
105 :    
106 :    
107 :     ;===========================================================================
108 :     ;
109 :     ; void interpolate8x8_halfpel_h_mmx(uint8_t * const dst,
110 :     ; const uint8_t * const src,
111 :     ; const uint32_t stride,
112 :     ; const uint32_t rounding);
113 :     ;
114 :     ;===========================================================================
115 :    
116 :     %macro COPY_H_MMX 0
117 :     movq mm0, [esi]
118 :     movq mm2, [esi + 1]
119 :     movq mm1, mm0
120 :     movq mm3, mm2
121 :    
122 :     punpcklbw mm0, mm6 ; mm01 = [src]
123 :     punpckhbw mm1, mm6 ; mm23 = [src + 1]
124 :    
125 :     CALC_AVG mm0, mm1, mm2, mm3, mm7, mm6
126 :    
127 :     packuswb mm0, mm1
128 :     movq [edi], mm0 ; [dst] = mm01
129 :    
130 :     add esi, edx ; src += stride
131 :     add edi, edx ; dst += stride
132 :     %endmacro
133 :    
134 :     align 16
135 :     cglobal interpolate8x8_halfpel_h_mmx
136 :     interpolate8x8_halfpel_h_mmx
137 :    
138 :     push esi
139 :     push edi
140 :    
141 :     mov eax, [esp + 8 + 16] ; rounding
142 :    
143 :     interpolate8x8_halfpel_h_mmx.start
144 :     movq mm7, [rounding1_mmx + eax * 8]
145 :    
146 :     mov edi, [esp + 8 + 4] ; dst
147 :     mov esi, [esp + 8 + 8] ; src
148 :     mov edx, [esp + 8 + 12] ; stride
149 :    
150 :     pxor mm6, mm6 ; zero
151 :    
152 :     COPY_H_MMX
153 :     COPY_H_MMX
154 :     COPY_H_MMX
155 :     COPY_H_MMX
156 :     COPY_H_MMX
157 :     COPY_H_MMX
158 :     COPY_H_MMX
159 :     COPY_H_MMX
160 :    
161 :     pop edi
162 :     pop esi
163 :    
164 :     ret
165 :    
166 :    
167 :     ;===========================================================================
168 :     ;
169 :     ; void interpolate8x8_halfpel_v_mmx(uint8_t * const dst,
170 :     ; const uint8_t * const src,
171 :     ; const uint32_t stride,
172 :     ; const uint32_t rounding);
173 :     ;
174 :     ;===========================================================================
175 :    
176 :     %macro COPY_V_MMX 0
177 :     movq mm0, [esi]
178 :     movq mm2, [esi + edx]
179 :     movq mm1, mm0
180 :     movq mm3, mm2
181 :    
182 :     punpcklbw mm0, mm6 ; mm01 = [src]
183 :     punpckhbw mm1, mm6 ; mm23 = [src + 1]
184 :    
185 :     CALC_AVG mm0, mm1, mm2, mm3, mm7, mm6
186 :    
187 :     packuswb mm0, mm1
188 :     movq [edi], mm0 ; [dst] = mm01
189 :    
190 :     add esi, edx ; src += stride
191 :     add edi, edx ; dst += stride
192 :     %endmacro
193 :    
194 :     align 16
195 :     cglobal interpolate8x8_halfpel_v_mmx
196 :     interpolate8x8_halfpel_v_mmx
197 :    
198 :     push esi
199 :     push edi
200 :    
201 :     mov eax, [esp + 8 + 16] ; rounding
202 :    
203 :     interpolate8x8_halfpel_v_mmx.start
204 :     movq mm7, [rounding1_mmx + eax * 8]
205 :    
206 :     mov edi, [esp + 8 + 4] ; dst
207 :     mov esi, [esp + 8 + 8] ; src
208 :     mov edx, [esp + 8 + 12] ; stride
209 :    
210 :     pxor mm6, mm6 ; zero
211 :    
212 :    
213 :     COPY_V_MMX
214 :     COPY_V_MMX
215 :     COPY_V_MMX
216 :     COPY_V_MMX
217 :     COPY_V_MMX
218 :     COPY_V_MMX
219 :     COPY_V_MMX
220 :     COPY_V_MMX
221 :    
222 :     pop edi
223 :     pop esi
224 :    
225 :     ret
226 :    
227 :    
228 :     ;===========================================================================
229 :     ;
230 :     ; void interpolate8x8_halfpel_hv_mmx(uint8_t * const dst,
231 :     ; const uint8_t * const src,
232 :     ; const uint32_t stride,
233 :     ; const uint32_t rounding);
234 :     ;
235 :     ;
236 :     ;===========================================================================
237 :    
238 :     %macro COPY_HV_MMX 0
239 :     ; current row
240 :    
241 :     movq mm0, [esi]
242 :     movq mm2, [esi + 1]
243 :    
244 :     movq mm1, mm0
245 :     movq mm3, mm2
246 :    
247 :     punpcklbw mm0, mm6 ; mm01 = [src]
248 :     punpcklbw mm2, mm6 ; mm23 = [src + 1]
249 :     punpckhbw mm1, mm6
250 :     punpckhbw mm3, mm6
251 :    
252 :     paddusw mm0, mm2 ; mm01 += mm23
253 :     paddusw mm1, mm3
254 :    
255 :     ; next row
256 :    
257 :     movq mm4, [esi + edx]
258 :     movq mm2, [esi + edx + 1]
259 :    
260 :     movq mm5, mm4
261 :     movq mm3, mm2
262 :    
263 :     punpcklbw mm4, mm6 ; mm45 = [src + stride]
264 :     punpcklbw mm2, mm6 ; mm23 = [src + stride + 1]
265 :     punpckhbw mm5, mm6
266 :     punpckhbw mm3, mm6
267 :    
268 :     paddusw mm4, mm2 ; mm45 += mm23
269 :     paddusw mm5, mm3
270 :    
271 :     ; add current + next row
272 :    
273 :     paddusw mm0, mm4 ; mm01 += mm45
274 :     paddusw mm1, mm5
275 :     paddusw mm0, mm7 ; mm01 += rounding2
276 :     paddusw mm1, mm7
277 :    
278 :     psrlw mm0, 2 ; mm01 >>= 2
279 :     psrlw mm1, 2
280 :    
281 :     packuswb mm0, mm1
282 :     movq [edi], mm0 ; [dst] = mm01
283 :    
284 :     add esi, edx ; src += stride
285 :     add edi, edx ; dst += stride
286 :     %endmacro
287 :    
288 :     align 16
289 :     cglobal interpolate8x8_halfpel_hv_mmx
290 :     interpolate8x8_halfpel_hv_mmx
291 :    
292 :     push esi
293 :     push edi
294 :    
295 :     mov eax, [esp + 8 + 16] ; rounding
296 :     interpolate8x8_halfpel_hv_mmx.start
297 :    
298 :     movq mm7, [rounding2_mmx + eax * 8]
299 :    
300 :     mov edi, [esp + 8 + 4] ; dst
301 :     mov esi, [esp + 8 + 8] ; src
302 :    
303 :     mov eax, 8
304 :    
305 :     pxor mm6, mm6 ; zero
306 :    
307 :     mov edx, [esp + 8 + 12] ; stride
308 :    
309 :     COPY_HV_MMX
310 :     COPY_HV_MMX
311 :     COPY_HV_MMX
312 :     COPY_HV_MMX
313 :     COPY_HV_MMX
314 :     COPY_HV_MMX
315 :     COPY_HV_MMX
316 :     COPY_HV_MMX
317 :    
318 :     pop edi
319 :     pop esi
320 :    
321 : chl 434 ret
322 : edgomez 851
323 :     ;===========================================================================
324 :     ;
325 :     ; void interpolate8x8_avg2_mmx(uint8_t const *dst,
326 :     ; const uint8_t * const src1,
327 :     ; const uint8_t * const src2,
328 :     ; const uint32_t stride,
329 :     ; const uint32_t rounding,
330 :     ; const uint32_t height);
331 :     ;
332 :     ;===========================================================================
333 :    
334 :     %macro AVG2_MMX_RND0 0
335 :     movq mm0, [eax] ; src1 -> mm0
336 :     movq mm1, [ebx] ; src2 -> mm1
337 :    
338 :     movq mm4, [eax+edx]
339 :     movq mm5, [ebx+edx]
340 :    
341 :     movq mm2, mm0 ; src1 -> mm2
342 :     movq mm3, mm1 ; src2 -> mm3
343 :    
344 :     pand mm2, mm7 ; isolate the lsb
345 :     pand mm3, mm7 ; isolate the lsb
346 :    
347 :     por mm2, mm3 ; ODD(src1) OR ODD(src2) -> mm2
348 :    
349 :     movq mm3, mm4
350 :     movq mm6, mm5
351 :    
352 :     pand mm3, mm7
353 :     pand mm6, mm7
354 :    
355 :     por mm3, mm6
356 :    
357 :     pand mm0, [mmx_mask]
358 :     pand mm1, [mmx_mask]
359 :     pand mm4, [mmx_mask]
360 :     pand mm5, [mmx_mask]
361 :    
362 :     psrlq mm0, 1 ; src1 / 2
363 :     psrlq mm1, 1 ; src2 / 2
364 :    
365 :     psrlq mm4, 1
366 :     psrlq mm5, 1
367 :    
368 :     paddb mm0, mm1 ; src1/2 + src2/2 -> mm0
369 :     paddb mm0, mm2 ; correct rounding error
370 :    
371 :     paddb mm4, mm5
372 :     paddb mm4, mm3
373 :    
374 :     lea eax,[eax+2*edx]
375 :     lea ebx,[ebx+2*edx]
376 :    
377 :     movq [ecx], mm0 ; (src1 + src2 + 1) / 2 -> dst
378 :     movq [ecx+edx], mm4
379 :     %endmacro
380 :    
381 :     %macro AVG2_MMX_RND1 0
382 :     movq mm0, [eax] ; src1 -> mm0
383 :     movq mm1, [ebx] ; src2 -> mm1
384 :    
385 :     movq mm4, [eax+edx]
386 :     movq mm5, [ebx+edx]
387 :    
388 :     movq mm2, mm0 ; src1 -> mm2
389 :     movq mm3, mm1 ; src2 -> mm3
390 :    
391 :     pand mm2, mm7 ; isolate the lsb
392 :     pand mm3, mm7 ; isolate the lsb
393 :    
394 :     pand mm2, mm3 ; ODD(src1) AND ODD(src2) -> mm2
395 :    
396 :     movq mm3, mm4
397 :     movq mm6, mm5
398 :    
399 :     pand mm3, mm7
400 :     pand mm6, mm7
401 :    
402 :     pand mm3, mm6
403 :    
404 :     pand mm0, [mmx_mask]
405 :     pand mm1, [mmx_mask]
406 :     pand mm4, [mmx_mask]
407 :     pand mm5, [mmx_mask]
408 :    
409 :     psrlq mm0, 1 ; src1 / 2
410 :     psrlq mm1, 1 ; src2 / 2
411 :    
412 :     psrlq mm4, 1
413 :     psrlq mm5, 1
414 :    
415 :     paddb mm0, mm1 ; src1/2 + src2/2 -> mm0
416 :     paddb mm0, mm2 ; correct rounding error
417 :    
418 :     paddb mm4, mm5
419 :     paddb mm4, mm3
420 :    
421 :     lea eax,[eax+2*edx]
422 :     lea ebx,[ebx+2*edx]
423 :    
424 :     movq [ecx], mm0 ; (src1 + src2 + 1) / 2 -> dst
425 :     movq [ecx+edx], mm4
426 :     %endmacro
427 :    
428 :     align 16
429 :     cglobal interpolate8x8_avg2_mmx
430 :     interpolate8x8_avg2_mmx
431 :    
432 :     push ebx
433 :    
434 :     mov eax, [esp + 4 + 20] ; rounding
435 :     test eax, eax
436 :    
437 :     jnz near .rounding1
438 :    
439 :     mov eax, [esp + 4 + 24] ; height -> eax
440 :     sub eax, 8
441 :     test eax, eax
442 :    
443 :     mov ecx, [esp + 4 + 4] ; dst -> edi
444 :     mov eax, [esp + 4 + 8] ; src1 -> esi
445 :     mov ebx, [esp + 4 + 12] ; src2 -> eax
446 :     mov edx, [esp + 4 + 16] ; stride -> edx
447 :    
448 :     movq mm7, [mmx_one]
449 :    
450 :     jz near .start0
451 :    
452 :     AVG2_MMX_RND0
453 :     lea ecx, [ecx+2*edx]
454 :    
455 :     .start0
456 :    
457 :     AVG2_MMX_RND0
458 :     lea ecx, [ecx+2*edx]
459 :     AVG2_MMX_RND0
460 :     lea ecx, [ecx+2*edx]
461 :     AVG2_MMX_RND0
462 :     lea ecx, [ecx+2*edx]
463 :     AVG2_MMX_RND0
464 :    
465 :     pop ebx
466 :     ret
467 :    
468 :     .rounding1
469 :     mov eax, [esp + 4 + 24] ; height -> eax
470 :     sub eax, 8
471 :     test eax, eax
472 :    
473 :     mov ecx, [esp + 4 + 4] ; dst -> edi
474 :     mov eax, [esp + 4 + 8] ; src1 -> esi
475 :     mov ebx, [esp + 4 + 12] ; src2 -> eax
476 :     mov edx, [esp + 4 + 16] ; stride -> edx
477 :    
478 :     movq mm7, [mmx_one]
479 :    
480 :     jz near .start1
481 :    
482 :     AVG2_MMX_RND1
483 :     lea ecx, [ecx+2*edx]
484 :    
485 :     .start1
486 :    
487 :     AVG2_MMX_RND1
488 :     lea ecx, [ecx+2*edx]
489 :     AVG2_MMX_RND1
490 :     lea ecx, [ecx+2*edx]
491 :     AVG2_MMX_RND1
492 :     lea ecx, [ecx+2*edx]
493 :     AVG2_MMX_RND1
494 :    
495 :     pop ebx
496 :     ret
497 :    
498 :    
499 :     ;===========================================================================
500 :     ;
501 :     ; void interpolate8x8_avg4_mmx(uint8_t const *dst,
502 :     ; const uint8_t * const src1,
503 :     ; const uint8_t * const src2,
504 :     ; const uint8_t * const src3,
505 :     ; const uint8_t * const src4,
506 :     ; const uint32_t stride,
507 :     ; const uint32_t rounding);
508 :     ;
509 :     ;===========================================================================
510 :    
511 :     %macro AVG4_MMX_RND0 0
512 :     movq mm0, [eax] ; src1 -> mm0
513 :     movq mm1, [ebx] ; src2 -> mm1
514 :    
515 :     movq mm2, mm0
516 :     movq mm3, mm1
517 :    
518 :     pand mm2, [mmx_three]
519 :     pand mm3, [mmx_three]
520 :    
521 :     pand mm0, [mmx_mask2]
522 :     pand mm1, [mmx_mask2]
523 :    
524 :     psrlq mm0, 2
525 :     psrlq mm1, 2
526 :    
527 :     lea eax, [eax+edx]
528 :     lea ebx, [ebx+edx]
529 :    
530 :     paddb mm0, mm1
531 :     paddb mm2, mm3
532 :    
533 :     movq mm4, [esi] ; src3 -> mm0
534 :     movq mm5, [edi] ; src4 -> mm1
535 :    
536 :     movq mm1, mm4
537 :     movq mm3, mm5
538 :    
539 :     pand mm1, [mmx_three]
540 :     pand mm3, [mmx_three]
541 :    
542 :     pand mm4, [mmx_mask2]
543 :     pand mm5, [mmx_mask2]
544 :    
545 :     psrlq mm4, 2
546 :     psrlq mm5, 2
547 :    
548 :     paddb mm4, mm5
549 :     paddb mm0, mm4
550 :    
551 :     paddb mm1, mm3
552 :     paddb mm2, mm1
553 :    
554 :     paddb mm2, [mmx_two]
555 :     pand mm2, [mmx_mask2]
556 :    
557 :     psrlq mm2, 2
558 :     paddb mm0, mm2
559 :    
560 :     lea esi, [esi+edx]
561 :     lea edi, [edi+edx]
562 :    
563 :     movq [ecx], mm0 ; (src1 + src2 + src3 + src4 + 2) / 4 -> dst
564 :     %endmacro
565 :    
566 :     %macro AVG4_MMX_RND1 0
567 :     movq mm0, [eax] ; src1 -> mm0
568 :     movq mm1, [ebx] ; src2 -> mm1
569 :    
570 :     movq mm2, mm0
571 :     movq mm3, mm1
572 :    
573 :     pand mm2, [mmx_three]
574 :     pand mm3, [mmx_three]
575 :    
576 :     pand mm0, [mmx_mask2]
577 :     pand mm1, [mmx_mask2]
578 :    
579 :     psrlq mm0, 2
580 :     psrlq mm1, 2
581 :    
582 :     lea eax,[eax+edx]
583 :     lea ebx,[ebx+edx]
584 :    
585 :     paddb mm0, mm1
586 :     paddb mm2, mm3
587 :    
588 :     movq mm4, [esi] ; src3 -> mm0
589 :     movq mm5, [edi] ; src4 -> mm1
590 :    
591 :     movq mm1, mm4
592 :     movq mm3, mm5
593 :    
594 :     pand mm1, [mmx_three]
595 :     pand mm3, [mmx_three]
596 :    
597 :     pand mm4, [mmx_mask2]
598 :     pand mm5, [mmx_mask2]
599 :    
600 :     psrlq mm4, 2
601 :     psrlq mm5, 2
602 :    
603 :     paddb mm4, mm5
604 :     paddb mm0, mm4
605 :    
606 :     paddb mm1, mm3
607 :     paddb mm2, mm1
608 :    
609 :     paddb mm2, [mmx_one]
610 :     pand mm2, [mmx_mask2]
611 :    
612 :     psrlq mm2, 2
613 :     paddb mm0, mm2
614 :    
615 :     lea esi,[esi+edx]
616 :     lea edi,[edi+edx]
617 :    
618 :     movq [ecx], mm0 ; (src1 + src2 + src3 + src4 + 2) / 4 -> dst
619 :     %endmacro
620 :    
621 :     align 16
622 :     cglobal interpolate8x8_avg4_mmx
623 :     interpolate8x8_avg4_mmx
624 :    
625 :     push ebx
626 :     push edi
627 :     push esi
628 :    
629 :     mov eax, [esp + 12 + 28] ; rounding
630 :    
631 :     test eax, eax
632 :    
633 :     mov ecx, [esp + 12 + 4] ; dst -> edi
634 :     mov eax, [esp + 12 + 8] ; src1 -> esi
635 :     mov ebx, [esp + 12 + 12] ; src2 -> eax
636 :     mov esi, [esp + 12 + 16] ; src3 -> esi
637 :     mov edi, [esp + 12 + 20] ; src4 -> edi
638 :     mov edx, [esp + 12 + 24] ; stride -> edx
639 :    
640 :     movq mm7, [mmx_one]
641 :    
642 :     jnz near .rounding1
643 :    
644 :     AVG4_MMX_RND0
645 :     lea ecx, [ecx+edx]
646 :     AVG4_MMX_RND0
647 :     lea ecx, [ecx+edx]
648 :     AVG4_MMX_RND0
649 :     lea ecx, [ecx+edx]
650 :     AVG4_MMX_RND0
651 :     lea ecx, [ecx+edx]
652 :     AVG4_MMX_RND0
653 :     lea ecx, [ecx+edx]
654 :     AVG4_MMX_RND0
655 :     lea ecx, [ecx+edx]
656 :     AVG4_MMX_RND0
657 :     lea ecx, [ecx+edx]
658 :     AVG4_MMX_RND0
659 :    
660 :     pop esi
661 :     pop edi
662 :     pop ebx
663 :     ret
664 :    
665 :     .rounding1
666 :     AVG4_MMX_RND1
667 :     lea ecx, [ecx+edx]
668 :     AVG4_MMX_RND1
669 :     lea ecx, [ecx+edx]
670 :     AVG4_MMX_RND1
671 :     lea ecx, [ecx+edx]
672 :     AVG4_MMX_RND1
673 :     lea ecx, [ecx+edx]
674 :     AVG4_MMX_RND1
675 :     lea ecx, [ecx+edx]
676 :     AVG4_MMX_RND1
677 :     lea ecx, [ecx+edx]
678 :     AVG4_MMX_RND1
679 :     lea ecx, [ecx+edx]
680 :     AVG4_MMX_RND1
681 :    
682 :     pop esi
683 :     pop edi
684 :     pop ebx
685 :     ret
686 :    
687 :    
688 :     ;===========================================================================
689 :     ;
690 :     ; void interpolate8x8_6tap_lowpass_h_mmx(uint8_t const *dst,
691 :     ; const uint8_t * const src,
692 :     ; const uint32_t stride,
693 :     ; const uint32_t rounding);
694 :     ;
695 :     ;===========================================================================
696 :    
697 :     %macro LOWPASS_6TAP_H_MMX 0
698 :     movq mm0, [eax]
699 :     movq mm2, [eax+1]
700 :    
701 :     movq mm1, mm0
702 :     movq mm3, mm2
703 :    
704 :     punpcklbw mm0, mm7
705 :     punpcklbw mm2, mm7
706 :    
707 :     punpckhbw mm1, mm7
708 :     punpckhbw mm3, mm7
709 :    
710 :     paddw mm0, mm2
711 :     paddw mm1, mm3
712 :    
713 :     psllw mm0, 2
714 :     psllw mm1, 2
715 :    
716 :     movq mm2, [eax-1]
717 :     movq mm4, [eax+2]
718 :    
719 :     movq mm3, mm2
720 :     movq mm5, mm4
721 :    
722 :     punpcklbw mm2, mm7
723 :     punpcklbw mm4, mm7
724 :    
725 :     punpckhbw mm3, mm7
726 :     punpckhbw mm5, mm7
727 :    
728 :     paddw mm2, mm4
729 :     paddw mm3, mm5
730 :    
731 :     psubsw mm0, mm2
732 :     psubsw mm1, mm3
733 :    
734 :     pmullw mm0, [mmx_five]
735 :     pmullw mm1, [mmx_five]
736 :    
737 :     movq mm2, [eax-2]
738 :     movq mm4, [eax+3]
739 :    
740 :     movq mm3, mm2
741 :     movq mm5, mm4
742 :    
743 :     punpcklbw mm2, mm7
744 :     punpcklbw mm4, mm7
745 :    
746 :     punpckhbw mm3, mm7
747 :     punpckhbw mm5, mm7
748 :    
749 :     paddw mm2, mm4
750 :     paddw mm3, mm5
751 :    
752 :     paddsw mm0, mm2
753 :     paddsw mm1, mm3
754 :    
755 :     paddsw mm0, mm6
756 :     paddsw mm1, mm6
757 :    
758 :     psraw mm0, 5
759 :     psraw mm1, 5
760 :    
761 :     lea eax, [eax+edx]
762 :     packuswb mm0, mm1
763 :     movq [ecx], mm0
764 :     %endmacro
765 :    
766 :     align 16
767 :     cglobal interpolate8x8_6tap_lowpass_h_mmx
768 :     interpolate8x8_6tap_lowpass_h_mmx
769 :    
770 :     mov eax, [esp + 16] ; rounding
771 :    
772 :     movq mm6, [rounding_lowpass_mmx + eax * 8]
773 :    
774 :     mov ecx, [esp + 4] ; dst -> edi
775 :     mov eax, [esp + 8] ; src -> esi
776 :     mov edx, [esp + 12] ; stride -> edx
777 :    
778 :     pxor mm7, mm7
779 :    
780 :     LOWPASS_6TAP_H_MMX
781 :     lea ecx, [ecx+edx]
782 :     LOWPASS_6TAP_H_MMX
783 :     lea ecx, [ecx+edx]
784 :     LOWPASS_6TAP_H_MMX
785 :     lea ecx, [ecx+edx]
786 :     LOWPASS_6TAP_H_MMX
787 :     lea ecx, [ecx+edx]
788 :     LOWPASS_6TAP_H_MMX
789 :     lea ecx, [ecx+edx]
790 :     LOWPASS_6TAP_H_MMX
791 :     lea ecx, [ecx+edx]
792 :     LOWPASS_6TAP_H_MMX
793 :     lea ecx, [ecx+edx]
794 :     LOWPASS_6TAP_H_MMX
795 :    
796 :     ret
797 :    
798 :     ;===========================================================================
799 :     ;
800 :     ; void interpolate8x8_6tap_lowpass_v_mmx(uint8_t const *dst,
801 :     ; const uint8_t * const src,
802 :     ; const uint32_t stride,
803 :     ; const uint32_t rounding);
804 :     ;
805 :     ;===========================================================================
806 :    
807 :     %macro LOWPASS_6TAP_V_MMX 0
808 :     movq mm0, [eax]
809 :     movq mm2, [eax+edx]
810 :    
811 :     movq mm1, mm0
812 :     movq mm3, mm2
813 :    
814 :     punpcklbw mm0, mm7
815 :     punpcklbw mm2, mm7
816 :    
817 :     punpckhbw mm1, mm7
818 :     punpckhbw mm3, mm7
819 :    
820 :     paddw mm0, mm2
821 :     paddw mm1, mm3
822 :    
823 :     psllw mm0, 2
824 :     psllw mm1, 2
825 :    
826 :     movq mm4, [eax+2*edx]
827 :     sub eax, ebx
828 :     movq mm2, [eax+2*edx]
829 :    
830 :     movq mm3, mm2
831 :     movq mm5, mm4
832 :    
833 :     punpcklbw mm2, mm7
834 :     punpcklbw mm4, mm7
835 :    
836 :     punpckhbw mm3, mm7
837 :     punpckhbw mm5, mm7
838 :    
839 :     paddw mm2, mm4
840 :     paddw mm3, mm5
841 :    
842 :     psubsw mm0, mm2
843 :     psubsw mm1, mm3
844 :    
845 :     pmullw mm0, [mmx_five]
846 :     pmullw mm1, [mmx_five]
847 :    
848 :     movq mm2, [eax+edx]
849 :     movq mm4, [eax+2*ebx]
850 :    
851 :     movq mm3, mm2
852 :     movq mm5, mm4
853 :    
854 :     punpcklbw mm2, mm7
855 :     punpcklbw mm4, mm7
856 :    
857 :     punpckhbw mm3, mm7
858 :     punpckhbw mm5, mm7
859 :    
860 :     paddw mm2, mm4
861 :     paddw mm3, mm5
862 :    
863 :     paddsw mm0, mm2
864 :     paddsw mm1, mm3
865 :    
866 :     paddsw mm0, mm6
867 :     paddsw mm1, mm6
868 :    
869 :     psraw mm0, 5
870 :     psraw mm1, 5
871 :    
872 :     lea eax, [eax+4*edx]
873 :     packuswb mm0, mm1
874 :     movq [ecx], mm0
875 :     %endmacro
876 :    
877 :     align 16
878 :     cglobal interpolate8x8_6tap_lowpass_v_mmx
879 :     interpolate8x8_6tap_lowpass_v_mmx
880 :    
881 :     push ebx
882 :    
883 :     mov eax, [esp + 4 + 16] ; rounding
884 :    
885 :     movq mm6, [rounding_lowpass_mmx + eax * 8]
886 :    
887 :     mov ecx, [esp + 4 + 4] ; dst -> edi
888 :     mov eax, [esp + 4 + 8] ; src -> esi
889 :     mov edx, [esp + 4 + 12] ; stride -> edx
890 :    
891 :     mov ebx, edx
892 :     shl ebx, 1
893 :     add ebx, edx
894 :    
895 :     pxor mm7, mm7
896 :    
897 :     LOWPASS_6TAP_V_MMX
898 :     lea ecx, [ecx+edx]
899 :     LOWPASS_6TAP_V_MMX
900 :     lea ecx, [ecx+edx]
901 :     LOWPASS_6TAP_V_MMX
902 :     lea ecx, [ecx+edx]
903 :     LOWPASS_6TAP_V_MMX
904 :     lea ecx, [ecx+edx]
905 :     LOWPASS_6TAP_V_MMX
906 :     lea ecx, [ecx+edx]
907 :     LOWPASS_6TAP_V_MMX
908 :     lea ecx, [ecx+edx]
909 :     LOWPASS_6TAP_V_MMX
910 :     lea ecx, [ecx+edx]
911 :     LOWPASS_6TAP_V_MMX
912 :    
913 :     pop ebx
914 :     ret

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