]> Pileus Git - ~andy/gtk/blob - gdk-pixbuf/pixops/composite_line_22_4a4_mmx.S
Win32 build setup:
[~andy/gtk] / gdk-pixbuf / pixops / composite_line_22_4a4_mmx.S
1         .file   "composite_line_22_4a4_mmx.S"
2         .version        "01.01"
3 gcc2_compiled.:
4 .text
5         .align 16
6
7 #ifndef __MINGW32__
8         
9 .globl pixops_composite_line_22_4a4_mmx
10         .type    pixops_composite_line_22_4a4_mmx,@function
11 pixops_composite_line_22_4a4_mmx:
12         
13 #else
14         
15 .globl _pixops_composite_line_22_4a4_mmx
16 _pixops_composite_line_22_4a4_mmx:
17         
18 #endif
19 /*
20  * Arguments
21  *              
22  * weights:      8(%ebp)
23  * p:           12(%ebp)        %esi
24  * q1:          16(%ebp)        
25  * q2:          20(%ebp)        
26  * xstep:       24(%ebp)        
27  * p_end:       28(%ebp)
28  * xinit:       32(%ebp)
29  *      
30 */
31 /*
32  * Function call entry
33  */
34         pushl %ebp
35         movl %esp,%ebp
36         subl $28,%esp
37         pushl %edi
38         pushl %esi
39         pushl %ebx
40 /* Locals:      
41  * int x                      %ebx
42  * int x_scaled             -24(%ebp)
43  */
44
45 /*
46  * Setup
47  */
48 /* Initialize variables */      
49         movl 32(%ebp),%ebx
50         movl 32(%ebp),%edx
51         sarl $16,%edx
52         movl 12(%ebp),%esi
53
54         movl %edx,-24(%ebp)
55
56         cmpl %esi,28(%ebp)
57         je   .out
58
59 /* Load initial values into %mm1, %mm3 */
60         shll $2, %edx
61
62         pxor %mm4, %mm4
63         
64         movl 16(%ebp),%edi
65         movl (%edi, %edx), %eax
66         movd (%edi, %edx), %mm5
67         punpcklbw %mm4, %mm5
68         shrl $24, %eax
69         movl $0x010101, %ecx
70         mull %ecx
71         orl  $0xff000000, %eax
72         movd %eax, %mm1
73         punpcklbw %mm4, %mm1
74         pmullw %mm5,%mm1
75
76         movl -24(%ebp),%edx
77         shll $2, %edx
78                 
79         movl 20(%ebp),%edi
80         movl (%edi, %edx), %eax
81         movd (%edi, %edx), %mm5
82         punpcklbw %mm4, %mm5
83         shrl $24, %eax
84         movl $0x010101, %ecx
85         mull %ecx
86         orl  $0xff000000, %eax
87         movd %eax, %mm3
88         punpcklbw %mm4, %mm3
89         pmullw %mm5,%mm3
90
91         psrlw $8,%mm1
92         psrlw $8,%mm3
93
94         addl $65536,%ebx
95         movl %ebx,%edx
96         sarl $16,%edx
97
98         jmp .newx
99         .p2align 4,,7
100 .loop:
101 /* int x_index = (x & 0xf000) >> 12 */
102         movl %ebx,%eax
103         andl $0xf000,%eax
104         shrl $7,%eax
105
106         movq (%edi,%eax),%mm4
107         pmullw %mm0,%mm4
108         movq 8(%edi,%eax),%mm5
109         pmullw %mm1,%mm5
110         movq 16(%edi,%eax),%mm6
111         movq 24(%edi,%eax),%mm7
112         pmullw %mm2,%mm6
113         pmullw %mm3,%mm7
114         paddw %mm4, %mm5
115         paddw %mm6, %mm7
116         paddw %mm5, %mm7
117
118         movl $0xffff,%ecx
119         movd %ecx,%mm4
120         psllq $48,%mm4
121         movq %mm4,%mm6
122         psubw %mm7,%mm4
123         pand %mm6,%mm4
124         
125         movq %mm4,%mm5
126         psrlq $16,%mm4
127         por %mm4,%mm5
128         psrlq $32,%mm5
129         por %mm4,%mm5
130         
131         psrlw $8,%mm5
132
133         movd (%esi),%mm7
134         pxor %mm4,%mm4
135         punpcklbw %mm4, %mm7
136                 
137         pmullw %mm7,%mm5
138
139 /* x += x_step; */
140         addl 24(%ebp),%ebx
141 /* x_scale = x >> 16; */
142         movl %ebx,%edx
143         sarl $16,%edx
144
145         paddw %mm5,%mm6
146
147         psrlw $8,%mm6
148         packuswb %mm6, %mm6 
149         movd %mm6,(%esi)
150
151         addl $4, %esi
152                 
153         cmpl %esi,28(%ebp)
154         je   .out
155
156         cmpl %edx,-24(%ebp)
157         je   .loop
158
159 .newx:
160         movl %edx,-24(%ebp)
161 /*
162  * Load the two new values into %mm1, %mm3, move old values into %mm0, %mm2
163  */
164         movq %mm1, %mm0
165         movq %mm3, %mm2
166
167         shll $2, %edx
168
169 #       %mm4 will always be already clear here  
170 #       pxor %mm4, %mm4
171
172         movl 16(%ebp),%edi
173         movl (%edi, %edx), %eax
174         movd (%edi, %edx), %mm5
175         punpcklbw %mm4, %mm5
176         shrl $24, %eax
177         movl $0x010101, %ecx
178         mull %ecx
179 /* 
180  *      mull destroyed %edx, need to reconstitute 
181  */
182         movl -24(%ebp),%edx
183         shll $2, %edx
184
185         orl  $0xff000000, %eax
186         movd %eax, %mm1
187         punpcklbw %mm4, %mm1
188         pmullw %mm5,%mm1
189                 
190         movl 20(%ebp),%edi
191         movl (%edi, %edx), %eax
192         movd (%edi, %edx), %mm5
193         punpcklbw %mm4, %mm5
194         shrl $24, %eax
195         movl $0x010101, %ecx
196         mull %ecx
197         orl  $0xff000000, %eax
198         movd %eax, %mm3
199         punpcklbw %mm4, %mm3
200         pmullw %mm5,%mm3
201         
202         psrlw $8,%mm1
203         psrlw $8,%mm3
204
205         movl 8(%ebp),%edi
206         
207         jmp .loop
208
209 .out:
210         movl %esi,%eax
211         emms
212         leal -40(%ebp),%esp
213         popl %ebx
214         popl %esi
215         popl %edi
216         movl %ebp,%esp
217         popl %ebp
218         ret