add some NEON 32bpp blitters
[sdl_omap.git] / src / video / SDL_blit_neon.S
1 /*
2  * (C) GraÅžvydas "notaz" Ignotas, 2011
3  *
4  * This work is licensed under the terms of any of these licenses
5  * (at your option):
6  *  - GNU GPL, version 2 or later.
7  *  - GNU LGPL, version 2.1 or later.
8  * See the COPYING file in the top-level directory.
9  */
10
11 .text
12 .align 2
13
14 @ void *dst, const void *src, int count, uint abits
15 .macro do_argb bgr2rgb
16     vdup.i8    d0, r3
17 0:
18     vld4.8     {d4-d7}, [r1]!
19 .if \bgr2rgb
20     vswp       d4, d6           @ BGR->RGB
21 .endif
22     vmov.i8    d7, d0
23     subs       r2, r2, #8
24     blt        do_argb_finish
25     vst4.8     {d4-d7}, [r0]!
26     bxeq       lr
27     nop
28     b          0b
29 .endm
30
31 @ void *dst, const void *src, int count
32 .macro do_argb_alpha bgr2rgb
33     mov        r3, #0xff
34     vdup.i16   q12, r3
35 0:
36     vld4.8     {d4-d7}, [r1]!
37     vld4.8     {d0-d3}, [r0]
38 .if \bgr2rgb
39     vswp       d4, d6           @ BGR->RGB
40 .endif
41     vmovl.u8   q11, d7
42     @ d = (((s-d)*a+255)>>8)+d
43     vsubl.u8   q8, d4, d0
44     vsubl.u8   q9, d5, d1
45     vsubl.u8   q10,d6, d2
46     vmul.s16   q8, q8, q11
47     vmul.s16   q9, q9, q11
48     vmul.s16   q10,q10,q11
49     vaddhn.i16 d4, q8, q12
50     vaddhn.i16 d5, q9, q12
51     vaddhn.i16 d6, q10,q12
52     vadd.i8    q2, q0
53     vadd.i8    d6, d2
54     vmov.i8    d7, d3
55     subs       r2, r2, #8
56     blt        do_argb_finish
57     vst4.8     {d4-d7}, [r0]!
58     bxeq       lr
59     nop
60     b          0b
61 .endm
62
63 do_argb_finish:
64     add        r2, r2, #8
65     vzip.8     d4, d5           @ RRR..|GGG.. -> RGRG..
66     vzip.8     d6, d7           @ BBB..|000.. -> B0B0..
67     vzip.16    q2, q3
68               
69     vst1.32    d4[0], [r0]!
70     cmp        r2, #1
71     bxle       lr
72     vst1.32    d4[1], [r0]!
73     cmp        r2, #2
74     bxle       lr
75     vst1.32    d5[0], [r0]!
76     cmp        r2, #3
77     bxle       lr
78     vst1.32    d5[1], [r0]!
79     cmp        r2, #4
80     bxle       lr
81     vst1.32    d6[0], [r0]!
82     cmp        r2, #5
83     bxle       lr
84     vst1.32    d6[1], [r0]!
85     cmp        r2, #6
86     bxle       lr
87     vst1.32    d7[0], [r0]!
88     bx         lr
89
90
91 .global neon_ARGBtoXRGB
92 neon_ARGBtoXRGB:
93     do_argb 0
94
95 .global neon_ABGRtoXRGB
96 neon_ABGRtoXRGB:
97     do_argb 1
98
99 .global neon_ARGBtoXRGBalpha
100 neon_ARGBtoXRGBalpha:
101     do_argb_alpha 0
102
103 .global neon_ABGRtoXRGBalpha
104 neon_ABGRtoXRGBalpha:
105     do_argb_alpha 1
106
107 @ vim:filetype=armasm