http://www.jwz.org/xscreensaver/xscreensaver-5.10.tar.gz
[xscreensaver] / hacks / fireworkx_mmx.S
1 /*
2  * Fast MMX blur code for Fireworkx
3  * Copyright (c) 1999-2005 Rony B Chandran <ronybc@asia.com>
4  *
5  * From Kerala, INDIA
6  * 
7  * url: http://www.ronybc.8k.com
8  *
9  * Permission to use, copy, modify, distribute, and sell this software and its
10  * documentation for any purpose is hereby granted without fee, provided that
11  * the above copyright notice appear in all copies and that both that
12  * copyright notice and this permission notice appear in supporting
13  * documentation.  No representations are made about the suitability of this
14  * software for any purpose.  It is provided "as is" without express or 
15  * implied warranty.
16  *
17  */
18  
19 .data
20
21 .text
22
23 .align 8        
24
25 .global mmx_blur
26 .global mmx_glow
27
28 mmx_blur:      /* void mmx_blur( int *palaka,
29                                  int width,
30                                  int height)
31                                  int fade_lvl) */
32         pushl %ebp
33         pushl %edi
34         pushl %esi
35         pushl %ebx
36         
37         movl 32(%esp),%eax
38         imull $0x00010001,%eax
39         movd %eax,%mm0
40         movq %mm0,%mm1
41         psllq $32,%mm0
42         por %mm0,%mm1
43         movq %mm1,40(%esp)
44         
45         movl 20(%esp), %eax
46         movl 24(%esp), %edx
47         shll $2, %edx
48         addl %eax, %edx
49         pxor %mm0,%mm0
50 .fline:
51         movq %mm0,(%eax)
52         addl $8,%eax
53         cmp %edx,%eax
54         jbe .fline
55         
56         movl 24(%esp),%eax
57         shll $2,%eax
58         movl %eax,%edi
59         movl 28(%esp),%edi
60         subl $2,%edi
61         imull %eax,%edi
62         
63         movl 20(%esp),%ecx
64         movl %ecx,%ebx
65         addl %eax,%ebx
66         addl %ebx,%eax
67         xorl %esi,%esi
68 .align 32
69 .renuKa:
70         pxor %mm7,%mm7
71         movq %mm0,%mm6
72         movq %mm1,%mm0
73         paddw %mm1,%mm6
74         movd 8(%esi,%ecx),%mm1
75         punpcklbw %mm7,%mm1
76         paddw %mm1,%mm6
77
78         paddw %mm2,%mm6
79         movq %mm3,%mm2
80         movd 8(%esi,%ebx),%mm3
81         punpcklbw %mm7,%mm3
82         paddw %mm3,%mm6
83
84         paddw %mm4,%mm6
85         movq %mm5,%mm4
86         paddw %mm5,%mm6
87         movd 8(%esi,%eax),%mm5
88         punpcklbw %mm7,%mm5
89         paddw %mm5,%mm6
90         
91         psllw $3,%mm2
92         paddw %mm2,%mm6
93         psrlw $3,%mm2
94         movq 40(%esp),%mm7
95         psubusw %mm7,%mm6 
96         psrlw $4,%mm6
97         
98         packuswb %mm6,%mm6
99         movd %mm6, 4(%esi,%ebx)
100         addl $4,%esi
101         cmp %edi,%esi
102         jbe .renuKa
103         
104         addl %esi,%eax
105         addl %esi,%ebx
106         xorl %ecx,%ecx
107 .lline:
108         movl %ecx,(%ebx)
109         addl $4,%ebx
110         cmpl %eax,%ebx
111         jbe .lline
112         
113         emms
114         popl %ebx
115         popl %esi
116         popl %edi
117         popl %ebp
118         ret
119
120 /*  Add Glycerine to 
121     Potassium permanganite... (DANGER-FIRE) */
122
123 mmx_glow:      /* void mmx_glow( int *palaka1,
124                                  int width,
125                                  int height,
126                                  int fade_lvl,
127                                  int *palaka2)  */
128         pushl %ebp
129         pushl %edi
130         pushl %esi
131         pushl %ebx
132         
133         movl 32(%esp),%eax
134         imull $0x00010001,%eax
135         movd %eax,%mm0
136         movq %mm0,%mm1
137         psllq $32,%mm0
138         por %mm0,%mm1
139         movq %mm1,40(%esp)
140         
141         movl 20(%esp), %eax
142         movl 36(%esp), %ebx
143         movl 24(%esp), %edx
144         shll $2,%edx
145         add %eax, %edx
146         pxor %mm7,%mm7
147 .flineGlow:
148         movq %mm7,(%eax)
149         movq %mm7,(%ebx)
150         addl $8,%eax
151         addl $8,%ebx
152         cmp %edx,%eax
153         jbe .flineGlow
154
155         movl 24(%esp),%eax
156         shll $2,%eax
157         movl %eax,%edi
158         movl 28(%esp),%edi
159         subl $2,%edi
160         imull %eax,%edi
161         
162         movl 20(%esp),%ecx
163         movl 36(%esp),%edx
164         movl %ecx,%ebx
165         addl %eax,%edx
166         addl %eax,%ebx
167         addl %ebx,%eax
168         xorl %esi,%esi
169 .align 32
170 .renuGa:
171         pxor %mm7,%mm7
172         movq %mm0,%mm6
173         movq %mm1,%mm0
174         paddw %mm1,%mm6
175         movd 8(%esi,%ecx),%mm1
176         punpcklbw %mm7,%mm1
177         paddw %mm1,%mm6
178
179         paddw %mm2,%mm6
180         movq %mm3,%mm2
181         movd 8(%esi,%ebx),%mm3
182         punpcklbw %mm7,%mm3
183         paddw %mm3,%mm6
184
185         paddw %mm4,%mm6
186         movq %mm5,%mm4
187         paddw %mm5,%mm6
188         movd 8(%esi,%eax),%mm5
189         punpcklbw %mm7,%mm5
190         paddw %mm5,%mm6
191         
192         psllw $3,%mm2
193         paddw %mm2,%mm6
194         psrlw $3,%mm2
195         movq 40(%esp),%mm7
196         psubusw %mm7,%mm6 
197         movq %mm6,%mm7
198         psrlw $4,%mm6
199         psrlw $3,%mm7
200         
201         packuswb %mm7,%mm7
202         movd %mm7, 4(%esi,%edx)
203         packuswb %mm6,%mm6
204         movd %mm6, 4(%esi,%ebx)
205         addl $4,%esi
206         cmp %edi,%esi
207         jbe .renuGa
208
209         addl %esi,%eax
210         addl %esi,%ebx
211         addl %esi,%edx
212         xorl %ecx,%ecx
213 .llineGlow:
214         movl %ecx,(%ebx)
215         movl %ecx,(%edx)
216         addl $4,%ebx
217         addl $4,%edx
218         cmpl %eax,%ebx
219         jbe .llineGlow
220
221         emms
222         popl %ebx
223         popl %esi
224         popl %edi
225         popl %ebp
226         ret