2 ;// author : JC Hoelt <jeko@free.fr>
5 ;// 07/01/2001 : Changing FEMMS to EMMS : slower... but run on intel machines
6 ;// 03/01/2001 : WIDTH and HEIGHT are now variable
7 ;// 28/12/2000 : adding comments to the code, suppress some useless lines
8 ;// 27/12/2000 : reducing memory access... improving performance by 20%
9 ;// coefficients are now on 1 byte
10 ;// 22/12/2000 : Changing data structure
11 ;// 16/12/2000 : AT&T version
12 ;// 14/12/2000 : unrolling loop
13 ;// 12/12/2000 : 64 bits memory access
25 .globl mmx_zoom ;// name of the function to call by C program
26 .extern coeffs ;// the transformation buffer
27 .extern expix1,expix2 ;// the source and destination buffer
28 .extern mmx_zoom_size, zoom_width ;// size of the buffers
36 ;// initialisation du mm7 à zero
48 movl mmx_zoom_size, %ecx
51 ;// esi <- nouvelle position
53 leal (%edx, %esi), %esi
55 ;// recuperation des deux premiers pixels dans mm0 et mm1
56 movq (%esi), %mm0 /* b1-v1-r1-a1-b2-v2-r2-a2 */
57 movq %mm0, %mm1 /* b1-v1-r1-a1-b2-v2-r2-a2 */
59 ;// recuperation des 4 coefficients
60 movd 4(%eax), %mm6 /* ??-??-??-??-c4-c3-c2-c1 */
61 ;// depackage du premier pixel
62 punpcklbw %mm7, %mm0 /* 00-b2-00-v2-00-r2-00-a2 */
64 movq %mm6, %mm5 /* ??-??-??-??-c4-c3-c2-c1 */
65 ;// depackage du 2ieme pixel
66 punpckhbw %mm7, %mm1 /* 00-b1-00-v1-00-r1-00-a1 */
68 ;// extraction des coefficients...
69 punpcklbw %mm5, %mm6 /* c4-c4-c3-c3-c2-c2-c1-c1 */
70 movq %mm6, %mm4 /* c4-c4-c3-c3-c2-c2-c1-c1 */
71 movq %mm6, %mm5 /* c4-c4-c3-c3-c2-c2-c1-c1 */
73 punpcklbw %mm5, %mm6 /* c2-c2-c2-c2-c1-c1-c1-c1 */
74 punpckhbw %mm5, %mm4 /* c4-c4-c4-c4-c3-c3-c3-c3 */
76 movq %mm6, %mm3 /* c2-c2-c2-c2-c1-c1-c1-c1 */
77 punpcklbw %mm7, %mm6 /* 00-c1-00-c1-00-c1-00-c1 */
78 punpckhbw %mm7, %mm3 /* 00-c2-00-c2-00-c2-00-c2 */
80 ;// multiplication des pixels par les coefficients
81 pmullw %mm6, %mm0 /* c1*b2-c1*v2-c1*r2-c1*a2 */
82 pmullw %mm3, %mm1 /* c2*b1-c2*v1-c2*r1-c2*a1 */
85 ;// ...extraction des 2 derniers coefficients
86 movq %mm4, %mm5 /* c4-c4-c4-c4-c3-c3-c3-c3 */
87 punpcklbw %mm7, %mm4 /* 00-c3-00-c3-00-c3-00-c3 */
88 punpckhbw %mm7, %mm5 /* 00-c4-00-c4-00-c4-00-c4 */
90 ;// recuperation des 2 derniers pixels
91 movq (%esi,%ebp), %mm1
94 ;// depackage des pixels
98 ;// multiplication pas les coeffs
102 ;// ajout des valeurs obtenues à la valeur finale
106 ;// division par 256 = 16+16+16+16, puis repackage du pixel final
110 ;// passage au suivant
114 ;// enregistrement du resultat
118 ;// test de fin du tantque
119 cmpl $0, %ecx ;// 400x300