[svn] / trunk / xvidcore / src / image / x86_asm / interpolate8x8_mmx.asm Repository:
ViewVC logotype

Diff of /trunk/xvidcore/src/image/x86_asm/interpolate8x8_mmx.asm

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 850, Sat Feb 15 08:39:17 2003 UTC revision 851, Sat Feb 15 15:22:19 2003 UTC
# Line 1  Line 1 
1  ;/*****************************************************************************  ;/**************************************************************************
2  ; *  ; *
3  ; *  XVID MPEG-4 VIDEO CODEC  ; *  XVID MPEG-4 VIDEO CODEC
4  ; *      mmx 8x8 block-based halfpel interpolation  ; *      mmx 8x8 block-based halfpel interpolation
5  ; *  ; *
6  ; *  Copyright(C) 2002 Peter Ross <pross@xvid.org>  ; *     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
 ; *  This file is part of XviD, a free MPEG-4 video encoder/decoder  
 ; *  
 ; *  XviD is free software; you can redistribute it and/or modify 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  ; *  the Free Software Foundation; either version 2 of the License, or
9  ; *  (at your option) any later version.  ; *  (at your option) any later version.
10  ; *  ; *
# Line 19  Line 15 
15  ; *  ; *
16  ; *  You should have received a copy of the GNU General Public License  ; *  You should have received a copy of the GNU General Public License
17  ; *  along with this program; if not, write to the Free Software  ; *  along with this program; if not, write to the Free Software
18  ; *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA  ; *     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 ; *  
 ; *  Under section 8 of the GNU General Public License, the copyright  
 ; *  holders of XVID explicitly forbid distribution in the following  
 ; *  countries:  
 ; *  
 ; *    - Japan  
 ; *    - United States of America  
19  ; *  ; *
20  ; *  Linking XviD statically or dynamically with other modules is making a  ; *************************************************************************/
21  ; *  combined work based on XviD.  Thus, the terms and conditions of the  
22  ; *  GNU General Public License cover the whole combination.  ;/**************************************************************************
 ; *  
 ; *  As a special exception, the copyright holders of XviD give you  
 ; *  permission to link XviD with independent modules that communicate with  
 ; *  XviD solely through the VFW1.1 and DShow interfaces, regardless of the  
 ; *  license terms of these independent modules, and to copy and distribute  
 ; *  the resulting combined work under terms of your choice, provided that  
 ; *  every copy of the combined work is accompanied by a complete copy of  
 ; *  the source code of XviD (the version of XviD used to produce the  
 ; *  combined work), being distributed under the terms of the GNU General  
 ; *  Public License plus this exception.  An independent module is a module  
 ; *  which is not derived from or based on XviD.  
23  ; *  ; *
24  ; *  Note that people who make modified versions of XviD are not obligated  ; *     History:
 ; *  to grant this special exception for their modified versions; it is  
 ; *  their choice whether to do so.  The GNU General Public License gives  
 ; *  permission to release a modified version without this exception; this  
 ; *  exception also makes it possible to release a modified version which  
 ; *  carries forward this exception.  
25  ; *  ; *
26  ; * $Id: interpolate8x8_mmx.asm,v 1.11 2002-11-17 00:20:30 edgomez Exp $  ; * 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  ; *  ; *
30  ; ****************************************************************************/  ; *************************************************************************/
31    
32    
33  bits 32  bits 32
34    
# Line 70  Line 46 
46  align 16  align 16
47    
48  ;===========================================================================  ;===========================================================================
49    ; (16 - r) rounding table
50    ;===========================================================================
51    
52    rounding_lowpass_mmx
53    times 4 dw 16
54    times 4 dw 15
55    
56    ;===========================================================================
57  ; (1 - r) rounding table  ; (1 - r) rounding table
58  ;===========================================================================  ;===========================================================================
59    
# Line 88  Line 72 
72  mmx_one  mmx_one
73  times 8 db 1  times 8 db 1
74    
75    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  section .text  section .text
91    
92  %macro  CALC_AVG 6  %macro  CALC_AVG 6
# Line 320  Line 319 
319                  pop esi                  pop esi
320    
321                  ret                  ret
322    
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

Legend:
Removed from v.850  
changed lines
  Added in v.851

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