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