19b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang/*
29b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang *
39b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * Copyright 2012 Samsung Electronics S.LSI Co. LTD
49b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang *
59b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * Licensed under the Apache License, Version 2.0 (the "License")
69b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * you may not use this file except in compliance with the License.
79b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * You may obtain a copy of the License at
89b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang *
99b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang *      http://www.apache.org/licenses/LICENSE-2.0
109b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang *
119b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * Unless required by applicable law or agreed to in writing, software
129b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * distributed under the License is distributed on an "AS IS" BASIS,
139b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
149b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * See the License for the specific language governing permissions and
159b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * limitations under the License.
169b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang */
179b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang
189b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang/*
199b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * @file    csc_tiled_to_linear_uv_deinterleave_neon.s
209b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * @brief   SEC_OMX specific define. It support MFC 6.x tiled.
219b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * @author  ShinWon Lee (shinwon.lee@samsung.com)
229b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * @version 1.0
239b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * @history
249b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang *   2012.02.01 : Create
259b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang */
269b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang
279b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang/*
289b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * Converts and Deinterleave tiled data to linear for mfc 6.x
299b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * 1. UV of NV12T to Y of YUV420P
309b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang *
319b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * @param u_dst
329b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang *   U address of YUV420[out]
339b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang *
349b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * @param v_dst
359b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang *   V address of YUV420[out]
369b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang *
379b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * @param uv_src
389b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang *   UV address of NV12T[in]
399b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang *
409b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * @param yuv420_width
419b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang *   real width of YUV420[in]. It should be even.
429b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang *
439b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang * @param yuv420_height
449b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang *   real height of YUV420[in] It should be even.
459b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang */
469b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang
479b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    .arch armv7-a
489b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    .text
499b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    .global csc_tiled_to_linear_uv_deinterleave_neon
509b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    .type   csc_tiled_to_linear_uv_deinterleave_neon, %function
519b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Changcsc_tiled_to_linear_uv_deinterleave_neon:
529b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    .fnstart
539b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang
549b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    .equ CACHE_LINE_SIZE, 64
559b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    .equ PRE_LOAD_OFFSET, 6
569b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang
579b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    @r0     u_dst
589b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    @r1     v_dst
599b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    @r2     uv_src
609b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    @r3     width
619b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    @r4     height
629b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    @r5     i
639b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    @r6     j
649b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    @r7     dst_offset
659b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    @r8     src_offset
669b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    @r9     aligned_height
679b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    @r10    aligned_width
689b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    @r11    tiled_width
699b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    @r12    temp1
709b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    @r14    temp2
719b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang
729b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    stmfd       sp!, {r4-r12,r14}       @ backup registers
739b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    ldr         r4, [sp, #40]           @ r4 = height
749b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang
759b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    bic         r9, r4, #0x7            @ aligned_height = height & (~0x7)
769b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    bic         r10, r3, #0xF           @ aligned_width = width & (~0xF)
779b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    add         r11, r3, #15            @ tiled_width = ((width + 15) >> 4) << 4
789b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    mov         r11, r11, asr #4
799b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    mov         r11, r11, lsl #4
809b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang
819b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    mov         r5, #0
829b81eb7531233e152b01ee518e7c5df9b042ae77Jiho ChangLOOP_MAIN_ALIGNED_HEIGHT:
839b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    mul         r8, r11, r5             @ src_offset = tiled_width * i
849b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    mov         r6, #0
859b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    add         r8, r2, r8              @ src_offset = uv_src + src_offset
869b81eb7531233e152b01ee518e7c5df9b042ae77Jiho ChangLOOP_MAIN_ALIGNED_WIDTH:
879b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    mov         r12, r3, asr #1         @ temp1 = (width >> 1) * i + (j >> 1)
889b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    mul         r12, r12, r5
899b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang
909b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    pld         [r8, #(CACHE_LINE_SIZE*PRE_LOAD_OFFSET)]
919b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    vld2.8      {q0, q1}, [r8]!
929b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    add         r12, r12, r6, asr #1
939b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    vld2.8      {q2, q3}, [r8]!
949b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    add         r7, r0, r12             @ dst_offset = u_dst + temp1
959b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    pld         [r8, #(CACHE_LINE_SIZE*PRE_LOAD_OFFSET)]
969b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    vld2.8      {q4, q5}, [r8]!
979b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    mov         r14, r3, asr #1         @ temp2 = width / 2
989b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    vld2.8      {q6, q7}, [r8]!
999b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang
1009b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    vst1.8      {d0}, [r7], r14
1019b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    vst1.8      {d1}, [r7], r14
1029b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    vst1.8      {d4}, [r7], r14
1039b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    vst1.8      {d5}, [r7], r14
1049b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    vst1.8      {d8}, [r7], r14
1059b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    vst1.8      {d9}, [r7], r14
1069b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    vst1.8      {d12}, [r7], r14
1079b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    vst1.8      {d13}, [r7], r14
1089b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang
1099b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    add         r7, r1, r12             @ dst_offset = v_dst + temp1
1109b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang
1119b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    vst1.8      {d2}, [r7], r14
1129b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    vst1.8      {d3}, [r7], r14
1139b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    vst1.8      {d6}, [r7], r14
1149b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    vst1.8      {d7}, [r7], r14
1159b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    vst1.8      {d10}, [r7], r14
1169b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    vst1.8      {d11}, [r7], r14
1179b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    add         r6, r6, #16
1189b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    vst1.8      {d14}, [r7], r14
1199b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    cmp         r6, r10
1209b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    vst1.8      {d15}, [r7], r14
1219b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    blt         LOOP_MAIN_ALIGNED_WIDTH
1229b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang
1239b81eb7531233e152b01ee518e7c5df9b042ae77Jiho ChangMAIN_REMAIN_WIDTH_START:
1249b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    cmp         r10, r3                 @ if (aligned_width != width) {
1259b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    beq         MAIN_REMAIN_WIDTH_END
1269b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    stmfd       sp!, {r0-r2,r4}         @ backup registers
1279b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    mul         r8, r11, r5             @ src_offset = (tiled_width * i) + (j << 3)
1289b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    add         r8, r8, r6, lsl #3
1299b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    add         r8, r2, r8              @ r8 = uv_src + src_offset
1309b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    mov         r12, r3, asr #1         @ temp1 = (width >> 1) * i + (j >> 1)
1319b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    mul         r12, r12, r5
1329b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    add         r12, r12, r6, asr #1
1339b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    add         r7, r0, r12             @ r7 = u_dst + temp1
1349b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    add         r12, r1, r12            @ r12 = v_dst + temp1
1359b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    sub         r14, r3, r6             @ r14 = (width - j) / 2
1369b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    mov         r14, r14, asr #1
1379b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang
1389b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    mov         r4, #0
1399b81eb7531233e152b01ee518e7c5df9b042ae77Jiho ChangLOOP_MAIN_REMAIN_HEIGHT:
1409b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    mov         r0, #0                  @ r0 is index in de-interleave
1419b81eb7531233e152b01ee518e7c5df9b042ae77Jiho ChangLOOP_MAIN_REMAIN_WIDTH:
1429b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    ldrb        r1, [r8], #1
1439b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    ldrb        r2, [r8], #1
1449b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    strb        r1, [r7], #1
1459b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    strb        r2, [r12], #1
1469b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    add         r0, #1
1479b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    cmp         r0, r14
1489b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    blt         LOOP_MAIN_REMAIN_WIDTH
1499b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang
1509b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    sub         r8, r8, r14, lsl #1
1519b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    sub         r7, r7, r14
1529b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    sub         r12, r12, r14
1539b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    add         r8, r8, #16
1549b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    add         r7, r7, r3, asr #1
1559b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    add         r12, r12, r3, asr #1
1569b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang
1579b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    add         r4, #1
1589b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    cmp         r4, #8
1599b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    blt         LOOP_MAIN_REMAIN_HEIGHT
1609b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    ldmfd       sp!, {r0-r2,r4}         @ restore registers
1619b81eb7531233e152b01ee518e7c5df9b042ae77Jiho ChangMAIN_REMAIN_WIDTH_END:
1629b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang
1639b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    add         r5, r5, #8
1649b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    cmp         r5, r9
1659b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    blt         LOOP_MAIN_ALIGNED_HEIGHT
1669b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang
1679b81eb7531233e152b01ee518e7c5df9b042ae77Jiho ChangREMAIN_HEIGHT_START:
1689b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    cmp         r9, r4                  @ if (aligned_height != height) {
1699b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    beq         REMAIN_HEIGHT_END
1709b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang
1719b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    mov         r6, #0
1729b81eb7531233e152b01ee518e7c5df9b042ae77Jiho ChangLOOP_REMAIN_HEIGHT_WIDTH16:
1739b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    mul         r8, r11, r5             @ src_offset = (tiled_width * i) + (j << 3)
1749b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    add         r8, r8, r6, lsl #3
1759b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    add         r8, r2, r8              @ src_offset = uv_src + src_offset
1769b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang
1779b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    mov         r12, r3, asr #1         @ temp1 = (width >> 1) * i + (j >> 1)
1789b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    mul         r12, r12, r5
1799b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    add         r12, r12, r6, asr #1
1809b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    add         r7, r0, r12             @ r7 = u_dst + temp1
1819b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    add         r12, r1, r12            @ r12 = v_dst + temp1
1829b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    mov         r14, r3, asr #1         @ temp2 = width / 2
1839b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang
1849b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    stmfd       sp!, {r0-r1}            @ backup registers
1859b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    mov         r0, #0
1869b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    sub         r1, r4, r9
1879b81eb7531233e152b01ee518e7c5df9b042ae77Jiho ChangLOOP_REMAIN_HEIGHT_WIDTH16_HEIGHT1:
1889b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    vld2.8      {d0, d1}, [r8]!
1899b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    vst1.8      {d0}, [r7], r14
1909b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    vst1.8      {d1}, [r12], r14
1919b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang
1929b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    add         r0, r0, #1
1939b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    cmp         r0, r1
1949b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    blt         LOOP_REMAIN_HEIGHT_WIDTH16_HEIGHT1
1959b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    ldmfd       sp!, {r0-r1}            @ restore registers
1969b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang
1979b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    add         r6, r6, #16
1989b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    cmp         r6, r10
1999b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    blt         LOOP_REMAIN_HEIGHT_WIDTH16
2009b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang
2019b81eb7531233e152b01ee518e7c5df9b042ae77Jiho ChangREMAIN_HEIGHT_REMAIN_WIDTH_START:
2029b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    cmp         r10, r3
2039b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    beq         REMAIN_HEIGHT_REMAIN_WIDTH_END
2049b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    mul         r8, r11, r5             @ src_offset = (tiled_width * i) + (j << 3)
2059b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    add         r8, r8, r6, lsl #3
2069b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    add         r8, r2, r8              @ src_offset = uv_src + src_offset
2079b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang
2089b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    mov         r12, r3, asr #1         @ temp1 = (width >> 1) * i + (j >> 1)
2099b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    mul         r12, r12, r5
2109b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    add         r12, r12, r6, asr #1
2119b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    add         r7, r0, r12             @ r7 = u_dst + temp1
2129b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    add         r12, r1, r12            @ r12 = v_dst + temp1
2139b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    sub         r14, r3, r6             @ r14 = (width - j) /2
2149b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    mov         r14, r14, asr #1
2159b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang
2169b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    stmfd       sp!, {r0-r2,r4-r5}            @ backup registers
2179b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    mov         r0, #0
2189b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    sub         r1, r4, r9
2199b81eb7531233e152b01ee518e7c5df9b042ae77Jiho ChangLOOP_REMAIN_HEIGHT_REMAIN_WIDTH_HEIGHT1:
2209b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang
2219b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    mov         r4, #0
2229b81eb7531233e152b01ee518e7c5df9b042ae77Jiho ChangLOOP_REMAIN_HEIGHT_REMAIN_WIDTH_HEIGHT1_WIDTHx:
2239b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    ldrb        r2, [r8], #1
2249b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    ldrb        r5, [r8], #1
2259b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    strb        r2, [r7], #1
2269b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    strb        r5, [r12], #1
2279b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    add         r4, #1
2289b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    cmp         r4, r14
2299b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    blt         LOOP_REMAIN_HEIGHT_REMAIN_WIDTH_HEIGHT1_WIDTHx
2309b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang
2319b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    sub         r8, r8, r14, lsl #1
2329b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    sub         r7, r7, r14
2339b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    sub         r12, r12, r14
2349b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    add         r8, r8, #16
2359b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    add         r7, r7, r3, asr #1
2369b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    add         r12, r12, r3, asr #1
2379b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang
2389b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    add         r0, r0, #1
2399b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    cmp         r0, r1
2409b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    blt         LOOP_REMAIN_HEIGHT_REMAIN_WIDTH_HEIGHT1
2419b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    ldmfd       sp!, {r0-r2,r4-r5}            @ restore registers
2429b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang
2439b81eb7531233e152b01ee518e7c5df9b042ae77Jiho ChangREMAIN_HEIGHT_REMAIN_WIDTH_END:
2449b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang
2459b81eb7531233e152b01ee518e7c5df9b042ae77Jiho ChangREMAIN_HEIGHT_END:
2469b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang
2479b81eb7531233e152b01ee518e7c5df9b042ae77Jiho ChangRESTORE_REG:
2489b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    ldmfd       sp!, {r4-r12,r15}       @ restore registers
2499b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang
2509b81eb7531233e152b01ee518e7c5df9b042ae77Jiho Chang    .fnend
251