ARM: SIMD optimizations moved to a separate .S file
[profile/ivi/pixman.git] / pixman / pixman-arm-simd-asm.S
1 /*
2  * Copyright © 2008 Mozilla Corporation
3  *
4  * Permission to use, copy, modify, distribute, and sell this software and its
5  * documentation for any purpose is hereby granted without fee, provided that
6  * the above copyright notice appear in all copies and that both that
7  * copyright notice and this permission notice appear in supporting
8  * documentation, and that the name of Mozilla Corporation not be used in
9  * advertising or publicity pertaining to distribution of the software without
10  * specific, written prior permission.  Mozilla Corporation makes no
11  * representations about the suitability of this software for any purpose.  It
12  * is provided "as is" without express or implied warranty.
13  *
14  * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
15  * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
16  * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
17  * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
18  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
19  * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
20  * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
21  * SOFTWARE.
22  *
23  * Author:  Jeff Muizelaar (jeff@infidigm.net)
24  *
25  */
26
27 /* Prevent the stack from becoming executable */
28 #if defined(__linux__) && defined(__ELF__)
29 .section .note.GNU-stack,"",%progbits
30 #endif
31
32         .text
33         .arch armv6
34         .object_arch armv4
35         .arm
36         .altmacro
37
38 /* Supplementary macro for setting function attributes */
39 .macro pixman_asm_function fname
40         .func fname
41         .global fname
42 #ifdef __ELF__
43         .hidden fname
44         .type fname, %function
45 #endif
46 fname:
47 .endm
48
49 /*
50  * The code below was generated by gcc 4.3.4 from the commented out
51  * functions in 'pixman-arm-simd.c' file with the following optimization
52  * options: "-O3 -mcpu=arm1136jf-s -fomit-frame-pointer"
53  *
54  * TODO: replace gcc generated code with hand tuned versions because
55  * the code quality is not very good, introduce symbolic register
56  * aliases for better readability and maintainability.
57  */
58
59 pixman_asm_function pixman_composite_add_8000_8000_asm_armv6
60         push    {r4, r5, r6, r7, r8, r9, r10, r11}
61         mov     r10, r1
62         sub     sp, sp, #4
63         subs    r10, r10, #1
64         mov     r11, r0
65         mov     r8, r2
66         str     r3, [sp]
67         ldr     r7, [sp, #36]
68         bcc     0f
69 6:      cmp     r11, #0
70         beq     1f
71         orr     r3, r8, r7
72         tst     r3, #3
73         beq     2f
74         mov     r1, r8
75         mov     r0, r7
76         mov     r12, r11
77         b       3f
78 5:      tst     r3, #3
79         beq     4f
80 3:      ldrb    r2, [r0], #1
81         subs    r12, r12, #1
82         ldrb    r3, [r1]
83         uqadd8  r3, r2, r3
84         strb    r3, [r1], #1
85         orr     r3, r1, r0
86         bne     5b
87 1:      ldr     r3, [sp]
88         add     r8, r8, r3
89         ldr     r3, [sp, #40]
90         add     r7, r7, r3
91 10:     subs    r10, r10, #1
92         bcs     6b
93 0:      add     sp, sp, #4
94         pop     {r4, r5, r6, r7, r8, r9, r10, r11}
95         bx      lr
96 2:      mov     r12, r11
97         mov     r1, r8
98         mov     r0, r7
99 4:      cmp     r12, #3
100         subgt   r6, r12, #4
101         movgt   r9, r12
102         lsrgt   r5, r6, #2
103         addgt   r3, r5, #1
104         movgt   r12, #0
105         lslgt   r4, r3, #2
106         ble     7f
107 8:      ldr     r3, [r0, r12]
108         ldr     r2, [r1, r12]
109         uqadd8  r3, r3, r2
110         str     r3, [r1, r12]
111         add     r12, r12, #4
112         cmp     r12, r4
113         bne     8b
114         sub     r3, r9, #4
115         bic     r3, r3, #3
116         add     r3, r3, #4
117         subs    r12, r6, r5, lsl #2
118         add     r1, r1, r3
119         add     r0, r0, r3
120         beq     1b
121 7:      mov     r4, #0
122 9:      ldrb    r3, [r1, r4]
123         ldrb    r2, [r0, r4]
124         uqadd8  r3, r2, r3
125         strb    r3, [r1, r4]
126         add     r4, r4, #1
127         cmp     r4, r12
128         bne     9b
129         ldr     r3, [sp]
130         add     r8, r8, r3
131         ldr     r3, [sp, #40]
132         add     r7, r7, r3
133         b       10b
134 .endfunc
135
136 pixman_asm_function pixman_composite_over_8888_8888_asm_armv6
137         push    {r4, r5, r6, r7, r8, r9, r10, r11}
138         sub     sp, sp, #20
139         cmp     r1, #0
140         mov     r12, r2
141         str     r1, [sp, #12]
142         str     r0, [sp, #16]
143         ldr     r2, [sp, #52]
144         beq     0f
145         lsl     r3, r3, #2
146         str     r3, [sp]
147         ldr     r3, [sp, #56]
148         mov     r10, #0
149         lsl     r3, r3, #2
150         str     r3, [sp, #8]
151         mov     r11, r3
152         b       1f
153 6:      ldr     r11, [sp, #8]
154 1:      ldr     r9, [sp]
155         mov     r0, r12
156         add     r12, r12, r9
157         mov     r1, r2
158         str     r12, [sp, #4]
159         add     r2, r2, r11
160         ldr     r12, [sp, #16]
161         ldr     r3, =0x00800080
162         ldr     r9, =0xff00ff00
163         mov     r11, #255
164         cmp     r12, #0
165         beq     4f
166 5:      ldr     r5, [r1], #4
167         ldr     r4, [r0]
168         sub     r8, r11, r5, lsr #24
169         uxtb16  r6, r4
170         uxtb16  r7, r4, ror #8
171         mla     r6, r6, r8, r3
172         mla     r7, r7, r8, r3
173         uxtab16 r6, r6, r6, ror #8
174         uxtab16 r7, r7, r7, ror #8
175         and     r7, r7, r9
176         uxtab16 r6, r7, r6, ror #8
177         uqadd8  r5, r6, r5
178         str     r5, [r0], #4
179         subs    r12, r12, #1
180         bne     5b
181 4:      ldr     r3, [sp, #12]
182         add     r10, r10, #1
183         cmp     r10, r3
184         ldr     r12, [sp, #4]
185         bne     6b
186 0:      add     sp, sp, #20
187         pop     {r4, r5, r6, r7, r8, r9, r10, r11}
188         bx      lr
189 .endfunc
190
191 pixman_asm_function pixman_composite_over_8888_n_8888_asm_armv6
192         push    {r4, r5, r6, r7, r8, r9, r10, r11}
193         sub     sp, sp, #28
194         cmp     r1, #0
195         str     r1, [sp, #12]
196         ldrb    r1, [sp, #71]
197         mov     r12, r2
198         str     r0, [sp, #16]
199         ldr     r2, [sp, #60]
200         str     r1, [sp, #24]
201         beq     0f
202         lsl     r3, r3, #2
203         str     r3, [sp, #20]
204         ldr     r3, [sp, #64]
205         mov     r10, #0
206         lsl     r3, r3, #2
207         str     r3, [sp, #8]
208         mov     r11, r3
209         b       1f
210 5:      ldr     r11, [sp, #8]
211 1:      ldr     r4, [sp, #20]
212         mov     r0, r12
213         mov     r1, r2
214         add     r12, r12, r4
215         add     r2, r2, r11
216         str     r12, [sp]
217         str     r2, [sp, #4]
218         ldr     r12, [sp, #16]
219         ldr     r2, =0x00800080
220         ldr     r3, [sp, #24]
221         mov     r11, #255
222         cmp     r12, #0
223         beq     3f
224 4:      ldr     r5, [r1], #4
225         ldr     r4, [r0]
226         uxtb16  r6, r5
227         uxtb16  r7, r5, ror #8
228         mla     r6, r6, r3, r2
229         mla     r7, r7, r3, r2
230         uxtab16 r6, r6, r6, ror #8
231         uxtab16 r7, r7, r7, ror #8
232         uxtb16  r6, r6, ror #8
233         uxtb16  r7, r7, ror #8
234         orr     r5, r6, r7, lsl #8
235         uxtb16  r6, r4
236         uxtb16  r7, r4, ror #8
237         sub     r8, r11, r5, lsr #24
238         mla     r6, r6, r8, r2
239         mla     r7, r7, r8, r2
240         uxtab16 r6, r6, r6, ror #8
241         uxtab16 r7, r7, r7, ror #8
242         uxtb16  r6, r6, ror #8
243         uxtb16  r7, r7, ror #8
244         orr     r6, r6, r7, lsl #8
245         uqadd8  r5, r6, r5
246         str     r5, [r0], #4
247         subs    r12, r12, #1
248         bne     4b
249 3:      ldr     r1, [sp, #12]
250         add     r10, r10, #1
251         cmp     r10, r1
252         ldr     r12, [sp]
253         ldr     r2, [sp, #4]
254         bne     5b
255 0:      add     sp, sp, #28
256         pop     {r4, r5, r6, r7, r8, r9, r10, r11}
257         bx      lr
258 .endfunc
259
260 pixman_asm_function pixman_composite_over_n_8_8888_asm_armv6
261         push    {r4, r5, r6, r7, r8, r9, r10, r11}
262         sub     sp, sp, #28
263         cmp     r1, #0
264         ldr     r9, [sp, #60]
265         str     r1, [sp, #12]
266         bic     r1, r9, #-16777216
267         str     r1, [sp, #20]
268         mov     r12, r2
269         lsr     r1, r9, #8
270         ldr     r2, [sp, #20]
271         bic     r1, r1, #-16777216
272         bic     r2, r2, #65280
273         bic     r1, r1, #65280
274         str     r2, [sp, #20]
275         str     r0, [sp, #16]
276         str     r1, [sp, #4]
277         ldr     r2, [sp, #68]
278         beq     0f
279         lsl     r3, r3, #2
280         str     r3, [sp, #24]
281         mov     r0, #0
282         b       1f
283 5:      ldr     r3, [sp, #24]
284 1:      ldr     r4, [sp, #72]
285         mov     r10, r12
286         mov     r1, r2
287         add     r12, r12, r3
288         add     r2, r2, r4
289         str     r12, [sp, #8]
290         str     r2, [sp]
291         ldr     r12, [sp, #16]
292         ldr     r11, =0x00800080
293         ldr     r2, [sp, #4]
294         ldr     r3, [sp, #20]
295         cmp     r12, #0
296         beq     3f
297 4:      ldrb    r5, [r1], #1
298         ldr     r4, [r10]
299         mla     r6, r3, r5, r11
300         mla     r7, r2, r5, r11
301         uxtab16 r6, r6, r6, ror #8
302         uxtab16 r7, r7, r7, ror #8
303         uxtb16  r6, r6, ror #8
304         uxtb16  r7, r7, ror #8
305         orr     r5, r6, r7, lsl #8
306         uxtb16  r6, r4
307         uxtb16  r7, r4, ror #8
308         mvn     r8, r5
309         lsr     r8, r8, #24
310         mla     r6, r6, r8, r11
311         mla     r7, r7, r8, r11
312         uxtab16 r6, r6, r6, ror #8
313         uxtab16 r7, r7, r7, ror #8
314         uxtb16  r6, r6, ror #8
315         uxtb16  r7, r7, ror #8
316         orr     r6, r6, r7, lsl #8
317         uqadd8  r5, r6, r5
318         str     r5, [r10], #4
319         subs    r12, r12, #1
320         bne     4b
321 3:      ldr     r4, [sp, #12]
322         add     r0, r0, #1
323         cmp     r0, r4
324         ldr     r12, [sp, #8]
325         ldr     r2, [sp]
326         bne     5b
327 0:      add     sp, sp, #28
328         pop     {r4, r5, r6, r7, r8, r9, r10, r11}
329         bx      lr
330 .endfunc