Removed build warnings
[platform/adaptation/ap_samsung/libexynos-common.git] / libswconverter / csc_BGRA8888_to_RGBA8888_NEON.s
1 /*
2  *
3  * Copyright 2013 Samsung Electronics S.LSI Co. LTD
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License")
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *      http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17
18 /*
19  * @file    csc_BGRA8888_to_RGBA8888.s
20  * @brief   color format converter
21  * @author  Hyungdeok Lee (hd0408.lee@samsung.com)
22  * @version 1.0
23  * @history
24  *   2013.02.28 : Create
25  */
26
27 /*
28  * Source BGRA8888 copy to Dest RGBA8888.
29  * Use neon interleaved load instruction, easly swap R ch to B ch.
30  *
31  * @param dest
32  *   dst address[out]
33  *
34  * @param src
35  *   src address[in]
36  *
37  * @param width
38  *   line width [in]
39  *
40  * @param bpp
41  *   bpp only concerned about 4
42  */
43
44     .arch armv7-a
45     .text
46     .global csc_BGRA8888_RGBA8888_NEON
47     .type   csc_BGRA8888_RGBA8888_NEON, %function
48 csc_BGRA8888_RGBA8888_NEON:
49     .fnstart
50
51     @r0     dest
52     @r1     src
53     @r2     width
54     @r3     bpp
55     @r4
56     @r5
57     @r6
58     @r7
59     @r8     temp1
60     @r9     temp2
61     @r10    dest_addr
62     @r11    src_addr
63     @r12    temp_width
64     @r14    i
65
66     stmfd       sp!, {r4-r12,r14}       @ backup registers
67
68     mov         r10, r0
69     mov         r11, r1
70         mov                     r9, r2, lsr #5                  @ r9 = r2 >> 5 (32)
71         and                     r14, r9, #3                             @ r14 = r9 & 3
72         mov                     r12, r2, lsr #7                 @ r12 = r2 >> 7 (128)
73
74     cmp         r12, #0
75     beq         LESS_THAN_128
76
77 @ Process d0 to d3 at once. 4 times same operation. := 8 byte * 4 * 4 = 128 byte loop.
78 LOOP_128:
79         @pld            [r11]   @ cache line fill. use this for r11 region set by cachable.
80         vld4.8          {d0, d1, d2, d3},       [r11]!
81         vswp            d0, d2
82         vst4.8          {d0, d1, d2, d3},       [r10]!
83
84         vld4.8          {d0, d1, d2, d3},       [r11]!
85         vswp            d0, d2
86         vst4.8          {d0, d1, d2, d3},       [r10]!
87
88         vld4.8          {d0, d1, d2, d3},       [r11]!
89         vswp            d0, d2
90         vst4.8          {d0, d1, d2, d3},       [r10]!
91
92         vld4.8          {d0, d1, d2, d3},       [r11]!
93         vswp            d0, d2
94         vst4.8          {d0, d1, d2, d3},       [r10]!
95
96     subs        r12, #1
97     bne         LOOP_128
98
99 LESS_THAN_128:
100         cmp                     r14, #0
101         beq                     END
102
103 LOOP_32:
104         vld4.8          {d0, d1, d2, d3},       [r11]!
105         vswp            d0, d2
106         vst4.8          {d0, d1, d2, d3},       [r10]!
107     subs        r14, #1
108     bne         LOOP_32
109
110 END:
111     ldmfd       sp!, {r4-r12,r15}       @ restore registers
112     .fnend