33a31da4815094fab578e57de73f9c4d9485814f
[platform/adaptation/ap_samsung/libexynos-common.git] / libswconverter / csc_linear_to_tiled_interleave_crop_neon.s
1 /*
2  *
3  * Copyright 2012 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_linear_to_tiled_interleave_crop_neon.s
20  * @brief   SEC_OMX specific define
21  * @author  ShinWon Lee (shinwon.lee@samsung.com)
22  * @version 1.0
23  * @history
24  *   2012.02.01 : Create
25  */
26
27 /*
28  * Converts tiled data to linear
29  * Crops left, top, right, buttom
30  * 1. Y of NV12T to Y of YUV420P
31  * 2. Y of NV12T to Y of YUV420S
32  * 3. UV of NV12T to UV of YUV420S
33  *
34  * @param yuv420_dest
35  *   Y or UV plane address of YUV420[out]
36  *
37  * @param nv12t_src
38  *   Y or UV plane address of NV12T[in]
39  *
40  * @param yuv420_width
41  *   Width of YUV420[in]
42  *
43  * @param yuv420_height
44  *   Y: Height of YUV420, UV: Height/2 of YUV420[in]
45  *
46  * @param left
47  *   Crop size of left. It should be even.
48  *
49  * @param top
50  *   Crop size of top. It should be even.
51  *
52  * @param right
53  *   Crop size of right. It should be even.
54  *
55  * @param buttom
56  *   Crop size of buttom. It should be even.
57  */
58
59     .arch armv7-a
60     .text
61     .global csc_linear_to_tiled_interleave_crop_neon
62     .type   csc_linear_to_tiled_interleave_crop_neon, %function
63 csc_linear_to_tiled_interleave_crop_neon:
64     .fnstart
65
66     @r0     tiled_dest
67     @r1     linear_src_u
68     @r2     linear_src_v
69     @r3     yuv420_width
70     @r4     yuv420_height
71     @r5     j
72     @r6     i
73     @r7     tiled_addr
74     @r8     linear_addr
75     @r9     aligned_x_size
76     @r10    aligned_y_size
77     @r11    temp1
78     @r12    temp2
79     @r14    temp3
80
81     stmfd       sp!, {r4-r12,r14}       @ backup registers
82
83     ldr         r4, [sp, #40]           @ load linear_y_size to r4
84
85     ldr         r10, [sp, #48]          @ r10 = top
86     ldr         r14, [sp, #56]          @ r14 = buttom
87     ldr         r11, [sp, #44]          @ r11 = left
88     ldr         r12, [sp, #52]          @ r12 = right
89
90     sub         r10, r4, r10            @ aligned_y_size = ((yuv420_height-top-buttom)>>5)<<5
91     sub         r10, r10, r14
92     bic         r10, r10, #0x1F
93     sub         r11, r3, r11            @ aligned_x_size = ((yuv420_width-left-right)>>6)<<6
94     sub         r11, r11, r12
95     bic         r9, r11, #0x3F
96
97     mov         r6, #0                  @ i = 0
98 LOOP_ALIGNED_Y_SIZE:
99
100     mov         r5, #0                  @ j = 0
101 LOOP_ALIGNED_X_SIZE:
102
103     bl          GET_TILED_OFFSET
104
105     ldr         r12, [sp, #48]          @ r12 = top
106     ldr         r8, [sp, #44]           @ r8 = left
107
108     mov         r11, r3, asr #1         @ temp1 = (yuv420_width/2)*(i+top)
109     add         r12, r6, r12
110     mul         r11, r11, r12
111     add         r11, r11, r5, asr #1    @ temp1 = temp1+j/2
112     add         r11, r11, r8, asr #1    @ temp1 = temp1+left/2
113
114     mov         r12, r3, asr #1         @ temp2 = yuv420_width/2
115     sub         r12, r12, #16           @ temp2 = yuv420_width-16
116
117     add         r8, r1, r11             @ linear_addr = linear_src_u+temp1
118     add         r11, r2, r11            @ temp1 = linear_src_v+temp1
119     add         r7, r0, r7              @ tiled_addr = tiled_dest+tiled_addr
120
121     pld         [r8, r3]
122     vld1.8      {q0}, [r8]!             @ load {linear_src_u, 32}
123     vld1.8      {q2}, [r8], r12
124     pld         [r8, r3]
125     vld1.8      {q4}, [r8]!             @ load {linear_src_u+(linear_x_size/2)*1, 32}
126     vld1.8      {q6}, [r8], r12
127     pld         [r11]
128     vld1.8      {q8}, [r8]!             @ load {linear_src_u+(linear_x_size/2)*2, 32}
129     vld1.8      {q10}, [r8], r12
130     pld         [r11, r3, asr #1]
131     vld1.8      {q12}, [r8]!            @ load {linear_src_u+(linear_x_size/2)*3, 32}
132     vld1.8      {q14}, [r8], r12
133     pld         [r11, r3]
134     vld1.8      {q1}, [r11]!            @ load {linear_src_v, 32}
135     vld1.8      {q3}, [r11], r12
136     pld         [r11, r3]
137     vld1.8      {q5}, [r11]!            @ load {linear_src_v+(linear_x_size/2)*1, 32}
138     vld1.8      {q7}, [r11], r12
139     pld         [r8]
140     vld1.8      {q9}, [r11]!            @ load {linear_src_v+(linear_x_size/2)*2, 32}
141     vld1.8      {q11}, [r11], r12
142     pld         [r8, r3, asr #1]
143     vld1.8      {q13}, [r11]!           @ load {linear_src_v+(linear_x_size/2)*3, 32}
144     vld1.8      {q15}, [r11], r12
145     vst2.8      {q0, q1}, [r7]!         @ store {tiled_addr}
146     vst2.8      {q2, q3}, [r7]!
147     vst2.8      {q4, q5}, [r7]!         @ store {tiled_addr+64*1}
148     vst2.8      {q6, q7}, [r7]!
149     vst2.8      {q8, q9}, [r7]!         @ store {tiled_addr+64*2}
150     vst2.8      {q10, q11}, [r7]!
151     vst2.8      {q12, q13}, [r7]!       @ store {tiled_addr+64*3}
152     vst2.8      {q14, q15}, [r7]!
153
154     pld         [r8, r3]
155     vld1.8      {q0}, [r8]!             @ load {linear_src_u+(linear_x_size/2)*4, 32}
156     vld1.8      {q2}, [r8], r12
157     pld         [r8, r3]
158     vld1.8      {q4}, [r8]!             @ load {linear_src_u+(linear_x_size/2)*5, 32}
159     vld1.8      {q6}, [r8], r12
160     pld         [r11]
161     vld1.8      {q8}, [r8]!             @ load {linear_src_u+(linear_x_size/2)*6, 32}
162     vld1.8      {q10}, [r8], r12
163     pld         [r11, r3, asr #1]
164     vld1.8      {q12}, [r8]!            @ load {linear_src_u+(linear_x_size/2)*7, 32}
165     vld1.8      {q14}, [r8], r12
166     pld         [r11, r3]
167     vld1.8      {q1}, [r11]!            @ load {linear_src_v+(linear_x_size/2)*4, 32}
168     vld1.8      {q3}, [r11], r12
169     pld         [r11, r3]
170     vld1.8      {q5}, [r11]!            @ load {linear_src_v+(linear_x_size/2)*5, 32}
171     vld1.8      {q7}, [r11], r12
172     pld         [r8]
173     vld1.8      {q9}, [r11]!            @ load {linear_src_v+(linear_x_size/2)*6, 32}
174     vld1.8      {q11}, [r11], r12
175     pld         [r8, r3, asr #1]
176     vld1.8      {q13}, [r11]!           @ load {linear_src_v+(linear_x_size/2)*7, 32}
177     vld1.8      {q15}, [r11], r12
178     vst2.8      {q0, q1}, [r7]!         @ store {tiled_addr+64*4}
179     vst2.8      {q2, q3}, [r7]!
180     vst2.8      {q4, q5}, [r7]!         @ store {tiled_addr+64*5}
181     vst2.8      {q6, q7}, [r7]!
182     vst2.8      {q8, q9}, [r7]!         @ store {tiled_addr+64*6}
183     vst2.8      {q10, q11}, [r7]!
184     vst2.8      {q12, q13}, [r7]!       @ store {tiled_addr+64*7}
185     vst2.8      {q14, q15}, [r7]!
186
187     pld         [r8, r3]
188     vld1.8      {q0}, [r8]!             @ load {linear_src_u+(linear_x_size/2)*8, 32}
189     vld1.8      {q2}, [r8], r12
190     pld         [r8, r3]
191     vld1.8      {q4}, [r8]!             @ load {linear_src_u+(linear_x_size/2)*9, 32}
192     vld1.8      {q6}, [r8], r12
193     pld         [r11]
194     vld1.8      {q8}, [r8]!             @ load {linear_src_u+(linear_x_size/2)*10, 32}
195     vld1.8      {q10}, [r8], r12
196     pld         [r11, r3, asr #1]
197     vld1.8      {q12}, [r8]!            @ load {linear_src_u+(linear_x_size/2)*11, 32}
198     vld1.8      {q14}, [r8], r12
199     pld         [r11, r3]
200     vld1.8      {q1}, [r11]!            @ load {linear_src_v+(linear_x_size/2)*8, 32}
201     vld1.8      {q3}, [r11], r12
202     pld         [r11, r3]
203     vld1.8      {q5}, [r11]!            @ load {linear_src_v+(linear_x_size/2)*9, 32}
204     vld1.8      {q7}, [r11], r12
205     pld         [r8]
206     vld1.8      {q9}, [r11]!            @ load {linear_src_v+(linear_x_size/2)*10, 32}
207     vld1.8      {q11}, [r11], r12
208     pld         [r8, r3, asr #1]
209     vld1.8      {q13}, [r11]!           @ load {linear_src_v+(linear_x_size/2)*11, 32}
210     vld1.8      {q15}, [r11], r12
211     vst2.8      {q0, q1}, [r7]!         @ store {tiled_addr+64*8}
212     vst2.8      {q2, q3}, [r7]!
213     vst2.8      {q4, q5}, [r7]!         @ store {tiled_addr+64*9}
214     vst2.8      {q6, q7}, [r7]!
215     vst2.8      {q8, q9}, [r7]!         @ store {tiled_addr+64*10}
216     vst2.8      {q10, q11}, [r7]!
217     vst2.8      {q12, q13}, [r7]!       @ store {tiled_addr+64*11}
218     vst2.8      {q14, q15}, [r7]!
219
220     pld         [r8, r3]
221     vld1.8      {q0}, [r8]!             @ load {linear_src_u+(linear_x_size/2)*12, 32}
222     vld1.8      {q2}, [r8], r12
223     pld         [r8, r3]
224     vld1.8      {q4}, [r8]!             @ load {linear_src_u+(linear_x_size/2)*13, 32}
225     vld1.8      {q6}, [r8], r12
226     pld         [r11]
227     vld1.8      {q8}, [r8]!             @ load {linear_src_u+(linear_x_size/2)*14, 32}
228     vld1.8      {q10}, [r8], r12
229     pld         [r11, r3, asr #1]
230     vld1.8      {q12}, [r8]!            @ load {linear_src_u+(linear_x_size/2)*15, 32}
231     vld1.8      {q14}, [r8], r12
232     pld         [r11, r3]
233     vld1.8      {q1}, [r11]!            @ load {linear_src_v+(linear_x_size/2)*12, 32}
234     vld1.8      {q3}, [r11], r12
235     pld         [r11, r3]
236     vld1.8      {q5}, [r11]!            @ load {linear_src_v+(linear_x_size/2)*13, 32}
237     vld1.8      {q7}, [r11], r12
238     pld         [r8]
239     vld1.8      {q9}, [r11]!            @ load {linear_src_v+(linear_x_size/2)*14, 32}
240     vld1.8      {q11}, [r11], r12
241     pld         [r8, r3, asr #1]
242     vld1.8      {q13}, [r11]!           @ load {linear_src_v+(linear_x_size/2)*15, 32}
243     vld1.8      {q15}, [r11], r12
244     vst2.8      {q0, q1}, [r7]!         @ store {tiled_addr+64*12}
245     vst2.8      {q2, q3}, [r7]!
246     vst2.8      {q4, q5}, [r7]!         @ store {tiled_addr+64*13}
247     vst2.8      {q6, q7}, [r7]!
248     vst2.8      {q8, q9}, [r7]!         @ store {tiled_addr+64*14}
249     vst2.8      {q10, q11}, [r7]!
250     vst2.8      {q12, q13}, [r7]!       @ store {tiled_addr+64*15}
251     vst2.8      {q14, q15}, [r7]!
252
253     pld         [r8, r3]
254     vld1.8      {q0}, [r8]!             @ load {linear_src_u+(linear_x_size/2)*16, 32}
255     vld1.8      {q2}, [r8], r12
256     pld         [r8, r3]
257     vld1.8      {q4}, [r8]!             @ load {linear_src_u+(linear_x_size/2)*17, 32}
258     vld1.8      {q6}, [r8], r12
259     pld         [r11]
260     vld1.8      {q8}, [r8]!             @ load {linear_src_u+(linear_x_size/2)*18, 32}
261     vld1.8      {q10}, [r8], r12
262     pld         [r11, r3, asr #1]
263     vld1.8      {q12}, [r8]!            @ load {linear_src_u+(linear_x_size/2)*19, 32}
264     vld1.8      {q14}, [r8], r12
265     pld         [r11, r3]
266     vld1.8      {q1}, [r11]!            @ load {linear_src_v+(linear_x_size/2)*16, 32}
267     vld1.8      {q3}, [r11], r12
268     pld         [r11, r3]
269     vld1.8      {q5}, [r11]!            @ load {linear_src_v+(linear_x_size/2)*17, 32}
270     vld1.8      {q7}, [r11], r12
271     pld         [r8]
272     vld1.8      {q9}, [r11]!            @ load {linear_src_v+(linear_x_size/2)*18, 32}
273     vld1.8      {q11}, [r11], r12
274     pld         [r8, r3, asr #1]
275     vld1.8      {q13}, [r11]!           @ load {linear_src_v+(linear_x_size/2)*19, 32}
276     vld1.8      {q15}, [r11], r12
277     vst2.8      {q0, q1}, [r7]!         @ store {tiled_addr+64*16}
278     vst2.8      {q2, q3}, [r7]!
279     vst2.8      {q4, q5}, [r7]!         @ store {tiled_addr+64*17}
280     vst2.8      {q6, q7}, [r7]!
281     vst2.8      {q8, q9}, [r7]!         @ store {tiled_addr+64*18}
282     vst2.8      {q10, q11}, [r7]!
283     vst2.8      {q12, q13}, [r7]!       @ store {tiled_addr+64*19}
284     vst2.8      {q14, q15}, [r7]!
285
286     pld         [r8, r3]
287     vld1.8      {q0}, [r8]!             @ load {linear_src_u+(linear_x_size/2)*20, 32}
288     vld1.8      {q2}, [r8], r12
289     pld         [r8, r3]
290     vld1.8      {q4}, [r8]!             @ load {linear_src_u+(linear_x_size/2)*21, 32}
291     vld1.8      {q6}, [r8], r12
292     pld         [r11]
293     vld1.8      {q8}, [r8]!             @ load {linear_src_u+(linear_x_size/2)*22, 32}
294     vld1.8      {q10}, [r8], r12
295     pld         [r11, r3, asr #1]
296     vld1.8      {q12}, [r8]!            @ load {linear_src_u+(linear_x_size/2)*23, 32}
297     vld1.8      {q14}, [r8], r12
298     pld         [r11, r3]
299     vld1.8      {q1}, [r11]!            @ load {linear_src_v+(linear_x_size/2)*20, 32}
300     vld1.8      {q3}, [r11], r12
301     pld         [r11, r3]
302     vld1.8      {q5}, [r11]!            @ load {linear_src_v+(linear_x_size/2)*21, 32}
303     vld1.8      {q7}, [r11], r12
304     pld         [r8]
305     vld1.8      {q9}, [r11]!            @ load {linear_src_v+(linear_x_size/2)*22, 32}
306     vld1.8      {q11}, [r11], r12
307     pld         [r8, r3, asr #1]
308     vld1.8      {q13}, [r11]!           @ load {linear_src_v+(linear_x_size/2)*23, 32}
309     vld1.8      {q15}, [r11], r12
310     vst2.8      {q0, q1}, [r7]!         @ store {tiled_addr+64*20}
311     vst2.8      {q2, q3}, [r7]!
312     vst2.8      {q4, q5}, [r7]!         @ store {tiled_addr+64*21}
313     vst2.8      {q6, q7}, [r7]!
314     vst2.8      {q8, q9}, [r7]!         @ store {tiled_addr+64*22}
315     vst2.8      {q10, q11}, [r7]!
316     vst2.8      {q12, q13}, [r7]!       @ store {tiled_addr+64*23}
317     vst2.8      {q14, q15}, [r7]!
318
319     pld         [r8, r3]
320     vld1.8      {q0}, [r8]!             @ load {linear_src_u+(linear_x_size/2)*24, 32}
321     vld1.8      {q2}, [r8], r12
322     pld         [r8, r3]
323     vld1.8      {q4}, [r8]!             @ load {linear_src_u+(linear_x_size/2)*25, 32}
324     vld1.8      {q6}, [r8], r12
325     pld         [r11]
326     vld1.8      {q8}, [r8]!             @ load {linear_src_u+(linear_x_size/2)*26, 32}
327     vld1.8      {q10}, [r8], r12
328     pld         [r11, r3, asr #1]
329     vld1.8      {q12}, [r8]!            @ load {linear_src_u+(linear_x_size/2)*27, 32}
330     vld1.8      {q14}, [r8], r12
331     pld         [r11, r3]
332     vld1.8      {q1}, [r11]!            @ load {linear_src_v+(linear_x_size/2)*24, 32}
333     vld1.8      {q3}, [r11], r12
334     pld         [r11, r3]
335     vld1.8      {q5}, [r11]!            @ load {linear_src_v+(linear_x_size/2)*25, 32}
336     vld1.8      {q7}, [r11], r12
337     pld         [r8]
338     vld1.8      {q9}, [r11]!            @ load {linear_src_v+(linear_x_size/2)*26, 32}
339     vld1.8      {q11}, [r11], r12
340     pld         [r8, r3, asr #1]
341     vld1.8      {q13}, [r11]!           @ load {linear_src_v+(linear_x_size/2)*27, 32}
342     vld1.8      {q15}, [r11], r12
343     vst2.8      {q0, q1}, [r7]!         @ store {tiled_addr+64*24}
344     vst2.8      {q2, q3}, [r7]!
345     vst2.8      {q4, q5}, [r7]!         @ store {tiled_addr+64*25}
346     vst2.8      {q6, q7}, [r7]!
347     vst2.8      {q8, q9}, [r7]!         @ store {tiled_addr+64*26}
348     vst2.8      {q10, q11}, [r7]!
349     vst2.8      {q12, q13}, [r7]!       @ store {tiled_addr+64*27}
350     vst2.8      {q14, q15}, [r7]!
351
352     pld         [r8, r3]
353     vld1.8      {q0}, [r8]!             @ load {linear_src_u+(linear_x_size/2)*28, 32}
354     vld1.8      {q2}, [r8], r12
355     pld         [r8, r3]
356     vld1.8      {q4}, [r8]!             @ load {linear_src_u+(linear_x_size/2)*29, 32}
357     vld1.8      {q6}, [r8], r12
358     pld         [r11]
359     vld1.8      {q8}, [r8]!             @ load {linear_src_u+(linear_x_size/2)*30, 32}
360     vld1.8      {q10}, [r8], r12
361     pld         [r11, r3, asr #1]
362     vld1.8      {q12}, [r8]!            @ load {linear_src_u+(linear_x_size/2)*31, 32}
363     vld1.8      {q14}, [r8], r12
364     pld         [r11, r3]
365     vld1.8      {q1}, [r11]!            @ load {linear_src_v+(linear_x_size/2)*28, 32}
366     vld1.8      {q3}, [r11], r12
367     pld         [r11, r3]
368     vld1.8      {q5}, [r11]!            @ load {linear_src_v+(linear_x_size/2)*29, 32}
369     vld1.8      {q7}, [r11], r12
370     vld1.8      {q9}, [r11]!            @ load {linear_src_v+(linear_x_size/2)*30, 32}
371     vld1.8      {q11}, [r11], r12
372     vld1.8      {q13}, [r11]!           @ load {linear_src_v+(linear_x_size/2)*31, 32}
373     vld1.8      {q15}, [r11], r12
374     vst2.8      {q0, q1}, [r7]!         @ store {tiled_addr+64*28}
375     vst2.8      {q2, q3}, [r7]!
376     vst2.8      {q4, q5}, [r7]!         @ store {tiled_addr+64*29}
377     vst2.8      {q6, q7}, [r7]!
378     vst2.8      {q8, q9}, [r7]!         @ store {tiled_addr+64*30}
379     vst2.8      {q10, q11}, [r7]!
380     vst2.8      {q12, q13}, [r7]!       @ store {tiled_addr+64*31}
381     vst2.8      {q14, q15}, [r7]!
382
383     add         r5, r5, #64             @ j = j+64
384     cmp         r5, r9                  @ j<aligned_x_size
385     blt         LOOP_ALIGNED_X_SIZE
386
387     add         r6, r6, #32             @ i = i+32
388     cmp         r6, r10                 @ i<aligned_y_size
389     blt         LOOP_ALIGNED_Y_SIZE
390
391     cmp         r6, r4
392     beq         LOOP_LINEAR_Y_SIZE_2_START
393
394 LOOP_LINEAR_Y_SIZE_1:
395
396     mov         r5, #0                  @ j = 0
397 LOOP_ALIGNED_X_SIZE_1:
398
399     bl          GET_TILED_OFFSET
400
401     ldr         r12, [sp, #48]          @ r12 = top
402     ldr         r8, [sp, #44]           @ r8 = left
403
404     mov         r11, r3, asr #1         @ temp1 = (yuv420_width/2)*(i+top)
405     add         r12, r6, r12
406     mul         r11, r11, r12
407     add         r11, r11, r5, asr #1    @ temp1 = temp1+j/2
408     add         r11, r11, r8, asr #1    @ temp1 = temp1+left/2
409
410     add         r8, r1, r11             @ linear_addr = linear_src_u+temp1
411     add         r11, r2, r11            @ temp1 = linear_src_v+temp1
412     add         r7, r0, r7              @ tiled_addr = tiled_dest+tiled_addr
413     and         r14, r6, #0x1F          @ temp3 = i&0x1F@
414     mov         r14, r14, lsl #6        @ temp3 = temp3*64
415     add         r7, r7, r14             @ tiled_addr = tiled_addr+temp3
416
417     vld1.8      {q0}, [r8]!             @ load {linear_src_u, 32}
418     vld1.8      {q2}, [r8]
419     vld1.8      {q1}, [r11]!            @ load {linear_src_v, 32}
420     vld1.8      {q3}, [r11]
421     vst2.8      {q0, q1}, [r7]!         @ store {tiled_addr}
422     vst2.8      {q2, q3}, [r7]!
423
424     add         r5, r5, #64             @ j = j+64
425     cmp         r5, r9                  @ j<aligned_x_size
426     blt         LOOP_ALIGNED_X_SIZE_1
427
428     ldr         r12, [sp, #48]          @ r12 = top
429     ldr         r8, [sp, #56]           @ r8 = buttom
430     add         r6, r6, #1              @ i = i+1
431     sub         r12, r4, r12
432     sub         r12, r12, r8
433     cmp         r6, r12                 @ i<(yuv420_height-top-buttom)
434     blt         LOOP_LINEAR_Y_SIZE_1
435
436 LOOP_LINEAR_Y_SIZE_2_START:
437     cmp         r5, r3
438     beq         RESTORE_REG
439
440     mov         r6, #0                  @ i = 0
441 LOOP_LINEAR_Y_SIZE_2:
442
443     mov         r5, r9                  @ j = aligned_x_size
444 LOOP_LINEAR_X_SIZE_2:
445
446     bl          GET_TILED_OFFSET
447
448     ldr         r12, [sp, #48]          @ r12 = top
449     ldr         r8, [sp, #44]           @ r8 = left
450
451     mov         r11, r3, asr #1         @ temp1 = (yuv420_width/2)*(i+top)
452     add         r12, r6, r12
453     mul         r11, r11, r12
454     add         r11, r11, r5, asr #1    @ temp1 = temp1+j/2
455     add         r11, r11, r8, asr #1    @ temp1 = temp1+left/2
456
457     mov         r12, r3, asr #1         @ temp2 = linear_x_size/2
458     sub         r12, r12, #1            @ temp2 = linear_x_size-1
459
460     add         r8, r1, r11             @ linear_addr = linear_src_u+temp1
461     add         r11, r2, r11            @ temp1 = linear_src_v+temp1
462     add         r7, r0, r7              @ tiled_addr = tiled_dest+tiled_addr
463     and         r14, r6, #0x1F          @ temp3 = i&0x1F@
464     mov         r14, r14, lsl #6        @ temp3 = temp3*64
465     add         r7, r7, r14             @ tiled_addr = tiled_addr+temp3
466     and         r14, r5, #0x3F          @ temp3 = j&0x3F
467     add         r7, r7, r14             @ tiled_addr = tiled_addr+temp3
468
469     ldrb        r10, [r8], #1
470     ldrb        r14, [r11], #1
471     mov         r14, r14, lsl #8
472     orr         r10, r10, r14
473     strh        r10, [r7], #2
474
475     ldr         r12, [sp, #44]          @ r12 = left
476     ldr         r8, [sp, #52]           @ r8 = right
477     add         r5, r5, #2              @ j = j+2
478     sub         r12, r3, r12
479     sub         r12, r12, r8
480     cmp         r5, r12                 @ j<(yuv420_width-left-right)
481     blt         LOOP_LINEAR_X_SIZE_2
482
483     ldr         r12, [sp, #48]          @ r12 = top
484     ldr         r8, [sp, #56]           @ r8 = buttom
485     add         r6, r6, #1              @ i = i+1
486     sub         r12, r4, r12
487     sub         r12, r12, r8
488     cmp         r6, r12                 @ i<(yuv420_height-top-buttom)
489     blt         LOOP_LINEAR_Y_SIZE_2
490
491 RESTORE_REG:
492     ldmfd       sp!, {r4-r12,r15}       @ restore registers
493
494 GET_TILED_OFFSET:
495     stmfd       sp!, {r14}
496
497     mov         r12, r6, asr #5         @ temp2 = i>>5
498     mov         r11, r5, asr #6         @ temp1 = j>>6
499
500     and         r14, r12, #0x1          @ if (temp2 & 0x1)
501     cmp         r14, #0x1
502     bne         GET_TILED_OFFSET_EVEN_FORMULA_1
503
504 GET_TILED_OFFSET_ODD_FORMULA:
505
506     ldr         r7, [sp, #48]           @ r7 = left , (r14 was pushed to stack)
507     ldr         r8, [sp, #56]           @ r8 = right , (r14 was pushed to stack)
508     sub         r14, r3, r7
509     sub         r14, r14, r8
510     add         r14, r14, #127          @ temp3 = (((yuv420_width-left-right)+127)>>7)<<7
511     bic         r14, r14, #0x7F         @ temp3 = (temp3 >>7)<<7
512     mov         r14, r14, asr #6        @ temp3 = temp3>>6
513     sub         r7, r12, #1             @ tiled_addr = temp2-1
514     mul         r7, r7, r14             @ tiled_addr = tiled_addr*temp3
515     add         r7, r7, r11             @ tiled_addr = tiled_addr+temp1
516     add         r7, r7, #2              @ tiled_addr = tiled_addr+2
517     bic         r14, r11, #0x3          @ temp3 = (temp1>>2)<<2
518     add         r7, r7, r14             @ tiled_addr = tiled_addr+temp3
519     mov         r7, r7, lsl #11         @ tiled_addr = tiled_addr<<11
520     b           GET_TILED_OFFSET_RETURN
521
522 GET_TILED_OFFSET_EVEN_FORMULA_1:
523     ldr         r7, [sp, #52]           @ r7 = top, (r14 was pushed to stack)
524     ldr         r8, [sp, #60]           @ r8 = buttom, (r14 was pushed to stack)
525     sub         r14, r4, r7
526     sub         r14, r14, r8
527     add         r14, r14, #31           @ temp3 = (((yuv420_height-top-buttom)+31)>>5)<<5
528     bic         r14, r14, #0x1F         @ temp3 = (temp3>>5)<<5
529     sub         r14, r14, #32           @ temp3 = temp3 - 32
530     cmp         r6, r14                 @ if (i<(temp3-32)) {
531     bge         GET_TILED_OFFSET_EVEN_FORMULA_2
532     add         r14, r11, #2            @ temp3 = temp1+2
533     bic         r14, r14, #3            @ temp3 = (temp3>>2)<<2
534     add         r7, r11, r14            @ tiled_addr = temp1+temp3
535     ldr         r8, [sp, #48]           @ r8 = left, (r14 was pushed to stack)
536     sub         r14, r3, r8
537     ldr         r8, [sp, #56]           @ r8 = right, (r14 was pushed to stack)
538     sub         r14, r14, r8
539     add         r14, r14, #127          @ temp3 = (((yuv420_width-left-right)+127)>>7)<<7
540     bic         r14, r14, #0x7F         @ temp3 = (temp3>>7)<<7
541     mov         r14, r14, asr #6        @ temp3 = temp3>>6
542     mul         r12, r12, r14           @ tiled_y_index = tiled_y_index*temp3
543     add         r7, r7, r12             @ tiled_addr = tiled_addr+tiled_y_index
544     mov         r7, r7, lsl #11         @
545     b           GET_TILED_OFFSET_RETURN
546
547 GET_TILED_OFFSET_EVEN_FORMULA_2:
548     ldr         r8, [sp, #48]           @ r8 = left, (r14 was pushed to stack)
549     sub         r14, r3, r8
550     ldr         r8, [sp, #56]           @ r8 = right, (r14 was pushed to stack)
551     sub         r14, r14, r8
552     add         r14, r14, #127          @ temp3 = (((yuv420_width-left-right)+127)>>7)<<7
553     bic         r14, r14, #0x7F         @ temp3 = (temp3>>7)<<7
554     mov         r14, r14, asr #6        @ temp3 = temp3>>6
555     mul         r7, r12, r14            @ tiled_addr = temp2*temp3
556     add         r7, r7, r11             @ tiled_addr = tiled_addr+temp3
557     mov         r7, r7, lsl #11         @ tiled_addr = tiled_addr<<11@
558
559 GET_TILED_OFFSET_RETURN:
560     ldmfd       sp!, {r15}              @ restore registers
561
562     .fnend
563