92c2d586daba46615f3f8cbf2063a89b1d64aa9c
[platform/adaptation/ap_samsung/libexynos-common.git] / libswconverter / csc_RGBA8888_to_YUV420SP_NEON.s
1
2     .arch armv7-a
3     .text
4     .global csc_RGBA8888_to_YUV420SP_NEON
5     .type   csc_RGBA8888_to_YUV420SP_NEON, %function
6 csc_RGBA8888_to_YUV420SP_NEON:
7     .fnstart
8
9     @r0     pDstY
10     @r1     pDstUV
11     @r2     pSrcRGB
12     @r3     nWidth
13     @r4     pDstY2 = pDstY + nWidth
14     @r5     pSrcRGB2 = pSrcRGB + nWidthx2
15     @r6     temp7, nWidth16m
16     @r7     temp6, accumilator
17     @r8     temp5, nWidthTemp
18     @r9     temp4, Raw RGB565
19     @r10    temp3, r,g,b
20     @r11    temp2, immediate operand
21     @r12    temp1, nHeight
22     @r14    temp0, debugging pointer
23
24     .equ CACHE_LINE_SIZE, 32
25     .equ PRE_LOAD_OFFSET, 6
26
27     stmfd       sp!, {r4-r12,r14}       @ backup registers
28     ldr         r12, [sp, #40]           @ load nHeight
29     @ldr         r14, [sp, #44]          @ load pTest
30     add         r4, r0, r3             @r4: pDstY2 = pDstY + nWidth
31     add         r5, r2, r3, lsl #2     @r5: pSrcRGB2 = tmpSrcRGB + nWidthx4
32     sub         r8, r3, #16                @r8: nWidthTmp = nWidth -16
33
34     @q0: temp1, R
35     @q1: temp2, GB
36     @q2: R
37     @q3: G
38     @q4: B
39     @q5: temp3, output
40
41
42     vmov.u16 q6, #66 @coefficient assignment
43     vmov.u16 q7, #129
44     vmov.u16 q8, #25
45     vmov.u16 q9,  #0x8080  @ 128<<8 + 128
46
47     vmov.u16 q10, #0x1000  @ 16<<8 + 128
48     vorr.u16 q10, #0x0080
49
50     vmov.u16 q11, #38 @#-38
51     vmov.u16 q12, #74 @#-74
52     vmov.u16 q13, #112
53     vmov.u16 q14, #94 @#-94
54     vmov.u16 q15, #18 @#-18
55
56
57
58
59 LOOP_NHEIGHT2:
60     stmfd       sp!, {r12}       @ backup registers
61
62 LOOP_NWIDTH16:
63     pld         [r2, #(CACHE_LINE_SIZE*PRE_LOAD_OFFSET)]
64    @-------------------------------------------YUV ------------------------------------------
65     vmov.u16 q14, #94 @#94
66     vmov.u16 q15, #18 @#18
67     vld4.8   {d0,d1,d2,d3}, [r2]! @loadRGB interleavely
68     vld4.8   {d4,d5,d6,d7}, [r2]! @loadRGB interleavely
69
70
71     @vmov.u16 d8,d2
72     @vmov.u16 d9,d6
73     @vmov.u16 d10,d1
74     @vmov.u16 d11,d5
75     @vmov.u16 d12,d0
76     @vmov.u16 d13,d4
77     vmov.u16 d8,d0
78     vmov.u16 d9,d4
79     vmov.u16 d10,d1
80     vmov.u16 d11,d5
81     vmov.u16 d12,d2
82     vmov.u16 d13,d6
83
84     vand.u16 q4,#0x00FF  @R
85     vand.u16 q5,#0x00FF  @G
86     vand.u16 q6,#0x00FF  @B
87
88     vmov.u16 q8,q9   @ CalcU()
89     vmla.u16 q8,q6,q13  @112 * B[k]
90     vmls.u16 q8,q4,q11  @q0:U -(38 * R[k]) @128<<6+ 32 + u>>2
91     vmls.u16 q8,q5,q12  @-(74 * G[k])
92     vshr.u16 q8,q8, #8  @(128<<8+ 128 + u)>>8
93
94     vmov.u16 q7,q9      @CalcV()
95     vmla.u16 q7,q4,q13  @112 * R[k]
96     vmls.u16 q7,q5,q14  @q0:U -(94 * G[k])  @128<<6+ 32 + v>>2
97     vmls.u16 q7,q6,q15  @-(18 * B[k])
98     vshr.u16 q7,q7, #8  @(128<<8+ 128 + v)>>8
99
100
101     vtrn.8 q8,q7
102     vst1.8  {q8}, [r1]!    @write UV component to yuv420_buffer+linear_ylanesiez
103
104     @-------------------------------------------Y ------------------------------------------
105
106     vmov.u16 q14, #66 @#66
107     vmov.u16 q15, #129 @#129
108     vmov.u16 q8, #25 @#25
109
110     @CalcY_Y()
111
112     vmul.u16 q7,q4,q14  @q0 = 66 *R[k]
113     vmla.u16 q7,q5,q15  @q0 += 129 *G[k]
114     vmla.u16 q7,q6,q8  @q0 += 25 *B[k]
115
116     vadd.u16 q7,q7,q10
117     vshr.u16 q7,q7, #8
118
119     @vmov.u16 d8,d2
120     @vmov.u16 d9,d6
121     @vmov.u16 d10,d1
122     @vmov.u16 d11,d5
123     @vmov.u16 d12,d0
124     @vmov.u16 d13,d4
125     vmov.u16 d8,d0
126     vmov.u16 d9,d4
127     vmov.u16 d10,d1
128     vmov.u16 d11,d5
129     vmov.u16 d12,d2
130     vmov.u16 d13,d6
131
132     vshr.u16 q4,q4,#8  @R
133     vshr.u16 q5,q5,#8  @G
134     vshr.u16 q6,q6,#8  @B
135
136     vmul.u16 q0,q4,q14  @q0 = 66 *R[k]
137     vmla.u16 q0,q5,q15  @q0 += 129 *G[k]
138     vmla.u16 q0,q6,q8  @q0 += 25 *B[k]
139     vadd.u16 q0,q0,q10
140     vshr.u16 q0,q0, #8
141
142     vtrn.8 q7,q0
143     vst1.8  {q7}, [r0]!@write to Y to yuv420_buffer
144
145
146
147    @-------------------------------------------Y ------------------------------------------
148
149             @---------------------------------------------Y1-------------------------------------------
150
151     pld         [r5, #(CACHE_LINE_SIZE*PRE_LOAD_OFFSET)]
152     vld4.8   {d0,d1,d2,d3}, [r5]! @loadRGB interleavely
153     vld4.8   {d4,d5,d6,d7}, [r5]! @loadRGB interleavely
154
155     @vmov.u16 d8,d2
156     @vmov.u16 d9,d6
157     @vmov.u16 d10,d1
158     @vmov.u16 d11,d5
159     @vmov.u16 d12,d0
160     @vmov.u16 d13,d4
161     vmov.u16 d8,d0
162     vmov.u16 d9,d4
163     vmov.u16 d10,d1
164     vmov.u16 d11,d5
165     vmov.u16 d12,d2
166     vmov.u16 d13,d6
167
168     vand.u16 q4,#0x00FF  @R
169     vand.u16 q5,#0x00FF  @G
170     vand.u16 q6,#0x00FF  @B
171
172
173
174     vmul.u16 q7,q4,q14  @q0 = 66 *R[k]
175     vmla.u16 q7,q5,q15  @q0 += 129 *G[k]
176     vmla.u16 q7,q6,q8  @q0 += 25 *B[k]
177     vadd.u16 q7,q7,q10
178     vshr.u16 q7,q7, #8
179
180     @vmov.u16 d8,d2
181     @vmov.u16 d9,d6
182     @vmov.u16 d10,d1
183     @vmov.u16 d11,d5
184     @vmov.u16 d12,d0
185     @vmov.u16 d13,d4
186     vmov.u16 d8,d0
187     vmov.u16 d9,d4
188     vmov.u16 d10,d1
189     vmov.u16 d11,d5
190     vmov.u16 d12,d2
191     vmov.u16 d13,d6
192
193     vshr.u16 q4,q4,#8  @R
194     vshr.u16 q5,q5,#8  @G
195     vshr.u16 q6,q6,#8  @B
196
197     vmul.u16 q0,q4,q14  @q0 = 66 *R[k]
198     vmla.u16 q0,q5,q15  @q0 += 129 *G[k]
199     vmla.u16 q0,q6,q8  @q0 += 25 *B[k]
200     vadd.u16 q0,q0,q10
201     vshr.u16 q0,q0, #8
202
203     vtrn.8 q7,q0
204     vst1.8  {q7}, [r4]!@write to Y to yuv420_buffer
205
206     subs r8,r8,#16                       @nWidth16--
207     BPL LOOP_NWIDTH16                @if nWidth16>0
208     @-----------------------------------unaligned ---------------------------------------
209
210     adds r8,r8,#16 @ + 16 - 2
211     BEQ NO_UNALIGNED  @in case that nWidht is multiple of 16
212 LOOP_NWIDTH2:
213     @----------------------------------pDstRGB1--Y------------------------------------------
214     @stmfd sp!, {r14} @backup r14
215
216
217     ldr r9,  [r2], #4 @loadRGB  int
218     ldr r12,  [r2], #4 @loadRGB  int
219
220     mov r10, r9,lsr #16    @copy to r10
221     mov r14, r12    @copy to r10
222
223     ldr r6, =0x000000FF
224     and r10, r10, r6 @R: (rgbIn[k] & 0xF800) >> 10;
225     ldr r6, =0x00FF0000
226     and r14, r14, r6 @R: (rgbIn[k] & 0xF800) >> 10;
227     add r10,r10,r14
228
229     mov r11, #66 @accumilator += R*66
230     mul r7, r10, r11
231
232     mov r10, r9,lsr #8    @copy to r10
233     mov r14, r12,lsl #8    @copy to r10
234
235     ldr r6, =0x000000FF
236     and r10, r10, r6 @G:
237     ldr r6, =0x00FF0000
238     and r14, r14, r6 @G:
239     add r10,r10,r14
240
241     mov r11, #129 @accumilator += G *129
242     mla r7, r10, r11, r7
243
244     mov r10, r9    @copy to r10
245     mov r14, r12,lsl #16    @copy to r10
246
247     ldr r6, =0x000000FF
248     and r10, r10, r6 @B
249     ldr r6, =0x00FF0000
250     and r14, r14, r6 @B
251     add r10,r10,r14
252
253     mov r11, #25 @accumilator 1 -= B *25
254     mla r7, r10, r11, r7
255
256     ldr r6, =0x10801080
257     add  r7, r6
258
259     lsr r7, #8
260     strb r7, [r0],#1
261     lsr r7,#16
262     strb r7, [r0],#1
263     @ldmfd sp!, {r14} @load r14
264
265
266     @----------------------------------pDstRGB2--UV------------------------------------------
267
268     mov r10, r9    @copy to r10
269     ldr  r7,=0x00008080
270     mov  r12,r7
271
272     ldr r6, =0x000000FF
273     and r10, r10, r6 @B:
274
275     mov r11, #112 @accumilator += B*112
276     mla r7, r10, r11, r7
277
278
279     mov r11, #18 @accumilator -= B*18
280     mul r11, r10, r11
281     sub r12, r12, r11
282
283
284
285
286     mov r10, r9, lsr #16    @copy to r10
287     ldr r6, =0x000000FF
288     and r10, r10, r6 @R: (rgbIn[k] & 0xF800) >> 10;
289
290     mov r11, #38 @accumilator -= R *38
291     mul r11, r10, r11
292     sub r7, r7, r11
293
294     mov r11, #112 @accumilator  = R *112
295     mla r12, r10, r11, r12
296
297     mov r10, r9,lsr #8    @copy to r10
298     ldr r6, =0x000000FF
299     and r10, r10, r6  @G: (rgbIn[k] & 0x07E0) >> 5;
300
301     mov r11, #74 @accumilator -= G*74
302     mul r11, r10, r11
303     sub r7, r7, r11
304
305     mov r11, #94 @accumilator -= G*94
306     mul r11, r10, r11
307     sub r12, r12, r11
308
309     lsr r7, #8 @ >>8
310     strb r7, [r1],#1
311     lsr r12, #8 @ >>8
312     strb r12, [r1],#1
313
314     @----------------------------------pDstRGB2--Y------------------------------------------
315     @stmfd sp!, {r14} @backup r14
316
317
318     ldr r9,  [r5], #4 @loadRGB  int
319     ldr r12,  [r5], #4 @loadRGB  int
320
321     mov r10, r9,lsr #16    @copy to r10
322     mov r14, r12    @copy to r10
323
324     ldr r6, =0x000000FF
325     and r10, r10, r6 @R: (rgbIn[k] & 0xF800) >> 10;
326     ldr r6, =0x00FF0000
327     and r14, r14, r6 @R: (rgbIn[k] & 0xF800) >> 10;
328     add r10,r10,r14
329
330     mov r11, #66 @accumilator += R*66
331     mul r7, r10, r11
332
333     mov r10, r9,lsr #8    @copy to r10
334     mov r14, r12,lsl #8    @copy to r10
335
336     ldr r6, =0x000000FF
337     and r10, r10, r6 @G:
338     ldr r6, =0x00FF0000
339     and r14, r14, r6 @G:
340     add r10,r10,r14
341
342     mov r11, #129 @accumilator += G *129
343     mla r7, r10, r11, r7
344
345     mov r10, r9    @copy to r10
346     mov r14, r12,lsl #16    @copy to r10
347
348     ldr r6, =0x000000FF
349     and r10, r10, r6 @B
350     ldr r6, =0x00FF0000
351     and r14, r14, r6 @B
352     add r10,r10,r14
353
354
355
356
357     mov r11, #25 @accumilator 1 -= B *25
358     mla r7, r10, r11, r7
359
360     ldr r6, =0x10801080
361     add  r7, r6
362     lsr r7, #8
363
364     strb r7, [r4],#1
365     lsr r7,#16
366     strb r7, [r4],#1
367     @ldmfd sp!, {r14} @load r14
368
369
370     subs r8,r8,#2                      @ nWidth2 -= 2
371     BGT LOOP_NWIDTH2                @ if nWidth2>0
372
373
374 NO_UNALIGNED: @in case that nWidht is multiple of 16
375
376     @-----------------------------------------------------------------------------
377     sub         r8, r3, #16                @r8: nWidthTmp = nWidth -16
378     add r0, r0,  r3   @pDstY +  nwidth
379     add r2, r2, r3, lsl #2    @pSrcRGB +  nwidthx4
380     add r4, r4,  r3   @pDstY2 +  nwidth
381     add r5, r5, r3, lsl #2   @pSrcRGB2 +  nwidthx4
382
383     ldmfd sp!, {r12}
384     subs r12,r12,#2                       @nHeight -=2
385     BGT LOOP_NHEIGHT2                @if nHeight2>0
386
387     ldmfd       sp!, {r4-r12,pc}       @ backup registers
388     .fnend