~ubuntu-branches/ubuntu/precise/gdk-pixbuf/precise-proposed

« back to all changes in this revision

Viewing changes to gdk-pixbuf/pixops/composite_line_22_4a4_mmx.S

  • Committer: Bazaar Package Importer
  • Author(s): Sebastien Bacher
  • Date: 2004-10-06 22:10:04 UTC
  • Revision ID: james.westby@ubuntu.com-20041006221004-rma9deknj8qctu67
Tags: upstream-0.22.0
ImportĀ upstreamĀ versionĀ 0.22.0

Show diffs side-by-side

added added

removed removed

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